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
