#include <rdfwriter.h>
Public Member Functions | |
| RDFWriter (wxBufferedOutputStream *_outputStream, const Scene *_scene) | |
| ~RDFWriter () | |
| Class destructor. | |
| void | Write () |
| Write RDF stream. | |
Private Attributes | |
| wxOutputStream * | outputStream |
| Input stream. | |
| const Scene * | scene |
| Scene container to be built. | |
Definition at line 22 of file rdfwriter.h.
| RDFWriter::RDFWriter | ( | wxBufferedOutputStream * | _outputStream, | |
| const Scene * | _scene | |||
| ) |
Class constructor
Definition at line 19 of file rdfwriter.cpp.
00019 : outputStream(_outputStream), scene(_scene) 00020 { 00021 }
| RDFWriter::~RDFWriter | ( | ) |
Class destructor.
Is called by wxWidgets itself on wxApp end but it doesn't work in dynamic library
Definition at line 23 of file rdfwriter.cpp.
| void RDFWriter::Write | ( | ) |
Write RDF stream.
Definition at line 28 of file rdfwriter.cpp.
00029 { 00030 TextWriter textWriter((wxBufferedOutputStream *)outputStream); 00031 //write header 00032 textWriter.Write("$---------------------------------------------------------------------MDI_HEADER\r\n"); 00033 textWriter.Write("[MDI_HEADER]\r\n"); 00034 textWriter.Write("FILE_TYPE = 'rdf'\r\n"); 00035 textWriter.Write("FILE_VERSION = 5.00\r\n"); 00036 textWriter.Write("FILE_FORMAT = 'ASCII'\r\n"); 00037 textWriter.Write("(COMMENTS)\r\n"); 00038 textWriter.Write("{comment_string)\r\n"); 00039 textWriter.Write("'")->Write(scene->GetName())->Write("'\r\n"); 00040 textWriter.Write("$--------------------------------------------------------------------------units\r\n"); 00041 textWriter.Write("[UNITS]\r\n"); 00042 textWriter.Write(" LENGTH = 'mm'\r\n"); 00043 textWriter.Write(" FORCE = 'newton'\r\n"); 00044 textWriter.Write(" ANGLE = 'radians'\r\n"); 00045 textWriter.Write(" MASS = 'kg'\r\n"); 00046 textWriter.Write(" TIME = 'sec'\r\n"); 00047 textWriter.Write("$---------------------------------------------------------------------definition\r\n"); 00048 textWriter.Write("[MODEL]\r\n"); 00049 textWriter.Write(" METHOD = '3D'\r\n"); 00050 textWriter.Write(" FUNCTION_NAME = 'ARC904'\r\n"); 00051 textWriter.Write("$-------------------------------------------------------------------------offset\r\n"); 00052 textWriter.Write("[OFFSET]\r\n"); 00053 textWriter.Write(" X = 0.0\r\n"); 00054 textWriter.Write(" y = 0.0\r\n"); 00055 textWriter.Write(" Z = 0.0\r\n"); 00056 textWriter.Write("$--------------------------------------------------------------------------nodes\r\n"); 00057 00058 std::vector<NODE_ID> nodes; 00059 scene->GetNodeIDs(&nodes); 00060 00061 //write nodes 00062 textWriter.Write("[NODES]\r\n"); 00063 //compute vertices count and elements count 00064 size_t vertsCount=0, elementsCount=0; 00065 for (std::vector<NODE_ID>::const_iterator nodeIt = nodes.begin(); nodeIt != nodes.end(); nodeIt++) 00066 { 00067 const SceneNode * node = scene->GetNode(*nodeIt); 00068 if (!node || !node->IsOfType(SceneNode::GEOMETRY)) 00069 continue; 00070 scene->UpdateTransformation(*nodeIt); 00071 00072 const Geometry * geom = scene->GetGeometry(((const GeometryNode *)node)->GetGeometryID()); 00073 if (geom && geom->type == Geometry::GEOMETRY_TRIANGLE) 00074 { 00075 GeometryTriangles *geoTri = ((GeometryTriangles *)geom); 00076 vertsCount+=geoTri->vertices.size(); 00077 for (size_t j=0; j<geoTri->triDescList.size(); j++) 00078 { 00079 long count = long(((j+1<geoTri->triDescList.size())?geoTri->triDescList.at(j+1).first:geoTri->indices.size()) - geoTri->triDescList.at(j).first); 00080 switch (geoTri->triDescList.at(j).second) 00081 { 00082 case GeometryTriangles::TRI_LIST: 00083 elementsCount+=count/3; 00084 break; 00085 case GeometryTriangles::TRI_FAN: 00086 case GeometryTriangles::TRI_STRIP: 00087 case GeometryTriangles::POLYGON: 00088 elementsCount+=count-2; 00089 break; 00090 case GeometryTriangles::LINES: 00091 case GeometryTriangles::LINE_STRIP: 00092 case GeometryTriangles::POINTS: 00093 break; 00094 case GeometryTriangles::QUADS: 00095 elementsCount+=count/2; 00096 break; 00097 } 00098 } 00099 } 00100 } 00101 textWriter.Write(" NUMBER_OF_NODES = ")->Write((long)vertsCount)->Write("\r\n"); 00102 //write vertices 00103 size_t vertIndex=1; 00104 textWriter.Write("{ node x_value y_value z_value }\r\n"); 00105 for (std::vector<NODE_ID>::const_iterator nodeIt = nodes.begin(); nodeIt != nodes.end(); nodeIt++) 00106 { 00107 const SceneNode * node = scene->GetNode(*nodeIt); 00108 if (!node || !node->IsOfType(SceneNode::GEOMETRY)) 00109 continue; 00110 scene->UpdateTransformation(*nodeIt); 00111 00112 const Geometry * geom = scene->GetGeometry(((const GeometryNode *)node)->GetGeometryID()); 00113 if (geom && geom->type == Geometry::GEOMETRY_TRIANGLE) 00114 { 00115 const std::vector<VECTOR3> * vertices = &((GeometryTriangles *)geom)->vertices; 00116 MATRIX transf(*node->GetWorldTransMatrix()); 00117 for (size_t i=0; i<vertices->size(); i++) 00118 { 00119 vector3 transformed(transf.TransformCoord(vertices->at(i))); 00120 textWriter.Write((long)vertIndex++)->Write("\t")->Write(transformed._v, 3, "\t")->Write("\r\n"); 00121 } 00122 } 00123 } 00124 00125 //write elements 00126 textWriter.Write("\r\n")->Write("\r\n"); 00127 textWriter.Write("$----------------------------------------------------------------------elements\r\n"); 00128 textWriter.Write("[ELEMENTS]\r\n"); 00129 textWriter.Write(" NUMBER_OF_ELEMENTS = ")->Write((long)elementsCount)->Write("\r\n"); 00130 textWriter.Write("{ node_1 node_2 node_3 mu }\r\n"); 00131 size_t geometryOffset=0; 00132 00133 for (std::vector<NODE_ID>::const_iterator nodeIt = nodes.begin(); nodeIt != nodes.end(); nodeIt++) 00134 { 00135 const SceneNode * node = scene->GetNode(*nodeIt); 00136 if (!node || !node->IsOfType(SceneNode::GEOMETRY)) 00137 continue; 00138 scene->UpdateTransformation(*nodeIt); 00139 00140 const Geometry * geom = scene->GetGeometry(((const GeometryNode *)node)->GetGeometryID()); 00141 if (geom && geom->type == Geometry::GEOMETRY_TRIANGLE) 00142 { 00143 GeometryTriangles *geoTri = ((GeometryTriangles *)geom); 00144 elementsCount=0; 00145 for (size_t j=0; j<geoTri->triDescList.size(); j++) 00146 { 00147 long count = long(((j+1<geoTri->triDescList.size())?geoTri->triDescList.at(j+1).first:geoTri->indices.size()) - geoTri->triDescList.at(j).first); 00148 size_t first = geoTri->triDescList.at(j).first; 00149 switch (geoTri->triDescList.at(j).second) 00150 { 00151 case GeometryTriangles::TRI_LIST: 00152 { 00153 for (size_t i=0; i<count; i++) 00154 { 00155 textWriter.Write((long)(geoTri->indices.at(first+i)+1+geometryOffset))->Write("\t"); 00156 textWriter.Write((long)(geoTri->indices.at(first+i+1)+1+geometryOffset))->Write("\t"); 00157 textWriter.Write((long)(geoTri->indices.at(first+i+2)+1+geometryOffset))->Write("\t1\t\r\n"); 00158 i+=2; 00159 } 00160 } 00161 break; 00162 case GeometryTriangles::TRI_FAN: 00163 case GeometryTriangles::TRI_STRIP: 00164 case GeometryTriangles::POLYGON: 00165 case GeometryTriangles::LINES: 00166 case GeometryTriangles::LINE_STRIP: 00167 case GeometryTriangles::POINTS: 00168 LOGERROR(wxT("<RDFWriter>Not supported geometry type.")); 00169 break; 00170 case GeometryTriangles::QUADS: 00171 { 00172 for (size_t i=0; i<count; i++) 00173 { 00174 textWriter.Write((long)(geoTri->indices.at(first+i)+1+geometryOffset))->Write("\t"); 00175 textWriter.Write((long)(geoTri->indices.at(first+i+1)+1+geometryOffset))->Write("\t"); 00176 textWriter.Write((long)(geoTri->indices.at(first+i+2)+1+geometryOffset))->Write("\t1\t\r\n"); 00177 textWriter.Write((long)(geoTri->indices.at(first+i)+1+geometryOffset))->Write("\t"); 00178 textWriter.Write((long)(geoTri->indices.at(first+i+2)+1+geometryOffset))->Write("\t"); 00179 textWriter.Write((long)(geoTri->indices.at(first+i+3)+1+geometryOffset))->Write("\t1\t\r\n"); 00180 i+=3; 00181 } 00182 } 00183 break; 00184 } 00185 } 00186 geometryOffset+=geoTri->vertices.size(); 00187 } 00188 } 00189 }
wxOutputStream* VRUT::RDFWriter::outputStream [private] |
const Scene* VRUT::RDFWriter::scene [private] |
1.5.5