[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27412] branches/render25/source/blender: Render Branch: per tile subdivision now supports uvs and vertex colors.

Brecht Van Lommel brecht at blender.org
Thu Mar 11 15:23:43 CET 2010


Revision: 27412
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27412
Author:   blendix
Date:     2010-03-11 15:23:40 +0100 (Thu, 11 Mar 2010)

Log Message:
-----------
Render Branch: per tile subdivision now supports uvs and vertex colors.

Modified Paths:
--------------
    branches/render25/source/blender/blenlib/BLI_math_vector.h
    branches/render25/source/blender/blenlib/intern/math_vector_inline.c
    branches/render25/source/blender/render/intern/include/object.h
    branches/render25/source/blender/render/intern/include/object_mesh.h
    branches/render25/source/blender/render/intern/source/object_mesh.c
    branches/render25/source/blender/render/intern/source/object_subdivide.c

Modified: branches/render25/source/blender/blenlib/BLI_math_vector.h
===================================================================
--- branches/render25/source/blender/blenlib/BLI_math_vector.h	2010-03-11 14:18:05 UTC (rev 27411)
+++ branches/render25/source/blender/blenlib/BLI_math_vector.h	2010-03-11 14:23:40 UTC (rev 27412)
@@ -78,6 +78,7 @@
 MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], const float f);
 MINLINE void madd_v3_v3v3fl(float r[3], float a[3], float b[3], float f);
 MINLINE void madd_v3_v3v3v3(float r[3], float a[3], float b[3], float c[3]);
+MINLINE void madd_v4_v4fl(float r[4], float a[4], float f);
 
 MINLINE void negate_v3(float r[3]);
 MINLINE void negate_v3_v3(float r[3], const float a[3]);

Modified: branches/render25/source/blender/blenlib/intern/math_vector_inline.c
===================================================================
--- branches/render25/source/blender/blenlib/intern/math_vector_inline.c	2010-03-11 14:18:05 UTC (rev 27411)
+++ branches/render25/source/blender/blenlib/intern/math_vector_inline.c	2010-03-11 14:23:40 UTC (rev 27412)
@@ -228,6 +228,14 @@
 	r[2] = a[2] + b[2]*c[2];
 }
 
