[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59267] trunk/blender: Made curves almost thread-safe

Sergey Sharybin sergey.vfx at gmail.com
Mon Aug 19 11:36:41 CEST 2013


Revision: 59267
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59267
Author:   nazgul
Date:     2013-08-19 09:36:40 +0000 (Mon, 19 Aug 2013)
Log Message:
-----------
Made curves almost thread-safe

Now modifier stack wouldn't modify original curve's nurbs
and will operate on a copy of nurbs.

This makes it possible to process curve object update with
shared curve datablocks from multiple threads. There's no
big overhead for creating a copy of nurbs comparing to old
behavior which was allocating original vertex array and
apply coordinates on curve after all modifier are applied.

The only remained issue with curves is curve's bounding box
and texture space. It's not thread-safe, but it wouldn't
lead to crashes -- it just could lead to either memory
leak or wrong texture coordinates due to difference in
modifiers stacks of objects which shares the same curve.

--
svn merge -r57959:57961 ^/branches/soc-2013-depsgraph_mt

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

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_anim.h
    trunk/blender/source/blender/blenkernel/BKE_curve.h
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/blenkernel/intern/mesh.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-57959
/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
/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_anim.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_anim.h	2013-08-19 09:29:51 UTC (rev 59266)
+++ trunk/blender/source/blender/blenkernel/BKE_anim.h	2013-08-19 09:36:40 UTC (rev 59267)
@@ -59,7 +59,7 @@
 /* Curve Paths */
 
 void free_path(struct Path *path);
-void calc_curvepath(struct Object *ob);
+void calc_curvepath(struct Object *ob, struct ListBase *nurbs);
 int where_on_path(struct Object *ob, float ctime, float vec[4], float dir[3], float quat[4], float *radius, float *weight);
 
 /* ---------------------------------------------------- */

Modified: trunk/blender/source/blender/blenkernel/BKE_curve.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_curve.h	2013-08-19 09:29:51 UTC (rev 59266)
+++ trunk/blender/source/blender/blenkernel/BKE_curve.h	2013-08-19 09:36:40 UTC (rev 59267)
@@ -94,7 +94,7 @@
 float *BKE_curve_make_orco(struct Scene *scene, struct Object *ob, int *r_numVerts);
 float *BKE_curve_surf_make_orco(struct Object *ob);
 
-void BKE_curve_bevelList_make(struct Object *ob);
+void BKE_curve_bevelList_make(struct Object *ob, struct ListBase *nurbs, bool for_render);
 void BKE_curve_bevel_make(struct Scene *scene, struct Object *ob,  struct ListBase *disp, int forRender, int renderResolution);
 
 void BKE_curve_forward_diff_bezier(float q0, float q1, float q2, float q3, float *p, int it, int stride);

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c	2013-08-19 09:29:51 UTC (rev 59266)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c	2013-08-19 09:36:40 UTC (rev 59267)
@@ -488,7 +488,7 @@
 /* calculate a curve-deform path for a curve 
  *  - only called from displist.c -> do_makeDispListCurveTypes
  */
-void calc_curvepath(Object *ob)
+void calc_curvepath(Object *ob, ListBase *nurbs)
 {
 	BevList *bl;
 	BevPoint *bevp, *bevpn, *bevpfirst, *bevplast;
@@ -499,7 +499,6 @@
 	float *fp, *dist, *maxdist, xyz[3];
 	float fac, d = 0, fac1, fac2;
 	int a, tot, cycl = 0;
-	ListBase *nurbs;
 	
 	/* in a path vertices are with equal differences: path->len = number of verts */
 	/* NOW WITH BEVELCURVE!!! */
@@ -518,7 +517,6 @@
 		return;
 	}
 
-	nurbs = BKE_curve_nurbs_get(cu);
 	nu = nurbs->first;
 
 	ob->curve_cache->path = path = MEM_callocN(sizeof(Path), "calc_curvepath");

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2013-08-19 09:29:51 UTC (rev 59266)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2013-08-19 09:36:40 UTC (rev 59267)
@@ -1814,7 +1814,7 @@
 
 DerivedMesh *CDDM_from_curve(Object *ob)
 {
-	ListBase disp = {NULL};
+	ListBase disp = {NULL, NULL};
 
 	if (ob->curve_cache) {
 		disp = ob->curve_cache->disp;

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2013-08-19 09:29:51 UTC (rev 59266)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2013-08-19 09:36:40 UTC (rev 59267)
@@ -2417,7 +2417,7 @@
 	}
 }
 
