BGE: Adding a Max Jumps value to the character physic window
authorThomas Szepe <HG1_public@gmx.net>
Sun, 11 Oct 2015 16:28:43 +0000 (18:28 +0200)
committerThomas Szepe <HG1_public@gmx.net>
Sun, 11 Oct 2015 16:28:43 +0000 (18:28 +0200)
Actually we only have a Python API that allows to change the max jumps value.
The patch also allows non programmers to change the maximum numbers of jumps.

Reviewers: panzergame, sybren, campbellbarton, lordloki, moguri, agoose77

Reviewed By: lordloki, moguri

Projects: #game_engine

Differential Revision: https://developer.blender.org/D1302

release/scripts/startup/bl_ui/properties_game.py
source/blender/blenkernel/intern/object.c
source/blender/makesdna/DNA_object_types.h
source/blender/makesrna/intern/rna_object.c
source/gameengine/Converter/BL_BlenderDataConversion.cpp
source/gameengine/Ketsji/KX_CharacterWrapper.cpp
source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
source/gameengine/Physics/Bullet/CcdPhysicsController.h
source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
source/gameengine/Physics/common/PHY_Pro.h

index 56cd4d0f49150d9671fbbb9ab35be3f453b5a2e6..9673d8c5acea9522ddfe5bedda80741666260b43 100644 (file)
@@ -55,6 +55,7 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel, Panel):
             layout.prop(game, "step_height", slider=True)
             layout.prop(game, "jump_speed")
             layout.prop(game, "fall_speed")
+            layout.prop(game, "max_jumps")
 
         elif physics_type in {'DYNAMIC', 'RIGID_BODY'}:
             split = layout.split()
index ed841770204144c0e4f6a9ef2bda36990b0b1f13..e5f826f670d44beddbcc4ca25d0f538701574f7b 100644 (file)
@@ -1041,6 +1041,7 @@ Object *BKE_object_add_only_object(Main *bmain, int type, const char *name)
        ob->step_height = 0.15f;
        ob->jump_speed = 10.0f;
        ob->fall_speed = 55.0f;
+       ob->max_jumps = 1;
        ob->col_group = 0x01;
        ob->col_mask = 0xffff;
        ob->preview = NULL;
index faae78ab50057cb16e4739761cb180d362d17a73..cb39655ddc9d85aeab0bdb6e8c9ffd5eb7e056de 100644 (file)
@@ -189,7 +189,7 @@ typedef struct Object {
 
        /* did last modifier stack generation need mapping support? */
        char lastNeedMapping;  /* bool */
-       char pad[5];
+       char pad;
 
        /* dupli-frame settings */
        int dupon, dupoff, dupsta, dupend;
@@ -222,6 +222,8 @@ typedef struct Object {
        float step_height;
        float jump_speed;
        float fall_speed;
+       unsigned char max_jumps;
+       char pad2[3];
 
        /** Collision mask settings */
        unsigned short col_group, col_mask;
index e2d3db2335e29ce802d3070a67a16d156caa285e..99af8c0a9ac6ab1360cf39f12e508c3860b76f87 100644 (file)
@@ -1771,6 +1771,14 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
        RNA_def_property_float_default(prop, 55.0f);
        RNA_def_property_ui_text(prop, "Fall Speed Max", "Maximum speed at which the character will fall");
 
+       prop = RNA_def_property(srna, "max_jumps", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "max_jumps");
+       RNA_def_property_range(prop, 1, CHAR_MAX);
+       RNA_def_property_ui_range(prop, 1, 10, 1, 1);
+       RNA_def_property_int_default(prop, 1);
+       RNA_def_property_ui_text(prop, "Max Jumps",
+                                "The maximum number of jumps the character can make before it hits the ground.");
+
        /* Collision Masks */
        prop = RNA_def_property(srna, "collision_group", PROP_BOOLEAN, PROP_LAYER_MEMBER);
        RNA_def_property_boolean_sdna(prop, NULL, "col_group", 1);
index c74fd82a9f67ac9ec71e8b98605d196c04292373..928005a540d847ad47623776b309ebc2e688feed 100644 (file)
@@ -1215,7 +1215,8 @@ static PHY_ShapeProps *CreateShapePropsFromBlenderObject(struct Object* blendero
        shapeProps->m_step_height = blenderobject->step_height;
        shapeProps->m_jump_speed = blenderobject->jump_speed;
        shapeProps->m_fall_speed = blenderobject->fall_speed;
-       
+       shapeProps->m_max_jumps = blenderobject->max_jumps;
+
        return shapeProps;
 }
 
index d777ae7ec80069f23b0af483fd633e0f01b1ff84..44f06a9f1ebefa3de5e00e849cc82d2d2ff1f9ca 100644 (file)
@@ -119,7 +119,7 @@ int KX_CharacterWrapper::pyattr_set_max_jumps(void *self_v, const KX_PYATTRIBUTE
 
        CLAMP(param, 0, 255);
 
-       self->m_character->SetMaxJumps((unsigned char)param);
+       self->m_character->SetMaxJumps(param);
        return PY_SET_ATTR_SUCCESS;
 }
 
index 6a1e52c9263eddc601324bb2aa0836f3a7371635..f11d7ac017f1ed483d510372a425663325a4b66e 100644 (file)
@@ -533,6 +533,7 @@ bool CcdPhysicsController::CreateCharacterController()
 
        m_characterController->setJumpSpeed(m_cci.m_jumpSpeed);
        m_characterController->setFallSpeed(m_cci.m_fallSpeed);
+       m_characterController->setMaxJumps(m_cci.m_maxJumps);
 
        return true;
 }
index 2ae1ff8f25a6c8059bc67b4ec09e66c601fb256b..a0b04736bdfd159582a815d08df925521e2ecac2 100644 (file)
@@ -316,7 +316,8 @@ struct CcdConstructionInfo
        float   m_stepHeight;
        float   m_jumpSpeed;
        float   m_fallSpeed;
-       
+       unsigned char m_maxJumps;
+
        int             m_gamesoftFlag;
        float   m_soft_linStiff;                        /* linear stiffness 0..1 */
        float   m_soft_angStiff;                /* angular stiffness 0..1 */
index eec579158ccdde7b9e18e93b591ec6f0b39bc67b..1b7267b54a691aaa250b76f411175b7d25269a6e 100644 (file)
@@ -3162,6 +3162,7 @@ void CcdPhysicsEnvironment::ConvertObject(KX_GameObject *gameobj, RAS_MeshObject
        ci.m_stepHeight = isbulletchar ? shapeprops->m_step_height : 0.f;
        ci.m_jumpSpeed = isbulletchar ? shapeprops->m_jump_speed : 0.f;
        ci.m_fallSpeed = isbulletchar ? shapeprops->m_fall_speed : 0.f;
+       ci.m_maxJumps = isbulletchar ? shapeprops->m_max_jumps : 0;
 
        //mmm, for now, take this for the size of the dynamicobject
        // Blender uses inertia for radius of dynamic object
index c9b91b06a3c1d9b4ba1fc8886222c343b59ad98c..bfe574e73cbd0db9d79013fcf953fb7db9d65d3d 100644 (file)
@@ -51,6 +51,7 @@ struct PHY_ShapeProps {
        MT_Scalar  m_step_height;                       // Max height of climbable steps (Character)
        MT_Scalar  m_jump_speed;                        // Velocity of jumps (Character)
        MT_Scalar  m_fall_speed;                        // Max velocity of falling (Character)
+       unsigned char m_max_jumps;          // Max ammount of jumps (Character)
 };