[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60772] trunk/blender/source/blender/ render/intern/source/convertblender.c: Fix duplicated key in ghash assert caused by object orco

Sergey Sharybin sergey.vfx at gmail.com
Tue Oct 15 11:08:08 CEST 2013


Revision: 60772
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60772
Author:   nazgul
Date:     2013-10-15 09:08:08 +0000 (Tue, 15 Oct 2013)
Log Message:
-----------
Fix duplicated key in ghash assert caused by object orco

Code was rather confusing, get_object_orco was only
checking for orco in cache for some objects and was
actually allocating orco for other objects.

Now made it so get_object_orco always only checks
the cache and only call set_object_orco if there's
no orco for it yet.

Modified Paths:
--------------
    trunk/blender/source/blender/render/intern/source/convertblender.c

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2013-10-15 08:44:13 UTC (rev 60771)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2013-10-15 09:08:08 UTC (rev 60772)
@@ -860,28 +860,13 @@
 /* Orco hash and Materials                                                   */
 /* ------------------------------------------------------------------------- */
 
-static float *get_object_orco(Render *re, Object *ob)
+static float *get_object_orco(Render *re, void *ob)
 {
-	float *orco;
-
-	if (!re->orco_hash)
-		re->orco_hash = BLI_ghash_ptr_new("get_object_orco gh");
-
-	orco = BLI_ghash_lookup(re->orco_hash, ob);
-
-	if (!orco) {
-		if (ELEM(ob->type, OB_CURVE, OB_FONT)) {
-			orco = BKE_curve_make_orco(re->scene, ob, NULL);
-		}
-		else if (ob->type==OB_SURF) {
-			orco = BKE_curve_surf_make_orco(ob);
-		}
-
-		if (orco)
-			BLI_ghash_insert(re->orco_hash, ob, orco);
+	if (!re->orco_hash) {
+		return NULL;
 	}
 
-	return orco;
+	return BLI_ghash_lookup(re->orco_hash, ob);
 }
 
 static void set_object_orco(Render *re, void *ob, float *orco)
@@ -1676,8 +1661,11 @@
 
 		if (path_nbr) {
 			if (!ELEM(ma->material_type, MA_TYPE_HALO, MA_TYPE_WIRE)) {
-				sd.orco = MEM_mallocN(3*sizeof(float)*(totpart+totchild), "particle orcos");
-				set_object_orco(re, psys, sd.orco);
+				sd.orco = get_object_orco(re, psys);
+				if (!sd.orco) {
+					sd.orco = MEM_mallocN(3*sizeof(float)*(totpart+totchild), "particle orcos");
+					set_object_orco(re, psys, sd.orco);
+				}
 			}
 		}
 
@@ -2829,9 +2817,12 @@
 
 	if (dm) {
 		if (need_orco) {
-			orco= BKE_displist_make_orco(re->scene, ob, dm, 1, 1);
-			if (orco) {
-				set_object_orco(re, ob, orco);
+			orco = get_object_orco(re, ob);
+			if (!orco) {
+				orco= BKE_displist_make_orco(re->scene, ob, dm, 1, 1);
+				if (orco) {
+					set_object_orco(re, ob, orco);
+				}
 			}
 		}
 
@@ -2840,7 +2831,11 @@
 	}
 	else {
 		if (need_orco) {
-			orco= get_object_orco(re, ob);
+			orco = get_object_orco(re, ob);
+			if (!orco) {
+				orco = BKE_curve_surf_make_orco(ob);
+				set_object_orco(re, ob, orco);
+			}
 		}
 
 		/* walk along displaylist and create rendervertices/-faces */
@@ -2900,9 +2895,12 @@
 
 	if (dm) {
 		if (need_orco) {
-			orco= BKE_displist_make_orco(re->scene, ob, dm, 1, 1);
-			if (orco) {
-				set_object_orco(re, ob, orco);
+			orco = get_object_orco(re, ob);
+			if (!orco) {
+				orco = BKE_displist_make_orco(re->scene, ob, dm, 1, 1);
+				if (orco) {
+					set_object_orco(re, ob, orco);
+				}
 			}
 		}
 
@@ -2912,6 +2910,10 @@
 	else {
 		if (need_orco) {
 			orco = get_object_orco(re, ob);
+			if (!orco) {
+				orco = BKE_curve_make_orco(re->scene, ob, NULL);
+				set_object_orco(re, ob, orco);
+			}
 		}
 
 		while (dl) {
@@ -3401,10 +3403,13 @@
 	if (dm==NULL) return;	/* in case duplicated object fails? */
 
 	if (mask & CD_MASK_ORCO) {
-		orco= dm->getVertDataArray(dm, CD_ORCO);
-		if (orco) {
-			orco= MEM_dupallocN(orco);
-			set_object_orco(re, ob, orco);
+		orco = get_object_orco(re, ob);
+		if (!orco) {
+			orco= dm->getVertDataArray(dm, CD_ORCO);
+			if (orco) {
+				orco= MEM_dupallocN(orco);
+				set_object_orco(re, ob, orco);
+			}
 		}
 	}
 




More information about the Bf-blender-cvs mailing list