[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42543] trunk/blender/source: fixes scale on derivative maps

Morten Mikkelsen mikkelsen7 at gmail.com
Sat Dec 10 00:26:17 CET 2011


Revision: 42543
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42543
Author:   mmikkelsen
Date:     2011-12-09 23:26:06 +0000 (Fri, 09 Dec 2011)
Log Message:
-----------
fixes scale on derivative maps

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/gpu/GPU_material.h
    trunk/blender/source/blender/gpu/intern/gpu_codegen.c
    trunk/blender/source/blender/gpu/intern/gpu_draw.c
    trunk/blender/source/blender/gpu/intern/gpu_material.c
    trunk/blender/source/blender/python/intern/gpu.c
    trunk/blender/source/blender/render/intern/source/render_texture.c
    trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp

Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2011-12-09 21:07:37 UTC (rev 42542)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2011-12-09 23:26:06 UTC (rev 42543)
@@ -94,6 +94,7 @@
 	BVHCache bvhCache;
 	struct GPUDrawObject *drawObject;
 	DerivedMeshType type;
+	float auto_bump_scale;
 
 	/* Misc. Queries */
 
@@ -578,6 +579,7 @@
 	struct GPUVertexAttribs *gattribs, DMVertexAttribs *attribs);
 
 void DM_add_tangent_layer(DerivedMesh *dm);
+void DM_calc_auto_bump_scale(DerivedMesh *dm);
 
 /* Set object's bounding box based on DerivedMesh min/max data */
 void DM_set_object_boundbox(struct Object *ob, DerivedMesh *dm);

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2011-12-09 21:07:37 UTC (rev 42542)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2011-12-09 23:26:06 UTC (rev 42543)
@@ -184,6 +184,7 @@
 	DM_init_funcs(dm);
 	
 	dm->needsFree = 1;
+	dm->auto_bump_scale = -1.0f;
 }
 
 void DM_from_template(DerivedMesh *dm, DerivedMesh *source, DerivedMeshType type,
@@ -1831,6 +1832,159 @@
 	MEM_freeN(vtangents);
 }
 
