[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22679] branches/itasc: new Armature sensor to get signal from the IK solver - part 1.

Benoit Bolsee benoit.bolsee at online.be
Fri Aug 21 16:15:49 CEST 2009


Revision: 22679
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22679
Author:   ben2610
Date:     2009-08-21 16:15:49 +0200 (Fri, 21 Aug 2009)

Log Message:
-----------
new Armature sensor to get signal from the IK solver - part 1.

Modified Paths:
--------------
    branches/itasc/projectfiles_vc9/gameengine/gamelogic/SCA_GameLogic.vcproj
    branches/itasc/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj
    branches/itasc/source/blender/blenkernel/intern/sca.c
    branches/itasc/source/blender/blenloader/intern/readfile.c
    branches/itasc/source/blender/blenloader/intern/writefile.c
    branches/itasc/source/blender/editors/space_logic/logic_window.c
    branches/itasc/source/blender/ikplugin/BIK_api.h
    branches/itasc/source/blender/ikplugin/intern/itasc_plugin.cpp
    branches/itasc/source/blender/makesdna/DNA_constraint_types.h
    branches/itasc/source/blender/makesdna/DNA_sensor_types.h
    branches/itasc/source/blender/makesrna/RNA_access.h
    branches/itasc/source/blender/makesrna/intern/rna_constraint.c
    branches/itasc/source/blender/makesrna/intern/rna_sensor.c
    branches/itasc/source/gameengine/Converter/KX_ConvertSensors.cpp
    branches/itasc/source/gameengine/GameLogic/SCA_EventManager.h
    branches/itasc/source/gameengine/Ketsji/KX_Scene.cpp

Added Paths:
-----------
    branches/itasc/source/gameengine/GameLogic/SCA_BasicEventManager.cpp
    branches/itasc/source/gameengine/GameLogic/SCA_BasicEventManager.h
    branches/itasc/source/gameengine/Ketsji/KX_ArmatureSensor.cpp
    branches/itasc/source/gameengine/Ketsji/KX_ArmatureSensor.h

Modified: branches/itasc/projectfiles_vc9/gameengine/gamelogic/SCA_GameLogic.vcproj
===================================================================
--- branches/itasc/projectfiles_vc9/gameengine/gamelogic/SCA_GameLogic.vcproj	2009-08-21 14:12:06 UTC (rev 22678)
+++ branches/itasc/projectfiles_vc9/gameengine/gamelogic/SCA_GameLogic.vcproj	2009-08-21 14:15:49 UTC (rev 22679)
@@ -498,6 +498,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\..\source\gameengine\GameLogic\SCA_BasicEventManager.cpp"
+				>
+			</File>
+			<File
 				RelativePath="..\..\..\source\gameengine\GameLogic\SCA_DelaySensor.cpp"
 				>
 			</File>
@@ -659,6 +663,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\..\source\gameengine\GameLogic\SCA_BasicEventManager.h"
+				>
+			</File>
+			<File
 				RelativePath="..\..\..\source\gameengine\GameLogic\SCA_DelaySensor.h"
 				>
 			</File>

Modified: branches/itasc/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj
===================================================================
--- branches/itasc/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj	2009-08-21 14:12:06 UTC (rev 22678)
+++ branches/itasc/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj	2009-08-21 14:15:49 UTC (rev 22679)
@@ -718,6 +718,10 @@
 				Name="SensorsImp"
 				>
 				<File
+					RelativePath="..\..\..\source\gameengine\Ketsji\KX_ArmatureSensor.cpp"
+					>
+				</File>
+				<File
 					RelativePath="..\..\..\source\gameengine\Ketsji\KX_MouseFocusSensor.cpp"
 					>
 				</File>
@@ -1027,6 +1031,10 @@
 				Name="Sensors"
 				>
 				<File
+					RelativePath="..\..\..\source\gameengine\Ketsji\KX_ArmatureSensor.h"
+					>
+				</File>
+				<File
 					RelativePath="..\..\..\source\gameengine\Ketsji\KX_MouseFocusSensor.h"
 					>
 				</File>

Modified: branches/itasc/source/blender/blenkernel/intern/sca.c
===================================================================
--- branches/itasc/source/blender/blenkernel/intern/sca.c	2009-08-21 14:12:06 UTC (rev 22678)
+++ branches/itasc/source/blender/blenkernel/intern/sca.c	2009-08-21 14:15:49 UTC (rev 22679)
@@ -152,6 +152,9 @@
 	case SENS_PROPERTY:
 		sens->data= MEM_callocN(sizeof(bPropertySensor), "propsens");
 		break;
+	case SENS_ARMATURE:
+		sens->data= MEM_callocN(sizeof(bArmatureSensor), "armsens");
+		break;
 	case SENS_ACTUATOR:
 		sens->data= MEM_callocN(sizeof(bActuatorSensor), "actsens");
 		break;

