add BLI_strcpy_rlen, replace strcat, which was used in misleading way.
[blender.git] / intern / cycles / render / shader.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 __SHADER_H__
20 #define __SHADER_H__
21
22 #include "attribute.h"
23 #include "kernel_types.h"
24
25 #include "util_map.h"
26 #include "util_param.h"
27 #include "util_string.h"
28 #include "util_types.h"
29
30 #ifdef WITH_OSL
31 #include <OSL/oslexec.h>
32 #endif
33
34 CCL_NAMESPACE_BEGIN
35
36 class Device;
37 class DeviceScene;
38 class Mesh;
39 class Progress;
40 class Scene;
41 class ShaderGraph;
42 struct float3;
43
44 /* Shader describing the appearance of a Mesh, Light or Background.
45  *
46  * While there is only a single shader graph, it has three outputs: surface,
47  * volume and displacement, that the shader manager will compile and execute
48  * separately. */
49
50 class Shader {
51 public:
52         /* name */
53         string name;
54         int pass_id;
55
56         /* shader graph */
57         ShaderGraph *graph;
58
59         /* shader graph with auto bump mapping included, we compile two shaders,
60          * with and without bump,  because the displacement method is a mesh
61          * level setting, so we need to handle both */
62         ShaderGraph *graph_bump;
63
64         /* sampling */
65         bool sample_as_light;
66         bool homogeneous_volume;
67
68         /* synchronization */
69         bool need_update;
70         bool need_update_attributes;
71
72         /* information about shader after compiling */
73         bool has_surface;
74         bool has_surface_emission;
75         bool has_surface_transparent;
76         bool has_volume;
77         bool has_displacement;
78         bool has_surface_bssrdf;
79
80         /* requested mesh attributes */
81         AttributeRequestSet attributes;
82
83         /* determined before compiling */
84         bool used;
85
86 #ifdef WITH_OSL
87         /* osl shading state references */
88         OSL::ShadingAttribStateRef osl_surface_ref;
89         OSL::ShadingAttribStateRef osl_surface_bump_ref;
90         OSL::ShadingAttribStateRef osl_volume_ref;
91         OSL::ShadingAttribStateRef osl_displacement_ref;
92 #endif
93
94         Shader();
95         ~Shader();
96
97         void set_graph(ShaderGraph *graph);
98         void tag_update(Scene *scene);
99         void tag_used(Scene *scene);
100 };
101
102 /* Shader Manager virtual base class
103  * 
104  * From this the SVM and OSL shader managers are derived, that do the actual
105  * shader compiling and device updating. */
106
107 class ShaderManager {
108 public:
109         bool need_update;
110
111         static ShaderManager *create(Scene *scene, int shadingsystem);
112         virtual ~ShaderManager();
113
114         virtual void reset(Scene *scene) = 0;
115
116         virtual bool use_osl() { return false; }
117
118         /* device update */
119         virtual void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) = 0;
120         virtual void device_free(Device *device, DeviceScene *dscene, Scene *scene) = 0;
121
122         void device_update_shaders_used(Scene *scene);
123         void device_update_common(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
124         void device_free_common(Device *device, DeviceScene *dscene, Scene *scene);
125
126         /* get globally unique id for a type of attribute */
127         uint get_attribute_id(ustring name);
128         uint get_attribute_id(AttributeStandard std);
129
130         /* get shader id for mesh faces */
131         int get_shader_id(uint shader, Mesh *mesh = NULL, bool smooth = false);
132
133         /* add default shaders to scene, to use as default for things that don't
134          * have any shader assigned explicitly */
135         static void add_default(Scene *scene);
136
137 protected:
138         ShaderManager();
139
140         typedef unordered_map<ustring, uint, ustringHash> AttributeIDMap;
141         AttributeIDMap unique_attribute_id;
142
143         size_t bssrdf_table_offset;
144 };
145
146 CCL_NAMESPACE_END
147
148 #endif /* __SHADER_H__ */
149