[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