[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15725] branches/soc-2007-joeedh/source/ blender: strands work again
Joseph Eagar
joeedh at gmail.com
Thu Jul 24 02:45:12 CEST 2008
Revision: 15725
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15725
Author: joeedh
Date: 2008-07-24 02:44:12 +0200 (Thu, 24 Jul 2008)
Log Message:
-----------
strands work again
Modified Paths:
--------------
branches/soc-2007-joeedh/source/blender/makesdna/DNA_material_types.h
branches/soc-2007-joeedh/source/blender/makesdna/DNA_texture_types.h
branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c
branches/soc-2007-joeedh/source/blender/render/intern/source/texture.c
branches/soc-2007-joeedh/source/blender/src/buttons_shading.c
Modified: branches/soc-2007-joeedh/source/blender/makesdna/DNA_material_types.h
===================================================================
--- branches/soc-2007-joeedh/source/blender/makesdna/DNA_material_types.h 2008-07-23 22:23:28 UTC (rev 15724)
+++ branches/soc-2007-joeedh/source/blender/makesdna/DNA_material_types.h 2008-07-24 00:44:12 UTC (rev 15725)
@@ -281,6 +281,10 @@
#define MAP_DISPLACE 4096
#define MAP_WARP 8192
#define MAP_LAYER 16384
+/*interval mapping displacement, similar
+ to relief mapping, steeped parallax maps,
+ occlusion parallax maps, etc.*/
+#define MAP_IDISP (16384*2)
/* mapto for halo */
//#define MAP_HA_COL 1
Modified: branches/soc-2007-joeedh/source/blender/makesdna/DNA_texture_types.h
===================================================================
--- branches/soc-2007-joeedh/source/blender/makesdna/DNA_texture_types.h 2008-07-23 22:23:28 UTC (rev 15724)
+++ branches/soc-2007-joeedh/source/blender/makesdna/DNA_texture_types.h 2008-07-24 00:44:12 UTC (rev 15725)
@@ -194,6 +194,11 @@
/* **************** TEX ********************* */
+/*turn this on to enable a root-finding texture displacement
+ method, similar to e.g. steeped parallax maps, relief mapping,
+ occlusion parallax maps, iterative parallax maps, etc.*/
+//#define INTERVAL_MAPPING
+
/* type */
#define TEX_CLOUDS 1
#define TEX_WOOD 2
Modified: branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c
===================================================================
--- branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c 2008-07-23 22:23:28 UTC (rev 15724)
+++ branches/soc-2007-joeedh/source/blender/render/intern/source/dsm.c 2008-07-24 00:44:12 UTC (rev 15725)
@@ -204,9 +204,11 @@
{
VlakRen *vlak;
VertRen *vert;
+ StrandRen *strand= NULL;
+ StrandVert *svert;
ObjectRen *obr;
float imat[3][3], mat[3][3], viewinv[4][4];
- int i, j;
+ int i, j, a;
if (mode == 0) {
Mat4SwapMat4((float*)newview, (float*)oldview);
@@ -225,6 +227,19 @@
MTC_Mat3MulVecfl(imat, vert->n);
MTC_Mat3MulVecfl(mat, vert->n);
}
+
+ /*do strands*/
+ for (j=0; j<obr->totstrand; j++) {
+ if((j & 255)==0) strand= obr->strandnodes[j>>8].strand;
+ else strand++;
+
+ svert= strand->vert;
+ for (a=0; a < strand->totvert; a++, svert++) {
+ MTC_Mat4MulVecfl(viewinv, svert->co);
+ MTC_Mat4MulVecfl(newview, svert->co);
+ }
+
+ }
for (j=0; j<obr->totvlak; j++) {
vlak = RE_findOrAddVlak(obr, j);
@@ -512,6 +527,8 @@
done += 1;
}
}
+
+ printf("done: %d, lastdone: %d\n", done, lastdone);
if (done != lastdone) {
printf("bleh!\n");
sprintf(rendertitle, "Shadow tiles %d out of %d completed", done, dbuf->tilex*dbuf->tiley);
Modified: branches/soc-2007-joeedh/source/blender/render/intern/source/texture.c
===================================================================
--- branches/soc-2007-joeedh/source/blender/render/intern/source/texture.c 2008-07-23 22:23:28 UTC (rev 15724)
+++ branches/soc-2007-joeedh/source/blender/render/intern/source/texture.c 2008-07-24 00:44:12 UTC (rev 15725)
@@ -1451,7 +1451,235 @@
return in;
}
+/*clips ray where ray[axis] == pos */
+static void VecClipLine3f(float *v1, float *v2, int axis, float pos)
+{
+ float vec[3], t;
+ vec[0] = v2[0] - v1[0];
+ vec[1] = v2[1] - v1[1];
+ vec[2] = v2[2] - v1[2];
+
+ if (vec[axis] == 0.0f) {
+ printf("bad value for VecClipLine3f!\n");
+ return;
+ }
+
+ t = (pos-v1[axis])/vec[axis];
+ v2[0] = v1[0] + vec[0]*t;
+ v2[1] = v1[1] + vec[1]*t;
+ v2[2] = v1[2] + vec[2]*t;
+}
+
+#ifdef INTERVAL_MAPPING
+static void do_interval_mapping(MTex *mtex, float *co, ShadeInput *oshi,
+ float *orayvec1, float *warp, int steps1,
+ int steps2, float *no, float *dxt, float *dyt, float *tno)
+{
+ ShadeInput shi = *oshi;
+ TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL}, texres2= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
+ TexResult midres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
+ Tex *tex = mtex->tex;
+ float rco[4], irco[3], lastirco[3], rayvec[3], orayvec[3], eco[3];
+ float mat[4][4], imat[4][4], vec[3] = {0};
+ float istep = 1.0 / steps1;
+ float co1[3], co2[3], mid[3], omid[3], oz, oz2, oz3;
+ int i, lasti = 0, rgbnor, rgbnor2, midrgbnor;
+ float tco1[3], tco2[3], invwin[4][4];
+ float negview[3], dfac = 1.0 - mtex->dispfac;
+
+ memset(mat, 0, sizeof(float)*4*4);
+
+ VECCOPY(orayvec, orayvec1);
+
+ /*algorithm in a nutshell:
+ build a matrix to project to normalspace.
+ rotate ray vec into normalspace.
+ this gives us the height of the ray for free.
+ regularly sample the texture within this space.*/
+
+ /*in theory, the singularity issues with this
+ stupid approach shouldn't matter. I hope.*/
+ //origin is initial point
+
+ /*origin should be 1 unit along the normal below the origin
+ coordinates*/
+ VECCOPY(mat[3], co);
+ VecSubf(mat[3], mat[3], no);
+ mat[3][3] = 1.0;
+
+ VECCOPY(mat[2], no);
+
+ //align x to x axis
+ mat[0][0] = 1.0;
+ Crossf(mat[1], mat[0], mat[2]);
+ Crossf(mat[0], mat[1], mat[2]);
+ Normalize(mat[0]);
+ Normalize(mat[1]);
+ Normalize(mat[2]);
+
+ Mat4Invert(imat, mat);
+
+#if 0
+ //this is like basic parallax mapping,
+ //though I'm not sure it's working correctly.
+ //basically, you just offset the texture coord
+ //by the view vector.
+
+ VECCOPY(negview, orayvec1);
+ //VecMulf(negview, -1);
+ Normalize(negview);
+
+ rgbnor= multitex(tex, co, dxt, dyt, shi.osatex, &texres);
+ VecMulf(negview, texres.tin*mtex->dispfac);
+ VecAddf(rco, co, negview);
+
+ Mat4MulVecfl(imat, rco);
+ rco[2] = 1.0;
+ Mat4MulVecfl(mat, rco);
+
+ VecSubf(rco, rco, co);
+
+ VECCOPY(warp, rco);
+ return;
+#else
+ //yay! we have a matrix. blah.
+ VECCOPY(rayvec, orayvec);
+
+ VECCOPY(rco, co);
+
+ //rotate to planar face space
+ Mat4MulVecfl(imat, rco);
+ Mat4MulVecfl(imat, rayvec);
+
+ /*intersect ray with face*/
+ VecAddf(eco, rco, rayvec);
+ VecClipLine3f(rco, eco, 2, 0.0);
+ VecSubf(rayvec, eco, rco);
+ VecMulf(rayvec, istep);
+
+ VECCOPY(orayvec, rayvec);
+ Mat4MulVecfl(mat, orayvec);
+
+ if (G.rt == 2) printf("rco[2]: %f\n", rco[2]);
+
+ VECCOPY(lastirco, co);
+
+ /*first step: find interval bounds*/
+ for (i=0; i<steps1; i++) {
+ oz = rco[2];
+ rco[2] = 1.0;
+ VECCOPY(irco, rco);
+
+ Mat4MulVecfl(mat, irco);
+ rgbnor= multitex(tex, irco, dxt, dyt, shi.osatex, &texres);
+ texres.tin = dfac + (1.0 - dfac) * texres.tin;
+ rco[2] = oz;
+
+ /*restore irco to its pure, non-snapped-to-face form,
+ as it's used outside the loop.*/
+ VECCOPY(irco, rco);
+ Mat4MulVecfl(mat, irco);
+
+ if (rco[2] <= texres.tin || rco[2] < 0) {
+ break;
+ }
+
+ VECCOPY(lastirco, irco);
+ VecAddf(rco, rco, rayvec);
+ }
+
+ if (G.rt == 2) printf("rco[2] post first loop: %f, tin: %f\n\n", rco[2], texres.tin);
+
+ VECCOPY(co1, irco);
+ VECCOPY(co2, lastirco);
+ //VECCOPY(co1, co);
+ //VECCOPY(co2, eco);
+
+ if (G.rt == 2) {
+ VECCOPY(tco1, co1);
+ VECCOPY(tco2, co2);
+ Mat4MulVecfl(imat, tco1);
+ Mat4MulVecfl(imat, tco2);
+ printf("minz: %f, maxz: %f\n", tco1[2], tco2[2]);
+ printf("texres.tin: %f\n\n", texres.tin);
+ }
+
+ /*binary search for now*/
+ for (i=0; i<steps2; i++) {
+ VecAddf(omid, co1, co2);
+ VecMulf(omid, 0.5f);
+
+ VECCOPY(mid, omid);
+ Mat4MulVecfl(imat, mid);
+ mid[2] = 1.0;
+ Mat4MulVecfl(mat, mid);
+
+ VECCOPY(tco1, co1);
+ VECCOPY(tco2, co2);
+
+ Mat4MulVecfl(imat, tco1);
+ Mat4MulVecfl(imat, tco2);
+ tco1[2] = 1.0f;
+ tco2[2] = 1.0f;
+ Mat4MulVecfl(mat, tco2);
+ Mat4MulVecfl(mat, tco2);
+
+ rgbnor = multitex(tex, tco1, dxt, dyt, shi.osatex, &texres);
+ texres.tin = dfac + (1.0 - dfac) * texres.tin;
+
+ rgbnor2= multitex(tex, tco2, dxt, dyt, shi.osatex, &texres2);
+ texres2.tin = dfac + (1.0 - dfac) * texres2.tin;
+
+ midrgbnor= multitex(tex, mid, dxt, dyt, shi.osatex, &midres);
+ midres.tin = dfac + (1.0 - dfac) * midres.tin;
+
+ Mat4MulVecfl(imat, mid);
+ if (mid[2] < midres.tin) {
+ VECCOPY(co1, omid);
+ } else {
+ VECCOPY(co2, omid);
+ }
+ }
+
+ VECCOPY(mid, omid);
+ Mat4MulVecfl(imat, mid);
+ if (G.rt == 2) {
+ printf("mid: %f %f %f\n", mid[0], mid[1], mid[2]);
+ printf("tin: %f\n", midres.tin);
+ }
+
+ mid[2] = 1.0;
+ Mat4MulVecfl(mat, mid);
+
+ VecSubf(vec, mid, co);
+ //VecMulf(vec, mtex->dispfac);
+ VECCOPY(warp, vec);
+ if (midres.nor) {
+ float nor[3], dot;
+
+ if(shi.mat->mode & MA_TANGENT_V) {
+ shi.tang[0]+= tex->norfac*midres.nor[0];
+ shi.tang[1]+= tex->norfac*midres.nor[1];
+ shi.tang[2]+= tex->norfac*midres.nor[2];
+ }
+
+ /* prevent bump to become negative normal */
+ nor[0]= tex->norfac*midres.nor[0];
+ nor[1]= tex->norfac*midres.nor[1];
+ nor[2]= tex->norfac*midres.nor[2];
+
+ dot= 0.5f + 0.5f*INPR(nor, shi.vn);
+
+ nor[0]= shi.vn[0] + dot*nor[0];
+ nor[1]= shi.vn[1] + dot*nor[1];
+ nor[2]= shi.vn[2] + dot*nor[2];
+ VECCOPY(tno, nor);
+ }
+#endif
+}
+#endif
+
void do_material_tex(ShadeInput *shi)
{
MTex *mtex;
@@ -1460,11 +1688,15 @@
float *co = NULL, *dx = NULL, *dy = NULL;
float fact, facm, factt, facmm, stencilTin=1.0;
float texvec[3], dxt[3], dyt[3], tempvec[3], norvec[3], warpvec[3]={0.0f, 0.0f, 0.0f}, Tnor=1.0;
+ /*displacement warp vector, used by interval (relief) mapping*/
+ float dispwarpvec[3] = {0.0, 0.0, 0.0}, dispwarpnor[3];
int tex_nr, rgbnor= 0, warpdone=0;
if (R.r.scemode & R_NO_TEX) return;
/* here: test flag if there's a tex (todo) */
+ VECCOPY(dispwarpnor, shi->vn);
+
for(tex_nr=0; tex_nr<MAX_MTEX; tex_nr++) {
/* separate tex switching */
@@ -1671,6 +1903,15 @@
}
}
+#ifdef INTERVAL_MAPPING
+ if ((mtex->mapto & MAP_IDISP)) {
+ float ray[3];
+ VECCOPY(ray, shi->view);
+ do_interval_mapping(mtex, texvec, shi, ray, dispwarpvec, G.rt+5, 10, shi->facenor, dxt, dyt, dispwarpnor);
+ }
+#endif
+
+ VecAddf(texvec, texvec, dispwarpvec);
rgbnor= multitex(tex, texvec, dxt, dyt, shi->osatex, &texres);
/* texture output */
@@ -1857,12 +2098,13 @@
nor[1]= Tnor*tex->norfac*texres.nor[1];
nor[2]= Tnor*tex->norfac*texres.nor[2];
- dot= 0.5f + 0.5f*INPR(nor, shi->vn);
+ dot= 0.5f + 0.5f*INPR(nor, dispwarpnor);
- shi->vn[0]+= dot*nor[0];
- shi->vn[1]+= dot*nor[1];
- shi->vn[2]+= dot*nor[2];
- }
+ dispwarpnor[0]+= dot*nor[0];
+ dispwarpnor[1]+= dot*nor[1];
+ dispwarpnor[2]+= dot*nor[2];
+ }
+ VECCOPY(shi->vn, dispwarpnor);
Normalize(shi->vn);
/* this makes sure the bump is passed on to the next texture */
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list