cc8bc473a3f1364e708b3e6b934423fca34147d4
[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 CCL_NAMESPACE_BEGIN
31
32 class Device;
33 class DeviceScene;
34 class Mesh;
35 class Progress;
36 class Scene;
37 class ShaderGraph;
38 struct float3;
39
40 /* Shader describing the appearance of a Mesh, Light or Background.
41  *
42  * While there is only a single shader graph, it has three outputs: surface,
43  * volume and displacement, that the shader manager will compile and execute
44  * separately. */
45
46 class Shader {
47 public:
48         /* name */
49         string name;
50
51         /* shader graph */
52         ShaderGraph *graph;
53
54         /* shader graph with auto bump mapping included, we compile two shaders,
55            with and without bump,  because the displacement method is a mesh
56            level setting, so we need to handle both */
57         ShaderGraph *graph_bump;
58
59         /* synchronization */
60         bool need_update;
61         bool need_update_attributes;
62
63         /* information about shader after compiling */
64         bool has_surface;
65         bool has_surface_emission;
66         bool has_volume;
67         bool has_displacement;
68
69         /* requested mesh attributes */
70         AttributeRequestSet attributes;
71
72         Shader();
73         ~Shader();
74
75         void set_graph(ShaderGraph *graph);
76         void tag_update(Scene *scene);
77 };
78
79 /* Shader Manager virtual base class
80  * 
81  * From this the SVM and OSL shader managers are derived, that do the actual
82  * shader compiling and device updating. */
83
84 class ShaderManager {
85 public:
86         bool need_update;
87
88         static ShaderManager *create(Scene *scene);
89         virtual ~ShaderManager();
90
91         /* device update */
92         virtual void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) = 0;
93         virtual void device_free(Device *device, DeviceScene *dscene) = 0;
94
95         /* get globally unique id for a type of attribute */
96         uint get_attribute_id(ustring name);
97         uint get_attribute_id(Attribute::Standard std);
98
99         /* get shader id for mesh faces */
100         int get_shader_id(uint shader, Mesh *mesh = NULL, bool smooth = false);
101
102         /* add default shaders to scene, to use as default for things that don't
103            have any shader assigned explicitly */
104         static void add_default(Scene *scene);
105
106 protected:
107         ShaderManager();
108
109         typedef unordered_map<ustring, uint, ustringHash> AttributeIDMap;
110         AttributeIDMap unique_attribute_id;
111 };
112
113 CCL_NAMESPACE_END
114
115 #endif /* __SHADER_H__ */
116