Cleanup: replace attrib w/ attr
[blender.git] / source / blender / gpu / GPU_material.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
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  * The Original Code is Copyright (C) 2005 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Brecht Van Lommel.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file GPU_material.h
29  *  \ingroup gpu
30  */
31
32 #ifndef __GPU_MATERIAL_H__
33 #define __GPU_MATERIAL_H__
34
35 #include "DNA_customdata_types.h" /* for CustomDataType */
36 #include "DNA_listBase.h"
37
38 #include "BLI_sys_types.h" /* for bool */
39
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43
44 struct GPUMaterial;
45 struct GPUNode;
46 struct GPUNodeLink;
47 struct GPUNodeStack;
48 struct GPUTexture;
49 struct GPUUniformBuffer;
50 struct GPUVertAttrLayers;
51 struct Image;
52 struct ImageUser;
53 struct ListBase;
54 struct Main;
55 struct Material;
56 struct Object;
57 struct PreviewImage;
58 struct Scene;
59 struct World;
60 struct bNode;
61 struct bNodeTree;
62
63 typedef struct GPUMaterial GPUMaterial;
64 typedef struct GPUNode GPUNode;
65 typedef struct GPUNodeLink GPUNodeLink;
66
67 typedef struct GPUParticleInfo GPUParticleInfo;
68
69 /* Functions to create GPU Materials nodes */
70
71 typedef enum eGPUType {
72         /* Keep in sync with GPU_DATATYPE_STR */
73         /* The value indicates the number of elements in each type */
74         GPU_NONE = 0,
75         GPU_FLOAT = 1,
76         GPU_VEC2 = 2,
77         GPU_VEC3 = 3,
78         GPU_VEC4 = 4,
79         GPU_MAT3 = 9,
80         GPU_MAT4 = 16,
81
82         /* Values not in GPU_DATATYPE_STR */
83         GPU_TEX1D_ARRAY = 1001,
84         GPU_TEX2D = 1002,
85         GPU_TEX3D = 1003,
86         GPU_SHADOW2D = 1004,
87         GPU_TEXCUBE = 1005,
88
89         /* GLSL Struct types */
90         GPU_CLOSURE = 1006,
91
92         /* Opengl Attributes */
93         GPU_ATTR = 3001,
94 } eGPUType;
95
96 typedef enum eGPUBuiltin {
97         GPU_VIEW_MATRIX =           (1 << 0),
98         GPU_OBJECT_MATRIX =         (1 << 1),
99         GPU_INVERSE_VIEW_MATRIX =   (1 << 2),
100         GPU_INVERSE_OBJECT_MATRIX = (1 << 3),
101         GPU_VIEW_POSITION =         (1 << 4),
102         GPU_VIEW_NORMAL =           (1 << 5),
103         GPU_OBCOLOR =               (1 << 6),
104         GPU_AUTO_BUMPSCALE =        (1 << 7),
105         GPU_CAMERA_TEXCO_FACTORS =  (1 << 8),
106         GPU_PARTICLE_SCALAR_PROPS = (1 << 9),
107         GPU_PARTICLE_LOCATION =     (1 << 10),
108         GPU_PARTICLE_VELOCITY =     (1 << 11),
109         GPU_PARTICLE_ANG_VELOCITY = (1 << 12),
110         GPU_LOC_TO_VIEW_MATRIX =    (1 << 13),
111         GPU_INVERSE_LOC_TO_VIEW_MATRIX = (1 << 14),
112         GPU_OBJECT_INFO =           (1 << 15),
113         GPU_VOLUME_DENSITY =        (1 << 16),
114         GPU_VOLUME_FLAME =          (1 << 17),
115         GPU_VOLUME_TEMPERATURE =    (1 << 18),
116         GPU_BARYCENTRIC_TEXCO =     (1 << 19),
117         GPU_BARYCENTRIC_DIST =      (1 << 20),
118 } eGPUBuiltin;
119
120 typedef enum eGPUMatFlag {
121         GPU_MATFLAG_DIFFUSE       = (1 << 0),
122         GPU_MATFLAG_GLOSSY        = (1 << 1),
123         GPU_MATFLAG_REFRACT       = (1 << 2),
124         GPU_MATFLAG_SSS           = (1 << 3),
125 } eGPUMatFlag;
126
127 typedef enum eGPUBlendMode {
128         GPU_BLEND_SOLID = 0,
129         GPU_BLEND_ADD = 1,
130         GPU_BLEND_ALPHA = 2,
131         GPU_BLEND_CLIP = 4,
132         GPU_BLEND_ALPHA_SORT = 8,
133         GPU_BLEND_ALPHA_TO_COVERAGE = 16,
134 } eGPUBlendMode;
135
136 typedef struct GPUNodeStack {
137         eGPUType type;
138         float vec[4];
139         struct GPUNodeLink *link;
140         bool hasinput;
141         bool hasoutput;
142         short sockettype;
143         bool end;
144 } GPUNodeStack;
145
146 typedef enum eGPUMaterialStatus {
147         GPU_MAT_FAILED = 0,
148         GPU_MAT_QUEUED,
149         GPU_MAT_SUCCESS,
150 } eGPUMaterialStatus;
151
152 GPUNodeLink *GPU_attribute(CustomDataType type, const char *name);
153 GPUNodeLink *GPU_constant(float *num);
154 GPUNodeLink *GPU_uniform(float *num);
155 GPUNodeLink *GPU_image(struct Image *ima, struct ImageUser *iuser, bool is_data);
156 GPUNodeLink *GPU_color_band(GPUMaterial *mat, int size, float *pixels, float *layer);
157 GPUNodeLink *GPU_builtin(eGPUBuiltin builtin);
158
159 bool GPU_link(GPUMaterial *mat, const char *name, ...);
160 bool GPU_stack_link(GPUMaterial *mat, struct bNode *node, const char *name, GPUNodeStack *in, GPUNodeStack *out, ...);
161 GPUNodeLink *GPU_uniformbuffer_link_out(
162         struct GPUMaterial *mat, struct bNode *node,
163         struct GPUNodeStack *stack, const int index);
164
165 void GPU_material_output_link(GPUMaterial *material, GPUNodeLink *link);
166 eGPUBuiltin GPU_get_material_builtins(GPUMaterial *material);
167
168 void GPU_material_sss_profile_create(GPUMaterial *material, float radii[3], short *falloff_type, float *sharpness);
169 struct GPUUniformBuffer *GPU_material_sss_profile_get(
170         GPUMaterial *material, int sample_len, struct GPUTexture **tex_profile);
171
172 /* High level functions to create and use GPU materials */
173 GPUMaterial *GPU_material_from_nodetree_find(
174         struct ListBase *gpumaterials, const void *engine_type, int options);
175 GPUMaterial *GPU_material_from_nodetree(
176         struct Scene *scene, struct bNodeTree *ntree, struct ListBase *gpumaterials, const void *engine_type, int options,
177         const char *vert_code, const char *geom_code, const char *frag_lib, const char *defines, const char *name);
178 void GPU_material_compile(GPUMaterial *mat);
179 void GPU_material_free(struct ListBase *gpumaterial);
180
181 void GPU_materials_free(struct Main *bmain);
182
183 struct Scene *GPU_material_scene(GPUMaterial *material);
184 struct GPUPass *GPU_material_get_pass(GPUMaterial *material);
185 struct ListBase *GPU_material_get_inputs(GPUMaterial *material);
186 eGPUMaterialStatus GPU_material_status(GPUMaterial *mat);
187
188 struct GPUUniformBuffer *GPU_material_uniform_buffer_get(GPUMaterial *material);
189 void GPU_material_uniform_buffer_create(GPUMaterial *material, ListBase *inputs);
190 struct GPUUniformBuffer *GPU_material_create_sss_profile_ubo(void);
191
192 void GPU_material_vertex_attrs(
193         GPUMaterial *material,
194         struct GPUVertAttrLayers *attrs);
195
196 bool GPU_material_do_color_management(GPUMaterial *mat);
197 bool GPU_material_use_domain_surface(GPUMaterial *mat);
198 bool GPU_material_use_domain_volume(GPUMaterial *mat);
199
200 void GPU_material_flag_set(GPUMaterial *mat, eGPUMatFlag flag);
201 bool GPU_material_flag_get(GPUMaterial *mat, eGPUMatFlag flag);
202
203 void GPU_pass_cache_init(void);
204 void GPU_pass_cache_garbage_collect(void);
205 void GPU_pass_cache_free(void);
206
207 #ifdef __cplusplus
208 }
209 #endif
210
211 #endif /*__GPU_MATERIAL_H__*/