Commit: 1eb561bfc1e357ab50c90f18632c485d657c8007
Author: Dalai Felinto
Date:   Wed Apr 29 01:21:33 2015 -0300
Branches: fix-bake-dupli
https://developer.blender.org/rB1eb561bfc1e357ab50c90f18632c485d657c8007

Fix T43553 Cycles Bake does not support dupligroups

work in progress!

@sergey could you review the cycles part? I'm not sure how to actually use the 
Transform in kernel_bake.h (see the TODOs there), but apart from that I think 
it's correct.

In the Blender side I still need to populate the bake data with the dupli 
objects and pass the matrix.

I think the matrix I need to pass is one that can be used directly by the 
kernel_bake.h, and it will be an identity matrix for all but the dupli objects.
For those I probably need the dupli matrix in relation to the object original 
matrix.

Reviewers: sergey

Subscribers: sergey, pildanovak

Differential Revision: https://developer.blender.org/D1271

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

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
M       intern/cycles/device/device_cpu.cpp
M       intern/cycles/device/device_task.h
M       intern/cycles/kernel/kernel.cl
M       intern/cycles/kernel/kernel.cpp
M       intern/cycles/kernel/kernel.h
M       intern/cycles/kernel/kernel_avx.cpp
M       intern/cycles/kernel/kernel_avx2.cpp
M       intern/cycles/kernel/kernel_bake.h
M       intern/cycles/kernel/kernel_sse2.cpp
M       intern/cycles/kernel/kernel_sse3.cpp
M       intern/cycles/kernel/kernel_sse41.cpp
M       intern/cycles/render/bake.cpp
M       intern/cycles/render/bake.h
M       source/blender/editors/object/object_bake_api.c
M       source/blender/makesrna/intern/rna_render.c
M       source/blender/render/extern/include/RE_bake.h
M       source/blender/render/extern/include/RE_engine.h
M       source/blender/render/intern/source/external_engine.c

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

diff --git a/intern/cycles/blender/addon/__init__.py 
b/intern/cycles/blender/addon/__init__.py
index 9c78e0c..62deb8f 100644
--- a/intern/cycles/blender/addon/__init__.py
+++ b/intern/cycles/blender/addon/__init__.py
@@ -65,8 +65,8 @@ class CyclesRender(bpy.types.RenderEngine):
     def render(self, scene):
         engine.render(self)
 
-    def bake(self, scene, obj, pass_type, object_id, pixel_array, num_pixels, 
depth, result):
-        engine.bake(self, obj, pass_type, object_id, pixel_array, num_pixels, 
depth, result)
+    def bake(self, scene, obj, pass_type, object_id, pixel_array, num_pixels, 
depth, matrix, result):
+        engine.bake(self, obj, pass_type, object_id, pixel_array, num_pixels, 
depth, matrix, result)
 
     # viewport render
     def view_update(self, context):
diff --git a/intern/cycles/blender/addon/engine.py 
b/intern/cycles/blender/addon/engine.py
index 4187e23..9f8e20b 100644
--- a/intern/cycles/blender/addon/engine.py
+++ b/intern/cycles/blender/addon/engine.py
@@ -59,11 +59,11 @@ def render(engine):
         _cycles.render(engine.session)
 
 
-def bake(engine, obj, pass_type, object_id, pixel_array, num_pixels, depth, 
result):
+def bake(engine, obj, pass_type, object_id, pixel_array, num_pixels, depth, 
matrix, result):
     import _cycles
     session = getattr(engine, "session", None)
     if session is not None:
-        _cycles.bake(engine.session, obj.as_pointer(), pass_type, object_id, 
pixel_array.as_pointer(), num_pixels, depth, result.as_pointer())
+        _cycles.bake(engine.session, obj.as_pointer(), pass_type, object_id, 
pixel_array.as_pointer(), num_pixels, depth, matrix.as_pointer(), 
result.as_pointer())
 
 
 def reset(engine, data, scene):
diff --git a/intern/cycles/blender/blender_python.cpp 
b/intern/cycles/blender/blender_python.cpp
index 200003f..fac2112 100644
--- a/intern/cycles/blender/blender_python.cpp
+++ b/intern/cycles/blender/blender_python.cpp
@@ -188,10 +188,12 @@ static PyObject *bake_func(PyObject * /*self*/, PyObject 
*args)
 {
        PyObject *pysession, *pyobject;
        PyObject *pypixel_array, *pyresult;
+       PyObject *pymatrix;
        const char *pass_type;
        int num_pixels, depth, object_id;
 
-       if(!PyArg_ParseTuple(args, "OOsiOiiO", &pysession, &pyobject, 
&pass_type, &object_id, &pypixel_array, &num_pixels, &depth, &pyresult))
+       if(!PyArg_ParseTuple(args, "OOsiOiiOO", &pysession, &pyobject, 
&pass_type, &object_id, &pypixel_array,
+                            &num_pixels, &depth, &pymatrix, &pyresult))
                return NULL;
 
        BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession);
