diff --git a/examples/ExampleBrowser/ExampleEntries.cpp b/examples/ExampleBrowser/ExampleEntries.cpp index 17b920fa9..e6f84bab3 100644 --- a/examples/ExampleBrowser/ExampleEntries.cpp +++ b/examples/ExampleBrowser/ExampleEntries.cpp @@ -215,6 +215,11 @@ static ExampleEntry gDefaultExamples[]= ExampleEntry(1,"Physics Server", "Create a physics server that communicates with a physics client over shared memory", PhysicsServerCreateFunc), + ExampleEntry(1,"Physics Server (Logging)", "Create a physics server that communicates with a physics client over shared memory. It will log all commands to a file.", + PhysicsServerCreateFunc,PHYSICS_SERVER_ENABLE_COMMAND_LOGGING), + ExampleEntry(1,"Physics Server (Replay Log)", "Create a physics server that replay a command log from disk.", + PhysicsServerCreateFunc,PHYSICS_SERVER_REPLAY_FROM_COMMAND_LOG), + ExampleEntry(1, "Physics Client", "Create a physics client that can communicate with a physics server over shared memory", PhysicsClientCreateFunc), #ifdef ENABLE_LUA ExampleEntry(1,"Lua Script", "Create the dynamics world, collision shapes and rigid bodies using Lua scripting", diff --git a/examples/ExampleBrowser/OpenGLExampleBrowser.cpp b/examples/ExampleBrowser/OpenGLExampleBrowser.cpp index 66b64e99e..bc3356380 100644 --- a/examples/ExampleBrowser/OpenGLExampleBrowser.cpp +++ b/examples/ExampleBrowser/OpenGLExampleBrowser.cpp @@ -71,6 +71,7 @@ extern bool useShadowMap; static bool visualWireframe=false; static bool renderVisualGeometry=true; static bool renderGrid = true; +static bool renderGui = true; static bool enable_experimental_opencl = false; int gDebugDrawFlags = 0; @@ -170,6 +171,7 @@ void MyKeyboardCallback(int key, int state) if (key=='g' && state) { renderGrid = !renderGrid; + renderGui = !renderGui; } @@ -1041,7 +1043,7 @@ void OpenGLExampleBrowser::update(float deltaTime) } static int toggle = 1; - if (renderGrid) + if (renderGui) { if (!pauseSimulation) processProfileData(s_profWindow,false); diff --git a/examples/SharedMemory/PhysicsServer.cpp b/examples/SharedMemory/PhysicsServer.cpp index 154249c39..7218f0ae3 100644 --- a/examples/SharedMemory/PhysicsServer.cpp +++ b/examples/SharedMemory/PhysicsServer.cpp @@ -108,18 +108,82 @@ struct InternalBodyHandle : public InteralBodyData return m_nextFreeHandle; } }; + +class btCommandChunk +{ +public: + int m_chunkCode; + int m_length; + void *m_oldPtr; + int m_dna_nr; + int m_number; +}; + struct CommandLogger { FILE* m_file; + + void writeHeader(unsigned char* buffer) const + { +#ifdef BT_USE_DOUBLE_PRECISION + memcpy(buffer, "BT3CMDd", 7); +#else + memcpy(buffer, "BT3CMDf", 7); +#endif //BT_USE_DOUBLE_PRECISION + + int littleEndian= 1; + littleEndian= ((char*)&littleEndian)[0]; + + if (sizeof(void*)==8) + { + buffer[7] = '-'; + } else + { + buffer[7] = '_'; + } + + if (littleEndian) + { + buffer[8]='v'; + } else + { + buffer[8]='V'; + } + + buffer[9] = 0; + buffer[10] = 0; + buffer[11] = 0; + + int ver = btGetVersion(); + if (ver>=0 && ver<999) + { + sprintf((char*)&buffer[9],"%d",ver); + } + + } + void logCommand(SharedMemoryBlock* testBlock1) { - //fwrite(buf,buffSize+sizeof(int),1,m_file); + btCommandChunk chunk; + chunk.m_chunkCode = testBlock1->m_clientCommands[0].m_type; + chunk.m_oldPtr = 0; + chunk.m_dna_nr = 0; + chunk.m_length = sizeof(SharedMemoryCommand); + chunk.m_number = 1; + fwrite((const char*)&chunk,sizeof(btCommandChunk), 1,m_file); + fwrite((const char*)&testBlock1->m_clientCommands[0],sizeof(SharedMemoryCommand),1,m_file); } CommandLogger(const char* fileName) { m_file = fopen(fileName,"wb"); + unsigned char buf[15]; + buf[12] = 12; + buf[13] = 13; + buf[14] = 14; + writeHeader(buf); + fwrite(buf,12,1,m_file); } virtual ~CommandLogger() { @@ -127,6 +191,41 @@ struct CommandLogger } }; + +struct CommandLogPlayback +{ + unsigned char* m_header[12]; + FILE* m_file; + + CommandLogPlayback(const char* fileName) + { + m_file = fopen(fileName,"rb"); + if (m_file) + { + fread(m_header,12,1,m_file); + } + } + virtual ~CommandLogPlayback() + { + if (m_file) + { + fclose(m_file); + m_file=0; + } + } + bool processNextCommand(SharedMemoryCommand* cmd) + { + btCommandChunk chunk; + size_t s = fread((void*)&chunk,sizeof(btCommandChunk),1,m_file); + if (s==1) + { + s = fread(cmd,sizeof(SharedMemoryCommand),1,m_file); + return (s==1); + } + return false; + } +}; + struct PhysicsServerInternalData { ///handle management @@ -219,6 +318,8 @@ struct PhysicsServerInternalData SharedMemoryInterface* m_sharedMemory; SharedMemoryBlock* m_testBlock1; CommandLogger* m_commandLogger; + CommandLogPlayback* m_logPlayback; + bool m_isConnected; btScalar m_physicsDeltaTime; btAlignedObjectArray m_multiBodyJointFeedbacks; @@ -260,6 +361,7 @@ struct PhysicsServerInternalData :m_sharedMemory(0), m_testBlock1(0), m_commandLogger(0), + m_logPlayback(0), m_isConnected(false), m_physicsDeltaTime(1./240.), m_dynamicsWorld(0), @@ -756,6 +858,19 @@ void PhysicsServerSharedMemory::processClientCommands() { if (m_data->m_isConnected && m_data->m_testBlock1) { + if (m_data->m_logPlayback) + { + if (m_data->m_testBlock1->m_numServerCommands>m_data->m_testBlock1->m_numProcessedServerCommands) + { + m_data->m_testBlock1->m_numProcessedServerCommands++; + } + //push a command from log file + bool hasCommand = m_data->m_logPlayback->processNextCommand(&m_data->m_testBlock1->m_clientCommands[0]); + if (hasCommand) + { + m_data->m_testBlock1->m_numClientCommands++; + } + } ///we ignore overflow of integer for now if (m_data->m_testBlock1->m_numClientCommands> m_data->m_testBlock1->m_numProcessedClientCommands) { @@ -1738,3 +1853,9 @@ void PhysicsServerSharedMemory::enableCommandLogging(bool enable, const char* fi } } } + +void PhysicsServerSharedMemory::replayFromLogFile(const char* fileName) +{ + CommandLogPlayback* pb = new CommandLogPlayback(fileName); + m_data->m_logPlayback = pb; +} \ No newline at end of file diff --git a/examples/SharedMemory/PhysicsServer.h b/examples/SharedMemory/PhysicsServer.h index e3980792b..d5730aad4 100644 --- a/examples/SharedMemory/PhysicsServer.h +++ b/examples/SharedMemory/PhysicsServer.h @@ -55,6 +55,8 @@ public: void renderScene(); void enableCommandLogging(bool enable, const char* fileName); + void replayFromLogFile(const char* fileName); + }; diff --git a/examples/SharedMemory/PhysicsServerExample.cpp b/examples/SharedMemory/PhysicsServerExample.cpp index 9cf3b2049..2d9fed993 100644 --- a/examples/SharedMemory/PhysicsServerExample.cpp +++ b/examples/SharedMemory/PhysicsServerExample.cpp @@ -33,6 +33,13 @@ public: { m_physicsServer.enableCommandLogging(true,"BulletPhysicsCommandLog.bin"); } + + void replayFromLogFile() + { + m_physicsServer.replayFromLogFile("BulletPhysicsCommandLog.bin"); + } + + virtual void resetCamera() { @@ -273,6 +280,10 @@ class CommonExampleInterface* PhysicsServerCreateFunc(struct CommonExampleOpt { example->enableCommandLogging(); } + if (options.m_option & PHYSICS_SERVER_REPLAY_FROM_COMMAND_LOG) + { + example->replayFromLogFile(); + } return example; } diff --git a/examples/SharedMemory/PhysicsServerExample.h b/examples/SharedMemory/PhysicsServerExample.h index fbd65b43b..e88074230 100644 --- a/examples/SharedMemory/PhysicsServerExample.h +++ b/examples/SharedMemory/PhysicsServerExample.h @@ -4,6 +4,7 @@ enum PhysicsServerOptions { PHYSICS_SERVER_ENABLE_COMMAND_LOGGING=1, + PHYSICS_SERVER_REPLAY_FROM_COMMAND_LOG=2, }; class CommonExampleInterface* PhysicsServerCreateFunc(struct CommonExampleOptions& options); diff --git a/examples/SharedMemory/SharedMemoryBlock.h b/examples/SharedMemory/SharedMemoryBlock.h index 36cd60f35..fa80c36c9 100644 --- a/examples/SharedMemory/SharedMemoryBlock.h +++ b/examples/SharedMemory/SharedMemoryBlock.h @@ -2,7 +2,7 @@ #define SHARED_MEMORY_BLOCK_H #define SHARED_MEMORY_MAGIC_NUMBER 64738 -#define SHARED_MEMORY_MAX_COMMANDS 32 +#define SHARED_MEMORY_MAX_COMMANDS 4 #define SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE (256*1024) #include "SharedMemoryCommands.h" diff --git a/examples/SharedMemory/SharedMemoryCommands.h b/examples/SharedMemory/SharedMemoryCommands.h index 6016a3ba1..11a99917e 100644 --- a/examples/SharedMemory/SharedMemoryCommands.h +++ b/examples/SharedMemory/SharedMemoryCommands.h @@ -26,7 +26,7 @@ #define SHARED_MEMORY_SERVER_TEST_C -#define MAX_DEGREE_OF_FREEDOM 256 +#define MAX_DEGREE_OF_FREEDOM 64 #define MAX_NUM_SENSORS 256 #define MAX_URDF_FILENAME_LENGTH 1024 #define MAX_FILENAME_LENGTH MAX_URDF_FILENAME_LENGTH