[Bf-blender-cvs] [fe135d3] hair_immediate_fixes: Renamed functions to make them explicitly refer to cloth, and split the create/free functions for solver data off from the cloth solver.

Lukas Tönne noreply at git.blender.org
Mon Sep 15 14:23:11 CEST 2014


Commit: fe135d3550c812619c3eb0cd3b98b68055816da9
Author: Lukas Tönne
Date:   Sat Sep 13 18:45:58 2014 +0200
Branches: hair_immediate_fixes
https://developer.blender.org/rBfe135d3550c812619c3eb0cd3b98b68055816da9

Renamed functions to make them explicitly refer to cloth, and split the
create/free functions for solver data off from the cloth solver.

===================================================================

M	source/blender/blenkernel/BKE_cloth.h
M	source/blender/blenkernel/intern/cloth.c
M	source/blender/physics/BPH_mass_spring.h
M	source/blender/physics/intern/implicit_blender.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h
index 3dec5c8..571c0ec 100644
--- a/source/blender/blenkernel/BKE_cloth.h
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -246,9 +246,9 @@ typedef enum {
 typedef struct {
 	const char		*name;
 	CM_SOLVER_ID	id;
-	int	( *init ) (struct Object *ob, struct ClothModifierData *clmd );
-	int	( *solver ) (struct Object *ob, float framenr, struct ClothModifierData *clmd, struct ListBase *effectors );
-	int	( *free ) (struct ClothModifierData *clmd );
+	int ( *init ) (struct Object *ob, struct ClothModifierData *clmd );
+	int ( *solver ) (struct Object *ob, float framenr, struct ClothModifierData *clmd, struct ListBase *effectors );
+	void ( *free ) (struct ClothModifierData *clmd );
 }
 CM_SOLVER_DEF;
 
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index ab3d2d6..e730a6f 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -56,8 +56,8 @@
 // 254 = MAX!
 static CM_SOLVER_DEF	solvers [] =
 {
-	{ "Implicit", CM_IMPLICIT, implicit_init, implicit_solver, implicit_free },
-		// { "Implicit C++", CM_IMPLICITCPP, implicitcpp_init, implicitcpp_solver, implicitcpp_free },
+	{ "Implicit", CM_IMPLICIT, BPH_cloth_solver_init, BPH_cloth_solve, BPH_cloth_solver_free },
+	// { "Implicit C++", CM_IMPLICITCPP, implicitcpp_init, implicitcpp_solver, implicitcpp_free },
 };
 
 /* ********** cloth engine ******* */
@@ -345,7 +345,7 @@ static int do_init_cloth(Object *ob, ClothModifierData *clmd, DerivedMesh *resul
 			return 0;
 		}
 	
-		implicit_set_positions(clmd);
+		BKE_cloth_solver_set_positions(clmd);
 
 		clmd->clothObject->last_frame= MINFRAME-1;
 	}
@@ -528,7 +528,7 @@ void clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, Derived
 	cache_result = BKE_ptcache_read(&pid, (float)framenr+scene->r.subframe);
 
 	if (cache_result == PTCACHE_READ_EXACT || cache_result == PTCACHE_READ_INTERPOLATED) {
-		implicit_set_positions(clmd);
+		BKE_cloth_solver_set_positions(clmd);
 		cloth_to_object (ob, clmd, vertexCos);
 
 		BKE_ptcache_validate(cache, framenr);
@@ -541,7 +541,7 @@ void clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, Derived
 		return;
 	}
 	else if (cache_result==PTCACHE_READ_OLD) {
-		implicit_set_positions(clmd);
+		BKE_cloth_solver_set_positions(clmd);
 	}
 	else if ( /*ob->id.lib ||*/ (cache->flag & PTCACHE_BAKED)) { /* 2.4x disabled lib, but this can be used in some cases, testing further - campbell */
 		/* if baked and nothing in cache, do nothing */
@@ -938,7 +938,7 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d
 	}
 	
 	if (!first)
-		implicit_set_positions(clmd);
+		BKE_cloth_solver_set_positions(clmd);
 
 	clmd->clothObject->bvhtree = bvhtree_build_from_cloth ( clmd, MAX2(clmd->coll_parms->epsilon, clmd->coll_parms->distance_repel) );
 	
diff --git a/source/blender/physics/BPH_mass_spring.h b/source/blender/physics/BPH_mass_spring.h
index 2960082..8382d0b 100644
--- a/source/blender/physics/BPH_mass_spring.h
+++ b/source/blender/physics/BPH_mass_spring.h
@@ -28,10 +28,15 @@
 #ifndef __BPH_MASS_SPRING_H__
 #define __BPH_MASS_SPRING_H__
 
