absence_thelab

annotate src/3deng/3dgeom.h @ 0:1cffe3409164

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 23 Oct 2014 01:46:07 +0300
parents
children
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_