[Bf-blender-cvs] [f871330] bake-cycles: Cycles-Bake: Squash of first commits

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


Commit: f87133029eeb2587722db2ed5f6d8f954ab08c2e
Author: Dalai Felinto
Date:   Thu Jan 2 19:05:07 2014 -0200
https://developer.blender.org/rBf87133029eeb2587722db2ed5f6d8f954ab08c2e

Cycles-Bake: Squash of first commits

I squashed the previous commit to undo the rename of bake.c > bake_old.c
This was merge-conflict prone since any change in the bake.c would generate conflict.

(same for object_bake.c)

* More work on getting cycles to have its bake function called.
* Getting through the beast - bake gets called inside Cycles
* I get a crash though, on free_session()
* Get render pass for baking from enum
* Sending the BakePixel and float pointers all the way to Cycles \o/
* Sending some data back just to validate the pipeline going in and out

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

M	intern/cycles/blender/addon/__init__.py
M	intern/cycles/blender/addon/engine.py
M	intern/cycles/blender/blender_python.cpp
M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_session.h
A	intern/cycles/render/bake.cpp
M	intern/cycles/render/mesh_displace.cpp
M	source/blender/editors/object/CMakeLists.txt
A	source/blender/editors/object/object_bake_new.c
M	source/blender/editors/object/object_intern.h
M	source/blender/editors/object/object_ops.c
M	source/blender/makesrna/RNA_enum_types.h
M	source/blender/makesrna/intern/rna_render.c
M	source/blender/render/CMakeLists.txt
A	source/blender/render/extern/include/RE_bake.h
M	source/blender/render/extern/include/RE_engine.h
M	source/blender/render/intern/source/bake.c
A	source/blender/render/intern/source/bake_new.c
M	source/blender/render/intern/source/external_engine.c
M	source/blender/windowmanager/WM_api.h

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

diff --git a/intern/cycles/blender/addon/__init__.py b/intern/cycles/blender/addon/__init__.py
index 9f42cc9..68622ec 100644
--- a/intern/cycles/blender/addon/__init__.py
+++ b/intern/cycles/blender/addon/__init__.py
@@ -67,6 +67,9 @@ class CyclesRender(bpy.types.RenderEngine):
     def render(self, scene):
         engine.render(self)
 
+    def bake(self, scene, object, pass_type, pixel_array, num_pixels, depth, result):
+        engine.bake(self, object, pass_type, pixel_array, num_pixels, depth, result)
+
     # viewport render
     def view_update(self, context):
         if not self.session:
diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py
index b9ce655..292ba97 100644
--- a/intern/cycles/blender/addon/engine.py
+++ b/intern/cycles/blender/addon/engine.py
@@ -59,6 +59,11 @@ def render(engine):
         _cycles.render(engine.session)
 
 
+def bake(engine, object, pass_type, pixel_array, num_pixels, depth, result):
+    import _cycles
+    if hasattr(engine, "session"):
+        _cycles.bake(engine.session, object.as_pointer(), pass_type, pixel_array.as_pointer(), num_pixels, depth, result.as_pointer())
+
 def reset(engine, data, scene):
     import _cycles
     data = data.as_pointer()
diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp
index 8b04a86..068216c 100644
--- a/intern/cycles/blender/blender_python.cpp
+++ b/intern/cycles/blender/blender_python.cpp
@@ -147,6 +147,36 @@ static PyObject *render_func(PyObject *self, PyObject *value)
 	Py_RETURN_NONE;
 }
 
