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