VRUT::OBJWriter Class Reference

Class for writing OBJ files. More...

#include <objwriter.h>

List of all members.

Public Member Functions

 OBJWriter (wxBufferedOutputStream *_outputStream, const Scene *_scene)
 ~OBJWriter ()
 Class destructor.
void Write ()
 Write OBJ stream.

Private Attributes

wxBufferedOutputStream * outputStream
 Input stream.
const Scenescene
 Scene container to be built.


Detailed Description

Class for writing OBJ files.

Definition at line 22 of file objwriter.h.


Constructor & Destructor Documentation

OBJWriter::OBJWriter ( wxBufferedOutputStream *  _outputStream,
const Scene _scene 
)

Class constructor

Parameters:
[in] _outputStream Stream to write data to
[in] _scene Scene to asve

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.

00024 {
00026 }


Member Function Documentation

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 }


Member Data Documentation

wxBufferedOutputStream* VRUT::OBJWriter::outputStream [private]

Input stream.

Definition at line 26 of file objwriter.h.

const Scene* VRUT::OBJWriter::scene [private]

Scene container to be built.

Definition at line 28 of file objwriter.h.


The documentation for this class was generated from the following files:

Generated on Tue Mar 10 14:41:40 2009 for VRUT by  doxygen 1.5.5