Modified: branches/itasc/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/itasc/source/blender/blenloader/intern/readfile.c	2009-08-21 14:12:06 UTC (rev 22678)
+++ branches/itasc/source/blender/blenloader/intern/readfile.c	2009-08-21 14:15:49 UTC (rev 22679)
@@ -2146,6 +2146,8 @@
 				data = ((bKinematicConstraint*)con->data);
 				data->tar = newlibadr(fd, id->lib, data->tar);
 				data->poletar = newlibadr(fd, id->lib, data->poletar);
+				con->lin_error = 0.f;
+				con->rot_error = 0.f;
 			}
 			break;
 		case CONSTRAINT_TYPE_TRACKTO:

Modified: branches/itasc/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/itasc/source/blender/blenloader/intern/writefile.c	2009-08-21 14:12:06 UTC (rev 22678)
+++ branches/itasc/source/blender/blenloader/intern/writefile.c	2009-08-21 14:15:49 UTC (rev 22679)
@@ -707,6 +707,9 @@
 		case SENS_PROPERTY:
 			writestruct(wd, DATA, "bPropertySensor", 1, sens->data);
 			break;
+		case SENS_ARMATURE:
+			writestruct(wd, DATA, "bArmatureSensor", 1, sens->data);
+			break;
 		case SENS_ACTUATOR:
 			writestruct(wd, DATA, "bActuatorSensor", 1, sens->data);
 			break;

Modified: branches/itasc/source/blender/editors/space_logic/logic_window.c
===================================================================
--- branches/itasc/source/blender/editors/space_logic/logic_window.c	2009-08-21 14:12:06 UTC (rev 22678)
+++ branches/itasc/source/blender/editors/space_logic/logic_window.c	2009-08-21 14:15:49 UTC (rev 22679)
@@ -634,6 +634,8 @@
 		return "Keyboard";
 	case SENS_PROPERTY:
 		return "Property";
+	case SENS_ARMATURE:
+		return "Armature";
 	case SENS_ACTUATOR:
 		return "Actuator";
 	case SENS_DELAY:
@@ -661,7 +663,7 @@
 	/* the number needs to match defines in game.h */
 	return "Sensors %t|Always %x0|Delay %x13|Keyboard %x3|Mouse %x5|"
 		"Touch %x1|Collision %x6|Near %x2|Radar %x7|"
-		"Property %x4|Random %x8|Ray %x9|Message %x10|Joystick %x11|Actuator %x12";
+		"Property %x4|Random %x8|Ray %x9|Message %x10|Joystick %x11|Actuator %x12|Armature %x14";
 }
 
 static char *controller_name(int type)
@@ -964,6 +966,7 @@
 	case SENS_NEAR:			return TH_PANEL; 
 	case SENS_KEYBOARD:		return TH_PANEL;
 	case SENS_PROPERTY:		return TH_PANEL;
+	case SENS_ARMATURE:		return TH_PANEL;
 	case SENS_ACTUATOR:		return TH_PANEL;
 	case SENS_MOUSE:		return TH_PANEL;
 	case SENS_RADAR:		return TH_PANEL;
@@ -1039,12 +1042,51 @@
 			 "Invert the level (output) of this sensor");
 }
 
-static short draw_sensorbuttons(bSensor *sens, uiBlock *block, short xco, short yco, short width,char* objectname)
+static void check_armature_bone_constraint(Object *ob, char *posechannel, char *constraint)
 {
+	/* check that bone exist in the active object */
+	if (ob->type == OB_ARMATURE && ob->pose) {
+		bPoseChannel *pchan;
+		bPose *pose = ob->pose;
+		for (pchan=pose->chanbase.first; pchan; pchan=pchan->next) {
+			if (!strcmp(pchan->name, posechannel)) {
+				/* found it, now look for constraint channel */
+				bConstraint *con;
+				for (con=pchan->constraints.first; con; con=con->next) {
+					if (!strcmp(con->name, constraint)) {
+						/* found it, all ok */
+						return;						
+					}
+				}
+				/* didn't find constraint, make empty */
+				constraint[0] = 0;
+				return;
+			}
+		}
+	}
+	/* didn't find any */
+	posechannel[0] = 0;
+	constraint[0] = 0;
+}
+
+static void check_armature_sensor(bContext *C, void *arg1_but, void *arg2_sens)
+{
+	bArmatureSensor *sens = arg2_sens;
+	uiBut *but = arg1_but;
+	Object *ob= CTX_data_active_object(C);
+
+	/* check that bone exist in the active object */
+	but->retval = B_REDR;
+	check_armature_bone_constraint(ob, sens->posechannel, sens->constraint);
+}
+
+static short draw_sensorbuttons(Object *ob, bSensor *sens, uiBlock *block, short xco, short yco, short width,char* objectname)
+{
 	bNearSensor      *ns           = NULL;
 	bTouchSensor     *ts           = NULL;
 	bKeyboardSensor  *ks           = NULL;
 	bPropertySensor  *ps           = NULL;
+	bArmatureSensor  *arm          = NULL;
 	bMouseSensor     *ms           = NULL;
 	bCollisionSensor *cs           = NULL;
 	bRadarSensor     *rs           = NULL;
@@ -1054,6 +1096,7 @@
 	bJoystickSensor	 *joy		   = NULL;
 	bActuatorSensor  *as           = NULL;
 	bDelaySensor     *ds		   = NULL;
+	uiBut *but;
 	short ysize;
 	char *str;
 	
@@ -1266,6 +1309,45 @@
 			yco-= ysize;
 			break;
 		}
