Newton Dynamics  4.00
ndSaveLoadSytem.h
1 /* Copyright (c) <2003-2022> <Julio Jerez, Newton Game Dynamics>
2 *
3 * This software is provided 'as-is', without any express or implied
4 * warranty. In no event will the authors be held liable for any damages
5 * arising from the use of this software.
6 *
7 * Permission is granted to anyone to use this software for any purpose,
8 * including commercial applications, and to alter it and redistribute it
9 * freely, subject to the following restrictions:
10 *
11 * 1. The origin of this software must not be misrepresented; you must not
12 * claim that you wrote the original software. If you use this software
13 * in a product, an acknowledgment in the product documentation would be
14 * appreciated but is not required.
15 *
16 * 2. Altered source versions must be plainly marked as such, and must not be
17 * misrepresented as being the original software.
18 *
19 * 3. This notice may not be removed or altered from any source distribution.
20 */
21 
22 #ifndef __ND_SAVE_LOAD_SYSTEM_H__
23 #define __ND_SAVE_LOAD_SYSTEM_H__
24 
25 #include "ndCoreStdafx.h"
26 #include "ndTypes.h"
27 #include "ndTree.h"
28 #include "ndClassAlloc.h"
29 
30 class ndBody;
31 class ndShape;
32 class ndModel;
33 class ndBodyKinematic;
34 class ndShapeInstance;
35 class ndCharacterNode;
36 class ndCharacterNode;
38 
39 class ndShapeLoaderCache : public ndTree<const ndShapeInstance, ndInt32>
40 {
41 };
42 
43 class ndBodyLoaderCache: public ndTree<const ndBody*, ndInt32>
44 {
45 };
46 
47 class ndJointLoaderCache: public ndTree<const ndJointBilateralConstraint*, ndInt32>
48 {
49 };
50 
51 class ndModelLoaderCache: public ndTree<const ndModel*, ndInt32>
52 {
53 };
54 
56 {
57  public:
59  {
60  public:
62  :m_assetPath(nullptr)
63  ,m_rootNode(nullptr)
64  ,m_bodyMap(nullptr)
65  ,m_modelMap(nullptr)
66  ,m_shapeMap(nullptr)
67  ,m_jointMap(nullptr)
68  ,m_parentModelNode(nullptr)
69  {
70  }
71 
73  :m_assetPath(desc.m_assetPath)
74  ,m_rootNode(desc.m_rootNode->FirstChild())
75  ,m_bodyMap(desc.m_bodyMap)
76  ,m_modelMap(desc.m_modelMap)
77  ,m_shapeMap(desc.m_shapeMap)
78  ,m_jointMap(desc.m_jointMap)
79  ,m_parentModelNode(desc.m_parentModelNode)
80  {
81  }
82 
83  const char* m_assetPath;
84  const nd::TiXmlNode* m_rootNode;
85  const ndBodyLoaderCache* m_bodyMap;
86  const ndModelLoaderCache* m_modelMap;
87  const ndShapeLoaderCache* m_shapeMap;
88  const ndJointLoaderCache* m_jointMap;
89  const ndCharacterNode* m_parentModelNode;
90  };
91 
93  {
94  public:
96  :m_assetPath(nullptr)
97  ,m_assetName(nullptr)
98  ,m_rootNode(nullptr)
99  ,m_nodeNodeHash(0)
100  ,m_shapeNodeHash(0)
101  ,m_body0NodeHash(0)
102  ,m_body1NodeHash(0)
103  ,m_assetIndex(0)
104  ,m_shapeMap(nullptr)
105  ,m_bodyMap(nullptr)
106  ,m_jointMap(nullptr)
107  {
108  }
109 
110  ndSaveDescriptor(const ndSaveDescriptor& desc, nd::TiXmlNode* const rootNode)
111  :m_assetPath(desc.m_assetPath)
112  ,m_assetName(desc.m_assetName)
113  ,m_rootNode(rootNode)
114  ,m_nodeNodeHash(desc.m_nodeNodeHash)
115  ,m_shapeNodeHash(desc.m_shapeNodeHash)
116  ,m_body0NodeHash(desc.m_body0NodeHash)
117  ,m_body1NodeHash(desc.m_body1NodeHash)
118  ,m_assetIndex(desc.m_assetIndex)
119  ,m_shapeMap(desc.m_shapeMap)
120  ,m_bodyMap(desc.m_bodyMap)
121  ,m_jointMap(desc.m_jointMap)
122  {
123  }
124 
125  const char* m_assetPath;
126  const char* m_assetName;
127  nd::TiXmlNode* m_rootNode;
128  ndInt32 m_nodeNodeHash;
129  ndInt32 m_shapeNodeHash;
130  ndInt32 m_body0NodeHash;
131  ndInt32 m_body1NodeHash;
132  mutable ndInt32 m_assetIndex;
136  };
137 
138  virtual ~ndLoadSaveBase()
139  {
140  }
141 
142  virtual void* CreateClass(const ndLoadDescriptor&)
143  {
144  ndAssert(0);
145  return nullptr;
146  }
147 };
148 
149 D_CORE_API void* LoadClass(const char* const className, const ndLoadSaveBase::ndLoadDescriptor& desc);
150 D_CORE_API void RegisterLoaderClass(const char* const className, ndLoadSaveBase* const loaderClass);
151 
152 template<class T>
154 {
155  public:
156  ndLoadSaveClass<T>(const char* const className)
157  {
158  RegisterLoaderClass(className, this);
159  }
160 
161  virtual void* CreateClass(const ndLoadDescriptor& desc)
162  {
163  return new T(desc);
164  }
165 };
166 
167 #define D_CLASS_REFLECTION(Class) \
168  const virtual char* SubClassName() {return #Class;} \
169  static const char* ClassName() {return #Class;} \
170  static ndLoadSaveClass<Class> __classLoader__;
171 
172 #define D_CLASS_REFLECTION_IMPLEMENT_LOADER(Class) \
173  ndLoadSaveClass<Class> Class::__classLoader__(#Class);
174 
175 #define D_CLASS_REFLECTION_LOAD_NODE(castType,className,desc) \
176  (castType*)LoadClass(className, desc);
177 
178 #endif
179 
ndClassAlloc
Base class for providing memory allocation for all other engine classes.
Definition: ndClassAlloc.h:30
ndLoadSaveBase
Definition: ndSaveLoadSytem.h:56
ndBodyLoaderCache
Definition: ndSaveLoadSytem.h:44
ndShapeLoaderCache
Definition: ndSaveLoadSytem.h:40
nd::TiXmlNode
The parent class for everything in the Document Object Model.
Definition: tinyxml.h:437
ndModel
Definition: ndModel.h:33
ndJointLoaderCache
Definition: ndSaveLoadSytem.h:48
ndBody
Definition: ndBody.h:43
ndCharacterNode
Definition: ndCharacterNode.h:95
ndTree
Definition: ndTree.h:82
ndShape
Definition: ndShape.h:209
ndJointBilateralConstraint
Definition: ndJointBilateralConstraint.h:53
ndLoadSaveClass
Definition: ndSaveLoadSytem.h:154
ndBodyKinematic
Definition: ndBodyKinematic.h:40
ndModelLoaderCache
Definition: ndSaveLoadSytem.h:52
nd::TiXmlNode::FirstChild
const TiXmlNode * FirstChild() const
The first child of this node. Will be null if there are no children.
Definition: tinyxml.h:535
ndShapeInstance
Definition: ndShapeInstance.h:62
ndLoadSaveBase::ndLoadDescriptor
Definition: ndSaveLoadSytem.h:59
ndLoadSaveBase::ndSaveDescriptor
Definition: ndSaveLoadSytem.h:93