diff options
Diffstat (limited to 'PhysX_3.4/Source/ImmediateMode/src/NpImmediateMode.cpp')
| -rw-r--r-- | PhysX_3.4/Source/ImmediateMode/src/NpImmediateMode.cpp | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/PhysX_3.4/Source/ImmediateMode/src/NpImmediateMode.cpp b/PhysX_3.4/Source/ImmediateMode/src/NpImmediateMode.cpp index c2d1b2f8..ad976d12 100644 --- a/PhysX_3.4/Source/ImmediateMode/src/NpImmediateMode.cpp +++ b/PhysX_3.4/Source/ImmediateMode/src/NpImmediateMode.cpp @@ -413,31 +413,43 @@ namespace physx for (PxU32 i = 0; i < nbHeaders; ++i) { PxConstraintBatchHeader& batchHeader = batchHeaders[i]; + + PxU8 type = DY_SC_TYPE_BLOCK_1D; if (batchHeader.mStride == 4) { PxU32 totalRows = 0; PxU32 maxRows = 0; + bool batchable = true; for (PxU32 a = 0; a < batchHeader.mStride; ++a) { + if (jointDescs[currentDescIdx + a].numRows == 0) + { + batchable = false; + break; + } totalRows += jointDescs[currentDescIdx + a].numRows; maxRows = PxMax(maxRows, jointDescs[currentDescIdx + a].numRows); } - state = Dy::setupSolverConstraint4 - (jointDescs + currentDescIdx, - dt, invDt, totalRows, - allocator, maxRows); + if (batchable) + { + state = Dy::setupSolverConstraint4 + (jointDescs + currentDescIdx, + dt, invDt, totalRows, + allocator, maxRows); + } } if (state == Dy::SolverConstraintPrepState::eUNBATCHABLE) { + type = DY_SC_TYPE_RB_1D; for (PxU32 a = 0; a < batchHeader.mStride; ++a) { Dy::ConstraintHelper::setupSolverConstraint(jointDescs[currentDescIdx + a], allocator, dt, invDt); } } - batchHeader.mConstraintType = *jointDescs[currentDescIdx].desc->constraint; + batchHeader.mConstraintType = type; currentDescIdx += batchHeader.mStride; } @@ -678,8 +690,12 @@ namespace physx if (cache.isMultiManifold()) { multiManifold.fromBuffer(reinterpret_cast<PxU8*>(&cache.getMultipleManifold())); - cache.setManifold(&multiManifold); } + else + { + multiManifold.initialize(); + } + cache.setMultiManifold(&multiManifold); //Do collision detection, then write manifold out... g_PCMContactMethodTable[type0][type1](geomUnion0, geomUnion1, transform0, transform1, params, cache, contactBuffer, NULL); |