Merging r46096 through r46110 from trunk into soc-2011-tomato
[blender-staging.git] / intern / cycles / kernel / kernel_object.h
1 /*
2  * Copyright 2011, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18
19 CCL_NAMESPACE_BEGIN
20
21 enum ObjectTransform {
22         OBJECT_TRANSFORM = 0,
23         OBJECT_INVERSE_TRANSFORM = 4,
24         OBJECT_NORMAL_TRANSFORM = 8,
25         OBJECT_PROPERTIES = 12
26 };
27
28 __device_inline Transform object_fetch_transform(KernelGlobals *kg, int object, enum ObjectTransform type)
29 {
30         Transform tfm;
31
32         int offset = object*OBJECT_SIZE + (int)type;
33
34         tfm.x = kernel_tex_fetch(__objects, offset + 0);
35         tfm.y = kernel_tex_fetch(__objects, offset + 1);
36         tfm.z = kernel_tex_fetch(__objects, offset + 2);
37         tfm.w = kernel_tex_fetch(__objects, offset + 3);
38
39         return tfm;
40 }
41
42 __device_inline void object_position_transform(KernelGlobals *kg, int object, float3 *P)
43 {
44         Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
45         *P = transform_point(&tfm, *P);
46 }
47
48 __device_inline void object_normal_transform(KernelGlobals *kg, int object, float3 *N)
49 {
50         Transform tfm = object_fetch_transform(kg, object, OBJECT_NORMAL_TRANSFORM);
51         *N = normalize(transform_direction(&tfm, *N));
52 }
53
54 __device_inline void object_dir_transform(KernelGlobals *kg, int object, float3 *D)
55 {
56         Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
57         *D = transform_direction(&tfm, *D);
58 }
59
60 __device_inline float object_surface_area(KernelGlobals *kg, int object)
61 {
62         int offset = object*OBJECT_SIZE + OBJECT_PROPERTIES;
63         float4 f = kernel_tex_fetch(__objects, offset);
64         return f.x;
65 }
66
67 __device_inline float object_pass_id(KernelGlobals *kg, int object)
68 {
69         if(object == ~0)
70                 return 0.0f;
71
72         int offset = object*OBJECT_SIZE + OBJECT_PROPERTIES;
73         float4 f = kernel_tex_fetch(__objects, offset);
74         return f.y;
75 }
76
77 CCL_NAMESPACE_END
78