00001
00010 #ifndef _VRMLMODEL_H
00011 #define _VRMLMODEL_H
00012
00013 #include <G3D/G3D.h>
00014 #include <GLG3D/PosedModel.h>
00015 #include "IS3DCommon.H"
00016
00017 #include "VRMLParser.H"
00018
00019
00020 namespace IS3D {
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 typedef ReferenceCountedPointer<class VRMLModel> VRMLModelRef;
00123 class VRMLObj;
00124
00125 class VRMLModel : public ReferenceCountedObject {
00126
00127 private:
00128
00129
00130
00131
00132
00133 class PosedVRMLModel : public PosedModel {
00134 public:
00135 VRMLModelRef model;
00136 CoordinateFrame cframe;
00137 bool perVertexNormals;
00138 bool useMaterial;
00139 GMaterial material;
00140 static GFontRef labelFont;
00141
00142 PosedVRMLModel(VRMLModelRef _model, const CoordinateFrame& _cframe, bool _pvn,
00143 const GMaterial& _mat, bool _useMat);
00144 virtual ~PosedVRMLModel() {}
00145 virtual std::string name() const;
00146 virtual void getCoordinateFrame(CoordinateFrame&) const;
00147 virtual const MeshAlg::Geometry& objectSpaceGeometry() const;
00148 virtual const Array<MeshAlg::Face>& faces() const;
00149 virtual const Array<MeshAlg::Edge>& edges() const;
00150 virtual const Array<MeshAlg::Vertex>& vertices() const;
00151 virtual const Array<MeshAlg::Face>& weldedFaces() const;
00152 virtual const Array<MeshAlg::Edge>& weldedEdges() const;
00153 virtual const Array<MeshAlg::Vertex>& weldedVertices() const;
00154 virtual const Array<int>& triangleIndices() const;
00155 virtual void getObjectSpaceBoundingSphere(Sphere&) const;
00156 virtual void getObjectSpaceBoundingBox(Box&) const;
00157 virtual void render(RenderDevice* renderDevice) const;
00158 virtual int numBoundaryEdges() const;
00159 virtual int numWeldedBoundaryEdges() const;
00160 virtual const Array<Vector3>& objectSpaceFaceNormals(bool normalize = true) const;
00161 };
00162
00163 friend class PosedVRMLModel;
00164 friend class VRMLObj;
00165
00166 VRMLSeparatorNodeRef root_vrml_node;
00167
00168 std::string filename;
00169 MeshAlg::Geometry geometry;
00170 Array<int> indexArray;
00171 Array<Vector3> faceNormalArray;
00172 Array<MeshAlg::Face> weldedFaceArray;
00173 Array<MeshAlg::Edge> weldedEdgeArray;
00174 Array<MeshAlg::Vertex> weldedVertexArray;
00175 Array<MeshAlg::Face> faceArray;
00176 Array<MeshAlg::Edge> edgeArray;
00177 Array<MeshAlg::Vertex> vertexArray;
00178 Sphere boundingSphere;
00179 Box boundingBox;
00180 int numBoundaryEdges;
00181 int numWeldedBoundaryEdges;
00182 std::string name;
00183
00184
00185 bool _show_vertex_numbers;
00186
00188 static VARAreaRef varArea;
00189
00191 VRMLModel();
00192
00194 void load(const std::string& filename, const Vector3& scale, const CoordinateFrame& cframe);
00195
00197 void reset();
00198
00200 void makeG3DMesh();
00201 void traverseVRML( const VRMLSeparatorNodeRef& sepNode );
00202
00203
00205 int peekNextNodeType ( TextInput& vrmlTextFile );
00206 VRMLSeparatorNodeRef parseSeparatorNode ( TextInput& vrmlTextFile, bool isRootSep=false );
00207 VRMLMaterialNodeRef parseMaterialNode ( TextInput& vrmlTextFile );
00208 VRMLCoordinatesNodeRef parseCoordinate3Node( TextInput& vrmlTextFile );
00209 VRMLNormalsNodeRef parseNormalsNode ( TextInput& vrmlTextFile );
00210 VRMLIndexedFaceNodeRef parseIndexedFaceNode( TextInput& vrmlTextFile );
00211 VRMLGroupNodeRef parseGroupNode ( TextInput& vrmlTextFile );
00212 VRMLSwitchNodeRef parseSwitchNode ( TextInput& vrmlTextFile );
00213
00214 Array< Array<int> > reshapeDelimitedIntArray( const Array<int>& srcArray, int delimiter );
00215
00216
00217 void readThreeTuples ( TextInput& vrmlTextFile, Array< Vector3 >& values );
00218 void readScalars ( TextInput& vrmlTextFile, Array< double >& values );
00219 void readInts ( TextInput& vrmlTextFile, Array< int >& values );
00220 Vector3 readThreeTuple ( TextInput& vrmlTextFile );
00221 double readScalar ( TextInput& vrmlTextFile );
00222
00223 void eatString ( TextInput& vrmlTextFile, const std::string expectedToken );
00224 void eatBeginCurly ( TextInput& vrmlTextFile );
00225 void eatCloseCurly ( TextInput& vrmlTextFile );
00226 void eatBeginBrace ( TextInput& vrmlTextFile );
00227 void eatCloseBrace ( TextInput& vrmlTextFile );
00228 void eatUntilCloseCurly ( TextInput& vrmlTextFile );
00229 public:
00230
00231 virtual ~VRMLModel();
00232
00242 static VRMLModelRef create(const std::string& filename, const Vector3& scale = Vector3(1,1,1), const CoordinateFrame& cframe = CoordinateFrame());
00243 static VRMLModelRef create(const std::string& filename, const double scale, const CoordinateFrame& cframe = CoordinateFrame());
00244
00250 virtual PosedModelRef pose(const CoordinateFrame& cframe, bool perVertexNormals = true);
00251
00256 virtual PosedModelRef pose(const CoordinateFrame& cframe, const GMaterial& material, bool perVertexNormals = true);
00257
00258 virtual size_t mainMemorySize() const;
00259
00260 virtual const MeshAlg::Geometry& getGeometry() { return geometry; }
00261 };
00262
00263 }
00264
00265 #endif