[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23299] branches/itasc: iTaSC: add joint rotation constraint.

Benoit Bolsee benoit.bolsee at online.be
Thu Sep 17 13:04:36 CEST 2009


Revision: 23299
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23299
Author:   ben2610
Date:     2009-09-17 13:04:10 +0200 (Thu, 17 Sep 2009)

Log Message:
-----------
iTaSC: add joint rotation constraint.

Joint rotation constraint is the capability of taking the
pose channel rotation computed from action as the target
for the joint value. The rotation constraint is integrated
in the IK tree and solved at the same time as the cartesian
constraints. This allows fine control over the armature
configuration during the animation. The control is provided
per channel and each channel can have a different weight for
the constraint. The option appears in the Inverse Kinematics
panels (i.e. it requires that you define at least one
cartesian space IK constraint).

Other improvements:
- Fix a bug in IK tree construction in certain tree configuration
with more than one IK constraint were defined on a channel.
- Detect ill defined armature and avoid crash.
- Prepare plugin and solver for other joint space constraint.
- Fix bug with joint weight incorrectly computed from stiffness .
- Increase feedback range up to 100.

Modified Paths:
--------------
    branches/itasc/intern/itasc/Armature.cpp
    branches/itasc/intern/itasc/CopyPose.cpp
    branches/itasc/intern/itasc/Distance.cpp
    branches/itasc/intern/itasc/Scene.cpp
    branches/itasc/release/ui/buttons_data_bone.py
    branches/itasc/source/blender/blenkernel/intern/action.c
    branches/itasc/source/blender/editors/armature/editarmature.c
    branches/itasc/source/blender/editors/armature/poseobject.c
    branches/itasc/source/blender/editors/object/object_constraint.c
    branches/itasc/source/blender/ikplugin/BIK_api.h
    branches/itasc/source/blender/ikplugin/intern/ikplugin_api.c
    branches/itasc/source/blender/ikplugin/intern/ikplugin_api.h
    branches/itasc/source/blender/ikplugin/intern/itasc_plugin.cpp
    branches/itasc/source/blender/ikplugin/intern/itasc_plugin.h
    branches/itasc/source/blender/makesdna/DNA_action_types.h
    branches/itasc/source/blender/makesrna/intern/rna_pose.c
    branches/itasc/source/gameengine/Converter/BL_ArmatureChannel.cpp
    branches/itasc/source/gameengine/PyDoc/GameTypes.py

Modified: branches/itasc/intern/itasc/Armature.cpp
===================================================================
--- branches/itasc/intern/itasc/Armature.cpp	2009-09-17 10:14:56 UTC (rev 23298)
+++ branches/itasc/intern/itasc/Armature.cpp	2009-09-17 11:04:10 UTC (rev 23299)
@@ -696,7 +696,7 @@
 			*(double*)&pConstraint->value[i].y = m_qKdl(nr);
 			*(double*)&pConstraint->value[i].ydot = m_qdotKdl(nr);
 		}
-		if (pConstraint->function && (!timestamp.substep || pConstraint->substep)) {
+		if (pConstraint->function && (pConstraint->substep || (!timestamp.reiterate && !timestamp.substep))) {
 			(*pConstraint->function)(timestamp, pConstraint->values, pConstraint->v_nr, pConstraint->param);
 		}
 		// recompute the weight in any case, that's the most likely modification

Modified: branches/itasc/intern/itasc/CopyPose.cpp
===================================================================
--- branches/itasc/intern/itasc/CopyPose.cpp	2009-09-17 10:14:56 UTC (rev 23298)
+++ branches/itasc/intern/itasc/CopyPose.cpp	2009-09-17 11:04:10 UTC (rev 23299)
@@ -430,7 +430,7 @@
 			found = popPose(timestamp.cacheTimestamp);
 		}
 	}
