[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13816] trunk/blender: * Displacement baking wasnt working with negative distances.

Campbell Barton ideasman42 at gmail.com
Fri Feb 22 15:27:47 CET 2008


Revision: 13816
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13816
Author:   campbellbarton
Date:     2008-02-22 15:27:46 +0100 (Fri, 22 Feb 2008)

Log Message:
-----------
* Displacement baking wasnt working with negative distances.
* Added Normalize option for diplacement so everything in the 'Dist' range is mapped 0-1
* Increased the maximum Dist and Bias to1000.0 (was 10.0)
* Added python utility function in BPyRender.py - bakeToPlane(...), to automate heightmap, normalmap generation for Crystalspace.

Modified Paths:
--------------
    trunk/blender/release/scripts/bpymodules/BPyRender.py
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/python/api2_2x/sceneRender.c
    trunk/blender/source/blender/render/intern/source/rendercore.c
    trunk/blender/source/blender/src/buttons_scene.c

Modified: trunk/blender/release/scripts/bpymodules/BPyRender.py
===================================================================
--- trunk/blender/release/scripts/bpymodules/BPyRender.py	2008-02-22 13:21:42 UTC (rev 13815)
+++ trunk/blender/release/scripts/bpymodules/BPyRender.py	2008-02-22 14:27:46 UTC (rev 13816)
@@ -496,3 +496,135 @@
 				mat.mode &= ~Blender.Material.Modes.SHADELESS
 	
 	return image
+
+def bakeToPlane(sce, ob_from, width, height, bakemodes, axis='z', margin=0):
+	'''
+	Bakes terrain onto a plane from one object
+	sce - scene to bake with
+	ob_from - mesh object
+	width/height - image size
+	bakemodes - list of baking modes to use, Blender.Scene.Render.BakeModes.NORMALS, Blender.Scene.Render.BakeModes.AO ... etc
+	axis - axis to allign the plane to.
+	margin - margin setting for baking.
+	
+	Example:
+		import Blender
+		from Blender import *
+		import BPyRender
+		sce = Scene.GetCurrent()
+		ob = Object.Get('Plane')
+		BPyRender.bakeToPlane(sce, ob, 512, 512, [Scene.Render.BakeModes.DISPLACEMENT, Scene.Render.BakeModes.NORMALS], 'z', 8 )
+	'''
+	
+	# Backup bake settings
+	rend = sce.render
+	BACKUP_bakeDist = rend.bakeDist
+	BACKUP_bakeBias = rend.bakeBias
+	BACKUP_bakeMode = rend.bakeMode
+	BACKUP_bakeClear = rend.bakeClear
+	BACKUP_bakeMargin = rend.bakeMargin
+	BACKUP_bakeToActive = rend.bakeToActive
+	
+	# Backup object selection
+	BACKUP_obsel = list(sce.objects.selected)
+	BACKUP_obact = sce.objects.active
+	
+	# New bake settings
+	rend.bakeClear = True
+	rend.bakeMargin = margin
+	BACKUP_bakeToActive = True
+	
+	# Assume a mesh
+	me_from = ob_from.getData(mesh=1)
+	
+	xmin = ymin = zmin = 10000000000
+	xmax = ymax = zmax =-10000000000
+	
+	# Dont trust bounding boxes :/
+	#bounds = ob_from.boundingBox
+	#for v in bounds:
+	#	x,y,z = tuple(v)
+	mtx = ob_from.matrixWorld
+	for v in me_from.verts:
+		x,y,z = tuple(v.co*mtx)
+		
+		xmax = max(xmax, x)
+		ymax = max(ymax, y)
+		zmax = max(zmax, z)
+		
+		xmin = min(xmin, x)
+		ymin = min(ymin, y)
+		zmin = min(zmin, z)
+
+	if axis=='x':
+		xmed = (xmin+xmax)/2.0
+		co1 = (xmed, ymin, zmin)
+		co2 = (xmed, ymin, zmax)
+		co3 = (xmed, ymax, zmax)
+		co4 = (xmed, ymax, zmin)
+		rend.bakeDist = (xmax-xmin)/2.0
+	elif axis=='y':
+		ymed = (ymin+ymax)/2.0
+		co1 = (xmin, ymed, zmin)
+		co2 = (xmin, ymed, zmax)
+		co3 = (xmax, ymed, zmax)
+		co4 = (xmax, ymed, zmin)
+		rend.bakeDist = (ymax-ymin)/2.0
+	elif axis=='z':
+		zmed = (zmin+zmax)/2.0
+		co1 = (xmin, ymin, zmed)
+		co2 = (xmin, ymax, zmed)
+		co3 = (xmax, ymax, zmed)
+		co4 = (xmax, ymin, zmed)
+		rend.bakeDist = (zmax-zmin)/2.0
+	else:
+		raise "invalid axis"
+	me_plane = Blender.Mesh.New()
+	ob_plane = Blender.Object.New('Mesh')
+	ob_plane.link(me_plane)
+	sce.objects.link(ob_plane)
+	ob_plane.Layers = ob_from.Layers
+	
+	ob_from.sel = 1 # make active
+	sce.objects.active = ob_plane
+	ob_plane.sel = 1
+	
+	me_plane.verts.extend([co4, co3, co2, co1])
+	me_plane.faces.extend([(0,1,2,3)])
+	me_plane.faceUV = True
+	me_plane_face = me_plane.faces[0]
+	uvs = me_plane_face.uv
+	uvs[0].x = 0.0;	uvs[0].y = 0.0
+	uvs[1].x = 0.0;	uvs[1].y = 1.0
+	uvs[2].x = 1.0;	uvs[2].y = 1.0
+	uvs[3].x = 1.0;	uvs[3].y = 0.0
+	
+	images_return = []
+	
+	for mode in bakemodes:
+		img = Blender.Image.New('bake', width, height, 24)
+		
+		me_plane_face.image = img
+		rend.bakeMode = mode
+		rend.bake()
+		images_return.append( img )
+	
+	# Restore bake settings
+	#'''
+	rend.bakeDist = BACKUP_bakeDist
+	rend.bakeBias = BACKUP_bakeBias
+	rend.bakeMode = BACKUP_bakeMode
+	rend.bakeClear = BACKUP_bakeClear
+	rend.bakeMargin = BACKUP_bakeMargin
+	rend.bakeToActive = BACKUP_bakeToActive
+	
+	# Restore obsel
+	sce.objects.selected = BACKUP_obsel
+	sce.objects.active = BACKUP_obact
+	
+	me_plane.verts = None
+	sce.objects.unlink(ob_plane)
+	#'''
+	
+	return me_plane_face
+

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h	2008-02-22 13:21:42 UTC (rev 13815)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h	2008-02-22 14:27:46 UTC (rev 13816)
@@ -676,7 +676,7 @@
 #define R_BAKE_CLEAR		1
 #define R_BAKE_OSA			2
 #define R_BAKE_TO_ACTIVE	4
