[Bf-blender-cvs] [5a834c1] fracture_modifier: added constraint impulse visualization (very basic only) and reworked the mesh constraint name system
Martin Felke
noreply at git.blender.org
Wed Feb 3 14:47:14 CET 2016
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. @@
More information about the Bf-blender-cvs
mailing list