+MINLINE void madd_v4_v4fl(float r[4], float a[4], float f)
+{
+	r[0] += a[0]*f;
+	r[1] += a[1]*f;
+	r[2] += a[2]*f;
+	r[3] += a[3]*f;
+}
+
 MINLINE void mul_v3_v3v3(float *v, float *v1, float *v2)
 {
 	v[0] = v1[0] * v2[0];

Modified: branches/render25/source/blender/render/intern/include/object.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object.h	2010-03-11 14:18:05 UTC (rev 27411)
+++ branches/render25/source/blender/render/intern/include/object.h	2010-03-11 14:23:40 UTC (rev 27412)
@@ -150,23 +150,23 @@
 #define R_HIDDEN			8
 
 /* data layer size */
-#define RE_ORCO_ELEMS		3
-#define RE_STICKY_ELEMS		2
-#define RE_STRESS_ELEMS		1
-#define RE_RAD_ELEMS		4
-#define RE_STRAND_ELEMS		1
-#define RE_TANGENT_ELEMS	3
-#define RE_STRESS_ELEMS		1
-#define RE_WINSPEED_ELEMS	4
-#define RE_MTFACE_ELEMS		1
-#define RE_MCOL_ELEMS		4
-#define RE_UV_ELEMS			2
-#define RE_SURFNOR_ELEMS	3
-#define RE_RADFACE_ELEMS	1
-#define RE_SIMPLIFY_ELEMS	2
-#define RE_FACE_ELEMS		1
+#define RE_ORCO_ELEMS			3
+#define RE_STICKY_ELEMS			2
+#define RE_STRESS_ELEMS			1
+#define RE_RAD_ELEMS			4
+#define RE_STRAND_ELEMS			1
+#define RE_TANGENT_ELEMS		3
+#define RE_STRESS_ELEMS			1
+#define RE_WINSPEED_ELEMS		4
+#define RE_MTFACE_ELEMS			1
+#define RE_MCOL_ELEMS			4
+#define RE_UV_ELEMS				2
+#define RE_SURFNOR_ELEMS		3
+#define RE_RADFACE_ELEMS		1
+#define RE_SIMPLIFY_ELEMS		2
+#define RE_FACE_ELEMS			1
 #define RE_NMAP_TANGENT_ELEMS	12
-#define RE_STRANDCO_ELEMS	1
+#define RE_STRANDCO_ELEMS		1
 
 #endif /* __RENDER_OBJECT_H__ */
 

Modified: branches/render25/source/blender/render/intern/include/object_mesh.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object_mesh.h	2010-03-11 14:18:05 UTC (rev 27411)
+++ branches/render25/source/blender/render/intern/include/object_mesh.h	2010-03-11 14:23:40 UTC (rev 27412)
@@ -44,6 +44,7 @@
 struct VlakRen *render_object_vlak_copy(struct ObjectRen *obrn, struct ObjectRen *obr, struct VlakRen *vlr);
 
 struct VertRen *render_object_vert_interp(struct ObjectRen *obrn, struct ObjectRen *obr, struct VertRen **v, float *w, int totv);
+struct VlakRen *render_object_vlak_interp(struct ObjectRen *obrn, struct ObjectRen *obr, struct VlakRen *vlr, float w[4][4]);
 
 /* Vertex Texture Coordinates */
 

Modified: branches/render25/source/blender/render/intern/source/object_mesh.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_mesh.c	2010-03-11 14:18:05 UTC (rev 27411)
+++ branches/render25/source/blender/render/intern/source/object_mesh.c	2010-03-11 14:23:40 UTC (rev 27412)
@@ -269,9 +269,6 @@
 		if((from=render_vert_get_orco(obr, v, 0))) {
 			to= render_vert_get_orco(obrn, ver, 1);
 			madd_v3_v3fl(to, from, w);
-			/*print_v3("to", to);
-			print_v3("from", from);
-			printf("w: %f\n", w);*/
 		}
 
 		if((from=render_vert_get_sticky(obr, v, 0))) {
@@ -298,8 +295,6 @@
 		madd_v3_v3fl(ver->n, v->n, w);
 	}
 
-	//print_v3("orco", render_vert_get_orco(obrn, ver, 0));
-
 	normalize_v3(ver->n);
 
 	return ver;
@@ -437,13 +432,14 @@
 
 	*vlrn= *vlr;
 	vlrn->index= index;
+	vlrn->puno= 0;
 
-	for (i=0; (mtface=render_vlak_get_tface(obr, vlr, i, &name, 0)) != NULL; i++) {
+	for(i=0; (mtface=render_vlak_get_tface(obr, vlr, i, &name, 0)) != NULL; i++) {
 		mtface1= render_vlak_get_tface(obrn, vlrn, i, &name, 1);
 		memcpy(mtface1, mtface, sizeof(MTFace)*RE_MTFACE_ELEMS);
 	}
 
-	for (i=0; (mcol=render_vlak_get_mcol(obr, vlr, i, &name, 0)) != NULL; i++) {
+	for(i=0; (mcol=render_vlak_get_mcol(obr, vlr, i, &name, 0)) != NULL; i++) {
 		mcol1= render_vlak_get_mcol(obrn, vlrn, i, &name, 1);
 		memcpy(mcol1, mcol, sizeof(MCol)*RE_MCOL_ELEMS);
 	}
@@ -463,6 +459,63 @@
 	return vlrn;
 }
 
+VlakRen *render_object_vlak_interp(ObjectRen *obrn, ObjectRen *obr, VlakRen *vlr, float warray[4][4])
+{
+	VlakRen *vlrn= render_object_vlak_copy(obrn, obr, vlr);
+	MTFace *mtface;
+	MCol *mcol;
+	float *tangent;
+	int i, j, k;
+
+	for(i=0; (mtface=render_vlak_get_tface(obrn, vlrn, i, NULL, 0)) != NULL; i++) {
+		float uv[4][2];
+
+		memset(uv, 0, sizeof(uv));
+
+		for(k=0; k<4; k++)
+			for(j=0; j<4; j++)
+				madd_v2_v2fl(uv[j], mtface->uv[k], warray[j][k]);
+
+		memcpy(mtface->uv, uv, sizeof(mtface->uv));
+	}
+
+	for(i=0; (mcol=render_vlak_get_mcol(obrn, vlrn, i, NULL, 0)) != NULL; i++) {
+		float col[4][4];
+
+		memset(col, 0, sizeof(col));
+
+		for(k=0; k<4; k++) {
+			char *cp= (char*)(mcol + k);
+			float from[4]= {cp[0], cp[1], cp[2], cp[3]};
+
+			for(j=0; j<4; j++)
+				madd_v4_v4fl(col[j], from, warray[j][k]);
+		}
+
+		for(k=0; k<4; k++) {
+			char *cp= (char*)(mcol + k);
+
+			for(j=0; j<4; j++)
+				cp[j]= col[k][j];
+		}
+	}
+
+	tangent= render_vlak_get_nmap_tangent(obrn, vlrn, 0);
+	if(tangent) {
+		float tang[4][3];
+
+		memset(tang, 0, sizeof(tang));
+
+		for(k=0; k<4; k++)
+			for(j=0; j<4; j++)
+				madd_v3_v3fl(tang[j], tangent + k*3, warray[j][k]);
+
+		memcpy(tangent, tang, sizeof(float)*4*3);
+	}
+
+	return vlrn;
+}
+
 int render_vlak_get_normal(ObjectInstanceRen *obi, VlakRen *vlr, float *nor, int quad)
 {
 	float v1[3], n[3], (*nmat)[3]= obi->nmat;

Modified: branches/render25/source/blender/render/intern/source/object_subdivide.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_subdivide.c	2010-03-11 14:18:05 UTC (rev 27411)
+++ branches/render25/source/blender/render/intern/source/object_subdivide.c	2010-03-11 14:23:40 UTC (rev 27412)
@@ -85,7 +85,7 @@
 	result[1][2]= bb[1][2] + dispbound;
 }
 
-static int render_vlak_clip(VlakRen *vlr, float M[3][3], float winmat[4][4], float bounds[4], float dispbound, int quad)
+static int render_vlak_clip(VlakRen *vlr, float M[4][4], float winmat[4][4], float bounds[4], float dispbound, int quad)
 {
 	float *co1, *co2, *co3, co[3];
 	float bb[2][3], dispbb[2][3];
@@ -122,25 +122,22 @@
 	return box_clip_bounds_m4(dispbb, bounds, winmat);
 }
 
-static VlakRen *render_vlak_sub_copy(ObjectRen *obr, VlakRen *vlr, VertRen *v1, VertRen *v2, VertRen *v3)
+static VlakRen *render_vlak_sub_copy(ObjectRen *obrn, ObjectRen *obr, VlakRen *vlr, VertRen *v1, VertRen *v2, VertRen *v3, float w[4][4])
 {
 	VlakRen *vlrn;
 
-	vlrn= render_object_vlak_get(obr, obr->totvlak++);
-	copy_v3_v3(vlrn->n, vlr->n);
-	vlrn->puno= vlr->puno;
+	vlrn= render_object_vlak_interp(obrn, obr, vlr, w);
 	vlrn->ec= ME_V1V2|ME_V2V3|ME_V3V4;
-	vlrn->flag= vlr->flag;
-	vlrn->mat= vlr->mat;
 
 	vlrn->v1= v1;
 	vlrn->v2= v2;
 	vlrn->v3= v3;
+	vlrn->v4= NULL;
 
 	return vlrn;
 }
 
-static int render_face_view_resolution(RenderCamera *cam, float winmat[4][4], VlakRen *vlr, float M[3][3], int quad, float shadingrate)
+static int render_face_view_resolution(RenderCamera *cam, float winmat[4][4], VlakRen *vlr, float M[4][4], int quad, float shadingrate)
 {
 	float maxlen, hoco[3][4], zco[3][3];
 	float *co1, *co2, *co3, co[3];
@@ -184,21 +181,37 @@
 	return res;
 }
 
-static void vertex_weight(float w[3], float M[3][3], float u, float v)
+static void vertex_weight(float w[4], float M[4][4], float u, float v, int vi[4])
 {
-	w[0]= (1-u)*(1-v) + u*(1-v);
-	w[1]= (1-u)*v;
-	w[2]= u*v;
+	float tmp[4];
 
-	mul_m3_v3(M, w);
+	tmp[0]= (1-u)*(1-v) + u*(1-v);
+	tmp[1]= (1-u)*v;
+	tmp[2]= u*v;
+	tmp[3]= 0.0f;
+
+	mul_m4_v4(M, tmp);
+
+	w[vi[0]]= tmp[0];
+	w[vi[1]]= tmp[1];
+	w[vi[2]]= tmp[2];
+	w[vi[3]]= tmp[3];
 }
 
-static void render_face_subdivide(RenderCamera *cam, float winmat[4][4], float bounds[4], ObjectRen *obrn, ObjectRen *obr, VlakRen *vlr, int quad, int depth, float M[3][3], float displacebound, float shadingrate)
+static void face_vertex_weight(float w[4], float M[4][4], int i, int j, int res, int vi[4])
 {
-	VertRen *s1, *s2, *s3, *ver[3];
-	float w[3], u, v, pM[3][3];
-	int i, j, offset, res, split;
+	float u= ((j > 0)? i/(float)j: 0.0f);
+	float v= (j/(float)(res-1));
 
+	vertex_weight(w, M, u, v, vi);
+}
+
+static void render_face_subdivide(RenderCamera *cam, float winmat[4][4], float bounds[4], ObjectRen *obrn, ObjectRen *obr, VlakRen *vlr, int quad, int depth, float M[4][4], float displacebound, float shadingrate)
+{
+	VertRen *s1, *s2, *s3;
+	float w[4], pM[4][4], fw[4][4];
+	int i, j, vi[4], offset, res, split;
+
 	res= render_face_view_resolution(cam, winmat, vlr, M, quad, shadingrate);
 
 	split= 0;
@@ -212,32 +225,30 @@
 	}
 
 	if(quad) {
-		ver[0]= render_object_vert_copy(obrn, obr, vlr->v1);
-		ver[1]= render_object_vert_copy(obrn, obr, vlr->v3);
-		ver[2]= render_object_vert_copy(obrn, obr, vlr->v4);
+		vi[0]= 0; vi[1]= 2; vi[2]= 3; vi[3]= 1;
 	}
 	else {
-		ver[0]= render_object_vert_copy(obrn, obr, vlr->v1);
-		ver[1]= render_object_vert_copy(obrn, obr, vlr->v2);
-		ver[2]= render_object_vert_copy(obrn, obr, vlr->v3);
+		vi[0]= 0; vi[1]= 1; vi[2]= 2; vi[3]= 3;
 	}
 
-	if(M) copy_m3_m3(pM, M);
-	else unit_m3(pM);
+	if(M) copy_m4_m4(pM, M);
+	else unit_m4(pM);
 
 	offset= obrn->totvert;
 
 	if(split) {
-		float pattern[4][3][2] = {
-			{{0.0f, 0.0f}, {0.0f, 0.5f}, {1.0f, 0.5f}},
-			{{0.0f, 0.5f}, {0.0f, 1.0f}, {0.5f, 1.0f}},
-			{{0.0f, 0.5f}, {0.5f, 1.0f}, {1.0f, 0.5f}},
-			{{1.0f, 0.5f}, {0.5f, 1.0f}, {1.0f, 1.0f}}};
-		float sM[3][3];
+		float pattern[4][4][2] = {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list