disable help text by default in AllBulletDemos (text slows down many graphics cards)

improve CollisionDemo.cpp, show multi-contact generation using perturbation
improve ColladaConverter: add hinge/point 2 point constraint conversion support, add btScaledTriangleMeshShape support
Fix Dynamica MayaPlygin: remove 'active' flag, it has to be replaced by mass=0 for active, mass<>0 for passive
Added missing projectfiles
Fixed single-shot contact generation. it is disabled by default to improve performance
Bugfixes for character controller, thanks to John McCutchan for reporting
Constraint solver: better default settings
btDefaultAllocator: aligned allocator uses non-aligned allocator (instead of directly malloc/free)
disable memalign by default, use Bullet's aligned allocator
This commit is contained in:
erwin.coumans
2009-02-06 03:20:43 +00:00
parent 328116d015
commit 2162f6663d
34 changed files with 4029 additions and 239 deletions

View File

@@ -694,6 +694,26 @@
Name="Source Files"
>
</Filter>
<File
RelativePath=".\scripts\AEdCollisionShapeTemplate.mel"
>
</File>
<File
RelativePath=".\scripts\AEdNailConstraintTemplate.mel"
>
</File>
<File
RelativePath=".\scripts\AEdRigidBodyArrayTemplate.mel"
>
</File>
<File
RelativePath=".\scripts\AEdRigidBodyTemplate.mel"
>
</File>
<File
RelativePath=".\scripts\AEdSolverTemplate.mel"
>
</File>
<File
RelativePath=".\box_shape.h"
>
@@ -834,6 +854,14 @@
RelativePath=".\dSolverNode.h"
>
</File>
<File
RelativePath=".\scripts\dynamica.mel"
>
</File>
<File
RelativePath=".\scripts\dynamicaUI.mel"
>
</File>
<File
RelativePath=".\mathUtils.h"
>

View File

