1
// Copyright (C) 2008-2011 Christian Stehno
2
// This file is part of the "Irrlicht Engine".
3
// For conditions of distribution and use, see copyright notice in irrlicht.h
5
#include "IrrCompileConfig.h"
7
#ifdef _IRR_COMPILE_WITH_OBJ_WRITER_
9
#include "COBJMeshWriter.h"
12
#include "IMeshBuffer.h"
13
#include "IAttributes.h"
14
#include "ISceneManager.h"
15
#include "IMeshCache.h"
16
#include "IWriteFile.h"
17
#include "IFileSystem.h"
25
COBJMeshWriter::COBJMeshWriter(scene::ISceneManager* smgr, io::IFileSystem* fs)
26
: SceneManager(smgr), FileSystem(fs)
29
setDebugName("COBJMeshWriter");
40
COBJMeshWriter::~COBJMeshWriter()
50
//! Returns the type of the mesh writer
51
EMESH_WRITER_TYPE COBJMeshWriter::getType() const
58
bool COBJMeshWriter::writeMesh(io::IWriteFile* file, scene::IMesh* mesh, s32 flags)
63
os::Printer::log("Writing mesh", file->getFileName());
65
// write OBJ MESH header
67
const core::stringc name(FileSystem->getFileBasename(SceneManager->getMeshCache()->getMeshName(mesh), false)+".mtl");
68
file->write("# exported by Irrlicht\n",23);
69
file->write("mtllib ",7);
70
file->write(name.c_str(),name.size());
71
file->write("\n\n",2);
75
core::array<video::SMaterial*> mat;
77
u32 allVertexCount=1; // count vertices over the whole file
78
for (u32 i=0; i<mesh->getMeshBufferCount(); ++i)
80
core::stringc num(i+1);
81
IMeshBuffer* buffer = mesh->getMeshBuffer(i);
82
if (buffer && buffer->getVertexCount())
84
file->write("g grp", 5);
85
file->write(num.c_str(), num.size());
89
const u32 vertexCount = buffer->getVertexCount();
90
for (j=0; j<vertexCount; ++j)
93
getVectorAsStringLine(buffer->getPosition(j), num);
94
file->write(num.c_str(), num.size());
97
for (j=0; j<vertexCount; ++j)
100
getVectorAsStringLine(buffer->getTCoords(j), num);
101
file->write(num.c_str(), num.size());
104
for (j=0; j<vertexCount; ++j)
106
file->write("vn ",3);
107
getVectorAsStringLine(buffer->getNormal(j), num);
108
file->write(num.c_str(), num.size());
111
file->write("usemtl mat",10);
113
for (j=0; j<mat.size(); ++j)
115
if (*mat[j]==buffer->getMaterial())
117
num = core::stringc(j);
123
num = core::stringc(mat.size());
124
mat.push_back(&buffer->getMaterial());
126
file->write(num.c_str(), num.size());
129
const u32 indexCount = buffer->getIndexCount();
130
for (j=0; j<indexCount; j+=3)
133
num = core::stringc(buffer->getIndices()[j+2]+allVertexCount);
134
file->write(num.c_str(), num.size());
136
file->write(num.c_str(), num.size());
138
file->write(num.c_str(), num.size());
141
num = core::stringc(buffer->getIndices()[j+1]+allVertexCount);
142
file->write(num.c_str(), num.size());
144
file->write(num.c_str(), num.size());
146
file->write(num.c_str(), num.size());
149
num = core::stringc(buffer->getIndices()[j+0]+allVertexCount);
150
file->write(num.c_str(), num.size());
152
file->write(num.c_str(), num.size());
154
file->write(num.c_str(), num.size());
160
allVertexCount += vertexCount;
167
file = FileSystem->createAndWriteFile( name );
170
os::Printer::log("Writing material", file->getFileName());
172
file->write("# exported by Irrlicht\n\n",24);
173
for (u32 i=0; i<mat.size(); ++i)
175
core::stringc num(i);
176
file->write("newmtl mat",10);
177
file->write(num.c_str(),num.size());
180
getColorAsStringLine(mat[i]->AmbientColor, "Ka", num);
181
file->write(num.c_str(),num.size());
182
getColorAsStringLine(mat[i]->DiffuseColor, "Kd", num);
183
file->write(num.c_str(),num.size());
184
getColorAsStringLine(mat[i]->SpecularColor, "Ks", num);
185
file->write(num.c_str(),num.size());
186
getColorAsStringLine(mat[i]->EmissiveColor, "Ke", num);
187
file->write(num.c_str(),num.size());
188
num = core::stringc(mat[i]->Shininess/0.128f);
189
file->write("Ns ", 3);
190
file->write(num.c_str(),num.size());
191
file->write("\n", 1);
192
if (mat[i]->getTexture(0))
194
file->write("map_Kd ", 7);
195
file->write(mat[i]->getTexture(0)->getName().getPath().c_str(), mat[i]->getTexture(0)->getName().getPath().size());
206
void COBJMeshWriter::getVectorAsStringLine(const core::vector3df& v, core::stringc& s) const
208
s = core::stringc(-v.X);
210
s += core::stringc(v.Y);
212
s += core::stringc(v.Z);
217
void COBJMeshWriter::getVectorAsStringLine(const core::vector2df& v, core::stringc& s) const
219
s = core::stringc(v.X);
221
s += core::stringc(-v.Y);
226
void COBJMeshWriter::getColorAsStringLine(const video::SColor& color, const c8* const prefix, core::stringc& s) const
230
s += core::stringc(color.getRed()/255.f);
232
s += core::stringc(color.getGreen()/255.f);
234
s += core::stringc(color.getBlue()/255.f);