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

其他游戏

开发平台:

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_BASE_CLASS_MEMBER_ACCESSOR_H
  9. #define HK_BASE_CLASS_MEMBER_ACCESSOR_H
  10. class hkClass;
  11. class hkClassMember;
  12. class hkClassAccessor;
  13. /// Access a data block generically through its hkClass.
  14. /// This class is used by the versioning code which needs
  15. /// to access class members from old versions without
  16. /// seeing the compile-time class definition.
  17. class hkClassMemberAccessor
  18. {
  19. public:
  20. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_HKCLASS, hkClassMemberAccessor );
  21. ///
  22. typedef void* Pointer;
  23. ///
  24. typedef char* Cstring;
  25. ///
  26. struct SimpleArray
  27. {
  28. void* data;
  29. int size;
  30. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_BASE_CLASS, hkClassMemberAccessor::SimpleArray );
  31. };
  32.         struct HomogeneousArray
  33.         {
  34.             hkClass* klass;
  35.             void* data;
  36.             int size;
  37. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_BASE_CLASS, hkClassMemberAccessor::HomogeneousArray );
  38.         };
  39. /// Access the given member. Always succeeds.
  40. hkClassMemberAccessor( void* object, const hkClassMember* member );
  41. /// Access the named member. Check for success with isOk().
  42. hkClassMemberAccessor(const hkVariant& v, const char* memberName);
  43. /// Access the named member. Check for success with isOk().
  44. hkClassMemberAccessor(void* object, const hkClass& klass, const char* memberName);
  45. /// Return false if not connected to a member.
  46. hkBool isOk() const;
  47. /// Get the member that the accessor references. Check isOk() before calling.
  48. const hkClassMember& getClassMember() const;
  49. /// Return the raw memory location of this member.
  50. void* asRaw() const; //XXX rename to getAddress
  51. void* getAddress() const;
  52. /// Access this member as a pointer.
  53. Pointer& asPointer(int index=0) const;
  54. /// Access this member as a c-style string.
  55. Cstring& asCstring(int index=0) const;
  56. /// Access this member as an hkBool.
  57. hkBool& asBool(int index=0) const;
  58. /// Access this member as an hkReal.
  59. hkReal& asReal(int index=0) const;
  60. /// Access this member as a 32 bit integer.
  61. hkInt32& asInt32(int index=0) const;
  62. /// Access this member as an unsigned 32 bit integer.
  63. hkUint32& asUint32(int index=0) const;
  64. /// Access this member as a 64 bit integer.
  65. hkInt64& asInt64(int index=0) const;
  66. /// Access this member as an unsigned 64 bit integer.
  67. hkUint64& asUint64(int index=0) const;
  68. /// Access this member as a hkUlong (sizeof(void*))
  69. hkUlong& asUlong(int index=0) const;
  70. /// Access this member as a 16 bit integer.
  71. hkInt16& asInt16(int index=0) const;
  72. /// Access this member as a 16 bit unsigned integer.
  73. hkUint16& asUint16(int index=0) const;
  74. /// Access this member as an 8 bit integer.
  75. hkInt8& asInt8(int index=0) const;
  76. /// Access this member as a 8 bit unsigned integer.
  77. hkUint8& asUint8(int index=0) const;
  78. /// Access this member as a void*, int pair.
  79. SimpleArray& asSimpleArray(int index=0) const;
  80.             /// Access this member as a homogeneous array
  81.         HomogeneousArray& asHomogeneousArray(int index=0) const;
  82. /// Access this member as a hkVariant.
  83. hkVariant& asVariant(int index=0) const;
  84. struct Vector4
  85. {
  86. void setCross( const Vector4& v1, const Vector4& v2)
  87. {
  88. r[0] = v1.r[1]*v2.r[2] - v1.r[2]*v2.r[1];
  89. r[1] = v1.r[2]*v2.r[0] - v1.r[0]*v2.r[2];
  90. r[2] = v1.r[0]*v2.r[1] - v1.r[1]*v2.r[0];
  91. r[3] = 0;
  92. }
  93. hkReal r[4];
  94. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_BASE_CLASS, hkClassMemberAccessor::Vector4 );
  95. };
  96. /// Access this member as a hkVector4.
  97. Vector4& asVector4(int index=0) const;
  98. struct Matrix3
  99. {
  100. Vector4 v[3];
  101. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_BASE_CLASS, hkClassMemberAccessor::Matrix3 );
  102. };
  103. /// Access this member as a hkMatrix3.
  104. Matrix3& asMatrix3(int index=0) const;
  105. struct Transform
  106. {
  107. Vector4 r[3];
  108. Vector4 t;
  109. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_BASE_CLASS, hkClassMemberAccessor::Transform );
  110. };
  111. /// Access this member as a hkMatrix3.
  112. Transform& asTransform(int index=0) const;
  113. typedef Matrix3 Rotation;
  114. /// Access this member as a hkRotation.
  115. Rotation& asRotation(int index=0) const;
  116. /// Access the member of a nested class by name.
  117. hkClassMemberAccessor member(const char* name) const;
  118. /// Access a nested class.
  119. hkClassAccessor object() const;
  120. hkClassMemberAccessor(){;}
  121. private:
  122. void connect( void* object, const hkClassMember* member );
  123. void connect( void* object, const hkClass& klass, const char* memberName );
  124. private:
  125. // the address of the member
  126. void* m_address;
  127. // the corresponding class member
  128. const hkClassMember* m_member;
  129. };
  130. /// Access a data block generically through its hkClass.
  131. /// This class is used by the versioning code which needs
  132. /// to access class members from old versions without
  133. /// seeing the compile-time class definition.
  134. class hkClassAccessor
  135. {
  136. public:
  137. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_BASE_CLASS, hkClassAccessor );
  138. /// Create a class accessor.
  139. hkClassAccessor(void* object, const hkClass* klass);
  140. /// Create a class accessor.
  141. hkClassAccessor(hkVariant& v);
  142. /// Access a member by name.
  143. inline hkClassMemberAccessor member(const char* memberName) const;
  144. /// Access a member explicitly.
  145. inline hkClassMemberAccessor member(const hkClassMember* mem) const;
  146. /// Get the class of this object.
  147. inline const hkClass& getClass() const;
  148. /// Get the address of this object.
  149. inline void* getAddress() const;
  150. private:
  151. hkVariant m_variant;
  152. };
  153. hkClassMemberAccessor hkClassAccessor::member(const char* memberName) const
  154. {
  155. return hkClassMemberAccessor(m_variant, memberName);
  156. }
  157. hkClassMemberAccessor hkClassAccessor::member(const hkClassMember* mem) const
  158. {
  159. return hkClassMemberAccessor(m_variant.m_object, mem);
  160. }
  161. const hkClass& hkClassAccessor::getClass() const
  162. {
  163. return *m_variant.m_class;
  164. }
  165. void* hkClassAccessor::getAddress() const
  166. {
  167. return m_variant.m_object;
  168. }
  169. #endif // HK_BASE_CLASS_MEMBER_ACCESSOR_H
  170. /*
  171. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  172. * Confidential Information of Havok.  (C) Copyright 1999-2009
  173. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  174. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  175. * rights, and intellectual property rights in the Havok software remain in
  176. * Havok and/or its suppliers.
  177. * Use of this software for evaluation purposes is subject to and indicates
  178. * acceptance of the End User licence Agreement for this product. A copy of
  179. * the license is included with this software and is also available at www.havok.com/tryhavok.
  180. */