Blender V5.0
gpencil_modifier_legacy.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2017 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "BLI_assert.h"
10#include "BLI_listbase.h"
11
12#include "MEM_guardedalloc.h"
13
14#include "DNA_colorband_types.h"
16#include "DNA_modifier_types.h"
17#include "DNA_object_types.h"
18#include "DNA_texture_types.h"
19
20#include "BKE_colortools.hh"
21#include "BKE_deform.hh"
23#include "BKE_lattice.hh"
24#include "BKE_lib_id.hh"
25#include "BKE_lib_query.hh"
26#include "BKE_modifier.hh"
27#include "BKE_screen.hh"
28#include "BKE_shrinkwrap.hh"
29
30#include "BLO_read_write.hh"
31
32/* Check if the type value is valid. */
33static bool gpencil_modifier_type_valid(const int type)
34{
35 return type > 0 && type < NUM_GREASEPENCIL_MODIFIER_TYPES;
36}
37
43{
44 switch (GpencilModifierType(md->type)) {
47
48 if (gpmd->curve_intensity) {
50 }
51 break;
52 }
55
56 if (gpmd->curve_thickness) {
58 }
59 break;
60 }
63
65 if (mmd->curve_intensity) {
67 }
68 break;
69 }
72
73 if (gpmd->curve_intensity) {
75 }
76 break;
77 }
80
81 if (gpmd->curve_intensity) {
83 }
84 break;
85 }
89
90 /* free deform data */
91 if (ldata) {
93 }
94 break;
95 }
98
99 if (gpmd->curve_intensity) {
101 }
102 break;
103 }
106
107 if (mmd->curfalloff) {
109 }
110 break;
111 }
114
115 MEM_SAFE_FREE(gpmd->segments);
116 break;
117 }
120
122 break;
123 }
126
127 if (mmd->cache_data) {
129 MEM_delete(mmd->cache_data);
130 }
131 break;
132 }
133
150 break;
153 break;
154 }
155}
156
164 Object *ob,
166 void *user_data)
167{
168 switch (GpencilModifierType(md->type)) {
170 break;
171 }
174
175 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
176 break;
177 }
180
181 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
182 break;
183 }
186
187 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
188 break;
189 }
192
193 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
194 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
195 break;
196 }
199
200 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
201 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
202 break;
203 }
206
207 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
208 break;
209 }
212
213 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
214 break;
215 }
218
219 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
220 break;
221 }
224
225 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
226 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
227 break;
228 }
231
232 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
233 break;
234 }
237
238 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
239 break;
240 }
243
244 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
245 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
246 break;
247 }
250
251 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
252 break;
253 }
256
257 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
258 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
259 break;
260 }
263
264 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
265 break;
266 }
269
270 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
271 break;
272 }
275
276 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
277 break;
278 }
281
282 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
283 break;
284 }
287
288 walk(user_data, ob, (ID **)&lmd->target_material, IDWALK_CB_USER);
289 walk(user_data, ob, (ID **)&lmd->source_collection, IDWALK_CB_NOP);
290
291 walk(user_data, ob, (ID **)&lmd->source_object, IDWALK_CB_NOP);
292 walk(user_data, ob, (ID **)&lmd->source_camera, IDWALK_CB_NOP);
293 walk(user_data, ob, (ID **)&lmd->light_contour_object, IDWALK_CB_NOP);
294 break;
295 }
298
299 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
300 break;
301 }
304
305 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
306 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
307 break;
308 }
311
312 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
313 break;
314 }
317
318 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
319 break;
320 }
323
324 walk(user_data, ob, (ID **)&mmd->target, IDWALK_CB_NOP);
325 walk(user_data, ob, (ID **)&mmd->aux_target, IDWALK_CB_NOP);
326 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
327 break;
328 }
331
332 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
333 break;
334 }
337
338 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
339 walk(user_data, ob, (ID **)&mmd->outline_material, IDWALK_CB_USER);
340 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
341 break;
342 }
345 break;
346 }
347}
348
349/* *************************************************** */
350/* Modifier Methods - Evaluation Loops, etc. */
351
352static void modifier_free_data_id_us_cb(void * /*user_data*/,
353 Object * /*ob*/,
354 ID **idpoin,
355 const LibraryForeachIDCallbackFlag cb_flag)
356{
357 ID *id = *idpoin;
358 if (id != nullptr && (cb_flag & IDWALK_CB_USER) != 0) {
359 id_us_min(id);
360 }
361}
362
364{
367 }
368
370 if (md->error) {
371 MEM_freeN(md->error);
372 }
373
374 MEM_freeN(md);
375}
376
381
384 void *user_data)
385{
387
388 for (; md; md = md->next) {
389 gpencil_modifier_foreach_ID_link(md, ob, walk, user_data);
390 }
391}
392
394{
396
398 md->error = nullptr;
399
400 /* if modifiers disappear, or for upward compatibility */
401 if (!gpencil_modifier_type_valid(md->type)) {
402 md->type = eModifierType_None;
403 }
404
405 /* If linking from a library, clear 'local' library override flag. */
406 if (ID_IS_LINKED(ob)) {
408 }
409
410 if (md->type == eGpencilModifierType_Lattice) {
412 gpmd->cache_data = nullptr;
413 }
414 else if (md->type == eGpencilModifierType_Hook) {
416
418 if (hmd->curfalloff) {
421 }
422 }
423 else if (md->type == eGpencilModifierType_Noise) {
425
427 if (gpmd->curve_intensity) {
429 /* Initialize the curve. Maybe this could be moved to modifier logic. */
431 }
432 }
433 else if (md->type == eGpencilModifierType_Thick) {
435
437 if (gpmd->curve_thickness) {
440 }
441 }
442 else if (md->type == eGpencilModifierType_Tint) {
444 BLO_read_struct(reader, ColorBand, &gpmd->colorband);
446 if (gpmd->curve_intensity) {
449 }
450 }
451 else if (md->type == eGpencilModifierType_Smooth) {
454 if (gpmd->curve_intensity) {
457 }
458 }
459 else if (md->type == eGpencilModifierType_Color) {
462 if (gpmd->curve_intensity) {
465 }
466 }
467 else if (md->type == eGpencilModifierType_Opacity) {
470 if (gpmd->curve_intensity) {
473 }
474 }
475 else if (md->type == eGpencilModifierType_Dash) {
478 reader, DashGpencilModifierSegment, gpmd->segments_len, &gpmd->segments);
479 for (int i = 0; i < gpmd->segments_len; i++) {
480 gpmd->segments[i].dmd = gpmd;
481 }
482 }
483 else if (md->type == eGpencilModifierType_Time) {
486 reader, TimeGpencilModifierSegment, gpmd->segments_len, &gpmd->segments);
487 for (int i = 0; i < gpmd->segments_len; i++) {
488 gpmd->segments[i].gpmd = gpmd;
489 }
490 }
491 if (md->type == eGpencilModifierType_Shrinkwrap) {
493 gpmd->cache_data = nullptr;
494 }
495 }
496}
void BKE_curvemapping_blend_read(BlendDataReader *reader, CurveMapping *cumap)
void BKE_curvemapping_init(CurveMapping *cumap)
void BKE_curvemapping_free(CurveMapping *cumap)
support for deformation groups and hooks.
void(* GreasePencilIDWalkFunc)(void *user_data, struct Object *ob, struct ID **idpoin, LibraryForeachIDCallbackFlag cb_flag)
void BKE_lattice_deform_data_destroy(LatticeDeformData *lattice_deform_data)
@ LIB_ID_CREATE_NO_USER_REFCOUNT
void id_us_min(ID *id)
Definition lib_id.cc:366
LibraryForeachIDCallbackFlag
@ IDWALK_CB_USER
@ IDWALK_CB_NOP
void BKE_shrinkwrap_free_tree(ShrinkwrapTreeData *data)
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
#define LISTBASE_FOREACH(type, var, list)
#define BLO_read_struct_list(reader, struct_name, list)
#define BLO_read_struct_array(reader, struct_name, array_size, ptr_p)
#define BLO_read_struct(reader, struct_name, ptr_p)
#define ID_IS_LINKED(_id)
Definition DNA_ID.h:694
@ eGpencilModifierFlag_OverrideLibrary_Local
@ eGpencilModifierType_Dash
@ eGpencilModifierType_Array
@ eGpencilModifierType_Noise
@ eGpencilModifierType_Mirror
@ eGpencilModifierType_Color
@ eGpencilModifierType_Multiply
@ eGpencilModifierType_Texture
@ eGpencilModifierType_Subdiv
@ eGpencilModifierType_Length
@ eGpencilModifierType_Lattice
@ eGpencilModifierType_Opacity
@ eGpencilModifierType_Hook
@ eGpencilModifierType_Simplify
@ eGpencilModifierType_Shrinkwrap
@ eGpencilModifierType_WeightProximity
@ eGpencilModifierType_Armature
@ eGpencilModifierType_WeightAngle
@ eGpencilModifierType_Lineart
@ eGpencilModifierType_None
@ eGpencilModifierType_Smooth
@ eGpencilModifierType_Tint
@ eGpencilModifierType_Outline
@ eGpencilModifierType_Envelope
@ NUM_GREASEPENCIL_MODIFIER_TYPES
@ eGpencilModifierType_Time
@ eGpencilModifierType_Thick
@ eGpencilModifierType_Build
@ eGpencilModifierType_Offset
@ eModifierType_None
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
void BKE_gpencil_modifiers_foreach_ID_link(Object *ob, GreasePencilIDWalkFunc walk, void *user_data)
void BKE_gpencil_modifier_free_ex(GpencilModifierData *md, const int flag)
void BKE_gpencil_modifier_blend_read_data(BlendDataReader *reader, ListBase *lb, Object *ob)
static void modifier_free_data_id_us_cb(void *, Object *, ID **idpoin, const LibraryForeachIDCallbackFlag cb_flag)
static bool gpencil_modifier_type_valid(const int type)
static void gpencil_modifier_foreach_ID_link(GpencilModifierData *md, Object *ob, GreasePencilIDWalkFunc walk, void *user_data)
static void gpencil_modifier_free_data(GpencilModifierData *md)
void BKE_gpencil_modifier_free(GpencilModifierData *md)
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
DashGpencilModifierSegment * segments
struct DashGpencilModifierData * dmd
struct GpencilModifierData * next
Definition DNA_ID.h:414
struct LatticeDeformData * cache_data
void * first
ListBase greasepencil_modifiers
TimeGpencilModifierSegment * segments
struct TimeGpencilModifierData * gpmd
struct CurveMapping * curve_intensity
i
Definition text_draw.cc:230
uint8_t flag
Definition wm_window.cc:145