Merge branch 'blender2.7'
[blender.git] / source / blender / blenkernel / BKE_shader_fx.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: all of this file.
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22 #ifndef __BKE_SHADER_FX_H__
23 #define __BKE_SHADER_FX_H__
24
25 /** \file BKE_shader_fx.h
26  *  \ingroup bke
27  */
28
29 #include "DNA_shader_fx_types.h"     /* needed for all enum typdefs */
30 #include "BLI_compiler_attrs.h"
31 #include "BKE_customdata.h"
32
33 struct DepsNodeHandle;
34 struct Depsgraph;
35 struct DerivedMesh;
36 struct ID;
37 struct ListBase;
38 struct Main;
39 struct Mesh;
40 struct ModifierUpdateDepsgraphContext;
41 struct Object;
42 struct Scene;
43 struct ShaderFxData;
44 struct ViewLayer;
45 struct bArmature;
46 struct bGPDframe;
47 struct bGPDlayer;
48 struct bGPDstroke;
49
50 #define SHADER_FX_ACTIVE(_fx, _is_render) (((_fx->mode & eShaderFxMode_Realtime) && (_is_render == false)) || \
51                                                                                                   ((_fx->mode & eShaderFxMode_Render) && (_is_render == true)))
52 #define SHADER_FX_EDIT(_fx, _is_edit) (((_fx->mode & eShaderFxMode_Editmode) == 0) && (_is_edit))
53
54 typedef enum {
55         /* Should not be used, only for None type */
56         eShaderFxType_NoneType,
57
58         /* grease pencil effects */
59         eShaderFxType_GpencilType,
60 }  ShaderFxTypeType;
61
62 typedef enum {
63         eShaderFxTypeFlag_SupportsEditmode = (1 << 0),
64
65         /* For effects that support editmode this determines if the
66          * effect should be enabled by default in editmode.
67          */
68         eShaderFxTypeFlag_EnableInEditmode = (1 << 2),
69
70         /* max one per type */
71         eShaderFxTypeFlag_Single = (1 << 4),
72
73         /* can't be added manually by user */
74         eShaderFxTypeFlag_NoUserAdd = (1 << 5),
75 } ShaderFxTypeFlag;
76
77 /* IMPORTANT! Keep ObjectWalkFunc and IDWalkFunc signatures compatible. */
78 typedef void(*ShaderFxObjectWalkFunc)(void *userData, struct Object *ob, struct Object **obpoin, int cb_flag);
79 typedef void(*ShaderFxIDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag);
80 typedef void(*ShaderFxTexWalkFunc)(void *userData, struct Object *ob, struct ShaderFxData *fx, const char *propname);
81
82 typedef struct ShaderFxTypeInfo {
83         /* The user visible name for this effect */
84         char name[32];
85
86         /* The DNA struct name for the effect data type, used to
87          * write the DNA data out.
88          */
89         char struct_name[32];
90
91         /* The size of the effect data type, used by allocation. */
92         int struct_size;
93
94         ShaderFxTypeType type;
95         ShaderFxTypeFlag flags;
96
97         /* Copy instance data for this effect type. Should copy all user
98          * level settings to the target effect.
99          */
100         void(*copyData)(const struct ShaderFxData *fx, struct ShaderFxData *target);
101
102         /* Initialize new instance data for this effect type, this function
103          * should set effect variables to their default values.
104          *
105          * This function is optional.
106          */
107         void (*initData)(struct ShaderFxData *fx);
108
109         /* Free internal effect data variables, this function should
110          * not free the fx variable itself.
111          *
112          * This function is optional.
113          */
114         void (*freeData)(struct ShaderFxData *fx);
115
116         /* Return a boolean value indicating if this effect is able to be
117          * calculated based on the effect data. This is *not* regarding the
118          * fx->flag, that is tested by the system, this is just if the data
119          * validates (for example, a lattice will return false if the lattice
120          * object is not defined).
121          *
122          * This function is optional (assumes never disabled if not present).
123          */
124         bool (*isDisabled)(struct ShaderFxData *fx, int userRenderParams);
125
126         /* Add the appropriate relations to the dependency graph.
127          *
128          * This function is optional.
129          */
130         void (*updateDepsgraph)(struct ShaderFxData *fx,
131                                 const struct ModifierUpdateDepsgraphContext *ctx);
132
133         /* Should return true if the effect needs to be recalculated on time
134          * changes.
135          *
136          * This function is optional (assumes false if not present).
137          */
138         bool (*dependsOnTime)(struct ShaderFxData *fx);
139
140
141         /* Should call the given walk function on with a pointer to each Object
142          * pointer that the effect data stores. This is used for linking on file
143          * load and for unlinking objects or forwarding object references.
144          *
145          * This function is optional.
146          */
147         void (*foreachObjectLink)(struct ShaderFxData *fx, struct Object *ob,
148                                   ShaderFxObjectWalkFunc walk, void *userData);
149
150         /* Should call the given walk function with a pointer to each ID
151          * pointer (i.e. each datablock pointer) that the effect data
152          * stores. This is used for linking on file load and for
153          * unlinking datablocks or forwarding datablock references.
154          *
155          * This function is optional. If it is not present, foreachObjectLink
156          * will be used.
157          */
158         void (*foreachIDLink)(struct ShaderFxData *fx, struct Object *ob,
159                               ShaderFxIDWalkFunc walk, void *userData);
160 } ShaderFxTypeInfo;
161
162 /* Initialize  global data (type info and some common global storages). */
163 void BKE_shaderfx_init(void);
164
165 const ShaderFxTypeInfo *BKE_shaderfxType_getInfo(ShaderFxType type);
166 struct ShaderFxData  *BKE_shaderfx_new(int type);
167 void BKE_shaderfx_free_ex(struct ShaderFxData *fx, const int flag);
168 void BKE_shaderfx_free(struct ShaderFxData *fx);
169 bool BKE_shaderfx_unique_name(struct ListBase *shaderfx, struct ShaderFxData *fx);
170 bool BKE_shaderfx_dependsOnTime(struct ShaderFxData *fx);
171 struct ShaderFxData *BKE_shaderfx_findByType(struct Object *ob, ShaderFxType type);
172 struct ShaderFxData *BKE_shaderfx_findByName(struct Object *ob, const char *name);
173 void BKE_shaderfx_copyData_generic(const struct ShaderFxData *fx_src, struct ShaderFxData *fx_dst);
174 void BKE_shaderfx_copyData(struct ShaderFxData *fx, struct ShaderFxData *target);
175 void BKE_shaderfx_copyData_ex(struct ShaderFxData *fx, struct ShaderFxData *target, const int flag);
176 void BKE_shaderfx_foreachIDLink(struct Object *ob, ShaderFxIDWalkFunc walk, void *userData);
177
178 bool BKE_shaderfx_has_gpencil(struct Object *ob);
179
180 #endif /* __BKE_SHADER_FX_H__ */