[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12283] branches/qdune/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Oct 18 18:35:49 CEST 2007


Revision: 12283
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12283
Author:   blendix
Date:     2007-10-18 18:35:49 +0200 (Thu, 18 Oct 2007)

Log Message:
-----------

QDune Branch
============

Stress and sticky support for polygons, tanget shading for curves.

Fix an msvc error compile error with log().

Modified Paths:
--------------
    branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp
    branches/qdune/blender/extern/qdune/core/RenderBucket.cpp
    branches/qdune/blender/extern/qdune/ribparse/ri.h
    branches/qdune/blender/source/blender/blenkernel/intern/customdata.c
    branches/qdune/blender/source/blender/makesdna/DNA_customdata_types.h
    branches/qdune/blender/source/blender/render/intern/include/renderinterface.h
    branches/qdune/blender/source/blender/render/intern/source/blenderinterface.c
    branches/qdune/blender/source/blender/render/intern/source/convertblender.c
    branches/qdune/blender/source/blender/render/intern/source/pipeline.c
    branches/qdune/blender/source/blender/render/intern/source/qdinterface.c
    branches/qdune/blender/source/blender/render/intern/source/shadeinput.c

Modified: branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp
===================================================================
--- branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp	2007-10-18 13:51:10 UTC (rev 12282)
+++ branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp	2007-10-18 16:35:49 UTC (rev 12283)
@@ -39,6 +39,7 @@
 	RtNormal nor;
 	RtVector *orco = NULL, *orcodu = NULL, *orcodv = NULL;
 	RtVector *win = NULL, *windu = NULL, *windv = NULL;
+	RtVector *sticky = NULL, *stickydu = NULL, *stickydv = NULL;
 	RtFloat *stress = NULL;
 	RtVector *uv[8], *uvdu[8], *uvdv[8];
 	float du, dv;
@@ -47,9 +48,13 @@
 	ShadeInput shi;
 	ShadeResult shr;
 
-	blenderShadeInit(BLENDER_THREAD, &shi, &shr, blender_object);
 	mat = (Material*)blender_material[0];
+
 	n = grid->get_nverts();
+	du = grid->get_du();
+	dv = grid->get_dv();
+	xdim = grid->get_xdim();
+	ydim = grid->get_ydim();
 
 	P = (RtPoint*)grid->findVariable("P");
 	N = (RtNormal*)grid->findVariable("N");
@@ -60,6 +65,9 @@
 	dPdu = (RtVector*)grid->findVariable("dPdu");
 	dPdv = (RtVector*)grid->findVariable("dPdv");
 
+	blenderShadeInit(BLENDER_THREAD, &shi, &shr, blender_object,
+		(xdim==0 && (mat->mode & MA_TANGENT_STR)));
+
 	/* shade_input_set_triangle_i */
 	shi.mat= shi.mat_override? shi.mat_override: mat;
 	shi.osatex= (shi.mat->texco & TEXCO_OSA);
@@ -72,11 +80,6 @@
 	if(shi.passflag & SCE_PASS_UV)
 		texco |= (NEED_UV|TEXCO_UV);
 
-	du = grid->get_du();
-	dv = grid->get_dv();
-	xdim = grid->get_xdim();
-	ydim = grid->get_ydim();
-
 	/* get texture coordinate variables */
 	if(texco & TEXCO_ORCO) {
 		orco = (float(*)[3])grid->findVariable("orco");
@@ -110,6 +113,7 @@
 			}
 		}
 	}
+
 	if(texco & TEXCO_STRESS)
 		stress = (float*)grid->findVariable("stress");
 
@@ -146,10 +150,25 @@
 		}
 	}
 