-#define R_BAKE_NORMALIZE_AO 8
+#define R_BAKE_NORMALIZE	8
 
 /* bake_normal_space */
 #define R_BAKE_SPACE_CAMERA	 0

Modified: trunk/blender/source/blender/python/api2_2x/sceneRender.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/sceneRender.c	2008-02-22 13:21:42 UTC (rev 13815)
+++ trunk/blender/source/blender/python/api2_2x/sceneRender.c	2008-02-22 14:27:46 UTC (rev 13816)
@@ -1899,12 +1899,12 @@
 		break;
 	case EXPP_RENDER_ATTR_BAKEDIST:
 		min = 0.0f;
-		max = 10.0f;
+		max = 1000.0f;
 		param = &self->renderContext->bake_maxdist;
 		break;
 	case EXPP_RENDER_ATTR_BAKEBIAS:
 		min = 0.0f;
-		max = 10.0f;
+		max = 1000.0f;
 		param = &self->renderContext->bake_biasdist;
 		break;
 	default:
@@ -2880,7 +2880,7 @@
 	{"bakeNormalizeAO",
 	 (getter)RenderData_getBakeMode, (setter)RenderData_setBakeMode,
 	 "Bake selection to active",
-	 (void *)R_BAKE_NORMALIZE_AO},
+	 (void *)R_BAKE_NORMALIZE},
 	{"bakeMargin",
 	 (getter)RenderData_getIValueAttr, (setter)RenderData_setIValueAttrClamp,
 	 "number of pixels to use as a margin for the edges of the image",

Modified: trunk/blender/source/blender/render/intern/source/rendercore.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/rendercore.c	2008-02-22 13:21:42 UTC (rev 13815)
+++ trunk/blender/source/blender/render/intern/source/rendercore.c	2008-02-22 14:27:46 UTC (rev 13816)
@@ -1855,7 +1855,7 @@
 	if(bs->type==RE_BAKE_AO) {
 		ambient_occlusion(shi);
 
-		if(R.r.bake_flag & R_BAKE_NORMALIZE_AO)
+		if(R.r.bake_flag & R_BAKE_NORMALIZE)
 			VECCOPY(shr.combined, shi->ao)
 		else
 			ambient_occlusion_to_diffuse(shi, shr.combined);
@@ -1934,7 +1934,11 @@
 	BakeShade *bs= handle;
 	float disp;
 	
-	disp = 0.5 + dist;
+	if(R.r.bake_flag & R_BAKE_NORMALIZE && R.r.bake_maxdist) {
+		disp = (dist+R.r.bake_maxdist) / (R.r.bake_maxdist*2); /* alter the range from [-bake_maxdist, bake_maxdist] to [0, 1]*/
+	} else {
+		disp = 0.5 + dist; /* alter the range from [-0.5,0.5] to [0,1]*/
+	}
 	
 	if(bs->rect_float) {
 		float *col= bs->rect_float + 4*(bs->rectx*y + x);
@@ -2066,7 +2070,7 @@
 		}
 
 		if (hit && bs->type==RE_BAKE_DISPLACEMENT) {;
-			bake_displacement(handle, shi, mindist, x, y);
+			bake_displacement(handle, shi, (dir==-1)? -mindist:mindist, x, y);
 			return;
 		}
 

Modified: trunk/blender/source/blender/src/buttons_scene.c
===================================================================
--- trunk/blender/source/blender/src/buttons_scene.c	2008-02-22 13:21:42 UTC (rev 13815)
+++ trunk/blender/source/blender/src/buttons_scene.c	2008-02-22 14:27:46 UTC (rev 13816)
@@ -2085,16 +2085,20 @@
 
 	uiBlockBeginAlign(block);
 	uiDefButBitS(block, TOG, R_BAKE_TO_ACTIVE, B_DIFF, "Selected to Active", 10,120,190,20,&G.scene->r.bake_flag, 0.0, 0, 0, 0, "Bake shading on the surface of selected objects to the active object");
-	uiDefButF(block, NUM, B_DIFF, "Dist:", 10,100,95,20,&G.scene->r.bake_maxdist, 0.0, 10.0, 1, 0, "Maximum distance from active object to other object (in blender units)");
-	uiDefButF(block, NUM, B_DIFF, "Bias:", 105,100,95,20,&G.scene->r.bake_biasdist, 0.0, 10.0, 1, 0, "Bias towards faces further away from the object (in blender units)");
+	uiDefButF(block, NUM, B_DIFF, "Dist:", 10,100,95,20,&G.scene->r.bake_maxdist, 0.0, 1000.0, 1, 0, "Maximum distance from active object to other object (in blender units)");
+	uiDefButF(block, NUM, B_DIFF, "Bias:", 105,100,95,20,&G.scene->r.bake_biasdist, 0.0, 1000.0, 1, 0, "Bias towards faces further away from the object (in blender units)");
 	uiBlockEndAlign(block);
 
 	if(G.scene->r.bake_mode == RE_BAKE_NORMALS)
 		uiDefButS(block, MENU, B_DIFF, "Normal Space %t|Camera %x0|World %x1|Object %x2|Tangent %x3", 
 			10,70,190,20, &G.scene->r.bake_normal_space, 0, 0, 0, 0, "Choose normal space for baking");
-	else if(G.scene->r.bake_mode == RE_BAKE_AO)
-		uiDefButBitS(block, TOG, R_BAKE_NORMALIZE_AO, B_DIFF, "Normalized", 10,70,190,20, &G.scene->r.bake_flag, 0.0, 0, 0, 0, "Bake ambient occlusion normalized, without taking into acount material settings");
-
+	else if(G.scene->r.bake_mode == RE_BAKE_AO || G.scene->r.bake_mode == RE_BAKE_DISPLACEMENT) {
+		uiDefButBitS(block, TOG, R_BAKE_NORMALIZE, B_DIFF, "Normalized", 10,70,190,20, &G.scene->r.bake_flag, 0.0, 0, 0, 0,
+				G.scene->r.bake_mode == RE_BAKE_AO ?
+				 "Bake ambient occlusion normalized, without taking into acount material settings":
+				 "Normalized displacement value to fit the 'Dist' range"
+		);
+	}
 #if 0	
 	uiBlockBeginAlign(block);
 	uiDefButBitS(block, TOG, R_BAKE_OSA, B_DIFF, "OSA",		10,120,190,20, &G.scene->r.bake_flag, 0, 0, 0, 0, "Enables Oversampling (Anti-aliasing)");





More information about the Bf-blender-cvs mailing list