nuclear@0: #ifndef _3DGEOM_H_ nuclear@0: #define _3DGEOM_H_ nuclear@0: nuclear@0: #include nuclear@0: #include "n3dmath.h" nuclear@0: #include "3dengtypes.h" nuclear@0: #include "switches.h" nuclear@0: nuclear@0: struct TexCoord { nuclear@0: float u, v; nuclear@0: nuclear@0: TexCoord(float u = 0.0f, float v = 0.0f); nuclear@0: }; nuclear@0: nuclear@0: class Triangle; // fwd declaration nuclear@0: nuclear@0: class Vertex { nuclear@0: public: nuclear@0: Vector3 pos; nuclear@0: float BlendFactor; nuclear@0: dword BlendIndex; nuclear@0: Vector3 normal; nuclear@0: dword color; nuclear@0: TexCoord tex[4]; nuclear@0: nuclear@0: Vertex(); nuclear@0: Vertex(const Vector3 &position, float tu = 0.0f, float tv = 0.0f, dword color = 0x00ffffff); nuclear@0: nuclear@0: void CalculateNormal(const Vertex *vbuffer, const Triangle *triangles, long trinum); nuclear@0: }; nuclear@0: nuclear@0: nuclear@0: class Edge { nuclear@0: public: nuclear@0: Index vertices[2]; nuclear@0: Index adjfaces[2]; nuclear@0: nuclear@0: Edge(); nuclear@0: Edge(Index v1, Index v2, Index af1 = 0, Index af2 = 0); nuclear@0: }; nuclear@0: nuclear@0: nuclear@0: class Triangle { nuclear@0: public: nuclear@0: Index vertices[3]; nuclear@0: Vector3 normal; nuclear@0: dword SmoothingGroup; nuclear@0: nuclear@0: Triangle(Index v1 = 0, Index v2 = 0, Index v3 = 0); nuclear@0: nuclear@0: void CalculateNormal(Vertex *vbuffer, bool normalize=0); nuclear@0: }; nuclear@0: nuclear@0: nuclear@0: enum TriMeshMode {TriMeshDynamic, TriMeshStatic}; nuclear@0: nuclear@0: class GraphicsContext; nuclear@0: nuclear@0: class TriMesh { nuclear@0: private: nuclear@0: GraphicsContext *gc; nuclear@0: nuclear@0: // LOD arrays of vertex and triangle arrays for the mesh nuclear@0: Vertex **varray; nuclear@0: Triangle **triarray; nuclear@0: // system managed copy of the data (probably on the video ram or something) nuclear@0: VertexBuffer **vbuffer; nuclear@0: IndexBuffer **ibuffer; nuclear@0: nuclear@0: std::vector **AdjTriangles; nuclear@0: bool *AdjValid; nuclear@0: nuclear@0: dword *VertexCount, *TriCount; nuclear@0: byte Levels; nuclear@0: nuclear@0: bool *BuffersValid; nuclear@0: bool dynamic; nuclear@0: nuclear@0: // synchronizes the system managed copy of vertices/indices with the local data nuclear@0: bool UpdateSystemBuffers(byte level); nuclear@0: void UpdateLODChain(); nuclear@0: nuclear@0: public: nuclear@0: TriMesh(byte LODLevels, GraphicsContext *gc = 0); nuclear@0: TriMesh(const TriMesh &mesh); nuclear@0: ~TriMesh(); nuclear@0: nuclear@0: const TriMesh &operator =(const TriMesh &mesh); nuclear@0: nuclear@0: const Vertex *GetVertexArray(byte level = 0) const; nuclear@0: const Triangle *GetTriangleArray(byte level = 0) const; nuclear@0: nuclear@0: Vertex *GetModVertexArray(); nuclear@0: Triangle *GetModTriangleArray(); nuclear@0: nuclear@0: const VertexBuffer *GetVertexBuffer(byte level = 0) const; nuclear@0: const IndexBuffer *GetIndexBuffer(byte level = 0) const; nuclear@0: nuclear@0: dword GetVertexCount(byte level = 0) const; nuclear@0: dword GetTriangleCount(byte level = 0) const; nuclear@0: byte GetLevelCount() const; nuclear@0: nuclear@0: void ChangeMode(TriMeshMode mode); nuclear@0: void SetGraphicsContext(GraphicsContext *gc); nuclear@0: void SetData(const Vertex *vdata, const Triangle *tridata, dword vcount, dword tricount); nuclear@0: nuclear@0: void CalculateNormals(); nuclear@0: void CalculateNormalsFast(); nuclear@0: //void CalculateEdges(); nuclear@0: }; nuclear@0: nuclear@0: #endif // _3DGEOM_H_