+	if(texco & TEXCO_STICKY) {
+		sticky = (float(*)[3])grid->findVariable("sticky");
+		if(shi.osatex && sticky) {
+			stickydu = new RtVector[n];
+			stickydv = new RtVector[n];
+
+			grid->DuV(stickydu, sticky);
+			grid->DvV(stickydv, sticky);
+		}
+	}
+
 	/* loop over each micropolygon grid vertex */
 	for (i=0; i<n; i++) {
 		/* shadeinput_set_normals */
-		vnormalize(nor, N[i]);
+		if(xdim==0 && mode & MA_TANGENT_STR)
+			vnormalize(nor, dPdv[i]);
+		else
+			vnormalize(nor, N[i]);
+
 		nor[0]= -nor[0];
 		nor[1]= -nor[1];
 		nor[2]= nor[2];
@@ -190,6 +209,10 @@
 		shi.vno[1]= shi.vn[1];
 		shi.vno[2]= shi.vn[2];
 
+		/* tangent */
+		if(mode & (MA_TANGENT_V|MA_NORMAP_TANG))
+			vnormalize(shi.tang, dPdv[i]);
+
 		/* texture coordinates */
 		if((texco & TEXCO_ORCO) && orco) {
 			shi.lo[0]= orco[i][0];
@@ -305,6 +328,22 @@
 			}
 		}
 
+		/* sticky */
+		if(texco & TEXCO_STICKY && sticky) {
+			/* TODO this is wrong, not view corrected at all now */
+			shi.sticky[0]= sticky[i][0];
+			shi.sticky[1]= sticky[i][1];
+
+#if 0
+			if(shi.osatex) {
+				shi.dxsticky[0]= stickydu[i][0];
+				shi.dxsticky[1]= stickydu[i][1];
+				shi.dysticky[0]= stickydv[i][0];
+				shi.dysticky[1]= stickydv[i][1];
+			}
+#endif
+		}
+
 		/* run the actual shader */
 		if(displacement) {
 			RtVector displacement;
@@ -338,6 +377,8 @@
 	if(win) delete [] win;
 	if(windu) delete [] windu;
 	if(windv) delete [] windv;
+	if(stickydu) delete [] stickydu;
+	if(stickydv) delete [] stickydv;
 
 	for(a=0; a<8; a++) {
 		if(uvdu[a]) {

Modified: branches/qdune/blender/extern/qdune/core/RenderBucket.cpp
===================================================================
--- branches/qdune/blender/extern/qdune/core/RenderBucket.cpp	2007-10-18 13:51:10 UTC (rev 12282)
+++ branches/qdune/blender/extern/qdune/core/RenderBucket.cpp	2007-10-18 16:35:49 UTC (rev 12283)
@@ -167,7 +167,7 @@
 		hilbert(buckets, 1, init_angle, level);
 	}
 	else { // peano
-		const int level = int(1 + log(MAX2(bk_maxX, bk_maxY))/log(3));
+		const int level = int(1 + log((float)MAX2(bk_maxX, bk_maxY))/log(3.0f));
 		peano(buckets, -1, init_angle, level);
 	}
 }

Modified: branches/qdune/blender/extern/qdune/ribparse/ri.h
===================================================================
--- branches/qdune/blender/extern/qdune/ribparse/ri.h	2007-10-18 13:51:10 UTC (rev 12282)
+++ branches/qdune/blender/extern/qdune/ribparse/ri.h	2007-10-18 16:35:49 UTC (rev 12283)
@@ -464,7 +464,7 @@
 typedef RtInt (*RtBlenderTestBreak)(RtBlenderThread*);
 
 typedef RtVoid* (*RtBlenderShadeInit)(RtBlenderThread*,
-	RtBlenderShadeInput*, RtBlenderShadeResult*, RtVoid*);
+	RtBlenderShadeInput*, RtBlenderShadeResult*, RtVoid*, RtInt);
 
 typedef RtVoid (*RtBlenderShade)(RtBlenderThread*,
 	RtBlenderShadeInput*, RtBlenderShadeResult*);

