hkDataObject.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:19k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef HK_DATA_OBJECT_H
  9. #define HK_DATA_OBJECT_H
  10. #include <Common/Base/Container/StringMap/hkStorageStringMap.h>
  11. class hkDataObject;
  12. class hkDataArray;
  13. class hkDataClass;
  14. class hkDataWorld;
  15. class hkDataObjectImpl;
  16. class hkDataArrayImpl;
  17. class hkDataClassImpl;
  18. /// The hkDataObject class is a public accessor to reflected data
  19. /// managed by the private hkDataObjectImpl class.
  20. /// It may only contain data defined by hkDataClass.
  21. /// The class implements the Python-alike object data access.
  22. class hkDataObject
  23. {
  24. public:
  25. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SERIALIZE, hkDataObject);
  26. /// Constructor - instantiates a temporary public wrapper
  27. /// using the private hkDataObjectImpl.
  28. hkDataObject( hkDataObjectImpl* impl );
  29. /// Constructor - instantiates a temporary public wrapper
  30. /// using the hkDataObjectImpl shared by the given 'o'.
  31. hkDataObject( const hkDataObject& o );
  32. /// Assign a temporary wrapper using the hkDataObjectImpl shared by the given 'o'.
  33. void operator=( const hkDataObject& o );
  34. /// Return true if hkDataObjects are the same.
  35. bool operator==( const hkDataObject& o );
  36. /// Return true if hkDataObjects are different.
  37. bool operator!=( const hkDataObject& o );
  38. /// Destructor.
  39. ~hkDataObject();
  40. /// This struct defines the unique hkDataObject.
  41. struct Handle
  42. void* p0;
  43. void* p1;
  44. };
  45. /// hkDataObject data types.
  46. enum Type
  47. {
  48. /// Not reflected.
  49. TYPE_VOID = 0,
  50. /// Byte, signed or unsigned 8-bit integer.
  51. TYPE_BYTE,
  52. /// Signed or unsigned 16/32/64-bit integer. 
  53. TYPE_INT,
  54. /// 32-bit float.
  55. TYPE_REAL,
  56. /// Fixed array of 4 TYPE_REAL (e.g. hkVector, hkQuaternion).
  57. TYPE_VEC_4,
  58. /// Fixed array of 8 TYPE_REAL.
  59. TYPE_VEC_8,
  60. /// Fixed array of 12 TYPE_REAL (e.g. hkMatrix3, hkQsTransform, hkRotation).
  61. TYPE_VEC_12,
  62. /// Fixed array of 16 TYPE_REAL (e.g. hkTransform, hkMatrix4).
  63. TYPE_VEC_16,
  64. /// hkDataObject.
  65. TYPE_OBJECT,
  66. /// hkDataObject (embedded struct data).
  67. TYPE_STRUCT,
  68. /// C-style string.
  69. TYPE_CSTRING,
  70. /// The number of basic hkDataObject types.
  71. TYPE_NUM_BASIC_TYPES,
  72. /// Mask for the basic hkDataObject types.
  73. TYPE_MASK_BASIC_TYPES = 0xf,
  74. /// Bit indicating an array of the basic type data.
  75. TYPE_ARRAY = 0x10, // per object size array
  76. /// Array of TYPE_BYTE.
  77. TYPE_ARRAY_BYTE = TYPE_ARRAY | TYPE_BYTE,
  78. /// Array of TYPE_INT.
  79. TYPE_ARRAY_INT = TYPE_ARRAY | TYPE_INT,
  80. /// Array of TYPE_REAL.
  81. TYPE_ARRAY_REAL = TYPE_ARRAY | TYPE_REAL,
  82. /// Array of TYPE_VEC_4.
  83. TYPE_ARRAY_VEC_4 = TYPE_ARRAY | TYPE_VEC_4,
  84. /// Array of TYPE_VEC_8.
  85. TYPE_ARRAY_VEC_8 = TYPE_ARRAY | TYPE_VEC_8,
  86. /// Array of TYPE_VEC_12.
  87. TYPE_ARRAY_VEC_12 = TYPE_ARRAY | TYPE_VEC_12,
  88. /// Array of TYPE_VEC_16.
  89. TYPE_ARRAY_VEC_16 = TYPE_ARRAY | TYPE_VEC_16,
  90. /// Array of TYPE_OBJECT.
  91. TYPE_ARRAY_OBJECT = TYPE_ARRAY | TYPE_OBJECT,
  92. /// Array of TYPE_STRUCT.
  93. TYPE_ARRAY_STRUCT = TYPE_ARRAY | TYPE_STRUCT,
  94. /// Array of TYPE_CSTRING.
  95. TYPE_ARRAY_CSTRING = TYPE_ARRAY | TYPE_CSTRING,
  96. /// Bit indicating a tuple of the basic type data.
  97. TYPE_TUPLE = 0x20, // fixed size array, size is per class
  98. /// Tuple of TYPE_BYTE.
  99. TYPE_TUPLE_BYTE = TYPE_TUPLE | TYPE_BYTE,
  100. /// Tuple of TYPE_INT.
  101. TYPE_TUPLE_INT = TYPE_TUPLE | TYPE_INT,
  102. /// Tuple of TYPE_REAL.
  103. TYPE_TUPLE_REAL = TYPE_TUPLE | TYPE_REAL,
  104. /// Tuple of TYPE_VEC_4.
  105. TYPE_TUPLE_VEC_4 = TYPE_TUPLE | TYPE_VEC_4,
  106. /// Tuple of TYPE_VEC_8.
  107. TYPE_TUPLE_VEC_8 = TYPE_TUPLE | TYPE_VEC_8,
  108. /// Tuple of TYPE_VEC_12.
  109. TYPE_TUPLE_VEC_12 = TYPE_TUPLE | TYPE_VEC_12,
  110. /// Tuple of TYPE_VEC_16.
  111. TYPE_TUPLE_VEC_16 = TYPE_TUPLE | TYPE_VEC_16,
  112. /// Tuple of TYPE_OBJECT.
  113. TYPE_TUPLE_OBJECT = TYPE_TUPLE | TYPE_OBJECT,
  114. /// Tuple of TYPE_STRUCT.
  115. TYPE_TUPLE_STRUCT = TYPE_TUPLE | TYPE_STRUCT,
  116. /// Tuple of TYPE_CSTRING.
  117. TYPE_TUPLE_CSTRING = TYPE_TUPLE | TYPE_CSTRING,
  118. };
  119. /// Return the number of 32-bit floats from one of the fixed array types.
  120. static inline int getNumRealsFromType(hkDataObject::Type mtype);
  121. /// This class wraps and handles data values stored in hkDataObject.
  122. class Value
  123. {
  124. public:
  125. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SERIALIZE, Value);
  126. /// Assign 'l' to value.
  127. void operator=(const Value& l);
  128. /// Assign 32-bit integer to value.
  129. void operator=(int i);
  130. /// Assign 64-bit integer to value.
  131.   void operator=(hkInt64 i);
  132. /// Assign 32-bit float to value.
  133.   void operator=(hkReal r);
  134. /// Assign c-style string to value.
  135. void operator=(const char* s);
  136. /// Assign array or tuple to value.
  137. void operator=(const hkDataArray& l);
  138. /// Assign object to value.
  139.   void operator=(const hkDataObject& o);
  140. /// Get value as 32-bit integer.
  141. int asInt() const;
  142. /// Get value as 64-bit integer.
  143. hkInt64 asInt64() const;
  144. /// Get value as 32-bit float.
  145. hkReal asReal() const;
  146. /// Get value as c-style string.
  147. const char* asString() const;
  148. /// Get value as array or tuple.
  149. hkDataArray asArray() const;
  150. /// Get value as object.
  151. hkDataObject asObject() const;
  152. /// Get value as array of floats, e.g. hkVector4, hkMatrix4.
  153. /// 'n' indicates the number of floats you expect to get, e.g. 4, 8, 12 or 16.
  154. const hkReal* asVec(int n) const;
  155. /// Get value type.
  156. Type getType() const;
  157. // Used internally.
  158. void setVec(const hkReal* r, int n);
  159. # define HK_VALUE_ACCESS2(HKTYPE,TYPE) 
  160. void operator=(const HKTYPE& v) 
  161. { this->setVec(reinterpret_cast<const hkReal*>(&v), sizeof(HKTYPE)/sizeof(hkReal)); } 
  162. const HKTYPE& as##TYPE() const 
  163. { return *reinterpret_cast<const HKTYPE*>(asVec(sizeof(HKTYPE)/sizeof(hkReal))); }
  164. # define HK_VALUE_ACCESS(TYPE) HK_VALUE_ACCESS2(hk##TYPE,TYPE)
  165. HK_VALUE_ACCESS(Vector4)
  166. HK_VALUE_ACCESS(Quaternion)
  167. HK_VALUE_ACCESS(Matrix3)
  168. HK_VALUE_ACCESS(Rotation)
  169. HK_VALUE_ACCESS(QsTransform)
  170. HK_VALUE_ACCESS(Matrix4)
  171. HK_VALUE_ACCESS(Transform)
  172. #undef HK_VALUE_ACCESS2
  173. #undef HK_VALUE_ACCESS
  174. friend class hkDataObjectImpl;
  175. Value(hkDataObjectImpl* impl, const char* name) : m_impl(impl), m_name(name) { }
  176. hkDataObjectImpl* m_impl;
  177. const char* m_name;
  178. };
  179. /// Get value of class member named 'name'.
  180. Value operator[](const char* name);
  181. /// Get const value of class member named 'name'.
  182. const Value operator[](const char* name) const;
  183. /// Get object's handle.
  184. Handle getHandle() const;
  185. /// Get object's implementation.
  186. hkDataObjectImpl* getImplementation() { return m_impl; }
  187. /// Get object's const implementation.
  188. const hkDataObjectImpl* getImplementation() const { return m_impl; }
  189. /// Get object's class.
  190. const hkDataClass getClass() const;
  191. /// Is the object null.
  192. hkBool32 isNull() const;
  193. typedef int Iterator;
  194. /// Get class member iterator.
  195. Iterator getMemberIterator() const;
  196. /// Is the iterator valid.
  197. hkBool32 isValid(Iterator i) const;
  198. /// Get next iterator.
  199. Iterator getNextMember(Iterator i) const;
  200. /// Get member value by iterator.
  201. const Value getMemberValue(Iterator i) const;
  202. /// Get member name by iterator.
  203. const char* getMemberName(Iterator i) const;
  204. /// Return true if object stores value of class member named 'name'.
  205. hkBool32 hasMember(const char* name) const;
  206. private:
  207. hkDataObjectImpl* m_impl;
  208. };
  209. /// The hkDataArray is a public accessor to a reflected array of data.
  210. class hkDataArray
  211. {
  212. public:
  213. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SERIALIZE, hkDataArray);
  214. typedef hkDataObject::Type Type;
  215. /// This class wraps and handles data value of hkDataArray items.
  216. class Value
  217. {
  218. public:
  219. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SERIALIZE, Value);
  220. /// Assign object value 'l' to value.
  221. void operator=(const hkDataObject::Value& l);
  222. /// Assign array value 'l' to value.
  223. void operator=(const Value& l);
  224. /// Assign 32-bit integer to value.
  225. void operator=(int i);
  226. /// Assign 64-bit integer to value.
  227.   void operator=(hkInt64 i);
  228. /// Assign 32-bit float to value.
  229.   void operator=(hkReal r);
  230. /// Assign array or a tuple to value.
  231.    void operator=(const hkDataArray& l);
  232. /// Assign object to value.
  233.   void operator=(const hkDataObject& o);
  234. /// Assign c-style string to value.
  235. void operator=(const char* s);
  236. /// Get value as 32-bit integer.
  237. int asInt() const;
  238. /// Get value as 32-bit float.
  239. hkReal asReal() const;
  240. /// Get value as object.
  241. hkDataObject asObject() const;
  242. /// Get value as array or tuple.
  243. hkDataArray asArray() const;
  244. /// Get value as c-style string.
  245. const char* asString() const;
  246. /// Get value as array of floats, e.g. hkVector4, hkMatrix4.
  247. /// 'n' indicates the number of floats you expect to get, e.g. 4, 8, 12 or 16.
  248. const hkReal* asVec(int n) const;
  249. /// Clear the value.
  250. void clear();
  251. /// Get the value type.
  252. Type getType() const;
  253. // Used internally.
  254. void setVec(const hkReal* r, int nreal);
  255. # define HK_VALUE_ACCESS2(HKTYPE,TYPE) 
  256. void operator=(const HKTYPE& v) 
  257. { this->setVec(reinterpret_cast<const hkReal*>(&v), sizeof(HKTYPE)/sizeof(hkReal)); } 
  258. const HKTYPE& as##TYPE() const 
  259. { return *reinterpret_cast<const HKTYPE*>(asVec(sizeof(HKTYPE)/sizeof(hkReal))); }
  260. # define HK_VALUE_ACCESS(TYPE) HK_VALUE_ACCESS2(hk##TYPE,TYPE)
  261. HK_VALUE_ACCESS(Vector4)
  262. HK_VALUE_ACCESS(Quaternion)
  263. HK_VALUE_ACCESS(Matrix3)
  264. HK_VALUE_ACCESS(Rotation)
  265. HK_VALUE_ACCESS(QsTransform)
  266. HK_VALUE_ACCESS(Matrix4)
  267. HK_VALUE_ACCESS(Transform)
  268. #undef HK_VALUE_ACCESS2
  269. #undef HK_VALUE_ACCESS
  270. private:
  271. friend class hkDataArray;
  272. Value(hkDataArrayImpl* impl, int idx) : m_impl(impl), m_index(idx) {}
  273. hkDataArrayImpl* m_impl;
  274. int m_index;
  275. };
  276. /// Constructor - instantiates a temporary public wrapper
  277. /// using the private hkDataArrayImpl.
  278. explicit hkDataArray( hkDataArrayImpl* i );
  279. /// Constructor - instantiates a temporary public wrapper
  280. /// using the hkDataArrayImpl shared by the given 'a'.
  281. hkDataArray(const hkDataArray& a);
  282. /// Assign a temporary wrapper using the hkDataArrayImpl shared by the given 'a'.
  283. void operator=(const hkDataArray& a);
  284. /// Destructor.
  285. ~hkDataArray();
  286. /// Clear array. Size set to 0.
  287. void clear();
  288. /// Get array size.
  289. int getSize() const;
  290. /// Reserve array capacity.
  291. void reserve(int n);
  292. /// Set array size.
  293.   void setSize(int n);
  294. /// Get value of i'th array item.
  295.    Value operator[](int i);
  296. /// Get const value of i'th array item.
  297.    const Value operator[](int i) const;
  298. /// Get array item type.
  299. hkDataObject::Type getType() const;
  300. /// Get array item class.
  301. hkDataClass getClass() const;
  302. /// Get data slice of class member named 'name' from object items in array.
  303. hkDataArray swizzleObjectMember(const char* name) const;
  304. /// Set array size to 'n' and initialize the array items with values from 'a'.
  305. void setAll(const hkBool* a, int n);
  306. /// Set array size to 'n' and initialize the array items with values from 'a'.
  307. void setAll(const char* a, int n);
  308. /// Set array size to 'n' and initialize the array items with values from 'a'.
  309. void setAll(const hkInt8* a, int n);
  310. /// Set array size to 'n' and initialize the array items with values from 'a'.
  311. void setAll(const hkUint8* a, int n);
  312. /// Set array size to 'n' and initialize the array items with values from 'a'.
  313. void setAll(const hkInt16* a, int n);
  314. /// Set array size to 'n' and initialize the array items with values from 'a'.
  315. void setAll(const hkUint16* a, int n);
  316. /// Set array size to 'n' and initialize the array items with values from 'a'.
  317. void setAll(const hkInt32* a, int n);
  318. /// Set array size to 'n' and initialize the array items with values from 'a'.
  319. void setAll(const hkUint32* a, int n);
  320. /// Set array size to 'n' and initialize the array items with values from 'a'.
  321. void setAll(const hkInt64* a, int n);
  322. /// Set array size to 'n' and initialize the array items with values from 'a'.
  323. void setAll(const hkUint64* a, int n);
  324. /// Set array size to 'n' and initialize the array items with values from 'a'.
  325. void setAll(const hkReal* a, int n);
  326. //getAll?
  327. /// Get array's implementation.
  328. hkDataArrayImpl* getImplementation() { return m_impl; }
  329. /// Get array's const implementation.
  330. const hkDataArrayImpl* getImplementation() const { return m_impl; }
  331. private:
  332. hkDataArrayImpl* m_impl;
  333. };
  334. /// This class defines reflection information for any reflected type.
  335. /// Unlike hkClass it defines reflection for class data members only.
  336. class hkDataClass
  337. {
  338. public:
  339. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SERIALIZE, hkDataClass);
  340. /// This structure is used to describe a member of hkDataClass.
  341. struct MemberInfo;
  342. /// Constructor - instantiates a temporary public wrapper
  343. /// using the private hkDataClassImpl.
  344. hkDataClass( hkDataClassImpl* impl );
  345. /// Destructor.
  346. ~hkDataClass();
  347. /// Is the class null.
  348. hkBool32 isNull() const;
  349. /// Get class name.
  350. const char* getName() const;
  351. /// Get class version.
  352. int getVersion() const;
  353. /// Get class parent.
  354. hkDataClass getParent() const;
  355. /// Get the world the class belongs to.
  356. const hkDataWorld* getWorld() const;
  357. /// Is this a parent class of class k.
  358. hkBool isSuperClass(const hkDataClass& k) const;
  359. /// Get the number of members declared in this class (not including parent class members).
  360. int getNumDeclaredMembers() const;
  361. /// Get the i'th member declared in this class (not including parent class members).
  362. void getDeclaredMemberInfo(int i, MemberInfo& info) const;
  363. /// Get the index of declared member named 'name' or -1 if not found.
  364. int getDeclaredMemberIndexByName(const char* name) const;
  365. /// Get all declared members (not including parent class members).
  366. void getAllDeclaredMemberInfo( hkArray<MemberInfo>& minfo ) const;
  367. /// Get the number of members in this class (including parent class members).
  368. int getNumMembers() const;
  369. /// Get the i'th member (including parent class members).
  370. void getMemberInfo(int i, MemberInfo& info) const;
  371. /// Get the index of member named 'name' or -1 if not found.
  372. int getMemberIndexByName(const char* name) const;
  373. /// Get all members (including parent class members).
  374. void getAllMemberInfo( hkArray<MemberInfo>& minfo ) const;
  375. /// Get the const private implementation of the class.
  376. const hkDataClassImpl* getImplementation() const { return m_impl; }
  377. /// Get the private implementation of the class.
  378. hkDataClassImpl* getImplementation() { return m_impl; }
  379. private:
  380. hkDataClassImpl* m_impl;
  381. };
  382. struct hkDataClass::MemberInfo
  383. {
  384. MemberInfo() : m_name(HK_NULL), m_owner(HK_NULL), m_type(hkDataObject::TYPE_VOID), m_class(HK_NULL), m_tupleCount(0) {}
  385. const char* m_name;
  386. const hkDataClassImpl* m_owner;
  387. hkDataObject::Type m_type;
  388. const hkDataClassImpl* m_class;
  389. int m_tupleCount;
  390. };
  391. /// This is an abstract class which defines interfaces to implement a container,
  392. /// and to store and manage reflected data defined by hkDataClass and represented
  393. /// by hkDataObject and hkDataArray.
  394. class hkDataWorld : public hkReferencedObject
  395. {
  396. public:
  397. /// This structure contains all the information needed to construct a hkDataClass
  398. /// object.
  399. struct ClassCinfo
  400. {
  401. /// This structure contains all the information needed to construct
  402. /// a member of hkDataClass.
  403. struct Member
  404. {
  405. const char* name;
  406. hkDataObject::Type type;
  407. int tupleCount;
  408. const char* className;
  409. };
  410. const char* name;
  411. int version;
  412. hkDataClassImpl* parent;
  413. hkArray<Member> members;
  414. };
  415. /// Create a new class from the cinfo.
  416. virtual hkDataClassImpl* newClass(const ClassCinfo& cinfo) = 0;
  417. /// Create a new object of the given type in the world.
  418. /// The 'klass' must belong to the world when instantiating hkDataObject.
  419. virtual hkDataObjectImpl* newObject(const hkDataClass& klass) const = 0;
  420. /// Create a new array as a member of obj.
  421. /// The 'obj' must belong to the world when instantiating hkDataArray.
  422. virtual hkDataArrayImpl* newArray(hkDataObject& obj, const hkDataClass::MemberInfo& minfo) const = 0;
  423. /// hkDataWorld supported types.
  424. enum DataWorldType
  425. {
  426. /// Native type. hkDataWorld contains wrapped native
  427. /// object and hkClass pointers that are represented
  428. /// by hkDataObject and hkDataClass respectively.
  429. /// See hkDataWorldNative for details.
  430. TYPE_NATIVE,
  431. /// Dictionary type. hkDataWorld contains instances of
  432. /// hkDataObject described by hkDataClass.
  433. /// See hkDataWorldDict for details.
  434. TYPE_DICTIONARY
  435. };
  436. /// Get world type.
  437. virtual hkEnum<DataWorldType, hkInt32> getType() const = 0;
  438. /// Get top level object from the world.
  439. /// By default, the first created hkDataObject is the top level object.
  440. virtual hkDataObject getContents() const = 0;
  441. /// Find all the registered classes in the world.
  442. virtual void findAllClasses(hkArray<hkDataClassImpl*>& classesOut) const = 0;
  443. /// Find the registered hkDataClass in the world by name.
  444. virtual hkDataClassImpl* findClass(const char* name) const = 0;
  445. };
  446. inline int hkDataObject::getNumRealsFromType(hkDataObject::Type mtype)
  447. {
  448. HK_ASSERT(0x47254701, mtype >= hkDataObject::TYPE_VEC_4 && mtype <= hkDataObject::TYPE_VEC_16);
  449. return (1 + mtype - hkDataObject::TYPE_VEC_4) * 4;
  450. }
  451. #endif // HK_DATA_OBJECT_H
  452. /*
  453. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  454. * Confidential Information of Havok.  (C) Copyright 1999-2009
  455. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  456. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  457. * rights, and intellectual property rights in the Havok software remain in
  458. * Havok and/or its suppliers.
  459. * Use of this software for evaluation purposes is subject to and indicates
  460. * acceptance of the End User licence Agreement for this product. A copy of
  461. * the license is included with this software and is also available at www.havok.com/tryhavok.
  462. */