Blender V4.3
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
9#include "BLI_assert.h"
10#include "MEM_guardedalloc.h"
11
14#include "DNA_modifier_types.h"
15#include "DNA_object_types.h"
16
17#include "BKE_colortools.hh"
18#include "BKE_deform.hh"
20#include "BKE_gpencil_legacy.h"
22#include "BKE_lattice.hh"
23#include "BKE_lib_id.hh"
24#include "BKE_lib_query.hh"
25#include "BKE_material.h"
26#include "BKE_modifier.hh"
27#include "BKE_object.hh"
28#include "BKE_screen.hh"
29#include "BKE_shrinkwrap.hh"
30
31#include "DEG_depsgraph.hh"
33
34#include "BLO_read_write.hh"
35
36/* The DNA struct name for the modifier data type, used to write the DNA data out. */
38{
39 switch (type) {
41 return "";
43 return "NoiseGpencilModifierData";
45 return "SubdivGpencilModifierData";
47 return "ThickGpencilModifierData";
49 return "TintGpencilModifierData";
51 return "ArrayGpencilModifierData";
53 return "BuildGpencilModifierData";
55 return "OpacityGpencilModifierData";
57 return "ColorGpencilModifierData";
59 return "LatticeGpencilModifierData";
61 return "SimplifyGpencilModifierData";
63 return "SmoothGpencilModifierData";
65 return "HookGpencilModifierData";
67 return "OffsetGpencilModifierData";
69 return "MirrorGpencilModifierData";
71 return "ArmatureGpencilModifierData";
73 return "TimeGpencilModifierData";
75 return "MultiplyGpencilModifierData";
77 return "TextureGpencilModifierData";
79 return "LineartGpencilModifierData";
81 return "LengthGpencilModifierData";
83 return "WeightProxGpencilModifierData";
85 return "DashGpencilModifierData";
87 return "WeightAngleGpencilModifierData";
89 return "ShrinkwrapGpencilModifierData";
91 return "EnvelopeGpencilModifierData";
93 return "OutlineGpencilModifierData";
96 return "";
97 }
99 return "";
100}
101
102/* Check if the type value is valid. */
103static bool gpencil_modifier_type_valid(const int type)
104{
105 return type > 0 && type < NUM_GREASEPENCIL_MODIFIER_TYPES;
106}
107
113{
114 switch (GpencilModifierType(md->type)) {
117
118 if (gpmd->curve_intensity) {
120 }
121 break;
122 }
125
126 if (gpmd->curve_thickness) {
128 }
129 break;
130 }
133
135 if (mmd->curve_intensity) {
137 }
138 break;
139 }
142
143 if (gpmd->curve_intensity) {
145 }
146 break;
147 }
150
151 if (gpmd->curve_intensity) {
153 }
154 break;
155 }
159
160 /* free deform data */
161 if (ldata) {
163 }
164 break;
165 }
168
169 if (gpmd->curve_intensity) {
171 }
172 break;
173 }
176
177 if (mmd->curfalloff) {
179 }
180 break;
181 }
184
185 MEM_SAFE_FREE(gpmd->segments);
186 break;
187 }
190
192 break;
193 }
196
197 if (mmd->cache_data) {
199 MEM_delete(mmd->cache_data);
200 }
201 break;
202 }
203
220 break;
223 break;
224 }
225}
226
234 Object *ob,
236 void *user_data)
237{
238 switch (GpencilModifierType(md->type)) {
240 break;
241 }
244
245 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
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 break;
259 }
262
263 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
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 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
272 break;
273 }
276
277 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
278 break;
279 }
282
283 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
284 break;
285 }
288
289 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
290 break;
291 }
294
295 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
296 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
297 break;
298 }
301
302 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
303 break;
304 }
307
308 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
309 break;
310 }
313
314 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
315 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
316 break;
317 }
320
321 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
322 break;
323 }
326
327 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
328 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
329 break;
330 }
333
334 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
335 break;
336 }
339
340 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
341 break;
342 }
345
346 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
347 break;
348 }
351
352 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
353 break;
354 }
357
358 walk(user_data, ob, (ID **)&lmd->target_material, IDWALK_CB_USER);
359 walk(user_data, ob, (ID **)&lmd->source_collection, IDWALK_CB_NOP);
360
361 walk(user_data, ob, (ID **)&lmd->source_object, IDWALK_CB_NOP);
362 walk(user_data, ob, (ID **)&lmd->source_camera, IDWALK_CB_NOP);
363 walk(user_data, ob, (ID **)&lmd->light_contour_object, IDWALK_CB_NOP);
364 break;
365 }
368
369 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
370 break;
371 }
374
375 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
376 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
377 break;
378 }
381
382 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
383 break;
384 }
387
388 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
389 break;
390 }
393
394 walk(user_data, ob, (ID **)&mmd->target, IDWALK_CB_NOP);
395 walk(user_data, ob, (ID **)&mmd->aux_target, IDWALK_CB_NOP);
396 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
397 break;
398 }
401
402 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
403 break;
404 }
407
408 walk(user_data, ob, (ID **)&mmd->material, IDWALK_CB_USER);
409 walk(user_data, ob, (ID **)&mmd->outline_material, IDWALK_CB_USER);
410 walk(user_data, ob, (ID **)&mmd->object, IDWALK_CB_NOP);
411 break;
412 }
415 break;
416 }
417}
418
419/* *************************************************** */
420/* Modifier Methods - Evaluation Loops, etc. */
421
422static void modifier_free_data_id_us_cb(void * /*user_data*/,
423 Object * /*ob*/,
424 ID **idpoin,
425 int cb_flag)
426{
427 ID *id = *idpoin;
428 if (id != nullptr && (cb_flag & IDWALK_CB_USER) != 0) {
429 id_us_min(id);
430 }
431}
432
434{
437 }
438
440 if (md->error) {
441 MEM_freeN(md->error);
442 }
443
444 MEM_freeN(md);
445}
446
451
454 void *user_data)
455{
457
458 for (; md; md = md->next) {
459 gpencil_modifier_foreach_ID_link(md, ob, walk, user_data);
460 }
461}
462
464{
465 if (modbase == nullptr) {
466 return;
467 }
468
469 LISTBASE_FOREACH (GpencilModifierData *, md, modbase) {
470 if (!gpencil_modifier_type_valid(md->type)) {
471 return;
472 }
473
476
477 if (md->type == eGpencilModifierType_Thick) {
479
480 if (gpmd->curve_thickness) {
482 }
483 }
484 else if (md->type == eGpencilModifierType_Noise) {
486
487 if (gpmd->curve_intensity) {
489 }
490 }
491 else if (md->type == eGpencilModifierType_Hook) {
493
494 if (gpmd->curfalloff) {
496 }
497 }
498 else if (md->type == eGpencilModifierType_Tint) {
500 if (gpmd->colorband) {
501 BLO_write_struct(writer, ColorBand, gpmd->colorband);
502 }
503 if (gpmd->curve_intensity) {
505 }
506 }
507 else if (md->type == eGpencilModifierType_Smooth) {
509 if (gpmd->curve_intensity) {
511 }
512 }
513 else if (md->type == eGpencilModifierType_Color) {
515 if (gpmd->curve_intensity) {
517 }
518 }
519 else if (md->type == eGpencilModifierType_Opacity) {
521 if (gpmd->curve_intensity) {
523 }
524 }
525 else if (md->type == eGpencilModifierType_Dash) {
528 writer, DashGpencilModifierSegment, gpmd->segments_len, gpmd->segments);
529 }
530 else if (md->type == eGpencilModifierType_Time) {
533 writer, TimeGpencilModifierSegment, gpmd->segments_len, gpmd->segments);
534 }
535 }
536}
537
539{
541
543 md->error = nullptr;
544
545 /* if modifiers disappear, or for upward compatibility */
546 if (!gpencil_modifier_type_valid(md->type)) {
547 md->type = eModifierType_None;
548 }
549
550 /* If linking from a library, clear 'local' library override flag. */
551 if (ID_IS_LINKED(ob)) {
552 md->flag &= ~eGpencilModifierFlag_OverrideLibrary_Local;
553 }
554
555 if (md->type == eGpencilModifierType_Lattice) {
557 gpmd->cache_data = nullptr;
558 }
559 else if (md->type == eGpencilModifierType_Hook) {
561
563 if (hmd->curfalloff) {
566 }
567 }
568 else if (md->type == eGpencilModifierType_Noise) {
570
572 if (gpmd->curve_intensity) {
574 /* Initialize the curve. Maybe this could be moved to modifier logic. */
576 }
577 }
578 else if (md->type == eGpencilModifierType_Thick) {
580
582 if (gpmd->curve_thickness) {
585 }
586 }
587 else if (md->type == eGpencilModifierType_Tint) {
589 BLO_read_struct(reader, ColorBand, &gpmd->colorband);
591 if (gpmd->curve_intensity) {
594 }
595 }
596 else if (md->type == eGpencilModifierType_Smooth) {
599 if (gpmd->curve_intensity) {
602 }
603 }
604 else if (md->type == eGpencilModifierType_Color) {
607 if (gpmd->curve_intensity) {
610 }
611 }
612 else if (md->type == eGpencilModifierType_Opacity) {
615 if (gpmd->curve_intensity) {
618 }
619 }
620 else if (md->type == eGpencilModifierType_Dash) {
623 reader, DashGpencilModifierSegment, gpmd->segments_len, &gpmd->segments);
624 for (int i = 0; i < gpmd->segments_len; i++) {
625 gpmd->segments[i].dmd = gpmd;
626 }
627 }
628 else if (md->type == eGpencilModifierType_Time) {
631 reader, TimeGpencilModifierSegment, gpmd->segments_len, &gpmd->segments);
632 for (int i = 0; i < gpmd->segments_len; i++) {
633 gpmd->segments[i].gpmd = gpmd;
634 }
635 }
636 if (md->type == eGpencilModifierType_Shrinkwrap) {
638 gpmd->cache_data = nullptr;
639 }
640 }
641}
void BKE_curvemapping_blend_read(BlendDataReader *reader, CurveMapping *cumap)
void BKE_curvemapping_init(CurveMapping *cumap)
void BKE_curvemapping_free(CurveMapping *cumap)
void BKE_curvemapping_blend_write(BlendWriter *writer, const CurveMapping *cumap)
support for deformation groups and hooks.
void(* GreasePencilIDWalkFunc)(void *user_data, struct Object *ob, struct ID **idpoin, int 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:359
@ IDWALK_CB_USER
@ IDWALK_CB_NOP
General operations, lookup, etc. for materials.
General operations, lookup, etc. for blender objects.
void BKE_shrinkwrap_free_tree(ShrinkwrapTreeData *data)
#define BLI_assert_unreachable()
Definition BLI_assert.h:97
#define LISTBASE_FOREACH(type, var, list)
void BLO_write_struct_by_name(BlendWriter *writer, const char *struct_name, const void *data_ptr)
#define BLO_write_struct(writer, struct_name, data_ptr)
#define BLO_write_struct_array(writer, struct_name, array_size, data_ptr)
#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:654
@ 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_modifier_blend_write(BlendWriter *writer, ListBase *modbase)
void BKE_gpencil_modifiers_foreach_ID_link(Object *ob, GreasePencilIDWalkFunc walk, void *user_data)
static void modifier_free_data_id_us_cb(void *, Object *, ID **idpoin, int cb_flag)
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 bool gpencil_modifier_type_valid(const int type)
static const char * gpencil_modifier_struct_name(const GpencilModifierType 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:105
DashGpencilModifierSegment * segments
struct DashGpencilModifierData * dmd
struct GpencilModifierData * next
Definition DNA_ID.h:413
struct LatticeDeformData * cache_data
void * first
ListBase greasepencil_modifiers
TimeGpencilModifierSegment * segments
struct TimeGpencilModifierData * gpmd
struct CurveMapping * curve_intensity
uint8_t flag
Definition wm_window.cc:138