[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27517] branches/render25/source/blender/ render/intern: Render Branch: move displacement code into own file, and some code cleaning
Brecht Van Lommel
brecht at blender.org
Mon Mar 15 15:16:45 CET 2010
Revision: 27517
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27517
Author: blendix
Date: 2010-03-15 15:16:45 +0100 (Mon, 15 Mar 2010)
Log Message:
-----------
Render Branch: move displacement code into own file, and some code cleaning
for transforming mesh normals.
Modified Paths:
--------------
branches/render25/source/blender/render/intern/include/object_mesh.h
branches/render25/source/blender/render/intern/source/object_mesh.c
Added Paths:
-----------
branches/render25/source/blender/render/intern/source/object_displace.c
Modified: branches/render25/source/blender/render/intern/include/object_mesh.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object_mesh.h 2010-03-15 13:47:35 UTC (rev 27516)
+++ branches/render25/source/blender/render/intern/include/object_mesh.h 2010-03-15 14:16:45 UTC (rev 27517)
@@ -70,6 +70,8 @@
void init_render_particle_system(struct Render *re, struct ObjectRen *obr, struct ParticleSystem *psys, int timeoffset);
void finalize_render_object(struct Render *re, struct ObjectRen *obr, int timeoffset);
void render_object_calc_vnormals(struct Render *re, struct ObjectRen *obr, int do_tangent, int do_nmap_tangent);
+int render_object_has_displacement(struct Render *re, struct ObjectRen *obr);
+void render_object_displace(struct Render *re, struct ObjectRen *obr, float mat[][4], float nmat[][3]);
/* Structs */
Copied: branches/render25/source/blender/render/intern/source/object_displace.c (from rev 27515, branches/render25/source/blender/render/intern/source/object_mesh.c)
===================================================================
--- branches/render25/source/blender/render/intern/source/object_displace.c (rev 0)
+++ branches/render25/source/blender/render/intern/source/object_displace.c 2010-03-15 14:16:45 UTC (rev 27517)
@@ -0,0 +1,239 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributors: 2004/2005/2006 Blender Foundation, full recode
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_material_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+
+#include "BLI_math.h"
+
+#include "RE_shader_ext.h"
+
+#include "material.h"
+#include "object.h"
+#include "object_mesh.h"
+#include "render_types.h"
+
+int render_object_has_displacement(Render *re, ObjectRen *obr)
+{
+ /* return 1 when this object uses displacement textures. */
+ Object *ob= obr->ob;
+ Material *ma;
+ int i;
+
+ for (i=1; i<=ob->totcol; i++) {
+ ma=give_render_material(re, ob, i);
+ /* ma->mapto is ORed total of all mapto channels */
+ if(ma && (ma->mapto & MAP_DISPLACE)) return 1;
+ }
+
+ return 0;
+}
+
+static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, VertRen *vr, int vindex, float *scale, float mat[][4], float nmat[][3], float *sample)
+{
+ MTFace *tface;
+ VlakRen *vlr= shi->primitive.vlr;
+ short texco= shi->material.mat->texco;
+ float displace[3], *orco;
+ char *name;
+ int i;
+
+ /* shi->geometry.co is current render coord, just make sure at least some vector is here */
+ copy_v3_v3(shi->geometry.co, vr->co);
+ /* vertex normal is used for textures type 'col' and 'var' */
+ copy_v3_v3(shi->geometry.vn, (vlr->flag & R_SMOOTH)? vr->n: vlr->n);
+
+ if(mat)
+ mul_m4_v3(mat, shi->geometry.co);
+ if(nmat)
+ mul_m3_v3(nmat, shi->geometry.vn);
+
+ if (texco & TEXCO_UV) {
+ shi->texture.totuv= 0;
+ shi->texture.actuv= obr->actmtface;
+
+ for (i=0; (tface=render_vlak_get_tface(obr, vlr, i, &name, 0)); i++) {
+ ShadeInputUV *suv= &shi->texture.uv[i];
+
+ /* shi.uv needs scale correction from tface uv */
+ suv->uv[0]= 2*tface->uv[vindex][0]-1.0f;
+ suv->uv[1]= 2*tface->uv[vindex][1]-1.0f;
+ suv->uv[2]= 0.0f;
+ suv->name= name;
+ shi->texture.totuv++;
+ }
+ }
+
+ /* set all rendercoords, 'texco' is an ORed value for all textures needed */
+ if (texco & TEXCO_ORCO) {
+ orco= render_vert_get_orco(obr, vr, 0);
+ if(orco)
+ copy_v3_v3(shi->texture.lo, orco);
+ }
+ if (texco & TEXCO_STICKY) {
+ float *sticky= render_vert_get_sticky(obr, vr, 0);
+ if(sticky) {
+ shi->texture.sticky[0]= sticky[0];
+ shi->texture.sticky[1]= sticky[1];
+ shi->texture.sticky[2]= 0.0f;
+ }
+ }
+ if (texco & TEXCO_GLOB) {
+ copy_v3_v3(shi->texture.gl, shi->geometry.co);
+ mul_m4_v3(re->cam.viewinv, shi->texture.gl);
+ }
+ if (texco & TEXCO_NORM) {
+ copy_v3_v3(shi->texture.orn, shi->geometry.vn);
+ }
+ if(texco & TEXCO_REFL) {
+ /* not (yet?) */
+ }
+
+ mat_displacement(re, shi, displace);
+
+ //printf("no=%f, %f, %f\nbefore co=%f, %f, %f\n", vr->n[0], vr->n[1], vr->n[2],
+ //vr->co[0], vr->co[1], vr->co[2]);
+
+ mul_v3_v3(displace, scale);
+
+ if(mat)
+ mul_m3_v3(nmat, displace);
+
+ /* 0.5 could become button once? */
+ vr->co[0] += displace[0];
+ vr->co[1] += displace[1];
+ vr->co[2] += displace[2];
+
+ //printf("after co=%f, %f, %f\n", vr->co[0], vr->co[1], vr->co[2]);
+
+ /* we just don't do this vertex again, bad luck for other face using same vertex with
+ different material... */
+ vr->flag |= 1;
+
+ /* Pass sample back so displace_face can decide which way to split the quad */
+ /* Should be sqrt(sample), but I'm only looking for "bigger". Save the cycles. */
+ 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 nmat[][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 */
+ memset(&shi, 0, sizeof(ShadeInput));
+ /* end warning! - Campbell */
+
+ /* set up shadeinput struct for multitex() */
+
+ /* memset above means we dont need this */
+ /*shi.osatex= 0;*/ /* signal not to use dx[] and dy[] texture AA vectors */
+
+ shi.primitive.obr= obr;
+ shi.primitive.vlr= vlr; /* current render face */
+ shi.material.mat= vlr->mat; /* current input material */
+ shi.shading.thread= 0;
+
+ /* TODO, assign these, displacement with new bumpmap is skipped without - campbell */
+#if 0
+ /* order is not known ? */
+ shi.primitive.v1= v1;
+ shi.primitive.v2= v2;
+ shi.primitive.v3= v3;
+#endif
+
+ /* Displace the verts, flag is set when done */
+ if(!v1->flag)
+ displace_render_vert(re, obr, &shi, v1,0, scale, mat, nmat, sample);
+
+ if(!v2->flag)
+ displace_render_vert(re, obr, &shi, v2, 1, scale, mat, nmat, sample);
+
+ if(!v3->flag)
+ displace_render_vert(re, obr, &shi, v3, 2, scale, mat, nmat, sample);
+
+ if(v4) {
+ if(!v4->flag)
+ displace_render_vert(re, obr, &shi, v4, 3, scale, mat, nmat, sample);
+
+ /* closest in displace value. This will help smooth edges. */
+ 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(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);
+}
+
+void render_object_displace(Render *re, ObjectRen *obr, float mat[][4], float nmat[][3])
+{
+ Object *obt;
+ VlakRen *vlr;
+ VertRen *vr;
+ float scale[3]={1.0f, 1.0f, 1.0f}, temp[3], *sample;
+ int i;
+
+ sample= MEM_callocN(sizeof(float)*obr->totvert, "render_object_displace sample");
+
+ /* Object Size with parenting */
+ obt=obr->ob;
+ while(obt){
+ add_v3_v3v3(temp, obt->size, obt->dsize);
+ scale[0]*=temp[0]; scale[1]*=temp[1]; scale[2]*=temp[2];
+ obt=obt->parent;
+ }
+
+ /* Clear all flags */
+ for(i=0; i<obr->totvert; i++){
+ vr= render_object_vert_get(obr, i);
+ vr->flag= 0;
+ }
+
+ for(i=0; i<obr->totvlak; i++){
+ vlr=render_object_vlak_get(obr, i);
+ displace_render_face(re, obr, vlr, scale, mat, nmat, sample);
+ }
+
+ MEM_freeN(sample);
+
+ /* Recalc vertex normals */
+ render_object_calc_vnormals(re, obr, 0, 0);
+}
+
Modified: branches/render25/source/blender/render/intern/source/object_mesh.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_mesh.c 2010-03-15 13:47:35 UTC (rev 27516)
+++ branches/render25/source/blender/render/intern/source/object_mesh.c 2010-03-15 14:16:45 UTC (rev 27517)
@@ -1145,12 +1145,13 @@
{
Object *ob= obr->ob;
HaloRen *har;
- float xn, yn, zn, nor[3], view[3];
- float vec[3], hasize, mat[4][4], imat[3][3];
+ float dt, nor[3], view[3];
+ float vec[3], hasize, mat[4][4], nmat[3][3];
int a, ok, seed= ma->seed1;
mul_m4_m4m4(mat, ob->obmat, re->cam.viewmat);
- copy_m3_m4(imat, ob->imat);
+ copy_m3_m4(nmat, ob->imat);
+ transpose_m3(nmat);
re->params.flag |= R_HALO;
@@ -1164,22 +1165,16 @@
mul_m4_v3(mat, vec);
if(ma->mode & MA_HALOPUNO) {
- xn= mvert->no[0];
- yn= mvert->no[1];
- zn= mvert->no[2];
-
- /* transpose ! */
- nor[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
- nor[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
- nor[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
+ normal_short_to_float_v3(nor, mvert->no);
+ mul_m3_v3(nmat, nor);
normalize_v3(nor);
copy_v3_v3(view, vec);
normalize_v3(view);
- zn= nor[0]*view[0]+nor[1]*view[1]+nor[2]*view[2];
- if(zn>=0.0) hasize= 0.0;
- else hasize*= zn*zn*zn*zn;
+ dt= dot_v3v3(nor, view);
+ if(dt>=0.0) hasize= 0.0;
+ else hasize*= dt*dt*dt*dt;
}
if(orco) har= halo_init(re, obr, ma, vec, NULL, orco, hasize, 0.0, seed);
@@ -1192,210 +1187,6 @@
}
/* ------------------------------------------------------------------------- */
-/* Displacement Mapping */
-/* ------------------------------------------------------------------------- */
-
-static short test_for_displace(Render *re, Object *ob)
-{
- /* return 1 when this object uses displacement textures. */
- Material *ma;
- int i;
-
- for (i=1; i<=ob->totcol; i++) {
- ma=give_render_material(re, ob, i);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list