fix shadowmap crash on some Intel GPUs, see https://github.com/bulletphysics/bullet3/issues/4

remove targetdir from all libraries in premake, so it is much easier to create a separate folder for all binary+lib
transmit the serialized btMultiBody data back from server to client, after the server loads a URDF file. This includes base+link+joint names
tweak the serialization routines, so it is easier to skip pointers and to serialize directly to a shared memory buffer
also tweak the serialization code to allow to process data without 'DNA' schema data (assuming file-DNA = memory DNA)
This commit is contained in:
erwincoumans
2015-07-10 22:20:06 -07:00
parent f6f76901fd
commit 6c9ce344ea
35 changed files with 340 additions and 120 deletions

View File

@@ -1,7 +1,7 @@
project "ConvexDecomposition" project "ConvexDecomposition"
kind "StaticLib" kind "StaticLib"
targetdir "../../lib"
includedirs {".","../../src"} includedirs {".","../../src"}
files { files {
"**.cpp", "**.cpp",

View File

@@ -1,7 +1,7 @@
project "HACD" project "HACD"
kind "StaticLib" kind "StaticLib"
targetdir "../../lib"
includedirs {"."} includedirs {"."}
files { files {
"**.cpp", "**.cpp",

View File

@@ -600,23 +600,6 @@ typedef struct bInvalidHandle {
}; };
// -------------------------------------------------- //
class btDynamicsWorldDoubleData
{
public:
btContactSolverInfoDoubleData m_solverInfo;
btVector3DoubleData m_gravity;
};
// -------------------------------------------------- //
class btDynamicsWorldFloatData
{
public:
btContactSolverInfoFloatData m_solverInfo;
btVector3FloatData m_gravity;
};
// -------------------------------------------------- // // -------------------------------------------------- //
class btRigidBodyFloatData class btRigidBodyFloatData
@@ -1135,6 +1118,24 @@ typedef struct bInvalidHandle {
char m_padding[4]; char m_padding[4];
}; };
// -------------------------------------------------- //
class btDynamicsWorldDoubleData
{
public:
btContactSolverInfoDoubleData m_solverInfo;
btVector3DoubleData m_gravity;
};
// -------------------------------------------------- //
class btDynamicsWorldFloatData
{
public:
btContactSolverInfoFloatData m_solverInfo;
btVector3FloatData m_gravity;
};
// -------------------------------------------------- // // -------------------------------------------------- //
class SoftBodyMaterialData class SoftBodyMaterialData

View File

@@ -187,87 +187,105 @@ bool bFile::ok()
return (mFlags &FD_OK)!=0; return (mFlags &FD_OK)!=0;
} }
void bFile::setFileDNA(int verboseMode, char* dnaBuffer, int dnaLen)
{
mFileDNA = new bDNA();
///mFileDNA->init will convert part of DNA file endianness to current CPU endianness if necessary
mFileDNA->init((char*)dnaBuffer, dnaLen, (mFlags & FD_ENDIAN_SWAP)!=0);
if (verboseMode & FD_VERBOSE_DUMP_DNA_TYPE_DEFINITIONS)
mFileDNA->dumpTypeDefinitions();
}
// ----------------------------------------------------- // // ----------------------------------------------------- //
void bFile::parseInternal(int verboseMode, char* memDna,int memDnaLength) void bFile::parseInternal(int verboseMode, char* memDna,int memDnaLength)
{ {
if ( (mFlags &FD_OK) ==0) if ( (mFlags &FD_OK) ==0)
return; return;
char *blenderData = mFileBuffer; if (mFlags & FD_FILEDNA_IS_MEMDNA)
bChunkInd dna;
dna.oldPtr = 0;
char *tempBuffer = blenderData;
for (int i=0; i<mFileLen; i++)
{ {
// looking for the data's starting position setFileDNA(verboseMode,memDna,memDnaLength);
// and the start of SDNA decls }
if (!mDataStart && strncmp(tempBuffer, "REND", 4)==0) if (mFileDNA==0)
mDataStart = i; {
char *blenderData = mFileBuffer;
bChunkInd dna;
dna.oldPtr = 0;
if (strncmp(tempBuffer, "DNA1", 4)==0) char *tempBuffer = blenderData;
for (int i=0; i<mFileLen; i++)
{ {
// read the DNA1 block and extract SDNA // looking for the data's starting position
if (getNextBlock(&dna, tempBuffer, mFlags) > 0) // and the start of SDNA decls
if (!mDataStart && strncmp(tempBuffer, "REND", 4)==0)
mDataStart = i;
if (strncmp(tempBuffer, "DNA1", 4)==0)
{ {
if (strncmp((tempBuffer + ChunkUtils::getOffset(mFlags)), "SDNANAME", 8) ==0) // read the DNA1 block and extract SDNA
dna.oldPtr = (tempBuffer + ChunkUtils::getOffset(mFlags)); if (getNextBlock(&dna, tempBuffer, mFlags) > 0)
{
if (strncmp((tempBuffer + ChunkUtils::getOffset(mFlags)), "SDNANAME", 8) ==0)
dna.oldPtr = (tempBuffer + ChunkUtils::getOffset(mFlags));
else dna.oldPtr = 0;
}
else dna.oldPtr = 0; else dna.oldPtr = 0;
} }
else dna.oldPtr = 0; // Some Bullet files are missing the DNA1 block
} // In Blender it's DNA1 + ChunkUtils::getOffset() + SDNA + NAME
// Some Bullet files are missing the DNA1 block // In Bullet tests its SDNA + NAME
// In Blender it's DNA1 + ChunkUtils::getOffset() + SDNA + NAME else if (strncmp(tempBuffer, "SDNANAME", 8) ==0)
// In Bullet tests its SDNA + NAME
else if (strncmp(tempBuffer, "SDNANAME", 8) ==0)
{
dna.oldPtr = blenderData + i;
dna.len = mFileLen-i;
// Also no REND block, so exit now.
if (mVersion==276) break;
}
if (mDataStart && dna.oldPtr) break;
tempBuffer++;
}
if (!dna.oldPtr || !dna.len)
{
//printf("Failed to find DNA1+SDNA pair\n");
mFlags &= ~FD_OK;
return;
}
mFileDNA = new bDNA();
///mFileDNA->init will convert part of DNA file endianness to current CPU endianness if necessary
mFileDNA->init((char*)dna.oldPtr, dna.len, (mFlags & FD_ENDIAN_SWAP)!=0);
if (mVersion==276)
{
int i;
for (i=0;i<mFileDNA->getNumNames();i++)
{
if (strcmp(mFileDNA->getName(i),"int")==0)
{ {
mFlags |= FD_BROKEN_DNA; dna.oldPtr = blenderData + i;
dna.len = mFileLen-i;
// Also no REND block, so exit now.
if (mVersion==276) break;
}
if (mDataStart && dna.oldPtr) break;
tempBuffer++;
}
if (!dna.oldPtr || !dna.len)
{
//printf("Failed to find DNA1+SDNA pair\n");
mFlags &= ~FD_OK;
return;
}
mFileDNA = new bDNA();
///mFileDNA->init will convert part of DNA file endianness to current CPU endianness if necessary
mFileDNA->init((char*)dna.oldPtr, dna.len, (mFlags & FD_ENDIAN_SWAP)!=0);
if (mVersion==276)
{
int i;
for (i=0;i<mFileDNA->getNumNames();i++)
{
if (strcmp(mFileDNA->getName(i),"int")==0)
{
mFlags |= FD_BROKEN_DNA;
}
}
if ((mFlags&FD_BROKEN_DNA)!=0)
{
//printf("warning: fixing some broken DNA version\n");
} }
} }
if ((mFlags&FD_BROKEN_DNA)!=0)
{
//printf("warning: fixing some broken DNA version\n");
} if (verboseMode & FD_VERBOSE_DUMP_DNA_TYPE_DEFINITIONS)
mFileDNA->dumpTypeDefinitions();
} }
if (verboseMode & FD_VERBOSE_DUMP_DNA_TYPE_DEFINITIONS)
mFileDNA->dumpTypeDefinitions();
mMemoryDNA = new bDNA(); mMemoryDNA = new bDNA();
int littleEndian= 1; int littleEndian= 1;
littleEndian= ((char*)&littleEndian)[0]; littleEndian= ((char*)&littleEndian)[0];

View File

@@ -33,7 +33,8 @@ namespace bParse {
FD_BITS_VARIES =16, FD_BITS_VARIES =16,
FD_VERSION_VARIES = 32, FD_VERSION_VARIES = 32,
FD_DOUBLE_PRECISION =64, FD_DOUBLE_PRECISION =64,
FD_BROKEN_DNA = 128 FD_BROKEN_DNA = 128,
FD_FILEDNA_IS_MEMDNA = 256
}; };
enum bFileVerboseMode enum bFileVerboseMode
@@ -106,7 +107,7 @@ namespace bParse {
char* readStruct(char *head, class bChunkInd& chunk); char* readStruct(char *head, class bChunkInd& chunk);
char *getAsString(int code); char *getAsString(int code);
void parseInternal(int verboseMode, char* memDna,int memDnaLength); virtual void parseInternal(int verboseMode, char* memDna,int memDnaLength);
public: public:
bFile(const char *filename, const char headerString[7]); bFile(const char *filename, const char headerString[7]);
@@ -128,6 +129,11 @@ namespace bParse {
return mFlags; return mFlags;
} }
void setFileDNAisMemoryDNA()
{
mFlags |= FD_FILEDNA_IS_MEMDNA;
}
bPtrMap& getLibPointers() bPtrMap& getLibPointers()
{ {
return mLibPointers; return mLibPointers;
@@ -150,6 +156,8 @@ namespace bParse {
void dumpChunks(bDNA* dna); void dumpChunks(bDNA* dna);
virtual void setFileDNA(int verboseMode, char* buffer, int len);
int getVersion() const int getVersion() const
{ {
return mVersion; return mVersion;
@@ -158,6 +166,8 @@ namespace bParse {
void preSwap(); void preSwap();
void writeFile(const char* fileName); void writeFile(const char* fileName);
}; };
} }

View File

@@ -123,7 +123,11 @@ void btBulletFile::parseData()
//const bool swap = (mFlags&FD_ENDIAN_SWAP)!=0; //const bool swap = (mFlags&FD_ENDIAN_SWAP)!=0;
int remain = mFileLen;
mDataStart = 12; mDataStart = 12;
remain-=12;
char *dataPtr = mFileBuffer+mDataStart; char *dataPtr = mFileBuffer+mDataStart;
@@ -169,6 +173,11 @@ void btBulletFile::parseData()
// listID->push_back((bStructHandle*)id); // listID->push_back((bStructHandle*)id);
} }
if (dataChunk.code == BT_MULTIBODY_CODE)
{
m_multiBodies.push_back((bStructHandle*)id);
}
if (dataChunk.code == BT_SOFTBODY_CODE) if (dataChunk.code == BT_SOFTBODY_CODE)
{ {
m_softBodies.push_back((bStructHandle*) id); m_softBodies.push_back((bStructHandle*) id);
@@ -226,6 +235,9 @@ void btBulletFile::parseData()
dataPtr += seek; dataPtr += seek;
remain-=seek;
if (remain<=0)
break;
seek = getNextBlock(&dataChunk, dataPtr, mFlags); seek = getNextBlock(&dataChunk, dataPtr, mFlags);
if (mFlags &FD_ENDIAN_SWAP) if (mFlags &FD_ENDIAN_SWAP)
@@ -420,4 +432,5 @@ void btBulletFile::addStruct(const char* structType,void* data, int len, void* o
mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)data); mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)data);
m_chunks.push_back(dataChunk); m_chunks.push_back(dataChunk);
} }

