35#include "RNA_prototypes.hh"
108 const int current_time)
126 std::atomic<bool> needs_additional_shrinking =
false;
158 for (
const int i : parallel_range) {
161 const uint primes[2] = {2, 3};
162 double offset[2] = {0.0f, 0.0f};
165 float rand[2] = {0.0f, 0.0f};
166 for (
int j = 0; j < 2; j++) {
169 rand[j] =
math::mod(
float(r[j] + rand_offset), 1.0f);
177 if (modified_starts[
i] <= 0.0f || modified_ends[
i] <= 0.0f) {
178 needs_additional_shrinking.store(
true, std::memory_order_relaxed);
201 if (mmd.
start_fac < 0.0f || mmd.
end_fac < 0.0f || needs_additional_shrinking) {
209 needs_removal.
fill(
false);
215 for (const int curve : parallel_range) {
216 float length = curves.evaluated_length_total_for_curve(curve, cyclic[curve]);
217 if (mmd.mode & GP_LENGTH_ABSOLUTE) {
218 starts[curve] = -math::min(use_starts[curve], 0.0f);
219 ends[curve] = length - -math::min(use_ends[curve], 0.0f);
222 starts[curve] = -math::min(use_starts[curve], 0.0f) * length;
223 ends[curve] = (1 + math::min(use_ends[curve], 0.0f)) * length;
225 if (starts[curve] > ends[curve]) {
226 needs_removal[curve] = true;
246 drawing.tag_topology_changed();
263 grease_pencil, mmd->
influence, mask_memory);
266 grease_pencil, layer_mask, grease_pencil.
runtime->eval_frame);
295 C,
ptr,
"open_random_panel",
ptr,
"use_random",
IFACE_(
"Randomize"));
296 if (
uiLayout *random_layout = random_panel_layout.
body) {
309 C,
ptr,
"open_curvature_panel",
ptr,
"use_curvature",
IFACE_(
"Curvature"));
310 if (
uiLayout *curvature_layout = curvature_panel_layout.
body) {
322 C,
ptr,
"open_influence_panel",
IFACE_(
"Influence")))
339 "GreasePencilLengthModifier",
341 "GreasePencilLengthModifierData",
343 &RNA_GreasePencilLengthModifier,
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_AcceptsGreasePencil
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
BLI_INLINE float BLI_hash_int_01(unsigned int k)
BLI_INLINE unsigned int BLI_hash_string(const char *str)
BLI_INLINE unsigned int BLI_hash_int_2d(unsigned int kx, unsigned int ky)
void BLI_halton_2d(const unsigned int prime[2], double offset[2], int n, double *r)
#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 DNA_struct_default_get(struct_name)
@ GP_LENGTH_INVERT_CURVATURE
@ GP_LENGTH_USE_CURVATURE
@ eModifierType_GreasePencilLength
@ GEO_NODE_CURVE_SAMPLE_FACTOR
@ GEO_NODE_CURVE_SAMPLE_LENGTH
Object is a sort of wrapper for general info.
static void panel_register(ARegionType *region_type)
static void panel_draw(const bContext *, Panel *panel)
ModifierTypeInfo modifierType_GreasePencilLength
static void modify_geometry_set(ModifierData *md, const ModifierEvalContext *ctx, blender::bke::GeometrySet *geometry_set)
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)
static unsigned long seed
MutableSpan< T > as_mutable_span()
IndexRange index_range() const
void fill(const T &value) const
static IndexMask from_bools(Span< bool > bools, IndexMaskMemory &memory)
static VArray from_single(T value, const int64_t size)
static VArray from_span(Span< T > values)
IndexRange curves_range() const
void remove_curves(const IndexMask &curves_to_delete, const AttributeFilter &attribute_filter)
void ensure_evaluated_lengths() const
VArray< bool > cyclic() const
bke::CurvesGeometry & strokes_for_write()
bke::CurvesGeometry trim_curves(const bke::CurvesGeometry &src_curves, const IndexMask &selection, const VArray< float > &starts, const VArray< float > &ends, GeometryNodeCurveSampleMode mode, const bke::AttributeFilter &attribute_filter)
bke::CurvesGeometry extend_curves(bke::CurvesGeometry &src_curves, const IndexMask &selection, const VArray< float > &start_lengths, const VArray< float > &end_lengths, float overshoot_fac, bool follow_curvature, float point_density, float segment_influence, float max_angle, bool invert_curvature, GeometryNodeCurveSampleMode sample_mode, const bke::AttributeFilter &attribute_filter)
T interpolate(const T &a, const T &b, const FactorT &t)
T mod(const T &a, const T &b)
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)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
static float table_sample(MutableSpan< float > table, float x)
static void blend_write(BlendWriter *writer, const ID *, const ModifierData *md)
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 deform_drawing(const ModifierData &md, const Object &ob, bke::greasepencil::Drawing &drawing)
static void free_data(ModifierData *md)
static void panel_register(ARegionType *region_type)
static void blend_read(BlendDataReader *reader, ModifierData *md)
static Array< float > noise_table(int len, int offset, int seed)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
GreasePencilModifierInfluenceData influence
GreasePencilRuntimeHandle * runtime
bool has_grease_pencil() const
GreasePencil * get_grease_pencil_for_write()
PanelLayout panel_prop(const bContext *C, PointerRNA *open_prop_owner, blender::StringRefNull open_prop_name)
PanelLayout panel_prop_with_bool_header(const bContext *C, PointerRNA *open_prop_owner, blender::StringRefNull open_prop_name, PointerRNA *bool_prop_owner, blender::StringRefNull bool_prop_name, std::optional< blender::StringRef > label)
uiLayout & column(bool align)
void active_set(bool active)
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)