+void DM_calc_auto_bump_scale(DerivedMesh *dm)
+{
+	int totvert= dm->getNumVerts(dm);
+	int totface= dm->getNumFaces(dm);
+
+	MVert * mvert = dm->getVertArray(dm);
+	MFace * mface = dm->getFaceArray(dm);
+	MTFace * mtface = dm->getFaceDataArray(dm, CD_MTFACE);
+
+	if(mtface)
+	{
+		double dsum = 0.0;
+		int nr_accumulated = 0;
+		int f;
+
+		for ( f=0; f<totface; f++ )
+		{
+			{
+				float * verts[4], * tex_coords[4];
+				const int nr_verts = mface[f].v4!=0 ? 4 : 3;
+				int i, is_degenerate;
+
+				verts[0]=mvert[mface[f].v1].co; verts[1]=mvert[mface[f].v2].co; verts[2]=mvert[mface[f].v3].co;
+				tex_coords[0]=mtface[f].uv[0]; tex_coords[1]=mtface[f].uv[1]; tex_coords[2]=mtface[f].uv[2];
+				if(nr_verts==4)
+				{
+					verts[3]=mvert[mface[f].v4].co;
+					tex_coords[3]=mtface[f].uv[3];
+				}
+
+				// discard degenerate faces
+				is_degenerate = 0;
+				if(	equals_v3v3(verts[0], verts[1]) || equals_v3v3(verts[0], verts[2]) || equals_v3v3(verts[1], verts[2]) ||
+					equals_v2v2(tex_coords[0], tex_coords[1]) || equals_v2v2(tex_coords[0], tex_coords[2]) || equals_v2v2(tex_coords[1], tex_coords[2]) )
+				{
+					is_degenerate = 1;
+				}
+
+				// verify last vertex as well if this is a quad
+				if ( is_degenerate==0 && nr_verts==4 )
+				{
+					if(	equals_v3v3(verts[3], verts[0]) || equals_v3v3(verts[3], verts[1]) || equals_v3v3(verts[3], verts[2]) ||
+						equals_v2v2(tex_coords[3], tex_coords[0]) || equals_v2v2(tex_coords[3], tex_coords[1]) || equals_v2v2(tex_coords[3], tex_coords[2]) )
+					{
+						is_degenerate = 1;
+					}
+
+					// verify the winding is consistent
+					if ( is_degenerate==0 )
+					{
+						float prev_edge[2];
+						int is_signed = 0;
+						sub_v2_v2v2(prev_edge, tex_coords[0], tex_coords[3]);
+
+						i = 0;
+						while ( is_degenerate==0 && i<4 )
+						{
+							float cur_edge[2], signed_area;
+							sub_v2_v2v2(cur_edge, tex_coords[(i+1)&0x3], tex_coords[i]);
+							signed_area = prev_edge[0]*cur_edge[1] - prev_edge[1]*cur_edge[0];
+							if ( i==0 ) is_signed = signed_area<0.0f ? 1 : 0;
+							else if((is_signed!=0)!=(signed_area<0.0f)) is_degenerate=1;
+
+							if ( is_degenerate==0 )
+							{
+								copy_v2_v2(prev_edge, cur_edge);
+								++i;
+							}
+						}
+					}
+				}
+
+				// proceed if not a degenerate face
+				if ( is_degenerate==0 )
+				{
+					int nr_tris_to_pile=0;
+					// quads split at shortest diagonal
+					int offs = 0;		// initial triangulation is 0,1,2 and 0, 2, 3
+					if ( nr_verts==4 )
+					{
+						float pos_len_diag0, pos_len_diag1;
+						float vtmp[3];
+						sub_v3_v3v3(vtmp, verts[2], verts[0]);
+						pos_len_diag0 = dot_v3v3(vtmp, vtmp);
+						sub_v3_v3v3(vtmp, verts[3], verts[1]);
+						pos_len_diag1 = dot_v3v3(vtmp, vtmp);
+
+						if(pos_len_diag1<pos_len_diag0)
+							offs=1;		// alter split
+						else if(pos_len_diag0==pos_len_diag1)		// do UV check instead
+						{
+							float tex_len_diag0, tex_len_diag1;
+
+							sub_v2_v2v2(vtmp, tex_coords[2], tex_coords[0]);
+							tex_len_diag0 = dot_v2v2(vtmp, vtmp);
+							sub_v2_v2v2(vtmp, tex_coords[3], tex_coords[1]);
+							tex_len_diag1 = dot_v2v2(vtmp, vtmp);
+
+							if(tex_len_diag1<tex_len_diag0)
+							{
+								offs=1;		// alter split
+							}
+						}
+					}
+					nr_tris_to_pile = nr_verts-2 ;
+					if ( nr_tris_to_pile==1 || nr_tris_to_pile==2 )
+					{
+						const int indices[] = {offs+0, offs+1, offs+2, offs+0, offs+2, (offs+3)&0x3 };
+						int t;
+						for ( t=0; t<nr_tris_to_pile; t++ )
+						{
+							float f2x_area_uv;
+							float * p0 = verts[indices[t*3+0]];
+							float * p1 = verts[indices[t*3+1]];
+							float * p2 = verts[indices[t*3+2]];
+
+							float edge_t0[2], edge_t1[2];
+							sub_v2_v2v2(edge_t0, tex_coords[indices[t*3+1]], tex_coords[indices[t*3+0]]);
+							sub_v2_v2v2(edge_t1, tex_coords[indices[t*3+2]], tex_coords[indices[t*3+0]]);
+
+							f2x_area_uv = fabsf(edge_t0[0]*edge_t1[1] - edge_t0[1]*edge_t1[0]);
+							if ( f2x_area_uv>FLT_EPSILON )
+							{
+								float norm[3], v0[3], v1[3], f2x_surf_area, fsurf_ratio;
+								sub_v3_v3v3(v0, p1, p0);
+								sub_v3_v3v3(v1, p2, p0);
+								cross_v3_v3v3(norm, v0, v1);
+
+								f2x_surf_area = len_v3(norm);
+								fsurf_ratio = f2x_surf_area/f2x_area_uv;	// tri area divided by texture area
+
+								++nr_accumulated;
+								dsum += (double)(fsurf_ratio);
+							}
+						}
+					}
+				}
+			}
+		}
+
+		// finalize
+		{
+			const float avg_area_ratio = (nr_accumulated>0) ? ((float)(dsum / nr_accumulated)) : 1.0f;
+			const float use_as_render_bump_scale = sqrtf(avg_area_ratio);		// use width of average surface ratio as your bump scale
+			dm->auto_bump_scale = use_as_render_bump_scale;
+		}
+	}
+	else
+	{
+		dm->auto_bump_scale = 1.0f;
+	}
+}
+
 void DM_vertex_attributes_from_gpu(DerivedMesh *dm, GPUVertexAttribs *gattribs, DMVertexAttribs *attribs)
 {
 	CustomData *vdata, *fdata, *tfdata = NULL;
@@ -1851,6 +2005,10 @@
 	else
 		tfdata = fdata;
 
+	/* calc auto bump scale if necessary */
+	if(dm->auto_bump_scale<=0.0f)
+		DM_calc_auto_bump_scale(dm);
+
 	/* add a tangent layer if necessary */
 	for(b = 0; b < gattribs->totlayer; b++)
 		if(gattribs->layer[b].type == CD_TANGENT)

Modified: trunk/blender/source/blender/gpu/GPU_material.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_material.h	2011-12-09 21:07:37 UTC (rev 42542)
+++ trunk/blender/source/blender/gpu/GPU_material.h	2011-12-09 23:26:06 UTC (rev 42543)
@@ -83,7 +83,8 @@
 	GPU_INVERSE_OBJECT_MATRIX = 8,
 	GPU_VIEW_POSITION = 16,
 	GPU_VIEW_NORMAL = 32,
-	GPU_OBCOLOR = 64
+	GPU_OBCOLOR = 64,
+	GPU_AUTO_BUMPSCALE = 128
 } GPUBuiltin;
 
 typedef enum GPUBlendMode {
@@ -129,7 +130,7 @@
 void GPU_materials_free(void);
 
 void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap);
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4]);
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4], float autobumpscale);
 void GPU_material_unbind(GPUMaterial *material);
 int GPU_material_bound(GPUMaterial *material);
 