View File

@@ -21,6 +21,7 @@ subject to the following restrictions:
#include "LinearMath/btAlignedObjectArray.h" #include "LinearMath/btAlignedObjectArray.h"
#include "bDefines.h" #include "bDefines.h"
#include "LinearMath/btSerializer.h" #include "LinearMath/btSerializer.h"
@@ -38,6 +39,8 @@ namespace bParse {
public: public:
btAlignedObjectArray<bStructHandle*> m_multiBodies;
btAlignedObjectArray<bStructHandle*> m_softBodies; btAlignedObjectArray<bStructHandle*> m_softBodies;
btAlignedObjectArray<bStructHandle*> m_rigidBodies; btAlignedObjectArray<bStructHandle*> m_rigidBodies;
@@ -65,7 +68,7 @@ namespace bParse {
virtual void addDataBlock(char* dataBlock); virtual void addDataBlock(char* dataBlock);
// experimental // experimental
virtual int write(const char* fileName, bool fixupPointers=false); virtual int write(const char* fileName, bool fixupPointers=false);

View File

@@ -1,7 +1,7 @@
project "BulletFileLoader" project "BulletFileLoader"
kind "StaticLib" kind "StaticLib"
targetdir "../../lib"
includedirs { includedirs {
"../../../src" "../../../src"
} }

View File

@@ -1,7 +1,7 @@
project "BulletWorldImporter" project "BulletWorldImporter"
kind "StaticLib" kind "StaticLib"
targetdir "../../lib"
includedirs { includedirs {
"../BulletFileLoader", "../BulletFileLoader",
"../../../src" "../../../src"

View File

@@ -188,6 +188,7 @@ char *includefiles[] = {
"../../../src/BulletCollision/Gimpact/btGImpactShape.h", "../../../src/BulletCollision/Gimpact/btGImpactShape.h",
"../../../src/BulletCollision/CollisionShapes/btConvexHullShape.h", "../../../src/BulletCollision/CollisionShapes/btConvexHullShape.h",
"../../../src/BulletCollision/CollisionDispatch/btCollisionObject.h", "../../../src/BulletCollision/CollisionDispatch/btCollisionObject.h",
"../../../src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h",
"../../../src/BulletDynamics/Dynamics/btDynamicsWorld.h", "../../../src/BulletDynamics/Dynamics/btDynamicsWorld.h",
"../../../src/BulletDynamics/Dynamics/btRigidBody.h", "../../../src/BulletDynamics/Dynamics/btRigidBody.h",
"../../../src/BulletDynamics/ConstraintSolver/btTypedConstraint.h", "../../../src/BulletDynamics/ConstraintSolver/btTypedConstraint.h",
@@ -199,7 +200,7 @@ char *includefiles[] = {
"../../../src/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h", "../../../src/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h",
"../../../src/BulletDynamics/ConstraintSolver/btSliderConstraint.h", "../../../src/BulletDynamics/ConstraintSolver/btSliderConstraint.h",
"../../../src/BulletDynamics/ConstraintSolver/btGearConstraint.h", "../../../src/BulletDynamics/ConstraintSolver/btGearConstraint.h",
"../../../src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h",
"../../../src/BulletSoftBody/btSoftBodyData.h", "../../../src/BulletSoftBody/btSoftBodyData.h",
"../../../src/BulletDynamics/Featherstone/btMultiBody.h", "../../../src/BulletDynamics/Featherstone/btMultiBody.h",
// empty string to indicate end of includefiles // empty string to indicate end of includefiles

View File

@@ -129,7 +129,7 @@
-- comment-out for now, URDF reader needs exceptions -- comment-out for now, URDF reader needs exceptions
-- flags { "NoRTTI", "NoExceptions"} -- flags { "NoRTTI", "NoExceptions"}
-- defines { "_HAS_EXCEPTIONS=0" } -- defines { "_HAS_EXCEPTIONS=0" }
targetdir "../bin" targetdir "../binserver"
location("./" .. act .. postfix) location("./" .. act .. postfix)

View File

@@ -1325,7 +1325,33 @@ void GLInstancingRenderer::renderSceneInternal(int renderMode)
glBindTexture(GL_TEXTURE_2D,m_data->m_shadowTexture); glBindTexture(GL_TEXTURE_2D,m_data->m_shadowTexture);
//glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT16,m_screenWidth,m_screenHeight,0,GL_DEPTH_COMPONENT,GL_FLOAT,0); //glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT16,m_screenWidth,m_screenHeight,0,GL_DEPTH_COMPONENT,GL_FLOAT,0);
//glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT32,m_screenWidth,m_screenHeight,0,GL_DEPTH_COMPONENT,GL_FLOAT,0); //glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT32,m_screenWidth,m_screenHeight,0,GL_DEPTH_COMPONENT,GL_FLOAT,0);
#ifdef OLD_SHADOWMAP_INIT
glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT16, shadowMapWidth, shadowMapHeight, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0); glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT16, shadowMapWidth, shadowMapHeight, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0);
#else//OLD_SHADOWMAP_INIT
//Reduce size of shadowMap if glTexImage2D call fails as may happen in some cases
//https://github.com/bulletphysics/bullet3/issues/40
int size;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &size);
if (size < shadowMapWidth){
shadowMapWidth = size;
}
if (size < shadowMapHeight){
shadowMapHeight = size;
}
GLuint err;
do {
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16,
shadowMapWidth, shadowMapHeight,
0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
err = glGetError();
if (err!=GL_NO_ERROR){
shadowMapHeight >>= 1;
shadowMapWidth >>= 1;
}
} while (err != GL_NO_ERROR && shadowMapWidth > 0);
#endif//OLD_SHADOWMAP_INIT
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

View File

@@ -7,6 +7,7 @@
#include "SharedMemoryCommon.h" #include "SharedMemoryCommon.h"
#include "../CommonInterfaces/CommonParameterInterface.h" #include "../CommonInterfaces/CommonParameterInterface.h"
#include "../Utils/b3ResourcePath.h" #include "../Utils/b3ResourcePath.h"
#include "../Extras/Serialize/BulletFileLoader/btBulletFile.h"
class PhysicsClient : public SharedMemoryCommon class PhysicsClient : public SharedMemoryCommon
{ {
@@ -181,6 +182,57 @@ void PhysicsClient::processServerCommands()
{ {
m_serverLoadUrdfOK = true; m_serverLoadUrdfOK = true;
b3Printf("Server loading the URDF OK\n"); b3Printf("Server loading the URDF OK\n");
if (serverCmd.m_dataStreamArguments.m_streamChunkLength>0)
{
bParse::btBulletFile* bf = new bParse::btBulletFile(this->m_testBlock1->m_bulletStreamDataServerToClient,serverCmd.m_dataStreamArguments.m_streamChunkLength);
bf->setFileDNAisMemoryDNA();
bf->parse(false);
for (int i=0;i<bf->m_multiBodies.size();i++)
{
int flag = bf->getFlags();
if ((flag&bParse::FD_DOUBLE_PRECISION)!=0)
{
btMultiBodyDoubleData* mb = (btMultiBodyDoubleData*)bf->m_multiBodies[i];
if (mb->m_baseName)
{
b3Printf("mb->m_baseName = %s\n",mb->m_baseName);
}
for (int link=0;link<mb->m_numLinks;link++)
{
if (mb->m_links[link].m_linkName)
{
b3Printf("mb->m_links[%d].m_linkName = %s\n",link,mb->m_links[link].m_linkName);
}
if (mb->m_links[link].m_jointName)
{
b3Printf("mb->m_links[%d].m_jointName = %s\n",link,mb->m_links[link].m_jointName);
}
}
} else
{
btMultiBodyFloatData* mb = (btMultiBodyFloatData*) bf->m_multiBodies[i];
if (mb->m_baseName)
{
b3Printf("mb->m_baseName = %s\n",mb->m_baseName);
}
for (int link=0;link<mb->m_numLinks;link++)
{
if (mb->m_links[link].m_linkName)
{
b3Printf("mb->m_links[%d].m_linkName = %s\n",link,mb->m_links[link].m_linkName);
}
b3Printf("link [%d] type = %d",link, mb->m_links[link].m_jointType);
if (mb->m_links[link].m_jointName)
{
b3Printf("mb->m_links[%d].m_jointName = %s\n",link,mb->m_links[link].m_jointName);
}
}
}
}
printf("ok!\n");
}
break; break;
} }
case CMD_STEP_FORWARD_SIMULATION_COMPLETED: case CMD_STEP_FORWARD_SIMULATION_COMPLETED:
@@ -196,10 +248,17 @@ void PhysicsClient::processServerCommands()
case CMD_BULLET_DATA_STREAM_RECEIVED_COMPLETED: case CMD_BULLET_DATA_STREAM_RECEIVED_COMPLETED:
{ {
b3Printf("Server received bullet data stream OK\n");
break; break;
} }
case CMD_BULLET_DATA_STREAM_RECEIVED_FAILED: case CMD_BULLET_DATA_STREAM_RECEIVED_FAILED:
{ {
b3Printf("Server failed receiving bullet data stream\n");
break; break;
} }

View File

@@ -1,4 +1,6 @@
#include "PhysicsServer.h" #include "PhysicsServer.h"
#include "PosixSharedMemory.h" #include "PosixSharedMemory.h"
@@ -10,7 +12,16 @@
#include "../Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.h" #include "../Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.h"
#include "SharedMemoryCommon.h" #include "SharedMemoryCommon.h"
const char* blaatnaam = "basename";
struct UrdfLinkNameMapUtil
{
btMultiBody* m_mb;
btDefaultSerializer* m_memSerializer;
UrdfLinkNameMapUtil():m_mb(0),m_memSerializer(0)
{
}
};
class PhysicsServer : public SharedMemoryCommon class PhysicsServer : public SharedMemoryCommon
{ {
@@ -19,7 +30,8 @@ class PhysicsServer : public SharedMemoryCommon
btAlignedObjectArray<btJointFeedback*> m_jointFeedbacks; btAlignedObjectArray<btJointFeedback*> m_jointFeedbacks;
btAlignedObjectArray<btBulletWorldImporter*> m_worldImporters; btAlignedObjectArray<btBulletWorldImporter*> m_worldImporters;
btAlignedObjectArray<UrdfLinkNameMapUtil*> m_urdfLinkNameMapper;
btAlignedObjectArray<std::string*> m_strings;
bool m_wantsShutdown; bool m_wantsShutdown;
public: public:
@@ -155,6 +167,44 @@ bool PhysicsServer::loadUrdf(const char* fileName, const btVector3& pos, const b
{ {
if (mb) if (mb)
{ {
UrdfLinkNameMapUtil* util = new UrdfLinkNameMapUtil;
m_urdfLinkNameMapper.push_back(util);
util->m_mb = mb;
util->m_memSerializer = new btDefaultSerializer(SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE,(unsigned char*)m_testBlock1->m_bulletStreamDataServerToClient);
//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);
for (int i=0;i<mb->getNumLinks();i++)
{
//disable serialization of the collision objects
util->m_memSerializer->m_skipPointers.insert(mb->getLink(i).m_collider,0);
int urdfLinkIndex = creation.m_mb2urdfLink[i];
std::string* linkName = new std::string(u2b.getLinkName(urdfLinkIndex).c_str());
m_strings.push_back(linkName);
util->m_memSerializer->registerNameForPointer(linkName->c_str(),linkName->c_str());
mb->getLink(i).m_linkName = linkName->c_str();
std::string* jointName = new std::string(u2b.getJointName(urdfLinkIndex).c_str());
m_strings.push_back(jointName);
util->m_memSerializer->registerNameForPointer(jointName->c_str(),jointName->c_str());
mb->getLink(i).m_jointName = jointName->c_str();
}
std::string* baseName = new std::string(u2b.getLinkName(u2b.getRootLinkIndex()));
m_strings.push_back(baseName);
util->m_memSerializer->registerNameForPointer(baseName->c_str(),baseName->c_str());
mb->setBaseName(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; return true;
} else } else
{ {
@@ -236,6 +286,10 @@ void PhysicsServer::stepSimulation(float deltaTime)
if (completedOk) if (completedOk)
{ {
if (this->m_urdfLinkNameMapper.size())
{
serverCmd.m_dataStreamArguments.m_streamChunkLength = m_urdfLinkNameMapper.at(m_urdfLinkNameMapper.size()-1)->m_memSerializer->getCurrentBufferSize();
}
serverCmd.m_type =CMD_URDF_LOADING_COMPLETED; serverCmd.m_type =CMD_URDF_LOADING_COMPLETED;
} else } else
{ {
@@ -243,6 +297,9 @@ void PhysicsServer::stepSimulation(float deltaTime)
} }
m_testBlock1->m_numServerCommands++; m_testBlock1->m_numServerCommands++;
break; break;
} }
case CMD_REQUEST_ACTUAL_STATE: case CMD_REQUEST_ACTUAL_STATE:

View File

@@ -5,7 +5,7 @@
kind "StaticLib" kind "StaticLib"
includedirs {".."} includedirs {".."}
targetdir "../../bin"
files { files {
"**.cpp", "**.cpp",

View File

@@ -7,7 +7,7 @@
includedirs { includedirs {
".." ".."
} }
targetdir "../../bin"
files { files {
"**.cpp", "**.cpp",

View File

@@ -5,7 +5,7 @@
kind "StaticLib" kind "StaticLib"
includedirs {".."} includedirs {".."}
targetdir "../../bin"
files { files {
"**.cpp", "**.cpp",

View File

@@ -9,7 +9,7 @@ function createProject(vendor)
kind "StaticLib" kind "StaticLib"
targetdir "../../lib"
includedirs { includedirs {
".",".." ".",".."
} }

View File

@@ -1,7 +1,7 @@
project "Bullet2FileLoader" project "Bullet2FileLoader"
kind "StaticLib" kind "StaticLib"
targetdir "../../../lib"
includedirs { includedirs {
"../../../src" "../../../src"
} }

View File

@@ -2447,8 +2447,7 @@ const char* btMultiBody::serialize(void* dataBuffer, class btSerializer* seriali
} }
} }
mbd->m_numLinks = this->getNumLinks(); mbd->m_numLinks = this->getNumLinks();
mbd->m_links = mbd->m_numLinks? (btMultiBodyLinkData*) serializer->getUniquePointer((void*)&m_links[0]):0; if (mbd->m_numLinks)
if (mbd->m_links)
{ {
int sz = sizeof(btMultiBodyLinkData); int sz = sizeof(btMultiBodyLinkData);
int numElem = mbd->m_numLinks; int numElem = mbd->m_numLinks;
@@ -2503,6 +2502,7 @@ const char* btMultiBody::serialize(void* dataBuffer, class btSerializer* seriali
} }
serializer->finalizeChunk(chunk,btMultiBodyLinkDataName,BT_ARRAY_CODE,(void*) &m_links[0]); serializer->finalizeChunk(chunk,btMultiBodyLinkDataName,BT_ARRAY_CODE,(void*) &m_links[0]);
} }
mbd->m_links = mbd->m_numLinks? (btMultiBodyLinkData*) serializer->getUniquePointer((void*)&m_links[0]):0;
return btMultiBodyDataName; return btMultiBodyDataName;
} }

View File

@@ -1,7 +1,7 @@
project "BulletSoftBody" project "BulletSoftBody"
kind "StaticLib" kind "StaticLib"
targetdir "../../lib"
includedirs { includedirs {
"..", "..",
} }

View File

@@ -174,6 +174,7 @@ protected:
btAlignedObjectArray<short> mTlens; btAlignedObjectArray<short> mTlens;
btHashMap<btHashInt, int> mStructReverse; btHashMap<btHashInt, int> mStructReverse;
btHashMap<btHashString,int> mTypeLookup; btHashMap<btHashString,int> mTypeLookup;
btHashMap<btHashPtr,void*> m_chunkP; btHashMap<btHashPtr,void*> m_chunkP;
@@ -185,6 +186,7 @@ protected:
int m_totalSize; int m_totalSize;
unsigned char* m_buffer; unsigned char* m_buffer;
bool m_ownsBuffer;
int m_currentSize; int m_currentSize;
void* m_dna; void* m_dna;
int m_dnaLength; int m_dnaLength;
@@ -196,6 +198,7 @@ protected:
protected: protected:
virtual void* findPointer(void* oldPtr) virtual void* findPointer(void* oldPtr)
{ {
void** ptr = m_chunkP.find(oldPtr); void** ptr = m_chunkP.find(oldPtr);
@@ -384,17 +387,25 @@ protected:
public: public:
btHashMap<btHashPtr,void*> m_skipPointers;
btDefaultSerializer(int totalSize=0, unsigned char* buffer=0)
btDefaultSerializer(int totalSize=0)
:m_totalSize(totalSize), :m_totalSize(totalSize),
m_currentSize(0), m_currentSize(0),
m_dna(0), m_dna(0),
m_dnaLength(0), m_dnaLength(0),
m_serializationFlags(0) m_serializationFlags(0)
{ {
m_buffer = m_totalSize?(unsigned char*)btAlignedAlloc(totalSize,16):0; if (buffer==0)
{
m_buffer = m_totalSize?(unsigned char*)btAlignedAlloc(totalSize,16):0;
m_ownsBuffer = true;
} else
{
m_buffer = buffer;
m_ownsBuffer = false;
}
const bool VOID_IS_8 = ((sizeof(void*)==8)); const bool VOID_IS_8 = ((sizeof(void*)==8));
@@ -429,12 +440,18 @@ public:
virtual ~btDefaultSerializer() virtual ~btDefaultSerializer()
{ {
if (m_buffer) if (m_buffer && m_ownsBuffer)
btAlignedFree(m_buffer); btAlignedFree(m_buffer);
if (m_dna) if (m_dna)
btAlignedFree(m_dna); btAlignedFree(m_dna);
} }
void insertHeader()
{
writeHeader(m_buffer);
m_currentSize += BT_HEADER_LENGTH;
}
void writeHeader(unsigned char* buffer) const void writeHeader(unsigned char* buffer) const
{ {
@@ -515,6 +532,7 @@ public:
mTlens.clear(); mTlens.clear();
mStructReverse.clear(); mStructReverse.clear();
mTypeLookup.clear(); mTypeLookup.clear();
m_skipPointers.clear();
m_chunkP.clear(); m_chunkP.clear();
m_nameMap.clear(); m_nameMap.clear();
m_uniquePointers.clear(); m_uniquePointers.clear();
@@ -531,6 +549,13 @@ public:
{ {
return uptr->m_ptr; return uptr->m_ptr;
} }
void** ptr2 = m_skipPointers[oldPtr];
if (ptr2)
{
return 0;
}
m_uniqueIdGenerator++; m_uniqueIdGenerator++;
btPointerUid uid; btPointerUid uid;
@@ -684,10 +709,15 @@ struct btInMemorySerializer : public btDefaultSerializer
btHashMap<btHashPtr,btChunk*> m_uid2ChunkPtr; btHashMap<btHashPtr,btChunk*> m_uid2ChunkPtr;
btHashMap<btHashPtr,void*> m_orgPtr2UniqueDataPtr; btHashMap<btHashPtr,void*> m_orgPtr2UniqueDataPtr;
btHashMap<btHashString,const void*> m_names2Ptr; btHashMap<btHashString,const void*> m_names2Ptr;
btHashMap<btHashPtr,void*> m_skipPointers;
btBulletSerializedArrays m_arrays; btBulletSerializedArrays m_arrays;
btInMemorySerializer(int totalSize=0, unsigned char* buffer=0)
:btDefaultSerializer(totalSize,buffer)
{
}
virtual void startSerialization() virtual void startSerialization()
{ {
@@ -696,6 +726,8 @@ struct btInMemorySerializer : public btDefaultSerializer
btDefaultSerializer::startSerialization(); btDefaultSerializer::startSerialization();
} }
btChunk* findChunkFromUniquePointer(void* uniquePointer) btChunk* findChunkFromUniquePointer(void* uniquePointer)
{ {
btChunk** chkPtr = m_uid2ChunkPtr[uniquePointer]; btChunk** chkPtr = m_uid2ChunkPtr[uniquePointer];

View File

@@ -7,7 +7,7 @@ else
kind "ConsoleApp" kind "ConsoleApp"
end end
targetdir "../../bin"
includedirs {"../../src","Source", "Source/Tests"} includedirs {"../../src","Source", "Source/Tests"}

View File

@@ -7,7 +7,7 @@
defines { "GWEN_COMPILE_STATIC" , "_HAS_EXCEPTIONS=0", "_STATIC_CPPLIB" } defines { "GWEN_COMPILE_STATIC" , "_HAS_EXCEPTIONS=0", "_STATIC_CPPLIB" }
defines { "DONT_USE_GLUT"} defines { "DONT_USE_GLUT"}
targetdir "../../bin"
includedirs includedirs
{ {

View File

@@ -12,7 +12,7 @@ function createProject(vendor)
kind "ConsoleApp" kind "ConsoleApp"
targetdir "../../../bin"
includedirs {"../../../src"} includedirs {"../../../src"}

View File

@@ -12,7 +12,7 @@ function createProject(vendor)
kind "ConsoleApp" kind "ConsoleApp"
targetdir "../../../bin"
includedirs {"../../../src"} includedirs {"../../../src"}

View File

@@ -10,7 +10,7 @@ function createProject(vendor)
language "C++" language "C++"
kind "ConsoleApp" kind "ConsoleApp"
targetdir "../../../bin"
includedirs {".","../../../src"} includedirs {".","../../../src"}

View File

@@ -10,7 +10,7 @@ function createProject(vendor)
language "C++" language "C++"
kind "ConsoleApp" kind "ConsoleApp"
targetdir "../../../bin"
includedirs {"..","../../../src"} includedirs {"..","../../../src"}
-- links { -- links {

View File

@@ -12,7 +12,7 @@ function createProject(vendor)
end end
targetdir "../../bin"
initOpenCL(vendor) initOpenCL(vendor)

View File

@@ -5,7 +5,7 @@ project ("Test_b3DynamicBvhBroadphase_test")
language "C++" language "C++"
kind "ConsoleApp" kind "ConsoleApp"
targetdir "../../bin"
includedirs {"../../src"} includedirs {"../../src"}
links {"Bullet3Common", "Bullet3Collision"} links {"Bullet3Common", "Bullet3Collision"}

View File

@@ -5,7 +5,7 @@ project ("Test_clew")
language "C++" language "C++"
kind "ConsoleApp" kind "ConsoleApp"
targetdir "../../bin"
includedirs {"../../src/clew"} includedirs {"../../src/clew"}
if os.is("Windows") then if os.is("Windows") then

View File

@@ -5,7 +5,7 @@
-- defines { } -- defines { }
-- targetdir "../../bin"
includedirs includedirs
{ {

View File

@@ -5,7 +5,7 @@ project ("Test_enet_client")
language "C++" language "C++"
kind "ConsoleApp" kind "ConsoleApp"
targetdir "../../../bin"
includedirs {"../../../examples/ThirdPartyLibs/enet/include"} includedirs {"../../../examples/ThirdPartyLibs/enet/include"}
if os.is("Windows") then if os.is("Windows") then

View File

@@ -5,7 +5,7 @@ project ("Test_enet_server")
language "C++" language "C++"
kind "ConsoleApp" kind "ConsoleApp"
targetdir "../../../bin"
includedirs {"../../../examples/ThirdPartyLibs/enet/include"} includedirs {"../../../examples/ThirdPartyLibs/enet/include"}
if os.is("Windows") then if os.is("Windows") then

View File

@@ -11,7 +11,7 @@
defines {"_VARIADIC_MAX=10"} defines {"_VARIADIC_MAX=10"}
end end
--targetdir "../../lib"
includedirs { includedirs {
".","include" ".","include"