From 214930922d08895f472df539f7f3481e3cf57535 Mon Sep 17 00:00:00 2001 From: erwincoumans Date: Sat, 5 Nov 2016 12:53:40 -0700 Subject: [PATCH] make sure m_uniqueIdGenerator in btSerializer is initialized to zero, it can cause issues if not. --- .../PhysicsServerCommandProcessor.cpp | 17 +++++++++++++---- src/LinearMath/btSerializer.h | 4 +++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp index cff5acbd1..c6346a554 100644 --- a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp +++ b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp @@ -1036,10 +1036,17 @@ bool PhysicsServerCommandProcessor::loadUrdf(const char* fileName, const btVecto UrdfLinkNameMapUtil* util = new UrdfLinkNameMapUtil; m_data->m_urdfLinkNameMapper.push_back(util); util->m_mb = mb; + for (int i = 0; i < bufferSizeInBytes; i++) + { + bufferServerToClient[i] = 0xcc; + } util->m_memSerializer = new btDefaultSerializer(bufferSizeInBytes ,(unsigned char*)bufferServerToClient); //disable serialization of the collision objects (they are too big, and the client likely doesn't need them); util->m_memSerializer->m_skipPointers.insert(mb->getBaseCollider(),0); + util->m_memSerializer->startSerialization(); + + bodyHandle->m_linkLocalInertialFrames.reserve(mb->getNumLinks()); for (int i=0;igetNumLinks();i++) { @@ -1066,18 +1073,19 @@ bool PhysicsServerCommandProcessor::loadUrdf(const char* fileName, const btVecto std::string* baseName = new std::string(u2b.getLinkName(u2b.getRootLinkIndex())); m_data->m_strings.push_back(baseName); - - util->m_memSerializer->registerNameForPointer(baseName->c_str(),baseName->c_str()); mb->setBaseName(baseName->c_str()); + util->m_memSerializer->registerNameForPointer(baseName->c_str(),baseName->c_str()); - util->m_memSerializer->insertHeader(); + int len = mb->calculateSerializeBufferSize(); btChunk* chunk = util->m_memSerializer->allocate(len,1); const char* structType = mb->serialize(chunk->m_oldPtr, util->m_memSerializer); util->m_memSerializer->finalizeChunk(chunk,structType,BT_MULTIBODY_CODE,mb); + + return true; } else { @@ -1129,6 +1137,8 @@ int PhysicsServerCommandProcessor::createBodyInfoStream(int bodyUniqueId, char* m_data->m_urdfLinkNameMapper.push_back(util); util->m_mb = mb; util->m_memSerializer = new btDefaultSerializer(bufferSizeInBytes ,(unsigned char*)bufferServerToClient); + util->m_memSerializer->startSerialization(); + //disable serialization of the collision objects (they are too big, and the client likely doesn't need them); util->m_memSerializer->m_skipPointers.insert(mb->getBaseCollider(),0); if (mb->getBaseName()) @@ -1147,7 +1157,6 @@ int PhysicsServerCommandProcessor::createBodyInfoStream(int bodyUniqueId, char* util->m_memSerializer->registerNameForPointer(mb->getBaseName(),mb->getBaseName()); - util->m_memSerializer->insertHeader(); int len = mb->calculateSerializeBufferSize(); btChunk* chunk = util->m_memSerializer->allocate(len,1); diff --git a/src/LinearMath/btSerializer.h b/src/LinearMath/btSerializer.h index 424e0b99c..6f03df158 100644 --- a/src/LinearMath/btSerializer.h +++ b/src/LinearMath/btSerializer.h @@ -391,7 +391,8 @@ public: btDefaultSerializer(int totalSize=0, unsigned char* buffer=0) - :m_totalSize(totalSize), + :m_uniqueIdGenerator(0), + m_totalSize(totalSize), m_currentSize(0), m_dna(0), m_dnaLength(0), @@ -561,6 +562,7 @@ public: virtual void* getUniquePointer(void*oldPtr) { + btAssert(m_uniqueIdGenerator >= 0); if (!oldPtr) return 0;