diff --git a/Extras/MayaPlugin/BulletMayaPlugin.vcproj b/Extras/MayaPlugin/BulletMayaPlugin.vcproj
index ae45b4f72..718cf5fd3 100644
--- a/Extras/MayaPlugin/BulletMayaPlugin.vcproj
+++ b/Extras/MayaPlugin/BulletMayaPlugin.vcproj
@@ -51,7 +51,7 @@
Name="VCCLCompilerTool"
AdditionalOptions="/GR /GS /EHsc"
Optimization="0"
- AdditionalIncludeDirectories=".;"C:\Program Files\Autodesk\Maya2009\include";"C:\Program Files\Autodesk\Maya2008\include";"C:\Program Files\Alias\Maya8.0\include";../../src;../../Extras\GIMPACT\include"
+ AdditionalIncludeDirectories=".;"C:\Program Files\Autodesk\Maya8.5\include";../../src;../../Extras\GIMPACT\include"
PreprocessorDefinitions="_DEBUG;WIN32;_WINDOWS;NT_PLUGIN;REQUIRE_IOSTREAM"
RuntimeLibrary="3"
AssemblerListingLocation=".\Debug/"
@@ -80,7 +80,7 @@
OutputFile="./BulletMayaPluginDebug.mll"
LinkIncremental="2"
SuppressStartupBanner="true"
- AdditionalLibraryDirectories="..\..\lib;"C:\Program Files\Autodesk\Maya2009\lib";"C:\Program Files\Autodesk\Maya2008\lib";C:\develop\disney_bulletmaya\boost_1_35_0\lib;"C:\Program Files\Alias\Maya8.0\lib""
+ AdditionalLibraryDirectories="..\..\lib;"C:\Program Files\Autodesk\Maya8.5\lib";C:\develop\disney_bulletmaya\boost_1_35_0\lib"
GenerateDebugInformation="true"
ProgramDatabaseFile=".\Debug/BulletMayaPlugin.pdb"
SubSystem="2"
@@ -113,6 +113,65 @@
CommandLine="install.bat"
/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
getLocalScaling();
std::vector vertices(m_vertices.size());
- for(int i = 0; i < vertices.size(); ++i) {
+ for(unsigned int i = 0; i < vertices.size(); ++i) {
vertices[i] = vec3f(scale.x() * m_vertices[i][0], scale.y() * m_vertices[i][1], scale.z() * m_vertices[i][2]);
}
m_volume = ::volume(&(vertices[0]), (int*)&(m_indices[0]), (int)m_indices.size());
diff --git a/Extras/MayaPlugin/bt_plane_shape.h b/Extras/MayaPlugin/bt_plane_shape.h
index b9b9cbff2..f24294cec 100644
--- a/Extras/MayaPlugin/bt_plane_shape.h
+++ b/Extras/MayaPlugin/bt_plane_shape.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//bt_plane_shape.h
@@ -36,7 +40,7 @@ public:
// std::cout << "bt_plane_shape_t::draw" << std::endl;
// btStaticPlaneShape *plane_shape = static_cast(shape());
glPushMatrix();
- glScalef(100.0, 0.001, 100.0);
+ glScalef(100.0f, 0.001f, 100.0f);
if(draw_style & collision_shape_t::kDSSolid) {
solid_cube();
} else {
diff --git a/Extras/MayaPlugin/bt_rigid_body.h b/Extras/MayaPlugin/bt_rigid_body.h
index 4789dcf14..4bb40dd05 100644
--- a/Extras/MayaPlugin/bt_rigid_body.h
+++ b/Extras/MayaPlugin/bt_rigid_body.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//bt_rigid_body.h
@@ -160,7 +164,7 @@ public:
int count = m_constraintRef.size();
for(int i=0; iupdate_constraint();
+ m_constraintRef[i]->update_constraint(this);
}
}
@@ -181,14 +185,14 @@ protected:
bt_rigid_body_t(collision_shape_impl_t* cs):
m_collision_shape(cs),
m_mass(1),
- m_inertia(2.0/5.0, 2.0/5.0, 2.0/5.0),
+ m_inertia(2.0f/5.0f, 2.0f/5.0f, 2.0f/5.0f),
m_linear_damping(0),
m_angular_damping(0)
{
bt_collision_shape_t* bt_shape = dynamic_cast(cs);
btRigidBody::btRigidBodyConstructionInfo rbInfo(m_mass, NULL, bt_shape->shape(), m_inertia);
rbInfo.m_restitution = 0;
- rbInfo.m_friction = 0.1;
+ rbInfo.m_friction = 0.1f;
rbInfo.m_linearDamping = m_linear_damping;
rbInfo.m_angularDamping = m_angular_damping;
m_body.reset(new btRigidBody(rbInfo));
diff --git a/Extras/MayaPlugin/bt_solver.h b/Extras/MayaPlugin/bt_solver.h
index 3fa887a82..d588b1e60 100644
--- a/Extras/MayaPlugin/bt_solver.h
+++ b/Extras/MayaPlugin/bt_solver.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//bt_solver.h
@@ -79,6 +83,10 @@ public:
{
return new bt_nail_constraint_t(rb, pivot);
}
+ virtual nail_constraint_impl_t* create_nail_constraint(rigid_body_impl_t* rbA, rigid_body_impl_t* rbB, vec3f const& pivot)
+ {
+ return new bt_nail_constraint_t(rbA, rbB, pivot);
+ }
virtual hinge_constraint_impl_t* create_hinge_constraint(rigid_body_impl_t* rb, vec3f const& pivot)
{
return new bt_hinge_constraint_t(rb, pivot);
@@ -95,6 +103,7 @@ public:
virtual void add_rigid_body(rigid_body_impl_t* rb)
{
bt_rigid_body_t* bt_body = static_cast(rb);
+ bt_body->body()->setActivationState(DISABLE_DEACTIVATION);
m_dynamicsWorld->addRigidBody(bt_body->body());
}
@@ -128,7 +137,7 @@ public:
virtual void step_simulation(float dt)
{
- m_dynamicsWorld->stepSimulation(dt, 1000, 1.0 / 120.0);
+ m_dynamicsWorld->stepSimulation(dt, 1000, 1.0f / 120.0f);
}
virtual void export_collada_file(const char* fileName);
diff --git a/Extras/MayaPlugin/bt_sphere_shape.h b/Extras/MayaPlugin/bt_sphere_shape.h
index c63c1cb27..56dc9029b 100644
--- a/Extras/MayaPlugin/bt_sphere_shape.h
+++ b/Extras/MayaPlugin/bt_sphere_shape.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//bt_sphere_shape.h
@@ -88,12 +92,12 @@ protected:
{
btSphereShape *sphere_shape = static_cast(shape());
float radius = sphere_shape->getRadius();
- m_volume = (4.0 * 3.1415926 * radius * radius * radius) / 3.0;
+ m_volume = (4.0f * 3.1415926f * radius * radius * radius) / 3.0f;
m_center = vec3f(0, 0, 0);
m_rotation = qidentity();
- m_local_inertia = vec3f(2.0 / 5.0 * radius * radius,
- 2.0 / 5.0 * radius * radius,
- 2.0 / 5.0 * radius * radius);
+ m_local_inertia = vec3f(2.0f / 5.0f * radius * radius,
+ 2.0f / 5.0f * radius * radius,
+ 2.0f / 5.0f * radius * radius);
}
private:
diff --git a/Extras/MayaPlugin/constraint/bt_constraint.h b/Extras/MayaPlugin/constraint/bt_constraint.h
index ab4fa149d..2f16fb80c 100644
--- a/Extras/MayaPlugin/constraint/bt_constraint.h
+++ b/Extras/MayaPlugin/constraint/bt_constraint.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//bt_constraint.h
@@ -29,6 +33,8 @@ Written by: Nicola Candussi
#include "btBulletDynamicsCommon.h"
#include "shared_ptr.h"
+class rigid_body_impl_t;
+
class bt_constraint_t
{
public:
@@ -40,7 +46,7 @@ protected:
btTypedConstraint* constraint() { return m_constraint.get(); }
void set_constraint(btTypedConstraint *constraint) { return m_constraint.reset(constraint); }
- virtual void update_constraint() = 0;
+ virtual void update_constraint(rigid_body_impl_t* rb) = 0;
public:
friend class bt_rigid_body_t;
diff --git a/Extras/MayaPlugin/constraint/bt_hinge_constraint.h b/Extras/MayaPlugin/constraint/bt_hinge_constraint.h
index 12777f594..f9a02fadf 100644
--- a/Extras/MayaPlugin/constraint/bt_hinge_constraint.h
+++ b/Extras/MayaPlugin/constraint/bt_hinge_constraint.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Herbert Law
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//bt_hinge_constraint.h
@@ -97,7 +101,7 @@ public:
hinge->enableAngularMotor(enable, velocity, impulse);
}
- virtual void update_constraint()
+ virtual void update_constraint(rigid_body_impl_t* rb)
{
btHingeConstraint* hc = static_cast(m_constraint.get());
btVector3 world = hc->getBFrame().getOrigin();
diff --git a/Extras/MayaPlugin/constraint/bt_nail_constraint.h b/Extras/MayaPlugin/constraint/bt_nail_constraint.h
index 119e99471..6cbf9c8db 100644
--- a/Extras/MayaPlugin/constraint/bt_nail_constraint.h
+++ b/Extras/MayaPlugin/constraint/bt_nail_constraint.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//bt_nail_constraint.h
@@ -58,10 +62,15 @@ public:
}
virtual void get_world_pivot(vec3f &p) const {
+// btPoint2PointConstraint const* p2pc = static_cast(m_constraint.get());
+// p[0] = p2pc->getPivotInB().x();
+// p[1] = p2pc->getPivotInB().y();
+// p[2] = p2pc->getPivotInB().z();
btPoint2PointConstraint const* p2pc = static_cast(m_constraint.get());
- p[0] = p2pc->getPivotInB().x();
- p[1] = p2pc->getPivotInB().y();
- p[2] = p2pc->getPivotInB().z();
+ btVector3 pivotAinW = p2pc->getRigidBodyA().getCenterOfMassTransform()* p2pc->getPivotInA();
+ p[0] = pivotAinW.x();
+ p[1] = pivotAinW.y();
+ p[2] = pivotAinW.z();
}
virtual void set_world(vec3f const &p) {
@@ -69,23 +78,47 @@ public:
btVector3 world(p[0], p[1], p[2]);
btVector3 pivotA = p2pc->getRigidBodyA().getWorldTransform().inverse() (world);
p2pc->setPivotA(pivotA);
- p2pc->setPivotB(world);
- p2pc->buildJacobian();
+ btVector3 pivotB = p2pc->getRigidBodyB().getWorldTransform().inverse() (world);
+ p2pc->setPivotB(pivotB);
+// p2pc->buildJacobian();
}
virtual void get_world(vec3f &p) const {
btPoint2PointConstraint const* p2pc = static_cast(m_constraint.get());
- p[0] = p2pc->getPivotInB().x();
- p[1] = p2pc->getPivotInB().y();
- p[2] = p2pc->getPivotInB().z();
+ btVector3 pivotAinW = p2pc->getRigidBodyA().getCenterOfMassTransform()* p2pc->getPivotInA();
+// p[0] = p2pc->getPivotInB().x();
+// p[1] = p2pc->getPivotInB().y();
+// p[2] = p2pc->getPivotInB().z();
+ p[0] = pivotAinW.x();
+ p[1] = pivotAinW.y();
+ p[2] = pivotAinW.z();
}
- virtual void update_constraint()
+ virtual void update_constraint(rigid_body_impl_t* rb)
{
+ btRigidBody* bt_body = static_cast(rb)->body();
btPoint2PointConstraint* p2pc = static_cast(m_constraint.get());
- btVector3 world = p2pc->getPivotInB();
- btVector3 pivotA = p2pc->getRigidBodyA().getWorldTransform().inverse() (world);
- p2pc->setPivotA(pivotA);
+ btVector3 world, pivot;
+ if(bt_body == &p2pc->getRigidBodyA())
+ {
+ world = p2pc->getRigidBodyB().getWorldTransform() * p2pc->getPivotInB();
+ pivot = p2pc->getRigidBodyA().getWorldTransform().inverse() * world;
+ p2pc->setPivotA(pivot);
+ }
+ else if(bt_body == &p2pc->getRigidBodyB())
+ {
+ world = p2pc->getRigidBodyA().getWorldTransform() * p2pc->getPivotInA();
+ pivot = p2pc->getRigidBodyB().getWorldTransform().inverse() * world;
+ p2pc->setPivotB(pivot);
+ }
+ else
+ {
+ world.setValue(0.f, 0.f, 0.f);
+ }
+
+// btVector3 world = p2pc->getPivotInB();
+// btVector3 pivotA = p2pc->getRigidBodyA().getWorldTransform().inverse() (world);
+// p2pc->setPivotA(pivotA);
}
protected:
friend class bt_solver_t;
@@ -93,12 +126,34 @@ protected:
bt_nail_constraint_t(rigid_body_impl_t* rb, vec3f const& pivot):
nail_constraint_impl_t()
{
+ btVector3 pivotW(pivot[0], pivot[1], pivot[2]);
btRigidBody& bt_body = *static_cast(rb)->body();
- btVector3 pivotA = bt_body.getCenterOfMassPosition();
- m_constraint.reset(new btPoint2PointConstraint(bt_body, -pivotA));
+ const btTransform& tr = bt_body.getCenterOfMassTransform();
+ btTransform iTr = tr.inverse();
+ btVector3 nPivot = iTr * pivotW;
+ m_constraint.reset(new btPoint2PointConstraint(bt_body, nPivot));
+// btVector3 pivotA = bt_body.getCenterOfMassPosition();
+// m_constraint.reset(new btPoint2PointConstraint(bt_body, -pivotA));
rb->add_constraint(this);
}
+ bt_nail_constraint_t(rigid_body_impl_t* rbA, rigid_body_impl_t* rbB, vec3f const& pivot):
+ nail_constraint_impl_t()
+ {
+ btVector3 pivotW(pivot[0], pivot[1], pivot[2]);
+ btRigidBody& bt_bodyA = *static_cast(rbA)->body();
+ const btTransform& trA = bt_bodyA.getCenterOfMassTransform();
+ btTransform iTrA = trA.inverse();
+ btVector3 nPivotA = iTrA * pivotW;
+ btRigidBody& bt_bodyB = *static_cast(rbB)->body();
+ const btTransform& trB = bt_bodyB.getCenterOfMassTransform();
+ btTransform iTrB = trB.inverse();
+ btVector3 nPivotB = iTrB * pivotW;
+ m_constraint.reset(new btPoint2PointConstraint(bt_bodyA, bt_bodyB, nPivotA, nPivotB));
+ rbA->add_constraint(this);
+ rbB->add_constraint(this);
+ }
+
private:
};
diff --git a/Extras/MayaPlugin/constraint/bt_sixdof_constraint.h b/Extras/MayaPlugin/constraint/bt_sixdof_constraint.h
index 01d4fb2db..b60aff31a 100644
--- a/Extras/MayaPlugin/constraint/bt_sixdof_constraint.h
+++ b/Extras/MayaPlugin/constraint/bt_sixdof_constraint.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Herbert Law
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//bt_sixdof_constraint.h
@@ -94,7 +98,7 @@ public:
*/ p = world;
}
- virtual void update_constraint()
+ virtual void update_constraint(rigid_body_impl_t* rb)
{
btGeneric6DofConstraint* constraint = static_cast(m_constraint.get());
constraint->getFrameOffsetA() = constraint->getRigidBodyA().getCenterOfMassTransform().inverse();
diff --git a/Extras/MayaPlugin/constraint/bt_slider_constraint.h b/Extras/MayaPlugin/constraint/bt_slider_constraint.h
index a5656550f..cc13971df 100644
--- a/Extras/MayaPlugin/constraint/bt_slider_constraint.h
+++ b/Extras/MayaPlugin/constraint/bt_slider_constraint.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Herbert Law
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//bt_slider_constraint.h
@@ -95,7 +99,7 @@ public:
*/ p = world;
}
- virtual void update_constraint()
+ virtual void update_constraint(rigid_body_impl_t* rb)
{
/* btRigidBody& bt_bodyA = *static_cast(rbA)->body();
btRigidBody& bt_bodyB = *static_cast(rbB)->body();
diff --git a/Extras/MayaPlugin/constraint/nailConstraintNode.cpp b/Extras/MayaPlugin/constraint/nailConstraintNode.cpp
index d454950fc..760f2eb8e 100644
--- a/Extras/MayaPlugin/constraint/nailConstraintNode.cpp
+++ b/Extras/MayaPlugin/constraint/nailConstraintNode.cpp
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//nailConstraintNode.cpp
@@ -43,7 +47,8 @@ Written by: Nicola Candussi
MTypeId nailConstraintNode::typeId(0x10033A);
MString nailConstraintNode::typeName("dNailConstraint");
-MObject nailConstraintNode::ia_rigidBody;
+MObject nailConstraintNode::ia_rigidBodyA;
+MObject nailConstraintNode::ia_rigidBodyB;
MObject nailConstraintNode::ia_damping;
MObject nailConstraintNode::ca_constraint;
MObject nailConstraintNode::ca_constraintParam;
@@ -56,10 +61,15 @@ MStatus nailConstraintNode::initialize()
MFnNumericAttribute fnNumericAttr;
MFnMatrixAttribute fnMatrixAttr;
- ia_rigidBody = fnMsgAttr.create("inRigidBody", "inrb", &status);
- MCHECKSTATUS(status, "creating inRigidBody attribute")
- status = addAttribute(ia_rigidBody);
- MCHECKSTATUS(status, "adding inRigidBody attribute")
+ ia_rigidBodyA = fnMsgAttr.create("inRigidBodyA", "inrbA", &status);
+ MCHECKSTATUS(status, "creating inRigidBodyA attribute")
+ status = addAttribute(ia_rigidBodyA);
+ MCHECKSTATUS(status, "adding inRigidBodyA attribute")
+
+ ia_rigidBodyB = fnMsgAttr.create("inRigidBodyB", "inrbB", &status);
+ MCHECKSTATUS(status, "creating inRigidBodyB attribute")
+ status = addAttribute(ia_rigidBodyB);
+ MCHECKSTATUS(status, "adding inRigidBodyB attribute")
ia_damping = fnNumericAttr.create("damping", "dmp", MFnNumericData::kDouble, 1.0, &status);
MCHECKSTATUS(status, "creating damping attribute")
@@ -86,11 +96,17 @@ MStatus nailConstraintNode::initialize()
MCHECKSTATUS(status, "adding ca_constraintParam attribute")
- status = attributeAffects(ia_rigidBody, ca_constraint);
- MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBody, ca_constraint)")
+ status = attributeAffects(ia_rigidBodyA, ca_constraint);
+ MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraint)")
- status = attributeAffects(ia_rigidBody, ca_constraintParam);
- MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBody, ca_constraintParam)")
+ status = attributeAffects(ia_rigidBodyA, ca_constraintParam);
+ MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyA, ca_constraintParam)")
+
+ status = attributeAffects(ia_rigidBodyB, ca_constraint);
+ MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraint)")
+
+ status = attributeAffects(ia_rigidBodyB, ca_constraintParam);
+ MCHECKSTATUS(status, "adding attributeAffects(ia_rigidBodyB, ca_constraintParam)")
status = attributeAffects(ia_damping, ca_constraintParam);
MCHECKSTATUS(status, "adding attributeAffects(ia_damping, ca_constraintParam)")
@@ -174,19 +190,34 @@ void nailConstraintNode::draw( M3dView & view, const MDagPath &path,
( style != M3dView::kGouraudShaded && style != M3dView::kFlatShaded )) ) {
glColor3f(1.0, 1.0, 0.0);
}
- vec3f pos;
+ vec3f posA, posB;
+ rigid_body_t::pointer rigid_bodyB = NULL;
if (m_constraint) {
vec3f world;
m_constraint->get_world(world);
- vec3f posA;
- quatf rotA;
- m_constraint->rigid_body()->get_transform(posA, rotA);
- pos = posA - world;
+ vec3f posT;
+ quatf rotT;
+ m_constraint->rigid_bodyA()->get_transform(posT, rotT);
+ posA = posT - world;
+ rigid_bodyB = m_constraint->rigid_bodyB();
+ if(rigid_bodyB)
+ {
+ rigid_bodyB->get_transform(posT, rotT);
+ posB = posT - world;
+ }
}
glBegin(GL_LINES);
+
glVertex3f(0.0, 0.0, 0.0);
- glVertex3f(pos[0], pos[1], pos[2]);
+ glVertex3f(posA[0], posA[1], posA[2]);
+
+ if(rigid_bodyB)
+ {
+ glVertex3f(0.0, 0.0, 0.0);
+ glVertex3f(posB[0], posB[1], posB[2]);
+ }
+
glVertex3f(-1.0, 0.0, 0.0);
glVertex3f(1.0, 0.0, 0.0);
@@ -225,35 +256,83 @@ void nailConstraintNode::computeConstraint(const MPlug& plug, MDataBlock& data)
// std::cout << "nailConstraintNode::computeConstraint" << std::endl;
MObject thisObject(thisMObject());
- MPlug plgRigidBody(thisObject, ia_rigidBody);
+ MPlug plgRigidBodyA(thisObject, ia_rigidBodyA);
+ MPlug plgRigidBodyB(thisObject, ia_rigidBodyB);
MObject update;
//force evaluation of the rigidBody
- plgRigidBody.getValue(update);
+ plgRigidBodyA.getValue(update);
+ plgRigidBodyB.getValue(update);
- rigid_body_t::pointer rigid_body;
- if(plgRigidBody.isConnected()) {
+ rigid_body_t::pointer rigid_bodyA;
+ if(plgRigidBodyA.isConnected()) {
MPlugArray connections;
- plgRigidBody.connectedTo(connections, true, true);
+ plgRigidBodyA.connectedTo(connections, true, true);
if(connections.length() != 0) {
MFnDependencyNode fnNode(connections[0].node());
if(fnNode.typeId() == rigidBodyNode::typeId) {
- rigidBodyNode *pRigidBodyNode = static_cast(fnNode.userNode());
- rigid_body = pRigidBodyNode->rigid_body();
+ rigidBodyNode *pRigidBodyNodeA = static_cast(fnNode.userNode());
+ rigid_bodyA = pRigidBodyNodeA->rigid_body();
} else {
- std::cout << "nailConstraintNode connected to a non-rigidbody node!" << std::endl;
+ std::cout << "nailConstraintNode connected to a non-rigidbody node A!" << std::endl;
}
}
}
- if(rigid_body) {
+ rigid_body_t::pointer rigid_bodyB;
+ if(plgRigidBodyB.isConnected()) {
+ MPlugArray connections;
+ plgRigidBodyB.connectedTo(connections, true, true);
+ if(connections.length() != 0) {
+ MFnDependencyNode fnNode(connections[0].node());
+ if(fnNode.typeId() == rigidBodyNode::typeId) {
+ rigidBodyNode *pRigidBodyNodeB = static_cast(fnNode.userNode());
+ rigid_bodyB = pRigidBodyNodeB->rigid_body();
+ } else {
+ std::cout << "nailConstraintNode connected to a non-rigidbody node B!" << std::endl;
+ }
+ }
+ }
+
+ if((rigid_bodyA != NULL) && (rigid_bodyB != NULL))
+ {
+ constraint_t::pointer constraint = static_cast(m_constraint);
+ solver_t::remove_constraint(constraint);
+ vec3f posA, posB, posP;
+ quatf rotA, rotB;
+ rigid_bodyA->get_transform(posA, rotA);
+ rigid_bodyB->get_transform(posB, rotB);
+ posP = posA;
+ m_constraint = solver_t::create_nail_constraint(rigid_bodyA, rigid_bodyB, posP);
+ constraint = static_cast(m_constraint);
+ solver_t::add_constraint(constraint);
+ }
+ else if(rigid_bodyA)
+ {
//not connected to a rigid body, put a default one
constraint_t::pointer constraint = static_cast(m_constraint);
solver_t::remove_constraint(constraint);
- m_constraint = solver_t::create_nail_constraint(rigid_body);
+ vec3f posA, posP;
+ quatf rotA;
+ rigid_bodyA->get_transform(posA, rotA);
+ posP = posA;
+ m_constraint = solver_t::create_nail_constraint(rigid_bodyA, posP);
constraint = static_cast(m_constraint);
solver_t::add_constraint(constraint);
}
+ MFnDagNode mDagNode(thisObject);
+ if(mDagNode.parentCount() == 0)
+ {
+ std::cout << "No transform for nail constraint found!" << std::endl;
+ }
+ else
+ {
+ MFnTransform mTransform(mDagNode.parent(0));
+ vec3f constrPos;
+ m_constraint->get_world(constrPos);
+ mTransform.setTranslation(MVector(constrPos[0], constrPos[1], constrPos[2]), MSpace::kTransform);
+ }
+
data.outputValue(ca_constraint).set(true);
data.setClean(plug);
}
@@ -293,7 +372,14 @@ void nailConstraintNode::computeWorldMatrix(const MPlug& plug, MDataBlock& data)
std::cout << "pivot (" << pivot[0] << "," << pivot[0] << "," << pivot[0] << ")" << std::endl;
*/
// std::cout << "mtranslation (" << mtranslation[0] << "," << mtranslation[0] << "," << mtranslation[0] << ")" << std::endl;
- m_constraint->set_world(vec3f((float) mtranslation[0], (float) mtranslation[1], (float) mtranslation[2]));
+ float deltaX = world[0] - float(mtranslation.x);
+ float deltaY = world[1] - float(mtranslation.y);
+ float deltaZ = world[2] - float(mtranslation.z);
+ float deltaSq = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;
+ if(deltaSq > 0.000001f)
+ {
+ m_constraint->set_world(vec3f((float) mtranslation[0], (float) mtranslation[1], (float) mtranslation[2]));
+ }
}
}
diff --git a/Extras/MayaPlugin/constraint/nailConstraintNode.h b/Extras/MayaPlugin/constraint/nailConstraintNode.h
index c93d43604..3224290e0 100644
--- a/Extras/MayaPlugin/constraint/nailConstraintNode.h
+++ b/Extras/MayaPlugin/constraint/nailConstraintNode.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//nailConstraintNode.h
@@ -66,7 +70,8 @@ public:
public:
//Attributes
- static MObject ia_rigidBody;
+ static MObject ia_rigidBodyA;
+ static MObject ia_rigidBodyB;
static MObject ia_damping;
static MObject ca_constraint;
diff --git a/Extras/MayaPlugin/constraint/nail_constraint.h b/Extras/MayaPlugin/constraint/nail_constraint.h
index 6a44e3fc6..2df28fb57 100644
--- a/Extras/MayaPlugin/constraint/nail_constraint.h
+++ b/Extras/MayaPlugin/constraint/nail_constraint.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//nail_constraint.h
@@ -39,7 +43,8 @@ public:
typedef shared_ptr pointer;
//
- rigid_body_t::pointer rigid_body() { return m_rigid_body; }
+ rigid_body_t::pointer rigid_bodyA() { return m_rigid_bodyA; }
+ rigid_body_t::pointer rigid_bodyB() { return m_rigid_bodyB; }
//
void set_pivotA(vec3f const& p) {
@@ -81,14 +86,23 @@ public:
protected:
friend class solver_t;
- nail_constraint_t(nail_constraint_impl_t* impl, rigid_body_t::pointer& rigid_body):
+ nail_constraint_t(nail_constraint_impl_t* impl, rigid_body_t::pointer& rigid_bodyA):
constraint_t(impl),
- m_rigid_body(rigid_body)
+ m_rigid_bodyA(rigid_bodyA),
+ m_rigid_bodyB(NULL)
+ {
+ }
+
+ nail_constraint_t(nail_constraint_impl_t* impl, rigid_body_t::pointer& rigid_bodyA, rigid_body_t::pointer& rigid_bodyB):
+ constraint_t(impl),
+ m_rigid_bodyA(rigid_bodyA),
+ m_rigid_bodyB(rigid_bodyB)
{
}
private:
- rigid_body_t::pointer m_rigid_body;
+ rigid_body_t::pointer m_rigid_bodyA;
+ rigid_body_t::pointer m_rigid_bodyB;
};
diff --git a/Extras/MayaPlugin/dSolverNode.cpp b/Extras/MayaPlugin/dSolverNode.cpp
index f25f76057..5a0476b90 100644
--- a/Extras/MayaPlugin/dSolverNode.cpp
+++ b/Extras/MayaPlugin/dSolverNode.cpp
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//dSolverNode.cpp
@@ -49,6 +53,7 @@ Written by: Nicola Candussi
#include "solver.h"
#include "rigidBodyNode.h"
#include "rigidBodyArrayNode.h"
+#include "constraint/nailConstraintNode.h"
#include "pdbIO.h"
MTypeId dSolverNode::typeId(0x100331);
@@ -357,6 +362,7 @@ void dSolverNode::initRigidBodies(MPlugArray &rbConnections)
if(fnNode.typeId() == rigidBodyNode::typeId) {
initRigidBody(node);
+ updateConstraint(node);
} else if(fnNode.typeId() == rigidBodyArrayNode::typeId) {
initRigidBodyArray(node);
}
@@ -491,6 +497,34 @@ void dSolverNode::updatePassiveRigidBodies(MPlugArray &rbConnections, std::vecto
}
}
+void dSolverNode::updateConstraint(MObject& bodyNode)
+{
+ MFnDagNode fnDagNode(bodyNode);
+ rigidBodyNode *rbNode = static_cast(fnDagNode.userNode());
+ MPlug plgMessages(bodyNode, rbNode->message);
+ MPlugArray rbMsgConnections;
+ plgMessages.connectedTo(rbMsgConnections, false, true);
+ for(size_t j = 0; j < rbMsgConnections.length(); j++)
+ {
+ MObject msgNode = rbMsgConnections[j].node();
+ MFnDagNode msgDagNode(msgNode);
+ if(msgDagNode.typeId() == nailConstraintNode::typeId)
+ {
+ nailConstraintNode* nailNode = static_cast(msgDagNode.userNode());
+ if(msgDagNode.parentCount() == 0)
+ {
+ std::cout << "No transform for nail constraint found!" << std::endl;
+ continue;
+ }
+ MFnTransform msgTransform(msgDagNode.parent(0));
+ nail_constraint_t::pointer nail = nailNode->constraint();
+ vec3f constrPos;
+ nail->get_world(constrPos);
+ msgTransform.setTranslation(MVector(constrPos[0], constrPos[1], constrPos[2]), MSpace::kTransform);
+ }
+ }
+}
+
//update the scene after a simulation step
void dSolverNode::updateActiveRigidBodies(MPlugArray &rbConnections)
{
@@ -520,6 +554,7 @@ void dSolverNode::updateActiveRigidBodies(MPlugArray &rbConnections)
fnTransform.setRotation(MQuaternion(rot[1], rot[2], rot[3], rot[0]));
fnTransform.setTranslation(MVector(pos[0], pos[1], pos[2]), MSpace::kTransform);
}
+ updateConstraint(node);
} else if(fnDagNode.typeId() == rigidBodyArrayNode::typeId) {
rigidBodyArrayNode *rbNode = static_cast(fnDagNode.userNode());
std::vector& rbs = rbNode->rigid_bodies();
diff --git a/Extras/MayaPlugin/dSolverNode.h b/Extras/MayaPlugin/dSolverNode.h
index 06e52c8ea..88a82200b 100644
--- a/Extras/MayaPlugin/dSolverNode.h
+++ b/Extras/MayaPlugin/dSolverNode.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//dSolverNode.h
@@ -83,6 +87,7 @@ protected:
void updatePassiveRigidBodies(MPlugArray &rbConnections, std::vector &xforms, float t);
void updateActiveRigidBodies(MPlugArray &rbConnections);
void applyFields(MPlugArray &rbConnections, float dt);
+ void updateConstraint(MObject& bodyNode);
protected:
MTime m_prevTime;
diff --git a/Extras/MayaPlugin/install.bat b/Extras/MayaPlugin/install.bat
index 88c09fc31..e5b634b0e 100644
--- a/Extras/MayaPlugin/install.bat
+++ b/Extras/MayaPlugin/install.bat
@@ -1,3 +1,3 @@
-xcopy /S /Y /C /I /h icons\*.xpm "C:\Program Files\Autodesk\Maya2008\icons"
-xcopy /S /Y /C /I /h scripts\*.mel "C:\Program Files\Autodesk\Maya2008\scripts"
-xcopy /S /Y /C /I /h BulletMayaPluginDebug.mll "C:\Program Files\Autodesk\Maya2008\bin\plug-ins"
+xcopy /S /Y /C /I /h icons\*.xpm "C:\Program Files\Autodesk\Maya8.5\icons"
+xcopy /S /Y /C /I /h scripts\*.mel "C:\Program Files\Autodesk\Maya8.5\scripts"
+xcopy /S /Y /C /I /h BulletMayaPluginDebug.mll "C:\Program Files\Autodesk\Maya8.5\bin\plug-ins"
diff --git a/Extras/MayaPlugin/mesh_shape.h b/Extras/MayaPlugin/mesh_shape.h
index b686aa531..cceac8dc1 100644
--- a/Extras/MayaPlugin/mesh_shape.h
+++ b/Extras/MayaPlugin/mesh_shape.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//mesh_shape.h
diff --git a/Extras/MayaPlugin/scripts/AEdNailConstraintTemplate.mel b/Extras/MayaPlugin/scripts/AEdNailConstraintTemplate.mel
index 00cb1fc81..fb1ec07c2 100644
--- a/Extras/MayaPlugin/scripts/AEdNailConstraintTemplate.mel
+++ b/Extras/MayaPlugin/scripts/AEdNailConstraintTemplate.mel
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//AEdNailConstraintTemplate.mel
@@ -28,7 +32,8 @@ global proc AEdNailConstraintTemplate( string $nodeName )
editorTemplate -beginScrollLayout;
editorTemplate -addControl damping;
- editorTemplate -addControl inRigidBody;
+ editorTemplate -addControl inRigidBodyA;
+ editorTemplate -addControl inRigidBodyB;
AEdependNodeTemplate $nodeName;
diff --git a/Extras/MayaPlugin/scripts/dynamicaUI.mel b/Extras/MayaPlugin/scripts/dynamicaUI.mel
index 6ba69214d..d94db9971 100644
--- a/Extras/MayaPlugin/scripts/dynamicaUI.mel
+++ b/Extras/MayaPlugin/scripts/dynamicaUI.mel
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//dynamicaUI.mel
@@ -688,21 +692,40 @@ global proc dynamicaUI_createPassiveMeshRBArray()
global proc dynamicaUI_createNailConstraint()
{
string $selection[] = `ls -selection -dag -leaf -showType -type "geometry"`;
-
//create dSolver node if necessary
dSolver;
-
- string $newConstraints[];
- for($i = 0; $i < size($selection) / 2; $i++) {
- if($selection[$i * 2 + 1] == "dRigidBody") {
- string $constraintNode = `dNailConstraint`;
- connectAttr ($selection[$i * 2] + ".message") ($constraintNode + ".inRigidBody");
- string $constraintTransforms[] = `listRelatives -parent $constraintNode`;
- $newConstraints[$i] = $constraintTransforms[0];
- }
+ // check selection in scene : one or two rigidBodies should be selected
+ int $selSize = size($selection);
+ int $selOK = (($selSize == 2) || ($selSize == 4));
+ for($i = 0; $i < $selSize/2; $i++)
+ {
+ if($selection[$i * 2 + 1] != "dRigidBody")
+ {
+ $selOK = 0;
+ }
+ }
+ if(!$selOK)
+ {
+ error("Select one or two bodies to create a nail constraint");
+ return;
+ }
+ // create nail constraint node
+ string $constraintNode = `dNailConstraint`;
+ // connect to bodies
+ if($selSize == 2)
+ {
+ connectAttr ($selection[0] + ".message") ($constraintNode + ".inRigidBodyA");
}
- select -r $newConstraints;
+ else
+ {
+ connectAttr ($selection[0] + ".message") ($constraintNode + ".inRigidBodyA");
+ connectAttr ($selection[2] + ".message") ($constraintNode + ".inRigidBodyB");
+ }
+ string $constraintTransforms[] = `listRelatives -parent $constraintNode`;
+ string $newConstraint = $constraintTransforms[0];
+ select -r $newConstraint;
}
+
global proc dynamicaUI_createHingeConstraint()
{
string $selection[] = `ls -selection -dag -leaf -showType -type "geometry"`;
diff --git a/Extras/MayaPlugin/solver.cpp b/Extras/MayaPlugin/solver.cpp
index fc6804aa1..408bdd34b 100644
--- a/Extras/MayaPlugin/solver.cpp
+++ b/Extras/MayaPlugin/solver.cpp
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//solver.cpp
@@ -89,6 +93,10 @@ nail_constraint_t::pointer solver_t::create_nail_constraint(rigid_body_t::point
{
return nail_constraint_t::pointer(new nail_constraint_t(m_impl->create_nail_constraint(rb->impl(), pivot), rb));
}
+nail_constraint_t::pointer solver_t::create_nail_constraint(rigid_body_t::pointer& rbA, rigid_body_t::pointer& rbB, vec3f const& pivot)
+{
+ return nail_constraint_t::pointer(new nail_constraint_t(m_impl->create_nail_constraint(rbA->impl(), rbB->impl(), pivot), rbA, rbB));
+}
hinge_constraint_t::pointer solver_t::create_hinge_constraint(rigid_body_t::pointer& rb, vec3f const& pivot)
{
return hinge_constraint_t::pointer(new hinge_constraint_t(m_impl->create_hinge_constraint(rb->impl(), pivot), rb));
diff --git a/Extras/MayaPlugin/solver.h b/Extras/MayaPlugin/solver.h
index 13cc8a6f6..41c237677 100644
--- a/Extras/MayaPlugin/solver.h
+++ b/Extras/MayaPlugin/solver.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//solver.h
@@ -69,6 +73,7 @@ public:
static rigid_body_t::pointer create_rigid_body(collision_shape_t::pointer& cs);
static nail_constraint_t::pointer create_nail_constraint(rigid_body_t::pointer& rb, vec3f const& pivot = vec3f(0, 0, 0));
+ static nail_constraint_t::pointer create_nail_constraint(rigid_body_t::pointer& rbA, rigid_body_t::pointer& rbB, vec3f const& pivot = vec3f(0, 0, 0));
static hinge_constraint_t::pointer create_hinge_constraint(rigid_body_t::pointer& rb, vec3f const& pivot = vec3f(0, 0, 0));
static slider_constraint_t::pointer create_slider_constraint(rigid_body_t::pointer& rbA, vec3f const& pivotA, rigid_body_t::pointer& rbB, vec3f const& pivotB = vec3f(0, 0, 0));
static sixdof_constraint_t::pointer create_sixdof_constraint(rigid_body_t::pointer& rbA, vec3f const& pivotA, rigid_body_t::pointer& rbB, vec3f const& pivotB = vec3f(0, 0, 0));
diff --git a/Extras/MayaPlugin/solver_impl.h b/Extras/MayaPlugin/solver_impl.h
index a03892332..dbdffa7db 100644
--- a/Extras/MayaPlugin/solver_impl.h
+++ b/Extras/MayaPlugin/solver_impl.h
@@ -18,6 +18,10 @@ not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Written by: Nicola Candussi
+
+Modified by Roman Ponomarev
+12/24/2009 : Nail constraint improvements
+
*/
//solver_impl.h
@@ -53,6 +57,7 @@ public:
virtual rigid_body_impl_t* create_rigid_body(collision_shape_impl_t* cs) = 0;
virtual nail_constraint_impl_t* create_nail_constraint(rigid_body_impl_t* rb, vec3f const& pivot) = 0;
+ virtual nail_constraint_impl_t* create_nail_constraint(rigid_body_impl_t* rbA, rigid_body_impl_t* rbB, vec3f const& pivot) = 0;
virtual hinge_constraint_impl_t* create_hinge_constraint(rigid_body_impl_t* rb, vec3f const& pivot) = 0;
virtual slider_constraint_impl_t* create_slider_constraint(rigid_body_impl_t* rbA, vec3f const& pivotA, rigid_body_impl_t* rbB, vec3f const& pivotB) = 0;
virtual sixdof_constraint_impl_t* create_sixdof_constraint(rigid_body_impl_t* rbA, vec3f const& pivotA, rigid_body_impl_t* rbB, vec3f const& pivotB) = 0;