diff --git a/Extras/Serialize/BulletFileLoader/bFile.cpp b/Extras/Serialize/BulletFileLoader/bFile.cpp index 0f5b7bcb0..3531dd59c 100644 --- a/Extras/Serialize/BulletFileLoader/bFile.cpp +++ b/Extras/Serialize/BulletFileLoader/bFile.cpp @@ -183,7 +183,8 @@ void bFile::parseInternal(bool verboseDumpAllTypes, char* memDna,int memDnaLengt return; char *blenderData = mFileBuffer; - int sdnaPos=0; + bChunkInd dna; + dna.oldPtr = 0; char *tempBuffer = blenderData; for (int i=0; i 0) + { + if (strncmp((tempBuffer + ChunkUtils::getOffset(mFlags)), "SDNANAME", 8) ==0) + dna.oldPtr = (tempBuffer + ChunkUtils::getOffset(mFlags)); + else dna.oldPtr = 0; + } + else + dna.oldPtr = 0; + } + + 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(blenderData+sdnaPos, mFileLen-sdnaPos, (mFlags & FD_ENDIAN_SWAP)!=0); + mFileDNA->init((char*)dna.oldPtr, dna.len, (mFlags & FD_ENDIAN_SWAP)!=0); if (mVersion==276) { @@ -348,9 +367,10 @@ char* bFile::readStruct(char *head, bChunkInd& dataChunk) numallocs++; // numBlocks * length - int allocLen = curLen > oldLen ? curLen : oldLen; + + int allocLen = (curLen); char *dataAlloc = new char[(dataChunk.nr*allocLen)+1]; - memset(dataAlloc, 0, (dataChunk.nr*allocLen)+1); + memset(dataAlloc, 0, (dataChunk.nr*allocLen)); // track allocated addDataBlock(dataAlloc); diff --git a/src/BulletMultiThreaded/btParallelConstraintSolver.cpp b/src/BulletMultiThreaded/btParallelConstraintSolver.cpp index 8b83a1146..9f2767c71 100644 --- a/src/BulletMultiThreaded/btParallelConstraintSolver.cpp +++ b/src/BulletMultiThreaded/btParallelConstraintSolver.cpp @@ -99,11 +99,11 @@ void pfxSolveLinearConstraintRow(PfxConstraintRow &constraint, float massInvB,const vmMatrix3 &inertiaInvB,const vmVector3 &rB) { const vmVector3 normal(btReadVector3(constraint.mNormal)); - float deltaImpulse = constraint.mRhs; + btScalar deltaImpulse = constraint.mRhs; vmVector3 dVA = deltaLinearVelocityA + cross(deltaAngularVelocityA,rA); vmVector3 dVB = deltaLinearVelocityB + cross(deltaAngularVelocityB,rB); deltaImpulse -= constraint.mJacDiagInv * dot(normal,dVA-dVB); - float oldImpulse = constraint.mAccumImpulse; + btScalar oldImpulse = constraint.mAccumImpulse; constraint.mAccumImpulse = btClamped(oldImpulse + deltaImpulse,constraint.mLowerLimit,constraint.mUpperLimit); deltaImpulse = constraint.mAccumImpulse - oldImpulse; deltaLinearVelocityA += deltaImpulse * massInvA * normal; diff --git a/src/BulletMultiThreaded/btParallelConstraintSolver.h b/src/BulletMultiThreaded/btParallelConstraintSolver.h index 2e8fbaf13..0ff820a4c 100644 --- a/src/BulletMultiThreaded/btParallelConstraintSolver.h +++ b/src/BulletMultiThreaded/btParallelConstraintSolver.h @@ -133,6 +133,31 @@ ATTRIBUTE_ALIGNED16(struct) PfxSolverBody { #include "SpuDispatch/BulletPE2ConstraintSolverSpursSupport.h" #endif +static SIMD_FORCE_INLINE vmVector3 btReadVector3(const double* p) +{ + float tmp[3] = {p[0],p[1],p[2]}; + vmVector3 v; + loadXYZ(v, tmp); + return v; +} + +static SIMD_FORCE_INLINE vmQuat btReadQuat(const double* p) +{ + float tmp[4] = {p[0],p[1],p[2],p[4]}; + vmQuat vq; + loadXYZW(vq, tmp); + return vq; +} + +static SIMD_FORCE_INLINE void btStoreVector3(const vmVector3 &src, double* p) +{ + float tmp[3]; + vmVector3 v = src; + storeXYZ(v, tmp); + p[0] = tmp[0]; + p[1] = tmp[1]; + p[2] = tmp[2]; +} static SIMD_FORCE_INLINE vmVector3 btReadVector3(const float* p)