36#include "RNA_prototypes.hh"
56 dmd->segments_array = ds;
57 dmd->segments_num = 1;
93 if (dash_segment.dash + dash_segment.gap - 1 > 0) {
120 info.
length += dash_segment.dash + dash_segment.gap;
123 info.
segments.reinitialize(dmd.segments().size());
133 for (
const int i : dmd.segments().index_range()) {
135 dash_range = gap_range.
after(dash_segment.
dash);
136 gap_range = dash_range.
after(dash_segment.
gap);
149 const int repeat = index / pattern_info.
length;
150 const int segments_num = pattern_info.
segments.size();
152 const int local_index = index - repeat * pattern_info.
length;
153 for (
const int i : pattern_info.
segments.index_range().drop_back(1)) {
156 if (local_index >= segment.start() && local_index < next_segment.
start()) {
157 return i + repeat * segments_num;
160 return segments_num - 1 + repeat * segments_num;
173 const int points_num = src_points.
size();
174 const int segments_num = pattern_info.
segments.size();
182 for (
const int i : all_segments) {
183 const int repeat =
i / segments_num;
184 const int segment_index =
i - repeat * segments_num;
191 const int64_t start = std::clamp(range.
start() + point_shift, min_point, max_point);
197 pattern_info.
cyclic[segment_index],
198 pattern_info.
material[segment_index],
199 pattern_info.
radius[segment_index],
200 pattern_info.
opacity[segment_index]);
219 int dst_point_num = 0;
220 int dst_curve_num = 0;
226 src_cyclic[src_curve_i],
232 dst_point_num += copy_points.
size();
255 auto add_dash_curve = [&](
const int src_curve,
262 dst_point_range = dst_point_range.
after(copy_points.size());
265 if (src_points.contains(copy_points.last())) {
267 int(copy_points.start()));
272 src_point_indices.as_mutable_span().slice(dst_point_range.
drop_back(1)),
273 int(copy_points.start()));
274 src_point_indices[dst_point_range.
last()] = src_points.first();
276 src_curve_indices[dst_curve_i] = src_curve;
277 dst_cyclic.
span[dst_curve_i] = cyclic;
278 dst_material.span[dst_curve_i] = material >= 0 ? material : src_material[src_curve];
279 for (
const int i : dst_point_range) {
280 dst_radius.span[
i] = src_radius[src_point_indices[
i]] * radius;
283 for (
const int i : dst_point_range) {
284 dst_opacity.span[
i] = src_opacity[src_point_indices[
i]] * opacity;
295 src_cyclic[src_curve_i],
302 src_curve_i, src_points, copy_points, cyclic, material, radius, opacity);
305 if (dst_curve_i > 0) {
325 dst_material.finish();
327 dst_opacity.finish();
350 src_curves, unselected_mask, {});
381 const int frame = grease_pencil.
runtime->eval_frame;
387 grease_pencil, dmd->influence, mask_memory);
390 grease_pencil, layer_mask, frame);
412 "MOD_UL_grease_pencil_dash_modifier_segments",
417 "segment_active_index",
427 sub->
op(
"OBJECT_OT_grease_pencil_dash_modifier_segment_add",
"", ICON_ADD);
428 sub->
op(
"OBJECT_OT_grease_pencil_dash_modifier_segment_remove",
"", ICON_REMOVE);
430 sub = &
col->column(
true);
432 sub,
"", ICON_TRIA_UP,
"OBJECT_OT_grease_pencil_dash_modifier_segment_move",
"type",
"UP");
436 "OBJECT_OT_grease_pencil_dash_modifier_segment_move",
440 if (dmd->segment_active_index >= 0 && dmd->segment_active_index < dmd->segments_num) {
442 &RNA_GreasePencilDashModifierSegment,
443 &dmd->segments()[dmd->segment_active_index]);
445 sub = &layout->
column(
true);
449 sub = &layout->
column(
false);
452 sub->
prop(&ds_ptr,
"material_index",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
457 C,
ptr,
"open_influence_panel",
IFACE_(
"Influence")))
486 STRNCPY(list_type->
idname,
"MOD_UL_grease_pencil_dash_modifier_segments");
517 "GreasePencilDashModifierData",
519 &RNA_GreasePencilDashModifierData,
Low-level operations for curves.
Low-level operations for grease pencil.
void(*)(void *user_data, Object *ob, ID **idpoin, LibraryForeachIDCallbackFlag cb_flag) IDWalkFunc
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_SupportsMapping
@ eModifierTypeFlag_AcceptsGreasePencil
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
char * STRNCPY(char(&dst)[N], const char *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)
@ MOD_GREASE_PENCIL_DASH_USE_CYCLIC
@ eModifierType_GreasePencilDash
ModifierTypeInfo modifierType_GreasePencilDash
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_error_message_draw(uiLayout *layout, PointerRNA *ptr)
void uiTemplateList(uiLayout *layout, const bContext *C, const char *listtype_name, const char *list_id, PointerRNA *dataptr, blender::StringRefNull 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)
@ UI_TEMPLATE_LIST_FLAG_NONE
void uiItemEnumO_string(uiLayout *layout, blender::StringRef name, int icon, blender::StringRefNull opname, blender::StringRefNull propname, const char *value_str)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
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 bool is_empty() 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
IndexRange curves_range() 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()
IndexMask complement(const IndexMask &universe, IndexMaskMemory &memory) const
void foreach_index(Fn &&fn) const
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)
CurvesGeometry curves_copy_curve_selection(const CurvesGeometry &curves, const IndexMask &curves_to_copy, const AttributeFilter &attribute_filter)
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)
Curves * curves_new_nomain(int points_num, int curves_num)
bke::GeometrySet join_geometries(Span< bke::GeometrySet > geometries, const bke::AttributeFilter &attribute_filter, const std::optional< Span< bke::GeometryComponent::Type > > &component_types_to_join=std::nullopt)
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_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)
static IndexMask get_filtered_layer_mask(const GreasePencil &grease_pencil, const std::optional< StringRef > tree_node_name_filter, const std::optional< int > layer_pass_filter, const bool layer_filter_invert, const bool layer_pass_filter_invert, IndexMaskMemory &memory)
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_discrete(ID *id, StructRNA *type, void *data)
GreasePencilModifierInfluenceData influence
GreasePencilDashModifierSegment * segments_array
GreasePencilRuntimeHandle * runtime
Array< IndexRange > segments
static GeometrySet from_curves(Curves *curves, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
Curves * get_curves_for_write()
bool has_grease_pencil() const
GreasePencil * get_grease_pencil_for_write()
MutableVArraySpan< T > span
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, wmOperatorCallContext context, eUI_Item_Flag flag)
PanelLayout panel_prop(const bContext *C, PointerRNA *open_prop_owner, blender::StringRefNull open_prop_name)
uiLayout & column(bool align)
uiLayout & row(bool align)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)
char idname[BKE_ST_MAXNAME]
uiListDrawItemFunc draw_item
bool WM_uilisttype_add(uiListType *ult)