35#include "RNA_prototypes.hh"
53 dmd->segments_array = ds;
54 dmd->segments_num = 1;
90 if (dash_segment.dash + dash_segment.gap - 1 > 0) {
117 info.
length += dash_segment.dash + dash_segment.gap;
120 info.
segments.reinitialize(dmd.segments().size());
130 for (
const int i : dmd.segments().index_range()) {
132 dash_range = gap_range.
after(dash_segment.
dash);
133 gap_range = dash_range.
after(dash_segment.
gap);
146 const int repeat = index / pattern_info.
length;
147 const int segments_num = pattern_info.
segments.size();
149 const int local_index = index - repeat * pattern_info.
length;
150 for (
const int i : pattern_info.
segments.index_range().drop_back(1)) {
153 if (local_index >= segment.start() && local_index < next_segment.
start()) {
154 return i + repeat * segments_num;
157 return segments_num - 1 + repeat * segments_num;
170 const int points_num = src_points.
size();
171 const int segments_num = pattern_info.
segments.size();
179 for (
const int i : all_segments) {
180 const int repeat = i / segments_num;
181 const int segment_index = i - repeat * segments_num;
188 const int64_t start = std::clamp(range.start() + point_shift, min_point, max_point);
189 const int64_t end = std::clamp(range.one_after_last() + point_shift, min_point, max_point + 1);
192 if (!points.is_empty()) {
194 pattern_info.
cyclic[segment_index],
195 pattern_info.
material[segment_index],
196 pattern_info.
radius[segment_index],
197 pattern_info.
opacity[segment_index]);
216 int dst_point_num = 0;
217 int dst_curve_num = 0;
223 src_cyclic[src_curve_i],
229 dst_point_num += copy_points.
size();
252 auto add_dash_curve = [&](
const int src_curve,
259 dst_point_range = dst_point_range.
after(copy_points.size());
262 if (src_points.contains(copy_points.last())) {
264 int(copy_points.start()));
269 src_point_indices.as_mutable_span().slice(dst_point_range.
drop_back(1)),
270 int(copy_points.start()));
271 src_point_indices[dst_point_range.
last()] = src_points.first();
273 src_curve_indices[dst_curve_i] = src_curve;
274 dst_cyclic.
span[dst_curve_i] = cyclic;
275 dst_material.span[dst_curve_i] = material >= 0 ?
material : src_material[src_curve];
276 for (
const int i : dst_point_range) {
277 dst_radius.span[i] = src_radius[src_point_indices[i]] * radius;
278 dst_opacity.span[i] = src_opacity[src_point_indices[i]] * opacity;
288 src_cyclic[src_curve_i],
295 src_curve_i, src_points, copy_points, cyclic, material, radius, opacity);
298 if (dst_curve_i > 0) {
318 dst_material.finish();
320 dst_opacity.finish();
357 const int frame = grease_pencil.
runtime->eval_frame;
363 grease_pencil, dmd->influence, mask_memory);
366 grease_pencil, layer_mask, frame);
388 "MOD_UL_grease_pencil_dash_modifier_segments",
393 "segment_active_index",
403 uiItemO(sub,
"", ICON_ADD,
"OBJECT_OT_grease_pencil_dash_modifier_segment_add");
404 uiItemO(sub,
"", ICON_REMOVE,
"OBJECT_OT_grease_pencil_dash_modifier_segment_remove");
408 sub,
"", ICON_TRIA_UP,
"OBJECT_OT_grease_pencil_dash_modifier_segment_move",
"type",
"UP");
412 "OBJECT_OT_grease_pencil_dash_modifier_segment_move",
416 if (dmd->segment_active_index >= 0 && dmd->segment_active_index < dmd->segments_num) {
418 &RNA_GreasePencilDashModifierSegment,
419 &dmd->segments()[dmd->segment_active_index]);
433 C, layout,
ptr,
"open_influence_panel",
IFACE_(
"Influence")))
463 STRNCPY(list_type->
idname,
"MOD_UL_grease_pencil_dash_modifier_segments");
494 "GreasePencilDashModifierData",
496 &RNA_GreasePencilDashModifierData,
Low-level operations for curves.
Low-level operations for grease pencil.
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 STRNCPY(dst, src)
#define STRNCPY_UTF8(dst, src)
#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 BLO_write_struct_array(writer, struct_name, array_size, data_ptr)
#define BLO_read_struct_array(reader, struct_name, array_size, ptr_p)
#define DNA_struct_default_get(struct_name)
#define DNA_struct_default_alloc(struct_name)
struct GreasePencilDashModifierData GreasePencilDashModifierData
@ MOD_GREASE_PENCIL_DASH_USE_CYCLIC
@ eModifierType_GreasePencilDash
ModifierTypeInfo modifierType_GreasePencilDash
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 uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value_str)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
void uiTemplateList(uiLayout *layout, const bContext *C, const char *listtype_name, const char *list_id, PointerRNA *dataptr, const char *propname, PointerRNA *active_dataptr, const char *active_propname, const char *item_dyntip_propname, int rows, int maxrows, int layout_type, int columns, enum uiTemplateListFlags flags)
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
PanelLayout uiLayoutPanelProp(const bContext *C, uiLayout *layout, PointerRNA *open_prop_owner, const char *open_prop_name)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
@ UI_TEMPLATE_LIST_FLAG_NONE
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
void reinitialize(const int64_t new_size)
constexpr int64_t one_after_last() const
constexpr IndexRange drop_back(int64_t n) const
constexpr int64_t last(const int64_t n=0) const
constexpr int64_t size() const
constexpr IndexRange after(int64_t n) const
constexpr int64_t start() const
GAttributeReader lookup_or_default(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type, const void *default_value=nullptr) const
OffsetIndices< int > points_by_curve() const
void update_curve_types()
MutableAttributeAccessor attributes_for_write()
AttributeAccessor attributes() const
MutableSpan< int > offsets_for_write()
VArray< bool > cyclic() const
GSpanAttributeWriter lookup_or_add_for_write_span(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type, const AttributeInit &initializer=AttributeInitDefaultValue())
bke::CurvesGeometry & strokes_for_write()
const bke::CurvesGeometry & strokes() const
void tag_topology_changed()
void foreach_index(Fn &&fn) const
local_group_size(16, 16) .push_constant(Type b
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_dupallocN)(const void *vmemh)
void fill_index_range(MutableSpan< T > span, const T start=0)
auto attribute_filter_from_skip_ref(const Span< StringRef > skip)
void gather_attributes(AttributeAccessor src_attributes, AttrDomain src_domain, AttrDomain dst_domain, const AttributeFilter &attribute_filter, const IndexMask &selection, MutableAttributeAccessor dst_attributes)
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)
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)
static int floored_modulo(const int a, const int b)
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 segment_list_item_draw(uiList *, const bContext *, uiLayout *layout, PointerRNA *, PointerRNA *itemptr, int, PointerRNA *, const char *, int, int)
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 foreach_dash(const PatternInfo &pattern_info, const IndexRange src_points, const bool cyclic, FunctionRef< void(IndexRange, bool, int, float, float)> fn)
static bke::CurvesGeometry create_dashes(const PatternInfo &pattern_info, const bke::CurvesGeometry &src_curves, const IndexMask &curves_mask)
static void modify_drawing(const GreasePencilArrayModifierData &mmd, const ModifierEvalContext &ctx, bke::greasepencil::Drawing &drawing)
static int find_dash_segment(const PatternInfo &pattern_info, const int index)
static PatternInfo get_pattern_info(const GreasePencilDashModifierData &dmd)
static bool is_disabled(const Scene *, ModifierData *md, bool)
static void blend_read(BlendDataReader *reader, ModifierData *md)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
GreasePencilModifierInfluenceData influence
GreasePencilDashModifierSegment * segments_array
GreasePencilRuntimeHandle * runtime
Array< IndexRange > segments
bool has_grease_pencil() const
GreasePencil * get_grease_pencil_for_write()
MutableVArraySpan< T > span
char idname[BKE_ST_MAXNAME]
uiListDrawItemFunc draw_item
bool WM_uilisttype_add(uiListType *ult)