33#include "RNA_prototypes.hh"
85 const float3 &scale_factor,
96 for (
const int64_t i : points) {
97 const float weight = weights[i];
99 float &radius = radii[i];
102 if (has_stroke_offset) {
110 if (has_global_offset) {
119 radius *= unit_scale;
146 auto get_random_channel = [&](
const char channel,
const double r) {
147 float rand =
fmodf(r * 2.0f - 1.0f + rand_offset, 1.0f);
148 return fmodf(sin(rand * 12.9898f + channel * 78.233f) * 43758.5453f, 1.0f);
151 auto get_random_value = [&](
const char channel,
const int64_t curve_i) {
152 const uint halton_primes[3] = {2, 3, 7};
153 double halton_offset[3] = {0.0f, 0.0f, 0.0f};
157 return get_random_channel(channel, r[0]);
160 auto get_random_vector = [&](
const char channel,
const int64_t curve_i) {
161 const uint halton_primes[3] = {2, 3, 7};
162 double halton_offset[3] = {0.0f, 0.0f, 0.0f};
166 return float3(get_random_channel(channel, r[0]),
167 get_random_channel(channel, r[1]),
168 get_random_channel(channel, r[2]));
172 const IndexRange points = points_by_curve[curve_i];
175 const float3 loc_factor = get_random_vector(0, curve_i);
176 const float3 rot_factor = get_random_vector(1, curve_i);
177 const float3 scale_factor = use_uniform_scale ?
float3(get_random_value(2, curve_i)) :
178 get_random_vector(2, curve_i);
181 omd, vgroup_weights, points, loc_factor, rot_factor, scale_factor, positions, radii.span);
194 return ((size - (index / step + start_offset % size) % size * step % size) - 1) /
float(size);
211 const IndexRange points = points_by_curve[curve_i];
233 const short totcol = totcolp ? *totcolp : 0;
242 const VArray<int> stroke_materials = *attributes.lookup_or_default<
int>(
246 const IndexRange points = points_by_curve[curve_i];
263 const int layer_index,
264 const int layers_num,
279 const IndexRange points = points_by_curve[curve_i];
302 ctx.
object, curves, omd.influence, mask_memory);
304 switch (omd.offset_mode) {
331 ctx.
object, curves, omd.influence, mask_memory);
333 switch (omd.offset_mode) {
358 const int frame = grease_pencil.
runtime->eval_frame;
362 grease_pencil, omd->influence, mask_memory);
366 grease_pencil, layer_mask, frame);
369 *md, *ctx, *info.drawing, info.layer_index, grease_pencil.layers().size());
374 grease_pencil, layer_mask, frame);
390 C, layout,
ptr,
"open_general_panel",
IFACE_(
"General")))
399 panel,
"advanced",
true);
401 nullptr, &RNA_LayoutPanelState, advanced_panel_state);
403 C, layout, &advanced_state_ptr,
"is_open",
IFACE_(
"Advanced")))
412 switch (offset_mode) {
433 C, layout,
ptr,
"open_influence_panel",
IFACE_(
"Influence")))
466 "GreasePencilOffset",
468 "GreasePencilOffsetModifierData",
470 &RNA_GreasePencilOffsetModifier,
Low-level operations for curves.
Low-level operations for grease pencil.
General operations, lookup, etc. for materials.
short * BKE_object_material_len_p(struct Object *ob)
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
LayoutPanelState * BKE_panel_layout_panel_state_ensure(Panel *panel, const char *idname, bool default_closed)
#define BLI_assert_unreachable()
BLI_INLINE float BLI_hash_int_01(unsigned int k)
BLI_INLINE unsigned int BLI_hash_string(const char *str)
MINLINE int max_ii(int a, int b)
void BLI_halton_3d(const unsigned int prime[3], double offset[3], 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)
void DEG_add_object_relation(DepsNodeHandle *node_handle, Object *object, eDepsObjectComponentType component, const char *description)
#define DNA_struct_default_get(struct_name)
@ MOD_GREASE_PENCIL_OFFSET_UNIFORM_RANDOM_SCALE
@ eModifierType_GreasePencilOffset
struct GreasePencilOffsetModifierData GreasePencilOffsetModifierData
GreasePencilOffsetModifierMode
@ MOD_GREASE_PENCIL_OFFSET_STROKE
@ MOD_GREASE_PENCIL_OFFSET_MATERIAL
@ MOD_GREASE_PENCIL_OFFSET_LAYER
@ MOD_GREASE_PENCIL_OFFSET_RANDOM
ModifierTypeInfo modifierType_GreasePencilOffset
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 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
bke::CurvesGeometry & strokes_for_write()
void foreach_index(Fn &&fn) const
draw_view in_light_buf[] float
MatT from_loc_rot_scale(const typename MatT::loc_type &location, const RotationT &rotation, const VecBase< typename MatT::base_type, ScaleDim > &scale)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
void read_influence_data(BlendDataReader *reader, GreasePencilModifierInfluenceData *influence_data)
void init_influence_data(GreasePencilModifierInfluenceData *influence_data, const bool has_custom_curve)
Vector< LayerDrawingInfo > get_drawing_infos_by_layer(GreasePencil &grease_pencil, const IndexMask &layer_mask, const int frame)
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)
void draw_vertex_group_settings(const bContext *, uiLayout *layout, PointerRNA *ptr)
VArray< float > get_influence_vertex_weights(const bke::CurvesGeometry &curves, 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 parallel_for_each(Range &&range, const Function &function)
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 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 modify_stroke_by_index(const GreasePencilOffsetModifierData &omd, const IndexMask &curves_mask, bke::CurvesGeometry &curves)
static void free_data(ModifierData *md)
static void panel_register(ARegionType *region_type)
static void apply_stroke_transform(const GreasePencilOffsetModifierData &omd, const VArray< float > &weights, const IndexRange &points, const float3 &loc_factor, const float3 &rot_factor, const float3 &scale_factor, const MutableSpan< float3 > positions, const MutableSpan< float > radii)
static void modify_drawing(const GreasePencilArrayModifierData &mmd, const ModifierEvalContext &ctx, bke::greasepencil::Drawing &drawing)
static void modify_drawing_by_layer(const ModifierData &md, const ModifierEvalContext &ctx, bke::greasepencil::Drawing &drawing, int layer_index, int layers_num)
static float get_factor_from_index(const GreasePencilOffsetModifierData &omd, const int size, const int index)
static void modify_stroke_random(const Object &ob, const GreasePencilOffsetModifierData &omd, const IndexMask &curves_mask, bke::CurvesGeometry &curves)
static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
VecBase< float, 3 > float3
static void blend_read(BlendDataReader *reader, ModifierData *md)
static void modify_stroke_by_material(const Object &ob, const GreasePencilOffsetModifierData &omd, const IndexMask &curves_mask, bke::CurvesGeometry &curves)
static void modify_stroke_by_layer(const GreasePencilOffsetModifierData &omd, const int layer_index, const int layers_num, const IndexMask &curves_mask, bke::CurvesGeometry &curves)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
int RNA_enum_get(PointerRNA *ptr, const char *name)
GreasePencilModifierInfluenceData influence
GreasePencilRuntimeHandle * runtime
bool has_grease_pencil() const
GreasePencil * get_grease_pencil_for_write()