[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59273] trunk/blender: Make lattice deform safe for threading

Sergey Sharybin sergey.vfx at gmail.com
Mon Aug 19 12:11:48 CEST 2013


Revision: 59273
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59273
Author:   nazgul
Date:     2013-08-19 10:11:48 +0000 (Mon, 19 Aug 2013)
Log Message:
-----------
Make lattice deform safe for threading

Lattice deformation used to store some runtime data
inside of lattice datablock itself. It's something
which is REALLY bad. Ideally DNA shouldn't contain
and runtime data.

For now solved it in a way that initialization of
lattice deform will create a structure which contains
lattice object for which deformation is calculating
and that runtime data which used to be stored in
lattice datablock itself.

It works really fine for mesh deform modifier, but
there's still runtime data stored in particle system
DNA, It didn't look something easy to be solved, so
leaving this as-is for now.

--
svn merge -r58277:58278 -r58795:58796 ^/branches/soc-2013-depsgraph_mt

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58277
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58795

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_lattice.h
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/blenkernel/intern/lattice.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/makesdna/DNA_lattice_types.h
    trunk/blender/source/blender/makesdna/DNA_particle_types.h
    trunk/blender/source/blender/modifiers/intern/MOD_explode.c
    trunk/blender/source/blender/modifiers/intern/MOD_particleinstance.c
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/pointdensity.c

Property Changed:
----------------
    trunk/blender/
    trunk/blender/source/blender/editors/interface/interface.c
    trunk/blender/source/blender/editors/space_outliner/


Property changes on: trunk/blender
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/ge_dev:58091-58422
/branches/ge_harmony:42255,42279-42282,42286,42302,42338,42349,42616,42620,42698-42699,42739,42753,42773-42774,42832,44568,44597-44598,44793-44794
/branches/soc-2011-cucumber:37517,38166-38167,38177,38179-38180,38187,38242,38384,38387,38403-38404,38407,38968,38970,38973,39045,40845,42997-42998,43439
/branches/soc-2011-tomato:42376,42378-42379,42383,42385,42395,42397-42400,42407,42411,42418,42443-42444,42446,42467,42472,42486,42650-42652,42654-42655,42709-42710,42733-42734,42801,43872,44130,44141,44147-44149,44151-44152,44229-44230,45623-45625,46037,48089,48092,48551-48552,48679,48790,48792-48793,49076,49087,49292,49294,49466,49894,50052,50126,52854-52856,54573,58822,58989
/branches/soc-2013-depsgraph_mt:57516,57900,57939-57940,57945,57958-57961,58151,58155-58156,58169,58277,59259
/branches/soc-2013-dingto:57424,57487,57507,57525,57599,57670,57918-57919,57981,58091,58245,58253,58587,58772,58774-58775,58828,58835,59032
/tags/blender-2.67b-release/blender:57122
   + /branches/ge_dev:58091-58422
/branches/ge_harmony:42255,42279-42282,42286,42302,42338,42349,42616,42620,42698-42699,42739,42753,42773-42774,42832,44568,44597-44598,44793-44794
/branches/soc-2011-cucumber:37517,38166-38167,38177,38179-38180,38187,38242,38384,38387,38403-38404,38407,38968,38970,38973,39045,40845,42997-42998,43439
/branches/soc-2011-tomato:42376,42378-42379,42383,42385,42395,42397-42400,42407,42411,42418,42443-42444,42446,42467,42472,42486,42650-42652,42654-42655,42709-42710,42733-42734,42801,43872,44130,44141,44147-44149,44151-44152,44229-44230,45623-45625,46037,48089,48092,48551-48552,48679,48790,48792-48793,49076,49087,49292,49294,49466,49894,50052,50126,52854-52856,54573,58822,58989
/branches/soc-2013-depsgraph_mt:57516,57900,57939-57940,57945,57958-57961,58151,58155-58156,58169,58277-58278,58796,59259
/branches/soc-2013-dingto:57424,57487,57507,57525,57599,57670,57918-57919,57981,58091,58245,58253,58587,58772,58774-58775,58828,58835,59032
/tags/blender-2.67b-release/blender:57122

Modified: trunk/blender/source/blender/blenkernel/BKE_lattice.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_lattice.h	2013-08-19 10:06:05 UTC (rev 59272)
+++ trunk/blender/source/blender/blenkernel/BKE_lattice.h	2013-08-19 10:11:48 UTC (rev 59273)
@@ -49,9 +49,14 @@
 void BKE_lattice_make_local(struct Lattice *lt);
 void calc_lat_fudu(int flag, int res, float *r_fu, float *r_du);
 
