Commit: 5a834c160849187efc09885664d87439e8255c15
Author: Martin Felke
Date:   Wed Feb 3 14:46:31 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB5a834c160849187efc09885664d87439e8255c15

added constraint impulse visualization (very basic only) and reworked the mesh 
constraint name system

===================================================================

M       intern/rigidbody/RBI_api.h
M       intern/rigidbody/rb_bullet_api.cpp
M       source/blender/blenkernel/BKE_fracture.h
M       source/blender/blenkernel/intern/fracture.c
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/editors/object/object_modifier.c
M       source/blender/editors/space_view3d/view3d_draw.c
M       source/blender/makesdna/DNA_rigidbody_types.h
M       source/blender/makesrna/intern/rna_modifier.c

===================================================================

diff --git a/intern/rigidbody/RBI_api.h b/intern/rigidbody/RBI_api.h
index 2acc792..3499d85 100644
--- a/intern/rigidbody/RBI_api.h
+++ b/intern/rigidbody/RBI_api.h
@@ -78,6 +78,7 @@ typedef struct rbContactPoint {
 /*Subclass because of Internal Tick Callback... sigh why doesnt this work with 
a simple collision callback ? */
 
 
+typedef void (*draw_string)(float loc[3], const char *str, const size_t len, 
float color[3]);
 
 /* ********************************** */
 /* Dynamics World Methods */
@@ -111,7 +112,7 @@ void RB_dworld_set_split_impulse(rbDynamicsWorld *world, 
int split_impulse);
 /* Step the simulation by the desired amount (in seconds) with extra controls 
on substep sizes and maximum substeps */
 void RB_dworld_step_simulation(rbDynamicsWorld *world, float timeStep, int 
maxSubSteps, float timeSubStep);
 
-void RB_dworld_debug_draw(rbDynamicsWorld *world);
+void RB_dworld_debug_draw(rbDynamicsWorld *world, draw_string str_callback);
 
 /* Export -------------------------- */
 
@@ -346,6 +347,8 @@ void RB_constraint_set_solver_iterations(rbConstraint *con, 
int num_solver_itera
 /* Set breaking impulse threshold, if constraint shouldn't break it can be set 
to FLT_MAX */
 void RB_constraint_set_breaking_threshold(rbConstraint *con, float threshold);
 
+void RB_constraint_set_id(rbConstraint *con, char id[64]);
+
 /* ********************************** */
 
 #ifdef __cplusplus
diff --git a/intern/rigidbody/rb_bullet_api.cpp 
b/intern/rigidbody/rb_bullet_api.cpp
index a7629bb..e6138c2 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -58,6 +58,7 @@ subject to the following restrictions:
 
 #include <stdio.h>
 #include <errno.h>
+#include <iomanip>
 
 #include "RBI_api.h"
 
@@ -80,6 +81,14 @@ subject to the following restrictions:
 #include "../../extern/glew/include/GL/glew.h"
 
 
+typedef struct rbConstraint
+{
+       btTypedConstraint *con;
+       btTransform pivot;
+       char id[64];
+} rbConstraint;
+
+
 struct ViewportDebugDraw : public btIDebugDraw
 {
        ViewportDebugDraw () :
@@ -87,6 +96,10 @@ struct       ViewportDebugDraw : public btIDebugDraw
        {
        }
 
+       enum DebugDrawModes2 {
+               DBG_DrawImpulses = 1 << 15,
+       };
+
        int m_debugMode;
 
        virtual void    drawLine(const btVector3& from,const btVector3& 
to,const btVector3& color)
@@ -173,6 +186,8 @@ class TickDiscreteDynamicsWorld : public 
btFractureDynamicsWorld
                rbTickCallback m_tickCallback;
                void* m_bworld;
                void* m_bscene;
+               virtual void debugDrawConstraints(rbConstraint *con, 
draw_string str_callback);
+               virtual void debugDrawWorld(draw_string str_callback);
 };
 
 void tickCallback(btDynamicsWorld *world, btScalar timeStep)
@@ -251,8 +266,278 @@ rbContactPoint* 
TickDiscreteDynamicsWorld::make_contact_point(btManifoldPoint& p
        return cp;
 }
 
+void TickDiscreteDynamicsWorld::debugDrawWorld(draw_string str_callback)
+{
+       BT_PROFILE("debugDrawWorld");
+
+       btCollisionWorld::debugDrawWorld();
+
+       bool drawConstraints = false;
+       if (getDebugDrawer())
+       {
+               int mode = getDebugDrawer()->getDebugMode();
+               if(mode  & (btIDebugDraw::DBG_DrawConstraints | 
btIDebugDraw::DBG_DrawConstraintLimits))
+               {
+                       drawConstraints = true;
+               }
+       }
+       if(drawConstraints)
+       {
+               for(int i = getNumConstraints()-1; i>=0 ;i--)
+               {
+                       btTypedConstraint* constraint = getConstraint(i);
+                       rbConstraint *con = 
(rbConstraint*)constraint->getUserConstraintPtr();
+                       debugDrawConstraints(con, str_callback);
+               }
+       }
+
+
+
+    if (getDebugDrawer() && (getDebugDrawer()->getDebugMode() & 
(btIDebugDraw::DBG_DrawWireframe | btIDebugDraw::DBG_DrawAabb | 
btIDebugDraw::DBG_DrawNormals)))
+       {
+               int i;
+
+               if (getDebugDrawer() && getDebugDrawer()->getDebugMode())
+               {
+                       for (i=0;i<m_actions.size();i++)
+                       {
+                               m_actions[i]->debugDraw(m_debugDrawer);
+                       }
+               }
+       }
+}
+
+const char* val_to_str(float value, int precision, int *length)
+{
+       std::ostringstream oss;
+       oss << std::fixed << std::setprecision(precision) << value;
+       *length = oss.str().length();
+       return oss.str().c_str();
+}
+
+void TickDiscreteDynamicsWorld::debugDrawConstraints(rbConstraint* con , 
draw_string str_callback)
+{
+       btTypedConstraint *constraint = con->con;
+       bool drawFrames = (getDebugDrawer()->getDebugMode() & 
btIDebugDraw::DBG_DrawConstraints) != 0;
+       bool drawLimits = (getDebugDrawer()->getDebugMode() & 
btIDebugDraw::DBG_DrawConstraintLimits) != 0;
+       bool drawImpulses = str_callback != NULL; // && 
(getDebugDrawer()->getDebugMode() & ViewportDebugDraw::DBG_DrawImpulses) != 0;
+       btScalar dbgDrawSize = constraint->getDbgDrawSize();
+       int p = 0;
+
+       //color code the load on the constraint
+       float color[3] = {1.0f, 1.0f, 1.0f};
+       btScalar imp = constraint->getAppliedImpulse();
+       btScalar thr = constraint->getBreakingImpulseThreshold();
+       float ratio = fabs(imp) / thr;
+       int len = strlen(con->id);
+       //const char *str = val_to_str(imp, p, &len);
+       const char *str = con->id;
+       float loc[3];
+
+       copy_v3_btvec3(loc, con->pivot.getOrigin());
+
+       if (ratio <= 0.5f)
+       {
+               //green -> yellow
+               color[0] = 2 * ratio;
+               color[1] = 1.0f;
+               color[2] = 0.0f;
+       }
+       else if (ratio > 0.5f && ratio <= 1.0f)
+       {
+               //yellow -> red
+               color[0] = 1.0f;
+               color[1] = 1.0f - 2 * (1.0f - ratio);
+               color[2] = 0.0f;
+       }
+
+       if (!constraint->isEnabled())
+       {
+               color[0] = 0.0f;
+               color[1] = 0.0f;
+               color[2] = 0.0f;
+       }
+
+
+       if(dbgDrawSize <= btScalar(0.f))
+       {
+               return;
+       }
+
+       if(drawImpulses) str_callback(loc, str, len, color);
+
+       switch(constraint->getConstraintType())
+       {
+               case POINT2POINT_CONSTRAINT_TYPE:
+                       {
+                               btPoint2PointConstraint* p2pC = 
(btPoint2PointConstraint*)constraint;
+                               btTransform tr;
+                               tr.setIdentity();
+                               btVector3 pivot = p2pC->getPivotInA();
+                               pivot = 
p2pC->getRigidBodyA().getCenterOfMassTransform() * pivot;
+                               tr.setOrigin(pivot);
+                               getDebugDrawer()->drawTransform(tr, 
dbgDrawSize);
+                               // that ideally should draw the same frame
+                               pivot = p2pC->getPivotInB();
+                               pivot = 
p2pC->getRigidBodyB().getCenterOfMassTransform() * pivot;
+                               tr.setOrigin(pivot);
+                       }
+                       break;
+               case HINGE_CONSTRAINT_TYPE:
+                       {
+                               btHingeConstraint* pHinge = 
(btHingeConstraint*)constraint;
+                               btTransform tr = 
pHinge->getRigidBodyA().getCenterOfMassTransform() * pHinge->getAFrame();
+                               if(drawFrames) 
getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+                               tr = 
pHinge->getRigidBodyB().getCenterOfMassTransform() * pHinge->getBFrame();
+                               if(drawFrames) 
getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+                               btScalar minAng = pHinge->getLowerLimit();
+                               btScalar maxAng = pHinge->getUpperLimit();
+                               if(minAng == maxAng)
+                               {
+                                       break;
+                               }
+                               bool drawSect = true;
+                               if(minAng > maxAng)
+                               {
+                                       minAng = btScalar(0.f);
+                                       maxAng = SIMD_2_PI;
+                                       drawSect = false;
+                               }
+                               if(drawLimits)
+                               {
+                                       btVector3& center = tr.getOrigin();
+                                       btVector3 normal = 
tr.getBasis().getColumn(2);
+                                       btVector3 axis = 
tr.getBasis().getColumn(0);
+                                       getDebugDrawer()->drawArc(center, 
normal, axis, dbgDrawSize, dbgDrawSize, minAng, maxAng, btVector3(0,0,0), 
drawSect);
+                               }
+                       }
+                       break;
+               case CONETWIST_CONSTRAINT_TYPE:
+                       {
+                               btConeTwistConstraint* pCT = 
(btConeTwistConstraint*)constraint;
+                               btTransform tr = 
pCT->getRigidBodyA().getCenterOfMassTransform() * pCT->getAFrame();
+                               if(drawFrames) 
getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+                               tr = 
pCT->getRigidBodyB().getCenterOfMassTransform() * pCT->getBFrame();
+                               if(drawFrames) 
getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+                               if(drawLimits)
+                               {
+                                       //const btScalar length = btScalar(5);
+                                       const btScalar length = dbgDrawSize;
+                                       static int nSegments = 8*4;
+                                       btScalar fAngleInRadians = 
btScalar(2.*3.1415926) * (btScalar)(nSegments-1)/btScalar(nSegments);
+                                       btVector3 pPrev = 
pCT->GetPointForAngle(fAngleInRadians, length);
+                                       pPrev = tr * pPrev;
+                                       for (int i=0; i<nSegments; i++)
+                                       {
+                                               fAngleInRadians = 
btScalar(2.*3.1415926) * (btScalar)i/btScalar(nSegments);
+                                               btVector3 pCur = 
pCT->GetPointForAngle(fAngleInRadians, length);
+                                               pCur = tr * pCur;
+                                               
getDebugDrawer()->drawLine(pPrev, pCur, btVector3(0,0,0));
+
+                                               if (i%(nSegments/8) == 0)
+                                                       
getDebugDrawer()->drawLine(tr.getOrigin(), pCur, btVector3(0,0,0));
+
+                                               pPrev = pCur;
+                                       }
+                                       btScalar tws = pCT->getTwistSpan();
+                                       btScalar twa = pCT->getTwistAngle();
+                                       bool useFrameB = 
(pCT->getRigidBodyB().getInvMass() > btScalar(0.f));
+                                       if(useFrameB)
+                                       {
+                                               tr = 
pCT->getRigidBodyB().getCenterOfMassTransform() * pCT->getBFrame();
+                                       }
+                                       else
+                                       {
+                                               tr = 
pCT->getRigidBodyA().getCenterOfMassTransform() * pCT->getAFrame();
+                                       }
+                                       btVector3 pivot = tr.getOrigin();
+                                       btVector3 normal = 
tr.getBasis().getColumn(0);
+                                       btVector3 axis1 = 
tr.getBasis().getColumn(1);
+                                       getDebugDrawer()->drawArc(pivot, 
normal, axis1, dbgDrawSize, dbgDrawSize, -twa-tws, -twa+tws, btVector3(0,0,0), 
true);
+
+                               }
+                       }
+                       break;
+               case D6_SPRING_CONSTRAINT_TYPE:
+               case D6_CONSTRAINT_TYPE:
+                       {
+                               btGeneric6DofConstraint* p6DOF = 
(btGeneric6DofConstraint*)constraint;
+                               btTransform tr = 
p6DOF->getCalculatedTransformA();
+                               if(drawFrames) 
getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+                               tr = p6DOF->getCalculatedTransformB();
+                               if(drawFrames) 
getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+                               if(drawLimits)
+                               {
+                                       tr = p6DOF->getCalculatedTransformA();
+                                       const btVector3& center = 
p6DOF->getCalculatedTransformB().getOrigin();
+                                       btVector3 up = 
tr.getBasis().getColumn(2);
+                                       btVector3 axis = 
tr.getBasis().getColumn(0);
+                                       btScalar minTh = 
p6DOF->getRotationalLimitMotor(1)->m_loLimit;
+                                       btScalar maxTh = 
p6DOF->getRotationalLimitMotor(1)->m_hiLimit;
+                                       btScalar minPs = 
p6DOF->getRotationalLimitMotor(2)->m_loLimit;
+                                       btScalar maxPs = 
p6DOF->getRotationalLimitMotor(2)->m_hiLimit;
+                                       
getDebugDrawer()->drawSpherePatch(center, up, axis, dbgDrawSize * 
btScalar(.9f), minTh, maxTh, minPs, maxPs, btVector3(0,0,0));
+                                       axis = tr.getBasis().getColumn(1);
+                                       btScalar ay = p6DOF->getAngle(1);
+                                       btScalar az = p6DOF->getAngle(2);
+                                       btScalar cy = btCos(ay);
+                                       btScalar sy = btSin(ay);
+                                       btScalar cz = btCos(az);
+                                       btSca

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to