37#include "RNA_prototypes.hh"
57 dmd->segments_array = ds;
58 dmd->segments_num = 1;
94 if (dash_segment.dash + dash_segment.gap - 1 > 0) {
121 info.
length += dash_segment.dash + dash_segment.gap;
124 info.
segments.reinitialize(dmd.segments().size());
134 for (
const int i : dmd.segments().index_range()) {
136 dash_range = gap_range.
after(dash_segment.
dash);
137 gap_range = dash_range.
after(dash_segment.
gap);
150 const int repeat = index / pattern_info.
length;
151 const int segments_num = pattern_info.
segments.size();
153 const int local_index = index - repeat * pattern_info.
length;
154 for (
const int i : pattern_info.
segments.index_range().drop_back(1)) {
157 if (local_index >= segment.start() && local_index < next_segment.
start()) {
158 return i + repeat * segments_num;
161 return segments_num - 1 + repeat * segments_num;
174 const int points_num = src_points.
size();
175 const int segments_num = pattern_info.
segments.size();
183 for (
const int i : all_segments) {
184 const int repeat =
i / segments_num;
185 const int segment_index =
i - repeat * segments_num;
192 const int64_t start = std::clamp(range.
start() + point_shift, min_point, max_point);
198 pattern_info.
cyclic[segment_index],
199 pattern_info.
material[segment_index],
200 pattern_info.
radius[segment_index],
201 pattern_info.
opacity[segment_index]);
220 int dst_point_num = 0;
221 int dst_curve_num = 0;
227 src_cyclic[src_curve_i],
233 dst_point_num += copy_points.
size();
256 auto add_dash_curve = [&](
const int src_curve,
263 dst_point_range = dst_point_range.
after(copy_points.size());
266 if (src_points.contains(copy_points.last())) {
268 int(copy_points.start()));
273 src_point_indices.as_mutable_span().slice(dst_point_range.
drop_back(1)),
274 int(copy_points.start()));
275 src_point_indices[dst_point_range.
last()] = src_points.first();
277 src_curve_indices[dst_curve_i] = src_curve;
278 dst_cyclic.
span[dst_curve_i] = cyclic;
279 dst_material.span[dst_curve_i] = material >= 0 ? material : src_material[src_curve];
280 for (
const int i : dst_point_range) {
281 dst_radius.span[
i] = src_radius[src_point_indices[
i]] * radius;
284 for (
const int i : dst_point_range) {
285 dst_opacity.span[
i] = src_opacity[src_point_indices[
i]] * opacity;
296 src_cyclic[src_curve_i],
303 src_curve_i, src_points, copy_points, cyclic, material, radius, opacity);
306 if (dst_curve_i > 0) {
326 dst_material.finish();
328 dst_opacity.finish();
351 src_curves, unselected_mask, {});
382 const int frame = grease_pencil.
runtime->eval_frame;
388 grease_pencil, dmd->influence, mask_memory);
391 grease_pencil, layer_mask, frame);
413 "MOD_UL_grease_pencil_dash_modifier_segments",
418 "segment_active_index",
428 sub->
op(
"OBJECT_OT_grease_pencil_dash_modifier_segment_add",
"", ICON_ADD);
429 sub->
op(
"OBJECT_OT_grease_pencil_dash_modifier_segment_remove",
"", ICON_REMOVE);
431 sub = &
col->column(
true);
433 "OBJECT_OT_grease_pencil_dash_modifier_segment_move",
"", ICON_TRIA_UP);
435 op_ptr = sub->
op(
"OBJECT_OT_grease_pencil_dash_modifier_segment_move",
"", ICON_TRIA_DOWN);
438 if (dmd->segment_active_index >= 0 && dmd->segment_active_index < dmd->segments_num) {
440 &RNA_GreasePencilDashModifierSegment,
441 &dmd->segments()[dmd->segment_active_index]);
443 sub = &layout->
column(
true);
447 sub = &layout->
column(
false);
450 sub->
prop(&ds_ptr,
"material_index",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
455 C,
ptr,
"open_influence_panel",
IFACE_(
"Influence")))
484 STRNCPY(list_type->
idname,
"MOD_UL_grease_pencil_dash_modifier_segments");
515 "GreasePencilDashModifierData",
517 &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 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, AttrType 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, AttrType 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, bool allow_merging_instance_references=true)
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)
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
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
PanelLayout panel_prop(const bContext *C, PointerRNA *open_prop_owner, blender::StringRefNull open_prop_name)
uiLayout & column(bool align)
uiLayout & row(bool align)
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, blender::wm::OpCallContext context, eUI_Item_Flag flag)
void use_property_split_set(bool value)
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)