Merge branch 'blender-v2.92-release'
[blender.git] / source / blender / blenkernel / BKE_gpencil_modifier.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 #pragma once
17
18 /** \file
19  * \ingroup bke
20  */
21
22 #include "BLI_compiler_attrs.h"
23 #include "DNA_gpencil_modifier_types.h" /* needed for all enum typdefs */
24
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28
29 struct ARegionType;
30 struct BlendDataReader;
31 struct BlendLibReader;
32 struct BlendWriter;
33 struct Depsgraph;
34 struct GpencilModifierData;
35 struct ID;
36 struct ListBase;
37 struct Main;
38 struct ModifierUpdateDepsgraphContext;
39 struct Object;
40 struct Scene;
41 /* NOTE: bakeModifier() called from UI:
42  * needs to create new data-blocks, hence the need for this. */
43 struct bGPDframe;
44 struct bGPDlayer;
45 struct bGPDstroke;
46
47 #define GPENCIL_MODIFIER_ACTIVE(_md, _is_render) \
48   ((((_md)->mode & eGpencilModifierMode_Realtime) && (_is_render == false)) || \
49    (((_md)->mode & eGpencilModifierMode_Render) && (_is_render == true)))
50 #define GPENCIL_MODIFIER_EDIT(_md, _is_edit) \
51   ((((_md)->mode & eGpencilModifierMode_Editmode) == 0) && (_is_edit))
52
53 typedef enum {
54   /** Should not be used, only for None modifier type. */
55   eGpencilModifierTypeType_None,
56
57   /** Grease pencil modifiers. */
58   eGpencilModifierTypeType_Gpencil,
59 } GpencilModifierTypeType;
60
61 typedef enum {
62   /* eGpencilModifierTypeFlag_SupportsMapping = (1 << 0), */ /* UNUSED */
63   eGpencilModifierTypeFlag_SupportsEditmode = (1 << 1),
64
65   /**
66    * For modifiers that support edit-mode this determines if the
67    * modifier should be enabled by default in edit-mode. This should
68    * only be used by modifiers that are relatively speedy and
69    * also generally used in edit-mode, otherwise let the user enable it by hand.
70    */
71   eGpencilModifierTypeFlag_EnableInEditmode = (1 << 2),
72
73   /**
74    * For modifiers that require original data and so cannot
75    * be placed after any non-deform modifier.
76    */
77   /* eGpencilModifierTypeFlag_RequiresOriginalData = (1 << 3), */ /* UNUSED */
78
79   /** Max one per type. */
80   eGpencilModifierTypeFlag_Single = (1 << 4),
81
82   /** Can't be added manually by user. */
83   eGpencilModifierTypeFlag_NoUserAdd = (1 << 5),
84   /** Can't be applied. */
85   eGpencilModifierTypeFlag_NoApply = (1 << 6),
86 } GpencilModifierTypeFlag;
87
88 typedef void (*GreasePencilIDWalkFunc)(void *userData,
89                                        struct Object *ob,
90                                        struct ID **idpoin,
91                                        int cb_flag);
92 typedef void (*GreasePencilTexWalkFunc)(void *userData,
93                                         struct Object *ob,
94                                         struct GpencilModifierData *md,
95                                         const char *propname);
96
97 typedef struct GpencilModifierTypeInfo {
98   /** The user visible name for this modifier */
99   char name[32];
100
101   /**
102    * The DNA struct name for the modifier data type, used to
103    * write the DNA data out.
104    */
105   char struct_name[32];
106
107   /** The size of the modifier data type, used by allocation. */
108   int struct_size;
109
110   GpencilModifierTypeType type;
111   GpencilModifierTypeFlag flags;
112
113   /********************* Non-optional functions *********************/
114
115   /**
116    * Copy instance data for this modifier type. Should copy all user
117    * level settings to the target modifier.
118    */
119   void (*copyData)(const struct GpencilModifierData *md, struct GpencilModifierData *target);
120
121   /**
122    * Callback for GP "stroke" modifiers that operate on the
123    * shape and parameters of the provided strokes (e.g. Thickness, Noise, etc.)
124    *
125    * The gpl parameter contains the GP layer that the strokes come from.
126    * While access is provided to this data, you should not directly access
127    * the gpl->frames data from the modifier. Instead, use the gpf parameter
128    * instead.
129    *
130    * The gps parameter contains the GP stroke to operate on. This is usually a copy
131    * of the original (unmodified and saved to files) stroke data.
132    */
133   void (*deformStroke)(struct GpencilModifierData *md,
134                        struct Depsgraph *depsgraph,
135                        struct Object *ob,
136                        struct bGPDlayer *gpl,
137                        struct bGPDframe *gpf,
138                        struct bGPDstroke *gps);
139
140   /**
141    * Callback for GP "geometry" modifiers that create extra geometry
142    * in the frame (e.g. Array)
143    */
144   void (*generateStrokes)(struct GpencilModifierData *md,
145                           struct Depsgraph *depsgraph,
146                           struct Object *ob);
147
148   /**
149    * Bake-down GP modifier's effects into the GP data-block.
150    *
151    * This gets called when the user clicks the "Apply" button in the UI.
152    * As such, this callback needs to go through all layers/frames in the
153    * data-block, mutating the geometry and/or creating new data-blocks/objects
154    */
155   void (*bakeModifier)(struct Main *bmain,
156                        struct Depsgraph *depsgraph,
157                        struct GpencilModifierData *md,
158                        struct Object *ob);
159
160   /********************* Optional functions *********************/
161
162   /**
163    * Callback for GP "time" modifiers that offset keyframe time
164    * Returns the frame number to be used after apply the modifier. This is
165    * usually an offset of the animation for duplicated data-blocks.
166    *
167    * This function is optional.
168    */
169   int (*remapTime)(struct GpencilModifierData *md,
170                    struct Depsgraph *depsgraph,
171                    struct Scene *scene,
172                    struct Object *ob,
173                    struct bGPDlayer *gpl,
174                    int cfra);
175
176   /**
177    * Initialize new instance data for this modifier type, this function
178    * should set modifier variables to their default values.
179    *
180    * This function is optional.
181    */
182   void (*initData)(struct GpencilModifierData *md);
183
184   /**
185    * Free internal modifier data variables, this function should
186    * not free the md variable itself.
187    *
188    * This function is optional.
189    */
190   void (*freeData)(struct GpencilModifierData *md);
191
192   /**
193    * Return a boolean value indicating if this modifier is able to be
194    * calculated based on the modifier data. This is *not* regarding the
195    * md->flag, that is tested by the system, this is just if the data
196    * validates (for example, a lattice will return false if the lattice
197    * object is not defined).
198    *
199    * This function is optional (assumes never disabled if not present).
200    */
201   bool (*isDisabled)(struct GpencilModifierData *md, int userRenderParams);
202
203   /**
204    * Add the appropriate relations to the dependency graph.
205    *
206    * This function is optional.
207    */
208   void (*updateDepsgraph)(struct GpencilModifierData *md,
209                           const struct ModifierUpdateDepsgraphContext *ctx);
210
211   /**
212    * Should return true if the modifier needs to be recalculated on time
213    * changes.
214    *
215    * This function is optional (assumes false if not present).
216    */
217   bool (*dependsOnTime)(struct GpencilModifierData *md);
218
219   /**
220    * Should call the given walk function with a pointer to each ID
221    * pointer (i.e. each data-block pointer) that the modifier data
222    * stores. This is used for linking on file load and for
223    * unlinking data-blocks or forwarding data-block references.
224    *
225    * This function is optional.
226    */
227   void (*foreachIDLink)(struct GpencilModifierData *md,
228                         struct Object *ob,
229                         GreasePencilIDWalkFunc walk,
230                         void *userData);
231
232   /**
233    * Should call the given walk function for each texture that the
234    * modifier data stores. This is used for finding all textures in
235    * the context for the UI.
236    *
237    * This function is optional. If it is not present, it will be
238    * assumed the modifier has no textures.
239    */
240   void (*foreachTexLink)(struct GpencilModifierData *md,
241                          struct Object *ob,
242                          GreasePencilTexWalkFunc walk,
243                          void *userData);
244
245   /* Register the panel types for the modifier's UI. */
246   void (*panelRegister)(struct ARegionType *region_type);
247 } GpencilModifierTypeInfo;
248
249 #define GPENCIL_MODIFIER_TYPE_PANEL_PREFIX "MOD_PT_gpencil_"
250
251 /* Initialize modifier's global data (type info and some common global storages). */
252 void BKE_gpencil_modifier_init(void);
253
254 void BKE_gpencil_modifierType_panel_id(GpencilModifierType type, char *r_idname);
255 void BKE_gpencil_modifier_panel_expand(struct GpencilModifierData *md);
256 const GpencilModifierTypeInfo *BKE_gpencil_modifier_get_info(GpencilModifierType type);
257 struct GpencilModifierData *BKE_gpencil_modifier_new(int type);
258 void BKE_gpencil_modifier_free_ex(struct GpencilModifierData *md, const int flag);
259 void BKE_gpencil_modifier_free(struct GpencilModifierData *md);
260 bool BKE_gpencil_modifier_unique_name(struct ListBase *modifiers, struct GpencilModifierData *gmd);
261 bool BKE_gpencil_modifier_depends_ontime(struct GpencilModifierData *md);
262 struct GpencilModifierData *BKE_gpencil_modifiers_findby_type(struct Object *ob,
263                                                               GpencilModifierType type);
264 struct GpencilModifierData *BKE_gpencil_modifiers_findby_name(struct Object *ob, const char *name);
265 void BKE_gpencil_modifier_copydata_generic(const struct GpencilModifierData *md_src,
266                                            struct GpencilModifierData *md_dst);
267 void BKE_gpencil_modifier_copydata(struct GpencilModifierData *md,
268                                    struct GpencilModifierData *target);
269 void BKE_gpencil_modifier_copydata_ex(struct GpencilModifierData *md,
270                                       struct GpencilModifierData *target,
271                                       const int flag);
272 void BKE_gpencil_modifier_set_error(struct GpencilModifierData *md, const char *format, ...)
273     ATTR_PRINTF_FORMAT(2, 3);
274 void BKE_gpencil_modifiers_foreach_ID_link(struct Object *ob,
275                                            GreasePencilIDWalkFunc walk,
276                                            void *userData);
277 void BKE_gpencil_modifiers_foreach_tex_link(struct Object *ob,
278                                             GreasePencilTexWalkFunc walk,
279                                             void *userData);
280
281 bool BKE_gpencil_modifier_is_nonlocal_in_liboverride(const struct Object *ob,
282                                                      const struct GpencilModifierData *gmd);
283
284 typedef struct GpencilVirtualModifierData {
285   ArmatureGpencilModifierData amd;
286   LatticeGpencilModifierData lmd;
287 } GpencilVirtualModifierData;
288
289 struct GpencilModifierData *BKE_gpencil_modifiers_get_virtual_modifierlist(
290     const struct Object *ob, struct GpencilVirtualModifierData *data);
291
292 bool BKE_gpencil_has_geometry_modifiers(struct Object *ob);
293 bool BKE_gpencil_has_time_modifiers(struct Object *ob);
294 bool BKE_gpencil_has_transform_modifiers(struct Object *ob);
295
296 void BKE_gpencil_lattice_init(struct Object *ob);
297 void BKE_gpencil_lattice_clear(struct Object *ob);
298
299 void BKE_gpencil_modifiers_calc(struct Depsgraph *depsgraph,
300                                 struct Scene *scene,
301                                 struct Object *ob);
302
303 void BKE_gpencil_prepare_eval_data(struct Depsgraph *depsgraph,
304                                    struct Scene *scene,
305                                    struct Object *ob);
306
307 struct bGPDframe *BKE_gpencil_frame_retime_get(struct Depsgraph *depsgraph,
308                                                struct Scene *scene,
309                                                struct Object *ob,
310                                                struct bGPDlayer *gpl);
311
312 void BKE_gpencil_modifier_blend_write(struct BlendWriter *writer, struct ListBase *modbase);
313 void BKE_gpencil_modifier_blend_read_data(struct BlendDataReader *reader, struct ListBase *lb);
314 void BKE_gpencil_modifier_blend_read_lib(struct BlendLibReader *reader, struct Object *ob);
315
316 #ifdef __cplusplus
317 }
318 #endif