[Bf-blender-cvs] [55a4bee] bake-cycles: Cycles-Bake: RE_populate_bake_pixels() - still need work

Dalai Felinto noreply at git.blender.org
Wed Apr 23 02:46:19 CEST 2014


Commit: 55a4bee1c436d567415603653562707671780428
Author: Dalai Felinto
Date:   Fri Jan 3 19:57:55 2014 -0200
https://developer.blender.org/rB55a4bee1c436d567415603653562707671780428

Cycles-Bake: RE_populate_bake_pixels() - still need work

(see TODO in the function - in bake_new.c)

===================================================================

M	intern/cycles/blender/blender_session.cpp
M	source/blender/editors/object/object_bake_new.c
M	source/blender/render/extern/include/RE_bake.h
M	source/blender/render/intern/source/bake_new.c

===================================================================

diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index d05a0c6..098efb6 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -190,10 +190,16 @@ void BlenderSession::reset_session(BL::BlendData b_data_, BL::Scene b_scene_)
 
 void BlenderSession::free_session()
 {
-	if(sync)
-		delete sync;
+	try {
+		if (sync)
+			delete sync;
 
-	delete session;
+		delete session;
+	}
+	catch (const std::exception &exc)
+	{
+		printf("Cycles-free session: ERROR: %s\n", exc.what());
+	}
 }
 
 static PassType get_pass_type(BL::RenderPass b_pass)
diff --git a/source/blender/editors/object/object_bake_new.c b/source/blender/editors/object/object_bake_new.c
index 8cffe20..615d288 100644
--- a/source/blender/editors/object/object_bake_new.c
+++ b/source/blender/editors/object/object_bake_new.c
@@ -132,7 +132,9 @@ static int bake_exec(bContext *C, wmOperator *op)
 
 	float *result;
 	BakePixel *pixel_array;
-	const int num_pixels = 100;
+	const int width = 64; //XXX get from elsewhere
+	const int height = 64; //XXX get from elsewhere
+	const int num_pixels = width * height;
 	const int depth = 1;
 
 	RE_engine_bake_set_engine_parameters(re, CTX_data_main(C), scene);
@@ -155,28 +157,8 @@ static int bake_exec(bContext *C, wmOperator *op)
 	}
 #endif
 
-	{
-		/* populate the array while we don't have a real populate_bake_pixels */
-		const int num_faces = 2;
-		const int face_size = (float) num_pixels / num_faces;
-		const int face_width = sqrtf(face_size);
-		int i;
-
-		for (i=0; i < num_pixels; i++) {
-			const int x = (i % face_size) % face_width;
-			const int y = (i % face_size) / face_width;
-
-			pixel_array[i].primitive_id = i % num_faces; //0 and 1
-			pixel_array[i].u  = (float) x / face_width;
-			pixel_array[i].v  = (float) y / face_width;
-
-			pixel_array[i].dudx =
-			pixel_array[i].dudy =
-			pixel_array[i].dvdx =
-			pixel_array[i].dvdy =
-			0.f;
-		}
-	}
+	/* populate the pixel array with the face data */
+	RE_populate_bake_pixels(object, pixel_array, width, height);
 
 	/**
 	 // PSEUDO-CODE TIME
diff --git a/source/blender/render/extern/include/RE_bake.h b/source/blender/render/extern/include/RE_bake.h
index 17d7d10..52c0805 100644
--- a/source/blender/render/extern/include/RE_bake.h
+++ b/source/blender/render/extern/include/RE_bake.h
@@ -47,4 +47,6 @@ int RE_engine_bake(struct Render *re, struct Object *object, struct BakePixel pi
 /* bake.c */
 int RE_internal_bake(struct Render *re, struct Object *object, struct BakePixel pixel_array[], int num_pixels, int depth, int pass_type, float result[]);
 
+void RE_populate_bake_pixels(struct Object *object, struct BakePixel pixel_array[], const int width, const int height);
+
 #endif
diff --git a/source/blender/render/intern/source/bake_new.c b/source/blender/render/intern/source/bake_new.c
index aaad7c4..35dae7e 100644
--- a/source/blender/render/intern/source/bake_new.c
+++ b/source/blender/render/intern/source/bake_new.c
@@ -74,8 +74,73 @@ extern struct Render R;
 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
 
 
+typedef struct BakeData {
+	BakePixel *pixel_array;
+	int width;
+	int primitive_id;
+	ZSpan zspan;
+} BakeData;
+
 /* ************************* bake ************************ */
+static void store_bake_pixel(void *handle, int x, int y, float u, float v)
+{
+	BakeData *bd = (BakeData *)handle;
+	BakePixel *pixel_array = bd->pixel_array;
+	const int width = bd->width;
+	const int i = y * width + x;
+
+	pixel_array[i].primitive_id = bd->primitive_id;
+	pixel_array[i].u = u;
+	pixel_array[i].v = v;
+
+	pixel_array[i].dudx =
+	pixel_array[i].dudy =
+	pixel_array[i].dvdx =
+	pixel_array[i].dvdy =
+	0.f;
+}
 
+void RE_populate_bake_pixels(Object *object, BakePixel pixel_array[], const int width, const int height)
+{
+	BakeData bd;
+	const int num_pixels = width * height;
+	int i;
+
+	bd.pixel_array = pixel_array;
+	bd.width = width;
+
+	/* initialize all pixel arrays so we know which ones are 'blank' */
+	for (i=0; i < num_pixels; i++) {
+		pixel_array[i].primitive_id = -1;
+	}
+
+	zbuf_alloc_span(&bd.zspan, width, height, R.clipcrop);
+
+	/* TODO: * get the loop over faces to work
+
+	         * find whether we need to triangulate the mesh
+			   for zspan_scanconvert to work
+	           (I guess we do since baking had the splitting option)
+
+	         * find which primitive_id to use
+	           (it's the id of the original face or the new triangulated?)
+	 */
+#if 0
+	/* pseudo code */
+	for face in object.faces {
+		bd.primitive_id = face_id;
+	 	v1, v2, v3 = face.vertices[:]
+	 
+	 	//TODO copy/adapt UV offset hack/trick from bake.c */
+
+		zspan_scanconvert(&bd.zspan, (void *)&bd, v1, v2, v3, store_bake_pixel);
+	 }
+#endif
+
+	/* we could preserve this if zbuffer pass is required, maybe store the zed of the
+	   pixel in the BakePixel struct - TBI */
+	zbuf_free_span(&bd.zspan);
+}
 
 int RE_internal_bake(Render *UNUSED(re), Object *UNUSED(object), BakePixel UNUSED(pixel_array[]), int UNUSED(num_pixels), int UNUSED(depth), int UNUSED(pass_type), float UNUSED(result[]))
 {




More information about the Bf-blender-cvs mailing list