-int implicit_init (struct Object *ob, struct ClothModifierData *clmd );
-int implicit_free (struct ClothModifierData *clmd );
-int implicit_solver (struct Object *ob, float frame, struct ClothModifierData *clmd, struct ListBase *effectors );
-void implicit_set_positions (struct ClothModifierData *clmd );
+struct Implicit_Data;
+
+struct Implicit_Data *BPH_mass_spring_solver_create(int numverts, int numsprings);
+void BPH_mass_spring_solver_free(struct Implicit_Data *id);
+
+int BPH_cloth_solver_init(struct Object *ob, struct ClothModifierData *clmd);
+void BPH_cloth_solver_free(struct ClothModifierData *clmd);
+int BPH_cloth_solve(struct Object *ob, float frame, struct ClothModifierData *clmd, struct ListBase *effectors);
+void BKE_cloth_solver_set_positions (struct ClothModifierData *clmd );
 
 bool implicit_hair_volume_get_texture_data(struct Object *UNUSED(ob), struct ClothModifierData *clmd, struct ListBase *UNUSED(effectors), struct VoxelData *vd);
 
diff --git a/source/blender/physics/intern/implicit_blender.c b/source/blender/physics/intern/implicit_blender.c
index 775baa6..9b78447 100644
--- a/source/blender/physics/intern/implicit_blender.c
+++ b/source/blender/physics/intern/implicit_blender.c
@@ -844,58 +844,81 @@ typedef struct Implicit_Data  {
 	fmatrix3x3 *P, *Pinv;		/* pre-conditioning matrix */
 } Implicit_Data;
 