+	case SENS_ARMATURE:
+		{
+			ysize= 70;
+			
+			glRects(xco, yco-ysize, xco+width, yco);
+			uiEmboss((float)xco, (float)yco-ysize,
+				(float)xco+width, (float)yco, 1);
+			
+			draw_default_sensor_header(sens, block, xco, yco, width);
+			arm= sens->data;
+
+			if (ob->type == OB_ARMATURE) {
+				uiBlockBeginAlign(block);
+				but = uiDefBut(block, TEX, 1, "Bone: ",
+						(xco+10), (yco-44), (width-20)/2, 19,
+						arm->posechannel, 0, 31, 0, 0,
+						"Bone on which you want to check a constraint");
+				uiButSetFunc(but, check_armature_sensor, but, arm);
+				but = uiDefBut(block, TEX, 1, "Cons: ",
+						(xco+10)+(width-20)/2, (yco-44), (width-20)/2, 19,
+						arm->constraint, 0, 31, 0, 0,
+						"Name of the constraint you want to control");
+				uiButSetFunc(but, check_armature_sensor, but, arm);
+				uiBlockEndAlign(block);
+
+				str= "Type %t|State changed %x0|Lin error below %x1|Lin error above %x2|Rot error below %x3|Rot error above %x4"; 
+
+				uiDefButI(block, MENU, B_REDR, str,			xco+10,yco-66,0.4*(width-20), 19,
+					&arm->type, 0, 31, 0, 0, "Type");
+			
+				if (arm->type != SENS_ARM_STATE_CHANGED)
+				{
+					uiDefButF(block, NUM, 1, "Value: ",		xco+10+0.4*(width-20),yco-66,0.6*(width-20), 19,
+					&arm->value, -10000.0, 10000.0, 100, 0, "Test the error against this value");
+				}
+			}
+			yco-= ysize;
+			break;
+		}
 	case SENS_ACTUATOR:
 		{
 			ysize= 48;
@@ -1682,28 +1764,7 @@
 
 	/* check that bone exist in the active object */
 	but->retval = B_REDR;
-	if (ob->type == OB_ARMATURE && ob->pose) {
-		bPoseChannel *pchan;
-		bPose *pose = ob->pose;
-		for (pchan=pose->chanbase.first; pchan; pchan=pchan->next) {
-			if (!strcmp(pchan->name, act->posechannel)) {
-				/* found it, now look for constraint channel */
-				bConstraint *con;
-				for (con=pchan->constraints.first; con; con=con->next) {
-					if (!strcmp(con->name, act->constraint)) {
-						/* found it, all ok */
-						return;						
-					}
-				}
-				/* didn't find constraint, make empty */
-				act->constraint[0] = 0;
-				return;
-			}
-		}
-	}
-	/* didn't find any */
-	act->posechannel[0] = 0;
-	act->constraint[0] = 0;
+	check_armature_bone_constraint(ob, act->posechannel, act->constraint);
 }
 
 
@@ -3279,7 +3340,7 @@
 						uiButSetFunc(but, make_unique_prop_names_cb, sens->name, (void*) 0);
 
 						sens->otype= sens->type;
-						yco= draw_sensorbuttons(sens, block, xco, yco, width,ob->id.name);
+						yco= draw_sensorbuttons(ob, sens, block, xco, yco, width,ob->id.name);
 						if(yco-6 < ycoo) ycoo= (yco+ycoo-20)/2;
 					}
 					else {

Modified: branches/itasc/source/blender/ikplugin/BIK_api.h
===================================================================
--- branches/itasc/source/blender/ikplugin/BIK_api.h	2009-08-21 14:12:06 UTC (rev 22678)
+++ branches/itasc/source/blender/ikplugin/BIK_api.h	2009-08-21 14:15:49 UTC (rev 22679)
@@ -39,19 +39,51 @@
 struct bPose;
 struct bArmature;
 struct Scene;
+struct bConstraint;
 
+enum BIK_ParamType {
+	BIK_PARAM_TYPE_FLOAT = 0,
+	BIK_PARAM_TYPE_INT,
+	BIK_PARAM_TYPE_STRING,
+};
+
+struct BIK_ParamValue {
+	short type;			/* BIK_PARAM_TYPE_.. */
+	short length;		/* for string, does not include terminating 0 */
+	union {
+		float f[8];
+		int   i[8];
+		char  s[32];
+	} value;		
+};
+typedef struct BIK_ParamValue BIK_ParamValue;
+
 void BIK_initialize_tree(struct Scene *scene, struct Object *ob, float ctime);
 void BIK_execute_tree(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime);
 void BIK_release_tree(struct Scene *scene, struct Object *ob, float ctime);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list