option for the Armature Actuator to change the influence of a bone constraint.
authorDalai Felinto <dfelinto@gmail.com>
Sat, 3 Mar 2012 02:47:01 +0000 (02:47 +0000)
committerDalai Felinto <dfelinto@gmail.com>
Sat, 3 Mar 2012 02:47:01 +0000 (02:47 +0000)
Also adds DampedTrackTo to the list of supported constraints in the BGE

Test file:
http://www.pasteall.org/blend/11715

Patch developed as part of a project to NF-UBC Nereus Program.
Development time 'sponsored' by the project.
www.nereusprogram.org

doc/python_api/rst/bge.types.rst
source/blender/blenkernel/intern/sca.c
source/blender/editors/space_logic/logic_window.c
source/blender/makesdna/DNA_actuator_types.h
source/blender/makesrna/intern/rna_actuator.c
source/gameengine/Converter/BL_ArmatureActuator.cpp
source/gameengine/Converter/BL_ArmatureActuator.h
source/gameengine/Converter/BL_ArmatureConstraint.h
source/gameengine/Converter/BL_ArmatureObject.cpp
source/gameengine/Converter/KX_ConvertActuators.cpp

index 735ad037175a73ef91034b2e84c26add95c2b082..3c15362a4ec5be06f9aee58deca5212547e7f372 100644 (file)
@@ -4518,10 +4518,16 @@ Game Types (bge.types)
 
    .. data:: KX_ACT_ARMATURE_SETWEIGHT
 
-      Change weight of (only for IK constraint).
+      Change weight of constraint (IK only).
 
       :value: 4
 
+   .. data:: KX_ACT_ARMATURE_SETINFLUENCE
+
+      Change influence of constraint.
+
+      :value: 5
+
    .. attribute:: type
 
       The type of action that the actuator executes when it is active.
@@ -4566,6 +4572,12 @@ Game Types (bge.types)
       
          A weight of 0 disables a constraint while still updating constraint runtime values (see :class:`BL_ArmatureConstraint`)
 
+   .. attribute:: influence
+
+      The influence this actuator will set on the constraint it controls.
+
+      :type: float.
+
 .. class:: KX_ArmatureSensor(SCA_ISensor)
 
    Armature sensor detect conditions on armatures.
index 92dfe90eec1fa650888122b763b57fa2bfeeb3e4..30a7449be1bdb34d81997bef826e801fb7b55697 100644 (file)
@@ -395,6 +395,7 @@ void init_actuator(bActuator *act)
        bRandomActuator *ra;
        bSoundActuator *sa;
        bSteeringActuator *sta;
+       bArmatureActuator *arma;
        
        if(act->data) MEM_freeN(act->data);
        act->data= NULL;
@@ -468,6 +469,8 @@ void init_actuator(bActuator *act)
                break;
        case ACT_ARMATURE:
                act->data = MEM_callocN(sizeof( bArmatureActuator ), "armature act");
+               arma = act->data;
+               arma->influence = 1.f;
                break;
        case ACT_STEERING:
                act->data = MEM_callocN(sizeof( bSteeringActuator), "steering act");
index 878543e6a36e42d4f04f5bbcf26343aa121fe8c1..15aab2aa9b096e3e142995b442731a12bc2b34c9 100644 (file)
@@ -3806,6 +3806,16 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
 
                        uiItemR(layout, ptr, "weight", 0, NULL, ICON_NONE);
                        break;
+               case ACT_ARM_SETINFLUENCE:
+                       if (ob->pose) {
+                               uiItemPointerR(layout, ptr, "bone", &pose_ptr, "bones", NULL, ICON_BONE_DATA);
+                               
+                               if (RNA_property_collection_lookup_string(&pose_ptr, bones_prop, aa->posechannel, &pchan_ptr))
+                                       uiItemPointerR(layout, ptr, "constraint", &pchan_ptr, "constraints", NULL, ICON_CONSTRAINT_BONE);
+                       }
+
+                       uiItemR(layout, ptr, "influence", 0, NULL, ICON_NONE);
+                       break;
        }
 }
 
index 41b830847ad9638b6d62ed6115332861ffa4d277..776231476ba8c7ff5d9d3397e73277a7ea7e32ed 100644 (file)
@@ -224,6 +224,8 @@ typedef struct bArmatureActuator {
        char constraint[64];    /* MAX_NAME */
        int type;               /* 0=run, 1=enable, 2=disable, 3=set target, 4=set weight */
        float weight;
+       float influence;
+       float pad;
        struct Object *target;
        struct Object *subtarget;
 } bArmatureActuator;
@@ -511,8 +513,9 @@ typedef struct bActuator {
 #define ACT_ARM_DISABLE                2
 #define ACT_ARM_SETTARGET      3
 #define ACT_ARM_SETWEIGHT      4
-/* update this define if more type are addedd */
-#define ACT_ARM_MAXTYPE                4
+#define ACT_ARM_SETINFLUENCE   5
+/* update this define if more types are added */
+#define ACT_ARM_MAXTYPE                5
 
 /* stateactuator->type */
 #define ACT_STATE_SET          0
index 6098e885df54e40c064dfc9fdb15e840b0c3b0b7..c9a572791818fba2df6ee14bdf05bd0106726e57 100644 (file)
@@ -1887,6 +1887,7 @@ static void rna_def_armature_actuator(BlenderRNA *brna)
                {ACT_ARM_DISABLE, "DISABLE", 0, "Disable", ""},
                {ACT_ARM_SETTARGET, "SETTARGET", 0, "Set Target", ""},
                {ACT_ARM_SETWEIGHT, "SETWEIGHT", 0, "Set Weight", ""},
+               {ACT_ARM_SETINFLUENCE, "SETINFLUENCE", 0, "Set Influence", ""},
                {0, NULL, 0, NULL, NULL}};
 
        srna= RNA_def_struct(brna, "ArmatureActuator", "Actuator");
