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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to