[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12283] branches/qdune/blender:
Brecht Van Lommel
brechtvanlommel at pandora.be
Thu Oct 18 18:35:49 CEST 2007
Revision: 12283
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12283
Author: blendix
Date: 2007-10-18 18:35:49 +0200 (Thu, 18 Oct 2007)
Log Message:
-----------
QDune Branch
============
Stress and sticky support for polygons, tanget shading for curves.
Fix an msvc error compile error with log().
Modified Paths:
--------------
branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp
branches/qdune/blender/extern/qdune/core/RenderBucket.cpp
branches/qdune/blender/extern/qdune/ribparse/ri.h
branches/qdune/blender/source/blender/blenkernel/intern/customdata.c
branches/qdune/blender/source/blender/makesdna/DNA_customdata_types.h
branches/qdune/blender/source/blender/render/intern/include/renderinterface.h
branches/qdune/blender/source/blender/render/intern/source/blenderinterface.c
branches/qdune/blender/source/blender/render/intern/source/convertblender.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/shadeinput.c
Modified: branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp
===================================================================
--- branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp 2007-10-18 13:51:10 UTC (rev 12282)
+++ branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp 2007-10-18 16:35:49 UTC (rev 12283)
@@ -39,6 +39,7 @@
RtNormal nor;
RtVector *orco = NULL, *orcodu = NULL, *orcodv = NULL;
RtVector *win = NULL, *windu = NULL, *windv = NULL;
+ RtVector *sticky = NULL, *stickydu = NULL, *stickydv = NULL;
RtFloat *stress = NULL;
RtVector *uv[8], *uvdu[8], *uvdv[8];
float du, dv;
@@ -47,9 +48,13 @@
ShadeInput shi;
ShadeResult shr;
- blenderShadeInit(BLENDER_THREAD, &shi, &shr, blender_object);
mat = (Material*)blender_material[0];
+
n = grid->get_nverts();
+ du = grid->get_du();
+ dv = grid->get_dv();
+ xdim = grid->get_xdim();
+ ydim = grid->get_ydim();
P = (RtPoint*)grid->findVariable("P");
N = (RtNormal*)grid->findVariable("N");
@@ -60,6 +65,9 @@
dPdu = (RtVector*)grid->findVariable("dPdu");
dPdv = (RtVector*)grid->findVariable("dPdv");
+ blenderShadeInit(BLENDER_THREAD, &shi, &shr, blender_object,
+ (xdim==0 && (mat->mode & MA_TANGENT_STR)));
+
/* shade_input_set_triangle_i */
shi.mat= shi.mat_override? shi.mat_override: mat;
shi.osatex= (shi.mat->texco & TEXCO_OSA);
@@ -72,11 +80,6 @@
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) {
orco = (float(*)[3])grid->findVariable("orco");
@@ -110,6 +113,7 @@
}
}
}
+
if(texco & TEXCO_STRESS)
stress = (float*)grid->findVariable("stress");
@@ -146,10 +150,25 @@
}
}
+ if(texco & TEXCO_STICKY) {
+ sticky = (float(*)[3])grid->findVariable("sticky");
+ if(shi.osatex && sticky) {
+ stickydu = new RtVector[n];
+ stickydv = new RtVector[n];
+
+ grid->DuV(stickydu, sticky);
+ grid->DvV(stickydv, sticky);
+ }
+ }
+
/* loop over each micropolygon grid vertex */
for (i=0; i<n; i++) {
/* shadeinput_set_normals */
- vnormalize(nor, N[i]);
+ if(xdim==0 && mode & MA_TANGENT_STR)
+ vnormalize(nor, dPdv[i]);
+ else
+ vnormalize(nor, N[i]);
+
nor[0]= -nor[0];
nor[1]= -nor[1];
nor[2]= nor[2];
@@ -190,6 +209,10 @@
shi.vno[1]= shi.vn[1];
shi.vno[2]= shi.vn[2];
+ /* tangent */
+ if(mode & (MA_TANGENT_V|MA_NORMAP_TANG))
+ vnormalize(shi.tang, dPdv[i]);
+
/* texture coordinates */
if((texco & TEXCO_ORCO) && orco) {
shi.lo[0]= orco[i][0];
@@ -305,6 +328,22 @@
}
}
+ /* sticky */
+ if(texco & TEXCO_STICKY && sticky) {
+ /* TODO this is wrong, not view corrected at all now */
+ shi.sticky[0]= sticky[i][0];
+ shi.sticky[1]= sticky[i][1];
+
+#if 0
+ if(shi.osatex) {
+ shi.dxsticky[0]= stickydu[i][0];
+ shi.dxsticky[1]= stickydu[i][1];
+ shi.dysticky[0]= stickydv[i][0];
+ shi.dysticky[1]= stickydv[i][1];
+ }
+#endif
+ }
+
/* run the actual shader */
if(displacement) {
RtVector displacement;
@@ -338,6 +377,8 @@
if(win) delete [] win;
if(windu) delete [] windu;
if(windv) delete [] windv;
+ if(stickydu) delete [] stickydu;
+ if(stickydv) delete [] stickydv;
for(a=0; a<8; a++) {
if(uvdu[a]) {
Modified: branches/qdune/blender/extern/qdune/core/RenderBucket.cpp
===================================================================
--- branches/qdune/blender/extern/qdune/core/RenderBucket.cpp 2007-10-18 13:51:10 UTC (rev 12282)
+++ branches/qdune/blender/extern/qdune/core/RenderBucket.cpp 2007-10-18 16:35:49 UTC (rev 12283)
@@ -167,7 +167,7 @@
hilbert(buckets, 1, init_angle, level);
}
else { // peano
- const int level = int(1 + log(MAX2(bk_maxX, bk_maxY))/log(3));
+ const int level = int(1 + log((float)MAX2(bk_maxX, bk_maxY))/log(3.0f));
peano(buckets, -1, init_angle, level);
}
}
Modified: branches/qdune/blender/extern/qdune/ribparse/ri.h
===================================================================
--- branches/qdune/blender/extern/qdune/ribparse/ri.h 2007-10-18 13:51:10 UTC (rev 12282)
+++ branches/qdune/blender/extern/qdune/ribparse/ri.h 2007-10-18 16:35:49 UTC (rev 12283)
@@ -464,7 +464,7 @@
typedef RtInt (*RtBlenderTestBreak)(RtBlenderThread*);
typedef RtVoid* (*RtBlenderShadeInit)(RtBlenderThread*,
- RtBlenderShadeInput*, RtBlenderShadeResult*, RtVoid*);
+ RtBlenderShadeInput*, RtBlenderShadeResult*, RtVoid*, RtInt);
typedef RtVoid (*RtBlenderShade)(RtBlenderThread*,
RtBlenderShadeInput*, RtBlenderShadeResult*);
Modified: branches/qdune/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/qdune/blender/source/blender/blenkernel/intern/customdata.c 2007-10-18 13:51:10 UTC (rev 12282)
+++ branches/qdune/blender/source/blender/blenkernel/intern/customdata.c 2007-10-18 16:35:49 UTC (rev 12283)
@@ -371,11 +371,13 @@
{sizeof(MIntProperty), "MIntProperty",1,"Int",NULL,NULL,NULL,NULL},
{sizeof(MStringProperty), "MStringProperty",1,"String",NULL,NULL,NULL,NULL},
{sizeof(float)*3, "", 0, "", NULL, NULL, NULL, NULL},
+ {sizeof(float)*2, "", 0, "", NULL, NULL, NULL, NULL},
};
const char *LAYERTYPENAMES[CD_NUMTYPES] = {
"CDMVert", "CDMSticky", "CDMDeformVert", "CDMEdge", "CDMFace", "CDMTFace",
- "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags","CDMFloatProperty","CDMIntProperty","CDMStringProperty", "CDOrco"};
+ "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags","CDMFloatProperty",
+ "CDMIntProperty","CDMStringProperty", "CDOrco", "CDStress"};
const CustomDataMask CD_MASK_BAREMESH =
CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE;
Modified: branches/qdune/blender/source/blender/makesdna/DNA_customdata_types.h
===================================================================
--- branches/qdune/blender/source/blender/makesdna/DNA_customdata_types.h 2007-10-18 13:51:10 UTC (rev 12282)
+++ branches/qdune/blender/source/blender/makesdna/DNA_customdata_types.h 2007-10-18 16:35:49 UTC (rev 12283)
@@ -68,7 +68,8 @@
#define CD_PROP_INT 11
#define CD_PROP_STR 12
#define CD_ORCO 13
-#define CD_NUMTYPES 14
+#define CD_STRESS 14
+#define CD_NUMTYPES 15
/* Bits for CustomDataMask */
#define CD_MASK_MVERT (1 << CD_MVERT)
@@ -84,6 +85,8 @@
#define CD_MASK_PROP_FLT (1 << CD_PROP_FLT)
#define CD_MASK_PROP_INT (1 << CD_PROP_INT)
#define CD_MASK_PROP_STR (1 << CD_PROP_STR)
+#define CD_MASK_ORCO (1 << CD_ORCO)
+#define CD_MASK_STRESS (1 << CD_STRESS)
/* CustomData.flag */
Modified: branches/qdune/blender/source/blender/render/intern/include/renderinterface.h
===================================================================
--- branches/qdune/blender/source/blender/render/intern/include/renderinterface.h 2007-10-18 13:51:10 UTC (rev 12282)
+++ branches/qdune/blender/source/blender/render/intern/include/renderinterface.h 2007-10-18 16:35:49 UTC (rev 12283)
@@ -58,9 +58,6 @@
float autosmooth_threshold; /* threshold */
int do_subsurf; /* do subsurf for micropolygons */
-
- float texspace_loc[3]; /* texture space */
- float texspace_size[3];
} RenderMesh;
typedef struct RenderVertex {
@@ -68,6 +65,7 @@
float n[3]; /* optional normal (see mesh comments above) */
float *sticky; /* sticky texture coordinates */
float *orco; /* orco texture coordinates */
+ float *stress; /* stress texture coordinates */
} RenderVertex;
typedef struct RenderFaceData {
@@ -172,7 +170,8 @@
int render_interface_test_break(RenderThread *thread);
void render_interface_shade_init(RenderThread *thread,
- struct ShadeInput *shi, struct ShadeResult *shr, struct ObjectRen *obr);
+ struct ShadeInput *shi, struct ShadeResult *shr, struct ObjectRen *obr,
+ int tangent);
void render_interface_shade(RenderThread *thread,
struct ShadeInput *shi, struct ShadeResult *shr);
Modified: branches/qdune/blender/source/blender/render/intern/source/blenderinterface.c
===================================================================
--- branches/qdune/blender/source/blender/render/intern/source/blenderinterface.c 2007-10-18 13:51:10 UTC (rev 12282)
+++ branches/qdune/blender/source/blender/render/intern/source/blenderinterface.c 2007-10-18 16:35:49 UTC (rev 12283)
@@ -39,78 +39,6 @@
return 0;
}
-/* ------------------------------------------------------------------------- */
-
-static void calc_edge_stress_add(float *accum, VertRen *v1, VertRen *v2)
-{
- float len= VecLenf(v1->co, v2->co)/VecLenf(v1->orco, v2->orco);
- float *acc;
-
- acc= accum + 2*v1->index;
- acc[0]+= len;
- acc[1]+= 1.0f;
-
- acc= accum + 2*v2->index;
- acc[0]+= len;
- acc[1]+= 1.0f;
-}
-
-static void calc_edge_stress(Render *re, float *loc, float *size, int startvert, int startface)
-{
- float *accum, *acc, *accumoffs, *stress;
- int a;
-
- if(startvert==re->totvert) return;
-
- accum= MEM_callocN(2*sizeof(float)*(re->totvert-startvert), "temp accum for stress");
-
- /* de-normalize orco */
- for(a=startvert; a<re->totvert; a++) {
- VertRen *ver= RE_findOrAddVert(re, a);
- if(ver->orco) {
- ver->orco[0]= ver->orco[0]*size[0] +loc[0];
- ver->orco[1]= ver->orco[1]*size[1] +loc[1];
- ver->orco[2]= ver->orco[2]*size[2] +loc[2];
- }
- }
-
- /* add stress values */
- accumoffs= accum - 2*startvert; /* so we can use vertex index */
- for(a=startface; a<re->totvlak; a++) {
- VlakRen *vlr= RE_findOrAddVlak(re, a);
-
- if(vlr->v1->orco && vlr->v4) {
- calc_edge_stress_add(accumoffs, vlr->v1, vlr->v2);
- calc_edge_stress_add(accumoffs, vlr->v2, vlr->v3);
- calc_edge_stress_add(accumoffs, vlr->v3, vlr->v1);
- if(vlr->v4) {
- calc_edge_stress_add(accumoffs, vlr->v3, vlr->v4);
- calc_edge_stress_add(accumoffs, vlr->v4, vlr->v1);
- calc_edge_stress_add(accumoffs, vlr->v2, vlr->v4);
- }
- }
- }
-
- for(a=startvert; a<re->totvert; a++) {
- VertRen *ver= RE_findOrAddVert(re, a);
- if(ver->orco) {
- /* find stress value */
- acc= accumoffs + 2*ver->index;
- if(acc[1]!=0.0f)
- acc[0]/= acc[1];
- stress= RE_vertren_get_stress(re, ver, 1);
- *stress= *acc;
-
- /* restore orcos */
- ver->orco[0] = (ver->orco[0]-loc[0])/size[0];
- ver->orco[1] = (ver->orco[1]-loc[1])/size[1];
- ver->orco[2] = (ver->orco[2]-loc[2])/size[2];
- }
- }
-
- MEM_freeN(accum);
-}
-
/* gets tangent from tface or orco */
static void calc_tangent_vector(Render *re, VlakRen *vlr)
{
@@ -1024,7 +952,7 @@
RenderMesh *mesh= bcontext->mesh;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list