bool PxCloth::_createClothPatch() { // Make sure we have a mesh. if ( !mClothMesh ) { _initClothMesh(); if ( !mClothMesh ) return false; } // Make sure we can change the world. mWorld->releaseWriteLock(); _releaseCloth(); NxClothDesc desc; desc.globalPose.setRowMajor44( getTransform() ); desc.thickness = mThickness; desc.density = mDensity; desc.bendingStiffness = mBendingStiffness; desc.dampingCoefficient = mDampingCoefficient; desc.friction = mFriction; // start jc // todo: expose this desc.sleepLinearVelocity = 0.0000001f; // end jc if ( mBendingEnabled ) desc.flags |= NX_CLF_BENDING; if ( mDampingEnabled ) desc.flags |= NX_CLF_DAMPING; if ( mTriangleCollisionEnabled ) desc.flags |= NX_CLF_TRIANGLE_COLLISION; if ( mSelfCollisionEnabled ) desc.flags |= NX_CLF_SELFCOLLISION; desc.clothMesh = mClothMesh; desc.meshData = mReceiveBuffers; if ( !desc.isValid() ) return false; mCloth = mScene->createCloth( desc ); mIsVBDirty = true; _updateStaticCloth(); _setupAttachments(); return true; }
void PhysXCloth::init(NxClothDesc &desc, NxClothMeshDesc &meshDesc) { allocateReceiveBuffers(meshDesc.numVertices, meshDesc.numTriangles); cookMesh(meshDesc); releaseMeshDescBuffers(meshDesc); desc.clothMesh = mClothMesh; desc.meshData = mReceiveBuffers; assert(desc.isValid()); mCloth = mScene->createCloth(desc); mCloth->wakeUp(); mInitDone = true; }