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

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Oct 18 15:03:21 CEST 2007


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

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

QDune branch
============

More texture coordinate support for polygons (not all for subsurf yet):
orco, refl, nor, win, glob, UV.

In QDune, changed "facevarying" in pointspolygon to use nverts values
per face instead of one value per vertex like "vertex" and "varying".

Bugfix for blender internal in calculation of derivatives for glob
coordinates.

Modified Paths:
--------------
    branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp
    branches/qdune/blender/extern/qdune/primitives/Patches.cpp
    branches/qdune/blender/extern/qdune/primitives/Patches.h
    branches/qdune/blender/extern/qdune/primitives/Polygons.cpp
    branches/qdune/blender/extern/qdune/ribparse/ri.h
    branches/qdune/blender/source/blender/render/intern/include/render_types.h
    branches/qdune/blender/source/blender/render/intern/include/renderdatabase.h
    branches/qdune/blender/source/blender/render/intern/include/renderinterface.h
    branches/qdune/blender/source/blender/render/intern/source/convertblender.c
    branches/qdune/blender/source/blender/render/intern/source/envmap.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/renderdatabase.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 12:35:58 UTC (rev 12279)
+++ branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp	2007-10-18 13:03:20 UTC (rev 12280)
@@ -1,7 +1,9 @@
 
 #include "BlenderShader.h"
+#include "Camera.h"
 #include "MicroPolygonGrid.h"
 #include "Mathutil.h"