Modified: branches/qdune/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/qdune/blender/source/blender/blenkernel/intern/customdata.c	2007-10-18 13:51:10 UTC (rev 12282)
+++ branches/qdune/blender/source/blender/blenkernel/intern/customdata.c	2007-10-18 16:35:49 UTC (rev 12283)
@@ -371,11 +371,13 @@
 	{sizeof(MIntProperty), "MIntProperty",1,"Int",NULL,NULL,NULL,NULL},
 	{sizeof(MStringProperty), "MStringProperty",1,"String",NULL,NULL,NULL,NULL},
 	{sizeof(float)*3, "", 0, "", NULL, NULL, NULL, NULL},
+	{sizeof(float)*2, "", 0, "", NULL, NULL, NULL, NULL},
 };
 
 const char *LAYERTYPENAMES[CD_NUMTYPES] = {
 	"CDMVert", "CDMSticky", "CDMDeformVert", "CDMEdge", "CDMFace", "CDMTFace",
-	"CDMCol", "CDOrigIndex", "CDNormal", "CDFlags","CDMFloatProperty","CDMIntProperty","CDMStringProperty", "CDOrco"};
+	"CDMCol", "CDOrigIndex", "CDNormal", "CDFlags","CDMFloatProperty",
+	"CDMIntProperty","CDMStringProperty", "CDOrco", "CDStress"};
 
 const CustomDataMask CD_MASK_BAREMESH =
 	CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE;

Modified: branches/qdune/blender/source/blender/makesdna/DNA_customdata_types.h
===================================================================
--- branches/qdune/blender/source/blender/makesdna/DNA_customdata_types.h	2007-10-18 13:51:10 UTC (rev 12282)
+++ branches/qdune/blender/source/blender/makesdna/DNA_customdata_types.h	2007-10-18 16:35:49 UTC (rev 12283)
@@ -68,7 +68,8 @@
 #define CD_PROP_INT		11
 #define CD_PROP_STR		12
 #define CD_ORCO			13
-#define CD_NUMTYPES		14
+#define CD_STRESS		14
+#define CD_NUMTYPES		15
 
 /* Bits for CustomDataMask */
 #define CD_MASK_MVERT		(1 << CD_MVERT)
@@ -84,6 +85,8 @@
 #define CD_MASK_PROP_FLT	(1 << CD_PROP_FLT)
 #define CD_MASK_PROP_INT	(1 << CD_PROP_INT)
 #define CD_MASK_PROP_STR	(1 << CD_PROP_STR)
+#define CD_MASK_ORCO		(1 << CD_ORCO)
+#define CD_MASK_STRESS		(1 << CD_STRESS)
 
 
 /* CustomData.flag */

Modified: branches/qdune/blender/source/blender/render/intern/include/renderinterface.h
===================================================================
--- branches/qdune/blender/source/blender/render/intern/include/renderinterface.h	2007-10-18 13:51:10 UTC (rev 12282)
+++ branches/qdune/blender/source/blender/render/intern/include/renderinterface.h	2007-10-18 16:35:49 UTC (rev 12283)
@@ -58,9 +58,6 @@
 	float autosmooth_threshold;	/* threshold */
 
 	int do_subsurf;				/* do subsurf for micropolygons */
-
-	float texspace_loc[3];		/* texture space */
-	float texspace_size[3];
 } RenderMesh;
 
 typedef struct RenderVertex {
@@ -68,6 +65,7 @@
 	float n[3];					/* optional normal (see mesh comments above) */
 	float *sticky;				/* sticky texture coordinates */
 	float *orco;				/* orco texture coordinates */
+	float *stress;				/* stress texture coordinates */
 } RenderVertex;
 
 typedef struct RenderFaceData {
@@ -172,7 +170,8 @@
 int render_interface_test_break(RenderThread *thread);
 
 void render_interface_shade_init(RenderThread *thread,
-	struct ShadeInput *shi, struct ShadeResult *shr, struct ObjectRen *obr);
+	struct ShadeInput *shi, struct ShadeResult *shr, struct ObjectRen *obr,
+	int tangent);
 
 void render_interface_shade(RenderThread *thread,
 	struct ShadeInput *shi, struct ShadeResult *shr);

