[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27389] branches/render25/source/blender/ render/intern: Render Branch: strand coords now use same storage system as others tex coords.
Brecht Van Lommel
brecht at blender.org
Wed Mar 10 16:12:56 CET 2010
Revision: 27389
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27389
Author: blendix
Date: 2010-03-10 16:12:56 +0100 (Wed, 10 Mar 2010)
Log Message:
-----------
Render Branch: strand coords now use same storage system as others tex coords.
Modified Paths:
--------------
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.c
branches/render25/source/blender/render/intern/source/object_mesh.c
branches/render25/source/blender/render/intern/source/object_particle.c
branches/render25/source/blender/render/intern/source/object_subdivide.c
branches/render25/source/blender/render/intern/source/shadeinput.c
Modified: branches/render25/source/blender/render/intern/include/object.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object.h 2010-03-10 15:11:24 UTC (rev 27388)
+++ branches/render25/source/blender/render/intern/include/object.h 2010-03-10 15:12:56 UTC (rev 27389)
@@ -166,6 +166,7 @@
#define RE_SIMPLIFY_ELEMS 2
#define RE_FACE_ELEMS 1
#define RE_NMAP_TANGENT_ELEMS 12
+#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-10 15:11:24 UTC (rev 27388)
+++ branches/render25/source/blender/render/intern/include/object_mesh.h 2010-03-10 15:12:56 UTC (rev 27389)
@@ -51,6 +51,7 @@
float *render_vert_get_rad(struct ObjectRen *obr, struct VertRen *ver, int verify);
float *render_vert_get_strand(struct ObjectRen *obr, struct VertRen *ver, int verify);
float *render_vert_get_tangent(struct ObjectRen *obr, struct VertRen *ver, int verify);
+float *render_vert_get_strandco(struct ObjectRen *obr, struct VertRen *ver, int verify);
float *render_vert_get_winspeed(struct ObjectInstanceRen *obi, struct VertRen *ver, int verify);
/* Face Texture Coordinates */
@@ -78,6 +79,7 @@
float *tangent;
float *stress;
float *winspeed;
+ float *strandco;
} VertTableNode;
typedef struct VlakTableNode {
@@ -93,7 +95,6 @@
float co[3];
float n[3];
unsigned short flag; /* in use for temp setting stuff in object_mesh.c */
- float accum; /* for strand texco static particles */
int index; /* index allows extending vertren with any property */
} VertRen;
Modified: branches/render25/source/blender/render/intern/source/object.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object.c 2010-03-10 15:11:24 UTC (rev 27388)
+++ branches/render25/source/blender/render/intern/source/object.c 2010-03-10 15:12:56 UTC (rev 27389)
@@ -204,6 +204,8 @@
MEM_freeN(vertnodes[a].stress);
if(vertnodes[a].winspeed)
MEM_freeN(vertnodes[a].winspeed);
+ if(vertnodes[a].strandco)
+ MEM_freeN(vertnodes[a].strandco);
}
MEM_freeN(vertnodes);
Modified: branches/render25/source/blender/render/intern/source/object_mesh.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_mesh.c 2010-03-10 15:11:24 UTC (rev 27388)
+++ branches/render25/source/blender/render/intern/source/object_mesh.c 2010-03-10 15:12:56 UTC (rev 27389)
@@ -200,6 +200,21 @@
return tangent + (ver->index & 255)*RE_TANGENT_ELEMS;
}
+float *render_vert_get_strandco(ObjectRen *obr, VertRen *ver, int verify)
+{
+ float *strandco;
+ int nr= ver->index>>8;
+
+ strandco= obr->vertnodes[nr].strandco;
+ if(strandco==NULL) {
+ if(verify)
+ strandco= obr->vertnodes[nr].strandco= MEM_callocN(256*RE_STRANDCO_ELEMS*sizeof(float), "strandco table");
+ else
+ return NULL;
+ }
+ return strandco + (ver->index & 255)*RE_STRANDCO_ELEMS;
+}
+
/* needs calloc! not all renderverts have them */
/* also winspeed is exception, it is stored per instance */
float *render_vert_get_winspeed(ObjectInstanceRen *obi, VertRen *ver, int verify)
@@ -228,6 +243,11 @@
*v1= *ver;
v1->index= index;
+ fp1= render_vert_get_orco(obr, ver, 0);
+ if(fp1) {
+ fp2= render_vert_get_orco(obr, v1, 1);
+ memcpy(fp2, fp1, RE_ORCO_ELEMS*sizeof(float));
+ }
fp1= render_vert_get_sticky(obr, ver, 0);
if(fp1) {
fp2= render_vert_get_sticky(obr, v1, 1);
@@ -248,6 +268,11 @@
fp2= render_vert_get_tangent(obr, v1, 1);
memcpy(fp2, fp1, RE_TANGENT_ELEMS*sizeof(float));
}
+ fp1= render_vert_get_strandco(obr, ver, 0);
+ if(fp1) {
+ fp2= render_vert_get_strandco(obr, v1, 1);
+ memcpy(fp2, fp1, RE_STRANDCO_ELEMS*sizeof(float));
+ }
return v1;
}
@@ -1102,11 +1127,11 @@
return 0;
}
-static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, VertRen *vr, int vindex, float *scale, float mat[][4], float imat[][3])
+static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, VertRen *vr, int vindex, float *scale, float mat[][4], float imat[][3], float *sample)
{
MTFace *tface;
short texco= shi->material.mat->texco;
- float sample=0, displace[3], *orco;
+ float displace[3], *orco;
char *name;
int i;
@@ -1187,18 +1212,17 @@
vr->flag |= 1;
/* Pass sample back so displace_face can decide which way to split the quad */
- sample = shi->texture.displace[0]*shi->texture.displace[0];
- sample += shi->texture.displace[1]*shi->texture.displace[1];
- sample += shi->texture.displace[2]*shi->texture.displace[2];
-
- vr->accum=sample;
/* Should be sqrt(sample), but I'm only looking for "bigger". Save the cycles. */
- return;
+ sample[vr->index]= dot_v3v3(shi->texture.displace, shi->texture.displace);
}
-static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float *scale, float mat[][4], float imat[][3])
+static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float *scale, float mat[][4], float imat[][3], float *sample)
{
ShadeInput shi;
+ VertRen *v1= vlr->v1;
+ VertRen *v2= vlr->v2;
+ VertRen *v3= vlr->v3;
+ VertRen *v4= vlr->v4;
/* Warning, This is not that nice, and possibly a bit slow,
however some variables were not initialized properly in, unless using shade_input_initialize(...), we need to do a memset */
@@ -1218,48 +1242,47 @@
/* TODO, assign these, displacement with new bumpmap is skipped without - campbell */
#if 0
/* order is not known ? */
- shi.primitive.v1= vlr->v1;
- shi.primitive.v2= vlr->v2;
- shi.primitive.v3= vlr->v3;
+ shi.primitive.v1= v1;
+ shi.primitive.v2= v2;
+ shi.primitive.v3= v3;
#endif
/* Displace the verts, flag is set when done */
- if (!vlr->v1->flag)
- displace_render_vert(re, obr, &shi, vlr->v1,0, scale, mat, imat);
+ if(!v1->flag)
+ displace_render_vert(re, obr, &shi, v1,0, scale, mat, imat, sample);
- if (!vlr->v2->flag)
- displace_render_vert(re, obr, &shi, vlr->v2, 1, scale, mat, imat);
+ if(!v2->flag)
+ displace_render_vert(re, obr, &shi, v2, 1, scale, mat, imat, sample);
- if (!vlr->v3->flag)
- displace_render_vert(re, obr, &shi, vlr->v3, 2, scale, mat, imat);
+ if(!v3->flag)
+ displace_render_vert(re, obr, &shi, v3, 2, scale, mat, imat, sample);
- if (vlr->v4) {
- if (!vlr->v4->flag)
- displace_render_vert(re, obr, &shi, vlr->v4, 3, scale, mat, imat);
+ if(v4) {
+ if(!v4->flag)
+ displace_render_vert(re, obr, &shi, v4, 3, scale, mat, imat, sample);
/* closest in displace value. This will help smooth edges. */
- if ( fabs(vlr->v1->accum - vlr->v3->accum) > fabs(vlr->v2->accum - vlr->v4->accum))
+ if(fabs(sample[v1->index] - sample[v3->index]) > fabs(sample[v2->index] - sample[v4->index]))
vlr->flag |= R_DIVIDE_24;
else vlr->flag &= ~R_DIVIDE_24;
}
/* Recalculate the face normal - if flipped before, flip now */
- if(vlr->v4) {
- normal_quad_v3( vlr->n,vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
- }
- else {
- normal_tri_v3( vlr->n,vlr->v3->co, vlr->v2->co, vlr->v1->co);
- }
+ if(v4)
+ normal_quad_v3(vlr->n, v4->co, v3->co, v2->co, v1->co);
+ else
+ normal_tri_v3(vlr->n, v3->co, v2->co, v1->co);
}
static void do_displacement(Render *re, ObjectRen *obr, float mat[][4], float imat[][3])
{
+ Object *obt;
+ VlakRen *vlr;
VertRen *vr;
- VlakRen *vlr;
-// float min[3]={1e30, 1e30, 1e30}, max[3]={-1e30, -1e30, -1e30};
- float scale[3]={1.0f, 1.0f, 1.0f}, temp[3];//, xn
- int i; //, texflag=0;
- Object *obt;
+ float scale[3]={1.0f, 1.0f, 1.0f}, temp[3], *sample;
+ int i;
+
+ sample= MEM_callocN(sizeof(float)*obr->totvert, "do_displacement sample");
/* Object Size with parenting */
obt=obr->ob;
@@ -1277,8 +1300,10 @@
for(i=0; i<obr->totvlak; i++){
vlr=render_object_vlak_get(obr, i);
- displace_render_face(re, obr, vlr, scale, mat, imat);
+ displace_render_face(re, obr, vlr, scale, mat, imat, sample);
}
+
+ MEM_freeN(sample);
/* Recalc vertex normals */
render_object_calc_vnormals(re, obr, 0, 0);
Modified: branches/render25/source/blender/render/intern/source/object_particle.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_particle.c 2010-03-10 15:11:24 UTC (rev 27388)
+++ branches/render25/source/blender/render/intern/source/object_particle.c 2010-03-10 15:12:56 UTC (rev 27389)
@@ -134,25 +134,25 @@
add_v3_v3v3(vlr->v1->co, vlr->v1->co, cross);
copy_v3_v3(vlr->v1->n, nor);
copy_v3_v3(render_vert_get_orco(obr, vlr->v1, 1), sd->orco);
- vlr->v1->accum= -1.0f; // accum abuse for strand texco
+ *render_vert_get_strandco(obr, vlr->v1, 1)= -1.0f;
copy_v3_v3(vlr->v2->co, vec);
sub_v3_v3v3(vlr->v2->co, vlr->v2->co, cross);
copy_v3_v3(vlr->v2->n, nor);
copy_v3_v3(render_vert_get_orco(obr, vlr->v2, 1), sd->orco);
- vlr->v2->accum= vlr->v1->accum;
+ *render_vert_get_strandco(obr, vlr->v2, 1)= -1.0f;
copy_v3_v3(vlr->v4->co, vec1);
add_v3_v3v3(vlr->v4->co, vlr->v4->co, cross);
copy_v3_v3(vlr->v4->n, nor);
copy_v3_v3(render_vert_get_orco(obr, vlr->v4, 1), sd->orco);
- vlr->v4->accum= 1.0f; // accum abuse for strand texco
+ *render_vert_get_strandco(obr, vlr->v4, 1)= 1.0f;
copy_v3_v3(vlr->v3->co, vec1);
sub_v3_v3v3(vlr->v3->co, vlr->v3->co, cross);
copy_v3_v3(vlr->v3->n, nor);
copy_v3_v3(render_vert_get_orco(obr, vlr->v3, 1), sd->orco);
- vlr->v3->accum= vlr->v4->accum;
+ *render_vert_get_strandco(obr, vlr->v3, 1)= 1.0f;
normal_quad_v3( vlr->n,vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
@@ -208,13 +208,13 @@
add_v3_v3v3(v1->co, v1->co, cross);
copy_v3_v3(v1->n, nor);
copy_v3_v3(render_vert_get_orco(obr, v1, 1), sd->orco);
- v1->accum= -1.0f; // accum abuse for strand texco
+ *render_vert_get_strandco(obr, v1, 1)= -1.0f;
copy_v3_v3(v2->co, vec);
sub_v3_v3v3(v2->co, v2->co, cross);
copy_v3_v3(v2->n, nor);
copy_v3_v3(render_vert_get_orco(obr, v2, 1), sd->orco);
- v2->accum= v1->accum;
+ *render_vert_get_strandco(obr, v2, 1)= -1.0f;
}
/* more vertices & faces to strand */
else {
@@ -270,13 +270,13 @@
add_v3_v3v3(vlr->v4->co, vlr->v4->co, cross);
copy_v3_v3(vlr->v4->n, nor);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list