My Project
ParaXSerializer.h
1 #pragma once
2 #include "ParaXModel/ParaXModel.h"
3 
4 #include <vector>
5 
6 namespace ParaEngine
7 {
8  // forward declare
9  class CParaFile;
10 
13  {
15  bool m_bBinary:1;
16  bool m_bCompressed:1;
17  bool m_bHasAnimation:1;
18  bool m_bHasNorm:1;
19  public:
20  SerializerOptions():m_bBinary(false), m_bCompressed(false),m_bHasAnimation(true), m_bHasNorm(true){};
21  SerializerOptions(bool bBinary):m_bBinary(bBinary), m_bCompressed(false),m_bHasAnimation(true), m_bHasNorm(true){};
22  };
23 
24 #ifdef USE_DIRECTX_RENDERER
25  typedef ID3DXFileSaveObject* LPFileSaveObject;
26  typedef ID3DXFileSaveData* LPFileSaveData;
27  typedef ID3DXFileData* LPFileData;
28 #endif
29  struct CParaRawData
30  {
31  private:
33  std::vector<byte> m_RawData;
34  public:
35  CParaRawData(){}
36 
38  unsigned int GetSize() {return (unsigned int)m_RawData.size();}
40  const byte* GetBuffer() {return &m_RawData.front();}
41 
45  unsigned int AddRawData(const DWORD * pData, int nCount){
46  unsigned int nOffset = GetSize();
47  if(nCount>0)
48  {
49  unsigned int nSize = nCount*sizeof(*pData);
50  m_RawData.resize(nOffset+nSize);
51  memcpy(&m_RawData[nOffset], pData, nSize);
52  }
53  return nOffset;
54  };
56  unsigned int AddRawData(const short * pData, int nCount){
57  unsigned int nOffset = GetSize();
58  if(nCount>0)
59  {
60  unsigned int nSize = nCount*sizeof(*pData);
61  m_RawData.resize(nOffset+nSize);
62  memcpy(&m_RawData[nOffset], pData, nSize);
63  }
64  return nOffset;
65  };
67  unsigned int AddRawData(const Vector2 * pData, int nCount){
68  unsigned int nOffset = GetSize();
69  if(nCount>0)
70  {
71  unsigned int nSize = nCount*sizeof(*pData);
72  m_RawData.resize(nOffset+nSize);
73  memcpy(&m_RawData[nOffset], pData, nSize);
74  }
75  return nOffset;
76  };
78  unsigned int AddRawData(const Vector3 * pData, int nCount){
79  unsigned int nOffset = GetSize();
80  if(nCount>0)
81  {
82  unsigned int nSize = nCount*sizeof(*pData);
83  m_RawData.resize(nOffset+nSize);
84  memcpy(&m_RawData[nOffset], pData, nSize);
85  }
86  return nOffset;
87  };
89  unsigned int AddRawData(const Vector4 * pData, int nCount){
90  unsigned int nOffset = GetSize();
91  if(nCount>0)
92  {
93  unsigned int nSize = nCount*sizeof(*pData);
94  m_RawData.resize(nOffset+nSize);
95  memcpy(&m_RawData[nOffset], pData, nSize);
96  }
97  return nOffset;
98  };
100  unsigned int AddRawData(const Matrix4 * pData, int nCount) {
101  unsigned int nOffset = GetSize();
102  if (nCount > 0)
103  {
104  unsigned int nSize = nCount * sizeof(*pData);
105  m_RawData.resize(nOffset + nSize);
106  memcpy(&m_RawData[nOffset], pData, nSize);
107  }
108  return nOffset;
109  };
110 
112  unsigned int AddRawData(const char* pData, int nCount) {
113  unsigned int nOffset = GetSize();
114  if (nCount > 0)
115  {
116  unsigned int nSize = nCount * sizeof(*pData);
117  m_RawData.resize(nOffset + nSize);
118  memcpy(&m_RawData[nOffset], pData, nSize);
119  }
120  return nOffset;
121  };
122  unsigned int AddRawData(const std::string& str) {
123  return AddRawData(str.c_str(), str.size()+1);
124  };
125  };
126 #ifdef USE_DIRECTX_RENDERER
127 
128  struct ParaXParser
129  {
130  CParaFile& m_file;
131  bool m_bIsValid;
132  bool m_bHeaderLoaded;
133 
134  ID3DXFileEnumObject *m_pDXEnum;
135  ParaXHeaderDef m_xheader;
136  LPFileData m_pParaXBody;
137  LPFileData m_pParaXRawData;
138  LPFileData m_pParaXRef;
139  LPFileData m_pD3DMesh;
140  LPFileData m_pD3DRootFrame;
141 
142  // x file template parsing
143  LPD3DXFILE m_pDXFileParser;
144 
145  public:
149  ParaXParser(CParaFile& file, LPD3DXFILE pDXFileParser=NULL );
150  ~ParaXParser(){Finalize();};
151 
152  inline LPD3DXFILE GetFileParser() {return m_pDXFileParser;}
154  void Finalize();
155  };
156 #endif
157 
162  {
163  public:
164  CParaXSerializer(void);
165  ~CParaXSerializer(void);
166 
169 
170  private:
171  CParaRawData m_rawdata;
172  const byte* m_pRaw;
173  public:
177  inline const byte* GetRawData(int nOffset) const { return (m_pRaw!=0)?(m_pRaw+nOffset):NULL; };
184  void* LoadParaXMesh(CParaFile &f);
185 
186  static void ExportParaXMesh(const string& filePath, CParaXModel* pMesh);
187 
188 #ifdef USE_DIRECTX_RENDERER
189 
190  void* LoadParaXMesh(CParaFile &f, ParaXParser& Parser);
191 
201  bool LoadParaX_Header(ParaXParser& Parser);
205  void* LoadParaX_Body(ParaXParser& Parser);
207  void LoadParaX_Finalize(ParaXParser& Parser);
208 
216  bool SaveParaXMesh(const string& filename, const CParaXModel& xmesh, SerializerOptions* pOptions=NULL);
217 
218  private:
224  bool WriteAnimationBlock(AnimationBlock* b, const Animated<Vector3>& anims);
225  bool WriteAnimationBlock(AnimationBlock* b, const AnimatedShort& anims);
226  bool WriteAnimationBlock(AnimationBlock* b, const Animated<float>& anims);
227  bool WriteAnimationBlock(AnimationBlock* b, const Animated<Quaternion>& anims);
228 
233  bool ReadAnimationBlock(const AnimationBlock* b, Animated<Vector3>& anims,int *gs);
234  bool ReadAnimationBlock(const AnimationBlock* b, AnimatedShort& anims,int *gs);
235  bool ReadAnimationBlock(const AnimationBlock* b, Animated<float>& anims,int *gs);
236  bool ReadAnimationBlock(const AnimationBlock* b, Animated<Quaternion>& anims,int *gs);
237 
239  bool WriteParaXHeader(const CParaXModel& xmesh, LPFileSaveObject pFileData);
240  //bool WriteParaXHeader(const CParaXModel& xmesh, LPFileSaveData pFileData);
241 
242  bool WriteXGlobalSequences(const CParaXModel& xmesh, LPFileSaveData pFileData);
243  bool WriteXVertices(const CParaXModel& xmesh, LPFileSaveData pFileData);
244  bool WriteXTextures(const CParaXModel& xmesh, LPFileSaveData pFileData);
245  bool WriteXAttachments(const CParaXModel& xmesh, LPFileSaveData pFileData);
246  bool WriteXColors(const CParaXModel& xmesh, LPFileSaveData pFileData);
247  bool WriteXTransparency(const CParaXModel& xmesh, LPFileSaveData pFileData);
248  bool WriteXViews(const CParaXModel& xmesh, LPFileSaveData pFileData);
249  bool WriteXIndices0(const CParaXModel& xmesh, LPFileSaveData pFileData);
250  bool WriteXGeosets(const CParaXModel& xmesh, LPFileSaveData pFileData);
251  bool WriteXRenderPass(const CParaXModel& xmesh, LPFileSaveData pFileData);
252  bool WriteXBones(const CParaXModel& xmesh, LPFileSaveData pFileData);
253  bool WriteXTexAnims(const CParaXModel& xmesh, LPFileSaveData pFileData);
254  bool WriteXParticleEmitters(const CParaXModel& xmesh, LPFileSaveData pFileData);
255  bool WriteXRibbonEmitters(const CParaXModel& xmesh, LPFileSaveData pFileData);
256  bool WriteXCameras(const CParaXModel& xmesh, LPFileSaveData pFileData);
257  bool WriteXLights(const CParaXModel& xmesh, LPFileSaveData pFileData);
258  bool WriteXAnimations(const CParaXModel& xmesh, LPFileSaveData pFileData);
259 
262  bool WriteXRawBytes(const CParaXModel& xmesh, LPFileSaveObject pFileData);
263 
265  bool ReadParaXHeader(ParaXHeaderDef& xheader, LPFileData pFileData);
267  bool ReadXGlobalSequences(CParaXModel& xmesh, LPFileData pFileData);
268  bool ReadXVertices(CParaXModel& xmesh, LPFileData pFileData);
269  bool ReadXTextures(CParaXModel& xmesh, LPFileData pFileData);
270  bool ReadXAttachments(CParaXModel& xmesh, LPFileData pFileData);
271  bool ReadXColors(CParaXModel& xmesh, LPFileData pFileData);
272  bool ReadXTransparency(CParaXModel& xmesh, LPFileData pFileData);
273  bool ReadXViews(CParaXModel& xmesh, LPFileData pFileData);
274  bool ReadXIndices0(CParaXModel& xmesh, LPFileData pFileData);
275  bool ReadXGeosets(CParaXModel& xmesh, LPFileData pFileData);
276  bool ReadXRenderPass(CParaXModel& xmesh, LPFileData pFileData);
277  bool ReadXBones(CParaXModel& xmesh, LPFileData pFileData);
278  bool ReadXTexAnims(CParaXModel& xmesh, LPFileData pFileData);
279  bool ReadXParticleEmitters(CParaXModel& xmesh, LPFileData pFileData);
280  bool ReadXRibbonEmitters(CParaXModel& xmesh, LPFileData pFileData);
281  bool ReadXCameras(CParaXModel& xmesh, LPFileData pFileData);
282  bool ReadXLights(CParaXModel& xmesh, LPFileData pFileData);
283  bool ReadXAnimations(CParaXModel& xmesh, LPFileData pFileData);
284 #endif
285  };
286 
287 }
bool m_bBinary
binary or text file
Definition: ParaXSerializer.h:15
4-dimensional homogeneous vector.
Definition: ParaVector4.h:10
different physics engine has different winding order.
Definition: EventBinding.h:32
unsigned int GetSize()
current size
Definition: ParaXSerializer.h:38
Standard 3-dimensional vector.
Definition: ParaVector3.h:16
unsigned int AddRawData(const Vector4 *pData, int nCount)
Definition: ParaXSerializer.h:89
Standard 2-dimensional vector.
Definition: ParaVector2.h:16
Serialize options for input and output.
Definition: ParaXSerializer.h:12
Definition: animated.h:23
this class is used for importing and exporting ParaX model from or to memory files.
Definition: ParaXSerializer.h:161
ParaX header definition: this header is shared by all ParaEngine model files.
Definition: modelheaders.h:31
Class encapsulating a standard 4x4 homogeneous matrix.
Definition: ParaMatrix4.h:23
unsigned int AddRawData(const DWORD *pData, int nCount)
Add specified data to raw data.
Definition: ParaXSerializer.h:45
unsigned int AddRawData(const Matrix4 *pData, int nCount)
Definition: ParaXSerializer.h:100
unsigned int AddRawData(const Vector2 *pData, int nCount)
Definition: ParaXSerializer.h:67
static SerializerOptions g_pDefaultOption
default option
Definition: ParaXSerializer.h:168
it presents a real or virtual file in ParaEngine.
Definition: ParaFile.h:31
unsigned int AddRawData(const char *pData, int nCount)
Definition: ParaXSerializer.h:112
const byte * GetRawData(int nOffset) const
get the raw data pointer at the specified offset.
Definition: ParaXSerializer.h:177
unsigned int AddRawData(const Vector3 *pData, int nCount)
Definition: ParaXSerializer.h:78
Definition: ParaXSerializer.h:29
ParaX model is the model file for character animation, etc in the game world.
Definition: ParaXModel.h:30
const byte * GetBuffer()
get the buffer from the beginning
Definition: ParaXSerializer.h:40
unsigned int AddRawData(const short *pData, int nCount)
Definition: ParaXSerializer.h:56
Definition: modelheaders.h:186