#include <objwriter.h>
Public Member Functions | |
| OBJWriter (wxBufferedOutputStream *_outputStream, const Scene *_scene) | |
| ~OBJWriter () | |
| Class destructor. | |
| void | Write () |
| Write OBJ stream. | |
Private Attributes | |
| wxBufferedOutputStream * | outputStream |
| Input stream. | |
| const Scene * | scene |
| Scene container to be built. | |
Definition at line 22 of file objwriter.h.
| OBJWriter::OBJWriter | ( | wxBufferedOutputStream * | _outputStream, | |
| const Scene * | _scene | |||
| ) |
Class constructor
Definition at line 18 of file objwriter.cpp.
00018 : outputStream(_outputStream), scene(_scene) 00019 { 00020 }
| OBJWriter::~OBJWriter | ( | ) |
Class destructor.
Is called by wxWidgets itself on wxApp end but it doesn't work in dynamic library
Definition at line 23 of file objwriter.cpp.
| void OBJWriter::Write | ( | ) |
Write OBJ stream.
Definition at line 28 of file objwriter.cpp.
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 //write vertices 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 //write texture coordinates 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 //write normals 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 /*OBJBinary facet; 00080 GeometryTriangles::Indice indice = indices->at(indiceIndex); 00081 memcpy(facet.vert1, transf.TransformCoord(vertices->at(indice))._v, sizeof(float)*3); 00082 memcpy(facet.vert2, transf.TransformCoord(vertices->at(indices->at(indiceIndex+1)))._v, sizeof(float)*3); 00083 memcpy(facet.vert3, transf.TransformCoord(vertices->at(indices->at(indiceIndex+2)))._v, sizeof(float)*3); 00084 memcpy(facet.norm, (VECTOR3(facet.vert2) - VECTOR3(facet.vert1)).Cross(VECTOR3(facet.vert3) - VECTOR3(facet.vert1)).Normalize()._v, sizeof(float)*3); 00085 facet.attr[0]=0; 00086 facet.attr[1]=0; 00087 facets.push_back(facet);*/ 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 /*OBJBinary facet; 00101 GeometryTriangles::Indice indice3 = indices->at(indiceIndex); 00102 memcpy(facet.vert1, transf.TransformCoord(vertices->at(indice1))._v, sizeof(float)*3); 00103 memcpy(facet.vert2, transf.TransformCoord(vertices->at(indice2))._v, sizeof(float)*3); 00104 memcpy(facet.vert3, transf.TransformCoord(vertices->at(indice3))._v, sizeof(float)*3); 00105 memcpy(facet.norm, (VECTOR3(facet.vert2) - VECTOR3(facet.vert1)).Cross(VECTOR3(facet.vert3) - VECTOR3(facet.vert1)).Normalize()._v, sizeof(float)*3); 00106 facet.attr[0]=0; 00107 facet.attr[1]=0; 00108 indice2=indice3; 00109 facets.push_back(facet);*/ 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 /*OBJBinary facet; 00122 GeometryTriangles::Indice indice3 = indices->at(indiceIndex); 00123 memcpy(facet.vert1, transf.TransformCoord(vertices->at(indice1))._v, sizeof(float)*3); 00124 memcpy(facet.vert2, transf.TransformCoord(vertices->at(indice2))._v, sizeof(float)*3); 00125 memcpy(facet.vert3, transf.TransformCoord(vertices->at(indice3))._v, sizeof(float)*3); 00126 memcpy(facet.norm, (VECTOR3(facet.vert2) - VECTOR3(facet.vert1)).Cross(VECTOR3(facet.vert3) - VECTOR3(facet.vert1)).Normalize()._v, sizeof(float)*3); 00127 facet.attr[0]=0; 00128 facet.attr[1]=0; 00129 indice1=indice2; 00130 indice2=indice3; 00131 facets.push_back(facet);*/ 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 }
wxBufferedOutputStream* VRUT::OBJWriter::outputStream [private] |
const Scene* VRUT::OBJWriter::scene [private] |
1.5.5