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

其他游戏

开发平台:

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 HKBASE_HKBASETYPES_H
  9. #define HKBASE_HKBASETYPES_H
  10. //
  11. // compiler
  12. //
  13. #if defined(_MSC_VER)
  14. # define HK_COMPILER_MSVC
  15. #elif defined(__SNC__)
  16. # define HK_COMPILER_SNC
  17. #elif defined(__GNUC__)
  18. # define HK_COMPILER_GCC
  19. #elif defined(__MWERKS__)
  20. # define HK_COMPILER_MWERKS
  21. #elif defined(__INTEL_COMPILER)
  22. # define HK_COMPILER_INTEL
  23. #else
  24. # error Could not detect compiler
  25. #endif
  26. //
  27. // architecture
  28. //
  29. # define HK_ARCH_IA32
  30. # define HK_ENDIAN_LITTLE 1
  31. # define HK_ENDIAN_BIG 0
  32. # define HK_POINTER_SIZE 4
  33. #if defined(HK_ARCH_PS3) || defined(HK_ARCH_PS3SPU)
  34. # include <sdk_version.h>
  35. # define HK_CELL_SDK_VERSION CELL_SDK_VERSION
  36. # if ( HK_CELL_SDK_VERSION < 0x080000 )
  37. #   define HK_POINTER_SIZE 8 // Caution: On SPU the pointer size is 4, but usually where this is used pointers will be "shadows" from the PPU
  38. # else
  39. #   define HK_POINTER_SIZE 4
  40. # endif
  41. # define HK_COMPILER_HAS_INTRINSICS_ALTIVEC
  42. #endif
  43. //
  44. // platform
  45. //
  46. # define HK_PLATFORM_WIN32
  47. # if defined(_WIN64)
  48. # define HK_PLATFORM_X64
  49. # endif
  50. # define HK_PLATFORM_IS_CONSOLE 0
  51. //
  52. // types
  53. //
  54. /// hkReal is the default floating point type.
  55. typedef float  hkReal;
  56. /// hkFloat is provided if floats are explicitly required.
  57. typedef float  hkFloat32;
  58. /// hkDouble is provided if doubles are explicit required.
  59. typedef double hkDouble64;
  60. /// Signed 8 bit integer
  61. typedef signed char hkChar;
  62. /// Signed 8 bit integer
  63. typedef signed char hkInt8;
  64. /// Signed 16 bit integer
  65. typedef signed short hkInt16;
  66. /// Signed 32 bit integer
  67. typedef signed int hkInt32;
  68. /// Unsigned 8 bit integer
  69. typedef unsigned char hkUchar;
  70. /// Unsigned  8 bit integer
  71. typedef unsigned char hkUint8;
  72. /// Unsigned  16 bit integer
  73. typedef unsigned short hkUint16;
  74. /// Unsigned  32 bit integer
  75. typedef unsigned int hkUint32;
  76. /// An integer type guaranteed to be the same size as a pointer.
  77. #if defined(HK_ARCH_PS2)
  78. typedef unsigned int hkUlong;
  79. typedef signed int hkLong;
  80. #elif defined(HK_ARCH_PSP)
  81. typedef unsigned int hkUlong;
  82. typedef signed int hkLong;
  83. #elif defined(HK_ARCH_X64)
  84. typedef unsigned long hkUlong; // UNIX64
  85. typedef signed long hkLong; // UNIX64
  86. #elif defined(HK_COMPILER_MSVC) && (_MSC_VER >= 1300)
  87. typedef unsigned long __w64 hkUlong; // VC7.0 or higher, 64bit warnings
  88. typedef signed long __w64 hkLong; 
  89. #else
  90. typedef unsigned long hkUlong;
  91. typedef signed long hkLong;
  92. #endif
  93. #define HK_CPU_PTR( A ) A
  94. typedef void* hk_va_list;
  95. /// a simple success/failure enum.
  96. enum hkResult
  97. {
  98. HK_SUCCESS = 0,
  99. HK_FAILURE = 1
  100. };
  101. #if defined( HK_PLATFORM_PS3_SPU) 
  102. # include <spu_intrinsics.h>
  103. #endif
  104. //
  105. // useful macros
  106. //
  107. #if  defined(DEBUG) || defined(_DEBUG) || defined(HK_DEBUG)
  108. # undef HK_DEBUG
  109. # define HK_DEBUG
  110. # define HK_ON_DEBUG(CODE) CODE
  111. #else
  112. # define HK_ON_DEBUG(CODE)
  113. #endif
  114. // use the compiler friendly but programmer ugly version for release only
  115. #ifdef HK_DEBUG
  116. # define HK_MULTILINE_MACRO_BEGIN do {
  117. # define HK_MULTILINE_MACRO_END } while(0)
  118. #else
  119. # if defined(HK_PLATFORM_PS3_PPU ) || defined(HK_PLATFORM_PS3_SPU)
  120. # define HK_MULTILINE_MACRO_BEGIN {
  121. # define HK_MULTILINE_MACRO_END  } 
  122. # else
  123. # define HK_MULTILINE_MACRO_BEGIN if(1) {
  124. # define HK_MULTILINE_MACRO_END } else
  125. # endif
  126. #endif
  127. # define HK_BREAKPOINT(ID) __asm { int 3 }
  128. #define HK_NULL 0
  129. /// Note that ALIGNMENT must be a power of two for this to work.
  130. /// Note: to use this macro you must cast your pointer to a byte pointer or to an integer value.
  131. #define HK_NEXT_MULTIPLE_OF(ALIGNMENT, VALUE)  ( ((VALUE) + ((ALIGNMENT)-1)) & (~((ALIGNMENT)-1)) )
  132. /// The offset of a member within a structure
  133. #define HK_OFFSET_OF(CLASS,MEMBER) int(reinterpret_cast<hkLong>(&(reinterpret_cast<CLASS*>(16)->MEMBER))-16)
  134. /// A check for whether the offset of a member within a structure is as expected
  135. #define HK_OFFSET_EQUALS(CLASS,MEMBER,OFFSET) (HK_OFFSET_OF(CLASS,MEMBER)==OFFSET)
  136. /// Join two preprocessor tokens, even when a token is itself a macro.
  137. #define HK_PREPROCESSOR_JOIN_TOKEN(A,B) HK_PREPROCESSOR_JOIN_TOKEN2(A,B)
  138. #define HK_PREPROCESSOR_JOIN_TOKEN2(A,B) HK_PREPROCESSOR_JOIN_TOKEN3(A,B)
  139. #define HK_PREPROCESSOR_JOIN_TOKEN3(A,B) A##B
  140. /// Creates an uninitialized buffer large enough for object of type TYPE to fit in while aligned to ALIGN boundary. Creates a pointer VAR to this aligned address.
  141. #define HK_DECLARE_ALIGNED_LOCAL_PTR( TYPE, VAR, ALIGN  )
  142. const int VAR ## BufferSize = ALIGN + sizeof(TYPE);
  143. char VAR ## Buffer[VAR ## BufferSize];
  144. TYPE* VAR = reinterpret_cast<TYPE*>( HK_NEXT_MULTIPLE_OF(ALIGN, hkUlong( VAR ## Buffer )) );
  145. //
  146. // compiler specific settings
  147. //
  148. // *************************************
  149. // GCC and SN
  150. // *************************************
  151. # define HK_COMPILER_SUPPORTS_PCH
  152. # define HK_COMPILER_MSVC_VERSION _MSC_VER
  153. # define HK_COMPILER_INTEL_VERSION _MSC_VER
  154. # if (_MSC_VER >= 1400) // 2005 only
  155. # define HK_RESTRICT __restrict
  156. # else
  157. # define HK_RESTRICT 
  158. # endif
  159. # pragma warning( disable : 4786 ) // Debug tuncated to 255:
  160. # pragma warning( disable : 4530 ) // C++ Exception handler used but not enabled:(used in <xstring>)
  161. # define HK_ALIGN(DECL, ALIGNMENT) __declspec(align(ALIGNMENT)) DECL
  162. # define HK_ALIGN16(DECL) __declspec(align(16)) DECL
  163. # define HK_ALIGN128(DECL) __declspec(align(128)) DECL
  164. # define HK_FORCE_INLINE __forceinline
  165. # define HK_CLASSALIGN(DECL, ALIGNMENT) HK_ALIGN(DECL, ALIGNMENT)
  166. # define HK_CLASSALIGN16(DECL) HK_ALIGN16(DECL)
  167. typedef unsigned __int64 hkUint64;
  168. typedef __int64 hkInt64;
  169. typedef long hkSystemTime;
  170. # if defined(HK_COMPILER_MSVC) && (_MSC_VER >= 1300)
  171. typedef unsigned __w64 hk_size_t; // VC7.0 or higher, 64bit warnings
  172. # else
  173. typedef unsigned hk_size_t;
  174. # endif
  175. # define HK_COMPILER_HAS_INTRINSICS_IA32
  176. // calling convention
  177. # define HK_CALL __cdecl
  178. # define HK_FAST_CALL __fastcall
  179. // deprecation
  180. # if defined(HK_PLATFORM_WIN32) && (_MSC_VER >= 1300) && !defined(MIDL_PASS)
  181. # define HK_DEPRECATED __declspec(deprecated)
  182. # else
  183. # define HK_DEPRECATED /* nothing */
  184. # endif
  185. // *************************************
  186. // METROWERKS
  187. // *************************************
  188. #if defined(HK_PLATFORM_SIM_PPU) || defined(HK_PLATFORM_SIM_SPU)
  189. #       define HK_PLATFORM_SIM
  190. #endif
  191. #if defined(HK_PLATFORM_PS3_PPU) || defined(HK_PLATFORM_PS3_SPU) || defined(HK_PLATFORM_SIM)
  192. # define HK_PLATFORM_HAS_SPU
  193. # define HK_ON_PLATFORM_HAS_SPU(code) code
  194. #else
  195. # define HK_ON_PLATFORM_HAS_SPU(code)
  196. #endif
  197. #if defined(HK_PLATFORM_PS3_PPU) || defined(HK_PLATFORM_WIN32) || defined(HK_PLATFORM_XBOX360) || defined(HK_PLATFORM_MAC386) || defined(HK_PLATFORM_MACPPC) || defined(HK_PLATFORM_UNIX)
  198. # define HK_PLATFORM_MULTI_THREAD
  199. #endif
  200. #if defined(HK_PLATFORM_PS3_PPU) || defined(HK_PLATFORM_PS3_SPU)
  201. # define HK_ALWAYS_INLINE __attribute__((always_inline)) inline
  202. # if !defined (HK_DEBUG)
  203. # define HK_LOCAL_INLINE inline
  204. # else
  205. # define HK_LOCAL_INLINE
  206. # endif
  207. # define HK_ASM_SEP(a) __asm("#*****" a )
  208. #else
  209. # define HK_ALWAYS_INLINE HK_FORCE_INLINE
  210. # define HK_LOCAL_INLINE HK_FORCE_INLINE
  211. # define HK_ASM_SEP(a) 
  212. #endif
  213. # define HK_NOSPU_VIRTUAL virtual
  214. #ifndef HK_RESTRICT
  215. # define HK_RESTRICT
  216. #endif
  217. #ifndef HK_VERY_UNLIKELY
  218. # define HK_VERY_UNLIKELY(EXPR) EXPR
  219. # define HK_VERY_LIKELY(EXPR) EXPR
  220. #endif
  221. typedef hkUint16 hkObjectIndex;
  222. typedef hkReal hkTime;
  223. #define HK_INVALID_OBJECT_INDEX 0xffff
  224. HK_FORCE_INLINE hkInt32 HK_CALL hkPointerToInt32( const void* ptr )
  225. {
  226. return static_cast<int>( hkUlong(ptr) );
  227. }
  228. /// get the byte offset of B - A, as a full long.
  229. HK_FORCE_INLINE hkLong HK_CALL hkGetByteOffset( const void* base, const void* pntr)
  230. {
  231. return hkLong(pntr) - hkLong(base);
  232. }
  233. /// get the byte offset of B - A, as an int (64bit issues, so here for easy code checks)
  234. HK_FORCE_INLINE int HK_CALL hkGetByteOffsetInt( const void* base, const void* pntr)
  235. {
  236. return static_cast<int>( hkGetByteOffset( base, pntr ) );
  237. }
  238. /// get the byte offset of B - A, as a full 64bit hkUint64.
  239. HK_FORCE_INLINE hkInt32 HK_CALL hkGetByteOffsetCpuPtr( const HK_CPU_PTR(void*) base, const HK_CPU_PTR(void*) pntr)
  240. {
  241. return hkInt32(hkLong((HK_CPU_PTR(const char*))(pntr) - (HK_CPU_PTR(const char*))(base)));
  242. }
  243. template <typename TYPE>
  244. HK_ALWAYS_INLINE TYPE* HK_CALL hkAddByteOffset( TYPE* base, hkLong offset )
  245. {
  246. return reinterpret_cast<TYPE*>( reinterpret_cast<char*>(base) + offset );
  247. }
  248. template <typename TYPE>
  249. HK_ALWAYS_INLINE TYPE HK_CALL hkAddByteOffsetCpuPtr( TYPE base, hkLong offset )
  250. {
  251. return reinterpret_cast<TYPE>( reinterpret_cast<char*>(base) + offset );
  252. }
  253. template <typename TYPE>
  254. HK_ALWAYS_INLINE const TYPE* HK_CALL hkAddByteOffsetConst( const TYPE* base, hkLong offset )
  255. {
  256. return reinterpret_cast<const TYPE*>( reinterpret_cast<const char*>(base) + offset );
  257. }
  258. template <typename TYPE>
  259. HK_ALWAYS_INLINE TYPE HK_CALL hkAddByteOffsetCpuPtrConst( TYPE base, hkLong offset )
  260. {
  261. return reinterpret_cast<const TYPE>( reinterpret_cast<const char*>(base) + offset );
  262. }
  263. /// If you have a pair of pointers and you have one pointer, than this function allows you to quickly get the other pointer of the pair.
  264. template <typename TYPE>
  265. HK_ALWAYS_INLINE TYPE* HK_CALL hkSelectOther( TYPE* a, TYPE* pairA, TYPE* pairB )
  266. {
  267. return reinterpret_cast<TYPE*>( hkUlong(a) ^ hkUlong(pairA) ^ hkUlong(pairB) );
  268. }
  269. /// If you have a pair of pointers and you have one pointer, than this function allows you to quickly get the other pointer of the pair.
  270. template <typename TYPE>
  271. HK_ALWAYS_INLINE TYPE* HK_CALL hkSelect( int select, TYPE* pairA, TYPE* pairB )
  272. {
  273. //HK_ASSERT( 0xf0345456, select == 0 || select == 1);
  274. hkUlong ua = hkUlong(pairA);
  275. hkUlong ub = hkUlong(pairB);
  276. return reinterpret_cast<TYPE*>( ua ^ ((ua^ub)&(-select)) );
  277. }
  278. HK_FORCE_INLINE hkUint32 hkNextPowerOf2(hkUint32 in) 
  279. {
  280. in -= 1;
  281. in |= in >> 16;
  282. in |= in >> 8;
  283. in |= in >> 4;
  284. in |= in >> 2;
  285. in |= in >> 1;
  286. return in + 1; 
  287. }
  288. class hkFinishLoadedObjectFlag
  289. {
  290. public:
  291. hkFinishLoadedObjectFlag() : m_finishing(0) {}
  292. int m_finishing;
  293. };
  294. #define hkSizeOf(A) int(sizeof(A))
  295. #define HK_REFLECTION_CLASSFILE_DESTINATION(PATH)
  296. #define HK_REFLECTION_CLASSFILE_HEADER(PATH)
  297. #define HK_DECLARE_REFLECTION() 
  298. static const struct hkInternalClassMember Members[]; 
  299. static const hkClass& HK_CALL staticClass(); 
  300. struct DefaultStruct
  301. class hkClass;
  302. /// A generic object with metadata.
  303. struct hkVariant
  304. {
  305. void* m_object;
  306. const hkClass* m_class;
  307. };
  308. /// False is zero, true is _any_ non-zero value.
  309. /// Thus comparisons like bool32 == true will not work as expected.
  310. typedef int hkBool32;
  311. /// A wrapper to store a hkBool in one byte, regardless of compiler options.
  312. class hkBool
  313. {
  314. public:
  315. inline hkBool()
  316. {
  317. }
  318. inline hkBool(bool b)
  319. {
  320. m_bool = static_cast<char>(b);
  321. }
  322. inline operator bool() const
  323. {
  324. return m_bool != 0;
  325. }
  326. inline hkBool& operator=(bool e)
  327. {
  328. m_bool = static_cast<char>(e);
  329. return *this;
  330. }
  331. inline hkBool operator==(bool e) const
  332. {
  333. return static_cast<int>(m_bool) == static_cast<int>(e);
  334. }
  335. inline hkBool operator!=(bool e) const
  336. {
  337. return static_cast<int>(m_bool) != static_cast<int>(e);
  338. }
  339. private:
  340. char m_bool;
  341. };
  342.     /// A wrapper to store a float in 16 bit. This is a non ieee representation.
  343.     /// Basically we simply chop off the last 16 bits. That means the whole floating point range
  344.     /// will be supported, but only with 7 bit precision
  345. class hkHalf
  346. {
  347.     public:
  348. HK_DECLARE_REFLECTION();
  349.     inline hkHalf() { }
  350.     
  351.     inline hkHalf(const float& f)
  352.     {
  353.     int t = ((const int*)&f)[0];
  354.     m_value = hkInt16(t>>16);
  355.     }
  356.     
  357.     inline hkHalf& operator=(const float& f)
  358.     {
  359.     int t = ((const int*)&f)[0];
  360.     m_value = hkInt16(t>>16);
  361.     return *this;
  362.     }
  363.     
  364.     inline operator float() const
  365.     {
  366.     union
  367.     {
  368.     int i;
  369.     float f;
  370.     } u;
  371.     u.i = (m_value <<16);
  372.     return u.f;
  373.     }
  374.     
  375.     private:
  376.     hkInt16 m_value;
  377. };
  378. #define HK_UFLOAT8_MAX_VALUE 256
  379. extern "C"
  380. {
  381. extern const hkReal hkUFloat8_intToReal[HK_UFLOAT8_MAX_VALUE];
  382. }
  383. /// A wrapper to store an unsigned float into 8 bit. 
  384. /// This has a reduced range. Basically the encoding
  385. /// uses a table holding an exponential function.
  386. /// The range is [0.010f to 1000002.f] with an average error of 7%
  387. class hkUFloat8
  388. {
  389. public:
  390. enum { MAX_VALUE = HK_UFLOAT8_MAX_VALUE };
  391. // the minimum value to encode which is non zero
  392. #define hkUFloat8_eps 0.01f
  393. // the maximum value to encode
  394. #define hkUFloat8_maxValue 1000000.0f
  395. inline hkUFloat8(){ }
  396. hkUFloat8& operator=(const float& fv);
  397. inline hkUFloat8(const float f)
  398. {
  399. *this = f;
  400. }
  401. inline operator float() const
  402. {
  403. return hkUFloat8_intToReal[m_value];
  404. }
  405. public:
  406. hkUint8 m_value;
  407. };
  408. // A lookup table for converting unsigned char to float
  409. // useful for avoiding LHS
  410. extern "C"
  411. {
  412. extern const hkReal hkUInt8ToReal[256];
  413. }
  414. /// A wrapper to store an enum with explicit size.
  415. template<typename ENUM, typename STORAGE>
  416. class hkEnum
  417. {
  418. public:
  419. hkEnum()
  420. {
  421. }
  422. hkEnum(ENUM e)
  423. {
  424. m_storage = static_cast<STORAGE>(e);
  425. }
  426. operator ENUM() const
  427. {
  428. return static_cast<ENUM>(m_storage);
  429. }
  430. void operator=(ENUM e)
  431. {
  432. m_storage = static_cast<STORAGE>(e);
  433. }
  434. hkBool operator==(ENUM e) const
  435. {
  436. return m_storage == static_cast<STORAGE>(e);
  437. }
  438. hkBool operator!=(ENUM e) const
  439. {
  440. return m_storage != static_cast<STORAGE>(e);
  441. }
  442. private:
  443. STORAGE m_storage;
  444. };
  445. /// A wrapper to store bitfield with an with explicit size.
  446. template<typename BITS, typename STORAGE>
  447. class hkFlags
  448. {
  449. public:
  450. hkFlags()
  451. {
  452. }
  453. hkFlags(STORAGE s)
  454. {
  455. m_storage = s;
  456. }
  457. void clear()
  458. {
  459. m_storage = 0;
  460. }
  461. void setAll( STORAGE s )
  462. {
  463. m_storage = s;
  464. }
  465. void orWith( STORAGE s )
  466. {
  467. m_storage |= s;
  468. }
  469. void xorWith( STORAGE s )
  470. {
  471. m_storage ^= s;
  472. }
  473. void andWith( STORAGE s )
  474. {
  475. m_storage &= s;
  476. }
  477. void setWithMask( STORAGE s, STORAGE mask )
  478. {
  479. m_storage = (m_storage & ~mask) | (s & mask);
  480. }
  481. STORAGE get() const
  482. {
  483. return m_storage;
  484. }
  485. STORAGE get( STORAGE mask ) const
  486. {
  487. return m_storage & mask;
  488. }
  489. bool anyIsSet( STORAGE mask ) const
  490. {
  491. return (m_storage & mask) != 0;
  492. }
  493. bool allAreSet( STORAGE mask ) const
  494. {
  495. return (m_storage & mask) == mask;
  496. }
  497. bool operator==( const hkFlags& f ) const
  498. {
  499. return f.m_storage == m_storage;
  500. }
  501. bool operator!=( const hkFlags& f ) const
  502. {
  503. return f.m_storage != m_storage;
  504. }
  505. private:
  506. STORAGE m_storage;
  507. };
  508. #if defined(HK_PLATFORM_PS3_SPU) 
  509. template <typename TYPE> struct hkSpuStorage {}; // default is error
  510. template <typename TYPE> struct hkSpuStorage<TYPE*> { typedef vec_uint4 StorageType; typedef unsigned PromoteType;  };
  511. template <> struct hkSpuStorage<void*> { typedef vec_uint4 StorageType; typedef unsigned PromoteType; };
  512. template <> struct hkSpuStorage<int> { typedef vec_int4 StorageType; typedef int PromoteType; };
  513. template <> struct hkSpuStorage<unsigned> { typedef vec_uint4 StorageType; typedef unsigned PromoteType; };
  514. template <> struct hkSpuStorage<float> { typedef vec_float4 StorageType; typedef float PromoteType; };
  515. template <> struct hkSpuStorage<hkBool> { typedef vec_int4 StorageType; typedef hkBool PromoteType; };
  516. template <> struct hkSpuStorage<hkUchar> { typedef vec_uchar16 StorageType; typedef hkUchar PromoteType; };
  517. template <> struct hkSpuStorage<hkUint16> { typedef vec_ushort8 StorageType; typedef unsigned short PromoteType; };
  518. # define HK_PADSPU_PROMOTE(e) spu_promote( (typename hkSpuStorage<TYPE>::PromoteType)(e), 0 )
  519. # define HK_PADSPU_EXTRACT(e) (TYPE)spu_extract( e, 0 )
  520. #else
  521. # define HK_PADSPU_PROMOTE(e) e
  522. # define HK_PADSPU_EXTRACT(e) e
  523. #endif
  524. /// wrapper class for variables in structures. 
  525. /// Basically on the PLAYSTATION(R)3 spu, the spu can only poorly
  526. /// access non aligned members. This class give each variable
  527. /// 16 bytes, thereby dramatically decreasing code size and cpu overhead
  528. template <typename TYPE>
  529. class hkPadSpu
  530. {
  531. public:
  532. HK_FORCE_INLINE hkPadSpu() {}
  533. HK_FORCE_INLINE hkPadSpu(TYPE e)
  534. : m_storage( HK_PADSPU_PROMOTE(e) )
  535. {
  536. }
  537. HK_FORCE_INLINE void operator=(TYPE e)
  538. {
  539. m_storage = HK_PADSPU_PROMOTE(e);
  540. }
  541. HK_FORCE_INLINE TYPE val() const
  542. {
  543. return HK_PADSPU_EXTRACT(m_storage);
  544. }
  545. HK_FORCE_INLINE TYPE operator->() const
  546. {
  547. return HK_PADSPU_EXTRACT(m_storage);
  548. }
  549. HK_FORCE_INLINE operator TYPE() const
  550. {
  551. return val();
  552. }
  553. private:
  554. # if defined(HK_PLATFORM_PS3_SPU) 
  555. typename hkSpuStorage<TYPE>::StorageType m_storage;
  556. # elif defined(HK_PLATFORM_HAS_SPU)
  557. HK_ALIGN16(TYPE m_storage);
  558. hkUchar m_pad[ 16-sizeof(TYPE) ];
  559. # else
  560. TYPE m_storage;
  561. # endif
  562. };
  563. # define HK_PAD_ON_SPU(TYPE) TYPE
  564. # define HK_ON_CPU(code) code
  565. # define HK_ON_SPU(code)
  566. #define HK_HINT_SIZE16(A) hkInt16(A)
  567. struct hkCountOfBadArgCheck
  568. {
  569. class ArgIsNotAnArray;
  570. template<typename T> static ArgIsNotAnArray isArrayType(const T*, const T* const*);
  571. static int isArrayType(const void*, const void*);
  572. };
  573. /// Returns the number of elements in the C array.
  574. #define HK_COUNT_OF(x) ( 
  575. 0 * sizeof( reinterpret_cast<const ::hkCountOfBadArgCheck*>(x) ) + 
  576. 0 * sizeof( ::hkCountOfBadArgCheck::isArrayType((x), &(x)) ) + 
  577. sizeof(x) / sizeof((x)[0]) ) 
  578. #if defined(HK_PLATFORM_PS3_SPU)
  579. extern hkUlong g_spuLowestStack;
  580. # define HK_SPU_INIT_STACK_SIZE_TRACE()   { int reference = 0; g_spuLowestStack = hkUlong(&reference); }
  581. # define HK_SPU_UPDATE_STACK_SIZE_TRACE() { int reference = 0; if ( hkUlong(&reference) < g_spuLowestStack ) g_spuLowestStack = hkUlong(&reference); }
  582. # define HK_SPU_OUTPUT_STACK_SIZE_TRACE() { int reference = 0; hkUlong stackSize = hkUlong(&reference) - g_spuLowestStack; static hkUlong maxStackSize = 0; if ( stackSize > maxStackSize ) { maxStackSize = stackSize; HK_SPU_DEBUG_PRINTF(("Maximum real stack size on spu: %dn", stackSize)); } }
  583. // Place a marker just after the static data section
  584. # define HK_SPU_BSS_GUARD_INIT() { extern char* _end; *(unsigned int *)&_end = 0x4323e345; }
  585. // Check marker at end of static data section to see if the stack has grown into it
  586. # define HK_SPU_BSS_GUARD_CHECK() { extern char* _end; if ( *((unsigned int *)&_end) != 0x4323e345) { __asm ("stop"); } }
  587. // Makes sure that the program stack hasn't overrun the hkSpuStack
  588. # define HK_SPU_STACK_POINTER_CHECK() { int reference = 0; if ( hkUlong(&reference) < hkUlong(hkSpuStack::getInstance().getStackNext()) ) { HK_BREAKPOINT(66); }  }
  589. #else
  590. # define HK_SPU_INIT_STACK_SIZE_TRACE()
  591. # define HK_SPU_UPDATE_STACK_SIZE_TRACE()
  592. # define HK_SPU_OUTPUT_STACK_SIZE_TRACE()
  593. # define HK_SPU_BSS_GUARD_INIT()
  594. # define HK_SPU_BSS_GUARD_CHECK()
  595. # define HK_SPU_STACK_POINTER_CHECK()
  596. #endif
  597. #endif // HKBASE_HKBASETYPES_H
  598. /*
  599. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  600. * Confidential Information of Havok.  (C) Copyright 1999-2009
  601. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  602. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  603. * rights, and intellectual property rights in the Havok software remain in
  604. * Havok and/or its suppliers.
  605. * Use of this software for evaluation purposes is subject to and indicates
  606. * acceptance of the End User licence Agreement for this product. A copy of
  607. * the license is included with this software and is also available at www.havok.com/tryhavok.
  608. */