98ea3755e2d0565d8d8aa13b487b4b552901e490
[blender.git] / intern / cycles / kernel / osl / osl_services.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 #ifndef __OSL_SERVICES_H__
20 #define __OSL_SERVICES_H__
21
22 /* OSL Render Services
23  *
24  * Implementation of OSL render services, to retriever matrices, attributes,
25  * textures and point clouds. In principle this should only be accessing
26  * kernel data, but currently we also reach back into the Scene to retrieve
27  * attributes.
28  */
29
30 #include <OSL/oslexec.h>
31 #include <OSL/oslclosure.h>
32
33 CCL_NAMESPACE_BEGIN
34
35 class Object;
36 class Scene;
37 class Shader;
38 class ShaderData;
39 class float3;
40 class KernelGlobals;
41
42 class OSLRenderServices : public OSL::RendererServices
43 {
44 public:
45         OSLRenderServices();
46         ~OSLRenderServices();
47         
48         void thread_init(KernelGlobals *kernel_globals);
49
50         bool get_matrix(OSL::Matrix44 &result, OSL::TransformationPtr xform, float time);
51         bool get_inverse_matrix(OSL::Matrix44 &result, OSL::TransformationPtr xform, float time);
52         
53         bool get_matrix(OSL::Matrix44 &result, ustring from, float time);
54         bool get_inverse_matrix(OSL::Matrix44 &result, ustring to, float time);
55         
56         bool get_matrix(OSL::Matrix44 &result, OSL::TransformationPtr xform);
57         bool get_matrix(OSL::Matrix44 &result, ustring from);
58
59         bool get_array_attribute(void *renderstate, bool derivatives, 
60                                  ustring object, TypeDesc type, ustring name,
61                                  int index, void *val);
62         bool get_attribute(void *renderstate, bool derivatives, ustring object,
63                            TypeDesc type, ustring name, void *val);
64
65         bool get_userdata(bool derivatives, ustring name, TypeDesc type, 
66                           void *renderstate, void *val);
67         bool has_userdata(ustring name, TypeDesc type, void *renderstate);
68
69         void *get_pointcloud_attr_query(ustring *attr_names,
70                                         TypeDesc *attr_types, int nattrs);
71                                    
72         int pointcloud_search(OSL::ShaderGlobals *sg, ustring filename, const OSL::Vec3 &center,
73                                                 float radius, int max_points, bool sort, size_t *out_indices,
74                                                 float *out_distances, int derivs_offset);
75
76         int pointcloud_get(ustring filename, size_t *indices, int count, ustring attr_name,
77                                                 TypeDesc attr_type, void *out_data);
78
79 private:
80         KernelGlobals *kernel_globals;
81
82         static ustring u_distance;
83         static ustring u_index;
84         static ustring u_camera;
85         static ustring u_screen;
86         static ustring u_raster;
87         static ustring u_ndc;
88         static ustring u_empty;
89 };
90
91 CCL_NAMESPACE_END
92
93 #endif /* __OSL_SERVICES_H__  */
94