Modified: branches/qdune/blender/source/blender/render/intern/source/blenderinterface.c
===================================================================
--- branches/qdune/blender/source/blender/render/intern/source/blenderinterface.c	2007-10-18 13:51:10 UTC (rev 12282)
+++ branches/qdune/blender/source/blender/render/intern/source/blenderinterface.c	2007-10-18 16:35:49 UTC (rev 12283)
@@ -39,78 +39,6 @@
 	return 0;
 }
 
-/* ------------------------------------------------------------------------- */
-
-static void calc_edge_stress_add(float *accum, VertRen *v1, VertRen *v2)
-{
-	float len= VecLenf(v1->co, v2->co)/VecLenf(v1->orco, v2->orco);
-	float *acc;
-	
-	acc= accum + 2*v1->index;
-	acc[0]+= len;
-	acc[1]+= 1.0f;
-	
-	acc= accum + 2*v2->index;
-	acc[0]+= len;
-	acc[1]+= 1.0f;
-}
-
-static void calc_edge_stress(Render *re, float *loc, float *size, int startvert, int startface)
-{
-	float *accum, *acc, *accumoffs, *stress;
-	int a;
-	
-	if(startvert==re->totvert) return;
-	
-	accum= MEM_callocN(2*sizeof(float)*(re->totvert-startvert), "temp accum for stress");
-	
-	/* de-normalize orco */
-	for(a=startvert; a<re->totvert; a++) {
-		VertRen *ver= RE_findOrAddVert(re, a);
-		if(ver->orco) {
-			ver->orco[0]= ver->orco[0]*size[0] +loc[0];
-			ver->orco[1]= ver->orco[1]*size[1] +loc[1];
-			ver->orco[2]= ver->orco[2]*size[2] +loc[2];
-		}
-	}
-	
-	/* add stress values */
-	accumoffs= accum - 2*startvert;	/* so we can use vertex index */
-	for(a=startface; a<re->totvlak; a++) {
-		VlakRen *vlr= RE_findOrAddVlak(re, a);
-
-		if(vlr->v1->orco && vlr->v4) {
-			calc_edge_stress_add(accumoffs, vlr->v1, vlr->v2);
-			calc_edge_stress_add(accumoffs, vlr->v2, vlr->v3);
-			calc_edge_stress_add(accumoffs, vlr->v3, vlr->v1);
-			if(vlr->v4) {
-				calc_edge_stress_add(accumoffs, vlr->v3, vlr->v4);
-				calc_edge_stress_add(accumoffs, vlr->v4, vlr->v1);
-				calc_edge_stress_add(accumoffs, vlr->v2, vlr->v4);
-			}
-		}
-	}
-	
-	for(a=startvert; a<re->totvert; a++) {
-		VertRen *ver= RE_findOrAddVert(re, a);
-		if(ver->orco) {
-			/* find stress value */
-			acc= accumoffs + 2*ver->index;
-			if(acc[1]!=0.0f)
-				acc[0]/= acc[1];
-			stress= RE_vertren_get_stress(re, ver, 1);
-			*stress= *acc;
-			
-			/* restore orcos */
-			ver->orco[0] = (ver->orco[0]-loc[0])/size[0];
-			ver->orco[1] = (ver->orco[1]-loc[1])/size[1];
-			ver->orco[2] = (ver->orco[2]-loc[2])/size[2];
-		}
-	}
-	
-	MEM_freeN(accum);
-}
-
 /* gets tangent from tface or orco */
 static void calc_tangent_vector(Render *re, VlakRen *vlr)
 {
@@ -1024,7 +952,7 @@
 	RenderMesh *mesh= bcontext->mesh;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list