[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