[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