[Bf-blender-cvs] [57f46cc] bake-cycles: Cycles-Bake: fill the bake() routine to call the shader function
Dalai Felinto
noreply at git.blender.org
Wed Apr 23 02:46:37 CEST 2014
Commit: 57f46cc84a46c63b7e81889500179f99805252ca
Author: Dalai Felinto
Date: Sun Jan 19 18:01:51 2014 -0200
https://developer.blender.org/rB57f46cc84a46c63b7e81889500179f99805252ca
Cycles-Bake: fill the bake() routine to call the shader function
I still need to expand kernel_displace.h so each shadertype gets
properly created.
Also I'm yet to create other shader_types, I'll sak Brecht first to see
if this is the way to go
===================================================================
M intern/cycles/blender/blender_session.cpp
M intern/cycles/kernel/kernel_types.h
M intern/cycles/render/bake.cpp
M intern/cycles/render/bake.h
M intern/cycles/render/scene.cpp
M intern/cycles/render/scene.h
M intern/cycles/render/session.h
===================================================================
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index e7fa6d1..18b20f3 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -23,6 +23,7 @@
#include "integrator.h"
#include "film.h"
#include "light.h"
+#include "object.h"
#include "scene.h"
#include "session.h"
#include "shader.h"
@@ -261,9 +262,24 @@ static PassType get_pass_type(BL::RenderPass b_pass)
return PASS_NONE;
}
-static PassType get_pass_type(const string& s_pass_type)
+static ShaderEvalType get_shader_type(const string& pass_type)
{
- const char *pass_type = s_pass_type.c_str();
+ const char *shader_type = pass_type.c_str();
+ if (strcmp(shader_type, "COMBINED")==0)
+ return SHADER_EVAL_COMBINED;
+ else if (strcmp(shader_type, "Z")==0)
+ return SHADER_EVAL_DEPTH;
+ else if (strcmp(shader_type, "UV")==0)
+ return SHADER_EVAL_UV;
+ else if (strcmp(shader_type, "EMIT")==0)
+ return SHADER_EVAL_EMISSION;
+ else if (strcmp(shader_type, "ENVIRONMENT")==0)
+ return SHADER_EVAL_BACKGROUND;
+ else if (strcmp(shader_type, "AO")==0)
+ return SHADER_EVAL_AO;
+ else
+ return SHADER_EVAL_BACKGROUND;
+#if 0
if (strcmp(pass_type, "COMBINED")==0)
return PASS_COMBINED;
@@ -330,6 +346,7 @@ static PassType get_pass_type(const string& s_pass_type)
*/
else
return PASS_NONE;
+#endif
}
static BL::RenderResult begin_render_result(BL::RenderEngine b_engine, int x, int y, int w, int h, const char *layername)
@@ -498,7 +515,7 @@ void BlenderSession::render()
sync = NULL;
}
-void _bake_bary_uv(BL::Object b_object, PassType pass_type, BL::BakePixel pixel_array, int num_pixels, int depth, float result[])
+void _bake_bary_uv(BL::BakePixel pixel_array, int num_pixels, int depth, float result[])
{
BL::BakePixel bp = pixel_array;
@@ -522,22 +539,56 @@ static void populate_bake_data(BakeData *data, BL::BakePixel pixel_array, const
}
}
-void BlenderSession::bake(BL::Object b_object, const string& s_pass_type, BL::BakePixel pixel_array, int num_pixels, int depth, float result[])
+void BlenderSession::bake(BL::Object b_object, const string& pass_type, BL::BakePixel pixel_array, int num_pixels, int depth, float result[])
{
- int object = 0;
+ ShaderEvalType shader_type = get_shader_type(pass_type);
+
+ /* find object index. todo: is arbitrary - copied from mesh_displace.cpp */
+ size_t object_index = ~0;
+
+ for(size_t i = 0; i < scene->objects.size(); i++) {
+ if(strcmp(scene->objects[i]->name.c_str(), b_object.name().c_str()) == 0) {
+ object_index = i;
+ break;
+ }
+ }
+
+ /* create device and update scene */
+ scene->film->tag_update(scene);
+ scene->integrator->tag_update(scene);
+
+ /* update scene */
+ sync->sync_camera(b_render, b_engine.camera_override(), width, height);
+ sync->sync_data(b_v3d, b_engine.camera_override(), "");
+
+ /* get buffer parameters */
+ SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
+ BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, width, height);
+
+ /* set number of samples per layer */
+ int samples = sync->get_layer_samples();
+ bool bound_samples = sync->get_layer_bound_samples();
+
+ if(samples != 0 && (!bound_samples || (samples < session_params.samples)))
+ session->reset(buffer_params, samples);
+ else
+ session->reset(buffer_params, session_params.samples);
+
+ session->update_scene();
- PassType pass_type = get_pass_type(s_pass_type);
+ /* when used, non-instanced convention: object = ~object */
+ int object = ~object_index;
BakeData *bake_data = scene->bake_init(object, num_pixels);
populate_bake_data(bake_data, pixel_array, num_pixels);
- scene->bake(pass_type, bake_data, result);
+ scene->bake(shader_type, bake_data, result);
return;
/* DEBUG call, just to show that we can read, write, and write to an image successfully */
- _bake_bary_uv(b_object, pass_type, pixel_array, num_pixels, depth, result);
+ _bake_bary_uv(pixel_array, num_pixels, depth, result);
}
void BlenderSession::do_write_update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile, bool do_update_only)
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index f833459..37a03df 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -160,7 +160,12 @@ typedef uint RNG;
typedef enum ShaderEvalType {
SHADER_EVAL_DISPLACE,
- SHADER_EVAL_BACKGROUND
+ SHADER_EVAL_BACKGROUND,
+ SHADER_EVAL_UV,
+ SHADER_EVAL_COMBINED,
+ SHADER_EVAL_DEPTH,
+ SHADER_EVAL_EMISSION,
+ SHADER_EVAL_AO
} ShaderEvalType;
/* Path Tracing
diff --git a/intern/cycles/render/bake.cpp b/intern/cycles/render/bake.cpp
index a7ee39e..89956b2 100644
--- a/intern/cycles/render/bake.cpp
+++ b/intern/cycles/render/bake.cpp
@@ -48,12 +48,65 @@ BakeData *BakeManager::init(const int object, const int num_pixels)
return bake_data;
}
-bool BakeManager::bake(Device *device, DeviceScene *dscene, Scene *scene, PassType passtype, BakeData *bake_data, float result[])
+bool BakeManager::bake(Device *device, DeviceScene *dscene, Scene *scene, ShaderEvalType shader_type, BakeData *bake_data, float result[])
{
+ size_t limit = bake_data->size();
- /* TODO adapt code from mesh_displace.cpp */
+ /* setup input for device task */
+ device_vector<uint4> d_input;
+ uint4 *d_input_data = d_input.resize(limit);
+ size_t d_input_size = 0;
- return false;
+ for(size_t i = 0; i < limit; i++) {
+ d_input_data[d_input_size++] = bake_data->data(i);
+ }
+
+ if(d_input_size == 0)
+ return false;
+
+ /* run device task */
+ device_vector<float4> d_output;
+ d_output.resize(d_input_size);
+
+ /* needs to be up to data for attribute access */
+ device->const_copy_to("__data", &dscene->data, sizeof(dscene->data));
+
+ device->mem_alloc(d_input, MEM_READ_ONLY);
+ device->mem_copy_to(d_input);
+ device->mem_alloc(d_output, MEM_WRITE_ONLY);
+
+ DeviceTask task(DeviceTask::SHADER);
+ task.shader_input = d_input.device_pointer;
+ task.shader_output = d_output.device_pointer;
+ task.shader_eval_type = shader_type;
+ task.shader_x = 0;
+ task.shader_w = d_output.size();
+
+ device->task_add(task);
+ device->task_wait();
+
+ device->mem_copy_from(d_output, 0, 1, d_output.size(), sizeof(float4));
+ device->mem_free(d_input);
+ device->mem_free(d_output);
+
+// if(progress.get_cancel())
+// return false;
+
+ /* read result */
+ int k = 0;
+
+ float4 *offset = (float4*)d_output.data_pointer;
+
+ int depth = 4;
+ for(size_t i = 0; i < limit; i++) {
+ int index = i * depth;
+ float4 out = offset[k++];
+
+ for (int j=0; j < 4; j++)
+ result[index + j] = out[j];
+ }
+
+ return true;
}
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/bake.h b/intern/cycles/render/bake.h
index 3230a20..ee633f4 100644
--- a/intern/cycles/render/bake.h
+++ b/intern/cycles/render/bake.h
@@ -33,13 +33,14 @@ public:
m_primitive.resize(num_pixels);
m_u.resize(num_pixels);
m_v.resize(num_pixels);
- };
+ }
+
~BakeData()
{
m_primitive.clear();
m_u.clear();
m_v.clear();
- };
+ }
void set(int i, int prim, float u, float v)
{
@@ -48,6 +49,25 @@ public:
m_v[i] = v;
}
+ int object()
+ {
+ return m_object;
+ }
+
+ int size() {
+ return m_num_pixels;
+ }
+
+ uint4 data(int i) {
+ return make_uint4(
+ m_object,
+ m_primitive[i],
+ __float_as_int(m_u[i]),
+ __float_as_int(m_v[i])
+ );
+ }
+
+
private:
int m_object;
int m_num_pixels;
@@ -66,7 +86,7 @@ public:
BakeData *init(const int object, const int num_pixels);
- bool bake(Device *device, DeviceScene *dscene, Scene *scene, PassType passtype, BakeData *bake_data, float result[]);
+ bool bake(Device *device, DeviceScene *dscene, Scene *scene, ShaderEvalType shader_type, BakeData *bake_data, float result[]);
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
void device_free(Device *device, DeviceScene *dscene);
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index ef81203..5b26d83 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -227,9 +227,9 @@ BakeData *Scene::bake_init(const int object, const int num_pixels)
return bake_manager->init(object, num_pixels);
}
-bool Scene::bake(PassType pass_type, BakeData *bake_data, float result[])
+bool Scene::bake(ShaderEvalType shader_type, BakeData *bake_data, float result[])
{
- return bake_manager->bake(device, &dscene, this, pass_type, bake_data, result);
+ return bake_manager->bake(device, &dscene, this, shader_type, bake_data, result);
}
Scene::MotionType Scene::need_motion(bool advanced_shading)
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index 22bfaa6..ee4eab8 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -206,7 +206,7 @@ public:
MotionType need_motion(bool advanced_shading = true);
BakeData *bake_init(const int object, const int num_pixels);
- bool bake(PassType pass_type, BakeData *bake_data, float result[]);
+ bool bake(ShaderEvalType shader_type, BakeData *bake_data, float result[]);
bool need_update();
bool need_reset();
diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h
index 8c597c4..1e62515 100644
--- a/intern/cycles/render/session.h
+++ b/intern/cycles/render/session.h
@@ -136,6 +136,7 @@ public:
void set_samples(int samples);
void set_pause(bool pause);
+ void update_scene();
void device_free();
protected:
struct DelayedReset {
@@ -147,7 +148,6 @@ protected:
void run();
- void update_scene();
void update_status_time(bool show_pause = false, bool show_done = false);
void tonemap(int sample);
More information about the Bf-blender-cvs
mailing list