Merge branch 'master' into blender2.8
[blender.git] / source / blender / blenkernel / BKE_gpencil_modifier.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_GPENCIL_MODIFIER_H__
23 #define __BKE_GPENCIL_MODIFIER_H__
24
25 /** \file BKE_gpencil_modifier.h
26  *  \ingroup bke
27  */
28
29 #include "DNA_gpencil_modifier_types.h"     /* needed for all enum typdefs */
30 #include "BLI_compiler_attrs.h"
31 #include "BKE_customdata.h"
32
33 struct ID;
34 struct Depsgraph;
35 struct DerivedMesh;
36 struct bContext; /* NOTE: bakeModifier() - called from UI - needs to create new datablocks, hence the need for this */
37 struct Mesh;
38 struct Object;
39 struct Scene;
40 struct ViewLayer;
41 struct ListBase;
42 struct bArmature;
43 struct Main;
44 struct GpencilModifierData;
45 struct BMEditMesh;
46 struct DepsNodeHandle;
47 struct bGPDlayer;
48 struct bGPDframe;
49 struct bGPDstroke;
50 struct ModifierUpdateDepsgraphContext;
51
52 #define GPENCIL_MODIFIER_ACTIVE(_md, _is_render) (((_md->mode & eGpencilModifierMode_Realtime) && (_is_render == false)) || \
53                                                                                                   ((_md->mode & eGpencilModifierMode_Render) && (_is_render == true)))
54 #define GPENCIL_MODIFIER_EDIT(_md, _is_edit) (((_md->mode & eGpencilModifierMode_Editmode) == 0) && (_is_edit))
55
56 typedef enum {
57         /* Should not be used, only for None modifier type */
58         eGpencilModifierTypeType_None,
59
60         /* grease pencil modifiers */
61         eGpencilModifierTypeType_Gpencil,
62 }  GpencilModifierTypeType;
63
64 typedef enum {
65         eGpencilModifierTypeFlag_SupportsMapping = (1 << 0),
66         eGpencilModifierTypeFlag_SupportsEditmode = (1 << 1),
67
68         /* For modifiers that support editmode this determines if the
69          * modifier should be enabled by default in editmode. This should
70          * only be used by modifiers that are relatively speedy and
71          * also generally used in editmode, otherwise let the user enable
72          * it by hand.
73          */
74         eGpencilModifierTypeFlag_EnableInEditmode = (1 << 2),
75
76         /* For modifiers that require original data and so cannot
77          * be placed after any non-deformative modifier.
78          */
79         eGpencilModifierTypeFlag_RequiresOriginalData = (1 << 3),
80
81         /* max one per type */
82         eGpencilModifierTypeFlag_Single = (1 << 4),
83
84         /* can't be added manually by user */
85         eGpencilModifierTypeFlag_NoUserAdd = (1 << 5),
86 } GpencilModifierTypeFlag;
87
88 /* IMPORTANT! Keep ObjectWalkFunc and IDWalkFunc signatures compatible. */
89 typedef void(*GreasePencilObjectWalkFunc)(void *userData, struct Object *ob, struct Object **obpoin, int cb_flag);
90 typedef void(*GreasePencilIDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag);
91 typedef void(*GreasePencilTexWalkFunc)(void *userData, struct Object *ob, struct GpencilModifierData *md, const char *propname);
92
93 typedef struct GpencilModifierTypeInfo {
94         /* The user visible name for this modifier */
95         char name[32];
96
97         /* The DNA struct name for the modifier data type, used to
98          * write the DNA data out.
99          */
100         char struct_name[32];
101
102         /* The size of the modifier data type, used by allocation. */
103         int struct_size;
104
105         GpencilModifierTypeType type;
106         GpencilModifierTypeFlag flags;
107
108
109         /********************* Non-optional functions *********************/
110
111         /* Copy instance data for this modifier type. Should copy all user
112          * level settings to the target modifier.
113          */
114         void (*copyData)(const struct GpencilModifierData *md, struct GpencilModifierData *target);
115
116         /* Callback for GP "stroke" modifiers that operate on the
117          * shape and parameters of the provided strokes (e.g. Thickness, Noise, etc.)
118          *
119          * The gpl parameter contains the GP layer that the strokes come from.
120          * While access is provided to this data, you should not directly access
121          * the gpl->frames data from the modifier. Instead, use the gpf parameter
122          * instead.
123          *
124          * The gps parameter contains the GP stroke to operate on. This is usually a copy
125          * of the original (unmodified and saved to files) stroke data.
126          */
127         void (*deformStroke)(struct GpencilModifierData *md, struct Depsgraph *depsgraph,
128                              struct Object *ob, struct bGPDlayer *gpl, struct bGPDstroke *gps);
129
130         /* Callback for GP "geometry" modifiers that create extra geometry
131          * in the frame (e.g. Array)
132          *
133          * The gpf parameter contains the GP frame/strokes to operate on. This is
134          * usually a copy of the original (unmodified and saved to files) stroke data.
135          * Modifiers should only add any generated strokes to this frame (and not one accessed
136          * via the gpl parameter).
137          *
138          * The modifier_index parameter indicates where the modifier is
139          * in the modifier stack in relation to other modifiers.
140          */
141         void (*generateStrokes)(struct GpencilModifierData *md, struct Depsgraph *depsgraph,
142                                 struct Object *ob, struct bGPDlayer *gpl, struct bGPDframe *gpf);
143
144         /* Bake-down GP modifier's effects into the GP datablock.
145          *
146          * This gets called when the user clicks the "Apply" button in the UI.
147          * As such, this callback needs to go through all layers/frames in the
148          * datablock, mutating the geometry and/or creating new datablocks/objects
149          */
150         void (*bakeModifier)(struct Main *bmain, struct Depsgraph *depsgraph,
151                            struct GpencilModifierData *md, struct Object *ob);
152
153         /********************* Optional functions *********************/
154
155         /* Initialize new instance data for this modifier type, this function
156          * should set modifier variables to their default values.
157          *
158          * This function is optional.
159          */
160         void (*initData)(struct GpencilModifierData *md);
161
162         /* Free internal modifier data variables, this function should
163          * not free the md variable itself.
164          *
165          * This function is optional.
166          */
167         void (*freeData)(struct GpencilModifierData *md);
168
169         /* Return a boolean value indicating if this modifier is able to be
170          * calculated based on the modifier data. This is *not* regarding the
171          * md->flag, that is tested by the system, this is just if the data
172          * validates (for example, a lattice will return false if the lattice
173          * object is not defined).
174          *
175          * This function is optional (assumes never disabled if not present).
176          */
177         bool (*isDisabled)(struct GpencilModifierData *md, int userRenderParams);
178
179         /* Add the appropriate relations to the dependency graph.
180          *
181          * This function is optional.
182          */
183         void (*updateDepsgraph)(struct GpencilModifierData *md,
184                                 const struct ModifierUpdateDepsgraphContext *ctx);
185
186         /* Should return true if the modifier needs to be recalculated on time
187          * changes.
188          *
189          * This function is optional (assumes false if not present).
190          */
191         bool (*dependsOnTime)(struct GpencilModifierData *md);
192
193
194         /* Should call the given walk function on with a pointer to each Object
195          * pointer that the modifier data stores. This is used for linking on file
196          * load and for unlinking objects or forwarding object references.
197          *
198          * This function is optional.
199          */
200         void (*foreachObjectLink)(struct GpencilModifierData *md, struct Object *ob,
201                                   GreasePencilObjectWalkFunc walk, void *userData);
202
203         /* Should call the given walk function with a pointer to each ID
204          * pointer (i.e. each datablock pointer) that the modifier data
205          * stores. This is used for linking on file load and for
206          * unlinking datablocks or forwarding datablock references.
207          *
208          * This function is optional. If it is not present, foreachObjectLink
209          * will be used.
210          */
211         void (*foreachIDLink)(struct GpencilModifierData *md, struct Object *ob,
212                               GreasePencilIDWalkFunc walk, void *userData);
213
214         /* Should call the given walk function for each texture that the
215          * modifier data stores. This is used for finding all textures in
216          * the context for the UI.
217          *
218          * This function is optional. If it is not present, it will be
219          * assumed the modifier has no textures.
220          */
221         void (*foreachTexLink)(struct GpencilModifierData *md, struct Object *ob,
222                                GreasePencilTexWalkFunc walk, void *userData);
223 } GpencilModifierTypeInfo;
224
225 void BKE_gpencil_instance_modifier_instance_tfm(struct InstanceGpencilModifierData *mmd, const int elem_idx[3], float r_mat[4][4]);
226
227 /* Initialize modifier's global data (type info and some common global storages). */
228 void BKE_gpencil_modifier_init(void);
229
230 const GpencilModifierTypeInfo *BKE_gpencil_modifierType_getInfo(GpencilModifierType type);
231 struct GpencilModifierData  *BKE_gpencil_modifier_new(int type);
232 void BKE_gpencil_modifier_free_ex(struct GpencilModifierData *md, const int flag);
233 void BKE_gpencil_modifier_free(struct GpencilModifierData *md);
234 bool BKE_gpencil_modifier_unique_name(struct ListBase *modifiers, struct GpencilModifierData *gmd);
235 bool BKE_gpencil_modifier_dependsOnTime(struct GpencilModifierData *md);
236 struct GpencilModifierData *BKE_gpencil_modifiers_findByType(struct Object *ob, GpencilModifierType type);
237 struct GpencilModifierData *BKE_gpencil_modifiers_findByName(struct Object *ob, const char *name);
238 void BKE_gpencil_modifier_copyData_generic(const struct GpencilModifierData *md_src, struct GpencilModifierData *md_dst);
239 void BKE_gpencil_modifier_copyData(struct GpencilModifierData *md, struct GpencilModifierData *target);
240 void BKE_gpencil_modifier_copyData_ex(struct GpencilModifierData *md, struct GpencilModifierData *target, const int flag);
241 void BKE_gpencil_modifiers_foreachIDLink(struct Object *ob, GreasePencilIDWalkFunc walk, void *userData);
242 void BKE_gpencil_modifiers_foreachTexLink(struct Object *ob, GreasePencilTexWalkFunc walk, void *userData);
243
244 bool BKE_gpencil_has_geometry_modifiers(struct Object *ob);
245
246 void BKE_gpencil_stroke_modifiers(
247         struct Depsgraph *depsgraph, struct Object *ob,
248         struct bGPDlayer *gpl, struct bGPDframe *gpf, struct bGPDstroke *gps, bool is_render);
249 void BKE_gpencil_geometry_modifiers(
250         struct Depsgraph *depsgraph, struct Object *ob,
251         struct bGPDlayer *gpl, struct bGPDframe *gpf, bool is_render);
252
253 void BKE_gpencil_lattice_init(struct Object *ob);
254 void BKE_gpencil_lattice_clear(struct Object *ob);
255
256 #endif /* __BKE_GPENCIL_MODIFIER_H__ */