[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28092] branches/render25/source/blender/ render/intern: Render Branch: Fix displacement mapped surfaces not supporting speed vectors yet,
Brecht Van Lommel
brecht at blender.org
Thu Apr 8 14:21:31 CEST 2010
Revision: 28092
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28092
Author: blendix
Date: 2010-04-08 14:21:31 +0200 (Thu, 08 Apr 2010)
Log Message:
-----------
Render Branch: Fix displacement mapped surfaces not supporting speed vectors yet,
and optimization so displacement does not evaluate e.g. color or bump textures.
Modified Paths:
--------------
branches/render25/source/blender/render/intern/include/object_mesh.h
branches/render25/source/blender/render/intern/include/texture_stack.h
branches/render25/source/blender/render/intern/source/material.c
branches/render25/source/blender/render/intern/source/object_mesh.c
branches/render25/source/blender/render/intern/source/object_subdivide.c
branches/render25/source/blender/render/intern/source/texture_stack.c
Modified: branches/render25/source/blender/render/intern/include/object_mesh.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object_mesh.h 2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/include/object_mesh.h 2010-04-08 12:21:31 UTC (rev 28092)
@@ -43,7 +43,7 @@
struct VertRen *render_object_vert_copy(struct ObjectRen *obrn, struct ObjectRen *obr, struct VertRen *ver);
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 VertRen *render_object_vert_interp(struct ObjectInstanceRen *obin, struct ObjectInstanceRen *obi, 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/include/texture_stack.h
===================================================================
--- branches/render25/source/blender/render/intern/include/texture_stack.h 2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/include/texture_stack.h 2010-04-08 12:21:31 UTC (rev 28092)
@@ -39,7 +39,8 @@
/* Texture Stacks */
-void do_material_tex(struct Render *re, struct ShadeInput *shi);
+void do_material_tex(struct Render *re, struct ShadeInput *shi,
+ int mapto_flag);
void do_lamp_tex(struct Render *re, struct LampRen *la, float *lavec,
struct ShadeInput *shi, float *colf, int effect);
void do_sky_tex(struct Render *re, float *rco, float *lo, float *dxyview,
Modified: branches/render25/source/blender/render/intern/source/material.c
===================================================================
--- branches/render25/source/blender/render/intern/source/material.c 2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/source/material.c 2010-04-08 12:21:31 UTC (rev 28092)
@@ -560,7 +560,7 @@
void mat_displacement(Render *re, ShadeInput *shi, float displacement[3])
{
zero_v3(shi->texture.displace);
- do_material_tex(re, shi);
+ do_material_tex(re, shi, MAP_DISPLACE);
copy_v3_v3(displacement, shi->texture.displace);
}
@@ -580,7 +580,7 @@
}
if(do_textures && ma->texco)
- do_material_tex(re, shi);
+ do_material_tex(re, shi, 0);
if(!(ma->mode & MA_SHLESS)) {
if(ma->fresnel_tra!=0.0f)
Modified: branches/render25/source/blender/render/intern/source/object_mesh.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_mesh.c 2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/source/object_mesh.c 2010-04-08 12:21:31 UTC (rev 28092)
@@ -204,19 +204,36 @@
/* also winspeed is exception, it is stored per instance */
float *render_vert_get_winspeed(ObjectInstanceRen *obi, VertRen *ver, int verify)
{
+ ObjectRen *obr= obi->obr;
float *winspeed;
- int totvector;
-
- winspeed= obi->vectors;
- if(winspeed==NULL) {
- if(verify) {
- totvector= obi->obr->totvert + obi->obr->totstrand;
- winspeed= obi->vectors= MEM_callocN(totvector*RE_WINSPEED_ELEMS*sizeof(float), "winspeed table");
+
+ if(obr->flag & R_TEMP_COPY) {
+ int nr= ver->index>>8;
+
+ winspeed= obr->vertnodes[nr].winspeed;
+ if(winspeed==NULL) {
+ if(verify)
+ winspeed= obr->vertnodes[nr].winspeed= MEM_callocN(256*RE_WINSPEED_ELEMS*sizeof(float), "winspeed table");
+ else
+ return NULL;
}
- else
- return NULL;
+ return winspeed + (ver->index & 255)*RE_WINSPEED_ELEMS;
}
- return winspeed + ver->index*RE_WINSPEED_ELEMS;
+ else {
+ int totvector;
+
+ winspeed= obi->vectors;
+ if(winspeed==NULL) {
+ if(verify) {
+ totvector= obi->obr->totvert + obi->obr->totstrand;
+ winspeed= obi->vectors= MEM_callocN(totvector*RE_WINSPEED_ELEMS*sizeof(float), "winspeed table");
+ }
+ else
+ return NULL;
+ }
+
+ return winspeed + ver->index*RE_WINSPEED_ELEMS;
+ }
}
float *render_vert_get_basenor(ObjectRen *obr, VertRen *ver, int verify)
@@ -297,8 +314,10 @@
return vern;
}
-VertRen *render_object_vert_interp(ObjectRen *obrn, ObjectRen *obr, VertRen **varray, float *warray, int totv)
+VertRen *render_object_vert_interp(ObjectInstanceRen *obin, ObjectInstanceRen *obi, VertRen **varray, float *warray, int totv)
{
+ ObjectRen *obrn= obin->obr;
+ ObjectRen *obr= obi->obr;
VertRen *ver= render_object_vert_get(obrn, obrn->totvert++);
int a;
@@ -341,6 +360,11 @@
madd_v3_v3fl(ver->n, from, w);
else
madd_v3_v3fl(ver->n, v->n, w);
+
+ if((from=render_vert_get_winspeed(obi, v, 0))) {
+ to= render_vert_get_winspeed(obin, ver, 1);
+ madd_v4_v4fl(to, from, w);
+ }
}
normalize_v3(ver->n);
Modified: branches/render25/source/blender/render/intern/source/object_subdivide.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_subdivide.c 2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/source/object_subdivide.c 2010-04-08 12:21:31 UTC (rev 28092)
@@ -68,8 +68,8 @@
obin= MEM_callocN(sizeof(ObjectInstanceRen), "ObjectInstanceRen");
memcpy(obin, obi, sizeof(ObjectInstanceRen));
obin->next= obin->prev= NULL;
- obin->vectors= NULL; // ...
- obin->raytree= NULL; // ...
+ obin->vectors= NULL;
+ obin->raytree= NULL;
return obin;
}
@@ -211,8 +211,10 @@
vertex_weight(w, M, u, v, vi);
}
-static void render_face_subdivide(Render *re, 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 subdivision_rate)
+static void render_face_subdivide(Render *re, RenderCamera *cam, float winmat[4][4], float bounds[4], ObjectInstanceRen *obin, ObjectInstanceRen *obi, VlakRen *vlr, int quad, int depth, float M[4][4], float displacebound, float subdivision_rate)
{
+ ObjectRen *obrn= obin->obr;
+ ObjectRen *obr= obi->obr;
VertRen *s1, *s2, *s3;
float w[4], pM[4][4], fw[4][4];
int i, j, vi[4], offset, res, split;
@@ -259,7 +261,7 @@
}
if(!render_vlak_clip(obr, vlr, sM, winmat, bounds, displacebound, quad))
- render_face_subdivide(re, cam, winmat, bounds, obrn, obr, vlr, quad, depth+1, sM, displacebound, subdivision_rate);
+ render_face_subdivide(re, cam, winmat, bounds, obin, obi, vlr, quad, depth+1, sM, displacebound, subdivision_rate);
}
}
else {
@@ -267,7 +269,7 @@
for(i=0; i<=j; i++) {
face_vertex_weight(w, pM, i, j, res, vi);
- render_object_vert_interp(obrn, obr, &vlr->v1, w, (vlr->v4)? 4: 3);
+ render_object_vert_interp(obin, obi, &vlr->v1, w, (vlr->v4)? 4: 3);
if(i > 0 && j > 0) {
s1= render_object_vert_get(obrn, offset-j-1);
@@ -299,25 +301,25 @@
}
}
-static ObjectRen *render_object_tile_subdivide(Render *re, ObjectRen *obr, RenderCamera *cam, float winmat[4][4], float bounds[4])
+static ObjectRen *render_object_tile_subdivide(Render *re, ObjectInstanceRen *obin, ObjectInstanceRen *obi, RenderCamera *cam, float winmat[4][4], float bounds[4])
{
- ObjectRen *obrn;
+ ObjectRen *obrn, *obr= obi->obr;
VlakRen *vlr;
int a;
float displacebound= obr->ob->displacebound;
float subdivision_rate= re->params.r.subdivision_rate*obr->ob->subdivision_rate;
- obrn= render_object_temp_copy(obr);
+ obin->obr= obrn= render_object_temp_copy(obr);
/* copy subdivided faces */
for(a=0; a<obr->totvlak; a++) {
vlr= render_object_vlak_get(obr, a);
if(!render_vlak_clip(obr, vlr, NULL, winmat, bounds, displacebound, 0))
- render_face_subdivide(re, cam, winmat, bounds, obrn, obr, vlr, 0, 0, NULL, displacebound, subdivision_rate);
+ render_face_subdivide(re, cam, winmat, bounds, obin, obi, vlr, 0, 0, NULL, displacebound, subdivision_rate);
if(vlr->v4 && !render_vlak_clip(obr, vlr, NULL, winmat, bounds, displacebound, 1))
- render_face_subdivide(re, cam, winmat, bounds, obrn, obr, vlr, 1, 0, NULL, displacebound, subdivision_rate);
+ render_face_subdivide(re, cam, winmat, bounds, obin, obi, vlr, 1, 0, NULL, displacebound, subdivision_rate);
if(re->cb.test_break(re->cb.tbh))
break;
@@ -326,11 +328,11 @@
return obrn;
}
-static ObjectRen *render_instance_tile_subdivide(Render *re, ObjectInstanceRen *obi, float winmat[4][4], float bounds[4], int thread)
+static ObjectRen *render_instance_tile_subdivide(Render *re, ObjectInstanceRen *obin, ObjectInstanceRen *obi, float winmat[4][4], float bounds[4], int thread)
{
ObjectRen *obrn;
- obrn= render_object_tile_subdivide(re, obi->obr, &re->cam, winmat, bounds);
+ obrn= render_object_tile_subdivide(re, obin, obi, &re->cam, winmat, bounds);
if(!re->cb.test_break(re->cb.tbh))
finalize_render_object(re, obrn, 0, thread);
@@ -371,8 +373,7 @@
obin= render_instance_temp_copy(obi);
- obrn= render_instance_tile_subdivide(re, obi, winmat, bounds, pa->thread);
- obin->obr= obrn;
+ obrn= render_instance_tile_subdivide(re, obin, obi, winmat, bounds, pa->thread);
BLI_ghash_insert(pa->subdivhash, obi, obin);
}
Modified: branches/render25/source/blender/render/intern/source/texture_stack.c
===================================================================
--- branches/render25/source/blender/render/intern/source/texture_stack.c 2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/source/texture_stack.c 2010-04-08 12:21:31 UTC (rev 28092)
@@ -766,7 +766,7 @@
}
}
-void do_material_tex(Render *re, ShadeInput *shi)
+void do_material_tex(Render *re, ShadeInput *shi, int mapto_flag)
{
MTex *mtex;
Tex *tex;
@@ -776,7 +776,7 @@
float texvec[3], dxt[3], dyt[3], tempvec[3], norvec[3], warpvec[3]={0.0f, 0.0f, 0.0f}, Tnor=1.0;
int tex_nr, rgbnor= 0, warpdone=0;
float nu[3] = {0,0,0}, nv[3] = {0,0,0}, nn[3] = {0,0,0}, dudnu = 1.f, dudnv = 0.f, dvdnu = 0.f, dvdnv = 1.f; // bump mapping
- int nunvdone= 0;
+ int nunvdone= 0, mapto;
if (re->params.r.scemode & R_NO_TEX) return;
/* here: test flag if there's a tex (todo) */
@@ -792,6 +792,11 @@
tex= mtex->tex;
if(tex==0) continue;
+ /* only process if this texture is mapped
+ * to one that we're interested in */
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list