00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "stlwriter.h"
00013 #include "../../textwriter.h"
00014
00015 using namespace VRUT;
00016
00017
00018 STLWriter::STLWriter(wxBufferedOutputStream * _outputStream, const Scene * _scene) : outputStream(_outputStream), scene(_scene)
00019 {
00020 }
00021
00022 STLWriter::~STLWriter()
00023 {
00025 }
00026
00027 void STLWriter::writeASCII()
00028 {
00029 TextWriter textWriter((wxBufferedOutputStream *)outputStream);
00030
00031 textWriter.Write("solid ")->Write(scene->GetName())->Write("\n");
00032
00033
00034 for (std::vector<STLBinary>::const_iterator facetIT = facets.begin(); facetIT != facets.end(); facetIT++)
00035 {
00036 textWriter.Write(" facet normal ")->Write(facetIT->norm, 3, " ")->Write("\n outer loop\n vertex ");
00037 textWriter.Write(facetIT->vert1, 3, " ")->Write("\n vertex ")->Write(facetIT->vert2, 3, " ");
00038 textWriter.Write("\n vertex ")->Write(facetIT->vert3, 3, " ")->Write("\n endloop\n endfacet\n");
00039 }
00040
00041
00042 textWriter.Write("endsolid ")->Write(scene->GetName())->Write("\n");
00043 }
00044
00045 void STLWriter::writeBinary()
00046 {
00047
00048 char header[80];
00049 strncpy(header, scene->GetName().mb_str(wxConvISO8859_1), 80);
00050 outputStream->Write(header, 80);
00051 unsigned long count = (unsigned long)facets.size();
00052 outputStream->Write(&count, 4);
00053
00054
00055 wxString facet;
00056 for (std::vector<STLBinary>::const_iterator facetIT = facets.begin(); facetIT != facets.end(); facetIT++)
00057 {
00058 outputStream->Write(&(*facetIT), 50);
00059 }
00060 }
00061
00062 void STLWriter::Write(bool saveBinary)
00063 {
00064
00065 std::vector<NODE_ID> nodes;
00066 scene->GetNodeIDs(&nodes);
00067
00068 for (std::vector<NODE_ID>::const_iterator nodeIt = nodes.begin();
00069 nodeIt != nodes.end(); nodeIt++)
00070 {
00071 const SceneNode * node = scene->GetNode(*nodeIt);
00072 if (!node || !node->IsOfType(SceneNode::GEOMETRY))
00073 continue;
00074 scene->UpdateTransformation(*nodeIt);
00075
00076 const Geometry * geom = scene->GetGeometry(((const GeometryNode *)node)->GetGeometryID());
00077 if (geom && geom->type == Geometry::GEOMETRY_TRIANGLE)
00078 {
00079 std::vector<Triangle> triangles = geom->Triangulate();
00080 MATRIX transf(*node->GetWorldTransMatrix());
00081 for (size_t i=0; i<triangles.size(); i++)
00082 {
00083 STLBinary facet;
00084 memcpy(facet.vert1, transf.TransformCoord(triangles.at(i).v1)._v, sizeof(float)*3);
00085 memcpy(facet.vert2, transf.TransformCoord(triangles.at(i).v2)._v, sizeof(float)*3);
00086 memcpy(facet.vert3, transf.TransformCoord(triangles.at(i).v3)._v, sizeof(float)*3);
00087 memcpy(facet.norm, (VECTOR3(facet.vert2) - VECTOR3(facet.vert1)).Cross(VECTOR3(facet.vert3) - VECTOR3(facet.vert1)).Normalize()._v, sizeof(float)*3);
00088 if (_isnan(facet.norm[0]) || _isnan(facet.norm[1]) || _isnan(facet.norm[2]))
00089 continue;
00090 facet.attr[0]=0;
00091 facet.attr[1]=0;
00092 facets.push_back(facet);
00093 }
00094 }
00095 }
00096 if (saveBinary)
00097 writeBinary();
00098 else
00099 writeASCII();
00100 }