-void init_latt_deform(struct Object *oblatt, struct Object *ob);
-void calc_latt_deform(struct Object *, float co[3], float weight);
-void end_latt_deform(struct Object *);
+struct LatticeDeformData;
+struct LatticeDeformData *init_latt_deform(struct Object *oblatt, struct Object *ob)
+#ifdef __GNUC__
+__attribute__((warn_unused_result))
+#endif
+;
+void calc_latt_deform(struct LatticeDeformData *lattice_deform_data, float co[3], float weight);
+void end_latt_deform(struct LatticeDeformData *lattice_deform_data);
 
 int object_deform_mball(struct Object *ob, struct ListBase *dispbase);
 void outside_lattice(struct Lattice *lt);

Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h	2013-08-19 10:06:05 UTC (rev 59272)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h	2013-08-19 10:11:48 UTC (rev 59273)
@@ -54,6 +54,7 @@
 struct MFace;
 struct MVert;
 struct IpoCurve;
+struct LatticeDeformData;
 struct LinkNode;
 struct KDTree;
 struct RNG;
@@ -258,7 +259,7 @@
 /* UNUSED */
 // struct Object *psys_find_object(struct Scene *scene, struct ParticleSystem *psys);
 
-struct Object *psys_get_lattice(struct ParticleSimulationData *sim);
+struct LatticeDeformData *psys_create_lattice_deform_data(struct ParticleSimulationData *sim);
 
 int psys_in_edit_mode(struct Scene *scene, struct ParticleSystem *psys);
 int psys_check_enabled(struct Object *ob, struct ParticleSystem *psys);

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c	2013-08-19 10:06:05 UTC (rev 59272)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c	2013-08-19 10:11:48 UTC (rev 59273)
@@ -1330,7 +1330,7 @@
 
 		psys_check_group_weights(part);
 
-		psys->lattice = psys_get_lattice(&sim);
+		psys->lattice_deform_data = psys_create_lattice_deform_data(&sim);
 
 		/* gather list of objects or single object */
 		if (part->ren_as == PART_DRAW_GR) {
@@ -1567,9 +1567,9 @@
 	if (obcopylist)
 		MEM_freeN(obcopylist);
 
-	if (psys->lattice) {
-		end_latt_deform(psys->lattice);
-		psys->lattice = NULL;
+	if (psys->lattice_deform_data) {
+		end_latt_deform(psys->lattice_deform_data);
+		psys->lattice_deform_data = NULL;
 	}
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/lattice.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/lattice.c	2013-08-19 10:06:05 UTC (rev 59272)
+++ trunk/blender/source/blender/blenkernel/intern/lattice.c	2013-08-19 10:11:48 UTC (rev 59273)
@@ -307,7 +307,13 @@
 	}
 }
 
-void init_latt_deform(Object *oblatt, Object *ob)
+typedef struct LatticeDeformData {
+	Object *object;
+	float *latticedata;
+	float latmat[4][4];
+} LatticeDeformData;
+
+LatticeDeformData *init_latt_deform(Object *oblatt, Object *ob)
 {
 	/* we make an array with all differences */
 	Lattice *lt = oblatt->data;
@@ -317,27 +323,30 @@
 	float *fp, imat[4][4];
 	float fu, fv, fw;
 	int u, v, w;
+	float *latticedata;
+	float latmat[4][4];
+	LatticeDeformData *lattice_deform_data;
 
 	if (lt->editlatt) lt = lt->editlatt->latt;
 	bp = lt->def;
 	
-	fp = lt->latticedata = MEM_mallocN(sizeof(float) * 3 * lt->pntsu * lt->pntsv * lt->pntsw, "latticedata");
+	fp = latticedata = MEM_mallocN(sizeof(float) * 3 * lt->pntsu * lt->pntsv * lt->pntsw, "latticedata");
 	
 	/* for example with a particle system: (ob == NULL) */
 	if (ob == NULL) {
 		/* in deformspace, calc matrix  */
-		invert_m4_m4(lt->latmat, oblatt->obmat);
+		invert_m4_m4(latmat, oblatt->obmat);
 	
 		/* back: put in deform array */
-		invert_m4_m4(imat, lt->latmat);
+		invert_m4_m4(imat, latmat);
 	}
 	else {
 		/* in deformspace, calc matrix */
 		invert_m4_m4(imat, oblatt->obmat);
-		mul_m4_m4m4(lt->latmat, imat, ob->obmat);
+		mul_m4_m4m4(latmat, imat, ob->obmat);
 	
 		/* back: put in deform array */
-		invert_m4_m4(imat, lt->latmat);
+		invert_m4_m4(imat, latmat);
 	}
 	
 	for (w = 0, fw = lt->fw; w < lt->pntsw; w++, fw += lt->dw) {
@@ -358,10 +367,18 @@
 			}
 		}
 	}