@@ -162,6 +163,7 @@
 	GPU_DYNAMIC_OBJECT_VIEWIMAT = 3,
 	GPU_DYNAMIC_OBJECT_IMAT = 4,
 	GPU_DYNAMIC_OBJECT_COLOR = 5,
+	GPU_DYNAMIC_OBJECT_AUTOBUMPSCALE = 15,
 	GPU_DYNAMIC_LAMP_FIRST = 6,
 	GPU_DYNAMIC_LAMP_DYNVEC = 6,
 	GPU_DYNAMIC_LAMP_DYNCO = 7,

Modified: trunk/blender/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_codegen.c	2011-12-09 21:07:37 UTC (rev 42542)
+++ trunk/blender/source/blender/gpu/intern/gpu_codegen.c	2011-12-09 23:26:06 UTC (rev 42543)
@@ -344,6 +344,8 @@
 		return "varnormal";
 	else if(builtin == GPU_OBCOLOR)
 		return "unfobcolor";
+	else if(builtin == GPU_AUTO_BUMPSCALE)
+		return "unfobautobumpscale";
 	else
 		return "";
 }

Modified: trunk/blender/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_draw.c	2011-12-09 21:07:37 UTC (rev 42542)
+++ trunk/blender/source/blender/gpu/intern/gpu_draw.c	2011-12-09 23:26:06 UTC (rev 42543)
@@ -60,6 +60,7 @@
 #include "BKE_node.h"
 #include "BKE_object.h"
 #include "BKE_scene.h"
+#include "BKE_DerivedMesh.h"
 
 #include "BLI_threads.h"
 #include "BLI_blenlib.h"
@@ -1159,7 +1160,7 @@
 			gpumat = GPU_material_from_blender(GMS.gscene, mat);
 			GPU_material_vertex_attributes(gpumat, gattribs);
 			GPU_material_bind(gpumat, GMS.gob->lay, GMS.glay, 1.0, !(GMS.gob->mode & OB_MODE_TEXTURE_PAINT));
-			GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, GMS.gviewmat, GMS.gviewinv, GMS.gob->col);
+			GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, GMS.gviewmat, GMS.gviewinv, GMS.gob->col, GMS.gob->derivedFinal->auto_bump_scale);
 			GMS.gboundmat= mat;
 
 			/* for glsl use alpha blend mode, unless it's set to solid and

Modified: trunk/blender/source/blender/gpu/intern/gpu_material.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_material.c	2011-12-09 21:07:37 UTC (rev 42542)
+++ trunk/blender/source/blender/gpu/intern/gpu_material.c	2011-12-09 23:26:06 UTC (rev 42543)
@@ -94,7 +94,7 @@
 	/* for passing uniforms */
 	int viewmatloc, invviewmatloc;
 	int obmatloc, invobmatloc;
-	int obcolloc;
+	int obcolloc, obautobumpscaleloc;
 
 	ListBase lamps;
 };
@@ -212,7 +212,8 @@
 			material->invobmatloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_INVERSE_OBJECT_MATRIX));
 		if(material->builtins & GPU_OBCOLOR)
 			material->obcolloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_OBCOLOR));
-
+		if(material->builtins & GPU_AUTO_BUMPSCALE)
+			material->obautobumpscaleloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_AUTO_BUMPSCALE));
 		return 1;
 	}
 
@@ -273,7 +274,7 @@
 	}
 }
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list