[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