[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24269] trunk/blender/source/blender/ render/intern/source/pointdensity.c: Fix [#19759] Point Density Texture

Matt Ebb matt at mke3.net
Tue Nov 3 07:04:43 CET 2009


Revision: 24269
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24269
Author:   broken
Date:     2009-11-03 07:04:42 +0100 (Tue, 03 Nov 2009)

Log Message:
-----------
Fix [#19759] Point Density Texture

Use derivedmesh functions to get object vertices, rather than objectren verts (which can not exist if object is non-renderable)

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

Modified: trunk/blender/source/blender/render/intern/source/pointdensity.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pointdensity.c	2009-11-03 05:47:59 UTC (rev 24268)
+++ trunk/blender/source/blender/render/intern/source/pointdensity.c	2009-11-03 06:04:42 UTC (rev 24269)
@@ -41,6 +41,7 @@
 #include "BKE_particle.h"
 #include "BKE_texture.h"
 
+#include "DNA_meshdata_types.h"
 #include "DNA_texture_types.h"
 #include "DNA_particle_types.h"
 
@@ -184,38 +185,44 @@
 }
 
 
-static void pointdensity_cache_object(Render *re, PointDensity *pd, ObjectRen *obr)
+static void pointdensity_cache_object(Render *re, PointDensity *pd, Object *ob)
 {
 	int i;
+	DerivedMesh *dm;
+	MVert *mvert = NULL;
+	float cam_mat[4][4];
 	
-	if (!obr || !pd) return;
-	if(!obr->vertnodes) return;
+	dm = mesh_create_derived_render(re->scene, ob,	CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL);
+	mvert= dm->getVertArray(dm);	/* local object space */
 	
-	/* in case ob->imat isn't up-to-date */
-	Mat4Invert(obr->ob->imat, obr->ob->obmat);
+	pd->totpoints= dm->getNumVerts(dm);
+	if (pd->totpoints == 0) return;
+
+	pd->point_tree = BLI_bvhtree_new(pd->totpoints, 0.0, 4, 6);
 	
-	pd->point_tree = BLI_bvhtree_new(obr->totvert, 0.0, 4, 6);
-	pd->totpoints = obr->totvert;
-	
-	for(i=0; i<obr->totvert; i++) {
-		float ver_co[3];
-		VertRen *ver= RE_findOrAddVert(obr, i);
+	for(i=0; i < pd->totpoints; i++, mvert++) {
+		float co[3];
 		
-		VECCOPY(ver_co, ver->co);
-		Mat4MulVecfl(re->viewinv, ver_co);
-		
-		if (pd->ob_cache_space == TEX_PD_OBJECTSPACE) {
-			Mat4MulVecfl(obr->ob->imat, ver_co);
-		} else if (pd->psys_cache_space == TEX_PD_OBJECTLOC) {
-			VecSubf(ver_co, ver_co, obr->ob->loc);
-		} else {
-			/* TEX_PD_WORLDSPACE */
+		VECCOPY(co, mvert->co);
+
+		switch(pd->ob_cache_space) {
+			case TEX_PD_OBJECTSPACE:
+				break;
+			case TEX_PD_OBJECTLOC:
+				Mat4MulVecfl(ob->obmat, co);
+				VecSubf(co, co, ob->loc);
+				break;
+			case TEX_PD_WORLDSPACE:
+			default:
+				Mat4MulVecfl(ob->obmat, co);
+				break;
 		}
-		
-		BLI_bvhtree_insert(pd->point_tree, i, ver_co, 1);
+
+		BLI_bvhtree_insert(pd->point_tree, i, co, 1);
 	}
 	
 	BLI_bvhtree_balance(pd->point_tree);
+	dm->release(dm);
 
 }
 static void cache_pointdensity(Render *re, Tex *tex)
@@ -237,19 +244,7 @@
 	}
 	else if (pd->source == TEX_PD_OBJECT) {
 		Object *ob = pd->object;
-		ObjectRen *obr;
-		int found=0;
-
-		/* find the obren that corresponds to the object */
-		for (obr=re->objecttable.first; obr; obr=obr->next) {
-			if (obr->ob == ob) {
-				found=1;
-				break;
-			}
-		}
-		if (!found) return;
-		
-		pointdensity_cache_object(re, pd, obr);
+		if (ob)	pointdensity_cache_object(re, pd, ob);
 	}
 }
 





More information about the Bf-blender-cvs mailing list