-	if (m_constraintCallback && (!timestamp.substep || m_substep)) {
+	if (m_constraintCallback && (m_substep || (!timestamp.reiterate && !timestamp.substep))) {
 		// initialize first callback the application to get the current values
 		int i=0;
 		if (m_outputControl & CTL_POSITION) {

Modified: branches/itasc/intern/itasc/Distance.cpp
===================================================================
--- branches/itasc/intern/itasc/Distance.cpp	2009-09-17 10:14:56 UTC (rev 23298)
+++ branches/itasc/intern/itasc/Distance.cpp	2009-09-17 11:04:10 UTC (rev 23299)
@@ -296,7 +296,7 @@
 		if (!timestamp.reiterate)
 			cacheAvail = popDist(timestamp.cacheTimestamp);
 	}
-	if (m_constraintCallback && (m_substep || !timestamp.substep)) {
+	if (m_constraintCallback && (m_substep || (!timestamp.reiterate && !timestamp.substep))) {
 		// initialize first callback the application to get the current values
 		*(double*)&m_data.y = m_chi(2);
 		*(double*)&m_data.ydot = m_ydot(0);

Modified: branches/itasc/intern/itasc/Scene.cpp
===================================================================
--- branches/itasc/intern/itasc/Scene.cpp	2009-09-17 10:14:56 UTC (rev 23298)
+++ branches/itasc/intern/itasc/Scene.cpp	2009-09-17 11:04:10 UTC (rev 23299)
@@ -183,6 +183,9 @@
 bool Scene::initialize(){
 
     //prepare all matrices:
+	if (m_ncTotal == 0 || m_nqTotal == 0 || m_nsets == 0)
+		return false;
+
     m_A = e_zero_matrix(m_ncTotal,m_nqTotal);
 	if (m_nuTotal > 0) {
 		m_B = e_zero_matrix(m_ncTotal,m_nuTotal);

Modified: branches/itasc/release/ui/buttons_data_bone.py
===================================================================
--- branches/itasc/release/ui/buttons_data_bone.py	2009-09-17 10:14:56 UTC (rev 23298)
+++ branches/itasc/release/ui/buttons_data_bone.py	2009-09-17 11:04:10 UTC (rev 23299)
@@ -221,10 +221,25 @@
 		row.itemR(pchan, "ik_max_z", text="")
 		row.active = pchan.ik_dof_z and pchan.ik_limit_z
 
-		split = layout.split()
-		split.itemR(pchan, "ik_stretch", text="Stretch")
-		split.itemL()
+		layout.itemR(pchan, "ik_stretch", text="Stretch")
 
+		if ob.pose.ik_solver == "ITASC":
+			layout.itemL(text="Joint constraint:")
+			split = layout.split(percentage=0.3)
+			row = split.row()
+			row.itemR(pchan, "ik_rot_control", text="Rotation")
+			row = split.row()
+			row.itemR(pchan, "ik_rot_weight", text="Weight", slider=True)
+			row.active = pchan.ik_rot_control
+			# not supported yet
+			#split = layout.split(percentage=0.3)
+			#row = split.row()
+			#row.itemR(pchan, "ik_lin_control", text="Size")
+			#row = split.row()
+			#row.itemR(pchan, "ik_lin_weight", text="Weight", slider=True)
+			#row.active = pchan.ik_lin_control
+			
+
 class BONE_PT_deform(BoneButtonsPanel):
 	__label__ = "Deform"
 	__default_closed__ = True
@@ -295,8 +310,10 @@
 
 		layout.row().itemR(itasc, "simulation")
 		if itasc.simulation:
-			layout.row().itemR(itasc, "reiteration")
-			row = layout.row()
+			split = layout.split()
+			row = split.row()
+			row.itemR(itasc, "reiteration")
+			row = split.row()
 			if itasc.reiteration:
 				itasc.initial_reiteration = True
 			row.itemR(itasc, "initial_reiteration")

Modified: branches/itasc/source/blender/blenkernel/intern/action.c
===================================================================
--- branches/itasc/source/blender/blenkernel/intern/action.c	2009-09-17 10:14:56 UTC (rev 23298)
+++ branches/itasc/source/blender/blenkernel/intern/action.c	2009-09-17 11:04:10 UTC (rev 23299)
@@ -451,7 +451,7 @@
 	chan->limitmin[0]= chan->limitmin[1]= chan->limitmin[2]= -180.0f;
 	chan->limitmax[0]= chan->limitmax[1]= chan->limitmax[2]= 180.0f;
 	chan->stiffness[0]= chan->stiffness[1]= chan->stiffness[2]= 0.0f;
-	
+	chan->ikrotweight = chan->iklinweight = 0.0f;
 	Mat4One(chan->constinv);
 	
 	BLI_addtail(&pose->chanbase, chan);

Modified: branches/itasc/source/blender/editors/armature/editarmature.c
===================================================================
--- branches/itasc/source/blender/editors/armature/editarmature.c	2009-09-17 10:14:56 UTC (rev 23298)
+++ branches/itasc/source/blender/editors/armature/editarmature.c	2009-09-17 11:04:10 UTC (rev 23299)
@@ -2539,6 +2539,8 @@
 					VECCOPY(channew->limitmax, chanold->limitmax);
 					VECCOPY(channew->stiffness, chanold->stiffness);
 					channew->ikstretch= chanold->ikstretch;
+					channew->ikrotweight= chanold->ikrotweight;
+					channew->iklinweight= chanold->iklinweight;
 					
 					/* constraints */
 					listnew = &channew->constraints;
@@ -2639,6 +2641,8 @@
 								VECCOPY(channew->limitmax, chanold->limitmax);
 								VECCOPY(channew->stiffness, chanold->stiffness);
 								channew->ikstretch= chanold->ikstretch;
+								channew->ikrotweight= chanold->ikrotweight;
+								channew->iklinweight= chanold->iklinweight;
 								
 								/* constraints */
 								listnew = &channew->constraints;

Modified: branches/itasc/source/blender/editors/armature/poseobject.c
===================================================================
--- branches/itasc/source/blender/editors/armature/poseobject.c	2009-09-17 10:14:56 UTC (rev 23298)
+++ branches/itasc/source/blender/editors/armature/poseobject.c	2009-09-17 11:04:10 UTC (rev 23299)
@@ -798,6 +798,8 @@
 						VECCOPY(pchan->limitmax, pchanact->limitmax);
 						VECCOPY(pchan->stiffness, pchanact->stiffness);
 						pchan->ikstretch= pchanact->ikstretch;
+						pchan->ikrotweight= pchanact->ikrotweight;
+						pchan->iklinweight= pchanact->iklinweight;
 					}
 						break;
 					case 8: /* Custom Bone Shape */

Modified: branches/itasc/source/blender/editors/object/object_constraint.c
===================================================================
--- branches/itasc/source/blender/editors/object/object_constraint.c	2009-09-17 10:14:56 UTC (rev 23298)
+++ branches/itasc/source/blender/editors/object/object_constraint.c	2009-09-17 11:04:10 UTC (rev 23299)
@@ -56,6 +56,7 @@
 #include "BKE_object.h"
 #include "BKE_report.h"
 #include "BKE_utildefines.h"
+#include "BIK_api.h"
 
 #ifndef DISABLE_PYTHON
 #include "BPY_extern.h"
@@ -334,6 +335,7 @@
 				 *		optional... otherwise poletarget must exist too or else
 				 *		the constraint is deemed invalid
 				 */
+				/* default IK check ... */
 				if (exist_object(data->tar) == 0) {
 					data->tar = NULL;
 					curcon->flag |= CONSTRAINT_DISABLE;
@@ -355,7 +357,8 @@
 						}
 					}
 				}
-				
+				/* ... can be overwritten here */
+				BIK_test_constraint(owner, curcon);
 				/* targets have already been checked for this */
 				continue;
 			}

Modified: branches/itasc/source/blender/ikplugin/BIK_api.h
===================================================================
--- branches/itasc/source/blender/ikplugin/BIK_api.h	2009-09-17 10:14:56 UTC (rev 23298)
+++ branches/itasc/source/blender/ikplugin/BIK_api.h	2009-09-17 11:04:10 UTC (rev 23299)
@@ -64,6 +64,7 @@
 void BIK_clear_data(struct bPose *pose);
 void BIK_clear_cache(struct bPose *pose);
 void BIK_update_param(struct bPose *pose);
+void BIK_test_constraint(struct Object *ob, struct bConstraint *cons);
 // not yet implemented
 int BIK_get_constraint_param(struct bPose *pose, struct bConstraint *cons, int id, BIK_ParamValue *value);
 int BIK_get_channel_param(struct bPose *pose, struct bPoseChannel *pchan, int id, BIK_ParamValue *value);

Modified: branches/itasc/source/blender/ikplugin/intern/ikplugin_api.c
===================================================================
--- branches/itasc/source/blender/ikplugin/intern/ikplugin_api.c	2009-09-17 10:14:56 UTC (rev 23298)
+++ branches/itasc/source/blender/ikplugin/intern/ikplugin_api.c	2009-09-17 11:04:10 UTC (rev 23299)
@@ -55,6 +55,7 @@
 		NULL,
 		NULL,
 		NULL,
+		NULL,
 	},
 	/* iTaSC IK solver */
 	{
@@ -64,6 +65,7 @@
 		itasc_clear_data,
 		itasc_clear_cache,
 		itasc_update_param,
+		itasc_test_constraint,
 	}
 };
 
