[Bf-blender-cvs] [92ded7c] bake-cycles: Cycles-Bake: data passes and trioffset

Dalai Felinto noreply at git.blender.org
Wed Apr 23 02:46:44 CEST 2014


Commit: 92ded7c0d2152ddcedb596c24b8e283101e769f1
Author: Dalai Felinto
Date:   Wed Jan 22 13:58:05 2014 -0200
https://developer.blender.org/rB92ded7c0d2152ddcedb596c24b8e283101e769f1

Cycles-Bake: data passes and trioffset

note: although diffuse seems to be working, UV still doesnt work. No idea why

===================================================================

M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/kernel/kernel_displace.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

===================================================================

diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 27f3ba7..8ac44df 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 "mesh.h"
 #include "object.h"
 #include "scene.h"
 #include "session.h"
@@ -578,10 +579,12 @@ void BlenderSession::bake(BL::Object b_object, const string& pass_type, BL::Bake
 
 	/* find object index. todo: is arbitrary - copied from mesh_displace.cpp */
 	size_t object_index = ~0;
+	int tri_offset = 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;
+			tri_offset = scene->objects[i]->mesh->tri_offset;
 			break;
 		}
 	}
@@ -612,7 +615,7 @@ void BlenderSession::bake(BL::Object b_object, const string& pass_type, BL::Bake
 	/* when used, non-instanced convention: object = ~object */
 	int object = ~object_index;
 
-	BakeData *bake_data = scene->bake_init(object, num_pixels);
+	BakeData *bake_data = scene->bake_init(object, tri_offset, num_pixels);
 
 	populate_bake_data(bake_data, pixel_array, num_pixels);
 
diff --git a/intern/cycles/kernel/kernel_displace.h b/intern/cycles/kernel/kernel_displace.h
index 088bd52..852fd6f 100644
--- a/intern/cycles/kernel/kernel_displace.h
+++ b/intern/cycles/kernel/kernel_displace.h
@@ -16,6 +16,8 @@
 
 CCL_NAMESPACE_BEGIN
 
+#include "kernel_primitive.h"
+
 ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input, ccl_global float4 *output, ShaderEvalType type, int i)
 {
 	ShaderData sd;
@@ -27,16 +29,16 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input,
 	float u = __uint_as_float(in.z);
 	float v = __uint_as_float(in.w);
 
-	/* TODO: I need to offset the prim for the object/mesh
-	   if I have more than one object in the scene */
-	float3 P = triangle_point_MT(kg, prim, u, v);
-
 	if (prim == -1) {
 		/* write output */
 		output[i] = make_float4(0.0f);
 		return;
 	}
 
+	int shader;
+	float3 P = triangle_point_MT(kg, prim, u, v);
+	float3 Ng = triangle_normal_MT(kg, prim, &shader);
+
 	/* dummy initilizations copied from SHADER_EVAL_DISPLACE */
 	float3 I = make_float3(0.f);
 	float t = 0.f;
@@ -44,15 +46,70 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input,
 	int bounce = 0;
 	int segment = ~0;
 
+	/* TODO, disable the closures we won't need */
+	shader_setup_from_sample(kg, &sd, P, Ng, I, shader, object, prim, u, v, t, time, bounce, segment);
+
 	switch (type) {
 		/* data passes */
 		case SHADER_EVAL_NORMAL:
+		{
+			/* TODO: code the normal in whatever space we want */
+			out = sd.N;
+			break;
+		}
 		case SHADER_EVAL_UV:
+		{
+			/* XXX not working ... no idea why */
+			shader_eval_surface(kg, &sd, 0.f, 0, SHADER_CONTEXT_MAIN);
+			out = primitive_uv(kg, &sd);
+			break;
+		}
 		case SHADER_EVAL_DIFFUSE_COLOR:
+		{
+			shader_eval_surface(kg, &sd, 0.f, 0, SHADER_CONTEXT_MAIN);
+			out = shader_bsdf_diffuse(kg, &sd);
+			break;
+		}
 		case SHADER_EVAL_GLOSSY_COLOR:
+		{
+			shader_eval_surface(kg, &sd, 0.f, 0, SHADER_CONTEXT_MAIN);
+			out = shader_bsdf_glossy(kg, &sd);
+			break;
+		}
 		case SHADER_EVAL_TRANSMISSION_COLOR:
+		{
+			shader_eval_surface(kg, &sd, 0.f, 0, SHADER_CONTEXT_MAIN);
+			out = shader_bsdf_transmission(kg, &sd);
+			break;
+		}
 		case SHADER_EVAL_SUBSURFACE_COLOR:
+		{
+			shader_eval_surface(kg, &sd, 0.f, 0, SHADER_CONTEXT_MAIN);
+			out = shader_bsdf_subsurface(kg, &sd);
+			break;
+		}
 		case SHADER_EVAL_EMISSION:
+		{
+			shader_eval_surface(kg, &sd, 0.f, 0, SHADER_CONTEXT_EMISSION);
+
+#ifdef __MULTI_CLOSURE__
+			float3 eval = make_float3(0.0f, 0.0f, 0.0f);
+
+			for(int i = 0; i< sd.num_closure; i++) {
+				const ShaderClosure *sc = &sd.closure[i];
+				if(sc->type == CLOSURE_EMISSION_ID)
+					eval += sc->weight;
+			}
+
+			out = eval;
+#else
+			if(sd.closure.type == CLOSURE_EMISSION_ID)
+				out = sd.closure.weight;
+			else
+				out = make_float3(0.0f, 0.0f, 0.0f);
+#endif
+			break;
+		}
 
 		/* light passes */
 		case SHADER_EVAL_AO:
diff --git a/intern/cycles/render/bake.cpp b/intern/cycles/render/bake.cpp
index 89956b2..6094d60 100644
--- a/intern/cycles/render/bake.cpp
+++ b/intern/cycles/render/bake.cpp
@@ -42,9 +42,9 @@ BakeManager::BakeManager()
 	need_update = true;
 }
 
-BakeData *BakeManager::init(const int object, const int num_pixels)
+BakeData *BakeManager::init(const int object, const int tri_offset, const int num_pixels)
 {
-	bake_data = new BakeData(object, num_pixels);
+	bake_data = new BakeData(object, tri_offset, num_pixels);
 	return bake_data;
 }
 
diff --git a/intern/cycles/render/bake.h b/intern/cycles/render/bake.h
index 10ae9e7..6f06123 100644
--- a/intern/cycles/render/bake.h
+++ b/intern/cycles/render/bake.h
@@ -26,8 +26,9 @@ CCL_NAMESPACE_BEGIN
 
 class BakeData {
 public:
-	BakeData(const int object, const int num_pixels):
+	BakeData(const int object, const int tri_offset, const int num_pixels):
 	m_object(object),
+	m_tri_offset(tri_offset),
 	m_num_pixels(num_pixels)
 	{
 		m_primitive.resize(num_pixels);
@@ -44,7 +45,7 @@ public:
 
 	void set(int i, int prim, float u, float v)
 	{
-		m_primitive[i] = prim;
+		m_primitive[i] = (prim == -1 ? -1 : m_tri_offset + prim);
 		m_u[i] = u;
 		m_v[i] = v;
 	}
@@ -70,6 +71,7 @@ public:
 
 private:
 	int m_object;
+	int m_tri_offset;
 	int m_num_pixels;
 	vector<int>m_primitive;
 	vector<float>m_u;
@@ -84,7 +86,7 @@ public:
 	BakeManager();
 	~BakeManager();
 
-	BakeData *init(const int object, const int num_pixels);
+	BakeData *init(const int object, const int tri_offset, const int num_pixels);
 
 	bool bake(Device *device, DeviceScene *dscene, Scene *scene, ShaderEvalType shader_type, BakeData *bake_data, float result[]);
 
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index 5b26d83..202cbcc 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -222,9 +222,9 @@ void Scene::device_update(Device *device_, Progress& progress)
 	device->const_copy_to("__data", &dscene.data, sizeof(dscene.data));
 }
 
-BakeData *Scene::bake_init(const int object, const int num_pixels)
+BakeData *Scene::bake_init(const int object, const int tri_offset, const int num_pixels)
 {
-	return bake_manager->init(object, num_pixels);
+	return bake_manager->init(object, tri_offset, num_pixels);
 }
 
 bool Scene::bake(ShaderEvalType shader_type, BakeData *bake_data, float result[])
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index ee4eab8..20aec0a 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -205,7 +205,7 @@ 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);
+	BakeData *bake_init(const int object, const int tri_offset, const int num_pixels);
 	bool bake(ShaderEvalType shader_type, BakeData *bake_data, float result[]);
 
 	bool need_update();




More information about the Bf-blender-cvs mailing list