[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