36#include "RNA_prototypes.hh"
109 const int current_time)
116 if (curves.points_num() == 0) {
124 const int curves_num = curves.curves_num();
127 std::atomic<bool> needs_additional_shrinking =
false;
159 for (
const int i : parallel_range) {
162 const uint primes[2] = {2, 3};
163 double offset[2] = {0.0f, 0.0f};
166 float rand[2] = {0.0f, 0.0f};
167 for (
int j = 0; j < 2; j++) {
170 rand[j] =
math::mod(
float(r[j] + rand_offset), 1.0f);
172 math::mod(sin(rand[j] * 12.9898f + j * 78.233f) * 43758.5453f, 1.0f) + noise);
175 modified_starts[i] = modified_starts[i] + rand[0] * mmd.
rand_start_fac;
176 modified_ends[i] = modified_ends[i] + rand[1] * mmd.
rand_end_fac;
178 if (modified_starts[i] <= 0.0f || modified_ends[i] <= 0.0f) {
179 needs_additional_shrinking.store(
true, std::memory_order_relaxed);
202 if (mmd.
start_fac < 0.0f || mmd.
end_fac < 0.0f || needs_additional_shrinking) {
210 needs_removal.
fill(
false);
212 curves.ensure_evaluated_lengths();
215 for (const int curve : parallel_range) {
216 float length = curves.evaluated_length_total_for_curve(curve, false);
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;
242 curves.remove_curves(to_remove, {});
246 drawing.tag_topology_changed();
262 const IndexMask layer_mask = modifier::greasepencil::get_filtered_layer_mask(
263 grease_pencil, mmd->
influence, mask_memory);
265 modifier::greasepencil::get_drawings_for_write(
266 grease_pencil, layer_mask, grease_pencil.
runtime->eval_frame);
296 C, layout,
ptr,
"open_random_panel",
IFACE_(
"Randomize")))
313 C, layout,
ptr,
"open_curvature_panel",
IFACE_(
"Curvature")))
328 C, layout,
ptr,
"open_influence_panel",
IFACE_(
"Influence")))
330 modifier::greasepencil::draw_layer_filter_settings(C, influence_panel,
ptr);
331 modifier::greasepencil::draw_material_filter_settings(C, influence_panel,
ptr);
345 "GreasePencilLengthModifier",
347 "GreasePencilLengthModifierData",
349 &RNA_GreasePencilLengthModifier,
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_AcceptsGreasePencil
@ eModifierTypeFlag_EnableInEditmode
@ eModifierTypeFlag_SupportsEditmode
void(*)(void *user_data, Object *ob, ID **idpoin, int cb_flag) IDWalkFunc
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
struct GreasePencilLengthModifierData GreasePencilLengthModifierData
@ 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)
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 uiLayoutSetActive(uiLayout *layout, bool active)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
PanelLayout uiLayoutPanelProp(const bContext *C, uiLayout *layout, PointerRNA *open_prop_owner, const char *open_prop_name)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
static unsigned long seed
MutableSpan< T > as_mutable_span()
IndexRange index_range() const
void fill(const T &value) const
static VArray ForSingle(T value, const int64_t size)
static VArray ForSpan(Span< T > values)
bke::CurvesGeometry & strokes_for_write()
static IndexMask from_bools(Span< bool > bools, IndexMaskMemory &memory)
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)
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(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 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 deform_drawing(const ModifierData &md, const Object &ob, bke::greasepencil::Drawing &drawing, const int current_time)
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()