Cycles: change __device and similar qualifiers to ccl_device in kernel code.
[blender.git] / intern / cycles / kernel / svm / svm_displace.h
1 /*
2  * Copyright 2011-2013 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16
17 CCL_NAMESPACE_BEGIN
18
19 /* Bump Node */
20
21 ccl_device void svm_node_set_bump(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
22 {
23 #ifdef __RAY_DIFFERENTIALS__
24         /* get normal input */
25         uint normal_offset, distance_offset, invert;
26         decode_node_uchar4(node.y, &normal_offset, &distance_offset, &invert, NULL);
27
28         float3 normal_in = stack_valid(normal_offset)? stack_load_float3(stack, normal_offset): sd->N;
29
30         /* get surface tangents from normal */
31         float3 Rx = cross(sd->dP.dy, normal_in);
32         float3 Ry = cross(normal_in, sd->dP.dx);
33
34         /* get bump values */
35         uint c_offset, x_offset, y_offset, strength_offset;
36         decode_node_uchar4(node.z, &c_offset, &x_offset, &y_offset, &strength_offset);
37
38         float h_c = stack_load_float(stack, c_offset);
39         float h_x = stack_load_float(stack, x_offset);
40         float h_y = stack_load_float(stack, y_offset);
41
42         /* compute surface gradient and determinant */
43         float det = dot(sd->dP.dx, Rx);
44         float3 surfgrad = (h_x - h_c)*Rx + (h_y - h_c)*Ry;
45
46         float absdet = fabsf(det);
47
48         float strength = stack_load_float(stack, strength_offset);
49         float distance = stack_load_float(stack, distance_offset);
50
51         if(invert)
52                 distance *= -1.0f;
53
54         strength = max(strength, 0.0f);
55
56         /* compute and output perturbed normal */
57         float3 normal_out = normalize(absdet*normal_in - distance*signf(det)*surfgrad);
58         normal_out = normalize(strength*normal_out + (1.0f - strength)*normal_in);
59         stack_store_float3(stack, node.w, normal_out);
60 #endif
61 }
62
63 /* Displacement Node */
64
65 ccl_device void svm_node_set_displacement(ShaderData *sd, float *stack, uint fac_offset)
66 {
67         float d = stack_load_float(stack, fac_offset);
68         sd->P += sd->N*d*0.1f; /* todo: get rid of this factor */
69 }
70
71 CCL_NAMESPACE_END
72