implement GPU breakable constraints
add GPU fixed constraint fix performance issue with concave meshes (didn't clear the number of concave-convex pairs, so it increased every frame)
This commit is contained in:
@@ -144,7 +144,7 @@ int GpuConstraintsDemo::createDynamicsObjects2(const ConstructionInfo& ci, const
|
||||
int constraintType=0;
|
||||
for (int i=0;i<ci.arraySizeZ;i++)
|
||||
{
|
||||
//constraintType=(constraintType+1)&0x11;
|
||||
constraintType=(constraintType+1)&0x01;
|
||||
|
||||
for (int k=0;k<ci.arraySizeX;k++)
|
||||
{
|
||||
@@ -167,7 +167,9 @@ int GpuConstraintsDemo::createDynamicsObjects2(const ConstructionInfo& ci, const
|
||||
}
|
||||
//b3Vector3 position((j&1)+i*2.2,1+j*2.,(j&1)+k*2.2);
|
||||
//b3Vector3 position((-ci.arraySizeX/2*ci.gapX)+i*ci.gapX,1+j*2.,(-ci.arraySizeZ/2*ci.gapZ)+k*ci.gapZ);
|
||||
b3Vector3 position(1+j*2.,10+i*ci.gapX,(-ci.arraySizeZ/2*ci.gapZ)+k*ci.gapZ);
|
||||
b3Vector3 position(-ci.arraySizeY/2*2+1+j*2.,
|
||||
10+i*ci.gapX,
|
||||
(-ci.arraySizeZ/2*ci.gapZ)+k*ci.gapZ);
|
||||
|
||||
b3Quaternion orn(0,0,0,1);
|
||||
|
||||
@@ -189,10 +191,11 @@ int GpuConstraintsDemo::createDynamicsObjects2(const ConstructionInfo& ci, const
|
||||
{
|
||||
///enable next line to force CPU constraint solving
|
||||
//c = new b3Point2PointConstraint(pid,prevBody,b3Vector3(-1.1,0,0),b3Vector3(1.1,0,0));
|
||||
// c->setBreakingImpulseThreshold(14);
|
||||
float breakingThreshold=14;
|
||||
// c->setBreakingImpulseThreshold(breakingThreshold);
|
||||
b3Vector3 pivotInA(-1.1,0,0);
|
||||
b3Vector3 pivotInB (1.1,0,0);
|
||||
int cid = m_data->m_rigidBodyPipeline->createPoint2PointConstraint(pid,prevBody,pivotInA,pivotInB);
|
||||
int cid = m_data->m_rigidBodyPipeline->createPoint2PointConstraint(pid,prevBody,pivotInA,pivotInB,breakingThreshold);
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
@@ -209,8 +212,9 @@ int GpuConstraintsDemo::createDynamicsObjects2(const ConstructionInfo& ci, const
|
||||
b3Quaternion relTargetAB = frameInA.getRotation()*frameInB.getRotation().inverse();
|
||||
|
||||
//c = new b3FixedConstraint(pid,prevBody,frameInA,frameInB);
|
||||
float breakingThreshold = 15;//37.f;
|
||||
//c->setBreakingImpulseThreshold(37.1);
|
||||
int cid = m_data->m_rigidBodyPipeline->createFixedConstraint(pid,prevBody,pivotInA,pivotInB,relTargetAB);
|
||||
int cid = m_data->m_rigidBodyPipeline->createFixedConstraint(pid,prevBody,pivotInA,pivotInB,relTargetAB,breakingThreshold);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -62,6 +62,7 @@ static void MyResizeCallback( float width, float height)
|
||||
b3gWindowInterface* window=0;
|
||||
GwenUserInterface* gui = 0;
|
||||
bool gPause = false;
|
||||
bool gStep = false;
|
||||
bool gReset = false;
|
||||
|
||||
enum
|
||||
@@ -925,7 +926,8 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (gStep)
|
||||
gPause=true;
|
||||
|
||||
} while (!window->requestedExit() && !gReset);
|
||||
|
||||
|
||||
@@ -304,7 +304,7 @@ void ConcaveScene::setupScene(const ConstructionInfo& ci)
|
||||
//float camPos[4]={1,12.5,1.5,0};
|
||||
m_instancingRenderer->setCameraPitch(45);
|
||||
m_instancingRenderer->setCameraTargetPosition(camPos);
|
||||
m_instancingRenderer->setCameraDistance(25);
|
||||
m_instancingRenderer->setCameraDistance(155);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -209,6 +209,7 @@ void GpuRigidBodyDemo::clientMoveAndDisplay()
|
||||
{
|
||||
B3_PROFILE("stepSimulation");
|
||||
m_data->m_rigidBodyPipeline->stepSimulation(1./60.f);
|
||||
|
||||
}
|
||||
|
||||
if (numObjects)
|
||||
@@ -319,7 +320,8 @@ bool GpuRigidBodyDemo::mouseMoveCallback(float x,float y)
|
||||
dir *= m_data->m_pickDistance;
|
||||
newPivotB = rayFrom + dir;
|
||||
m_data->m_pickPivotInB = newPivotB;
|
||||
m_data->m_pickConstraint = m_data->m_rigidBodyPipeline->createPoint2PointConstraint(m_data->m_pickBody,m_data->m_pickFixedBody,m_data->m_pickPivotInA,m_data->m_pickPivotInB);
|
||||
m_data->m_rigidBodyPipeline->copyConstraintsToHost();
|
||||
m_data->m_pickConstraint = m_data->m_rigidBodyPipeline->createPoint2PointConstraint(m_data->m_pickBody,m_data->m_pickFixedBody,m_data->m_pickPivotInA,m_data->m_pickPivotInB,1e30);
|
||||
m_data->m_rigidBodyPipeline->writeAllInstancesToGpu();
|
||||
return true;
|
||||
}
|
||||
@@ -398,7 +400,8 @@ bool GpuRigidBodyDemo::mouseButtonCallback(int button, int state, float x, float
|
||||
pivotInB.w = 0.f;
|
||||
m_data->m_pickPivotInA = pivotInA;
|
||||
m_data->m_pickPivotInB = pivotInB;
|
||||
m_data->m_pickConstraint = m_data->m_rigidBodyPipeline->createPoint2PointConstraint(hitBodyA,m_data->m_pickFixedBody,pivotInA,pivotInB);//hitResults[0].m_hitResult0
|
||||
m_data->m_rigidBodyPipeline->copyConstraintsToHost();
|
||||
m_data->m_pickConstraint = m_data->m_rigidBodyPipeline->createPoint2PointConstraint(hitBodyA,m_data->m_pickFixedBody,pivotInA,pivotInB,1e30);//hitResults[0].m_hitResult0
|
||||
m_data->m_rigidBodyPipeline->writeAllInstancesToGpu();
|
||||
m_data->m_np->writeAllBodiesToGpu();
|
||||
m_data->m_pickDistance = (pivotInB-camPos).length();
|
||||
|
||||
Reference in New Issue
Block a user