-int implicit_init(Object *UNUSED(ob), ClothModifierData *clmd)
+Implicit_Data *BPH_mass_spring_solver_create(int numverts, int numsprings)
 {
-	unsigned int i = 0;
-	Cloth *cloth = NULL;
-	ClothVertex *verts = NULL;
-	ClothSpring *spring = NULL;
-	Implicit_Data *id = NULL;
-	LinkNode *search = NULL;
+	Implicit_Data *id = (Implicit_Data *)MEM_callocN(sizeof(Implicit_Data), "implicit vecmat");
+	
+	/* process diagonal elements */
+	id->A = create_bfmatrix(numverts, numsprings);
+	id->dFdV = create_bfmatrix(numverts, numsprings);
+	id->dFdX = create_bfmatrix(numverts, numsprings);
+	id->S = create_bfmatrix(numverts, 0);
+	id->Pinv = create_bfmatrix(numverts, numsprings);
+	id->P = create_bfmatrix(numverts, numsprings);
+	id->bigI = create_bfmatrix(numverts, numsprings); // TODO 0 springs
+	id->M = create_bfmatrix(numverts, numsprings);
+	id->X = create_lfvector(numverts);
+	id->Xnew = create_lfvector(numverts);
+	id->V = create_lfvector(numverts);
+	id->Vnew = create_lfvector(numverts);
+	id->F = create_lfvector(numverts);
+	id->B = create_lfvector(numverts);
+	id->dV = create_lfvector(numverts);
+	id->z = create_lfvector(numverts);
+
+	id->root = MEM_callocN(sizeof(RootTransform) * numverts, "root transforms");
+
+	return id;
+}
+
+void BPH_mass_spring_solver_free(Implicit_Data *id)
+{
+	del_bfmatrix(id->A);
+	del_bfmatrix(id->dFdV);
+	del_bfmatrix(id->dFdX);
+	del_bfmatrix(id->S);
+	del_bfmatrix(id->P);
+	del_bfmatrix(id->Pinv);
+	del_bfmatrix(id->bigI);
+	del_bfmatrix(id->M);
+	
+	del_lfvector(id->X);
+	del_lfvector(id->Xnew);
+	del_lfvector(id->V);
+	del_lfvector(id->Vnew);
+	del_lfvector(id->F);
+	del_lfvector(id->B);
+	del_lfvector(id->dV);
+	del_lfvector(id->z);
+	
+	MEM_freeN(id->root);
+	
+	MEM_freeN(id);
+}
+
+int BPH_cloth_solver_init(Object *UNUSED(ob), ClothModifierData *clmd)
+{
+	Cloth *cloth = clmd->clothObject;
+	ClothVertex *verts = cloth->verts;
+	Implicit_Data *id;
+	unsigned int i;
+	LinkNode *search;
 	
 	if (G.debug_value > 0)
 		printf("implicit_init\n");
-
-	// init memory guard
-	// BLI_listbase_clear(&MEMORY_BASE);
-
-	cloth = (Cloth *)clmd->clothObject;
-	verts = cloth->verts;
-
-	// create implicit base
-	id = (Implicit_Data *)MEM_callocN(sizeof(Implicit_Data), "implicit vecmat");
-	cloth->implicit = id;
-
-	/* process diagonal elements */
-	id->A = create_bfmatrix(cloth->numverts, cloth->numsprings);
-	id->dFdV = create_bfmatrix(cloth->numverts, cloth->numsprings);
-	id->dFdX = create_bfmatrix(cloth->numverts, cloth->numsprings);
-	id->S = create_bfmatrix(cloth->numverts, 0);
-	id->Pinv = create_bfmatrix(cloth->numverts, cloth->numsprings);
-	id->P = create_bfmatrix(cloth->numverts, cloth->numsprings);
-	id->bigI = create_bfmatrix(cloth->numverts, cloth->numsprings); // TODO 0 springs
-	id->M = create_bfmatrix(cloth->numverts, cloth->numsprings);
-	id->X = create_lfvector(cloth->numverts);
-	id->Xnew = create_lfvector(cloth->numverts);
-	id->V = create_lfvector(cloth->numverts);
-	id->Vnew = create_lfvector(cloth->numverts);
-	id->F = create_lfvector(cloth->numverts);
-	id->B = create_lfvector(cloth->numverts);
-	id->dV = create_lfvector(cloth->numverts);
-	id->z = create_lfvector(cloth->numverts);
-
-	id->root = MEM_callocN(sizeof(RootTransform) * cloth->numverts, "root transforms");
-
+	
+	cloth->implicit = id = BPH_mass_spring_solver_create(cloth->numverts, cloth->numsprings);
+	
 	for (i = 0; i < cloth->numverts; i++) {
 		id->A[i].r = id->A[i].c = id->dFdV[i].r = id->dFdV[i].c = id->dFdX[i].r = id->dFdX[i].c = id->P[i].c = id->P[i].r = id->Pinv[i].c = id->Pinv[i].r = id->bigI[i].c = id->bigI[i].r = id->M[i].r = id->M[i].c = i;
 		
 		initdiag_fmatrixS(id->M[i].m, verts[i].mass);
 	}
-
+	
 	// init springs 
 	search = cloth->springs;
 	for (i = 0; i < cloth->numsprings; i++) {
-		spring = search->link;
+		ClothSpring *spring = search->link;
 		
 		// dFdV_start[i].r = big_I[i].r = big_zero[i].r = 
 		id->A[i+cloth->numverts].r = id->dFdV[i+cloth->numverts].r = id->dFdX[i+cloth->numverts].r = 
@@ -915,45 +938,18 @@ int implicit_init(Object *UNUSED(ob), ClothModifierData *clmd)
 	for (i = 0; i < cloth->numverts; i++) {
 		copy_v3_v3(id->X[i], verts[i].x);
 	}
-
+	
 	return 1;
 }
 
-int	implicit_free(ClothModifierData *clmd)
+void BPH_cloth_solver_free(ClothModifierData *clmd)
 {
-	Implicit_Data *id;
-	Cloth *cloth;
-	cloth = (Cloth *)clmd->clothObject;
-
-	if (cloth) {
-		id = cloth->implicit;
-
-		if (id) {
-			del_bfmatrix(id->A);
-			del_bfmatrix(id->dFdV);
-			del_bfmatrix(id->dFdX);
-			del_bfmatrix(id->S);
-			del_bfmatrix(id->P);
-			del_bfmatrix(id->Pinv);
-			del_bfmatrix(id->bigI);
-			del_bfmatrix(id->M);
-
-			del_lfvector(id->X);
-			del_lfvector(id->Xnew);
-			del_lfvector(id->V);
-			del_lfvector(id->Vnew);
-			del_lfvector(id->F);
-			del_lfvector(id->B);
-			del_lfvector(id->dV);
-			del_lfvector(id->z);
-
-			MEM_freeN(id->root);
-
-			MEM_freeN(id);
-		}
+	Cloth *cloth = clmd->clothObject;
+	
+	if (cloth->implicit) {
+		BPH_mass_spring_solver_free(cloth->implicit);
+		cloth->implicit = NULL;
 	}
-
-	return 1;
 }
 
 /* ==== Transformation of Moving Reference Frame ====
@@ -2720,7 +2716,7 @@ static int UNUSED_FUNCTION(cloth_calc_helper_forces)(Object *UNUSED(ob), ClothMo
 	return 1;
 }
 
-int implicit_solver(Object *ob, float frame, ClothModifierData *clmd, ListBase *effectors)
+int BPH_cloth_solve(Object *ob, float frame, ClothModifierData *clmd, ListBase *effectors)
 {
 	unsigned int i=0;
 	float step=0.0f, tf=clmd->sim_parms->timescale;
@@ -2912,7 +2908,7 @@ int implicit_solver(Object *ob, float frame, ClothModifierData *clmd, ListBase *
 	return 1;
 }
 
-void implicit_set_posi

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list