-void BKE_curve_bevelList_make(Object *ob)
+void BKE_curve_bevelList_make(Object *ob, ListBase *nurbs, bool for_render)
 {
 	/*
 	 * - convert all curves to polys, with indication of resol and flags for double-vertices
@@ -2449,14 +2449,10 @@
 	/* STEP 1: MAKE POLYS  */
 
 	BLI_freelistN(&(ob->curve_cache->bev));
+	nu = nurbs->first;
 	if (cu->editnurb && ob->type != OB_FONT) {
-		ListBase *nurbs = BKE_curve_editNurbs_get(cu);
-		nu = nurbs->first;
 		is_editmode = 1;
 	}
-	else {
-		nu = cu->nurb.first;
-	}
 
 	for (; nu; nu = nu->next) {
 		
@@ -2477,7 +2473,7 @@
 			bl->charidx = nu->charidx;
 		}
 		else {
-			if (G.is_rendering && cu->resolu_ren != 0)
+			if (for_render && cu->resolu_ren != 0)
 				resolu = cu->resolu_ren;
 			else
 				resolu = nu->resolu;

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2013-08-19 09:29:51 UTC (rev 59266)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2013-08-19 09:36:40 UTC (rev 59267)
@@ -786,19 +786,16 @@
 	return pretessellatePoint;
 }
 
-static void curve_calc_modifiers_pre(Scene *scene, Object *ob, int forRender, int renderResolution,
-                                     float (**originalVerts_r)[3],
-                                     float (**deformedVerts_r)[3], int *numVerts_r)
+static void curve_calc_modifiers_pre(Scene *scene, Object *ob, ListBase *nurb,
+                                     int forRender, int renderResolution)
 {
 	VirtualModifierData virtualModifierData;
 	ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
 	ModifierData *pretessellatePoint;
 	Curve *cu = ob->data;
-	ListBase *nurb = BKE_curve_nurbs_get(cu);
 	int numVerts = 0;
 	const int editmode = (!forRender && (cu->editnurb || cu->editfont));
 	ModifierApplyFlag app_flag = 0;
-	float (*originalVerts)[3] = NULL;
 	float (*deformedVerts)[3] = NULL;
 	float *keyVerts = NULL;
 	int required_mode;
@@ -826,7 +823,6 @@
 			 * this is also the reason curves do not use a virtual
 			 * shape key modifier yet. */
 			deformedVerts = BKE_curve_nurbs_keyVertexCos_get(nurb, keyVerts);
-			originalVerts = MEM_dupallocN(deformedVerts);
 			BLI_assert(BKE_nurbList_verts_count(nurb) == numVerts);
 		}
 	}
@@ -844,7 +840,6 @@
 
 			if (!deformedVerts) {
 				deformedVerts = BKE_curve_nurbs_vertexCos_get(nurb, &numVerts);
-				originalVerts = MEM_dupallocN(deformedVerts);
 			}
 
 			mti->deformVerts(md, ob, NULL, deformedVerts, numVerts, app_flag);
@@ -854,17 +849,15 @@
 		}
 	}
 
-	if (deformedVerts)
+	if (deformedVerts) {
 		BK_curve_nurbs_vertexCos_apply(nurb, deformedVerts);
+		MEM_freeN(deformedVerts);
+	}
 	if (keyVerts) /* these are not passed through modifier stack */
 		BKE_curve_nurbs_keyVertexTilts_apply(nurb, keyVerts);
 
 	if (keyVerts)
 		MEM_freeN(keyVerts);
-
-	*originalVerts_r = originalVerts;
-	*deformedVerts_r = deformedVerts;
-	*numVerts_r = numVerts;
 }
 
 static float (*displist_get_allverts(ListBase *dispbase, int *totvert))[3]
@@ -901,15 +894,14 @@
 	}
 }
 
-static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *dispbase, DerivedMesh **derivedFinal,
-                                      int forRender, int renderResolution,
-                                      float (*originalVerts)[3], float (*deformedVerts)[3])
+static void curve_calc_modifiers_post(Scene *scene, Object *ob, ListBase *nurb,
+                                      ListBase *dispbase, DerivedMesh **derivedFinal,
+                                      int forRender, int renderResolution)
 {
 	VirtualModifierData virtualModifierData;
 	ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
 	ModifierData *pretessellatePoint;
 	Curve *cu = ob->data;
-	ListBase *nurb = BKE_curve_nurbs_get(cu);
 	int required_mode = 0, totvert = 0;
 	int editmode = (!forRender && (cu->editnurb || cu->editfont));
 	DerivedMesh *dm = NULL, *ndm;
@@ -1054,12 +1046,6 @@
 		}
 		(*derivedFinal) = dm;
 	}
-
-	if (deformedVerts) {
-		BK_curve_nurbs_vertexCos_apply(nurb, originalVerts);
-		MEM_freeN(originalVerts);
-		MEM_freeN(deformedVerts);
-	}
 }
 
 static void displist_surf_indices(DispList *dl)
@@ -1209,25 +1195,24 @@
 void BKE_displist_make_surf(Scene *scene, Object *ob, ListBase *dispbase,
                             DerivedMesh **derivedFinal, int forRender, int forOrco, int renderResolution)
 {
-	ListBase *nubase;
+	ListBase nubase = {NULL, NULL};
 	Nurb *nu;
 	Curve *cu = ob->data;
 	DispList *dl;
 	float *data;
 	int len;
-	int numVerts;
-	float (*originalVerts)[3];
-	float (*deformedVerts)[3];
 
-	if (!forRender && cu->editnurb)
-		nubase = BKE_curve_editNurbs_get(cu);
-	else
-		nubase = &cu->nurb;
+	if (!forRender && cu->editnurb) {
+		BKE_nurbList_duplicate(&nubase, BKE_curve_editNurbs_get(cu));
+	}
+	else {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list