[Bf-blender-cvs] [ab2737c] bake-cycles: Cycles-Bake: create BakeManager to be handled via scene
Dalai Felinto
noreply at git.blender.org
Wed Apr 23 02:46:36 CEST 2014
Commit: ab2737ce9d9d74fbd3226bb232f67c0672fb9663
Author: Dalai Felinto
Date: Fri Jan 17 19:29:19 2014 -0200
https://developer.blender.org/rBab2737ce9d9d74fbd3226bb232f67c0672fb9663
Cycles-Bake: create BakeManager to be handled via scene
next: create a real BakeManager::bake (based on mesh_displace.cp)
next: expand kernel_displace.h (kernel_shader_evaluate()) for other shader types)
===================================================================
M intern/cycles/blender/blender_session.cpp
M intern/cycles/render/bake.cpp
M intern/cycles/render/bake.h
M intern/cycles/render/scene.cpp
M intern/cycles/render/scene.h
===================================================================
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 76e668f..e7fa6d1 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -498,11 +498,10 @@ void BlenderSession::render()
sync = NULL;
}
-void _bake_uv(BL::Object b_object, PassType pass_type, BL::BakePixel pixel_array, int num_pixels, int depth, float result[])
+void _bake_bary_uv(BL::Object b_object, PassType pass_type, BL::BakePixel pixel_array, int num_pixels, int depth, float result[])
{
BL::BakePixel bp = pixel_array;
- /* just plots the internal uv back to the results for now */
for (int i=0; i < num_pixels; i++) {
int offset = i * depth;
result[offset] = bp.u();
@@ -512,47 +511,33 @@ void _bake_uv(BL::Object b_object, PassType pass_type, BL::BakePixel pixel_array
}
}
-void _bake_background(BL::Object b_object, PassType pass_type, BL::BakePixel pixel_array, int num_pixels, int depth, float result[]) {}
-
-void _bake_combined(BL::Object b_object, PassType pass_type, BL::BakePixel pixel_array, int num_pixels, int depth, float result[]) {}
+static void populate_bake_data(BakeData *data, BL::BakePixel pixel_array, const int num_pixels)
+{
+ BL::BakePixel bp = pixel_array;
-void _bake_depth(BL::Object b_object, PassType pass_type, BL::BakePixel pixel_array, int num_pixels, int depth, float result[]) {}
+ int i;
+ for (i=0; i < num_pixels; i++) {
+ data->set(i, bp.primitive_id(), bp.u(), bp.v());
+ bp = bp.next();
+ }
+}
void BlenderSession::bake(BL::Object b_object, const string& s_pass_type, BL::BakePixel pixel_array, int num_pixels, int depth, float result[])
{
+ int object = 0;
- /* XXX temporary function until we get real pass_types (int) instead of strings */
PassType pass_type = get_pass_type(s_pass_type);
- /*****
- TODO LIST:
+ BakeData *bake_data = scene->bake_init(object, num_pixels);
- 1) get render result to be damped in float result[]
+ populate_bake_data(bake_data, pixel_array, num_pixels);
- 2) convert BakePixel to position + normal list + render array.
+ scene->bake(pass_type, bake_data, result);
- 3) create new render camera 'BAKE'
+ return;
- 4) use BL::BakePixel instead of BakePixel <done> :)
-
- */
-
- switch(pass_type) {
- case PASS_UV:
- _bake_uv(b_object, pass_type, pixel_array, num_pixels, depth, result);
- break;
- case PASS_BACKGROUND:
- _bake_background(b_object, pass_type, pixel_array, num_pixels, depth, result);
- break;
- case PASS_COMBINED:
- _bake_combined(b_object, pass_type, pixel_array, num_pixels, depth, result);
- break;
- case PASS_DEPTH:
- _bake_depth(b_object, pass_type, pixel_array, num_pixels, depth, result);
- break;
- default:
- break;
- }
+ /* 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);
}
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/render/bake.cpp b/intern/cycles/render/bake.cpp
index ef16a41..a7ee39e 100644
--- a/intern/cycles/render/bake.cpp
+++ b/intern/cycles/render/bake.cpp
@@ -18,5 +18,43 @@
CCL_NAMESPACE_BEGIN
+void BakeManager::device_free(Device *device, DeviceScene *dscene) {}
+
+void BakeManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
+{
+ if(!need_update)
+ return;
+
+ if(progress.get_cancel()) return;
+
+ need_update = false;
+}
+
+BakeManager::~BakeManager()
+{
+ if (bake_data)
+ delete bake_data;
+}
+
+BakeManager::BakeManager()
+{
+ bake_data = NULL;
+ need_update = true;
+}
+
+BakeData *BakeManager::init(const int object, const int num_pixels)
+{
+ bake_data = new BakeData(object, num_pixels);
+ return bake_data;
+}
+
+bool BakeManager::bake(Device *device, DeviceScene *dscene, Scene *scene, PassType passtype, BakeData *bake_data, float result[])
+{
+
+ /* TODO adapt code from mesh_displace.cpp */
+
+ return false;
+}
+
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/bake.h b/intern/cycles/render/bake.h
index db287c3..3230a20 100644
--- a/intern/cycles/render/bake.h
+++ b/intern/cycles/render/bake.h
@@ -21,10 +21,64 @@
#include "device.h"
#include "scene.h"
#include "session.h"
-#include "bake.h"
CCL_NAMESPACE_BEGIN
+class BakeData {
+public:
+ BakeData(const int object, const int num_pixels):
+ m_object(object),
+ m_num_pixels(num_pixels)
+ {
+ 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)
+ {
+ m_primitive[i] = prim;
+ m_u[i] = u;
+ m_v[i] = v;
+ }
+
+private:
+ int m_object;
+ int m_num_pixels;
+ vector<int>m_primitive;
+ vector<float>m_u;
+ vector<float>m_v;
+};
+
+class BakeManager {
+public:
+
+ bool need_update;
+
+ BakeManager();
+ ~BakeManager();
+
+ BakeData *init(const int object, const int num_pixels);
+
+ bool bake(Device *device, DeviceScene *dscene, Scene *scene, PassType passtype, BakeData *bake_data, float result[]);
+
+ void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
+ void device_free(Device *device, DeviceScene *dscene);
+ bool modified(const CurveSystemManager& CurveSystemManager);
+ void tag_update(Scene *scene);
+ void tag_update_mesh();
+
+private:
+ BakeData *bake_data;
+};
+
+
//void do_bake(BL::Object b_object, const string& pass_type, BakePixel pixel_array[], int num_pixels, int depth, float pixels[]);
CCL_NAMESPACE_END
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index 2ed4efe..ef81203 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -17,6 +17,7 @@
#include <stdlib.h>
#include "background.h"
+#include "bake.h"
#include "camera.h"
#include "curves.h"
#include "device.h"
@@ -54,6 +55,7 @@ Scene::Scene(const SceneParams& params_, const DeviceInfo& device_info_)
image_manager = new ImageManager();
particle_system_manager = new ParticleSystemManager();
curve_system_manager = new CurveSystemManager();
+ bake_manager = new BakeManager();
/* OSL only works on the CPU */
if(device_info_.type == DEVICE_CPU)
@@ -103,6 +105,8 @@ void Scene::free_memory(bool final)
particle_system_manager->device_free(device, &dscene);
curve_system_manager->device_free(device, &dscene);
+ bake_manager->device_free(device, &dscene);
+
if(!params.persistent_data || final)
image_manager->device_free(device, &dscene);
@@ -122,6 +126,7 @@ void Scene::free_memory(bool final)
delete particle_system_manager;
delete curve_system_manager;
delete image_manager;
+ delete bake_manager;
}
}
@@ -208,10 +213,25 @@ void Scene::device_update(Device *device_, Progress& progress)
if(progress.get_cancel()) return;
+ progress.set_status("Updating Baking");
+ bake_manager->device_update(device, &dscene, this, progress);
+
+ if(progress.get_cancel()) return;
+
progress.set_status("Updating Device", "Writing constant memory");
device->const_copy_to("__data", &dscene.data, sizeof(dscene.data));
}
+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[])
+{
+ return bake_manager->bake(device, &dscene, this, pass_type, bake_data, result);
+}
+
Scene::MotionType Scene::need_motion(bool advanced_shading)
{
if(integrator->motion_blur)
@@ -258,7 +278,8 @@ bool Scene::need_reset()
|| integrator->need_update
|| shader_manager->need_update
|| particle_system_manager->need_update
- || curve_system_manager->need_update);
+ || curve_system_manager->need_update
+ || bake_manager->need_update);
}
void Scene::reset()
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index b6a4d6c..22bfaa6 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -51,6 +51,8 @@ class CurveSystemManager;
class Shader;
class ShaderManager;
class Progress;
+class BakeManager;
+class BakeData;
/* Scene Device Data */
@@ -174,6 +176,7 @@ public:
ObjectManager *object_manager;
ParticleSystemManager *particle_system_manager;
CurveSystemManager *curve_system_manager;
+ BakeManager *bake_manager;
/* default shaders */
int default_surface;
@@ -202,6 +205,9 @@ public:
enum MotionType { MOTION_NONE = 0, MOTION_PASS, MOTION_BLUR };
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 need_update();
bool need_reset();
More information about the Bf-blender-cvs
mailing list