[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27393] branches/render25/source/blender/ render/intern: Render Branch: render subdivide for displacement now works with orco's
Brecht Van Lommel
brecht at blender.org
Wed Mar 10 20:02:50 CET 2010
Revision: 27393
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27393
Author: blendix
Date: 2010-03-10 20:02:50 +0100 (Wed, 10 Mar 2010)
Log Message:
-----------
Render Branch: render subdivide for displacement now works with orco's
(generated coordinates), still not for uvs.
Modified Paths:
--------------
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_subdivide.c
Modified: branches/render25/source/blender/render/intern/include/object_mesh.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object_mesh.h 2010-03-10 18:05:58 UTC (rev 27392)
+++ branches/render25/source/blender/render/intern/include/object_mesh.h 2010-03-10 19:02:50 UTC (rev 27393)
@@ -40,16 +40,17 @@
struct VertRen *render_object_vert_get(struct ObjectRen *obr, int nr);
struct VlakRen *render_object_vlak_get(struct ObjectRen *obr, int nr);
-struct VertRen *render_object_vert_copy(struct ObjectRen *obr, struct VertRen *ver);
-struct VlakRen *render_object_vlak_copy(struct ObjectRen *obr, struct VlakRen *vlr);
+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);
+
/* Vertex Texture Coordinates */
float *render_vert_get_orco(struct ObjectRen *obr, struct VertRen *ver, int verify);
float *render_vert_get_sticky(struct ObjectRen *obr, struct VertRen *ver, int verify);
float *render_vert_get_stress(struct ObjectRen *obr, struct VertRen *ver, int verify);
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);
Modified: branches/render25/source/blender/render/intern/source/object.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object.c 2010-03-10 18:05:58 UTC (rev 27392)
+++ branches/render25/source/blender/render/intern/source/object.c 2010-03-10 19:02:50 UTC (rev 27393)
@@ -196,8 +196,6 @@
MEM_freeN(vertnodes[a].orco);
if(vertnodes[a].sticky)
MEM_freeN(vertnodes[a].sticky);
- if(vertnodes[a].strand)
- MEM_freeN(vertnodes[a].strand);
if(vertnodes[a].tangent)
MEM_freeN(vertnodes[a].tangent);
if(vertnodes[a].stress)
Modified: branches/render25/source/blender/render/intern/source/object_mesh.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_mesh.c 2010-03-10 18:05:58 UTC (rev 27392)
+++ branches/render25/source/blender/render/intern/source/object_mesh.c 2010-03-10 19:02:50 UTC (rev 27393)
@@ -132,7 +132,7 @@
orco= obr->vertnodes[nr].orco;
if(orco==NULL) {
if(verify)
- orco= obr->vertnodes[nr].orco= MEM_mallocN(256*RE_ORCO_ELEMS*sizeof(float), "orco table");
+ orco= obr->vertnodes[nr].orco= MEM_callocN(256*RE_ORCO_ELEMS*sizeof(float), "orco table");
else
return NULL;
}
@@ -147,7 +147,7 @@
sticky= obr->vertnodes[nr].sticky;
if(sticky==NULL) {
if(verify)
- sticky= obr->vertnodes[nr].sticky= MEM_mallocN(256*RE_STICKY_ELEMS*sizeof(float), "sticky table");
+ sticky= obr->vertnodes[nr].sticky= MEM_callocN(256*RE_STICKY_ELEMS*sizeof(float), "sticky table");
else
return NULL;
}
@@ -162,28 +162,13 @@
stress= obr->vertnodes[nr].stress;
if(stress==NULL) {
if(verify)
- stress= obr->vertnodes[nr].stress= MEM_mallocN(256*RE_STRESS_ELEMS*sizeof(float), "stress table");
+ stress= obr->vertnodes[nr].stress= MEM_callocN(256*RE_STRESS_ELEMS*sizeof(float), "stress table");
else
return NULL;
}
return stress + (ver->index & 255)*RE_STRESS_ELEMS;
}
-float *render_vert_get_strand(ObjectRen *obr, VertRen *ver, int verify)
-{
- float *strand;
- int nr= ver->index>>8;
-
- strand= obr->vertnodes[nr].strand;
- if(strand==NULL) {
- if(verify)
- strand= obr->vertnodes[nr].strand= MEM_mallocN(256*RE_STRAND_ELEMS*sizeof(float), "strand table");
- else
- return NULL;
- }
- return strand + (ver->index & 255)*RE_STRAND_ELEMS;
-}
-
/* needs calloc */
float *render_vert_get_tangent(ObjectRen *obr, VertRen *ver, int verify)
{
@@ -234,48 +219,92 @@
return winspeed + ver->index*RE_WINSPEED_ELEMS;
}
-VertRen *render_object_vert_copy(ObjectRen *obr, VertRen *ver)
+VertRen *render_object_vert_copy(ObjectRen *obrn, ObjectRen *obr, VertRen *ver)
{
- VertRen *v1= render_object_vert_get(obr, obr->totvert++);
+ VertRen *vern= render_object_vert_get(obrn, obrn->totvert++);
float *fp1, *fp2;
- int index= v1->index;
+ int index= vern->index;
- *v1= *ver;
- v1->index= index;
+ *vern= *ver;
+ vern->index= index;
fp1= render_vert_get_orco(obr, ver, 0);
if(fp1) {
- fp2= render_vert_get_orco(obr, v1, 1);
+ fp2= render_vert_get_orco(obrn, vern, 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);
+ fp2= render_vert_get_sticky(obrn, vern, 1);
memcpy(fp2, fp1, RE_STICKY_ELEMS*sizeof(float));
}
fp1= render_vert_get_stress(obr, ver, 0);
if(fp1) {
- fp2= render_vert_get_stress(obr, v1, 1);
+ fp2= render_vert_get_stress(obrn, vern, 1);
memcpy(fp2, fp1, RE_STRESS_ELEMS*sizeof(float));
}
- fp1= render_vert_get_strand(obr, ver, 0);
- if(fp1) {
- fp2= render_vert_get_strand(obr, v1, 1);
- memcpy(fp2, fp1, RE_STRAND_ELEMS*sizeof(float));
- }
fp1= render_vert_get_tangent(obr, ver, 0);
if(fp1) {
- fp2= render_vert_get_tangent(obr, v1, 1);
+ fp2= render_vert_get_tangent(obrn, vern, 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);
+ fp2= render_vert_get_strandco(obrn, vern, 1);
memcpy(fp2, fp1, RE_STRANDCO_ELEMS*sizeof(float));
}
- return v1;
+ return vern;
}
+VertRen *render_object_vert_interp(ObjectRen *obrn, ObjectRen *obr, VertRen **varray, float *warray, int totv)
+{
+ VertRen *ver= render_object_vert_get(obrn, obrn->totvert++);
+ int a;
+
+ for(a=0; a<totv; a++) {
+ VertRen *v= varray[a];
+ float w= warray[a];
+ float *from, *to;
+
+ 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))) {
+ to= render_vert_get_sticky(obrn, ver, 1);
+ madd_v2_v2fl(to, from, w);
+ }
+
+ if((from=render_vert_get_stress(obr, v, 0))) {
+ to= render_vert_get_stress(obrn, ver, 1);
+ *to= *from*w;
+ }
+
+ if((from=render_vert_get_tangent(obr, v, 0))) {
+ to= render_vert_get_tangent(obrn, ver, 1);
+ madd_v3_v3fl(to, from, w);
+ }
+
+ if((from=render_vert_get_strandco(obr, v, 0))) {
+ to= render_vert_get_strandco(obrn, ver, 1);
+ *to= *from*w;
+ }
+
+ madd_v3_v3fl(ver->co, v->co, w);
+ madd_v3_v3fl(ver->n, v->n, w);
+ }
+
+ //print_v3("orco", render_vert_get_orco(obrn, ver, 0));
+
+ normalize_v3(ver->n);
+
+ return ver;
+}
+
VertRen *render_object_vert_get(ObjectRen *obr, int nr)
{
VertRen *v;
@@ -397,41 +426,41 @@
return tangent + (vlak->index & 255)*RE_NMAP_TANGENT_ELEMS;
}
-VlakRen *render_object_vlak_copy(ObjectRen *obr, VlakRen *vlr)
+VlakRen *render_object_vlak_copy(ObjectRen *obrn, ObjectRen *obr, VlakRen *vlr)
{
- VlakRen *vlr1 = render_object_vlak_get(obr, obr->totvlak++);
+ VlakRen *vlrn = render_object_vlak_get(obrn, obrn->totvlak++);
MTFace *mtface, *mtface1;
MCol *mcol, *mcol1;
float *surfnor, *surfnor1, *tangent, *tangent1;
- int i, index = vlr1->index;
+ int i, index = vlrn->index;
char *name;
- *vlr1= *vlr;
- vlr1->index= index;
+ *vlrn= *vlr;
+ vlrn->index= index;
for (i=0; (mtface=render_vlak_get_tface(obr, vlr, i, &name, 0)) != NULL; i++) {
- mtface1= render_vlak_get_tface(obr, vlr1, i, &name, 1);
+ 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++) {
- mcol1= render_vlak_get_mcol(obr, vlr1, i, &name, 1);
+ mcol1= render_vlak_get_mcol(obrn, vlrn, i, &name, 1);
memcpy(mcol1, mcol, sizeof(MCol)*RE_MCOL_ELEMS);
}
surfnor= render_vlak_get_surfnor(obr, vlr, 0);
if(surfnor) {
- surfnor1= render_vlak_get_surfnor(obr, vlr1, 1);
+ surfnor1= render_vlak_get_surfnor(obrn, vlrn, 1);
copy_v3_v3(surfnor1, surfnor);
}
tangent= render_vlak_get_nmap_tangent(obr, vlr, 0);
if(tangent) {
- tangent1= render_vlak_get_nmap_tangent(obr, vlr1, 1);
+ tangent1= render_vlak_get_nmap_tangent(obrn, vlrn, 1);
memcpy(tangent1, tangent, sizeof(float)*RE_NMAP_TANGENT_ELEMS);
}
- return vlr1;
+ return vlrn;
}
int render_vlak_get_normal(ObjectInstanceRen *obi, VlakRen *vlr, float *nor, int quad)
@@ -526,7 +555,7 @@
for (v=0; v<vLen; v++) {
VlakRen *vlr = render_object_vlak_get(obr, startvlak + vLen*uIndex + v);
- VertRen *vert = render_object_vert_copy(obr, vlr->v2);
+ VertRen *vert = render_object_vert_copy(obr, obr, vlr->v2);
if (cyclv) {
vlr->v2 = vert;
@@ -547,7 +576,7 @@
}
if (v==0) {
- vlr->v1 = render_object_vert_copy(obr, vlr->v1);
+ vlr->v1 = render_object_vert_copy(obr, obr, vlr->v1);
}
}
}
@@ -1016,7 +1045,7 @@
v1= as_findvertex(vlr, ver, asv, thresh);
if(v1==NULL) {
/* make a new vertex */
- v1= render_object_vert_copy(obr, ver);
+ v1= render_object_vert_copy(obr, obr, ver);
}
asf->nver[b]= v1;
if(vlr->v1==ver) vlr->v1= v1;
@@ -2546,7 +2575,7 @@
if(vlr->v4) {
- vlr1= render_object_vlak_copy(obr, vlr);
+ vlr1= render_object_vlak_copy(obr, obr, vlr);
vlr1->flag |= R_FACE_SPLIT;
if( dir==2 ) vlr->flag |= R_DIVIDE_24;
@@ -2646,7 +2675,7 @@
float d1, d2;
- vlr1= render_object_vlak_copy(obr, vlr);
+ vlr1= render_object_vlak_copy(obr, obr, vlr);
vlr1->flag |= R_FACE_SPLIT;
/* split direction based on vnorms */
Modified: branches/render25/source/blender/render/intern/source/object_subdivide.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_subdivide.c 2010-03-10 18:05:58 UTC (rev 27392)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list