@@ -200,6 +202,7 @@ static PyObject *bake_func(PyObject * /*self*/, PyObject 
*args)
        RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyobject), &objectptr);
        BL::Object b_object(objectptr);
 
+       void *b_matrix = PyLong_AsVoidPtr(pymatrix);
        void *b_result = PyLong_AsVoidPtr(pyresult);
 
        PointerRNA bakepixelptr;
@@ -208,7 +211,7 @@ static PyObject *bake_func(PyObject * /*self*/, PyObject 
*args)
 
        python_thread_state_save(&session->python_thread_state);
 
-       session->bake(b_object, pass_type, object_id, b_bake_pixel, 
(size_t)num_pixels, depth, (float *)b_result);
+       session->bake(b_object, pass_type, object_id, b_bake_pixel, 
(size_t)num_pixels, depth, *((BL::Array<float, 16>*)b_matrix), (float 
*)b_result);
 
        python_thread_state_restore(&session->python_thread_state);
 
diff --git a/intern/cycles/blender/blender_session.cpp 
b/intern/cycles/blender/blender_session.cpp
index 8975146..dfa0c90 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -526,11 +526,13 @@ static void populate_bake_data(BakeData *data, const int 
object_id, BL::BakePixe
        }
 }
 
-void BlenderSession::bake(BL::Object b_object, const string& pass_type, const 
int object_id, BL::BakePixel pixel_array, const size_t num_pixels, const int 
/*depth*/, float result[])
+void BlenderSession::bake(BL::Object b_object, const string& pass_type, const 
int object_id, BL::BakePixel pixel_array,
+                          const size_t num_pixels, const int /*depth*/, 
BL::Array<float, 16> matrix, float result[])
 {
        ShaderEvalType shader_type = get_shader_type(pass_type);
        size_t object_index = OBJECT_NONE;
        int tri_offset = 0;
+       Transform tfm = get_transform(matrix);
 
        /* ensure kernels are loaded before we do any scene updates */
        session->load_kernels();
@@ -591,7 +593,7 @@ void BlenderSession::bake(BL::Object b_object, const 
string& pass_type, const in
 
        
session->progress.set_update_callback(function_bind(&BlenderSession::update_bake_progress,
 this));
 
-       scene->bake_manager->bake(scene->device, &scene->dscene, scene, 
session->progress, shader_type, bake_data, result);
+       scene->bake_manager->bake(scene->device, &scene->dscene, scene, 
session->progress, shader_type, &tfm, bake_data, result);
 
        /* free all memory used (host and device), so we wouldn't leave render
         * engine with extra memory allocated
diff --git a/intern/cycles/blender/blender_session.h 
b/intern/cycles/blender/blender_session.h
index 708776d..55c8ca8 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -52,7 +52,8 @@ public:
        /* offline render */
        void render();
 
-       void bake(BL::Object b_object, const string& pass_type, const int 
object_id, BL::BakePixel pixel_array, const size_t num_pixels, const int depth, 
float pixels[]);
+       void bake(BL::Object b_object, const string& pass_type, const int 
object_id, BL::BakePixel pixel_array,
+                 const size_t num_pixels, const int depth, BL::Array<float, 
16> matrix, 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/device/device_cpu.cpp 
b/intern/cycles/device/device_cpu.cpp
index 013f656..474507a 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -333,7 +333,7 @@ public:
 #ifdef WITH_OSL
                OSLShader::thread_init(&kg, &kernel_globals, &osl_globals);
 #endif
-               void(*shader_kernel)(KernelGlobals*, uint4*, float4*, int, int, 
int, int);
+               void(*shader_kernel)(KernelGlobals*, uint4*, float4*, int, 
Transform *tfm, int, int, int);
 
 #ifdef WITH_CYCLES_OPTIMIZED_KERNEL_AVX2
                if(system_cpu_support_avx2())
@@ -365,7 +365,7 @@ public:
                for(int sample = 0; sample < task.num_samples; sample++) {
                        for(int x = task.shader_x; x < task.shader_x + 
task.shader_w; x++)
                                shader_kernel(&kg, (uint4*)task.shader_input, 
(float4*)task.shader_output,
-                                       task.shader_eval_type, x, task.offset, 
sample);
+                                       task.shader_eval_type, &task.tfm, x, 
task.offset, sample);
 
                        if(task.get_cancel() || task_pool.canceled())
                                break;
diff --git a/intern/cycles/device/device_task.h 
b/intern/cycles/device/device_task.h
index 0c23d89..9f1fc8d 100644
--- a/intern/cycles/device/device_task.h
+++ b/intern/cycles/device/device_task.h
@@ -22,6 +22,7 @@
 #include "util_function.h"
 #include "util_list.h"
 #include "util_task.h"
+#include "util_transform.h"
 
 CCL_NAMESPACE_BEGIN
 
@@ -48,6 +49,7 @@ public:
        device_ptr shader_input;
        device_ptr shader_output;
        int shader_eval_type;
+       Transform tfm;
        int shader_x, shader_w;
 
        DeviceTask(Type type = PATH_TRACE);
diff --git a/intern/cycles/kernel/kernel.cl b/intern/cycles/kernel/kernel.cl
index 5a47260..75ecc66 100644
--- a/intern/cycles/kernel/kernel.cl
+++ b/intern/cycles/kernel/kernel.cl
@@ -140,7 +140,7 @@ __kernel void kernel_ocl_bake(
        ccl_global type *name,
 #include "kernel_textures.h"
 
-       int type, int sx, int sw, int offset, int sample)
+       int type, Transform *tfm, int sx, int sw, int offset, int sample)
 {
        KernelGlobals kglobals, *kg = &kglobals;
 
@@ -153,6 +153,6 @@ __kernel void kernel_ocl_bake(
        int x = sx + get_global_id(0);
 
        if(x < sx + sw)
-               kernel_bake_evaluate(kg, input, output, (ShaderEvalType)type, 
x, offset, sample);
+               kernel_bake_evaluate(kg, input, output, (ShaderEvalType)type, 
tfm, x, offset, sample);
 }
 
diff --git a/intern/cycles/kernel/kernel.cpp b/intern/cycles/kernel/kernel.cpp
index a7eaa75..1719dca 100644
--- a/intern/cycles/kernel/kernel.cpp
+++ b/intern/cycles/kernel/kernel.cpp
@@ -120,10 +120,10 @@ void kernel_cpu_convert_to_half_float(KernelGlobals *kg, 
uchar4 *rgba, float *bu
 
 /* Shader Evaluation */
 
-void kernel_cpu_shader(KernelGlobals *kg, uint4 *input, float4 *output, int 
type, int i, int offset, int sample)
+void kernel_cpu_shader(KernelGlobals *kg, uint4 *input, float4 *output, int 
type, Transform *tfm, int i, int offset, int sample)
 {
        if(type >= SHADER_EVAL_BAKE)
-               kernel_bake_evaluate(kg, input, output, (ShaderEvalType)type, 
i, offset, sample);
+               kernel_bake_evaluate(kg, input, output, (ShaderEvalType)type, 
tfm, i, offset, sample);
        else
                kernel_shader_evaluate(kg, input, output, (ShaderEvalType)type, 
i, sample);
 }
diff --git a/intern/cycles/kernel/kernel.h b/intern/cycles/kernel/kernel.h
index 0996e51..ca42b71 100644
--- a/intern/cycles/kernel/kernel.h
+++ b/intern/cycles/kernel/kernel.h
@@ -20,6 +20,7 @@
 /* CPU Kernel Interface */
 
 #include "util_types.h"
+#include "util_transform.h"
 
 CCL_NAMESPACE_BEGIN
 
@@ -41,7 +42,7 @@ void kernel_cpu_convert_to_byte(KernelGlobals *kg, uchar4 
*rgba, float *buffer,
 void kernel_cpu_convert_to_half_float(KernelGlobals *kg, uchar4 *rgba, float 
*buffer,
        float sample_scale, int x, int y, int offset, int stride);
 void kernel_cpu_shader(KernelGlobals *kg, uint4 *input, float4 *output,
-       int type, int i, int offset, int sample);
+       int type, Transform *tfm, int i, int offset, int sample);
 
 #ifdef WITH_CYCLES_OPTIMIZED_KERNEL_SSE2
 void kernel_cpu_sse2_path_trace(KernelGlobals *kg, float *buffer, unsigned int 
*rng_state,
@@ -51,7 +52,7 @@ void kernel_cpu_sse2_convert_to_byte(KernelGlobals *kg, 
uchar4 *rgba, float *buf
 void kernel_cpu_sse2_convert_to_half_float(KernelGlobals *kg, uchar4 *rgba, 
float *buffer,
        float sample_scale, int x, int y, int offset, int stride);
 void kernel_cpu_sse2_shader(KernelGlobals *kg, uint4 *input, float4 *output,
-       int type, int i, int offset, int sample);
+       int type, Transform *tfm, int i, int offset, int sample);
 #endif
 
 #ifdef WITH_CYCLES_OPTIMIZED_KERNEL_SSE3
@@ -62,7 +63,7 @@ void kernel_cpu

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to