38#include "RNA_prototypes.hh"
83 if (mmd->object !=
nullptr) {
93 const bool use_object_offset)
96 if (use_object_offset) {
100 mat_offset[3] += mmd.
offset;
102 const float4x4 &obinv = ob.world_to_object();
104 return mat_offset * obinv * mmd.
object->object_to_world();
107 const float3 offset = [&]() {
126 for (
int j = 0; j < 3; j++) {
127 const uint3 primes(2, 3, 7);
135 rand_value =
math::mod(r[0] * 2.0 - 1.0 + rand_offset, 1.0);
136 rand_value =
math::mod(
math::sin(rand_value * 12.9898 + j * 78.233) * 43758.5453, 1.0);
137 rand[j] =
float3(rand_value);
140 for (
int i = 0; i < 3; i++) {
141 rand[j][i] =
math::mod(r[i] * 2.0 - 1.0 + rand_offset, 1.0);
142 rand[j][i] =
math::mod(
math::sin(rand[j][i] * 12.9898 + j * 78.233) * 43758.5453, 1.0);
163 stroke_materials.
finish();
171 std::unique_ptr<bke::Instances> instances = std::make_unique<bke::Instances>();
180 std::optional<blender::Bounds<float3>> bounds = filtered_curves.
bounds_min_max();
181 if (bounds.has_value()) {
182 size = bounds.value().max - bounds.value().min;
194 if (use_object_offset) {
195 current_offset = current_offset * mat;
198 current_offset = mat;
205 current_offset.w +=
float4(translate, 1.0f);
210 instances->add_instance(filtered_handle, current_offset);
214 options.keep_original_ids =
true;
215 options.realize_instance_attributes =
false;
240 *ctx.
object, mmd, src_curves, std::move(
copy));
244 src_curves, curves_mask, {});
247 *ctx.
object, mmd, src_curves, std::move(masked_curves));
265 const int frame = grease_pencil.
runtime->eval_frame;
269 grease_pencil, mmd->influence, mask_memory);
272 grease_pencil, layer_mask, frame);
290 C, layout,
ptr,
"open_relative_offset_panel",
IFACE_(
"Relative Offset")))
301 C, layout,
ptr,
"open_constant_offset_panel",
IFACE_(
"Constant Offset")))
312 C, layout,
ptr,
"open_object_offset_panel",
IFACE_(
"Object Offset")))
323 C, layout,
ptr,
"open_randomize_panel",
IFACE_(
"Randomize")))
334 C, layout,
ptr,
"open_influence_panel",
IFACE_(
"Influence")))
366 "GreasePencilArrayModifier",
368 "GreasePencilArrayModifierData",
370 &RNA_GreasePencilArrayModifier,
Low-level operations for curves.
Low-level operations for grease pencil.
General operations, lookup, etc. for materials.
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
BLI_INLINE float BLI_hash_int_01(unsigned int k)
BLI_INLINE unsigned int BLI_hash_string(const char *str)
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_depends_on_transform_relation(DepsNodeHandle *node_handle, const char *description)
void DEG_add_object_relation(DepsNodeHandle *node_handle, Object *object, eDepsObjectComponentType component, const char *description)
#define DNA_struct_default_get(struct_name)
struct GreasePencilArrayModifierData GreasePencilArrayModifierData
@ MOD_GREASE_PENCIL_ARRAY_USE_OFFSET
@ MOD_GREASE_PENCIL_ARRAY_USE_RELATIVE
@ MOD_GREASE_PENCIL_ARRAY_USE_OB_OFFSET
@ MOD_GREASE_PENCIL_ARRAY_UNIFORM_RANDOM_SCALE
@ eModifierType_GreasePencilArray
ModifierTypeInfo modifierType_GreasePencilArray
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 DBVT_INLINE btScalar size(const btDbvtVolume &a)
static unsigned long seed
MutableAttributeAccessor attributes_for_write()
std::optional< Bounds< float3 > > bounds_min_max() const
bke::CurvesGeometry & strokes_for_write()
const bke::CurvesGeometry & strokes() const
void tag_topology_changed()
CCL_NAMESPACE_BEGIN struct Options options
CurvesGeometry curves_copy_curve_selection(const CurvesGeometry &curves, const IndexMask &curves_to_copy, const AttributeFilter &attribute_filter)
Curves * curves_new_nomain(int points_num, int curves_num)
bke::GeometrySet realize_instances(bke::GeometrySet geometry_set, const RealizeInstancesOptions &options)
T sin(const AngleRadianBase< T > &a)
T max(const T &a, const T &b)
T mod(const T &a, const T &b)
MatT from_location(const typename MatT::loc_type &location)
MatT from_loc_rot_scale(const typename MatT::loc_type &location, const RotationT &rotation, const VecBase< typename MatT::base_type, ScaleDim > &scale)
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_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)
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)
VecBase< float, 4 > float4
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 float4x4 get_array_matrix(const Object &ob, const GreasePencilArrayModifierData &mmd, const int elem_idx, const bool use_object_offset)
static bke::CurvesGeometry create_array_copies(const Object &ob, const GreasePencilArrayModifierData &mmd, const bke::CurvesGeometry &base_curves, bke::CurvesGeometry filtered_curves)
static float4x4 get_rand_matrix(const GreasePencilArrayModifierData &mmd, const Object &ob, const int elem_id)
static void modify_drawing(const GreasePencilArrayModifierData &mmd, const ModifierEvalContext &ctx, bke::greasepencil::Drawing &drawing)
static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
VecBase< float, 3 > float3
static void blend_read(BlendDataReader *reader, ModifierData *md)
static void copy(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
GreasePencilModifierInfluenceData influence
GreasePencilRuntimeHandle * runtime
static MatBase identity()
static GeometrySet from_instances(Instances *instances, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
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