@@ -1927,6 +1928,12 @@ static void rna_def_armature_actuator(BlenderRNA *brna)
        RNA_def_property_range(prop, 0.0, 1.0);
        RNA_def_property_ui_text(prop, "Weight", "Weight of this constraint");
        RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+       prop= RNA_def_property(srna, "influence", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "influence");
+       RNA_def_property_range(prop, 0.0, 1.0);
+       RNA_def_property_ui_text(prop, "Influence", "Influence of this constraint");
+       RNA_def_property_update(prop, NC_LOGIC, NULL);
 }
 
 static void rna_def_steering_actuator(BlenderRNA *brna)
index 73403baa15ed033a5708ff7edd6dd10f691db964..3f4a261a972d8f4a8e5e97758a1c85794d6347e2 100644 (file)
@@ -53,7 +53,8 @@ BL_ArmatureActuator::BL_ArmatureActuator(SCA_IObject* obj,
                                                const char *constraintname,
                                                KX_GameObject* targetobj,
                                                KX_GameObject* subtargetobj,
-                                               float weight) :
+                                               float weight,
+                                               float influence) :
        SCA_IActuator(obj, KX_ACT_ARMATURE),
        m_constraint(NULL),
        m_gametarget(targetobj),
@@ -61,6 +62,7 @@ BL_ArmatureActuator::BL_ArmatureActuator(SCA_IObject* obj,
        m_posechannel(posechannel),
        m_constraintname(constraintname),
        m_weight(weight),
+       m_influence(influence),
        m_type(type)
 {
        if (m_gametarget)
@@ -173,6 +175,10 @@ bool BL_ArmatureActuator::Update(double curtime, bool frame)
                        if (m_constraint)
                                m_constraint->SetWeight(m_weight);
                        break;
+               case ACT_ARM_SETINFLUENCE:
+                       if (m_constraint)
+                               m_constraint->SetInfluence(m_influence);
+                       break;
                }
        }
        return result;
@@ -216,6 +222,7 @@ PyAttributeDef BL_ArmatureActuator::Attributes[] = {
        KX_PYATTRIBUTE_RW_FUNCTION("target", BL_ArmatureActuator, pyattr_get_object, pyattr_set_object),
        KX_PYATTRIBUTE_RW_FUNCTION("subtarget", BL_ArmatureActuator, pyattr_get_object, pyattr_set_object),
        KX_PYATTRIBUTE_FLOAT_RW("weight",0.0f,1.0f,BL_ArmatureActuator,m_weight),
+       KX_PYATTRIBUTE_FLOAT_RW("influence",0.0f,1.0f,BL_ArmatureActuator,m_influence),
        KX_PYATTRIBUTE_INT_RW("type",0,ACT_ARM_MAXTYPE,false,BL_ArmatureActuator,m_type),
        { NULL }        //Sentinel
 };
index 761d429f784ab48044581e5378005f388555def9..638640c27ceb40dd6a89b64dae31dcbbcfdb2e9b 100644 (file)
@@ -54,7 +54,8 @@ public:
                                                const char *constraintname,
                                                KX_GameObject* targetobj,
                                                KX_GameObject* subtargetobj,
-                                               float weight);
+                                               float weight,
+                                               float influence);
 
        virtual ~BL_ArmatureActuator();
 
@@ -88,6 +89,7 @@ private:
        STR_String              m_posechannel;
        STR_String              m_constraintname;
        float                   m_weight;
+       float                   m_influence;
        int                             m_type;
 };
 
index 89bad520563e8bdc21e90df3b6f126df2b8899d0..0d79bb1cfa70c806b2e07d9643ba79284b285546 100644 (file)
@@ -104,6 +104,11 @@ public:
                        con->weight = weight;
                }
        }
+       void SetInfluence(float influence)
+       {
+               if (m_constraint)
+                       m_constraint->enforce = influence;
+       }
        void SetTarget(KX_GameObject* target);
        void SetSubtarget(KX_GameObject* subtarget);
 
index 5a44e1022ffd48b3bc22dc40c0a7e73bd0035879..79efc8f7586704872c791e048c6af09e3f5b09e2 100644 (file)
@@ -287,6 +287,7 @@ void BL_ArmatureObject::LoadConstraints(KX_BlenderSceneConverter* converter)
                        // which constraint should we support?
                        switch (pcon->type) {
                        case CONSTRAINT_TYPE_TRACKTO:
+                       case CONSTRAINT_TYPE_DAMPTRACK:
                        case CONSTRAINT_TYPE_KINEMATIC:
                        case CONSTRAINT_TYPE_ROTLIKE:
                        case CONSTRAINT_TYPE_LOCLIKE:
index e577a5e5f99dfd62a6c591840251e2de7d6a5814..135a3b20d967af398563702d5be820f97613bc2b 100644 (file)
@@ -1060,7 +1060,7 @@ void BL_ConvertActuators(const char* maggiename,
                                bArmatureActuator* armAct = (bArmatureActuator*) bact->data;
                                KX_GameObject *tmpgob = converter->FindGameObject(armAct->target);
                                KX_GameObject *subgob = converter->FindGameObject(armAct->subtarget);
-                               BL_ArmatureActuator* tmparmact = new BL_ArmatureActuator(gameobj, armAct->type, armAct->posechannel, armAct->constraint, tmpgob, subgob, armAct->weight);
+                               BL_ArmatureActuator* tmparmact = new BL_ArmatureActuator(gameobj, armAct->type, armAct->posechannel, armAct->constraint, tmpgob, subgob, armAct->weight, armAct->influence);
                                baseact = tmparmact;
                                break;
                        }