diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2012-03-03 06:47:01 +0400 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2012-03-03 06:47:01 +0400 |
commit | 1f928833f3677fa47a10099205c9f7ffa9adfadb (patch) | |
tree | 85b6fb8af88d7d459830e7b3fb51f6b84e74cf50 | |
parent | 95bba22af075148f9cbdb5a9b1ef41aeff1f560f (diff) |
option for the Armature Actuator to change the influence of a bone constraint.
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
-rw-r--r-- | doc/python_api/rst/bge.types.rst | 14 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/sca.c | 3 | ||||
-rw-r--r-- | source/blender/editors/space_logic/logic_window.c | 10 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_actuator_types.h | 7 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_actuator.c | 7 | ||||
-rw-r--r-- | source/gameengine/Converter/BL_ArmatureActuator.cpp | 9 | ||||
-rw-r--r-- | source/gameengine/Converter/BL_ArmatureActuator.h | 4 | ||||
-rw-r--r-- | source/gameengine/Converter/BL_ArmatureConstraint.h | 5 | ||||
-rw-r--r-- | source/gameengine/Converter/BL_ArmatureObject.cpp | 1 | ||||
-rw-r--r-- | source/gameengine/Converter/KX_ConvertActuators.cpp | 2 |
10 files changed, 56 insertions, 6 deletions
diff --git a/doc/python_api/rst/bge.types.rst b/doc/python_api/rst/bge.types.rst index 735ad037175..3c15362a4ec 100644 --- a/doc/python_api/rst/bge.types.rst +++ b/doc/python_api/rst/bge.types.rst @@ -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. diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c index 92dfe90eec1..30a7449be1b 100644 --- a/source/blender/blenkernel/intern/sca.c +++ b/source/blender/blenkernel/intern/sca.c @@ -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"); diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 878543e6a36..15aab2aa9b0 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -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; } } diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h index 41b830847ad..776231476ba 100644 --- a/source/blender/makesdna/DNA_actuator_types.h +++ b/source/blender/makesdna/DNA_actuator_types.h @@ -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 diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 6098e885df5..c9a57279181 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -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) diff --git a/source/gameengine/Converter/BL_ArmatureActuator.cpp b/source/gameengine/Converter/BL_ArmatureActuator.cpp index 73403baa15e..3f4a261a972 100644 --- a/source/gameengine/Converter/BL_ArmatureActuator.cpp +++ b/source/gameengine/Converter/BL_ArmatureActuator.cpp @@ -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 }; diff --git a/source/gameengine/Converter/BL_ArmatureActuator.h b/source/gameengine/Converter/BL_ArmatureActuator.h index 761d429f784..638640c27ce 100644 --- a/source/gameengine/Converter/BL_ArmatureActuator.h +++ b/source/gameengine/Converter/BL_ArmatureActuator.h @@ -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; }; diff --git a/source/gameengine/Converter/BL_ArmatureConstraint.h b/source/gameengine/Converter/BL_ArmatureConstraint.h index 89bad520563..0d79bb1cfa7 100644 --- a/source/gameengine/Converter/BL_ArmatureConstraint.h +++ b/source/gameengine/Converter/BL_ArmatureConstraint.h @@ -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); diff --git a/source/gameengine/Converter/BL_ArmatureObject.cpp b/source/gameengine/Converter/BL_ArmatureObject.cpp index 5a44e1022ff..79efc8f7586 100644 --- a/source/gameengine/Converter/BL_ArmatureObject.cpp +++ b/source/gameengine/Converter/BL_ArmatureObject.cpp @@ -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: diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp index e577a5e5f99..135a3b20d96 100644 --- a/source/gameengine/Converter/KX_ConvertActuators.cpp +++ b/source/gameengine/Converter/KX_ConvertActuators.cpp @@ -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; } |