[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