+/* pixel_array and result passed as pointers */
+static PyObject *bake_func(PyObject *self, PyObject *args)
+{
+	PyObject *pysession, *pyobject;
+	PyObject *pypixel_array, *pyresult;
+	const char *pass_type;
+	int num_pixels, depth;
+
+	if(!PyArg_ParseTuple(args, "OOsOiiO", &pysession, &pyobject, &pass_type, &pypixel_array,  &num_pixels, &depth, &pyresult))
+		return NULL;
+
+	Py_BEGIN_ALLOW_THREADS
+
+	BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession);
+
+	PointerRNA objectptr;
+	RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyobject), &objectptr);
+	BL::Object b_object(objectptr);
+
+	void *b_bakepixel(PyLong_AsVoidPtr(pypixel_array));
+	void *b_result(PyLong_AsVoidPtr(pyresult));
+
+	session->bake(b_object, pass_type, (BakePixel *)b_bakepixel, num_pixels, depth, (float *)b_result);
+	//session->bake(b_object, pass_type, b_bakepixel, num_pixels, depth, (float *)b_result);
+
+	Py_END_ALLOW_THREADS
+
+	Py_RETURN_NONE;
+}
+
 static PyObject *draw_func(PyObject *self, PyObject *args)
 {
 	PyObject *pysession, *pyv3d, *pyrv3d;
@@ -418,6 +448,7 @@ static PyMethodDef methods[] = {
 	{"create", create_func, METH_VARARGS, ""},
 	{"free", free_func, METH_O, ""},
 	{"render", render_func, METH_O, ""},
+	{"bake", bake_func, METH_VARARGS, ""},
 	{"draw", draw_func, METH_VARARGS, ""},
 	{"sync", sync_func, METH_O, ""},
 	{"reset", reset_func, METH_VARARGS, ""},
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index f5e696b..d05a0c6 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -44,8 +44,13 @@ BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::UserPreferences b
 {
 	/* offline render */
 
-	width = render_resolution_x(b_render);
-	height = render_resolution_y(b_render);
+	if (b_render) {
+		width = render_resolution_x(b_render);
+		height = render_resolution_y(b_render);
+	}
+	else {
+		width = height = 0.0;
+	}
 
 	background = true;
 	last_redraw_time = 0.0;
@@ -425,6 +430,42 @@ void BlenderSession::render()
 	sync = NULL;
 }
 
+void BlenderSession::bake(BL::Object b_object, const string& pass_type, BakePixel *pixel_array, int num_pixels, int depth, float result[])
+{
+
+	printf("Baking inside Cycles\n");
+	printf("passes: %s\n", pass_type.c_str());
+	printf("num_pixels: %d\ndepth: %d\n", num_pixels, depth);
+
+#if 1
+	{
+		/* so far so good, although in the real implementation result will be zero'ed */
+		int i = 0;
+		printf("\n<bakepixel>\n\n");
+		for (i=0;i < num_pixels; i++) {
+			printf("\nprimitive_id: %d\n", pixel_array[i].primitive_id);
+			printf("u: %4.2f\n", pixel_array[i].u);
+			printf("v: %4.2f\n", pixel_array[i].v);
+
+			result[i] = pixel_array[i].u + pixel_array[i].v;
+		}
+		printf("\n</bakepixel>\n\n");
+	}
+#endif
+
+#if 0
+	{
+		/* so far so good, although in the real implementation result will be zero'ed */
+		int i = 0;
+		printf("\n<result>\n\n");
+		for (i=0;i < num_pixels; i++) {
+			printf("%4.2f\n", result[i]);
+		}
+		printf("\n</result>\n\n");
+	}
+#endif
+}
+
 void BlenderSession::do_write_update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile, bool do_update_only)
 {
 	RenderBuffers *buffers = rtile.buffers;
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index d30e3ed..c1f69c2 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -30,6 +30,16 @@ class Session;
 class RenderBuffers;
 class RenderTile;
 
+struct BakePixel;
+
+/* plain copy from Blender */
+typedef struct BakePixel {
+	int primitive_id;
+	float u, v;
+	float dudx, dudy;
+	float dvdx, dvdy;
+} BakePixel;
+
 class BlenderSession {
 public:
 	BlenderSession(BL::RenderEngine b_engine, BL::UserPreferences b_userpref,
@@ -51,6 +61,8 @@ public:
 	/* offline render */
 	void render();
 
+	void bake(BL::Object b_object, const string& pass_type, BakePixel pixel_array[], int num_pixels, int depth, float pixels[]);
+
 	void write_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile);
 	void write_render_tile(RenderTile& rtile);
 
diff --git a/intern/cycles/render/bake.cpp b/intern/cycles/render/bake.cpp
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/intern/cycles/render/bake.cpp
@@ -0,0 +1 @@
+
diff --git a/intern/cycles/render/mesh_displace.cpp b/intern/cycles/render/mesh_displace.cpp
index 09d3ce6..7d6c728 100644
--- a/intern/cycles/render/mesh_displace.cpp
+++ b/intern/cycles/render/mesh_displace.cpp
@@ -26,6 +26,18 @@
 
 CCL_NAMESPACE_BEGIN
 
+#if 0
+struct BakePixel {
+	int primitive_id;
+	float u, v;
+	float dudx, dudy;
+	float dvdx, dvdy;
+};
+
+static void bake(Object *object, BakePixel pixel_array[], int num_pixels, int passes_bit_flag, float result[]);
+
+#endif
+
 bool MeshManager::displace(Device *device, DeviceScene *dscene, Scene *scene, Mesh *mesh, Progress& progress)
 {
 	/* verify if we have a displacement shader */
@@ -53,6 +65,65 @@ bool MeshManager::displace(Device *device, DeviceScene *dscene, Scene *scene, Me
 		}
 	}
 
+#if 0
+	/* pseudo-setup for baking API */
+	vector<bool> done(mesh->verts.size(), false);
+	device_vector<BakePixel> d_input;
+	BakePixel *d_input_data = d_input.resize(mesh->verts.size());
+	size_t d_input_size = 0;
+
+	for (size_t i = 0; i < mesh->triangles.size(); i++) {
+		Mesh::Triangle t = mesh->triangles[i];
+		Shader *shader = scene->shaders[mesh->shader[i]];
+
+		if (!shader->has_displacement)
+			continue;
+
+		for (int j = 0; j < 3; j++) {
+			if (done[t.v[j]])
+				continue;
+
+			done[t.v[j]] = true;
+			int prim = mesh->tri_offset + i;
+			float u, v;
+
+			switch (j) {
+				case 0:
+					u = 1.0f;
+					v = 0.0f;
+					break;
+				case 1:
+					u = 0.0f;
+					v = 1.0f;
+					break;
+				default:
+					u = 0.0f;
+					v = 0.0f;
+					break;
+			}
+
+			/* back */
+			BakePixel in;
+			in.u = u;
+			in.v = v;
+			in.primitive_id = prim;
+			d_input_data[d_input_size++] = in;
+		}
+	}
+
+	if(d_input_size == 0)
+		return false;
+
+	/* run device task */
+	//device_vector<float4> d_output;
+	//d_output.resize(d_input_size);
+
+	device_vector<float> d_output;
+	d_output.resize(d_input_size * 4);
+
+	bake(scene->objects[object_index], d_input_data, (int) d_input_size, (int) SHADER_EVAL_DISPLACE, d_output);
+
+#else
 	/* setup input for device task */
 	vector<bool> done(mesh->verts.size(), false);
 	device_vector<uint4> d_input;
@@ -113,6 +184,8 @@ bool MeshManager::displace(Device *device, DeviceScene *dscene, Scene *scene, Me
 	device->mem_copy_to(d_input);
 	device->mem_alloc(d_output, MEM_WRITE_ONLY);
 
+#endif
+
 	DeviceTask task(DeviceTask::SHADER);
 	task.shader_input = d_input.device_pointer;
 	task.shader_output = d_output.device_pointer;
diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt
index 8277c7f..89c943ec 100644
--- a/source/blender/editors/object/CMakeLists.txt
+++ b/source/blender/editors/object/CMakeLists.txt
@@ -42,6 +42,7 @@ set(INC_SYS
 set(SRC
 	object_add.c
 	object_bake.c
+	object_bake_new.c
 	object_constraint.c
 	object_edit.c
 	object_group.c
diff --git a/source/blender/editors/object/object_bake_new.c b/source/blender/editors/object/object_bake_new.c
new file mode 100644
index 0000000..5841f6c
--- /dev/null
+++ b/source/blender/editors/object/object_bake_new.c
@@ -0,0 +1,331 @@
+/*
+ * ***** 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) 2004 by Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/object/object_bake.c
+ *  \ingroup edobj
+ */
+
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+#include "DNA_w

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list