diff options
-rw-r--r-- | release/scripts/startup/bl_ui/properties_physics_rigidbody.py | 19 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/rigidbody.c | 33 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 6 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 1 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_rigidbody_types.h | 1 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_rigidbody.c | 6 |
6 files changed, 58 insertions, 8 deletions
diff --git a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py index c885aa662da..a9cb7b2145d 100644 --- a/release/scripts/startup/bl_ui/properties_physics_rigidbody.py +++ b/release/scripts/startup/bl_ui/properties_physics_rigidbody.py @@ -19,6 +19,7 @@ # <pep8 compliant> import bpy from bpy.types import Panel +from bl_ui.properties_physics_common import effector_weights_ui class PHYSICS_PT_rigidbody_panel(): @@ -136,5 +137,23 @@ class PHYSICS_PT_rigid_body_dynamics(PHYSICS_PT_rigidbody_panel, Panel): col.prop(rbo, "linear_damping", text="Translation") col.prop(rbo, "angular_damping", text="Rotation") +class PHYSICS_PT_rigid_body_field_weights(PHYSICS_PT_rigidbody_panel, Panel): + bl_label = "Rigid Body Field Weights" + bl_options = {'DEFAULT_CLOSED'} + COMPAT_ENGINES = {'BLENDER_RENDER'} + + @classmethod + def poll(cls, context): + obj = context.object + return (obj and obj.rigid_body and + obj.rigid_body.type == 'ACTIVE' and + (not context.scene.render.use_game_engine)) + + def draw(self, context): + ob = context.object + rbo = ob.rigid_body + + effector_weights_ui(self, context, rbo.effector_weights, 'RIGID_BODY') + if __name__ == "__main__": # only for live edit. bpy.utils.register_module(__name__) diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index 1ac49b2b224..48dcedfe0d3 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -144,6 +144,10 @@ void BKE_rigidbody_free_object(Object *ob) rbo->physics_shape = NULL; } + /* free effector weights */ + if (rbo->effector_weights) + MEM_freeN(rbo->effector_weights); + /* free data itself */ MEM_freeN(rbo); ob->rigidbody_object = NULL; @@ -178,11 +182,15 @@ void BKE_rigidbody_free_constraint(Object *ob) RigidBodyOb *BKE_rigidbody_copy_object(Object *ob) { + RigidBodyOb *rbo = ob->rigidbody_object; RigidBodyOb *rboN = NULL; - if (ob->rigidbody_object) { + if (rbo) { /* just duplicate the whole struct first (to catch all the settings) */ - rboN = MEM_dupallocN(ob->rigidbody_object); + rboN = MEM_dupallocN(rbo); + + if (rbo->effector_weights) + rboN->effector_weights = MEM_dupallocN(rbo->effector_weights); /* tag object as needing to be verified */ rboN->flag |= RBO_FLAG_NEEDS_VALIDATE; @@ -959,6 +967,8 @@ RigidBodyOb *BKE_rigidbody_create_object(Scene *scene, Object *ob, short type) /* create new settings data, and link it up */ rbo = MEM_callocN(sizeof(RigidBodyOb), "RigidBodyOb"); + rbo->effector_weights = BKE_add_effector_weights(NULL); + /* set default settings */ rbo->type = type; @@ -1211,13 +1221,16 @@ static void rigidbody_update_sim_ob(Scene *scene, RigidBodyWorld *rbw, Object *o /* update influence of effectors - but don't do it on an effector */ /* only dynamic bodies need effector update */ else if (rbo->type == RBO_TYPE_ACTIVE && ((ob->pd == NULL) || (ob->pd->forcefield == PFIELD_NULL))) { - EffectorWeights *effector_weights = rbw->effector_weights; EffectedPoint epoint; - ListBase *effectors; + ListBase *effectors_local; + ListBase *effectors_global; /* get effectors present in the group specified by effector_weights */ - effectors = pdInitEffectors(scene, ob, NULL, effector_weights); - if (effectors) { + effectors_local = pdInitEffectors(scene, ob, NULL, rbo->effector_weights); + effectors_global = pdInitEffectors(scene, ob, NULL, rbw->effector_weights); + if (effectors_local && effectors_global) { + float eff_force_local[3] = {0.0f, 0.0f, 0.0f}; + float eff_force_global[3] = {0.0f, 0.0f, 0.0f}; float eff_force[3] = {0.0f, 0.0f, 0.0f}; float eff_loc[3], eff_vel[3]; @@ -1231,7 +1244,10 @@ static void rigidbody_update_sim_ob(Scene *scene, RigidBodyWorld *rbw, Object *o /* calculate net force of effectors, and apply to sim object * - we use 'central force' since apply force requires a "relative position" which we don't have... */ - pdDoEffectors(effectors, NULL, effector_weights, &epoint, eff_force, NULL); + pdDoEffectors(effectors_local, NULL, rbo->effector_weights, &epoint, eff_force_local, NULL); + pdDoEffectors(effectors_global, NULL, rbw->effector_weights, &epoint, eff_force_global, NULL); + add_v3_v3v3(eff_force, eff_force_global, eff_force_local); + mul_v3_fl(eff_force, 0.5f); /* activate object in case it is deactivated */ if (!is_zero_v3(eff_force)) RB_body_activate(rbo->physics_object); @@ -1239,7 +1255,8 @@ static void rigidbody_update_sim_ob(Scene *scene, RigidBodyWorld *rbw, Object *o } /* cleanup */ - pdEndEffectors(&effectors); + pdEndEffectors(&effectors_global); + pdEndEffectors(&effectors_local); } /* NOTE: passive objects don't need to be updated since they don't move */ diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 0cd473fd74d..62f2e1b52cc 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -4926,6 +4926,12 @@ static void direct_link_object(FileData *fd, Object *ob) if (ob->rigidbody_object) { RigidBodyOb *rbo = ob->rigidbody_object; + rbo->effector_weights = newdataadr(fd, rbo->effector_weights); + if (rbo->effector_weights) + rbo->effector_weights->group = newlibadr(fd, ob->id.lib, rbo->effector_weights->group); + else + rbo->effector_weights = BKE_add_effector_weights(NULL); + /* must nullify the references to physics sim objects, since they no-longer exist * (and will need to be recalculated) */ diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 90405583544..dfd20d1d345 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -1525,6 +1525,7 @@ static void write_objects(WriteData *wd, ListBase *idbase) if (ob->rigidbody_object) { // TODO: if any extra data is added to handle duplis, will need separate function then writestruct(wd, DATA, "RigidBodyOb", 1, ob->rigidbody_object); + writestruct(wd, DATA, "EffectorWeights", 1, ob->rigidbody_object->effector_weights); } if (ob->rigidbody_constraint) { writestruct(wd, DATA, "RigidBodyCon", 1, ob->rigidbody_constraint); diff --git a/source/blender/makesdna/DNA_rigidbody_types.h b/source/blender/makesdna/DNA_rigidbody_types.h index 44416626ffd..f32908e5e15 100644 --- a/source/blender/makesdna/DNA_rigidbody_types.h +++ b/source/blender/makesdna/DNA_rigidbody_types.h @@ -123,6 +123,7 @@ typedef struct RigidBodyOb { float orn[4]; /* rigid body orientation */ float pos[3]; /* rigid body position */ float pad1; + struct EffectorWeights *effector_weights; } RigidBodyOb; diff --git a/source/blender/makesrna/intern/rna_rigidbody.c b/source/blender/makesrna/intern/rna_rigidbody.c index a07253876b0..edd9722503f 100644 --- a/source/blender/makesrna/intern/rna_rigidbody.c +++ b/source/blender/makesrna/intern/rna_rigidbody.c @@ -924,6 +924,12 @@ static void rna_def_rigidbody_object(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Collision Groups", "Collision Groups Rigid Body belongs to"); RNA_def_property_update(prop, NC_OBJECT | ND_POINTCACHE, "rna_RigidBodyOb_reset"); RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); + + /* effector weights */ + prop = RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "EffectorWeights"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Effector Weights", ""); } static void rna_def_rigidbody_constraint(BlenderRNA *brna) |