00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "objwriter.h"
00013 #include "../../textwriter.h"
00014
00015 using namespace VRUT;
00016
00017
00018 OBJWriter::OBJWriter(wxBufferedOutputStream * _outputStream, const Scene * _scene) : outputStream(_outputStream), scene(_scene)
00019 {
00020 }
00021
00022
00023 OBJWriter::~OBJWriter()
00024 {
00026 }
00027
00028 void OBJWriter::Write()
00029 {
00030 TextWriter textWriter(outputStream);
00031 std::vector<NODE_ID> nodes;
00032 scene->GetNodeIDs(&nodes);
00033
00034 for (std::vector<NODE_ID>::const_iterator nodeIt = nodes.begin(); nodeIt != nodes.end(); nodeIt++)
00035 {
00036 const SceneNode * node = scene->GetNode(*nodeIt);
00037 if (!node || !node->IsOfType(SceneNode::GEOMETRY))
00038 continue;
00039 scene->UpdateTransformation(*nodeIt);
00040
00041 const Geometry * geom = scene->GetGeometry(((const GeometryNode *)node)->GetGeometryID());
00042 if (geom && geom->type == Geometry::GEOMETRY_TRIANGLE)
00043 {
00044 const GeometryTriangles * geometry = (GeometryTriangles *)geom;
00045 size_t indiceIndex = 0;
00046 size_t maxInd = geometry->indices.size();
00047 const std::vector<VECTOR3> * vertices = &geometry->vertices;
00048 const std::vector<GeometryTriangles::TexCoord> * texCoords = &geometry->texCoords;
00049 const std::vector<VECTOR3> * normals = &geometry->normals;
00050 const std::vector<GeometryTriangles::Indice> * indices = &geometry->indices;
00051 MATRIX transf(*node->GetWorldTransMatrix());
00052
00053
00054 for (size_t i=0; i<vertices->size(); i++)
00055 textWriter.Write("v ")->Write(vertices->at(i)._v[0])->Write(" ")->Write(vertices->at(i)._v[1])->Write(" ")->Write(vertices->at(i)._v[2])->Write("\r\n");
00056
00057
00058 if (texCoords->size()==vertices->size())
00059 for (size_t i=0; i<texCoords->size(); i++)
00060 textWriter.Write("vt ")->Write(texCoords->at(i)._v[0])->Write(" ")->Write(texCoords->at(i)._v[1])->Write("\r\n");
00061
00062
00063 if (normals->size()==vertices->size())
00064 for (size_t i=0; i<normals->size(); i++)
00065 textWriter.Write("vn ")->Write(normals->at(i)._v[0])->Write(" ")->Write(normals->at(i)._v[1])->Write(" ")->Write(normals->at(i)._v[2])->Write("\r\n");
00066
00067 for (GeometryTriangles::TriDescList::const_iterator indPrimType = geometry->triDescList.begin();
00068 indPrimType != geometry->triDescList.end(); indPrimType++)
00069 {
00070 GeometryTriangles::TriDescList::const_iterator endIndPrimType = indPrimType + 1;
00071 size_t endInd = ( endIndPrimType == geometry->triDescList.end() ? maxInd : endIndPrimType->first );
00072 endInd = __min( endInd, maxInd );
00073
00074 switch (indPrimType->second)
00075 {
00076 case GeometryTriangles::TRI_LIST:
00077 for ( ; indiceIndex+2 < endInd; indiceIndex+=3)
00078 {
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 }
00089 break;
00090 case GeometryTriangles::QUADS:
00091 case GeometryTriangles::POLYGON:
00092 case GeometryTriangles::TRI_FAN:
00093 {
00094 if (indiceIndex+2 >= endInd)
00095 break;
00096 GeometryTriangles::Indice indice1 = indices->at(indiceIndex++);
00097 GeometryTriangles::Indice indice2 = indices->at(indiceIndex++);
00098 for ( ; indiceIndex < endInd; indiceIndex++)
00099 {
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 }
00111 }
00112 break;
00113 case GeometryTriangles::TRI_STRIP:
00114 {
00115 if (indiceIndex+2 >= endInd)
00116 break;
00117 GeometryTriangles::Indice indice1 = indices->at(indiceIndex++);
00118 GeometryTriangles::Indice indice2 = indices->at(indiceIndex++);
00119 for ( ; indiceIndex < endInd; indiceIndex++)
00120 {
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 }
00133 }
00134 break;
00135 case GeometryTriangles::LINES:
00136 continue;
00137 case GeometryTriangles::LINE_STRIP:
00138 continue;
00139 case GeometryTriangles::POINTS:
00140 continue;
00141 default:
00142 LOGERROR(wxT("<OBJWriter>Unknown primitive type."));
00143 }
00144 }
00145 }
00146 }
00147 }