Changeset View
Changeset View
Standalone View
Standalone View
extern/bullet2/src/BulletSoftBody/btDefaultSoftBodySolver.cpp
| Show All 15 Lines | |||||
| #include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h" | #include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h" | ||||
| #include "BulletCollision/CollisionDispatch/btCollisionObject.h" | #include "BulletCollision/CollisionDispatch/btCollisionObject.h" | ||||
| #include "BulletCollision/CollisionShapes/btCollisionShape.h" | #include "BulletCollision/CollisionShapes/btCollisionShape.h" | ||||
| #include "btDefaultSoftBodySolver.h" | #include "btDefaultSoftBodySolver.h" | ||||
| #include "BulletCollision/CollisionShapes/btCapsuleShape.h" | #include "BulletCollision/CollisionShapes/btCapsuleShape.h" | ||||
| #include "BulletSoftBody/btSoftBody.h" | #include "BulletSoftBody/btSoftBody.h" | ||||
| btDefaultSoftBodySolver::btDefaultSoftBodySolver() | btDefaultSoftBodySolver::btDefaultSoftBodySolver() | ||||
| { | { | ||||
| // Initial we will clearly need to update solver constants | // Initial we will clearly need to update solver constants | ||||
| // For now this is global for the cloths linked with this solver - we should probably make this body specific | // For now this is global for the cloths linked with this solver - we should probably make this body specific | ||||
| // for performance in future once we understand more clearly when constants need to be updated | // for performance in future once we understand more clearly when constants need to be updated | ||||
| m_updateSolverConstants = true; | m_updateSolverConstants = true; | ||||
| } | } | ||||
| btDefaultSoftBodySolver::~btDefaultSoftBodySolver() | btDefaultSoftBodySolver::~btDefaultSoftBodySolver() | ||||
| { | { | ||||
| } | } | ||||
| // In this case the data is already in the soft bodies so there is no need for us to do anything | // In this case the data is already in the soft bodies so there is no need for us to do anything | ||||
| void btDefaultSoftBodySolver::copyBackToSoftBodies(bool bMove) | void btDefaultSoftBodySolver::copyBackToSoftBodies(bool bMove) | ||||
| { | { | ||||
| } | } | ||||
| void btDefaultSoftBodySolver::optimize( btAlignedObjectArray< btSoftBody * > &softBodies , bool forceUpdate) | void btDefaultSoftBodySolver::optimize(btAlignedObjectArray<btSoftBody *> &softBodies, bool forceUpdate) | ||||
| { | { | ||||
| m_softBodySet.copyFromArray( softBodies ); | m_softBodySet.copyFromArray(softBodies); | ||||
| } | } | ||||
| void btDefaultSoftBodySolver::updateSoftBodies( ) | void btDefaultSoftBodySolver::updateSoftBodies() | ||||
| { | { | ||||
| for ( int i=0; i < m_softBodySet.size(); i++) | for (int i = 0; i < m_softBodySet.size(); i++) | ||||
| { | { | ||||
| btSoftBody* psb=(btSoftBody*)m_softBodySet[i]; | btSoftBody *psb = (btSoftBody *)m_softBodySet[i]; | ||||
| if (psb->isActive()) | if (psb->isActive()) | ||||
| { | { | ||||
| psb->integrateMotion(); | psb->integrateMotion(); | ||||
| } | } | ||||
| } | } | ||||
| } // updateSoftBodies | } // updateSoftBodies | ||||
| bool btDefaultSoftBodySolver::checkInitialized() | bool btDefaultSoftBodySolver::checkInitialized() | ||||
| { | { | ||||
| return true; | return true; | ||||
| } | } | ||||
| void btDefaultSoftBodySolver::solveConstraints( float solverdt ) | void btDefaultSoftBodySolver::solveConstraints(btScalar solverdt) | ||||
| { | { | ||||
| // Solve constraints for non-solver softbodies | // Solve constraints for non-solver softbodies | ||||
| for(int i=0; i < m_softBodySet.size(); ++i) | for (int i = 0; i < m_softBodySet.size(); ++i) | ||||
| { | { | ||||
| btSoftBody* psb = static_cast<btSoftBody*>(m_softBodySet[i]); | btSoftBody *psb = static_cast<btSoftBody *>(m_softBodySet[i]); | ||||
| if (psb->isActive()) | if (psb->isActive()) | ||||
| { | { | ||||
| psb->solveConstraints(); | psb->solveConstraints(); | ||||
| } | } | ||||
| } | } | ||||
| } // btDefaultSoftBodySolver::solveConstraints | } // btDefaultSoftBodySolver::solveConstraints | ||||
| void btDefaultSoftBodySolver::copySoftBodyToVertexBuffer( const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer ) | void btDefaultSoftBodySolver::copySoftBodyToVertexBuffer(const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer) | ||||
| { | { | ||||
| // Currently only support CPU output buffers | // Currently only support CPU output buffers | ||||
| // TODO: check for DX11 buffers. Take all offsets into the same DX11 buffer | // TODO: check for DX11 buffers. Take all offsets into the same DX11 buffer | ||||
| // and use them together on a single kernel call if possible by setting up a | // and use them together on a single kernel call if possible by setting up a | ||||
| // per-cloth target buffer array for the copy kernel. | // per-cloth target buffer array for the copy kernel. | ||||
| if( vertexBuffer->getBufferType() == btVertexBufferDescriptor::CPU_BUFFER ) | if (vertexBuffer->getBufferType() == btVertexBufferDescriptor::CPU_BUFFER) | ||||
| { | { | ||||
| const btAlignedObjectArray<btSoftBody::Node> &clothVertices( softBody->m_nodes ); | const btAlignedObjectArray<btSoftBody::Node> &clothVertices(softBody->m_nodes); | ||||
| int numVertices = clothVertices.size(); | int numVertices = clothVertices.size(); | ||||
| const btCPUVertexBufferDescriptor *cpuVertexBuffer = static_cast< btCPUVertexBufferDescriptor* >(vertexBuffer); | const btCPUVertexBufferDescriptor *cpuVertexBuffer = static_cast<btCPUVertexBufferDescriptor *>(vertexBuffer); | ||||
| float *basePointer = cpuVertexBuffer->getBasePointer(); | float *basePointer = cpuVertexBuffer->getBasePointer(); | ||||
| if( vertexBuffer->hasVertexPositions() ) | if (vertexBuffer->hasVertexPositions()) | ||||
| { | { | ||||
| const int vertexOffset = cpuVertexBuffer->getVertexOffset(); | const int vertexOffset = cpuVertexBuffer->getVertexOffset(); | ||||
| const int vertexStride = cpuVertexBuffer->getVertexStride(); | const int vertexStride = cpuVertexBuffer->getVertexStride(); | ||||
| float *vertexPointer = basePointer + vertexOffset; | float *vertexPointer = basePointer + vertexOffset; | ||||
| for( int vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex ) | for (int vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex) | ||||
| { | { | ||||
| btVector3 position = clothVertices[vertexIndex].m_x; | btVector3 position = clothVertices[vertexIndex].m_x; | ||||
| *(vertexPointer + 0) = position.getX(); | *(vertexPointer + 0) = (float)position.getX(); | ||||
| *(vertexPointer + 1) = position.getY(); | *(vertexPointer + 1) = (float)position.getY(); | ||||
| *(vertexPointer + 2) = position.getZ(); | *(vertexPointer + 2) = (float)position.getZ(); | ||||
| vertexPointer += vertexStride; | vertexPointer += vertexStride; | ||||
| } | } | ||||
| } | } | ||||
| if( vertexBuffer->hasNormals() ) | if (vertexBuffer->hasNormals()) | ||||
| { | { | ||||
| const int normalOffset = cpuVertexBuffer->getNormalOffset(); | const int normalOffset = cpuVertexBuffer->getNormalOffset(); | ||||
| const int normalStride = cpuVertexBuffer->getNormalStride(); | const int normalStride = cpuVertexBuffer->getNormalStride(); | ||||
| float *normalPointer = basePointer + normalOffset; | float *normalPointer = basePointer + normalOffset; | ||||
| for( int vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex ) | for (int vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex) | ||||
| { | { | ||||
| btVector3 normal = clothVertices[vertexIndex].m_n; | btVector3 normal = clothVertices[vertexIndex].m_n; | ||||
| *(normalPointer + 0) = normal.getX(); | *(normalPointer + 0) = (float)normal.getX(); | ||||
| *(normalPointer + 1) = normal.getY(); | *(normalPointer + 1) = (float)normal.getY(); | ||||
| *(normalPointer + 2) = normal.getZ(); | *(normalPointer + 2) = (float)normal.getZ(); | ||||
| normalPointer += normalStride; | normalPointer += normalStride; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } // btDefaultSoftBodySolver::copySoftBodyToVertexBuffer | } // btDefaultSoftBodySolver::copySoftBodyToVertexBuffer | ||||
| void btDefaultSoftBodySolver::processCollision( btSoftBody* softBody, btSoftBody* otherSoftBody) | void btDefaultSoftBodySolver::processCollision(btSoftBody *softBody, btSoftBody *otherSoftBody) | ||||
| { | { | ||||
| softBody->defaultCollisionHandler( otherSoftBody); | softBody->defaultCollisionHandler(otherSoftBody); | ||||
| } | } | ||||
| // For the default solver just leave the soft body to do its collision processing | // For the default solver just leave the soft body to do its collision processing | ||||
| void btDefaultSoftBodySolver::processCollision( btSoftBody *softBody, const btCollisionObjectWrapper* collisionObjectWrap ) | void btDefaultSoftBodySolver::processCollision(btSoftBody *softBody, const btCollisionObjectWrapper *collisionObjectWrap) | ||||
| { | { | ||||
| softBody->defaultCollisionHandler( collisionObjectWrap ); | softBody->defaultCollisionHandler(collisionObjectWrap); | ||||
| } // btDefaultSoftBodySolver::processCollision | } // btDefaultSoftBodySolver::processCollision | ||||
| void btDefaultSoftBodySolver::predictMotion(btScalar timeStep) | |||||
| void btDefaultSoftBodySolver::predictMotion( float timeStep ) | |||||
| { | { | ||||
| for ( int i=0; i < m_softBodySet.size(); ++i) | for (int i = 0; i < m_softBodySet.size(); ++i) | ||||
| { | { | ||||
| btSoftBody* psb = m_softBodySet[i]; | btSoftBody *psb = m_softBodySet[i]; | ||||
| if (psb->isActive()) | if (psb->isActive()) | ||||
| { | { | ||||
| psb->predictMotion(timeStep); | psb->predictMotion(timeStep); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||