@@ -128,3 +130,11 @@
 	if (plugin && plugin->update_param)
 		plugin->update_param(pose);
 }
+
+void BIK_test_constraint(struct Object *ob, struct bConstraint *cons)
+{
+	IKPlugin *plugin = get_plugin(ob->pose);
+
+	if (plugin && plugin->test_constraint)
+		plugin->test_constraint(ob, cons);
+}

Modified: branches/itasc/source/blender/ikplugin/intern/ikplugin_api.h
===================================================================
--- branches/itasc/source/blender/ikplugin/intern/ikplugin_api.h	2009-09-17 10:14:56 UTC (rev 23298)
+++ branches/itasc/source/blender/ikplugin/intern/ikplugin_api.h	2009-09-17 11:04:10 UTC (rev 23299)
@@ -47,6 +47,7 @@
 	void (*remove_armature_func)(struct bPose *pose);
 	void (*clear_cache)(struct bPose *pose);
 	void (*update_param)(struct bPose *pose);
+	void (*test_constraint)(struct Object *ob, struct bConstraint *cons);
 };
 
 typedef struct IKPlugin IKPlugin;

Modified: branches/itasc/source/blender/ikplugin/intern/itasc_plugin.cpp
===================================================================
--- branches/itasc/source/blender/ikplugin/intern/itasc_plugin.cpp	2009-09-17 10:14:56 UTC (rev 23298)
+++ branches/itasc/source/blender/ikplugin/intern/itasc_plugin.cpp	2009-09-17 11:04:10 UTC (rev 23299)
@@ -95,7 +95,8 @@
 	ErrorCallback			errorCallback;
 	std::string				targetName;
 	std::string				constraintName;
-	unsigned int			controlType;
+	unsigned short			controlType;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list