diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-12-31 19:18:13 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-12-31 19:18:13 +0400 |
commit | b5595298d36a5023cc33ed41463fd6c032f2ec7b (patch) | |
tree | e3a404393ff4a8e39a991f9a3d8ca78c0d3033a7 /intern/cycles/kernel/kernel_displace.h | |
parent | 1b4487e813edac9c5b57b6d5c6175c46c4a54b1c (diff) |
Cycles code refactoring: change displace kernel into more generic shader
evaluate kernel, added background shader evaluate.
Diffstat (limited to 'intern/cycles/kernel/kernel_displace.h')
-rw-r--r-- | intern/cycles/kernel/kernel_displace.h | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/intern/cycles/kernel/kernel_displace.h b/intern/cycles/kernel/kernel_displace.h index ef6c3810a75..c39e5e43dbb 100644 --- a/intern/cycles/kernel/kernel_displace.h +++ b/intern/cycles/kernel/kernel_displace.h @@ -18,17 +18,51 @@ CCL_NAMESPACE_BEGIN -__device void kernel_displace(KernelGlobals *kg, uint4 *input, float3 *offset, int i) +__device void kernel_shader_evaluate(KernelGlobals *kg, uint4 *input, float3 *output, ShaderEvalType type, int i) { - /* setup shader data */ ShaderData sd; uint4 in = input[i]; - shader_setup_from_displace(kg, &sd, in.x, in.y, __int_as_float(in.z), __int_as_float(in.w)); + float3 out; - /* evaluate */ - float3 P = sd.P; - shader_eval_displacement(kg, &sd); - offset[i] = sd.P - P; + if(type == SHADER_EVAL_DISPLACE) { + /* setup shader data */ + int object = in.x; + int prim = in.y; + float u = __int_as_float(in.z); + float v = __int_as_float(in.w); + + shader_setup_from_displace(kg, &sd, object, prim, u, v); + + /* evaluate */ + float3 P = sd.P; + shader_eval_displacement(kg, &sd); + out = sd.P - P; + } + else { // SHADER_EVAL_BACKGROUND + /* setup ray */ + Ray ray; + + ray.P = make_float3(0.0f, 0.0f, 0.0f); + ray.D = make_float3(__int_as_float(in.x), __int_as_float(in.y), __int_as_float(in.z)); + ray.t = 0.0f; + +#ifdef __RAY_DIFFERENTIALS__ + ray.dD.dx = make_float3(0.0f, 0.0f, 0.0f); + ray.dD.dy = make_float3(0.0f, 0.0f, 0.0f); + ray.dP.dx = make_float3(0.0f, 0.0f, 0.0f); + ray.dP.dy = make_float3(0.0f, 0.0f, 0.0f); +#endif + + /* setup shader data */ + shader_setup_from_background(kg, &sd, &ray); + + /* evaluate */ + int flag = 0; /* we can't know which type of BSDF this is for */ + out = shader_eval_background(kg, &sd, flag); + } + + /* write output */ + output[i] = out; } CCL_NAMESPACE_END |