[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22245] branches/soc-2009-jaguarandi/ source/blender/render/intern: #define to store coordinates at VlakRen and not at VlakFace

André Pinto andresusanopinto at gmail.com
Wed Aug 5 17:50:57 CEST 2009


Revision: 22245
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22245
Author:   jaguarandi
Date:     2009-08-05 17:50:57 +0200 (Wed, 05 Aug 2009)

Log Message:
-----------
#define to store coordinates at VlakRen and not at VlakFace
adds some additional cost retrieving coords during ray-primitive tests, but reduces some memory usage (4*3floats per face)

Modified Paths:
--------------
    branches/soc-2009-jaguarandi/source/blender/render/intern/include/rayobject.h
    branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject.c
    branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_octree.c

Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/include/rayobject.h
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/include/rayobject.h	2009-08-05 15:29:45 UTC (rev 22244)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/include/rayobject.h	2009-08-05 15:50:57 UTC (rev 22245)
@@ -78,9 +78,9 @@
  */
 
 /* defines where coordinates of rayface primitives are stored */
-#define RE_RAYFACE_COORDS_LOCAL
+//#define RE_RAYFACE_COORDS_LOCAL
 //#define RE_RAYFACE_COORDS_POINTER
-//#define RE_RAYFACE_COORDS_VLAKREN
+#define RE_RAYFACE_COORDS_VLAKREN
  
 typedef struct RayFace
 {
@@ -105,13 +105,13 @@
 #elif defined(RE_RAYFACE_COORDS_POINTER)
 #	define RE_rayface_isQuad(a) ((a)->v4)
 #elif defined(RE_RAYFACE_COORDS_VLAKREN)
+#	define RE_rayface_isQuad(a) ((((VlakRen*)((a)->face))->v4) != NULL)
 #endif
 
 
 struct RayObject
 {
 	struct RayObjectAPI *api;
-	
 };
 
 

Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject.c
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject.c	2009-08-05 15:29:45 UTC (rev 22244)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject.c	2009-08-05 15:50:57 UTC (rev 22245)
@@ -163,6 +163,22 @@
 
 	RE_RC_COUNT(is->raycounter->faces.test);
 
+#ifdef RE_RAYFACE_COORDS_VLAKREN
+	{
+		VlakRen	*vlr = (VlakRen*)face->face;
+		VECCOPY(co1, vlr->v1->co);
+		VECCOPY(co2, vlr->v2->co);
+		if(vlr->v4)
+		{
+			VECCOPY(co3, vlr->v4->co);
+			VECCOPY(co4, vlr->v3->co);
+		}
+		else
+		{
+			VECCOPY(co3, vlr->v3->co);
+		}
+	}
+#else
 	VECCOPY(co1, face->v1);
 	VECCOPY(co2, face->v2);
 	if(RE_rayface_isQuad(face))
@@ -174,6 +190,7 @@
 	{
 		VECCOPY(co3, face->v3);
 	}
+#endif
 
 	t00= co3[0]-co1[0];
 	t01= co3[1]-co1[1];
@@ -414,10 +431,19 @@
 	if(RayObject_isRayFace(r))
 	{
 		RayFace *face = (RayFace*) RayObject_align(r);
+		
+#ifdef RE_RAYFACE_COORDS_VLAKREN
+		VlakRen *vlr = (VlakRen*)face->face;
+		DO_MINMAX( vlr->v1->co, min, max );
+		DO_MINMAX( vlr->v2->co, min, max );
+		DO_MINMAX( vlr->v3->co, min, max );
+		if(RE_rayface_isQuad(face)) DO_MINMAX( vlr->v4->co, min, max );
+#else
 		DO_MINMAX( face->v1, min, max );
 		DO_MINMAX( face->v2, min, max );
 		DO_MINMAX( face->v3, min, max );
 		if(RE_rayface_isQuad(face)) DO_MINMAX( face->v4, min, max );
+#endif
 	}
 	else if(RayObject_isRayAPI(r))
 	{

Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_octree.c
===================================================================
--- branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_octree.c	2009-08-05 15:29:45 UTC (rev 22244)
+++ branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_octree.c	2009-08-05 15:50:57 UTC (rev 22245)
@@ -489,11 +489,22 @@
 
 	ocres2= oc->ocres*oc->ocres;
 
+#ifdef RE_RAYFACE_COORDS_VLAKREN
+	{
+		VlakRen *vlr = (VlakRen*)face->face;
+		VECCOPY(co1, vlr->v1->co);
+		VECCOPY(co2, vlr->v2->co);
+		VECCOPY(co3, vlr->v3->co);
+		if(RE_rayface_isQuad(face))
+			VECCOPY(co4, vlr->v4->co);
+	}
+#else
 	VECCOPY(co1, face->v1);
 	VECCOPY(co2, face->v2);
 	VECCOPY(co3, face->v3);
 	if(face->v4)
 		VECCOPY(co4, face->v4);
+#endif
 
 	for(c=0;c<3;c++) {
 		rtf[0][c]= (co1[c]-oc->min[c])*ocfac[c] ;
@@ -502,7 +513,7 @@
 		rts[1][c]= (short)rtf[1][c];
 		rtf[2][c]= (co3[c]-oc->min[c])*ocfac[c] ;
 		rts[2][c]= (short)rtf[2][c];
-		if(face->v4) {
+		if(RE_rayface_isQuad(face)) {
 			rtf[3][c]= (co4[c]-oc->min[c])*ocfac[c] ;
 			rts[3][c]= (short)rtf[3][c];
 		}
@@ -512,7 +523,7 @@
 		oc1= rts[0][c];
 		oc2= rts[1][c];
 		oc3= rts[2][c];
-		if(face->v4==NULL) {
+		if(!RE_rayface_isQuad(face)) {
 			ocmin[c]= MIN3(oc1,oc2,oc3);
 			ocmax[c]= MAX3(oc1,oc2,oc3);
 		}
@@ -526,7 +537,7 @@
 	}
 	
 	if(ocmin[0]==ocmax[0] && ocmin[1]==ocmax[1] && ocmin[2]==ocmax[2]) {
-		ocwrite(oc, face, (face->v4 != NULL), ocmin[0], ocmin[1], ocmin[2], rtf);
+		ocwrite(oc, face, RE_rayface_isQuad(face), ocmin[0], ocmin[1], ocmin[2], rtf);
 	}
 	else {
 		
@@ -536,7 +547,7 @@
 		d2dda(oc, 1,2,0,1,ocface+ocres2,rts,rtf);
 		d2dda(oc, 1,2,0,2,ocface,rts,rtf);
 		d2dda(oc, 1,2,1,2,ocface+2*ocres2,rts,rtf);
-		if(face->v4==NULL) {
+		if(!RE_rayface_isQuad(face)) {
 			d2dda(oc, 2,0,0,1,ocface+ocres2,rts,rtf);
 			d2dda(oc, 2,0,0,2,ocface,rts,rtf);
 			d2dda(oc, 2,0,1,2,ocface+2*ocres2,rts,rtf);
@@ -565,7 +576,7 @@
 					for(z=ocmin[2];z<=ocmax[2];z++) {
 						if(ocface[b+z] && ocface[a+z]) {
 							if(face_in_node(NULL, x, y, z, rtf))
-								ocwrite(oc, face, (face->v4 != NULL), x,y,z, rtf);
+								ocwrite(oc, face, RE_rayface_isQuad(face), x,y,z, rtf);
 						}
 					}
 				}





More information about the Bf-blender-cvs mailing list