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

其他游戏

开发平台:

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_HKERROR_H
  9. #define HKBASE_HKERROR_H
  10. /// Class with static methods to provide hooks to error reporting functions
  11. /// You can redirect all asserts, errors and warnings by setting the handlers
  12. /// at run time. Asserts and Warnings are only compiled into debug builds.
  13. /// Errors are compiled in all builds. See hkDefaultError.h for a sample implementation
  14. /// of the handlers.
  15. class hkError : public hkReferencedObject, public hkSingleton<hkError>
  16. {
  17. public:
  18. enum Message
  19. {
  20. MESSAGE_REPORT,
  21. MESSAGE_WARNING,
  22. MESSAGE_ASSERT,
  23. MESSAGE_ERROR
  24. };
  25. /// Return value indicates whether or not to trigger an HK_BREAKPOINT
  26. virtual int message(Message m, int id, const char* description, const char* file, int line) = 0;
  27. /// Enables/disables diagnostic by id.
  28. virtual void setEnabled( int id, hkBool enabled ) = 0;
  29. /// Enables/disables diagnostic by id.
  30. virtual hkBool isEnabled( int id ) = 0;
  31. /// Force all diagnostics to be enabled.
  32. virtual void enableAll() = 0;
  33. /// Begin a new report section
  34. virtual void sectionBegin(int id, const char* sectionName) {}
  35. /// End the current report section
  36. virtual void sectionEnd() {}
  37. };
  38. #if !defined(HK_PLATFORM_PS3_SPU)
  39. class hkErrStream : public hkOstream
  40. {
  41. public:
  42. hkErrStream( void* buf, int bufSize );
  43. };
  44. typedef void (HK_CALL *hkErrorReportFunction)(const char* s, void* errorReportObject);
  45. #endif
  46. namespace hkCompileError
  47. {
  48. template <bool b> struct COMPILE_ASSERTION_FAILURE;
  49. template <> struct COMPILE_ASSERTION_FAILURE<true>{ };
  50. }
  51. // compile time asserts and errors are always enabled
  52. // Note: Use this only in c++ files, not header files.
  53. #define HK_COMPILE_TIME_ASSERT(a) enum { HK_PREPROCESSOR_JOIN_TOKEN(compile_time_assert_, __LINE__) 
  54. = sizeof(hkCompileError::COMPILE_ASSERTION_FAILURE<bool(a)>) }
  55. #define HK_REPORT_SECTION_BEGIN(id, name) hkError::getInstance().sectionBegin(id, name);
  56. #define HK_REPORT_SECTION_END() hkError::getInstance().sectionEnd();
  57. // asserts and warnings may be compiled out
  58. #if !defined (HK_PLATFORM_PS3_SPU)
  59. # define HK_WARN_ALWAYS(id, TEXT) HK_MULTILINE_MACRO_BEGIN
  60. char assertBuf[512];
  61. hkErrStream ostr(assertBuf, sizeof(assertBuf));
  62. ostr << TEXT;
  63. hkError::getInstance().message(hkError::MESSAGE_WARNING, id, assertBuf, __FILE__, __LINE__);
  64. HK_MULTILINE_MACRO_END
  65. // produce an error message which will not break (usefull for the filter pipeline)
  66. # define HK_ERROR_NOBREAK(id, TEXT) HK_MULTILINE_MACRO_BEGIN
  67. char assertBuf[512];
  68. hkErrStream ostr(assertBuf, sizeof(assertBuf));
  69. ostr << TEXT;
  70. hkError::getInstance().message(hkError::MESSAGE_ERROR, id, assertBuf, __FILE__, __LINE__);
  71. HK_MULTILINE_MACRO_END
  72. # define HK_ERROR(id, TEXT) HK_MULTILINE_MACRO_BEGIN
  73. char assertBuf[512];
  74. hkErrStream ostr(assertBuf,sizeof(assertBuf));
  75. ostr << TEXT;
  76. if ( hkError::getInstance().message(hkError::MESSAGE_ERROR, id, assertBuf, __FILE__, __LINE__) )
  77. {
  78. HK_BREAKPOINT(id);
  79. }
  80. HK_MULTILINE_MACRO_END
  81. # define HK_REPORT(TEXT) HK_MULTILINE_MACRO_BEGIN
  82. char reportBuf[512];
  83. hkErrStream ostr(reportBuf,sizeof(reportBuf));
  84. ostr << TEXT;
  85. hkError::getInstance().message(hkError::MESSAGE_REPORT, -1, reportBuf, __FILE__, __LINE__);
  86. HK_MULTILINE_MACRO_END
  87. # if defined HK_DEBUG // NOSPU + DEBUG
  88. # define HK_ASSERT(id, a) HK_MULTILINE_MACRO_BEGIN 
  89. if ( !(a) )
  90. {
  91. if( hkError::getInstance().message(hkError::MESSAGE_ASSERT, id, #a,__FILE__,__LINE__) )
  92. {
  93. HK_BREAKPOINT(0);
  94. }
  95. }
  96. HK_MULTILINE_MACRO_END
  97. # define HK_ASSERT2(id, a, TEXT) HK_MULTILINE_MACRO_BEGIN 
  98. if ( !(a) )
  99. {
  100. char assertBuf[512];
  101. hkErrStream ostr(assertBuf, sizeof(assertBuf));
  102. ostr << #a << "n";
  103. ostr << TEXT;
  104. if( hkError::getInstance().message(hkError::MESSAGE_ASSERT, id, assertBuf,__FILE__, __LINE__) )
  105. {
  106. HK_BREAKPOINT(0);
  107. }
  108. }
  109. HK_MULTILINE_MACRO_END
  110. # define HK_WARN(id, TEXT) HK_WARN_ALWAYS (id, TEXT)
  111. # define HK_WARN_ONCE(id, TEXT) HK_MULTILINE_MACRO_BEGIN
  112. if ( hkError::getInstance().isEnabled(id) )
  113. {
  114. char assertBuf[512];
  115. hkErrStream ostr( assertBuf, sizeof(assertBuf) );
  116. ostr << TEXT;
  117. hkError::getInstance().getInstance().message(hkError::MESSAGE_WARNING, id, assertBuf, __FILE__, __LINE__);
  118. hkError::getInstance().setEnabled(id, false); 
  119. }
  120. HK_MULTILINE_MACRO_END
  121. # else // NOSPU + RELEASE
  122. # define HK_WARN(id, a) //nothing
  123. # define HK_WARN_ONCE(id, a) //nothing
  124. # define HK_ASSERT(id, a) //nothing 
  125. # define HK_ASSERT2(id, a, TEXT) //nothing 
  126. # endif
  127. #else // defined (HK_PLATFORM_PS3_SPU)
  128. # include <sys/spu_event.h>
  129. # define HK_ERROR_FORWARD(what,id,text) sys_spu_thread_send_event( 31+what, hkUlong(0), id )
  130. # define HK_WARN_ALWAYS(id, TEXT) HK_ERROR_FORWARD( hkError::MESSAGE_WARNING, id, hkUlong(0) )
  131. # define HK_ERROR_NOBREAK(id, TEXT) HK_ERROR_FORWARD( hkError::MESSAGE_WARNING, id, hkUlong(0) )
  132. # define HK_ERROR(id, TEXT) HK_MULTILINE_MACRO_BEGIN 
  133. HK_ERROR_FORWARD( hkError::MESSAGE_ERROR, id, hkUlong(0) ); 
  134. HK_BREAKPOINT(id);
  135. HK_MULTILINE_MACRO_END
  136. # define HK_REPORT(TEXT) HK_ERROR_FORWARD( hkError::MESSAGE_REPORT, 0, hkUlong(TEXT) )
  137. # if defined (HK_DEBUG) // SPU+DEBUG
  138. # define HK_ASSERT(id, a) HK_MULTILINE_MACRO_BEGIN 
  139. if ( !(a) )
  140. {
  141. HK_ERROR_FORWARD( hkError::MESSAGE_ASSERT, id, hkUlong(0) ); 
  142. HK_BREAKPOINT(id);
  143. }
  144. HK_MULTILINE_MACRO_END
  145. # define HK_ASSERT2(id, a, TEXT) HK_ASSERT(id,a)
  146. # define HK_WARN(id, TEXT) HK_ERROR_FORWARD( hkError::MESSAGE_WARNING, id, hkUlong(0) )
  147. # define HK_WARN_ONCE(id, TEXT) HK_MULTILINE_MACRO_BEGIN
  148. static hkBool shown = false;
  149. if ( !shown )
  150. {
  151. HK_WARN(id,TEXT);
  152. }
  153. HK_MULTILINE_MACRO_END
  154. # else // SPU+RELEASE
  155. # define HK_WARN(id, a) //nothing
  156. # define HK_WARN_ONCE(id, a) //nothing
  157. # define HK_ASSERT(id, a) //nothing 
  158. # define HK_ASSERT2(id, a, TEXT) //nothing 
  159. #   endif 
  160. #endif
  161. // Critical asserts - these will trigger breakpoints on the SPU. Additionally, they show up as comments in the assembly file.
  162. // On non-SPU platforms, they revert to normal asserts.
  163. #ifdef HK_PLATFORM_PS3_SPU
  164. #  ifdef HK_DEBUG_SPU
  165. # define HK_CRITICAL_ASSERT2(id, a, msg) HK_MULTILINE_MACRO_BEGIN 
  166. if ( !(a) )
  167. {
  168. HK_ASM_SEP("tHK_CRITICAL_ASSERT2(" #id ", " #a ", " #msg ");" );
  169. HK_BREAKPOINT(id);
  170. }
  171. HK_MULTILINE_MACRO_END
  172. # define HK_CRITICAL_ASSERT(id, a) HK_MULTILINE_MACRO_BEGIN 
  173. if ( !(a) )
  174. {
  175. HK_ASM_SEP("tHK_CRITICAL_ASSERT(" #id ", " #a ");" );
  176. HK_BREAKPOINT(id);
  177. }
  178. HK_MULTILINE_MACRO_END
  179. #  else // SPU HK_DEBUG_SPU
  180. # define HK_CRITICAL_ASSERT2(id, a, msg)
  181. # define HK_CRITICAL_ASSERT(id, a)
  182. #  endif // SPU HK_DEBUG_SPU
  183. #else
  184. # define HK_CRITICAL_ASSERT  HK_ASSERT
  185. # define HK_CRITICAL_ASSERT2 HK_ASSERT2
  186. #endif
  187. #define HK_CHECK_ALIGN16(ADDR) HK_ASSERT(0xff00ff00, (hkUlong(ADDR) & 0xf) == 0 )
  188. #define HK_WARN_IF(check,id,TEXT) HK_ON_DEBUG(if (check) HK_WARN(id,TEXT))
  189. #define HK_WARN_ONCE_IF(check,id,TEXT) HK_ON_DEBUG(if (check) HK_WARN_ONCE(id,TEXT))
  190. #endif // HKBASE_HKERROR_H
  191. /*
  192. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  193. * Confidential Information of Havok.  (C) Copyright 1999-2009
  194. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  195. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  196. * rights, and intellectual property rights in the Havok software remain in
  197. * Havok and/or its suppliers.
  198. * Use of this software for evaluation purposes is subject to and indicates
  199. * acceptance of the End User licence Agreement for this product. A copy of
  200. * the license is included with this software and is also available at www.havok.com/tryhavok.
  201. */