00001 /* 00002 * $Id: rdfwriter.cpp,v 1.56 2008-06-25 22:50:29 kybav1 Exp $ 00003 * 00004 * Description : One line description of file. 00005 * Author : Antonin Misek <antonin.misek@skoda-auto.cz> 00006 * 00007 * Purpose : 00008 * Long description of what the file is for. 00009 */ 00010 00011 00012 #include <wx/filename.h> 00013 #include "rdfwriter.h" 00014 #include "../../textwriter.h" 00015 00016 using namespace VRUT; 00017 00018 00019 RDFWriter::RDFWriter(wxBufferedOutputStream * _outputStream, const Scene * _scene) : outputStream(_outputStream), scene(_scene) 00020 { 00021 } 00022 00023 RDFWriter::~RDFWriter() 00024 { 00026 } 00027 00028 void RDFWriter::Write() 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 }
1.5.5