|
World of Rigid Bodies (WoRB)
|
00001 /** 00002 * @file Platform.cpp 00003 * @brief Implementation of platform dependent functions (like Pause()). 00004 * @author Mikica Kocic 00005 * @version 0.2 00006 * @date 2012-04-29 00007 * @copyright GNU Public License. 00008 */ 00009 00010 #ifdef MATLAB_MEX_FILE 00011 #include "mex.h" 00012 #endif 00013 00014 #ifdef _WIN32 00015 #include <Windows.h> 00016 #pragma warning(disable:4996) // vsprintf warning 00017 #else 00018 #include <unistd.h> 00019 #endif 00020 00021 #include <cstdarg> // va_list 00022 #include <cstdio> // vsprintf 00023 #include <cstdlib> // exit 00024 00025 namespace WoRB 00026 { 00027 void Pause( unsigned long ms ) 00028 { 00029 #ifdef _WIN32 00030 Sleep( ms ); 00031 #else 00032 usleep( ms * 1000ul ); 00033 #endif 00034 } 00035 00036 void Printf( const char* format, ... ) 00037 { 00038 va_list args; 00039 va_start( args, format ); 00040 00041 char buffer[ 2048 ]; 00042 vsprintf( buffer, format, args ); 00043 00044 va_end( args ); 00045 00046 #ifdef MATLAB_MEX_FILE 00047 mexPrintf( "%s", buffer ); 00048 // mexEvalString( "drawnow;" ); // = flush 00049 #else 00050 fputs( buffer, stdout ); 00051 fflush( stdout ); 00052 #endif 00053 } 00054 00055 void glutForegroundWindow () 00056 { 00057 #ifdef _WIN32 00058 00059 HWND hWnd = FindWindow( TEXT("FREEGLUT"), NULL ); 00060 if ( hWnd ) { 00061 SetForegroundWindow( hWnd ); 00062 } 00063 00064 #endif 00065 } 00066 00067 // Handles glut errors. 00068 // 00069 void OnGlutError( const char* format, va_list args ) 00070 { 00071 char buffer[ 2048 ]; 00072 vsprintf( buffer, format, args ); 00073 00074 Printf( "WoRB: %s\n", buffer ); 00075 } 00076 00077 // Handles glut warnings. 00078 // 00079 void OnGlutWarning( const char* format, va_list args ) 00080 { 00081 char buffer[ 2048 ]; 00082 vsprintf( buffer, format, args ); 00083 00084 Printf( "WoRB: %s\n", buffer ); 00085 } 00086 00087 // Reports a severe error and quits. 00088 // 00089 void SevereError( const char* errorId, const char* errorMsg, ... ) 00090 { 00091 va_list args; 00092 va_start( args, errorMsg ); 00093 char buffer[ 1024 ]; 00094 vsprintf( buffer, errorMsg, args ); 00095 va_end( args ); 00096 00097 #if MATLAB_MEX_FILE 00098 mexErrMsgIdAndTxt( errorId, "%s", buffer ); 00099 #else 00100 fputs( errorId, stderr ); 00101 fputs( "\n", stderr ); 00102 fputs( buffer, stderr ); 00103 fflush( stderr ); 00104 exit(0); 00105 #endif 00106 } 00107 } 00108 00109 ///////////////////////////////////////////////////////////////////////////////////////// 00110 // Redefinitions of new/delete C++ operators to use MATLAB's mxMalloc/mxFree. 00111 00112 #ifdef MATLAB_MEX_FILE 00113 00114 #include <new> 00115 00116 void* operator new ( size_t size); 00117 void* operator new ( size_t size, const std::nothrow_t& ) throw(); 00118 void* operator new[] ( size_t size ); 00119 void* operator new[] ( size_t size, const std::nothrow_t& ) throw(); 00120 void operator delete ( void* p ); 00121 void operator delete[] ( void* p ); 00122 00123 void* operator new( size_t size ) 00124 { 00125 void* ptr = mxMalloc( size ); 00126 if ( ! ptr ) { 00127 throw std::bad_alloc (); 00128 } 00129 mexMakeMemoryPersistent( ptr ); 00130 00131 #ifdef DEBUG 00132 WoRB::Printf( "WoRB: Alloc %p, new %u octets\n", ptr, size ); 00133 #endif 00134 00135 return ptr; 00136 } 00137 00138 void* operator new( size_t size, const std::nothrow_t& ) throw() 00139 { 00140 void* ptr = mxMalloc( size ); 00141 mexMakeMemoryPersistent( ptr ); 00142 00143 #ifdef DEBUG 00144 WoRB::Printf( "WoRB: Alloc %p, new %u octets (nothrow)\n", ptr, size ); 00145 #endif 00146 00147 return ptr; 00148 } 00149 00150 void* operator new[] ( size_t size ) 00151 { 00152 void* ptr = mxMalloc( size ); 00153 if ( ! ptr ) { 00154 throw std::bad_alloc (); 00155 } 00156 00157 mexMakeMemoryPersistent( ptr ); 00158 00159 #ifdef DEBUG 00160 WoRB::Printf( "WoRB: Alloc %p, new[] %u octets\n", ptr, size ); 00161 #endif 00162 00163 return ptr; 00164 } 00165 00166 void* operator new[] ( size_t size, const std::nothrow_t& ) throw() 00167 { 00168 void* ptr = mxMalloc( size ); 00169 00170 #ifdef DEBUG 00171 WoRB::Printf( "WoRB: Alloc %p, new[] %u octets (nothrow)\n", ptr, size ); 00172 #endif 00173 00174 return ptr; 00175 } 00176 00177 void operator delete( void* ptr ) 00178 { 00179 if ( ptr ) 00180 { 00181 #ifdef DEBUG 00182 WoRB::Printf( "WoRB: Free %p, delete\n", ptr ); 00183 #endif 00184 00185 mxFree( ptr ); 00186 } 00187 } 00188 void operator delete[] ( void* ptr ) 00189 { 00190 if ( ptr ) 00191 { 00192 #ifdef DEBUG 00193 WoRB::Printf( "WoRB: Free %p, delete[]\n", ptr ); 00194 #endif 00195 00196 mxFree( ptr ); 00197 } 00198 } 00199 00200 #endif // MATLAB_MEX_FILE