All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
PODFileHelpers.h
1 // Copyright eeGeo Ltd (2012-2014), All Rights Reserved
2 
3 #pragma once
4 
5 #include "Types.h"
6 #include "Helpers.h"
7 #include <fstream>
8 
9 #define PVRTMODELPOD_TAG_MASK (0x80000000)
10 #define PVRTMODELPOD_TAG_START (0x00000000)
11 #define PVRTMODELPOD_TAG_END (0x80000000)
12 
13 namespace Eegeo
14 {
15  class Texture;
16 
17  namespace IO
18  {
19  namespace POD
20  {
21  enum EPODFileName
22  {
23  ePODFileVersion = 1000,
24  ePODFileScene,
25  ePODFileExpOpt,
26  ePODFileHistory,
27  ePODFileEndiannessMisMatch = -402456576,
28 
29  ePODFileColourBackground = 2000,
30  ePODFileColourAmbient,
31  ePODFileNumCamera,
32  ePODFileNumLight,
33  ePODFileNumMesh,
34  ePODFileNumNode,
35  ePODFileNumMeshNode,
36  ePODFileNumTexture,
37  ePODFileNumMaterial,
38  ePODFileNumFrame,
39  ePODFileCamera,
40  ePODFileLight,
41  ePODFileMesh,
42  ePODFileNode,
43  ePODFileTexture,
44  ePODFileMaterial,
45  ePODFileFlags,
46  ePODFileFPS,
47 
48  ePODFileMatName = 3000,
49  ePODFileMatIdxTexDiffuse,
50  ePODFileMatOpacity,
51  ePODFileMatAmbient,
52  ePODFileMatDiffuse,
53  ePODFileMatSpecular,
54  ePODFileMatShininess,
55  ePODFileMatEffectFile,
56  ePODFileMatEffectName,
57  ePODFileMatIdxTexAmbient,
58  ePODFileMatIdxTexSpecularColour,
59  ePODFileMatIdxTexSpecularLevel,
60  ePODFileMatIdxTexBump,
61  ePODFileMatIdxTexEmissive,
62  ePODFileMatIdxTexGlossiness,
63  ePODFileMatIdxTexOpacity,
64  ePODFileMatIdxTexReflection,
65  ePODFileMatIdxTexRefraction,
66  ePODFileMatBlendSrcRGB,
67  ePODFileMatBlendSrcA,
68  ePODFileMatBlendDstRGB,
69  ePODFileMatBlendDstA,
70  ePODFileMatBlendOpRGB,
71  ePODFileMatBlendOpA,
72  ePODFileMatBlendColour,
73  ePODFileMatBlendFactor,
74  ePODFileMatFlags,
75 
76  ePODFileTexName = 4000,
77 
78  ePODFileNodeIdx = 5000,
79  ePODFileNodeName,
80  ePODFileNodeIdxMat,
81  ePODFileNodeIdxParent,
82  ePODFileNodePos,
83  ePODFileNodeRot,
84  ePODFileNodeScale,
85  ePODFileNodeAnimPos,
86  ePODFileNodeAnimRot,
87  ePODFileNodeAnimScale,
88  ePODFileNodeMatrix,
89  ePODFileNodeAnimMatrix,
90  ePODFileNodeAnimFlags,
91  ePODFileNodeAnimPosIdx,
92  ePODFileNodeAnimRotIdx,
93  ePODFileNodeAnimScaleIdx,
94  ePODFileNodeAnimMatrixIdx,
95 
96  ePODFileMeshNumVtx = 6000,
97  ePODFileMeshNumFaces,
98  ePODFileMeshNumUVW,
99  ePODFileMeshFaces,
100  ePODFileMeshStripLength,
101  ePODFileMeshNumStrips,
102  ePODFileMeshVtx,
103  ePODFileMeshNor,
104  ePODFileMeshTan,
105  ePODFileMeshBin,
106  ePODFileMeshUVW,
107  ePODFileMeshVtxCol,
108  ePODFileMeshBoneIdx,
109  ePODFileMeshBoneWeight,
110  ePODFileMeshInterleaved,
111  ePODFileMeshBoneBatches,
112  ePODFileMeshBoneBatchBoneCnts,
113  ePODFileMeshBoneBatchOffsets,
114  ePODFileMeshBoneBatchBoneMax,
115  ePODFileMeshBoneBatchCnt,
116  ePODFileMeshUnpackMatrix,
117 
118  ePODFileLightIdxTgt = 7000,
119  ePODFileLightColour,
120  ePODFileLightType,
121  ePODFileLightConstantAttenuation,
122  ePODFileLightLinearAttenuation,
123  ePODFileLightQuadraticAttenuation,
124  ePODFileLightFalloffAngle,
125  ePODFileLightFalloffExponent,
126 
127  ePODFileCamIdxTgt = 8000,
128  ePODFileCamFOV,
129  ePODFileCamFar,
130  ePODFileCamNear,
131  ePODFileCamAnimFOV,
132 
133  ePODFileDataType = 9000,
134  ePODFileN,
135  ePODFileStride,
136  ePODFileData
137  };
138 
139 
140  enum EPODBlendFunc
141  {
142  ePODBlendFunc_ZERO=0,
143  ePODBlendFunc_ONE,
144  ePODBlendFunc_BLEND_FACTOR,
145  ePODBlendFunc_ONE_MINUS_BLEND_FACTOR,
146 
147  ePODBlendFunc_SRC_COLOR = 0x0300,
148  ePODBlendFunc_ONE_MINUS_SRC_COLOR,
149  ePODBlendFunc_SRC_ALPHA,
150  ePODBlendFunc_ONE_MINUS_SRC_ALPHA,
151  ePODBlendFunc_DST_ALPHA,
152  ePODBlendFunc_ONE_MINUS_DST_ALPHA,
153  ePODBlendFunc_DST_COLOR,
154  ePODBlendFunc_ONE_MINUS_DST_COLOR,
155  ePODBlendFunc_SRC_ALPHA_SATURATE,
156 
157  ePODBlendFunc_CONSTANT_COLOR = 0x8001,
158  ePODBlendFunc_ONE_MINUS_CONSTANT_COLOR,
159  ePODBlendFunc_CONSTANT_ALPHA,
160  ePODBlendFunc_ONE_MINUS_CONSTANT_ALPHA
161  };
162 
163  enum EPVRTDataType {
164  EPODDataNone,
165  EPODDataFloat,
166  EPODDataInt,
167  EPODDataUnsignedShort,
168  EPODDataRGBA,
169  EPODDataARGB,
170  EPODDataD3DCOLOR,
171  EPODDataUBYTE4,
172  EPODDataDEC3N,
173  EPODDataFixed16_16,
174  EPODDataUnsignedByte,
175  EPODDataShort,
176  EPODDataShortNorm,
177  EPODDataByte,
178  EPODDataByteNorm,
179  EPODDataUnsignedByteNorm,
180  EPODDataUnsignedShortNorm,
181  EPODDataUnsignedInt
182  };
183 
184  struct ePODData {
185 
186  ePODData()
187  : type(EPODDataNone), num(0), stride(0), pOffset(NULL), dynamicallyAllocated(false)
188  {};
189 
190  EPVRTDataType type;
191  u32 num;
192  u32 stride;
193  u8* pOffset;
194  bool dynamicallyAllocated;
195  };
196 
198  {
199  public:
200 
201  static void ParseFileTexture (Eegeo::Helpers::ITextureFileLoader * loader,
202  std::istream& stream,
203  u32 fileOffset,
204  u32 fileSize,
205  u32& pTexture);
206 
207  static void ReadMarker (std::istream& stream, u32* pName, u32* pLength);
208 
209  static void ReadArray (std::istream& stream, u8* pData, u32 numByte);
210  static void ReadArray16(std::istream& stream, u16* pData, u32 size);
211  static void ReadArray32(std::istream& stream, u32* pData, u32 size);
212 
213  static void ReadString(std::istream& stream, std::string &destString);
214 
215  static void ReadCPODData(std::istream& stream, u32 fileOffset, u32 fileSize, u32 spec, ePODData* pData, bool validData);
216 
217  static u32 GetDataTypeSize (EPVRTDataType type);
218 
219  template <typename T>
220  static void ReadS32(std::istream& stream, T* value)
221  {
222  unsigned char ub[4];
223 
224  stream.read((char*)( &ub[0] ), 4);
225 
226  int *pn = (int*)value;
227  *pn = (int) ((ub[3] << 24) | (ub[2] << 16) | (ub[1] << 8) | ub[0]);
228  }
229 
230  template <typename T>
231  static void Read32(std::istream& stream, T* value)
232  {
233  unsigned char ub[4];
234 
235  stream.read((char*)( &ub[0] ), 4);
236 
237  unsigned int *pn = (unsigned int*)value;
238  *pn = (unsigned int) ((ub[3] << 24) | (ub[2] << 16) | (ub[1] << 8) | ub[0]);
239  }
240 
241 
242  template <typename T>
243  static void Read16(std::istream& stream, T* value)
244  {
245  unsigned char ub[2];
246 
247  stream.read((char*)( &ub[0] ), 2);
248 
249  unsigned short *pn = (unsigned short*)value;
250  *pn = (unsigned short) ((ub[1] << 8) | ub[0]);
251  }
252 
253  };
254  }
255  }
256 }