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

其他游戏

开发平台:

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_MATH_PSEUDORANDOMGENERATOR_H
  9. #define HK_MATH_PSEUDORANDOMGENERATOR_H
  10. #include <Common/Base/hkBase.h>
  11. // This is a Pseudorandom Number generator from  Num. Recip. p284:  Knuth-Lewis "quick and dirty" rand,
  12. // otherwise known as randq1(). It's not great, but it's fast. Don't use it for "serious" work.
  13. class hkPseudoRandomGenerator
  14. {
  15. public:
  16. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_MATH, hkPseudoRandomGenerator);
  17. // Seed MUST be passed in on construction (to force you to think about it!)
  18. hkPseudoRandomGenerator(int s)
  19. {
  20. m_seed = hkUint32(s);
  21. m_current = m_seed;
  22. }
  23. // Can also reseed if desired. It wipes over  the last used, so effectively "restarts" the RNG
  24. void setSeed(int s)
  25. {
  26. m_seed = hkUint32(s);
  27. m_current = m_seed;
  28. }
  29. // Get seed used by generator. This may be useful to determine how the RNG was "started".
  30. int getSeed()
  31. {
  32. return int(m_seed);
  33. }
  34. // Get current value (NOT equal to getRand32), but will allow you to "monitor" the RNG so you
  35. // can reseed it later. 
  36. int getCurrent()
  37. {
  38. return int(m_current);
  39. }
  40. // Get random number as unsigned int
  41. hkUint32 getRand32()
  42. {
  43. m_current = 1664525U * m_current + 1013904223U;
  44. return m_current;
  45. }
  46. // Get random integer in range [0-X) as unsigned int, suitable for small values
  47. hkUint32 getRandChar(int x)
  48. {
  49. HK_ASSERT(0x777504aa,  x > 0 && x <= 256 );
  50. m_current = 1664525L * m_current + 1013904223L;
  51. hkUint32 temp = (hkUint32)m_current;
  52. temp >>= 13;
  53. temp = temp % x;
  54. HK_ASSERT(0x3443045a, temp < 256 );
  55. return temp;
  56. }
  57. // Get random real in range [0,1] using getRand32()
  58. hkReal getRandReal01()
  59. {
  60. const hkReal v = getRand32()*( 1.0f / 0xffffffff);
  61. return v;
  62. }
  63. // Get random real in range [-1,1] using getRand32()
  64. hkReal getRandReal11()
  65. {
  66. return 2*getRandReal01() - 1.0f;
  67. }
  68. // Get random real in range [min,max] using getRand01()
  69. hkReal getRandRange( hkReal min, hkReal max )
  70. {
  71. return getRandReal01() * ( max - min ) + min;
  72. }
  73. void getRandomRotation( hkRotation& rotOut )
  74. {
  75. hkVector4 v;
  76. v(0) = getRandReal11();
  77. v(1) = getRandReal11();
  78. v(2) = getRandReal11();
  79. v(3) = getRandReal11();
  80. v.normalize4();
  81. hkQuaternion q;
  82. q.m_vec = v;
  83. rotOut.set( q );
  84. }
  85. void getRandomRotation( hkQuaternion& rotOut )
  86. {
  87. hkVector4 v;
  88. v(0) = getRandReal11();
  89. v(1) = getRandReal11();
  90. v(2) = getRandReal11();
  91. v(3) = getRandReal11();
  92. v.normalize4();
  93. rotOut.m_vec = v;
  94. }
  95. /// sets xyzw randomly between -1 and 1
  96. void getRandomVector11( hkVector4& vecOut )
  97. {
  98. vecOut(0) = getRandReal11();
  99. vecOut(1) = getRandReal11();
  100. vecOut(2) = getRandReal11();
  101. vecOut(3) = getRandReal11();
  102. }
  103. /// sets xyzw randomly between 0 and 1
  104. void getRandomVector01( hkVector4& vecOut )
  105. {
  106. vecOut(0) = getRandReal01();
  107. vecOut(1) = getRandReal01();
  108. vecOut(2) = getRandReal01();
  109. vecOut(3) = getRandReal01();
  110. }
  111. void getRandomVectorRange( hkVector4Parameter min, hkVector4Parameter max, hkVector4& vecOut)
  112. {
  113. hkVector4 t; getRandomVector01(t);
  114. hkVector4 delta; delta.setSub4(max, min);
  115. vecOut.setAddMul4(min, delta, t);
  116. }
  117. private:
  118. hkUint32 m_seed;
  119. hkUint32 m_current;
  120. };
  121. #endif // HK_MATH_PSEUDORANDOMGENERATOR_H
  122. /*
  123. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  124. * Confidential Information of Havok.  (C) Copyright 1999-2009
  125. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  126. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  127. * rights, and intellectual property rights in the Havok software remain in
  128. * Havok and/or its suppliers.
  129. * Use of this software for evaluation purposes is subject to and indicates
  130. * acceptance of the End User licence Agreement for this product. A copy of
  131. * the license is included with this software and is also available at www.havok.com/tryhavok.
  132. */