2011-04-27 11:58:34 +00:00
|
|
|
/*
|
|
|
|
* Copyright 2011, Blender Foundation.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
|
2012-01-20 17:49:17 +00:00
|
|
|
__device void kernel_shader_evaluate(KernelGlobals *kg, uint4 *input, float4 *output, ShaderEvalType type, int i)
|
2011-04-27 11:58:34 +00:00
|
|
|
{
|
|
|
|
ShaderData sd;
|
|
|
|
uint4 in = input[i];
|
2011-12-31 15:18:13 +00:00
|
|
|
float3 out;
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2011-12-31 15:18:13 +00:00
|
|
|
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;
|
2012-02-28 16:44:54 +00:00
|
|
|
float u = __int_as_float(in.x);
|
|
|
|
float v = __int_as_float(in.y);
|
2011-12-31 15:18:13 +00:00
|
|
|
|
|
|
|
ray.P = make_float3(0.0f, 0.0f, 0.0f);
|
2012-02-28 16:44:54 +00:00
|
|
|
ray.D = equirectangular_to_direction(u, v);
|
2011-12-31 15:18:13 +00:00
|
|
|
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 */
|
2012-01-20 17:49:17 +00:00
|
|
|
output[i] = make_float4(out.x, out.y, out.z, 0.0f);
|
2011-04-27 11:58:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
CCL_NAMESPACE_END
|
|
|
|
|