rev |
line source |
nuclear@0
|
1 #ifndef _3DGEOM_H_
|
nuclear@0
|
2 #define _3DGEOM_H_
|
nuclear@0
|
3
|
nuclear@0
|
4 #include <vector>
|
nuclear@0
|
5 #include "n3dmath.h"
|
nuclear@0
|
6 #include "3dengtypes.h"
|
nuclear@0
|
7 #include "switches.h"
|
nuclear@0
|
8
|
nuclear@0
|
9 struct TexCoord {
|
nuclear@0
|
10 float u, v;
|
nuclear@0
|
11
|
nuclear@0
|
12 TexCoord(float u = 0.0f, float v = 0.0f);
|
nuclear@0
|
13 };
|
nuclear@0
|
14
|
nuclear@0
|
15 class Triangle; // fwd declaration
|
nuclear@0
|
16
|
nuclear@0
|
17 class Vertex {
|
nuclear@0
|
18 public:
|
nuclear@0
|
19 Vector3 pos;
|
nuclear@0
|
20 float BlendFactor;
|
nuclear@0
|
21 dword BlendIndex;
|
nuclear@0
|
22 Vector3 normal;
|
nuclear@0
|
23 dword color;
|
nuclear@0
|
24 TexCoord tex[4];
|
nuclear@0
|
25
|
nuclear@0
|
26 Vertex();
|
nuclear@0
|
27 Vertex(const Vector3 &position, float tu = 0.0f, float tv = 0.0f, dword color = 0x00ffffff);
|
nuclear@0
|
28
|
nuclear@0
|
29 void CalculateNormal(const Vertex *vbuffer, const Triangle *triangles, long trinum);
|
nuclear@0
|
30 };
|
nuclear@0
|
31
|
nuclear@0
|
32
|
nuclear@0
|
33 class Edge {
|
nuclear@0
|
34 public:
|
nuclear@0
|
35 Index vertices[2];
|
nuclear@0
|
36 Index adjfaces[2];
|
nuclear@0
|
37
|
nuclear@0
|
38 Edge();
|
nuclear@0
|
39 Edge(Index v1, Index v2, Index af1 = 0, Index af2 = 0);
|
nuclear@0
|
40 };
|
nuclear@0
|
41
|
nuclear@0
|
42
|
nuclear@0
|
43 class Triangle {
|
nuclear@0
|
44 public:
|
nuclear@0
|
45 Index vertices[3];
|
nuclear@0
|
46 Vector3 normal;
|
nuclear@0
|
47 dword SmoothingGroup;
|
nuclear@0
|
48
|
nuclear@0
|
49 Triangle(Index v1 = 0, Index v2 = 0, Index v3 = 0);
|
nuclear@0
|
50
|
nuclear@0
|
51 void CalculateNormal(Vertex *vbuffer, bool normalize=0);
|
nuclear@0
|
52 };
|
nuclear@0
|
53
|
nuclear@0
|
54
|
nuclear@0
|
55 enum TriMeshMode {TriMeshDynamic, TriMeshStatic};
|
nuclear@0
|
56
|
nuclear@0
|
57 class GraphicsContext;
|
nuclear@0
|
58
|
nuclear@0
|
59 class TriMesh {
|
nuclear@0
|
60 private:
|
nuclear@0
|
61 GraphicsContext *gc;
|
nuclear@0
|
62
|
nuclear@0
|
63 // LOD arrays of vertex and triangle arrays for the mesh
|
nuclear@0
|
64 Vertex **varray;
|
nuclear@0
|
65 Triangle **triarray;
|
nuclear@0
|
66 // system managed copy of the data (probably on the video ram or something)
|
nuclear@0
|
67 VertexBuffer **vbuffer;
|
nuclear@0
|
68 IndexBuffer **ibuffer;
|
nuclear@0
|
69
|
nuclear@0
|
70 std::vector<dword> **AdjTriangles;
|
nuclear@0
|
71 bool *AdjValid;
|
nuclear@0
|
72
|
nuclear@0
|
73 dword *VertexCount, *TriCount;
|
nuclear@0
|
74 byte Levels;
|
nuclear@0
|
75
|
nuclear@0
|
76 bool *BuffersValid;
|
nuclear@0
|
77 bool dynamic;
|
nuclear@0
|
78
|
nuclear@0
|
79 // synchronizes the system managed copy of vertices/indices with the local data
|
nuclear@0
|
80 bool UpdateSystemBuffers(byte level);
|
nuclear@0
|
81 void UpdateLODChain();
|
nuclear@0
|
82
|
nuclear@0
|
83 public:
|
nuclear@0
|
84 TriMesh(byte LODLevels, GraphicsContext *gc = 0);
|
nuclear@0
|
85 TriMesh(const TriMesh &mesh);
|
nuclear@0
|
86 ~TriMesh();
|
nuclear@0
|
87
|
nuclear@0
|
88 const TriMesh &operator =(const TriMesh &mesh);
|
nuclear@0
|
89
|
nuclear@0
|
90 const Vertex *GetVertexArray(byte level = 0) const;
|
nuclear@0
|
91 const Triangle *GetTriangleArray(byte level = 0) const;
|
nuclear@0
|
92
|
nuclear@0
|
93 Vertex *GetModVertexArray();
|
nuclear@0
|
94 Triangle *GetModTriangleArray();
|
nuclear@0
|
95
|
nuclear@0
|
96 const VertexBuffer *GetVertexBuffer(byte level = 0) const;
|
nuclear@0
|
97 const IndexBuffer *GetIndexBuffer(byte level = 0) const;
|
nuclear@0
|
98
|
nuclear@0
|
99 dword GetVertexCount(byte level = 0) const;
|
nuclear@0
|
100 dword GetTriangleCount(byte level = 0) const;
|
nuclear@0
|
101 byte GetLevelCount() const;
|
nuclear@0
|
102
|
nuclear@0
|
103 void ChangeMode(TriMeshMode mode);
|
nuclear@0
|
104 void SetGraphicsContext(GraphicsContext *gc);
|
nuclear@0
|
105 void SetData(const Vertex *vdata, const Triangle *tridata, dword vcount, dword tricount);
|
nuclear@0
|
106
|
nuclear@0
|
107 void CalculateNormals();
|
nuclear@0
|
108 void CalculateNormalsFast();
|
nuclear@0
|
109 //void CalculateEdges();
|
nuclear@0
|
110 };
|
nuclear@0
|
111
|
nuclear@0
|
112 #endif // _3DGEOM_H_ |