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