[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