Blender V4.3
MOD_grease_pencil_lattice.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "DNA_defaults.h"
10#include "DNA_modifier_types.h"
11
12#include "BKE_curves.hh"
13#include "BKE_geometry_set.hh"
14#include "BKE_grease_pencil.hh"
15#include "BKE_lattice.hh"
16#include "BKE_lib_query.hh"
17#include "BKE_modifier.hh"
18
19#include "BLO_read_write.hh"
20
21#include "UI_interface.hh"
22#include "UI_resources.hh"
23
24#include "BLT_translation.hh"
25
26#include "WM_types.hh"
27
28#include "RNA_prototypes.hh"
29
31#include "MOD_ui_common.hh"
32
33namespace blender {
34
35using bke::greasepencil::Drawing;
37using bke::greasepencil::Layer;
38
39static void init_data(ModifierData *md)
40{
41 auto *lmd = reinterpret_cast<GreasePencilLatticeModifierData *>(md);
42
44
46 modifier::greasepencil::init_influence_data(&lmd->influence, false);
47}
48
49static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
50{
51 const auto *lmd = reinterpret_cast<const GreasePencilLatticeModifierData *>(md);
52 auto *tlmd = reinterpret_cast<GreasePencilLatticeModifierData *>(target);
53
55
57 modifier::greasepencil::copy_influence_data(&lmd->influence, &tlmd->influence, flag);
58}
59
60static void free_data(ModifierData *md)
61{
62 auto *lmd = reinterpret_cast<GreasePencilLatticeModifierData *>(md);
64}
65
66static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
67{
68 auto *lmd = reinterpret_cast<GreasePencilLatticeModifierData *>(md);
69 modifier::greasepencil::foreach_influence_ID_link(&lmd->influence, ob, walk, user_data);
70
71 walk(user_data, ob, (ID **)&lmd->object, IDWALK_CB_NOP);
72}
73
75{
76 auto *lmd = reinterpret_cast<GreasePencilLatticeModifierData *>(md);
77 if (lmd->object != nullptr) {
79 ctx->node, lmd->object, DEG_OB_COMP_TRANSFORM, "Grease Pencil Lattice Modifier");
81 ctx->node, lmd->object, DEG_OB_COMP_GEOMETRY, "Grease Pencil Lattice Modifier");
82 }
83 DEG_add_depends_on_transform_relation(ctx->node, "Grease Pencil Lattice Modifier");
84}
85
86static bool is_disabled(const Scene * /*scene*/, ModifierData *md, bool /*use_render_params*/)
87{
88 auto *lmd = reinterpret_cast<GreasePencilLatticeModifierData *>(md);
89
90 /* The object type check is only needed here in case we have a placeholder
91 * object assigned (because the library containing the lattice is missing).
92 *
93 * In other cases it should be impossible to have a type mismatch.
94 */
95 return lmd->object == nullptr || lmd->object->type != OB_LATTICE;
96}
97
99 const ModifierEvalContext *ctx,
100 const LatticeDeformData &cache_data,
101 Drawing &drawing)
102{
103 const auto *lmd = reinterpret_cast<GreasePencilLatticeModifierData *>(md);
105 bke::CurvesGeometry &curves = drawing.strokes_for_write();
106
107 IndexMaskMemory mask_memory;
109 ctx->object, curves, lmd->influence, mask_memory);
110
111 const OffsetIndices<int> points_by_curve = curves.points_by_curve();
112 MutableSpan<float3> positions = curves.positions_for_write();
114 curves, lmd->influence);
115
116 curves_mask.foreach_index(GrainSize(512), [&](const int64_t curve_i) {
117 const IndexRange points = points_by_curve[curve_i];
118 for (const int64_t point_i : points) {
119 const float weight = vgroup_weights[point_i];
120 BKE_lattice_deform_data_eval_co(const_cast<LatticeDeformData *>(&cache_data),
121 positions[point_i],
122 lmd->strength * weight);
123 }
124 });
125
126 drawing.tag_positions_changed();
127}
128
130 const ModifierEvalContext *ctx,
131 bke::GeometrySet *geometry_set)
132{
133 const auto *lmd = reinterpret_cast<GreasePencilLatticeModifierData *>(md);
134 BLI_assert(lmd->object != nullptr && lmd->object->type == OB_LATTICE);
135 LatticeDeformData *cache_data = BKE_lattice_deform_data_create(lmd->object, ctx->object);
136
137 if (!geometry_set->has_grease_pencil()) {
138 return;
139 }
140 GreasePencil &grease_pencil = *geometry_set->get_grease_pencil_for_write();
141
142 IndexMaskMemory mask_memory;
144 grease_pencil, lmd->influence, mask_memory);
145 const int frame = grease_pencil.runtime->eval_frame;
147 grease_pencil, layer_mask, frame);
149 drawings, [&](Drawing *drawing) { modify_curves(md, ctx, *cache_data, *drawing); });
150
152}
153
154static void panel_draw(const bContext *C, Panel *panel)
155{
156 uiLayout *layout = panel->layout;
157
158 PointerRNA ob_ptr;
160
161 uiLayoutSetPropSep(layout, true);
162
163 uiItemR(layout, ptr, "object", UI_ITEM_NONE, nullptr, ICON_NONE);
164 uiItemR(layout, ptr, "strength", UI_ITEM_R_SLIDER, nullptr, ICON_NONE);
165
166 if (uiLayout *influence_panel = uiLayoutPanelProp(
167 C, layout, ptr, "open_influence_panel", IFACE_("Influence")))
168 {
172 }
173
174 modifier_panel_end(layout, ptr);
175}
176
181
182static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md)
183{
184 const auto *lmd = reinterpret_cast<const GreasePencilLatticeModifierData *>(md);
185
187 modifier::greasepencil::write_influence_data(writer, &lmd->influence);
188}
189
190static void blend_read(BlendDataReader *reader, ModifierData *md)
191{
192 auto *lmd = reinterpret_cast<GreasePencilLatticeModifierData *>(md);
193
194 modifier::greasepencil::read_influence_data(reader, &lmd->influence);
195}
196
197} // namespace blender
198
200 /*idname*/ "GreasePencilLattice",
201 /*name*/ N_("Lattice"),
202 /*struct_name*/ "GreasePencilLatticeModifierData",
203 /*struct_size*/ sizeof(GreasePencilLatticeModifierData),
204 /*srna*/ &RNA_GreasePencilLatticeModifier,
208 /*icon*/ ICON_MOD_LATTICE,
209
210 /*copy_data*/ blender::copy_data,
211
212 /*deform_verts*/ nullptr,
213 /*deform_matrices*/ nullptr,
214 /*deform_verts_EM*/ nullptr,
215 /*deform_matrices_EM*/ nullptr,
216 /*modify_mesh*/ nullptr,
217 /*modify_geometry_set*/ blender::modify_geometry_set,
218
219 /*init_data*/ blender::init_data,
220 /*required_data_mask*/ nullptr,
221 /*free_data*/ blender::free_data,
222 /*is_disabled*/ blender::is_disabled,
223 /*update_depsgraph*/ blender::update_depsgraph,
224 /*depends_on_time*/ nullptr,
225 /*depends_on_normals*/ nullptr,
226 /*foreach_ID_link*/ blender::foreach_ID_link,
227 /*foreach_tex_link*/ nullptr,
228 /*free_runtime_data*/ nullptr,
229 /*panel_register*/ blender::panel_register,
230 /*blend_write*/ blender::blend_write,
231 /*blend_read*/ blender::blend_read,
232 /*foreach_cache*/ nullptr,
233};
Low-level operations for curves.
Low-level operations for grease pencil.
LatticeDeformData * BKE_lattice_deform_data_create(const Object *oblatt, const Object *ob) ATTR_WARN_UNUSED_RESULT
void BKE_lattice_deform_data_destroy(LatticeDeformData *lattice_deform_data)
void BKE_lattice_deform_data_eval_co(LatticeDeformData *lattice_deform_data, float co[3], float weight)
@ IDWALK_CB_NOP
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_AcceptsGreasePencil
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
void(*)(void *user_data, Object *ob, ID **idpoin, int cb_flag) IDWalkFunc
#define BLI_assert(a)
Definition BLI_assert.h:50
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define BLO_write_struct(writer, struct_name, data_ptr)
#define IFACE_(msgid)
void DEG_add_depends_on_transform_relation(DepsNodeHandle *node_handle, const char *description)
void DEG_add_object_relation(DepsNodeHandle *node_handle, Object *object, eDepsObjectComponentType component, const char *description)
@ DEG_OB_COMP_GEOMETRY
@ DEG_OB_COMP_TRANSFORM
#define DNA_struct_default_get(struct_name)
@ eModifierType_GreasePencilLattice
struct GreasePencilLatticeModifierData GreasePencilLatticeModifierData
@ OB_LATTICE
static bool is_disabled
ModifierTypeInfo modifierType_GreasePencilLattice
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
#define UI_ITEM_NONE
PanelLayout uiLayoutPanelProp(const bContext *C, uiLayout *layout, PointerRNA *open_prop_owner, const char *open_prop_name)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
@ UI_ITEM_R_SLIDER
bke::CurvesGeometry & strokes_for_write()
void foreach_index(Fn &&fn) const
void read_influence_data(BlendDataReader *reader, GreasePencilModifierInfluenceData *influence_data)
void init_influence_data(GreasePencilModifierInfluenceData *influence_data, const bool has_custom_curve)
static IndexMask get_filtered_layer_mask(const GreasePencil &grease_pencil, const std::optional< StringRef > layer_name_filter, const std::optional< int > layer_pass_filter, const bool layer_filter_invert, const bool layer_pass_filter_invert, IndexMaskMemory &memory)
static IndexMask get_filtered_stroke_mask(const Object *ob, const bke::CurvesGeometry &curves, const Material *material_filter, const std::optional< int > material_pass_filter, const bool material_filter_invert, const bool material_pass_filter_invert, IndexMaskMemory &memory)
void write_influence_data(BlendWriter *writer, const GreasePencilModifierInfluenceData *influence_data)
void draw_vertex_group_settings(const bContext *, uiLayout *layout, PointerRNA *ptr)
VArray< float > get_influence_vertex_weights(const bke::CurvesGeometry &curves, const GreasePencilModifierInfluenceData &influence_data)
Vector< bke::greasepencil::Drawing * > get_drawings_for_write(GreasePencil &grease_pencil, const IndexMask &layer_mask, const int frame)
void draw_material_filter_settings(const bContext *, uiLayout *layout, PointerRNA *ptr)
void draw_layer_filter_settings(const bContext *, uiLayout *layout, PointerRNA *ptr)
void free_influence_data(GreasePencilModifierInfluenceData *influence_data)
void foreach_influence_ID_link(GreasePencilModifierInfluenceData *influence_data, Object *ob, IDWalkFunc walk, void *user_data)
void copy_influence_data(const GreasePencilModifierInfluenceData *influence_data_src, GreasePencilModifierInfluenceData *influence_data_dst, const int)
void ensure_no_bezier_curves(Drawing &drawing)
void parallel_for_each(Range &&range, const Function &function)
Definition BLI_task.hh:58
static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
static void blend_write(BlendWriter *writer, const ID *, const ModifierData *md)
static void modify_curves(ModifierData &md, const ModifierEvalContext &ctx, Drawing &drawing)
static void init_data(ModifierData *md)
static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
static void panel_draw(const bContext *C, Panel *panel)
static void modify_geometry_set(ModifierData *md, const ModifierEvalContext *ctx, bke::GeometrySet *geometry_set)
static void free_data(ModifierData *md)
static void panel_register(ARegionType *region_type)
static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
static bool is_disabled(const Scene *, ModifierData *md, bool)
static void blend_read(BlendDataReader *reader, ModifierData *md)
__int64 int64_t
Definition stdint.h:89
GreasePencilRuntimeHandle * runtime
Definition DNA_ID.h:413
struct uiLayout * layout
GreasePencil * get_grease_pencil_for_write()
#define N_(msgid)
PointerRNA * ptr
Definition wm_files.cc:4126
uint8_t flag
Definition wm_window.cc:138