+#include "State.h"
 
 /* blender includes for structs only, no function calls */
 extern "C" {
@@ -29,31 +31,26 @@
 {
 	Material *mat;
 	RtPoint *P;
-	RtVector *I;
+	RtVector *I, *Idu = NULL, *Idv = NULL;
 	RtVector *dPdu = NULL, *dPdv = NULL;
 	RtNormal *N;
 	RtColor *Ci;
 	RtColor *Oi;
 	RtNormal nor;
 	RtVector *orco = NULL, *orcodu = NULL, *orcodv = NULL;
+	RtVector *win = NULL, *windu = NULL, *windv = NULL;
 	RtFloat *stress = NULL;
 	RtVector *uv[8], *uvdu[8], *uvdv[8];
 	float du, dv;
 	char uvtoken[128];
-	int a, i, n, texco;
+	int a, i, n, texco, mode, xdim, ydim;
 	ShadeInput shi;
 	ShadeResult shr;
 
-	blenderShadeInit(BLENDER_THREAD, &shi, &shr);
+	blenderShadeInit(BLENDER_THREAD, &shi, &shr, blender_object);
 	mat = (Material*)blender_material[0];
 	n = grid->get_nverts();
 
-	texco= mat->texco;
-
-	/* pass option forces UV calc */
-	if(shi.passflag & SCE_PASS_UV)
-		texco |= (NEED_UV|TEXCO_UV);
-
 	P = (RtPoint*)grid->findVariable("P");
 	N = (RtNormal*)grid->findVariable("N");
 	I = (RtVector*)grid->findVariable("I");
@@ -66,10 +63,19 @@
 	/* shade_input_set_triangle_i */
 	shi.mat= shi.mat_override? shi.mat_override: mat;
 	shi.osatex= (shi.mat->texco & TEXCO_OSA);
-	shi.mode= shi.mat->mode_l;        /* or-ed result for all nodes */
+	shi.mode= shi.mat->mode_l;		/* or-ed result for all nodes */
 
+	texco= mat->texco;
+	mode= shi.mode;
+
+	/* pass option forces UV calc */
+	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) {
@@ -88,16 +94,18 @@
 	memset(uvdu, 0, sizeof(RtVector*)*8);
 	memset(uvdv, 0, sizeof(RtVector*)*8);
 	if(texco & TEXCO_UV) {
-		for(a=0; a<1; a++) {
+		for(a=0; a<8; a++) {
 			sprintf(uvtoken, "uv%d", a);
 			uv[a] = (RtVector*)grid->findVariable(uvtoken);
-			printf("%p\n", uv[a]);
 
+			if(!uv[a])
+				break;
+
 			if(shi.osatex) {
 				uvdu[a] = new RtVector[n];
 				uvdv[a] = new RtVector[n];
 
-				grid->DuV(uvdv[a], uv[a]);
+				grid->DuV(uvdu[a], uv[a]);
 				grid->DvV(uvdv[a], uv[a]);
 			}
 		}
@@ -105,8 +113,42 @@
 	if(texco & TEXCO_STRESS)
 		stress = (float*)grid->findVariable("stress");
 
+	if(texco & TEXCO_REFL) {
+		if(shi.osatex) {
+			Idu = new RtVector[n];
+			Idv = new RtVector[n];
+
+			grid->DuV(Idu, I);
+			grid->DvV(Idv, I);
+		}
+	}
+
+	if(texco & TEXCO_WINDOW) {
+		Camera& cam = State::Instance()->projcam;
+
+		win= new RtVector[n];
+
+		for(i=0; i<n; i++) {
+			const Point3 pp = cam.project(Point3(P[i][0], P[i][1], P[i][2]));
+
+			/* -0.5f is for centering in the pixel */
+			win[i][0]= -1.0f + 2.0f*(pp[0]-0.5f)/cam.getWidth();
+			win[i][1]= -1.0f + 2.0f*(pp[1]-0.5f)/cam.getHeight();
+			win[i][2]= 0.0f;
+		}
+
+		if(shi.osatex) {
+			windu= new RtVector[n];
+			windv= new RtVector[n];
+
+			grid->DuV(windu, win);
+			grid->DvV(windv, win);
+		}
+	}
+
+	/* loop over each micropolygon grid vertex */
 	for (i=0; i<n; i++) {
-		/* shadeinput_set_normals and viewco */
+		/* shadeinput_set_normals */
 		vnormalize(nor, N[i]);
 		nor[0]= -nor[0];
 		nor[1]= -nor[1];
@@ -148,9 +190,6 @@
 		shi.vno[1]= shi.vn[1];
 		shi.vno[2]= shi.vn[2];
 
-		/* TODO dxco, dxview */
-		/* TODO mask, samplenr */
-
 		/* texture coordinates */
 		if((texco & TEXCO_ORCO) && orco) {
 			shi.lo[0]= orco[i][0];
@@ -168,50 +207,105 @@
 			}
 		}
 
-#if 0
+		/* global coordinates */
 		if(texco & TEXCO_GLOB) {
-			VECCOPY(shi.gl, shi.co);
-			MTC_Mat4MulVecfl(R.viewinv, shi.gl);
+			shi.gl[0]= shi.co[0];
+			shi.gl[1]= shi.co[1];
+			shi.gl[2]= shi.co[2];
 			if(shi.osatex) {
-				VECCOPY(shi.dxgl, shi.dxco);
-				MTC_Mat3MulVecfl(R.imat, shi.dxco);
-				VECCOPY(shi.dygl, shi.dyco);
-				MTC_Mat3MulVecfl(R.imat, shi.dyco);
+				shi.dxgl[0]= shi.dxco[0];
+				shi.dxgl[1]= shi.dxco[1];
+				shi.dxgl[2]= shi.dxco[2];
+
+				shi.dygl[0]= shi.dyco[0];
+				shi.dygl[1]= shi.dyco[1];
+				shi.dygl[2]= shi.dyco[2];
 			}
 		}
-#endif
 
+		/* UV coordinates */
 		if(texco & TEXCO_UV) {
-			for(a=0; a<1; a++) {
-				ShadeInputUV *suv= &shi.uv[a];
+			shi.totuv= 0;
 
-				shi.totuv++;
-				suv->name= "";;
-				
-				suv->uv[0]= -1.0f + 2.0f*uv[a][i][0];
-				suv->uv[1]= -1.0f + 2.0f*uv[a][i][1];
-				suv->uv[2]= 0.0f;
+			for(a=0; a<8; a++) {
+				if(uv[a]) {
+					ShadeInputUV *suv= &shi.uv[a];
 
-				if(shi.osatex) {
-#if 0
-					suv->dxuv[0]= 2.0f*uvdu[a][i][0]*du;
-					suv->dxuv[1]= 2.0f*uvdu[a][i][1]*du;
-					suv->dxuv[2]= 0.0f;
+					shi.totuv++;
+					suv->name= "";
+					
+					suv->uv[0]= -1.0f + 2.0f*uv[a][i][0];
+					suv->uv[1]= -1.0f + 2.0f*uv[a][i][1];
+					suv->uv[2]= 0.0f;
 
-					suv->dyuv[0]= 2.0f*uvdv[a][i][0]*dv;
-					suv->dyuv[1]= 2.0f*uvdv[a][i][1]*dv;
-					suv->dyuv[2]= 0.0f;
-#endif
+					if(shi.osatex) {
+						suv->dxuv[0]= 2.0f*uvdu[a][i][0]*du;
+						suv->dxuv[1]= 2.0f*uvdu[a][i][1]*du;
+						suv->dxuv[2]= 0.0f;
+
+						suv->dyuv[0]= 2.0f*uvdv[a][i][0]*dv;
+						suv->dyuv[1]= 2.0f*uvdv[a][i][1]*dv;
+						suv->dyuv[2]= 0.0f;
+					}
 				}
 			}
+
+			if(shi.totuv == 0) {
+				ShadeInputUV *suv= &shi.uv[0];
+				float u, v;
+				
+				u= (i % (xdim+1))/(float)xdim;
+				v= (i / (xdim+1))/(float)ydim;
+
+				suv->uv[0]= 2.0f*(u+.5f);
+				suv->uv[1]= 2.0f*(v+.5f);
+				suv->uv[2]= 0.0f;
+				
+				if(mode & MA_FACETEXTURE) {
+					shi.vcol[0]= 1.0f;
+					shi.vcol[1]= 1.0f;
+					shi.vcol[2]= 1.0f;
+				}
+			}
 		}
 
+		/* stress value */
 		if((texco & TEXCO_STRESS) && stress) {
 			shi.stress= stress[i];
 			if(shi.stress<1.0f) shi.stress-= 1.0f;
 			else shi.stress= (shi.stress-1.0f)/shi.stress;
 		}
 
+		/* nor */
+		if(texco & TEXCO_NORM) {
+			shi.orn[0]= -shi.vn[0];
+			shi.orn[1]= -shi.vn[1];
+			shi.orn[2]= -shi.vn[2];
+		}
+
+		/* refl */
+		if(texco & TEXCO_REFL) {
+			if(shi.osatex) {
+				shi.dxview= Idu[i][0];
+				shi.dyview= Idv[i][1];
+			}
+		}
+
+		/* win */
+		if(texco & TEXCO_WINDOW) {
+			shi.winco[0]= win[i][0];
+			shi.winco[1]= win[i][1];
+			shi.winco[2]= win[i][2];
+			if(shi.osatex) {
+				/* TODO: seems too blurry? */
+				shi.dxwin[0]= windu[i][0];
+				shi.dxwin[1]= windu[i][1];
+				shi.dywin[0]= windv[i][0];
+				shi.dywin[1]= windv[i][1];
+			}
+		}
+
+		/* run the actual shader */
 		if(displacement) {
 			RtVector displacement;
 	
@@ -236,13 +330,19 @@
 		}
 	}
 
-	if(orcodu) delete orcodu;
-	if(orcodv) delete orcodv;
+	/* delete texture coordinate temporary arrays */
+	if(orcodu) delete [] orcodu;
+	if(orcodv) delete [] orcodv;
+	if(Idu) delete [] Idu;
+	if(Idv) delete [] Idv;
+	if(win) delete [] win;
+	if(windu) delete [] windu;
+	if(windv) delete [] windv;
 
 	for(a=0; a<8; a++) {
 		if(uvdu[a]) {
-			delete uvdu[a];
-			delete uvdv[a];
+			delete [] uvdu[a];
+			delete [] uvdv[a];
 		}
 	}
 }

Modified: branches/qdune/blender/extern/qdune/primitives/Patches.cpp
===================================================================
--- branches/qdune/blender/extern/qdune/primitives/Patches.cpp	2007-10-18 12:35:58 UTC (rev 12279)
+++ branches/qdune/blender/extern/qdune/primitives/Patches.cpp	2007-10-18 13:03:20 UTC (rev 12280)
@@ -179,7 +179,7 @@
 
 // helper function, split data for new patch, also called by Polygons.cpp
 void splitPrimVars(const Primitive* parent, Primitive* newp,
-                   int uni_idx, int vary_idx[4], int* vert_idx, bool cubic)
+                   int uni_idx, int vary_idx[4], int* vert_idx, int fvary_idx[4], bool cubic)
 {
 	const PrimVars* pv = parent->getPrimVars();
 	if (pv==NULL) return;
@@ -210,19 +210,21 @@
 				// mtx TODO
 			}
 			else if (dp.ct_flags & (SC_VARYING | SC_FACEVARYING | SC_VERTEX)) {
+				const int *v_idx = ((dp.ct_flags & SC_FACEVARYING) && fvary_idx)? fvary_idx: vary_idx;
+
 				if (dp.ct_flags & DT_FLOAT) {
 					float *nfa = new float[4], *ofa = (*vdt)->data;
-					nfa[0] = ofa[vary_idx[0]];  nfa[1] = ofa[vary_idx[1]];
-					nfa[2] = ofa[vary_idx[2]];  nfa[3] = ofa[vary_idx[3]];
+					nfa[0] = ofa[v_idx[0]];  nfa[1] = ofa[v_idx[1]];
+					nfa[2] = ofa[v_idx[2]];  nfa[3] = ofa[v_idx[3]];
 					nvdt->data = nfa;
 				}
 				else if (dp.ct_flags & DT_FLOAT3MASK) {
 					// pretend vector, doesn't matter, all are 3-float arrays
 					RtVector *nva = new RtVector[4], *pva = reinterpret_cast<RtVector*>((*vdt)->data);
-					nva[0][0] = pva[vary_idx[0]][0], nva[0][1] = pva[vary_idx[0]][1], nva[0][2] = pva[vary_idx[0]][2];
-					nva[1][0] = pva[vary_idx[1]][0], nva[1][1] = pva[vary_idx[1]][1], nva[1][2] = pva[vary_idx[1]][2];
-					nva[2][0] = pva[vary_idx[2]][0], nva[2][1] = pva[vary_idx[2]][1], nva[2][2] = pva[vary_idx[2]][2];
-					nva[3][0] = pva[vary_idx[3]][0], nva[3][1] = pva[vary_idx[3]][1], nva[3][2] = pva[vary_idx[3]][2];
+					nva[0][0] = pva[v_idx[0]][0], nva[0][1] = pva[v_idx[0]][1], nva[0][2] = pva[v_idx[0]][2];
+					nva[1][0] = pva[v_idx[1]][0], nva[1][1] = pva[v_idx[1]][1], nva[1][2] = pva[v_idx[1]][2];
+					nva[2][0] = pva[v_idx[2]][0], nva[2][1] = pva[v_idx[2]][1], nva[2][2] = pva[v_idx[2]][2];
+					nva[3][0] = pva[v_idx[3]][0], nva[3][1] = pva[v_idx[3]][1], nva[3][2] = pva[v_idx[3]][2];
 					nvdt->data = reinterpret_cast<float*>(nva);
 				}
 				// don't know what to do with matrices yet...

Modified: branches/qdune/blender/extern/qdune/primitives/Patches.h
===================================================================
--- branches/qdune/blender/extern/qdune/primitives/Patches.h	2007-10-18 12:35:58 UTC (rev 12279)
+++ branches/qdune/blender/extern/qdune/primitives/Patches.h	2007-10-18 13:03:20 UTC (rev 12280)
@@ -66,7 +66,7 @@
 
 // helper function, split data for new patch, also called by Polygons.cpp
 void splitPrimVars(const Primitive* parent, Primitive* newp,
-                   int uni_idx, int vary_idx[4], int* vert_idx, bool cubic=false);
+                   int uni_idx, int vary_idx[4], int* vert_idx, int fvary_idx[4]=NULL, bool cubic=false);
 
 //------------------------------------------------------------------------------
 // BicubicPatch

Modified: branches/qdune/blender/extern/qdune/primitives/Polygons.cpp
===================================================================

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list