[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