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

其他游戏

开发平台:

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. /*
  9. // Default empty
  10. template<typename VALUE_T>
  11. struct hkTypedUnion_value_traits;
  12. // supported types
  13. template<>
  14. struct hkTypedUnion_value_traits<hkBool>
  15. {
  16. static inline hkClassMember::Type type() { return hkClassMember::TYPE_BOOL; }
  17. };
  18. template<>
  19. struct hkTypedUnion_value_traits<bool> : public hkTypedUnion_value_traits<hkBool> { };
  20. template<>
  21. struct hkTypedUnion_value_traits<char>
  22. {
  23. static inline hkClassMember::Type type() { return hkClassMember::TYPE_CHAR; }
  24. };
  25. template<>
  26. struct hkTypedUnion_value_traits<hkInt8>
  27. {
  28. static inline hkClassMember::Type type() { return hkClassMember::TYPE_INT8; }
  29. };
  30. template<>
  31. struct hkTypedUnion_value_traits<hkUint8>
  32. {
  33. static inline hkClassMember::Type type() { return hkClassMember::TYPE_UINT8; }
  34. };
  35. template<>
  36. struct hkTypedUnion_value_traits<hkInt16>
  37. {
  38. static inline hkClassMember::Type type() { return hkClassMember::TYPE_INT16; }
  39. };
  40. template<>
  41. struct hkTypedUnion_value_traits<hkUint16>
  42. {
  43. static inline hkClassMember::Type type() { return hkClassMember::TYPE_UINT16; }
  44. };
  45. template<>
  46. struct hkTypedUnion_value_traits<hkInt32>
  47. {
  48. static inline hkClassMember::Type type() { return hkClassMember::TYPE_INT32; }
  49. };
  50. template<>
  51. struct hkTypedUnion_value_traits<hkUint32>
  52. {
  53. static inline hkClassMember::Type type() { return hkClassMember::TYPE_UINT32; }
  54. };
  55. template<>
  56. struct hkTypedUnion_value_traits<hkInt64>
  57. {
  58. static inline hkClassMember::Type type() { return hkClassMember::TYPE_INT64; }
  59. };
  60. template<>
  61. struct hkTypedUnion_value_traits<hkUint64>
  62. {
  63. static inline hkClassMember::Type type() { return hkClassMember::TYPE_UINT64; }
  64. };
  65. template<>
  66. struct hkTypedUnion_value_traits<float>
  67. {
  68. static inline hkClassMember::Type type() { return hkClassMember::TYPE_REAL; }
  69. };
  70. template<>
  71. struct hkTypedUnion_value_traits<hkVector4>
  72. {
  73. static inline hkClassMember::Type type() { return hkClassMember::TYPE_VECTOR4; }
  74. };
  75. template<>
  76. struct hkTypedUnion_value_traits<hkQuaternion>
  77. {
  78. static inline hkClassMember::Type type() { return hkClassMember::TYPE_QUATERNION; }
  79. };
  80. template<>
  81. struct hkTypedUnion_value_traits<hkVariant>
  82. {
  83. static inline hkClassMember::Type type() { return hkClassMember::TYPE_POINTER; }
  84. };
  85. template<>
  86. struct hkTypedUnion_value_traits<char*>
  87. {
  88. static inline hkClassMember::Type type() { return hkClassMember::TYPE_CSTRING; }
  89. };
  90. template<typename VALUE_T>
  91. struct hkTypedUnion_value_traits<VALUE_T*>
  92. {
  93. static inline hkClassMember::Type type() { return hkClassMember::TYPE_POINTER; }
  94. };
  95. template<>
  96. struct hkTypedUnion_value_traits<hkUlong>
  97. {
  98. static inline hkClassMember::Type type() { return hkClassMember::TYPE_ULONG; }
  99. };
  100. template<typename VALUE_T>
  101. inline hkResult hkTypedUnion::getValue(VALUE_T& dest) const
  102. {
  103. if(m_type == hkTypedUnion_value_traits<VALUE_T>::type() )
  104. {
  105. HK_COMPILE_TIME_ASSERT( sizeof(dest) < sizeof(m_elem) );
  106. hkString::memCpy( &dest, &m_elem, sizeof(dest));
  107. return HK_SUCCESS;
  108. }
  109. return HK_FAILURE;
  110. }
  111. template<typename VALUE_T>
  112. inline void hkTypedUnion::setSimple(const VALUE_T& orig) 
  113. {
  114. m_elem.m_maxSize[0] = 0;
  115. m_elem.m_maxSize[1] = 0;
  116. m_elem.m_maxSize[2] = 0;
  117. m_elem.m_maxSize[3] = 0;
  118. // set new type and value
  119. m_type = hkTypedUnion_value_traits<VALUE_T>::type();
  120. //HK_ASSERT(0x10d761b4,  );
  121. hkString::memCpy( &m_elem, &orig, sizeof(orig) );
  122. }
  123. */
  124. ///////////////////////////////////////////   Public access methods
  125. inline hkTypedUnion::hkTypedUnion() :
  126. m_type(hkClassMember::TYPE_VOID)
  127. {
  128. }
  129. inline void hkTypedUnion::setObject(const void* orig, const hkClass* klass)
  130. {
  131. m_type = hkClassMember::TYPE_POINTER;
  132. m_elem.m_variant.m_object = const_cast<void*>(orig);
  133. m_elem.m_variant.m_class = klass;
  134. }
  135. inline void hkTypedUnion::setEnum(int val, const hkClassEnum* eklass)
  136. {
  137. m_type = hkClassMember::TYPE_ENUM;
  138. m_elem.m_enumVariant.m_value = val;
  139. m_elem.m_enumVariant.m_enum = eklass;
  140. }
  141. inline hkResult hkTypedUnion::setSimple(const void* orig, const hkClassMember::Type type)
  142. {
  143. HK_ASSERT(0x773e3daa,
  144. (type >= hkClassMember::TYPE_BOOL && type <= hkClassMember::TYPE_TRANSFORM)
  145. || (type >= hkClassMember::TYPE_VARIANT && type <= hkClassMember::TYPE_FLAGS) );
  146. const hkClassMember::TypeProperties& props = hkClassMember::getClassMemberTypeProperties(type);
  147. if( unsigned(props.m_size) <= sizeof(m_elem))
  148. {
  149. m_type = type;
  150. hkString::memCpy(&m_elem, orig, props.m_size);
  151. return HK_SUCCESS;
  152. }
  153. return HK_FAILURE;
  154. }
  155. inline hkClassMember::Type hkTypedUnion::getType() const
  156. {
  157. return m_type;
  158. }
  159. inline const hkTypedUnion::Storage& hkTypedUnion::getStorage() const
  160. {
  161. return m_elem;
  162. }
  163. /*
  164. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  165. * Confidential Information of Havok.  (C) Copyright 1999-2009
  166. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  167. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  168. * rights, and intellectual property rights in the Havok software remain in
  169. * Havok and/or its suppliers.
  170. * Use of this software for evaluation purposes is subject to and indicates
  171. * acceptance of the End User licence Agreement for this product. A copy of
  172. * the license is included with this software and is also available at www.havok.com/tryhavok.
  173. */