[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