[Bf-blender-cvs] [949b319] hair_system: Fix crash with bullet when we remove a hair system solver.
Antony Riakiotakis
noreply at git.blender.org
Thu Aug 21 17:35:37 CEST 2014
Commit: 949b31945dc6b91e5c507a554a1481321354a59e
Author: Antony Riakiotakis
Date: Thu Aug 21 17:35:23 2014 +0200
Branches: hair_system
https://developer.blender.org/rB949b31945dc6b91e5c507a554a1481321354a59e
Fix crash with bullet when we remove a hair system solver.
===================================================================
M source/blender/blenkernel/intern/object.c
M source/blender/editors/object/CMakeLists.txt
M source/blender/editors/object/SConscript
M source/blender/editors/object/object_modifier.c
M source/blender/hair/HAIR_capi.cpp
M source/blender/hair/HAIR_capi.h
===================================================================
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 46c657f..085a719 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -3137,7 +3137,7 @@ void BKE_object_sim_pre_step(Scene *scene, Object *ob, float ctime)
else if (md->type == eModifierType_ParticleSystem) {
ParticleSystem *psys = ((ParticleSystemModifierData *) md)->psys;
- if (psys->part && psys->part->type == PART_HAIR && psys->flag & PSYS_HAIR_DYNAMICS && psys->particles) {
+ if (psys && psys->part && psys->part->type == PART_HAIR && psys->flag & PSYS_HAIR_DYNAMICS && psys->particles) {
/* This, strictly speaking, is not so correct */
DerivedMesh *dm = ob->derivedFinal;
diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt
index 1bb35b6..38576d7 100644
--- a/source/blender/editors/object/CMakeLists.txt
+++ b/source/blender/editors/object/CMakeLists.txt
@@ -25,6 +25,7 @@ set(INC
../../blenlib
../../bmesh
../../gpu
+ ../../hair
../../ikplugin
../../imbuf
../../makesdna
diff --git a/source/blender/editors/object/SConscript b/source/blender/editors/object/SConscript
index db30fae..d0a9da3 100644
--- a/source/blender/editors/object/SConscript
+++ b/source/blender/editors/object/SConscript
@@ -38,6 +38,7 @@ incs = [
'../../blenlib',
'../../bmesh',
'../../gpu',
+ '../../hair',
'../../ikplugin',
'../../imbuf',
'../../makesdna',
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index b05840b..95d246d 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -41,6 +41,7 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_force.h"
+#include "DNA_rigidbody_types.h"
#include "DNA_scene_types.h"
#include "BLI_bitmap.h"
@@ -83,6 +84,8 @@
#include "ED_screen.h"
#include "ED_mesh.h"
+#include "HAIR_capi.h"
+
#include "WM_api.h"
#include "WM_types.h"
@@ -281,6 +284,13 @@ static bool object_modifier_remove(Main *bmain, Object *ob, ModifierData *md,
if (md->type == eModifierType_ParticleSystem) {
ParticleSystemModifierData *psmd = (ParticleSystemModifierData *)md;
+ if (psmd->psys) {
+ RigidBodyWorld *rbw = md->scene->rigidbody_world;
+
+ if (rbw)
+ HAIR_solver_remove_from_rigidbodyworld(psmd->psys->solver, rbw->physics_world);
+ }
+
BLI_remlink(&ob->particlesystem, psmd->psys);
psys_free(ob, psmd->psys);
psmd->psys = NULL;
@@ -311,6 +321,15 @@ static bool object_modifier_remove(Main *bmain, Object *ob, ModifierData *md,
if (object_modifier_safe_to_delete(bmain, ob, md, eModifierType_Skin))
modifier_skin_customdata_delete(ob);
}
+ else if (md->type == eModifierType_Hair) {
+ HairModifierData *hmd = (HairModifierData *)md;
+ if (hmd->solver) {
+ RigidBodyWorld *rbw = md->scene->rigidbody_world;
+
+ if (rbw)
+ HAIR_solver_remove_from_rigidbodyworld(hmd->solver, rbw->physics_world);
+ }
+ }
if (ELEM(md->type, eModifierType_Softbody, eModifierType_Cloth) &&
BLI_listbase_is_empty(&ob->particlesystem))
diff --git a/source/blender/hair/HAIR_capi.cpp b/source/blender/hair/HAIR_capi.cpp
index a40f8f3..b26362d 100644
--- a/source/blender/hair/HAIR_capi.cpp
+++ b/source/blender/hair/HAIR_capi.cpp
@@ -124,6 +124,15 @@ void HAIR_solver_rebuild_rigidbodyworld(struct HAIR_Solver *csolver, struct rbDy
solver->data()->add_to_world(world, 0xFFFFFFFF);
}
+void HAIR_solver_remove_from_rigidbodyworld(struct HAIR_Solver *csolver, struct rbDynamicsWorld *world)
+{
+ Solver *solver = (Solver *)csolver;
+
+ if (solver->data())
+ solver->data()->remove_from_world(world);
+}
+
+
void HAIR_solver_step(struct HAIR_Solver *csolver, float time, float timestep)
{
Solver *solver = (Solver *)csolver;
diff --git a/source/blender/hair/HAIR_capi.h b/source/blender/hair/HAIR_capi.h
index 5d036ac..2abc8c3 100644
--- a/source/blender/hair/HAIR_capi.h
+++ b/source/blender/hair/HAIR_capi.h
@@ -56,6 +56,7 @@ void HAIR_solver_build_particle_data(struct HAIR_Solver *solver, struct Scene *s
void HAIR_solver_update_modifier_externals(struct HAIR_Solver *solver, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, struct HairSystem *hsys, float time);
void HAIR_solver_update_particle_externals(struct HAIR_Solver *solver, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, struct ParticleSystem *psys, float time);
void HAIR_solver_rebuild_rigidbodyworld(struct HAIR_Solver *solver, struct rbDynamicsWorld *world);
+void HAIR_solver_remove_from_rigidbodyworld(struct HAIR_Solver *solver, struct rbDynamicsWorld *world);
void HAIR_solver_step(struct HAIR_Solver *solver, float time, float timestep);
void HAIR_solver_step_debug(struct HAIR_Solver *csolver, float time, float timestep,
More information about the Bf-blender-cvs
mailing list