All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ModelMesh.h
1 // Copyright eeGeo Ltd (2012-2014), All Rights Reserved
2 
3 #pragma once
4 
5 #include "Types.h"
6 #include "VectorMath.h"
7 #include "Rendering.h"
8 #include "POD.h"
9 
10 #include <vector>
11 
12 #define MESH_MAX_UV_CHANNELS (2)
13 
14 namespace Eegeo
15 {
16  typedef void (*HeightCB)(const void* pVB, u32 numVertices, u32 numStride, const void* pIB, u32 numIndices);
17 
18  typedef struct {
19 
20  float x, y, z;
21  float nx, ny, nz;
22  float u, v;
23 
24  } Mesh_Vertex;
25 
26 
27  typedef struct {
28 
29  float x, y, z;
30  float u, v;
31  float u2, v2;
32 
34 
35  struct QuadrantData
36  {
37  u32 startIndex;
38  u32 numIndices;
39 
40  Eegeo::v3 min;
41  Eegeo::v3 max;
42 
43  QuadrantData* pChildren;
44 
45  QuadrantData() : startIndex(0), numIndices(0), pChildren(NULL)
46  {
47  min.Set( FLT_MAX, FLT_MAX, FLT_MAX);
48  max.Set(-FLT_MAX, -FLT_MAX, -FLT_MAX);
49  }
50  };
51 
52  class FrustumRadar;
53 
54  class ModelMesh {
55  bool m_isSkin;
56  bool m_isPreLit;
57  bool m_includeNormals;
58  bool m_isTriStripped;
59 
60  u32 m_compression;
61 
62 
63  u32 m_vertexBuffer;
64 
65 #if !defined (ANDROID) && !defined (EMSCRIPTEN)
66  u32 m_vertexArray;
67 #endif
68 
69  u32 m_indexBuffer;
70 
71  u32 m_numVertices;
72  u32 m_numIndices;
73  u32 m_numUVChannels;
74 
75  u32 m_vertexStride;
76  u32 m_normalStride;
77  u32 m_UVStride[MESH_MAX_UV_CHANNELS];
78 
79  const u8* m_pVertexData;
80  const u8* m_pNormalData;
81  const u8* m_pUVData[MESH_MAX_UV_CHANNELS];
82  const u8* m_pBoneWeightData;
83  const u8* m_pBoneIndexData;
84 
85  const u32* m_pTriStripLengths;
86  u32 m_numTriStrips;
87 
88  std::vector<s32> m_boneRemap;
89 
90  QuadrantData* m_pQuadrants;
91 
92 
93  public:
94 
95  ModelMesh ();
96  ~ModelMesh ();
97 
98  static ModelMesh* CreateFromPODMesh(
99  const IO::POD::PODMesh* podMesh,
100  HeightCB createHeightData,
101  bool isPreLit
102  );
103  void Create (Eegeo::Rendering::GLState& glState, Mesh_Vertex* pVertices, u32 numVertices, u16* pIndices, u32 numIndices);
104  void Parse (void* pMeshData);
105  void Draw (Eegeo::Rendering::GLState& glState, const Eegeo::m44& world, Eegeo::FrustumRadar* pFrustum, bool clip);
106 
107  bool IsSkinned () { return m_isSkin; }
108  u32 GetNumSkinMatrices () { return static_cast<u32>(m_boneRemap.size()); }
109  u32 GetSkinMatrix (int index) { return m_boneRemap[index]; }
110 
111  Eegeo::v3 m_extentsMin;
112  Eegeo::v3 m_extentsMax;
113  Eegeo::v3 m_centre;
114  float m_radius;
115 
116  private:
117  void InitFromPODMesh (const IO::POD::PODMesh* podMesh);
118  void InitRenderData (
119  HeightCB createHeightData,
120  bool isPreLit,
121  const void* pInterleavedData,
122  const void* pIndexData,
123  u32 numBonesVert,
124  const s32* batchBoneCounts
125  );
126  };
127 }