Bullet debug draw added
It is off by default, see attributes of dSolverNode to turn it on
This commit is contained in:
@@ -1,29 +1,47 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# Visual Studio 2005
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BulletMayaPlugin", "BulletMayaPlugin.vcproj", "{681412B0-F197-4A2F-9263-DEA2E8690146}"
|
||||
ProjectSection(WebsiteProperties) = preProject
|
||||
Debug.AspNetCompiler.Debug = "True"
|
||||
Release.AspNetCompiler.Debug = "False"
|
||||
EndProjectSection
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}
|
||||
{ED51AA4D-82EF-089C-CD6D-91CF224E2A9E} = {ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}
|
||||
{B1B5F775-54A9-2437-E4AC-7E817E492142} = {B1B5F775-54A9-2437-E4AC-7E817E492142}
|
||||
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
|
||||
{6AB01C9C-9163-F400-B5C3-20D046631E17} = {6AB01C9C-9163-F400-B5C3-20D046631E17}
|
||||
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
|
||||
{A0958CD9-0E39-4A77-3711-9B488F508FBF} = {A0958CD9-0E39-4A77-3711-9B488F508FBF}
|
||||
{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}
|
||||
{61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319}
|
||||
{B1B5F775-54A9-2437-E4AC-7E817E492142} = {B1B5F775-54A9-2437-E4AC-7E817E492142}
|
||||
{6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletcollision", "..\..\msvc\8\libbulletcollision.vcproj", "{6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}"
|
||||
ProjectSection(WebsiteProperties) = preProject
|
||||
Debug.AspNetCompiler.Debug = "True"
|
||||
Release.AspNetCompiler.Debug = "False"
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletdynamics", "..\..\msvc\8\libbulletdynamics.vcproj", "{61BD1097-CF2E-B296-DAA9-73A6FE135319}"
|
||||
ProjectSection(WebsiteProperties) = preProject
|
||||
Debug.AspNetCompiler.Debug = "True"
|
||||
Release.AspNetCompiler.Debug = "False"
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletmath", "..\..\msvc\8\libbulletmath.vcproj", "{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}"
|
||||
ProjectSection(WebsiteProperties) = preProject
|
||||
Debug.AspNetCompiler.Debug = "True"
|
||||
Release.AspNetCompiler.Debug = "False"
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libGIMPACTUtils", "..\..\msvc\8\libGIMPACTUtils.vcproj", "{B1B5F775-54A9-2437-E4AC-7E817E492142}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libBulletColladaConverter", "..\..\msvc\8\libBulletColladaConverter.vcproj", "{ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcolladadom", "..\..\msvc\8\libcolladadom.vcproj", "{6AB01C9C-9163-F400-B5C3-20D046631E17}"
|
||||
ProjectSection(WebsiteProperties) = preProject
|
||||
Debug.AspNetCompiler.Debug = "True"
|
||||
Release.AspNetCompiler.Debug = "False"
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblibxml", "..\..\msvc\8\liblibxml.vcproj", "{A0958CD9-0E39-4A77-3711-9B488F508FBF}"
|
||||
ProjectSection(WebsiteProperties) = preProject
|
||||
Debug.AspNetCompiler.Debug = "True"
|
||||
Release.AspNetCompiler.Debug = "False"
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
@@ -51,14 +69,6 @@ Global
|
||||
{B1B5F775-54A9-2437-E4AC-7E817E492142}.DebugDll|Win32.Build.0 = DebugDll|Win32
|
||||
{B1B5F775-54A9-2437-E4AC-7E817E492142}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32
|
||||
{B1B5F775-54A9-2437-E4AC-7E817E492142}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32
|
||||
{ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.DebugDll|Win32.ActiveCfg = DebugDll|Win32
|
||||
{ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.DebugDll|Win32.Build.0 = DebugDll|Win32
|
||||
{ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32
|
||||
{ED51AA4D-82EF-089C-CD6D-91CF224E2A9E}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32
|
||||
{6AB01C9C-9163-F400-B5C3-20D046631E17}.DebugDll|Win32.ActiveCfg = DebugDll|Win32
|
||||
{6AB01C9C-9163-F400-B5C3-20D046631E17}.DebugDll|Win32.Build.0 = DebugDll|Win32
|
||||
{6AB01C9C-9163-F400-B5C3-20D046631E17}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32
|
||||
{6AB01C9C-9163-F400-B5C3-20D046631E17}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32
|
||||
{A0958CD9-0E39-4A77-3711-9B488F508FBF}.DebugDll|Win32.ActiveCfg = DebugDll|Win32
|
||||
{A0958CD9-0E39-4A77-3711-9B488F508FBF}.DebugDll|Win32.Build.0 = DebugDll|Win32
|
||||
{A0958CD9-0E39-4A77-3711-9B488F508FBF}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32
|
||||
|
||||
@@ -36,6 +36,8 @@ btVector3 maxWorld(10000,10000,10000);
|
||||
int maxNumObj=32768;
|
||||
|
||||
|
||||
|
||||
|
||||
void bt_solver_t::export_bullet_file(const char* fileName)
|
||||
{
|
||||
// ColladaConverter tmpConverter(m_dynamicsWorld.get());
|
||||
@@ -62,6 +64,36 @@ void bt_solver_t::import_bullet_file(const char* filename)
|
||||
}
|
||||
|
||||
|
||||
class bt_debug_draw : public btIDebugDraw
|
||||
{
|
||||
int m_debugMode;
|
||||
public:
|
||||
virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color)
|
||||
{
|
||||
glBegin(GL_LINES);
|
||||
glColor3f(color.getX(), color.getY(), color.getZ());
|
||||
glVertex3d(from.getX(), from.getY(), from.getZ());
|
||||
glVertex3d(to.getX(), to.getY(), to.getZ());
|
||||
glEnd();
|
||||
}
|
||||
virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color)
|
||||
{
|
||||
return;
|
||||
}
|
||||
virtual void reportErrorWarning(const char* warningString)
|
||||
{
|
||||
return;
|
||||
}
|
||||
virtual void draw3dText(const btVector3& location,const char* textString)
|
||||
{
|
||||
return;
|
||||
}
|
||||
virtual void setDebugMode(int debugMode) { m_debugMode = debugMode; }
|
||||
virtual int getDebugMode() const { return m_debugMode; }
|
||||
};
|
||||
|
||||
|
||||
|
||||
bt_solver_t::bt_solver_t():
|
||||
// m_broadphase(new btAxisSweep3(minWorld,maxWorld,maxNumObj)),
|
||||
m_broadphase(new btDbvtBroadphase()),
|
||||
@@ -80,4 +112,15 @@ bt_solver_t::bt_solver_t():
|
||||
m_dynamicsWorld->setGravity(btVector3(0, -9.81f, 0));
|
||||
|
||||
// m_dynamicsWorld->getSolverInfo().m_splitImpulse = true;
|
||||
|
||||
bt_debug_draw* dbgDraw = new bt_debug_draw();
|
||||
m_dynamicsWorld->setDebugDrawer(dbgDraw);
|
||||
}
|
||||
|
||||
|
||||
void bt_solver_t::debug_draw(int dbgMode)
|
||||
{
|
||||
m_dynamicsWorld->getDebugDrawer()->setDebugMode(dbgMode);
|
||||
m_dynamicsWorld->debugDrawWorld();
|
||||
}
|
||||
|
||||
|
||||
@@ -152,6 +152,8 @@ public:
|
||||
m_dynamicsWorld->stepSimulation(dt, 1000, 1.0f / 120.0f);
|
||||
}
|
||||
|
||||
virtual void debug_draw(int dbgMode);
|
||||
|
||||
virtual void export_bullet_file(const char* fileName);
|
||||
|
||||
virtual void import_bullet_file(const char* filename);
|
||||
|
||||
@@ -92,13 +92,13 @@ MStatus hingeConstraintNode::initialize()
|
||||
status = addAttribute(ia_damping);
|
||||
MCHECKSTATUS(status, "adding damping attribute")
|
||||
|
||||
ia_lowerLimit = fnNumericAttr.create("lowerLimit", "llmt", MFnNumericData::kDouble, -90.0, &status);
|
||||
ia_lowerLimit = fnNumericAttr.create("lowerLimit", "llmt", MFnNumericData::kDouble, 1.0, &status);
|
||||
MCHECKSTATUS(status, "creating lower limit attribute")
|
||||
fnNumericAttr.setKeyable(true);
|
||||
status = addAttribute(ia_lowerLimit);
|
||||
MCHECKSTATUS(status, "adding lower limit attribute")
|
||||
|
||||
ia_upperLimit = fnNumericAttr.create("upperLimit", "ulmt", MFnNumericData::kDouble, 90.0, &status);
|
||||
ia_upperLimit = fnNumericAttr.create("upperLimit", "ulmt", MFnNumericData::kDouble, -1.0, &status);
|
||||
MCHECKSTATUS(status, "creating upper limit attribute")
|
||||
fnNumericAttr.setKeyable(true);
|
||||
status = addAttribute(ia_upperLimit);
|
||||
|
||||
@@ -106,9 +106,19 @@ dSolverCmd::redoIt()
|
||||
}
|
||||
}
|
||||
|
||||
m_dgModifier = new MDGModifier;
|
||||
m_dgModifier = new MDagModifier;
|
||||
|
||||
MObject dSolverObj = m_dgModifier->createNode(dSolverNode::typeId);
|
||||
|
||||
MObject parentObj = m_dgModifier->createNode("transform");
|
||||
m_dgModifier->renameNode(parentObj, "dDebugDraw");
|
||||
m_dgModifier->doIt();
|
||||
|
||||
MObject dSolverObj = m_dgModifier->createNode(dSolverNode::typeId, parentObj, &stat);
|
||||
if(stat != MStatus::kSuccess)
|
||||
{
|
||||
MString errStr = stat.errorString();
|
||||
fprintf(stderr, "ERROR : %s\n", errStr.asChar());
|
||||
}
|
||||
m_dgModifier->doIt();
|
||||
|
||||
// connect the time attribute
|
||||
|
||||
@@ -50,7 +50,8 @@ public:
|
||||
|
||||
protected:
|
||||
MArgDatabase *m_argDatabase;
|
||||
MDGModifier *m_dgModifier;
|
||||
MDagModifier *m_dgModifier;
|
||||
// MDGModifier *m_dgModifier;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -77,6 +77,21 @@ MObject dSolverNode::ssSolverType;
|
||||
bool dSolverNode::isStartTime;
|
||||
|
||||
|
||||
MObject dSolverNode::ia_DBG_DrawWireframe;
|
||||
MObject dSolverNode::ia_DBG_DrawAabb;
|
||||
MObject dSolverNode::ia_DBG_DrawFeaturesText;
|
||||
MObject dSolverNode::ia_DBG_DrawContactPoints;
|
||||
MObject dSolverNode::ia_DBG_NoDeactivation;
|
||||
MObject dSolverNode::ia_DBG_NoHelpText;
|
||||
MObject dSolverNode::ia_DBG_DrawText;
|
||||
MObject dSolverNode::ia_DBG_ProfileTimings;
|
||||
MObject dSolverNode::ia_DBG_EnableSatComparison;
|
||||
MObject dSolverNode::ia_DBG_DisableBulletLCP;
|
||||
MObject dSolverNode::ia_DBG_EnableCCD;
|
||||
MObject dSolverNode::ia_DBG_DrawConstraints;
|
||||
MObject dSolverNode::ia_DBG_DrawConstraintLimits;
|
||||
MObject dSolverNode::ia_DBG_FastWireframe;
|
||||
|
||||
#define ATTR_POSITION "position"
|
||||
//#define ATTR_POSITION_TYPE VECTOR_ATTR
|
||||
#define ATTR_VELOCITY "velocity"
|
||||
@@ -94,6 +109,74 @@ bool dSolverNode::isStartTime;
|
||||
//#define ATTR_IN_RANGLENEXT_TYPE FLOAT_ATTR
|
||||
|
||||
|
||||
|
||||
static int getDbgDrawVal(const MObject& thisObj, const MObject& attr, int flag)
|
||||
{
|
||||
MPlug plug(thisObj, attr);
|
||||
bool retVal = false;
|
||||
plug.getValue(retVal);
|
||||
return retVal ? (1 << flag) : 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void dSolverNode::draw( M3dView & view, const MDagPath & path,
|
||||
M3dView::DisplayStyle style,
|
||||
M3dView::DisplayStatus status )
|
||||
{
|
||||
view.beginGL();
|
||||
glPushAttrib( GL_ALL_ATTRIB_BITS );
|
||||
|
||||
glDisable(GL_LIGHTING);
|
||||
|
||||
if( !(status == M3dView::kActive ||
|
||||
status == M3dView::kLead ||
|
||||
status == M3dView::kHilite ||
|
||||
( style != M3dView::kGouraudShaded && style != M3dView::kFlatShaded )) ) {
|
||||
glColor3f(1.0, 1.0, 0.0);
|
||||
}
|
||||
/*
|
||||
glBegin(GL_LINES);
|
||||
|
||||
glColor3f(1.0, 0.5, 0.5);
|
||||
glVertex3f(0.0, 0.0, 0.0);
|
||||
glColor3f(0.5, 0.5, 1.0);
|
||||
glVertex3f(1.f, 1.f, 1.f);
|
||||
|
||||
glEnd();
|
||||
*/
|
||||
MObject thisObject = thisMObject();
|
||||
MFnDagNode fnDagNode(thisObject);
|
||||
MFnTransform fnParentTransform(fnDagNode.parent(0));
|
||||
fnParentTransform.setTranslation(MVector(0.f, 0.f, 0.f), MSpace::kObject); // lock translation
|
||||
fnParentTransform.setRotation(MEulerRotation(0., 0., 0.)); // lock rotation
|
||||
double fixScale[3] = { 1., 1., 1. }; // lock scale
|
||||
fnParentTransform.setScale(fixScale);
|
||||
|
||||
|
||||
int dbgMode = 0;
|
||||
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DrawWireframe, 0);
|
||||
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DrawAabb, 1);
|
||||
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DrawFeaturesText, 2);
|
||||
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DrawContactPoints, 3);
|
||||
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_NoDeactivation, 4);
|
||||
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_NoHelpText, 5);
|
||||
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DrawText, 6);
|
||||
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_ProfileTimings, 7);
|
||||
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_EnableSatComparison, 8);
|
||||
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DisableBulletLCP, 9);
|
||||
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_EnableCCD, 10);
|
||||
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DrawConstraints, 11);
|
||||
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_DrawConstraintLimits, 12);
|
||||
dbgMode |= getDbgDrawVal(thisObject,ia_DBG_FastWireframe, 13);
|
||||
solver_t::debug_draw(dbgMode);
|
||||
|
||||
glPopAttrib();
|
||||
view.endGL();
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void sceneLoadedCB(void* clientData)
|
||||
{
|
||||
dSolverNode::updateAllRigidBodies();
|
||||
@@ -312,6 +395,65 @@ MStatus dSolverNode::initialize()
|
||||
status = addAttribute(ia_splitImpulse);
|
||||
MCHECKSTATUS(status, "adding ia_splitImpulse attribute")
|
||||
|
||||
ia_DBG_DrawWireframe = fnNumericAttr.create("drawWireframe", "dwfr", MFnNumericData::kBoolean, false, &status);
|
||||
MCHECKSTATUS(status, "creating ia_DBG_DrawWireframe attribute")
|
||||
status = addAttribute(ia_DBG_DrawWireframe);
|
||||
MCHECKSTATUS(status, "adding ia_DBG_DrawWireframe attribute")
|
||||
ia_DBG_DrawAabb = fnNumericAttr.create("drawAabb", "daabb", MFnNumericData::kBoolean, false, &status);
|
||||
MCHECKSTATUS(status, "creating ia_DBG_DrawAabb attribute")
|
||||
status = addAttribute(ia_DBG_DrawAabb);
|
||||
MCHECKSTATUS(status, "adding ia_DBG_DrawAabb attribute")
|
||||
ia_DBG_DrawFeaturesText = fnNumericAttr.create("drawFeaturesText", "dft", MFnNumericData::kBoolean, false, &status);
|
||||
MCHECKSTATUS(status, "creating ia_DBG_DrawFeaturesText attribute")
|
||||
status = addAttribute(ia_DBG_DrawFeaturesText);
|
||||
MCHECKSTATUS(status, "adding ia_DBG_DrawFeaturesText attribute")
|
||||
ia_DBG_DrawContactPoints = fnNumericAttr.create("drawContactPoints", "dcp", MFnNumericData::kBoolean, false, &status);
|
||||
MCHECKSTATUS(status, "creating ia_DBG_DrawContactPoints attribute")
|
||||
status = addAttribute(ia_DBG_DrawContactPoints);
|
||||
MCHECKSTATUS(status, "adding ia_DBG_DrawContactPoints attribute")
|
||||
ia_DBG_NoDeactivation = fnNumericAttr.create("noDeactivation", "dnda", MFnNumericData::kBoolean, false, &status);
|
||||
MCHECKSTATUS(status, "creating ia_DBG_NoDeactivation attribute")
|
||||
status = addAttribute(ia_DBG_NoDeactivation);
|
||||
MCHECKSTATUS(status, "adding ia_DBG_NoDeactivation attribute")
|
||||
ia_DBG_NoHelpText = fnNumericAttr.create("noHelpText", "dnht", MFnNumericData::kBoolean, false, &status);
|
||||
MCHECKSTATUS(status, "creating ia_DBG_NoHelpText attribute")
|
||||
status = addAttribute(ia_DBG_NoHelpText);
|
||||
MCHECKSTATUS(status, "adding ia_DBG_NoHelpText attribute")
|
||||
ia_DBG_DrawText = fnNumericAttr.create("drawText", "dtxt", MFnNumericData::kBoolean, false, &status);
|
||||
MCHECKSTATUS(status, "creating ia_DBG_DrawText attribute")
|
||||
status = addAttribute(ia_DBG_DrawText);
|
||||
MCHECKSTATUS(status, "adding ia_DBG_DrawText attribute")
|
||||
ia_DBG_ProfileTimings = fnNumericAttr.create("pProfileTimings", "dptm", MFnNumericData::kBoolean, false, &status);
|
||||
MCHECKSTATUS(status, "creating ia_DBG_ProfileTimings attribute")
|
||||
status = addAttribute(ia_DBG_ProfileTimings);
|
||||
MCHECKSTATUS(status, "adding ia_DBG_ProfileTimings attribute")
|
||||
ia_DBG_EnableSatComparison = fnNumericAttr.create("enableSatComparison", "desc", MFnNumericData::kBoolean, false, &status);
|
||||
MCHECKSTATUS(status, "creating ia_DBG_EnableSatComparison attribute")
|
||||
status = addAttribute(ia_DBG_EnableSatComparison);
|
||||
MCHECKSTATUS(status, "adding ia_DBG_EnableSatComparison attribute")
|
||||
ia_DBG_DisableBulletLCP = fnNumericAttr.create("disableBulletLCP", "dblcp", MFnNumericData::kBoolean, false, &status);
|
||||
MCHECKSTATUS(status, "creating ia_DBG_DisableBulletLCP attribute")
|
||||
status = addAttribute(ia_DBG_DisableBulletLCP);
|
||||
MCHECKSTATUS(status, "adding ia_DBG_DisableBulletLCP attribute")
|
||||
ia_DBG_EnableCCD = fnNumericAttr.create("enableCCD", "deccd", MFnNumericData::kBoolean, false, &status);
|
||||
MCHECKSTATUS(status, "creating ia_DBG_EnableCCD attribute")
|
||||
status = addAttribute(ia_DBG_EnableCCD);
|
||||
MCHECKSTATUS(status, "adding ia_DBG_EnableCCD attribute")
|
||||
ia_DBG_DrawConstraints = fnNumericAttr.create("drawConstraints", "dcnst", MFnNumericData::kBoolean, false, &status);
|
||||
MCHECKSTATUS(status, "creating ia_DBG_DrawConstraints attribute")
|
||||
status = addAttribute(ia_DBG_DrawConstraints);
|
||||
MCHECKSTATUS(status, "adding ia_DBG_DrawConstraints attribute")
|
||||
ia_DBG_DrawConstraintLimits = fnNumericAttr.create("drawConstraintLimits", "dcsl", MFnNumericData::kBoolean, false, &status);
|
||||
MCHECKSTATUS(status, "creating ia_DBG_DrawConstraintLimits attribute")
|
||||
status = addAttribute(ia_DBG_DrawConstraintLimits);
|
||||
MCHECKSTATUS(status, "adding ia_DBG_DrawConstraintLimits attribute")
|
||||
ia_DBG_FastWireframe = fnNumericAttr.create("fastWireframe", "dfwf", MFnNumericData::kBoolean, false, &status);
|
||||
MCHECKSTATUS(status, "creating ia_DBG_FastWireframe attribute")
|
||||
status = addAttribute(ia_DBG_FastWireframe);
|
||||
MCHECKSTATUS(status, "adding ia_DBG_FastWireframe attribute")
|
||||
|
||||
|
||||
|
||||
status = attributeAffects(ia_time, oa_rigidBodies);
|
||||
MCHECKSTATUS(status, "adding attributeAffects(ia_time, oa_rigidBodies)")
|
||||
|
||||
|
||||
@@ -31,18 +31,42 @@ Modified by Roman Ponomarev <rponom@gmail.com>
|
||||
#include <maya/MString.h>
|
||||
#include <maya/MTypeId.h>
|
||||
#include <maya/MPxNode.h>
|
||||
#include <maya/MPxLocatorNode.h>
|
||||
#include <maya/MTime.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "mathUtils.h"
|
||||
|
||||
class dSolverNode : public MPxNode
|
||||
//class dSolverNode : public MPxNode
|
||||
class dSolverNode : public MPxLocatorNode
|
||||
{
|
||||
public:
|
||||
dSolverNode();
|
||||
virtual ~dSolverNode();
|
||||
virtual void postConstructor();
|
||||
virtual void draw( M3dView & view, const MDagPath & path,
|
||||
M3dView::DisplayStyle style,
|
||||
M3dView::DisplayStatus status );
|
||||
|
||||
|
||||
virtual bool isBounded() const {
|
||||
return false;
|
||||
}
|
||||
virtual MBoundingBox boundingBox() const
|
||||
{
|
||||
MObject node = thisMObject();
|
||||
MPoint corner1(-1, -1, -1);
|
||||
MPoint corner2(1, 1, 1);
|
||||
return MBoundingBox(corner1, corner2);
|
||||
}
|
||||
|
||||
virtual bool excludeAsLocator() const {
|
||||
return false;
|
||||
}
|
||||
virtual bool isTransparent() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
static void * creator();
|
||||
static MStatus initialize();
|
||||
@@ -61,6 +85,22 @@ public:
|
||||
|
||||
//Solver Settings
|
||||
static MObject ssSolverType;
|
||||
//
|
||||
|
||||
static MObject ia_DBG_DrawWireframe;
|
||||
static MObject ia_DBG_DrawAabb;
|
||||
static MObject ia_DBG_DrawFeaturesText;
|
||||
static MObject ia_DBG_DrawContactPoints;
|
||||
static MObject ia_DBG_NoDeactivation;
|
||||
static MObject ia_DBG_NoHelpText;
|
||||
static MObject ia_DBG_DrawText;
|
||||
static MObject ia_DBG_ProfileTimings;
|
||||
static MObject ia_DBG_EnableSatComparison;
|
||||
static MObject ia_DBG_DisableBulletLCP;
|
||||
static MObject ia_DBG_EnableCCD;
|
||||
static MObject ia_DBG_DrawConstraints;
|
||||
static MObject ia_DBG_DrawConstraintLimits;
|
||||
static MObject ia_DBG_FastWireframe;
|
||||
|
||||
//
|
||||
|
||||
@@ -90,7 +130,6 @@ protected:
|
||||
void updateActiveRigidBodies(MPlugArray &rbConnections);
|
||||
void applyFields(MPlugArray &rbConnections, float dt);
|
||||
void updateConstraint(MObject& bodyNode);
|
||||
|
||||
protected:
|
||||
MTime m_prevTime;
|
||||
};
|
||||
|
||||
@@ -135,7 +135,8 @@ MStatus initializePlugin( MObject obj )
|
||||
status = plugin.registerNode( dSolverNode::typeName, dSolverNode::typeId,
|
||||
dSolverNode::creator,
|
||||
dSolverNode::initialize,
|
||||
MPxNode::kDependNode );
|
||||
// MPxNode::kDependNode );
|
||||
MPxNode::kLocatorNode );
|
||||
MCHECKSTATUS(status, "registering dSolverNode")
|
||||
|
||||
status = plugin.registerCommand( dSolverCmd::typeName,
|
||||
|
||||
@@ -40,6 +40,21 @@ global proc AEdSolverTemplate( string $nodeName )
|
||||
editorTemplate -addControl startTime;
|
||||
|
||||
editorTemplate -addControl rigidBodies;
|
||||
|
||||
editorTemplate -addControl drawWireframe;
|
||||
editorTemplate -addControl drawAabb;
|
||||
editorTemplate -addControl drawFeaturesText;
|
||||
editorTemplate -addControl drawContactPoints;
|
||||
editorTemplate -addControl noDeactivation;
|
||||
editorTemplate -addControl noHelpText;
|
||||
editorTemplate -addControl drawText;
|
||||
editorTemplate -addControl profileTimings;
|
||||
editorTemplate -addControl enableSatComparison;
|
||||
editorTemplate -addControl disableBulletLCP;
|
||||
editorTemplate -addControl enableCCD;
|
||||
editorTemplate -addControl drawConstraints;
|
||||
editorTemplate -addControl drawConstraintLimits;
|
||||
editorTemplate -addControl fastWireframe;
|
||||
|
||||
AEdependNodeTemplate $nodeName;
|
||||
|
||||
|
||||
@@ -195,3 +195,9 @@ void solver_t::step_simulation(float dt)
|
||||
{
|
||||
m_impl->step_simulation(dt);
|
||||
}
|
||||
|
||||
|
||||
void solver_t::debug_draw(int dbgMode)
|
||||
{
|
||||
m_impl->debug_draw(dbgMode);
|
||||
}
|
||||
|
||||
@@ -99,6 +99,8 @@ public:
|
||||
//
|
||||
static void step_simulation(float dt);
|
||||
|
||||
static void debug_draw(int dbgMode);
|
||||
|
||||
static shared_ptr<solver_impl_t> get_solver();
|
||||
|
||||
private:
|
||||
|
||||
@@ -83,6 +83,8 @@ public:
|
||||
|
||||
virtual void step_simulation(float dt) = 0;
|
||||
|
||||
virtual void debug_draw(int dbgMode) {}
|
||||
|
||||
public:
|
||||
virtual ~solver_impl_t() { }
|
||||
};
|
||||
|
||||
@@ -49,7 +49,7 @@ m_useLinearReferenceFrameA(useLinearReferenceFrameA),
|
||||
m_useOffsetForConstraintFrame(D6_USE_FRAME_OFFSET),
|
||||
m_useSolveConstraintObsolete(D6_USE_OBSOLETE_METHOD)
|
||||
{
|
||||
|
||||
calculateTransforms();
|
||||
}
|
||||
|
||||
|
||||
@@ -62,6 +62,7 @@ btGeneric6DofConstraint::btGeneric6DofConstraint(btRigidBody& rbB, const btTrans
|
||||
{
|
||||
///not providing rigidbody A means implicitly using worldspace for body A
|
||||
m_frameInA = rbB.getCenterOfMassTransform() * m_frameInB;
|
||||
calculateTransforms();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ void btSliderConstraint::initParams()
|
||||
|
||||
m_useLinearReferenceFrameA = USE_OFFSET_FOR_CONSTANT_FRAME;
|
||||
|
||||
|
||||
calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user