+
+	lattice_deform_data = MEM_mallocN(sizeof(LatticeDeformData), "Lattice Deform Data");
+	lattice_deform_data->latticedata = latticedata;
+	lattice_deform_data->object = oblatt;
+	copy_m4_m4(lattice_deform_data->latmat, latmat);
+
+	return lattice_deform_data;
 }
 
-void calc_latt_deform(Object *ob, float co[3], float weight)
+void calc_latt_deform(LatticeDeformData *lattice_deform_data, float co[3], float weight)
 {
+	Object *ob = lattice_deform_data->object;
 	Lattice *lt = ob->data;
 	float u, v, w, tu[4], tv[4], tw[4];
 	float vec[3];
@@ -375,7 +392,7 @@
 
 
 	if (lt->editlatt) lt = lt->editlatt->latt;
-	if (lt->latticedata == NULL) return;
+	if (lattice_deform_data->latticedata == NULL) return;
 
 	if (lt->vgroup[0] && dvert) {
 		defgrp_index = defgroup_name_index(ob, lt->vgroup);
@@ -383,7 +400,7 @@
 	}
 
 	/* co is in local coords, treat with latmat */
-	mul_v3_m4v3(vec, lt->latmat, co);
+	mul_v3_m4v3(vec, lattice_deform_data->latmat, co);
 
 	/* u v w coords */
 
@@ -456,7 +473,7 @@
 								idx_u = idx_v;
 							}
 
-							madd_v3_v3fl(co, &lt->latticedata[idx_u * 3], u);
+							madd_v3_v3fl(co, &lattice_deform_data->latticedata[idx_u * 3], u);
 
 							if (defgrp_index != -1)
 								weight_blend += (u * defvert_find_weight(dvert + idx_u, defgrp_index));
@@ -472,15 +489,12 @@
 
 }
 
-void end_latt_deform(Object *ob)
+void end_latt_deform(LatticeDeformData *lattice_deform_data)
 {
-	Lattice *lt = ob->data;
-	
-	if (lt->editlatt) lt = lt->editlatt->latt;
-	
-	if (lt->latticedata)
-		MEM_freeN(lt->latticedata);
-	lt->latticedata = NULL;
+	if (lattice_deform_data->latticedata)
+		MEM_freeN(lattice_deform_data->latticedata);
+
+	MEM_freeN(lattice_deform_data);
 }
 
 /* calculations is in local space of deformed object
@@ -815,13 +829,14 @@
 void lattice_deform_verts(Object *laOb, Object *target, DerivedMesh *dm,
                           float (*vertexCos)[3], int numVerts, const char *vgroup, float fac)
 {
+	LatticeDeformData *lattice_deform_data;
 	int a;
 	int use_vgroups;
 
 	if (laOb->type != OB_LATTICE)
 		return;
 
-	init_latt_deform(laOb, target);
+	lattice_deform_data = init_latt_deform(laOb, target);
 
 	/* check whether to use vertex groups (only possible if target is a Mesh)
 	 * we want either a Mesh with no derived data, or derived data with
@@ -855,16 +870,16 @@
 				weight = defvert_find_weight(dvert, defgrp_index);
 
 				if (weight > 0.0f)
-					calc_latt_deform(laOb, vertexCos[a], weight * fac);
+					calc_latt_deform(lattice_deform_data, vertexCos[a], weight * fac);
 			}
 		}
 	}
 	else {
 		for (a = 0; a < numVerts; a++) {
-			calc_latt_deform(laOb, vertexCos[a], fac);
+			calc_latt_deform(lattice_deform_data, vertexCos[a], fac);
 		}
 	}
-	end_latt_deform(laOb);
+	end_latt_deform(lattice_deform_data);
 }
 
 int object_deform_mball(Object *ob, ListBase *dispbase)

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c	2013-08-19 10:06:05 UTC (rev 59272)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c	2013-08-19 10:11:48 UTC (rev 59273)
@@ -221,12 +221,12 @@
 }
 #endif
 
-Object *psys_get_lattice(ParticleSimulationData *sim)
+struct LatticeDeformData *psys_create_lattice_deform_data(ParticleSimulationData *sim)
 {
-	Object *lattice = NULL;
-	
+	struct LatticeDeformData *lattice_deform_data = NULL;
+
 	if (psys_in_edit_mode(sim->scene, sim->psys) == 0) {
-
+		Object *lattice = NULL;
 		ModifierData *md = (ModifierData *)psys_get_modifier(sim->ob, sim->psys);
 
 		for (; md; md = md->next) {
@@ -237,10 +237,10 @@
 			}
 		}

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list