[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