Commit a55e2d6b authored by hybrid's avatar hybrid

Added .obj writer.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1542 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 60f19558
...@@ -25,7 +25,10 @@ namespace scene ...@@ -25,7 +25,10 @@ namespace scene
EMWT_COLLADA = MAKE_IRR_ID('c','o','l','l'), EMWT_COLLADA = MAKE_IRR_ID('c','o','l','l'),
//! STL mesh writer for .stl files //! STL mesh writer for .stl files
EMWT_STL = MAKE_IRR_ID('s','t','l',0) EMWT_STL = MAKE_IRR_ID('s','t','l',0),
//! OBJ mesh writer for .obj files
EMWT_OBJ = MAKE_IRR_ID('o','b','j',0)
}; };
......
...@@ -289,6 +289,8 @@ B3D, MS3D or X meshes */ ...@@ -289,6 +289,8 @@ B3D, MS3D or X meshes */
#define _IRR_COMPILE_WITH_COLLADA_WRITER_ #define _IRR_COMPILE_WITH_COLLADA_WRITER_
//! Define _IRR_COMPILE_WITH_STL_WRITER_ if you want to write .stl files //! Define _IRR_COMPILE_WITH_STL_WRITER_ if you want to write .stl files
#define _IRR_COMPILE_WITH_STL_WRITER_ #define _IRR_COMPILE_WITH_STL_WRITER_
//! Define _IRR_COMPILE_WITH_OBJ_WRITER_ if you want to write .obj files
#define _IRR_COMPILE_WITH_OBJ_WRITER_
//! Define _IRR_COMPILE_WITH_BMP_LOADER_ if you want to load .bmp files //! Define _IRR_COMPILE_WITH_BMP_LOADER_ if you want to load .bmp files
//! Disabling this loader will also disable the built-in font //! Disabling this loader will also disable the built-in font
......
// Copyright (C) 2002-2008 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#include "IrrCompileConfig.h"
#ifdef _IRR_COMPILE_WITH_OBJ_WRITER_
#include "COBJMeshWriter.h"
#include "os.h"
#include "IMesh.h"
#include "IMeshBuffer.h"
#include "IAttributes.h"
#include "ISceneManager.h"
#include "IMeshCache.h"
#include "IWriteFile.h"
#include "IFileSystem.h"
#include "ITexture.h"
namespace irr
{
namespace scene
{
COBJMeshWriter::COBJMeshWriter(scene::ISceneManager* smgr, io::IFileSystem* fs)
: SceneManager(smgr), FileSystem(fs)
{
#ifdef _DEBUG
setDebugName("COBJMeshWriter");
#endif
if (SceneManager)
SceneManager->grab();
if (FileSystem)
FileSystem->grab();
}
COBJMeshWriter::~COBJMeshWriter()
{
if (SceneManager)
SceneManager->drop();
if (FileSystem)
FileSystem->drop();
}
//! Returns the type of the mesh writer
EMESH_WRITER_TYPE COBJMeshWriter::getType() const
{
return EMWT_OBJ;
}
//! writes a mesh
bool COBJMeshWriter::writeMesh(io::IWriteFile* file, scene::IMesh* mesh, s32 flags)
{
if (!file)
return false;
os::Printer::log("Writing mesh", file->getFileName());
// write OBJ MESH header
const core::stringc name(FileSystem->getFileBasename(SceneManager->getMeshCache()->getMeshFilename(mesh), false)+".mtl");
file->write("# exported by Irrlicht\n",23);
file->write("mtllib ",7);
file->write(name.c_str(),name.size());
file->write("\n\n",2);
// write mesh buffers
core::array<video::SMaterial*> mat;
u32 allVertexCount=1; // count vertices over the whole file
for (u32 i=0; i<mesh->getMeshBufferCount(); ++i)
{
core::stringc num(i+1);
IMeshBuffer* buffer = mesh->getMeshBuffer(i);
if (buffer && buffer->getVertexCount())
{
file->write("g grp", 5);
file->write(num.c_str(), num.size());
file->write("\n",1);
u32 j;
const u32 vertexCount = buffer->getVertexCount();
for (j=0; j<vertexCount; ++j)
{
file->write("v ",2);
getVectorAsStringLine(buffer->getPosition(j), num);
file->write(num.c_str(), num.size());
}
for (j=0; j<vertexCount; ++j)
{
file->write("vt ",3);
getVectorAsStringLine(buffer->getTCoords(j), num);
file->write(num.c_str(), num.size());
}
for (j=0; j<vertexCount; ++j)
{
file->write("vn ",3);
getVectorAsStringLine(buffer->getNormal(j), num);
file->write(num.c_str(), num.size());
}
file->write("usemtl mat",10);
num = "";
for (j=0; j<mat.size(); ++j)
{
if (*mat[j]==buffer->getMaterial())
{
num = core::stringc(j);
break;
}
}
if (num == "")
{
num = core::stringc(mat.size());
mat.push_back(&buffer->getMaterial());
}
file->write(num.c_str(), num.size());
file->write("\n",1);
const u16 indexCount = buffer->getIndexCount();
for (j=0; j<indexCount; j+=3)
{
file->write("f ",2);
num = core::stringc(buffer->getIndices()[j+2]+allVertexCount);
file->write(num.c_str(), num.size());
file->write("/",1);
file->write(num.c_str(), num.size());
file->write("/",1);
file->write(num.c_str(), num.size());
file->write(" ",1);
num = core::stringc(buffer->getIndices()[j+1]+allVertexCount);
file->write(num.c_str(), num.size());
file->write("/",1);
file->write(num.c_str(), num.size());
file->write("/",1);
file->write(num.c_str(), num.size());
file->write(" ",1);
num = core::stringc(buffer->getIndices()[j+0]+allVertexCount);
file->write(num.c_str(), num.size());
file->write("/",1);
file->write(num.c_str(), num.size());
file->write("/",1);
file->write(num.c_str(), num.size());
file->write(" ",1);
file->write("\n",1);
}
file->write("\n",1);
allVertexCount += vertexCount;
}
}
if (mat.size() == 0)
return true;
file = FileSystem->createAndWriteFile((name).c_str());
if (file)
{
os::Printer::log("Writing material", file->getFileName());
file->write("# exported by Irrlicht\n\n",24);
for (u32 i=0; i<mat.size(); ++i)
{
core::stringc num(i);
file->write("newmtl mat",10);
file->write(num.c_str(),num.size());
file->write("\n",1);
getColorAsStringLine(mat[i]->AmbientColor, "Ka", num);
file->write(num.c_str(),num.size());
getColorAsStringLine(mat[i]->DiffuseColor, "Kd", num);
file->write(num.c_str(),num.size());
getColorAsStringLine(mat[i]->SpecularColor, "Ks", num);
file->write(num.c_str(),num.size());
getColorAsStringLine(mat[i]->EmissiveColor, "Ke", num);
file->write(num.c_str(),num.size());
num = core::stringc(mat[i]->Shininess/0.128f);
file->write(num.c_str(),num.size());
if (mat[i]->getTexture(0))
{
file->write("map_Kd ", 7);
file->write(mat[i]->getTexture(0)->getName().c_str(), mat[i]->getTexture(0)->getName().size());
file->write("\n",1);
}
file->write("\n",1);
}
file->drop();
}
return true;
}
void COBJMeshWriter::getVectorAsStringLine(const core::vector3df& v, core::stringc& s) const
{
s = core::stringc(-v.X);
s += " ";
s += core::stringc(v.Y);
s += " ";
s += core::stringc(v.Z);
s += "\n";
}
void COBJMeshWriter::getVectorAsStringLine(const core::vector2df& v, core::stringc& s) const
{
s = core::stringc(v.X);
s += " ";
s += core::stringc(-v.Y);
s += "\n";
}
void COBJMeshWriter::getColorAsStringLine(const video::SColor& color, const c8* const prefix, core::stringc& s) const
{
s = prefix;
s += " ";
s += core::stringc(color.getRed()/255.f);
s += " ";
s += core::stringc(color.getGreen()/255.f);
s += " ";
s += core::stringc(color.getBlue()/255.f);
s += "\n";
}
} // end namespace
} // end namespace
#endif
// Copyright (C) 2002-2008 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __IRR_OBJ_MESH_WRITER_H_INCLUDED__
#define __IRR_OBJ_MESH_WRITER_H_INCLUDED__
#include "IMeshWriter.h"
#include "S3DVertex.h"
#include "irrString.h"
namespace irr
{
namespace io
{
class IFileSystem;
} // end namespace io
namespace scene
{
class IMeshBuffer;
class ISceneManager;
//! class to write meshes, implementing a OBJ writer
class COBJMeshWriter : public IMeshWriter
{
public:
COBJMeshWriter(scene::ISceneManager* smgr, io::IFileSystem* fs);
virtual ~COBJMeshWriter();
//! Returns the type of the mesh writer
virtual EMESH_WRITER_TYPE getType() const;
//! writes a mesh
virtual bool writeMesh(io::IWriteFile* file, scene::IMesh* mesh, s32 flags=EMWF_NONE);
protected:
// create vector output with line end into string
void getVectorAsStringLine(const core::vector3df& v,
core::stringc& s) const;
// create vector output with line end into string
void getVectorAsStringLine(const core::vector2df& v,
core::stringc& s) const;
// create color output with line end into string
void getColorAsStringLine(const video::SColor& color,
const c8* const prefix, core::stringc& s) const;
scene::ISceneManager* SceneManager;
io::IFileSystem* FileSystem;
};
} // end namespace
} // end namespace
#endif
...@@ -103,6 +103,10 @@ ...@@ -103,6 +103,10 @@
#include "CSTLMeshWriter.h" #include "CSTLMeshWriter.h"
#endif #endif
#ifdef _IRR_COMPILE_WITH_OBJ_WRITER_
#include "COBJMeshWriter.h"
#endif
#include "CCubeSceneNode.h" #include "CCubeSceneNode.h"
#include "CSphereSceneNode.h" #include "CSphereSceneNode.h"
#include "CAnimatedMeshSceneNode.h" #include "CAnimatedMeshSceneNode.h"
...@@ -1162,7 +1166,7 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE ...@@ -1162,7 +1166,7 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE
case ESNRP_SOLID: case ESNRP_SOLID:
if (!isCulled(node)) if (!isCulled(node))
{ {
SolidNodeList.push_back( node ); SolidNodeList.push_back(node);
taken = 1; taken = 1;
} }
break; break;
...@@ -1196,7 +1200,7 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE ...@@ -1196,7 +1200,7 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE
// not transparent, register as solid // not transparent, register as solid
if ( 0 == taken ) if ( 0 == taken )
{ {
SolidNodeList.push_back( node ); SolidNodeList.push_back(node);
taken = 1; taken = 1;
} }
} }
...@@ -2290,6 +2294,12 @@ IMeshWriter* CSceneManager::createMeshWriter(EMESH_WRITER_TYPE type) ...@@ -2290,6 +2294,12 @@ IMeshWriter* CSceneManager::createMeshWriter(EMESH_WRITER_TYPE type)
return new CSTLMeshWriter(this); return new CSTLMeshWriter(this);
#else #else
return 0; return 0;
#endif
case EMWT_OBJ:
#ifdef _IRR_COMPILE_WITH_OBJ_WRITER_
return new COBJMeshWriter(this, FileSystem);
#else
return 0;
#endif #endif
} }
......
...@@ -9,7 +9,7 @@ CppCompiler=-D__GNUWIN32__ -W -DWIN32 -DNDEBUG -D_WINDOWS -D_MBCS -D_USRDLL -DIR ...@@ -9,7 +9,7 @@ CppCompiler=-D__GNUWIN32__ -W -DWIN32 -DNDEBUG -D_WINDOWS -D_MBCS -D_USRDLL -DIR
Includes=..\..\include;zlib Includes=..\..\include;zlib
Linker=-lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lopengl32_@@_ Linker=-lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lopengl32_@@_
Libs= Libs=
UnitCount=603 UnitCount=604
Folders=doc,gui_impl,include,include/core,include/gui,include/io,include/scene,include/video,io_impl,other_impl,other_impl/extern,other_impl/extern/jpeglib,other_impl/extern/libpng,other_impl/extern/zlib,scene_impl,scene_impl/animators,scene_impl/collision,scene_impl/mesh,scene_impl/mesh/loaders,scene_impl/mesh/writers,scene_impl/nodes,scene_impl/nodes/particles,video_impl,"video_impl/Burning Video",video_impl/DirectX8,video_impl/DirectX9,video_impl/Null,video_impl/OpenGL,video_impl/Software Folders=doc,gui_impl,include,include/core,include/gui,include/io,include/scene,include/video,io_impl,other_impl,other_impl/extern,other_impl/extern/jpeglib,other_impl/extern/libpng,other_impl/extern/zlib,scene_impl,scene_impl/animators,scene_impl/collision,scene_impl/mesh,scene_impl/mesh/loaders,scene_impl/mesh/writers,scene_impl/nodes,scene_impl/nodes/particles,video_impl,"video_impl/Burning Video",video_impl/DirectX8,video_impl/DirectX9,video_impl/Null,video_impl/OpenGL,video_impl/Software
ObjFiles= ObjFiles=
PrivateResource= PrivateResource=
...@@ -6077,3 +6077,13 @@ Priority=1000 ...@@ -6077,3 +6077,13 @@ Priority=1000
OverrideBuildCmd=0 OverrideBuildCmd=0
BuildCmd= BuildCmd=
[Unit604]
FileName=COBJMeshWriter.cpp
CompileCpp=1
Folder=scene_impl/mesh/writers
Compile=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=
...@@ -1674,6 +1674,10 @@ SOURCE=.\CSTLMeshWriter.cpp ...@@ -1674,6 +1674,10 @@ SOURCE=.\CSTLMeshWriter.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\COBJMeshWriter.cpp
# End Source File
# Begin Source File
SOURCE=.\CTerrainSceneNode.cpp SOURCE=.\CTerrainSceneNode.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
......
...@@ -1694,6 +1694,12 @@ ...@@ -1694,6 +1694,12 @@
<File <File
RelativePath=".\CSTLMeshWriter.h"> RelativePath=".\CSTLMeshWriter.h">
</File> </File>
<File
RelativePath=".\COBJMeshWriter.cpp">
</File>
<File
RelativePath=".\COBJMeshWriter.h">
</File>
</Filter> </Filter>
</Filter> </Filter>
<Filter <Filter
......
...@@ -2268,6 +2268,14 @@ ...@@ -2268,6 +2268,14 @@
RelativePath=".\CSTLMeshWriter.h" RelativePath=".\CSTLMeshWriter.h"
> >
</File> </File>
<File
RelativePath=".\COBJMeshWriter.cpp"
>
</File>
<File
RelativePath=".\COBJMeshWriter.h"
>
</File>
</Filter> </Filter>
</Filter> </Filter>
<Filter <Filter
......
...@@ -2271,6 +2271,14 @@ ...@@ -2271,6 +2271,14 @@
RelativePath="CSTLMeshWriter.h" RelativePath="CSTLMeshWriter.h"
> >
</File> </File>
<File
RelativePath="COBJMeshWriter.cpp"
>
</File>
<File
RelativePath="COBJMeshWriter.h"
>
</File>
</Filter> </Filter>
</Filter> </Filter>
<Filter <Filter
......
...@@ -492,6 +492,8 @@ ...@@ -492,6 +492,8 @@
<Unit filename="CSTLMeshFileLoader.h" /> <Unit filename="CSTLMeshFileLoader.h" />
<Unit filename="CSTLMeshWriter.cpp" /> <Unit filename="CSTLMeshWriter.cpp" />
<Unit filename="CSTLMeshWriter.h" /> <Unit filename="CSTLMeshWriter.h" />
<Unit filename="COBJMeshWriter.cpp" />
<Unit filename="COBJMeshWriter.h" />
<Unit filename="CSceneCollisionManager.cpp" /> <Unit filename="CSceneCollisionManager.cpp" />
<Unit filename="CSceneCollisionManager.h" /> <Unit filename="CSceneCollisionManager.h" />
<Unit filename="CSceneManager.cpp" /> <Unit filename="CSceneManager.cpp" />
......
...@@ -1811,6 +1811,14 @@ ...@@ -1811,6 +1811,14 @@
<Option compile="0"/> <Option compile="0"/>
<Option link="0"/> <Option link="0"/>
</Unit> </Unit>
<Unit filename="COBJMeshWriter.cpp">
<Option compilerVar="CPP"/>
</Unit>
<Unit filename="COBJMeshWriter.h">
<Option compilerVar="CPP"/>
<Option compile="0"/>
<Option link="0"/>
</Unit>
<Unit filename="CSceneCollisionManager.cpp"> <Unit filename="CSceneCollisionManager.cpp">
<Option compilerVar="CPP"/> <Option compilerVar="CPP"/>
</Unit> </Unit>
......
...@@ -2272,6 +2272,14 @@ ...@@ -2272,6 +2272,14 @@
RelativePath=".\CSTLMeshWriter.h" RelativePath=".\CSTLMeshWriter.h"
> >
</File> </File>
<File
RelativePath=".\COBJMeshWriter.cpp"
>
</File>
<File
RelativePath=".\COBJMeshWriter.h"
>
</File>
</Filter> </Filter>
</Filter> </Filter>
<Filter <Filter
......
...@@ -20,7 +20,7 @@ VERSION = 1.4 ...@@ -20,7 +20,7 @@ VERSION = 1.4
#List of object files, separated based on engine architecture #List of object files, separated based on engine architecture
IRRMESHLOADER = CBSPMeshFileLoader.o CMD2MeshFileLoader.o CMD3MeshFileLoader.o CMS3DMeshFileLoader.o CB3DMeshFileLoader.o C3DSMeshFileLoader.o COgreMeshFileLoader.o COBJMeshFileLoader.o CColladaFileLoader.o CCSMLoader.o CDMFLoader.o CLMTSMeshFileLoader.o CMY3DMeshFileLoader.o COCTLoader.o CXMeshFileLoader.o CIrrMeshFileLoader.o CSTLMeshFileLoader.o CLWOMeshFileLoader.o IRRMESHLOADER = CBSPMeshFileLoader.o CMD2MeshFileLoader.o CMD3MeshFileLoader.o CMS3DMeshFileLoader.o CB3DMeshFileLoader.o C3DSMeshFileLoader.o COgreMeshFileLoader.o COBJMeshFileLoader.o CColladaFileLoader.o CCSMLoader.o CDMFLoader.o CLMTSMeshFileLoader.o CMY3DMeshFileLoader.o COCTLoader.o CXMeshFileLoader.o CIrrMeshFileLoader.o CSTLMeshFileLoader.o CLWOMeshFileLoader.o
IRRMESHWRITER = CColladaMeshWriter.o CIrrMeshWriter.o CSTLMeshWriter.o IRRMESHWRITER = CColladaMeshWriter.o CIrrMeshWriter.o CSTLMeshWriter.o COBJMeshWriter.o
IRRMESHOBJ = $(IRRMESHLOADER) $(IRRMESHWRITER) \ IRRMESHOBJ = $(IRRMESHLOADER) $(IRRMESHWRITER) \
CSkinnedMesh.o CBoneSceneNode.o CMeshSceneNode.o \ CSkinnedMesh.o CBoneSceneNode.o CMeshSceneNode.o \
CAnimatedMeshSceneNode.o CAnimatedMeshMD2.o CAnimatedMeshMD3.o \ CAnimatedMeshSceneNode.o CAnimatedMeshMD2.o CAnimatedMeshMD3.o \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment