| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982 |
- #include "GraphicsServerExample.h"
- #include "../CommonInterfaces/CommonGraphicsAppInterface.h"
- #include "../CommonInterfaces/CommonRenderInterface.h"
- #include "PosixSharedMemory.h"
- #include "Win32SharedMemory.h"
- #include "../CommonInterfaces/CommonExampleInterface.h"
- #include "LinearMath/btTransform.h"
- #include "../CommonInterfaces/CommonGUIHelperInterface.h"
- #include "Bullet3Common/b3AlignedObjectArray.h"
- #include "GraphicsSharedMemoryBlock.h"
- #include "../CommonInterfaces/CommonGUIHelperInterface.h"
- #include "SharedMemoryPublic.h"
- #include "../MultiThreading/b3ThreadSupportInterface.h"
- #include "../Utils/b3Clock.h"
- #ifdef BT_ENABLE_CLSOCKET
- #include "PassiveSocket.h" // Include header for active socket object definition
- #include <stdio.h>
- #include "../CommonInterfaces/CommonGUIHelperInterface.h"
- #include "Bullet3Common/b3CommandLineArgs.h"
- #include "RemoteGUIHelper.h"
- #include "GraphicsSharedMemoryPublic.h"
- #include "GraphicsSharedMemoryCommands.h"
- bool gVerboseNetworkMessagesServer = true;
- void MySerializeInt(unsigned int sz, unsigned char* output)
- {
- unsigned int tmp = sz;
- output[0] = tmp & 255;
- tmp = tmp >> 8;
- output[1] = tmp & 255;
- tmp = tmp >> 8;
- output[2] = tmp & 255;
- tmp = tmp >> 8;
- output[3] = tmp & 255;
- }
- void submitStatus(CActiveSocket* pClient, GraphicsSharedMemoryStatus& serverStatus, b3AlignedObjectArray<char>& buffer)
- {
- b3AlignedObjectArray<unsigned char> packetData;
- unsigned char* statBytes = (unsigned char*)&serverStatus;
- //create packetData with [int packetSizeInBytes, status, streamBytes)
- packetData.resize(4 + sizeof(GraphicsSharedMemoryStatus) + serverStatus.m_numDataStreamBytes);
- int sz = packetData.size();
- int curPos = 0;
- if (gVerboseNetworkMessagesServer)
- {
- printf("buffer.size = %d\n", buffer.size());
- printf("serverStatus packed size = %d\n", sz);
- }
- MySerializeInt(sz, &packetData[curPos]);
- curPos += 4;
- for (int i = 0; i < sizeof(GraphicsSharedMemoryStatus); i++)
- {
- packetData[i + curPos] = statBytes[i];
- }
- curPos += sizeof(GraphicsSharedMemoryStatus);
- if (gVerboseNetworkMessagesServer)
- printf("serverStatus.m_numDataStreamBytes=%d\n", serverStatus.m_numDataStreamBytes);
- for (int i = 0; i < serverStatus.m_numDataStreamBytes; i++)
- {
- packetData[i + curPos] = buffer[i];
- }
- pClient->Send(&packetData[0], packetData.size());
- if (gVerboseNetworkMessagesServer)
- printf("pClient->Send serverStatus: %d\n", packetData.size());
- }
- #endif //BT_ENABLE_CLSOCKET
- #define MAX_GRAPHICS_SHARED_MEMORY_BLOCKS 1
- struct TCPArgs
- {
- TCPArgs()
- : m_cs(0),
- m_port(6667),
- m_numClientCommands(0),
- m_numServerCommands(0),
- m_cmdPtr(0)
- {
- m_dataSlots.resize(10);
- }
-
- void submitCommand()
- {
- m_cs->lock();
- m_serverStatus.m_type = GFX_CMD_CLIENT_COMMAND_FAILED;
- m_serverStatus.m_numDataStreamBytes = 0;
- btAssert(m_numServerCommands == m_numClientCommands);
- m_numClientCommands++;
- m_cs->unlock();
- }
- void processCommand()
- {
- m_cs->lock();
- btAssert(m_numServerCommands == (m_numClientCommands - 1));
- m_numServerCommands++;
- m_cs->unlock();
- }
- bool isCommandOutstanding()
- {
- m_cs->lock();
- bool result = m_numClientCommands > m_numServerCommands;
- m_cs->unlock();
- return result;
- }
- b3CriticalSection* m_cs;
- int m_port;
- b3AlignedObjectArray< b3AlignedObjectArray<unsigned char> > m_dataSlots;
- int m_numClientCommands;
- int m_numServerCommands;
- GraphicsSharedMemoryCommand* m_cmdPtr;
- GraphicsSharedMemoryStatus m_serverStatus;
- };
- struct TCPThreadLocalStorage
- {
- int threadId;
- };
- enum TCPCommunicationEnums
- {
- eTCPRequestTerminate = 11,
- eTCPIsUnInitialized,
- eTCPIsInitialized,
- eTCPInitializationFailed,
- eTCPHasTerminated
- };
- void TCPThreadFunc(void* userPtr, void* lsMemory)
- {
- printf("TCPThreadFunc thread started\n");
- TCPArgs* args = (TCPArgs*)userPtr;
- //int workLeft = true;
- b3Clock clock;
- clock.reset();
- b3Clock sleepClock;
- bool init = true;
- if (init)
- {
- unsigned int cachedSharedParam = eTCPIsInitialized;
- args->m_cs->lock();
- args->m_cs->setSharedParam(0, eTCPIsInitialized);
- args->m_cs->unlock();
- double deltaTimeInSeconds = 0;
- int numCmdSinceSleep1ms = 0;
- unsigned long long int prevTime = clock.getTimeMicroseconds();
- #ifdef BT_ENABLE_CLSOCKET
- b3Clock clock;
- double timeOutInSeconds = 10;
-
- bool isPhysicsClientConnected = true;
- bool exitRequested = false;
-
- if (!isPhysicsClientConnected)
- {
- printf("TCP thread error connecting to shared memory. Machine needs a reboot?\n");
- }
- btAssert(isPhysicsClientConnected);
-
- printf("Starting TCP server using port %d\n", args->m_port);
- CPassiveSocket socket;
- CActiveSocket* pClient = NULL;
- //--------------------------------------------------------------------------
- // Initialize our socket object
- //--------------------------------------------------------------------------
- socket.Initialize();
- socket.Listen("localhost", args->m_port);
- socket.SetBlocking();
- int curNumErr = 0;
- #endif
- do
- {
-
- {
- b3Clock::usleep(0);
- }
- ///////////////////////////////
- #ifdef BT_ENABLE_CLSOCKET
- {
- b3Clock::usleep(0);
- if ((pClient = socket.Accept()) != NULL)
- {
- socket.SetReceiveTimeout(60, 0);// (1, 0);
- socket.SetSendTimeout(60, 0);
- b3AlignedObjectArray<char> bytesReceived;
- int clientPort = socket.GetClientPort();
- if (gVerboseNetworkMessagesServer)
- printf("connected from %s:%d\n", socket.GetClientAddr(), clientPort);
- if (pClient->Receive(4))
- {
- int clientKey = *(int*)pClient->GetData();
- if (clientKey == GRAPHICS_SHARED_MEMORY_MAGIC_NUMBER)
- {
- printf("Client version OK %d\n", clientKey);
- }
- else
- {
- printf("Server version (%d) mismatches Client Version (%d)\n", GRAPHICS_SHARED_MEMORY_MAGIC_NUMBER, clientKey);
- continue;
- }
- }
- //----------------------------------------------------------------------
- // Receive request from the client.
- //----------------------------------------------------------------------
-
- while (cachedSharedParam != eTCPRequestTerminate)
- {
-
- bool receivedData = false;
- int maxLen = 4 + sizeof(GraphicsSharedMemoryCommand) + GRAPHICS_SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE;
-
-
- if (pClient->Receive(maxLen))
- {
-
- //heuristic to detect disconnected clients
- CSimpleSocket::CSocketError err = pClient->GetSocketError();
- if (err != CSimpleSocket::SocketSuccess || !pClient->IsSocketValid())
- {
- b3Clock::usleep(100);
- curNumErr++;
- if (curNumErr > 100)
- {
- ///printf("TCP Connection error = %d, curNumErr = %d\n", (int)err, curNumErr);
-
- }
- }
- curNumErr = 0;
- char* msg2 = (char*)pClient->GetData();
- int numBytesRec2 = pClient->GetBytesReceived();
- if (gVerboseNetworkMessagesServer)
- printf("numBytesRec2=%d\n", numBytesRec2);
- if (numBytesRec2 < 0)
- {
- numBytesRec2 = 0;
- }
- int curSize = bytesReceived.size();
- bytesReceived.resize(bytesReceived.size() + numBytesRec2);
- for (int i = 0; i < numBytesRec2; i++)
- {
- bytesReceived[curSize + i] = msg2[i];
- }
- if (bytesReceived.size() >= 4)
- {
- int numBytesRec = bytesReceived.size();
- if (numBytesRec >= 10)
- {
- if (strncmp(&bytesReceived[0], "disconnect", 10) == 0)
- {
- printf("Disconnect request received\n");
- bytesReceived.clear();
- break;
- }
-
- }
- if (gVerboseNetworkMessagesServer)
- {
- printf("received message length [%d]\n", numBytesRec);
- }
- receivedData = true;
-
- args->m_cmdPtr = 0;
-
- int type = *(int*)&bytesReceived[0];
-
- if (numBytesRec == sizeof(GraphicsSharedMemoryCommand))
- {
- args->m_cmdPtr = (GraphicsSharedMemoryCommand*)&bytesReceived[0];
- }
-
- if (args->m_cmdPtr)
- {
-
- b3AlignedObjectArray<char> buffer;
- buffer.resize(GRAPHICS_SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
- bool hasStatus = true;
- if (gVerboseNetworkMessagesServer)
- printf("processing command:");
- switch (args->m_cmdPtr->m_type)
- {
- case GFX_CMD_0:
- {
- int axis = args->m_cmdPtr->m_upAxisYCommand.m_enableUpAxisY ? 1 : 2;
- args->submitCommand();
- while (args->isCommandOutstanding())
- {
- clock.usleep(0);
- }
- bool done = false;
- //guiHelper.setUpAxis(axis);
-
- if (gVerboseNetworkMessagesServer)
- printf("GFX_CMD_0\n");
- break;
- }
- case GFX_CMD_SET_VISUALIZER_FLAG:
- {
- //disable single step rendering for GraphicsServer
- if (args->m_cmdPtr->m_visualizerFlagCommand.m_visualizerFlag == COV_ENABLE_SINGLE_STEP_RENDERING)
- {
- args->m_cmdPtr->m_visualizerFlagCommand.m_visualizerFlag = 0;
- }
- args->submitCommand();
- while (args->isCommandOutstanding())
- {
- clock.usleep(0);
- }
- //guiHelper.setVisualizerFlag(
- // args->m_cmdPtr->m_visualizerFlagCommand.m_visualizerFlag,
- // args->m_cmdPtr->m_visualizerFlagCommand.m_enable);
- //serverStatus.m_type = GFX_CMD_CLIENT_COMMAND_COMPLETED;
- if (gVerboseNetworkMessagesServer)
- printf("GFX_CMD_SET_VISUALIZER_FLAG\n");
- break;
- }
- case GFX_CMD_UPLOAD_DATA:
- {
- int slot = args->m_cmdPtr->m_uploadDataCommand.m_dataSlot;
- int numBytes = args->m_cmdPtr->m_uploadDataCommand.m_numBytes;
- submitStatus(pClient, args->m_serverStatus, buffer);
- //now receive numBytes
- if (gVerboseNetworkMessagesServer)
- printf("GFX_CMD_UPLOAD_DATA receiving data\n");
- int received = 0;
- int offset = 0;
- args->m_dataSlots[slot].resize(numBytes);
- while (received < numBytes)
- {
- if (pClient->Receive(args->m_cmdPtr->m_uploadDataCommand.m_numBytes))
- {
- //heuristic to detect disconnected clients
- CSimpleSocket::CSocketError err = pClient->GetSocketError();
- if (err != CSimpleSocket::SocketSuccess || !pClient->IsSocketValid())
- {
- curNumErr++;
- //printf("TCP Connection error = %d, curNumErr = %d\n", (int)err, curNumErr);
- }
- char* msg2 = (char*)pClient->GetData();
- int numBytesRec2 = pClient->GetBytesReceived();
- if (gVerboseNetworkMessagesServer)
- printf("received %d bytes (total=%d)\n", numBytesRec2, received);
-
- for (int i = 0; i < numBytesRec2; i++)
- {
- args->m_dataSlots[slot][i+ offset] = msg2[i];
- }
- offset += numBytesRec2;
- received += numBytesRec2;
- }
- }
- if (gVerboseNetworkMessagesServer)
- printf("received all bytes!\n");
- args->m_serverStatus.m_type = GFX_CMD_CLIENT_COMMAND_COMPLETED;
- if (gVerboseNetworkMessagesServer)
- printf("GFX_CMD_UPLOAD_DATA\n");
- break;
- }
- case GFX_CMD_REGISTER_TEXTURE:
- {
- args->submitCommand();
- while (args->isCommandOutstanding())
- {
- clock.usleep(0);
- }
- //const unsigned char* texels = (const unsigned char*)&args->m_dataSlots[0][0];
- //args->m_serverStatus.m_registerTextureStatus.m_textureId = guiHelper.registerTexture(texels, args->m_cmdPtr->m_registerTextureCommand.m_width,
- // args->m_cmdPtr->m_registerTextureCommand.m_height);
- //serverStatus.m_type = GFX_CMD_REGISTER_TEXTURE_COMPLETED;
- if (gVerboseNetworkMessagesServer)
- printf("GFX_CMD_REGISTER_TEXTURE\n");
- break;
- }
- case GFX_CMD_REGISTER_GRAPHICS_SHAPE:
- {
- args->submitCommand();
- while (args->isCommandOutstanding())
- {
- clock.usleep(0);
- }
- if (gVerboseNetworkMessagesServer)
- printf("GFX_CMD_REGISTER_GRAPHICS_SHAPE\n");
- break;
- }
- case GFX_CMD_REGISTER_GRAPHICS_INSTANCE:
- {
- args->submitCommand();
- while (args->isCommandOutstanding())
- {
- clock.usleep(0);
- }
- if (gVerboseNetworkMessagesServer)
- printf("GFX_CMD_REGISTER_GRAPHICS_INSTANCE\n");
- break;
- }
- case GFX_CMD_SYNCHRONIZE_TRANSFORMS:
- {
- args->submitCommand();
- while (args->isCommandOutstanding())
- {
- clock.usleep(0);
- }
- if (gVerboseNetworkMessagesServer)
- printf("GFX_CMD_SYNCHRONIZE_TRANSFORMS\n");
- break;
- }
- case GFX_CMD_REMOVE_ALL_GRAPHICS_INSTANCES:
- {
- args->submitCommand();
- while (args->isCommandOutstanding())
- {
- clock.usleep(0);
- }
- if (gVerboseNetworkMessagesServer)
- printf("GFX_CMD_REMOVE_ALL_GRAPHICS_INSTANCES\n");
- break;
- }
- case GFX_CMD_REMOVE_SINGLE_GRAPHICS_INSTANCE:
- {
- args->submitCommand();
- while (args->isCommandOutstanding())
- {
- clock.usleep(0);
- }
- if (gVerboseNetworkMessagesServer)
- printf("GFX_CMD_REMOVE_SINGLE_GRAPHICS_INSTANCE\n");
- break;
- }
- case GFX_CMD_CHANGE_RGBA_COLOR:
- {
- args->submitCommand();
- while (args->isCommandOutstanding())
- {
- clock.usleep(0);
- }
- if (gVerboseNetworkMessagesServer)
- printf("GFX_CMD_CHANGE_RGBA_COLOR\n");
- break;
- }
- case GFX_CMD_CHANGE_SCALING:
- {
- args->submitCommand();
- while (args->isCommandOutstanding())
- {
- clock.usleep(0);
- }
- if (gVerboseNetworkMessagesServer)
- printf("GFX_CMD_CHANGE_SCALING\n");
- break;
- }
- case GFX_CMD_GET_CAMERA_INFO:
- {
- args->submitCommand();
- while (args->isCommandOutstanding())
- {
- clock.usleep(0);
- }
- //bool RemoteGUIHelper::getCameraInfo(int* width, int* height,
- // float viewMatrix[16], float projectionMatrix[16],
- // float camUp[3], float camForward[3], float hor[3], float vert[3],
- // float* yaw, float* pitch, float* camDist, float camTarget[3]) const
- #if 0
- guiHelper.getCameraInfo(&serverStatus.m_getCameraInfoStatus.width,
- &serverStatus.m_getCameraInfoStatus.height,
- serverStatus.m_getCameraInfoStatus.viewMatrix,
- serverStatus.m_getCameraInfoStatus.projectionMatrix,
- serverStatus.m_getCameraInfoStatus.camUp,
- serverStatus.m_getCameraInfoStatus.camForward,
- serverStatus.m_getCameraInfoStatus.hor,
- serverStatus.m_getCameraInfoStatus.vert,
- &serverStatus.m_getCameraInfoStatus.yaw,
- &serverStatus.m_getCameraInfoStatus.pitch,
- &serverStatus.m_getCameraInfoStatus.camDist,
- serverStatus.m_getCameraInfoStatus.camTarget);
- serverStatus.m_type = GFX_CMD_GET_CAMERA_INFO_COMPLETED;
- #endif
- if (gVerboseNetworkMessagesServer)
- printf("GFX_CMD_GET_CAMERA_INFO\n");
- break;
- }
- case GFX_CMD_INVALID:
- case GFX_CMD_MAX_CLIENT_COMMANDS:
- default:
- {
- printf("UNKNOWN COMMAND!\n");
- btAssert(0);
- hasStatus = false;
- }
- }
- double startTimeSeconds = clock.getTimeInSeconds();
- double curTimeSeconds = clock.getTimeInSeconds();
- if (gVerboseNetworkMessagesServer)
- {
- //printf("buffer.size = %d\n", buffer.size());
- printf("serverStatus.m_numDataStreamBytes = %d\n", args->m_serverStatus.m_numDataStreamBytes);
- }
- if (hasStatus)
- {
- submitStatus(pClient, args->m_serverStatus, buffer);
- }
-
- bytesReceived.clear();
- }
- else
- {
- //likely an incomplete packet, let's append more bytes
- //printf("received packet with unknown contents\n");
- }
- }
- }
- if (!receivedData)
- {
- //printf("Didn't receive data.\n");
- }
- }
- printf("Disconnecting client.\n");
- pClient->Close();
- delete pClient;
- }
- }
- #endif //BT_ENABLE_CLSOCKET
- ///////////////////////////////
- args->m_cs->lock();
- cachedSharedParam = args->m_cs->getSharedParam(0);
- args->m_cs->unlock();
- } while (cachedSharedParam != eTCPRequestTerminate);
- #ifdef BT_ENABLE_CLSOCKET
- socket.Close();
- socket.Shutdown(CSimpleSocket::Both);
- #endif
- }
- else
- {
- args->m_cs->lock();
- args->m_cs->setSharedParam(0, eTCPInitializationFailed);
- args->m_cs->unlock();
- }
-
- printf("TCPThreadFunc thread exit\n");
- //do nothing
- }
- void* TCPlsMemoryFunc()
- {
- //don't create local store memory, just return 0
- return new TCPThreadLocalStorage;
- }
- void TCPlsMemoryReleaseFunc(void* ptr)
- {
- TCPThreadLocalStorage* p = (TCPThreadLocalStorage*)ptr;
- delete p;
- }
- #ifndef _WIN32
- #include "../MultiThreading/b3PosixThreadSupport.h"
- b3ThreadSupportInterface* createTCPThreadSupport(int numThreads)
- {
- b3PosixThreadSupport::ThreadConstructionInfo constructionInfo("TCPThreads",
- TCPThreadFunc,
- TCPlsMemoryFunc,
- TCPlsMemoryReleaseFunc,
- numThreads);
- b3ThreadSupportInterface* threadSupport = new b3PosixThreadSupport(constructionInfo);
- return threadSupport;
- }
- #elif defined(_WIN32)
- #include "../MultiThreading/b3Win32ThreadSupport.h"
- b3ThreadSupportInterface* createTCPThreadSupport(int numThreads)
- {
- b3Win32ThreadSupport::Win32ThreadConstructionInfo threadConstructionInfo("TCPThreads", TCPThreadFunc, TCPlsMemoryFunc, TCPlsMemoryReleaseFunc, numThreads);
- b3Win32ThreadSupport* threadSupport = new b3Win32ThreadSupport(threadConstructionInfo);
- return threadSupport;
- }
- #endif
- class GraphicsServerExample : public CommonExampleInterface
- {
- CommonGraphicsApp* m_app;
- GUIHelperInterface* m_guiHelper;
-
- bool m_verboseOutput;
- float m_x;
- float m_y;
- float m_z;
-
- b3ThreadSupportInterface* m_threadSupport;
- TCPArgs m_args;
-
- public:
- GraphicsServerExample(GUIHelperInterface* guiHelper)
- : m_guiHelper(guiHelper),
- m_x(0),
- m_y(0),
- m_z(0)
- {
- m_verboseOutput = true;
-
- m_app = guiHelper->getAppInterface();
- m_app->setUpAxis(2);
- m_threadSupport = createTCPThreadSupport(1);
- m_args.m_cs = m_threadSupport->createCriticalSection();
- m_args.m_cs->setSharedParam(0, eTCPIsUnInitialized);
- m_threadSupport->runTask(B3_THREAD_SCHEDULE_TASK, (void*)&this->m_args, 0);
- bool isUninitialized = true;
- while (isUninitialized)
- {
- m_args.m_cs->lock();
- isUninitialized = (m_args.m_cs->getSharedParam(0) == eTCPIsUnInitialized);
- m_args.m_cs->unlock();
- #ifdef _WIN32
- b3Clock::usleep(1000);
- #endif
- }
- }
- virtual ~GraphicsServerExample()
- {
-
- m_args.m_cs->setSharedParam(0, eTCPRequestTerminate);
- int numActiveThreads = 1;
- while (numActiveThreads)
- {
- int arg0, arg1;
- if (m_threadSupport->isTaskCompleted(&arg0, &arg1, 0))
- {
- numActiveThreads--;
- printf("numActiveThreads = %d\n", numActiveThreads);
- }
- else
- {
- b3Clock::usleep(0);
- }
- };
- m_threadSupport->deleteCriticalSection(m_args.m_cs);
- delete m_threadSupport;
- m_threadSupport = 0;
- }
- virtual void initPhysics()
- {
- }
- virtual void exitPhysics()
- {
- }
-
- void submitServerStatus(GraphicsSharedMemoryStatus& status, int blockIndex)
- {
- }
- bool processCommand(const struct GraphicsSharedMemoryCommand& clientCmd, struct GraphicsSharedMemoryStatus& serverStatusOut)
- {
- //printf("processed command of type:%d\n", clientCmd.m_type);
- B3_PROFILE("processCommand");
- switch (clientCmd.m_type)
- {
- case GFX_CMD_0:
- {
- //either Y or Z can be up axis
- int upAxis = (clientCmd.m_upAxisYCommand.m_enableUpAxisY) ? 1 : 2;
- m_guiHelper->setUpAxis(upAxis);
- serverStatusOut.m_type = GFX_CMD_CLIENT_COMMAND_COMPLETED;
- m_args.processCommand();
- break;
- }
- case GFX_CMD_SET_VISUALIZER_FLAG:
- {
- if ((clientCmd.m_visualizerFlagCommand.m_visualizerFlag != COV_ENABLE_RENDERING) &&
- (clientCmd.m_visualizerFlagCommand.m_visualizerFlag != COV_ENABLE_SINGLE_STEP_RENDERING))
- {
- //printf("clientCmd.m_visualizerFlag.m_visualizerFlag: %d, clientCmd.m_visualizerFlag.m_enable %d\n",
- // clientCmd.m_visualizerFlagCommand.m_visualizerFlag, clientCmd.m_visualizerFlagCommand.m_enable);
- this->m_guiHelper->setVisualizerFlag(clientCmd.m_visualizerFlagCommand.m_visualizerFlag, clientCmd.m_visualizerFlagCommand.m_enable);
- }
- m_args.processCommand();
- break;
- }
- case GFX_CMD_UPLOAD_DATA:
- {
- #if 0
- //printf("uploadData command: curSize=%d, offset=%d, slot=%d", clientCmd.m_uploadDataCommand.m_numBytes, clientCmd.m_uploadDataCommand.m_dataOffset, clientCmd.m_uploadDataCommand.m_dataSlot);
- int dataSlot = clientCmd.m_uploadDataCommand.m_dataSlot;
- int dataOffset = clientCmd.m_uploadDataCommand.m_dataOffset;
- m_dataSlots.resize(dataSlot + 1);
- btAssert(m_dataSlots[dataSlot].size() >= dataOffset);
- m_dataSlots[dataSlot].resize(clientCmd.m_uploadDataCommand.m_numBytes + clientCmd.m_uploadDataCommand.m_dataOffset);
- for (int i = 0; i < clientCmd.m_uploadDataCommand.m_numBytes; i++)
- {
- m_dataSlots[dataSlot][dataOffset + i] = bufferServerToClient[i];
- }
- #endif
- break;
- }
- case GFX_CMD_REGISTER_TEXTURE:
- {
-
- int dataSlot = 0;
- int sizeData = m_args.m_dataSlots[dataSlot].size();
- btAssert(sizeData > 0);
- serverStatusOut.m_type = GFX_CMD_REGISTER_TEXTURE_FAILED;
- if (sizeData)
- {
- unsigned char* texels = &m_args.m_dataSlots[dataSlot][0];
- int textureId = this->m_guiHelper->registerTexture(texels, clientCmd.m_registerTextureCommand.m_width, clientCmd.m_registerTextureCommand.m_height);
- serverStatusOut.m_type = GFX_CMD_REGISTER_TEXTURE_COMPLETED;
- serverStatusOut.m_registerTextureStatus.m_textureId = textureId;
- }
-
- m_args.processCommand();
- break;
- }
- case GFX_CMD_REGISTER_GRAPHICS_SHAPE:
- {
- int verticesSlot = 0;
- int indicesSlot = 1;
- serverStatusOut.m_type = GFX_CMD_REGISTER_GRAPHICS_SHAPE_FAILED;
- const float* vertices = (const float*)&m_args.m_dataSlots[verticesSlot][0];
- const int* indices = (const int*)&m_args.m_dataSlots[indicesSlot][0];
- int numVertices = clientCmd.m_registerGraphicsShapeCommand.m_numVertices;
- int numIndices = clientCmd.m_registerGraphicsShapeCommand.m_numIndices;
- int primitiveType = clientCmd.m_registerGraphicsShapeCommand.m_primitiveType;
- int textureId = clientCmd.m_registerGraphicsShapeCommand.m_textureId;
- int shapeId = this->m_guiHelper->registerGraphicsShape(vertices, numVertices, indices, numIndices, primitiveType, textureId);
- serverStatusOut.m_registerGraphicsShapeStatus.m_shapeId = shapeId;
- serverStatusOut.m_type = GFX_CMD_REGISTER_GRAPHICS_SHAPE_COMPLETED;
- m_args.processCommand();
- break;
- }
- case GFX_CMD_REGISTER_GRAPHICS_INSTANCE:
- {
- int graphicsInstanceId = m_guiHelper->registerGraphicsInstance(clientCmd.m_registerGraphicsInstanceCommand.m_shapeIndex,
- clientCmd.m_registerGraphicsInstanceCommand.m_position,
- clientCmd.m_registerGraphicsInstanceCommand.m_quaternion,
- clientCmd.m_registerGraphicsInstanceCommand.m_color,
- clientCmd.m_registerGraphicsInstanceCommand.m_scaling);
- serverStatusOut.m_registerGraphicsInstanceStatus.m_graphicsInstanceId = graphicsInstanceId;
- serverStatusOut.m_type = GFX_CMD_REGISTER_GRAPHICS_INSTANCE_COMPLETED;
- m_args.processCommand();
- break;
- }
- case GFX_CMD_SYNCHRONIZE_TRANSFORMS:
- {
- GUISyncPosition* positions = (GUISyncPosition*)&m_args.m_dataSlots[0][0];
- for (int i = 0; i < clientCmd.m_syncTransformsCommand.m_numPositions; i++)
- {
- m_app->m_renderer->writeSingleInstanceTransformToCPU(positions[i].m_pos, positions[i].m_orn, positions[i].m_graphicsInstanceId);
- }
- m_args.processCommand();
- break;
- }
- case GFX_CMD_REMOVE_ALL_GRAPHICS_INSTANCES:
- {
- m_guiHelper->removeAllGraphicsInstances();
- m_args.processCommand();
- break;
- }
- case GFX_CMD_REMOVE_SINGLE_GRAPHICS_INSTANCE:
- {
- m_app->m_renderer->removeGraphicsInstance(clientCmd.m_removeGraphicsInstanceCommand.m_graphicsUid);
- m_args.processCommand();
- break;
- }
- case GFX_CMD_CHANGE_RGBA_COLOR:
- {
- m_guiHelper->changeRGBAColor(clientCmd.m_changeRGBAColorCommand.m_graphicsUid, clientCmd.m_changeRGBAColorCommand.m_rgbaColor);
- m_args.processCommand();
- break;
- }
- case GFX_CMD_CHANGE_SCALING:
- {
- m_guiHelper->changeScaling(clientCmd.m_changeScalingCommand.m_graphicsUid, clientCmd.m_changeScalingCommand.m_scaling);
- m_args.processCommand();
- break;
- }
- case GFX_CMD_GET_CAMERA_INFO:
- {
- serverStatusOut.m_type = GFX_CMD_GET_CAMERA_INFO_FAILED;
-
- if (m_guiHelper->getCameraInfo(
- &serverStatusOut.m_getCameraInfoStatus.width,
- &serverStatusOut.m_getCameraInfoStatus.height,
- serverStatusOut.m_getCameraInfoStatus.viewMatrix,
- serverStatusOut.m_getCameraInfoStatus.projectionMatrix,
- serverStatusOut.m_getCameraInfoStatus.camUp,
- serverStatusOut.m_getCameraInfoStatus.camForward,
- serverStatusOut.m_getCameraInfoStatus.hor,
- serverStatusOut.m_getCameraInfoStatus.vert,
- &serverStatusOut.m_getCameraInfoStatus.yaw,
- &serverStatusOut.m_getCameraInfoStatus.pitch,
- &serverStatusOut.m_getCameraInfoStatus.camDist,
- serverStatusOut.m_getCameraInfoStatus.camTarget))
- {
- serverStatusOut.m_type = GFX_CMD_GET_CAMERA_INFO_COMPLETED;
- }
- m_args.processCommand();
- break;
- }
- default:
- {
- printf("unsupported command:%d\n", clientCmd.m_type);
- }
- }
- return true;
- }
- void processClientCommands()
- {
- int timeStamp = 0;
- bool hasStatus = false;
- if (m_args.isCommandOutstanding())
- {
- processCommand(*m_args.m_cmdPtr, m_args.m_serverStatus);
- }
- //serverStatusOut.m_type = GFX_CMD_CLIENT_COMMAND_FAILED;
- //bool hasStatus = processCommand(clientCmd, serverStatusOut);
- if (hasStatus)
- {
- //submitServerStatus(serverStatusOut);
- }
- }
- virtual void stepSimulation(float deltaTime)
- {
- B3_PROFILE("stepSimulation");
- processClientCommands();
- m_x += 0.01f;
- m_y += 0.01f;
- m_z += 0.01f;
- }
- virtual void renderScene()
- {
- B3_PROFILE("renderScene");
- {
- B3_PROFILE("writeTransforms");
- m_app->m_renderer->writeTransforms();
- }
- {
- B3_PROFILE("m_renderer->renderScene");
- m_app->m_renderer->renderScene();
- }
-
- }
-
- virtual void physicsDebugDraw(int debugDrawFlags)
- {
-
- }
- virtual bool mouseMoveCallback(float x, float y)
- {
- return false;
- }
- virtual bool mouseButtonCallback(int button, int state, float x, float y)
- {
- return false;
- }
- virtual bool keyboardCallback(int key, int state)
- {
- return false;
- }
- virtual void resetCamera()
- {
- float dist = 3.5;
- float pitch = -32;
- float yaw = 136;
- float targetPos[3] = {0, 0, 0};
- if (m_app->m_renderer && m_app->m_renderer->getActiveCamera())
- {
- m_app->m_renderer->getActiveCamera()->setCameraDistance(dist);
- m_app->m_renderer->getActiveCamera()->setCameraPitch(pitch);
- m_app->m_renderer->getActiveCamera()->setCameraYaw(yaw);
- m_app->m_renderer->getActiveCamera()->setCameraTargetPosition(targetPos[0], targetPos[1], targetPos[2]);
- }
- }
-
-
- };
- CommonExampleInterface* GraphicsServerCreateFuncBullet(struct CommonExampleOptions& options)
- {
- return new GraphicsServerExample(options.m_guiHelper);
- }
|