@@ -195,10 +195,10 @@ void initRigidBody(MObject &node)
MFnTransform fnTransform(fnDagNode.parent(0));
MPlug plgActive(node, rigidBodyNode::ia_active);
bool active = false;
plgActive.getValue(active);
if(active) {
MPlug plgMass(node, rigidBodyNode::ia_mass);
float mass = 0.f;
plgMass.getValue(mass);
if(mass>0.f) {
//active rigid body, set the world transform from the initial* attributes
MObject obj;
@@ -259,9 +259,11 @@ void initRigidBodyArray(MObject &node)
MFnTransform fnTransform(fnDagNode.parent(0));
MPlug plgActive(node, rigidBodyArrayNode::ia_active);
bool active = false;
plgActive.getValue(active);
MPlug plgMass(node, rigidBodyArrayNode::ia_mass);
float mass = 0.f;
plgMass.getValue(mass);
bool active = (mass>0.f);
if(active) {
//active rigid body, set the world transform from the initial* attributes
MObject obj;
@@ -382,9 +384,10 @@ void dSolverNode::gatherPassiveTransforms(MPlugArray &rbConnections, std::vector
MFnTransform fnTransform(fnDagNode.parent(0));
MPlug plgActive(node, rigidBodyNode::ia_active);
bool active = false;
plgActive.getValue(active);
MPlug plgMass(node, rigidBodyNode::ia_mass);
float mass = 0.f;
plgMass.getValue(mass);
bool active = (mass>0.f);
if(!active) {
MQuaternion mquat;
fnTransform.getRotation(mquat);
@@ -404,9 +407,10 @@ void dSolverNode::gatherPassiveTransforms(MPlugArray &rbConnections, std::vector
return;
}
MPlug plgActive(node, rigidBodyArrayNode::ia_active);
bool active = false;
plgActive.getValue(active);
MPlug plgMass(node, rigidBodyArrayNode::ia_mass);
float mass = 0.f;
plgMass.getValue(mass);
bool active = (mass>0.f);
if(!active) {
MPlug plgPosition(node, rigidBodyArrayNode::io_position);
MPlug plgRotation(node, rigidBodyArrayNode::io_rotation);
@@ -453,9 +457,10 @@ void dSolverNode::updatePassiveRigidBodies(MPlugArray &rbConnections, std::vecto
continue;
}
MPlug plgActive(node, rigidBodyNode::ia_active);
bool active = false;
plgActive.getValue(active);
MPlug plgMass(node, rigidBodyNode::ia_mass);
float mass = 0.f;
plgMass.getValue(mass);
bool active = (mass>0.f);
if(!active) {
//do linear interpolation for now
rb->set_transform(xforms[pb].m_x0 + t * (xforms[pb].m_x1 - xforms[pb].m_x0),
@@ -471,9 +476,10 @@ void dSolverNode::updatePassiveRigidBodies(MPlugArray &rbConnections, std::vecto
return;
}
MPlug plgActive(node, rigidBodyArrayNode::ia_active);
bool active = false;
plgActive.getValue(active);
MPlug plgMass(node, rigidBodyArrayNode::ia_mass);
float mass = 0.f;
plgMass.getValue(mass);
bool active = (mass>0.f);
if(!active) {
for(size_t j = 0; j < rbs.size(); ++j) {
rbs[j]->set_transform(xforms[pb].m_x0 + t * (xforms[pb].m_x1 - xforms[pb].m_x0),
@@ -503,9 +509,10 @@ void dSolverNode::updateActiveRigidBodies(MPlugArray &rbConnections)
MFnTransform fnTransform(fnDagNode.parent(0));
MPlug plgActive(node, rigidBodyNode::ia_active);
bool active = false;
plgActive.getValue(active);
MPlug plgMass(node, rigidBodyNode::ia_mass);
float mass = 0.f;
plgMass.getValue(mass);
bool active = (mass>0.f);
if(active) {
quatf rot;
vec3f pos;
@@ -517,10 +524,10 @@ void dSolverNode::updateActiveRigidBodies(MPlugArray &rbConnections)
rigidBodyArrayNode *rbNode = static_cast<rigidBodyArrayNode*>(fnDagNode.userNode());
std::vector<rigid_body_t::pointer>& rbs = rbNode->rigid_bodies();
MPlug plgActive(node, rigidBodyArrayNode::ia_active);
bool active = false;
plgActive.getValue(active);
MPlug plgMass(node, rigidBodyArrayNode::ia_mass);
float mass = 0.f;
plgMass.getValue(mass);
bool active = (mass>0.f);
//write the position and rotations
if(active) {
MPlug plgPosition(node, rigidBodyArrayNode::io_position);
@@ -574,9 +581,10 @@ void dSolverNode::applyFields(MPlugArray &rbConnections, float dt)
rigidBodyNode *rbNode = static_cast<rigidBodyNode*>(fnDagNode.userNode());
rigid_body_t::pointer rb = rbNode->rigid_body();
MPlug plgActive(node, rigidBodyNode::ia_active);
bool active = false;
plgActive.getValue(active);
MPlug plgMass(node, rigidBodyNode::ia_mass);
float mass = 0.f;
plgMass.getValue(mass);
bool active = (mass>0.f);
if(active) {
rigid_bodies.push_back(rb.get());
}
@@ -584,9 +592,10 @@ void dSolverNode::applyFields(MPlugArray &rbConnections, float dt)
rigidBodyArrayNode *rbNode = static_cast<rigidBodyArrayNode*>(fnDagNode.userNode());
std::vector<rigid_body_t::pointer>& rbs = rbNode->rigid_bodies();
MPlug plgActive(node, rigidBodyArrayNode::ia_active);
bool active = false;
plgActive.getValue(active);
MPlug plgMass(node, rigidBodyArrayNode::ia_mass);
float mass = 0.f;
plgMass.getValue(mass);
bool active = (mass>0.f);
if(active) {
for(size_t j = 0; j < rbs.size(); ++j) {
rigid_bodies.push_back(rbs[j].get());

View File

@@ -49,7 +49,7 @@ MString rigidBodyArrayNode::typeName("dRigidBodyArray");
MObject rigidBodyArrayNode::ia_collisionShape;
MObject rigidBodyArrayNode::ia_solver;
MObject rigidBodyArrayNode::ia_numBodies;
MObject rigidBodyArrayNode::ia_active;
MObject rigidBodyArrayNode::ia_mass;
MObject rigidBodyArrayNode::ia_restitution;
MObject rigidBodyArrayNode::ia_friction;
@@ -92,12 +92,7 @@ MStatus rigidBodyArrayNode::initialize()
status = addAttribute(ia_numBodies);
MCHECKSTATUS(status, "adding numBodies attribute")
ia_active = fnNumericAttr.create("active", "ac", MFnNumericData::kBoolean, 1, &status);
MCHECKSTATUS(status, "creating active attribute")
fnNumericAttr.setKeyable(true);
status = addAttribute(ia_active);
MCHECKSTATUS(status, "adding active attribute")
ia_mass = fnNumericAttr.create("mass", "ma", MFnNumericData::kDouble, 1.0, &status);
MCHECKSTATUS(status, "creating mass attribute")
fnNumericAttr.setKeyable(true);

View File

@@ -74,7 +74,7 @@ public:
static MObject ia_collisionShape;
static MObject ia_solver;
static MObject ia_numBodies;
static MObject ia_active;
//ia_active is obsolete and redundant -> use ia_mass == 0 for (ia_active==false), and ia_mass > 0 for (ia_active == true)
static MObject ia_mass;
static MObject ia_restitution;
static MObject ia_friction;

View File

@@ -45,7 +45,6 @@ MString rigidBodyNode::typeName("dRigidBody");
MObject rigidBodyNode::ia_collisionShape;
MObject rigidBodyNode::ia_solver;
MObject rigidBodyNode::ia_active;
MObject rigidBodyNode::ia_mass;
MObject rigidBodyNode::ia_restitution;
MObject rigidBodyNode::ia_friction;
@@ -77,12 +76,6 @@ MStatus rigidBodyNode::initialize()
status = addAttribute(ia_solver);
MCHECKSTATUS(status, "adding solver attribute")
ia_active = fnNumericAttr.create("active", "ac", MFnNumericData::kBoolean, 1, &status);
MCHECKSTATUS(status, "creating active attribute")
fnNumericAttr.setKeyable(true);
status = addAttribute(ia_active);
MCHECKSTATUS(status, "adding active attribute")
ia_mass = fnNumericAttr.create("mass", "ma", MFnNumericData::kDouble, 1.0, &status);
MCHECKSTATUS(status, "creating mass attribute")
fnNumericAttr.setKeyable(true);
@@ -184,8 +177,6 @@ MStatus rigidBodyNode::initialize()
status = attributeAffects(ia_solver, ca_solver);
MCHECKSTATUS(status, "adding attributeAffects(ia_solver, ca_solver)")
// status = attributeAffects(ia_active, ca_rigidBodyParam);
// MCHECKSTATUS(status, "adding attributeAffects(ia_active, ca_rigidBodyParam)")
return MS::kSuccess;
}
@@ -521,7 +512,6 @@ void rigidBodyNode::computeRigidBodyParam(const MPlug& plug, MDataBlock& data)
m_rigid_body->set_friction(data.inputValue(ia_friction).asDouble());
m_rigid_body->set_linear_damping(data.inputValue(ia_linearDamping).asDouble());
m_rigid_body->set_angular_damping(data.inputValue(ia_angularDamping).asDouble());
// m_rigid_body->set_kinematic(!data.inputValue(ia_active).asBool());
data.outputValue(ca_rigidBodyParam).set(true);
data.setClean(plug);

View File

@@ -68,7 +68,6 @@ public:
//Attributes
static MObject ia_collisionShape;
static MObject ia_solver;
static MObject ia_active;
static MObject ia_mass;
static MObject ia_restitution;
static MObject ia_friction;

View File

@@ -395,8 +395,15 @@ global proc dynamicaUI_STsubstepsChanged()
}
proc dynamicaUI_createRigidBody(int $active, int $collisionShapeType)
proc dynamicaUI_createRigidBody(int $activebody, int $collisionShapeType)
{
float $mass = 1;
if($activebody == false)
{
$mass = 0;
}
string $selection[] = `ls -selection -dag -leaf -showType -type "geometry"`;
//create dSolver node if necessary
@@ -419,7 +426,7 @@ proc dynamicaUI_createRigidBody(int $active, int $collisionShapeType)
connectAttr ($selection[$i * 2] + ".message") ($collisionShapeNode + ".inShape");
hide $shapeTransforms[0];
}
setAttr ($rigidBodyNode + ".active" ) $active;
setAttr ($rigidBodyNode + ".mass" ) $mass;
setAttr ($collisionShapeNode + ".type" ) $collisionShapeType;
float $pos[]= `getAttr ($shapeTransforms[0] + ".translate")`;
@@ -439,7 +446,7 @@ proc dynamicaUI_createRigidBody(int $active, int $collisionShapeType)
connectAttr ($collisionShapeNode + ".outCollisionShape") ($rigidBodyNode + ".inCollisionShape");
string $rigidBodyTransforms[] = `listRelatives -parent $rigidBodyNode`;
setAttr ($rigidBodyNode + ".active" ) $active;
setAttr ($rigidBodyNode + ".mass" ) $mass;
setAttr ($collisionShapeNode + ".type" ) $collisionShapeType;
$newBodies[0] = $rigidBodyTransforms[0];
}
@@ -562,8 +569,15 @@ global proc dynamicaUI_createPassiveMeshRB()
dynamicaUI_createRigidBody(false, 1);
}
proc dynamicaUI_createRigidBodyArray(int $active, int $collisionShapeType)
proc dynamicaUI_createRigidBodyArray(int $activebody, int $collisionShapeType)
{
float $mass = 1;
if ($activebody == false)
{
$mass = 0;
}
global int $dynamicaUI_createArrayUI_size[];
global float $dynamicaUI_createArrayUI_offset[];
@@ -586,7 +600,7 @@ proc dynamicaUI_createRigidBodyArray(int $active, int $collisionShapeType)
}
}
setAttr ($rigidBodyArrayNode + ".active" ) $active;
setAttr ($rigidBodyArrayNode + ".mass" ) $mass;
setAttr ($collisionShapeNode + ".type" ) $collisionShapeType;
select -r $rigidBodyTransforms[0];