43#include "RNA_prototypes.hh"
64 if (tmd->color_ramp) {
73 tmd->color_ramp->tot = 2;
88 if (tmd->color_ramp) {
112 fn.single(tmd->color);
120 return tmd->object ==
nullptr;
128 if (tmd->object !=
nullptr) {
140 return (input_color.
a == 0.0f && material_color.
a > 0.0f) ? material_color : input_color;
160 const float gradient_factor = std::clamp(
166 const float3 input_rgb = {input_color.
r, input_color.
g, input_color.
b};
170 input_rgb, gradient_color.
xyz(), tmd.
factor * gradient_color.w);
192 auto get_material_color = [&](
const int64_t curve_i) {
201 auto get_point_factor = [&](
const int64_t point_i) {
202 const float weight = vgroup_weights[point_i];
203 if (use_weight_as_factor) {
206 return tmd.
factor * weight;
215 const IndexRange points = points_by_curve[curve_i];
226 get_point_factor(point_i) * curve_factor);
232 if (tmd.
object ==
nullptr) {
239 const float4x4 matrix = tmd.
object->world_to_object() * ob.object_to_world();
244 const IndexRange points = points_by_curve[curve_i];
245 for (
const int64_t point_i : points) {
251 get_point_factor(point_i));
283 auto get_material_color = [&](
const int64_t curve_i) {
295 auto get_curve_factor = [&](
const int64_t curve_i) {
297 const IndexRange points = points_by_curve[curve_i];
298 const float vgroup_weight_first = vgroup_weights[points.
first()];
299 float stroke_weight = vgroup_weight_first;
300 if (points.
is_empty() || (stroke_weight <= 0.0f)) {
303 if (use_weight_as_factor) {
304 return stroke_weight;
306 return tmd.
factor * stroke_weight;
314 tmd,
get_base_color(fill_colors[curve_i], material_color), get_curve_factor(curve_i));
322 const float4x4 matrix = tmd.
object->world_to_object() * ob.object_to_world();
327 const IndexRange points = points_by_curve[curve_i];
329 positions[points.
first()];
336 get_curve_factor(curve_i));
361 const IndexRange points = points_by_curve[curve_i];
362 for (
const int64_t point_i : points) {
363 opacities.
span[point_i] = std::clamp(
364 opacities.
span[point_i] + tmd.
factor - 1.0f, 0.0f, 1.0f);
378 ctx.
object, curves, tmd.influence, mask_memory);
383 switch (tmd.color_mode) {
412 const int frame = grease_pencil.
runtime->eval_frame;
416 grease_pencil, tmd->influence, mask_memory);
418 grease_pencil, layer_mask, frame);
450 col->use_property_split_set(
false);
459 C,
ptr,
"open_influence_panel",
IFACE_(
"Influence")))
481 if (tmd->color_ramp) {
499 "GreasePencilTintModifierData",
501 &RNA_GreasePencilTintModifier,
bool BKE_colorband_evaluate(const ColorBand *coba, float in, float out[4])
ColorBand * BKE_colorband_add(bool rangetype)
void BKE_colorband_init(ColorBand *coba, bool rangetype)
void BKE_colorband_foreach_working_space_color(ColorBand *coba, const IDTypeForeachColorFunctionCallback &fn)
Low-level operations for curves.
Low-level operations for grease pencil.
General operations, lookup, etc. for materials.
Material * BKE_object_material_get(Object *ob, short act)
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
#define BLI_assert_unreachable()
#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_read_struct(reader, struct_name, ptr_p)
void DEG_add_object_relation(DepsNodeHandle *node_handle, Object *object, eDepsObjectComponentType component, const char *description)
#define DNA_struct_default_get(struct_name)
@ GP_MATERIAL_FILL_STYLE_GRADIENT
@ GREASE_PENCIL_INFLUENCE_USE_CUSTOM_CURVE
@ MOD_GREASE_PENCIL_COLOR_FILL
@ MOD_GREASE_PENCIL_COLOR_STROKE
@ MOD_GREASE_PENCIL_COLOR_BOTH
@ MOD_GREASE_PENCIL_COLOR_HARDNESS
GreasePencilTintModifierMode
@ MOD_GREASE_PENCIL_TINT_UNIFORM
@ MOD_GREASE_PENCIL_TINT_GRADIENT
@ MOD_GREASE_PENCIL_TINT_USE_WEIGHT_AS_FACTOR
@ eModifierType_GreasePencilTint
Read Guarded memory(de)allocation.
ModifierTypeInfo modifierType_GreasePencilTint
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 uiTemplateColorRamp(uiLayout *layout, PointerRNA *ptr, blender::StringRefNull propname, bool expand)
BMesh const char void * data
constexpr int64_t first() const
constexpr int64_t size() const
constexpr bool is_empty() const
constexpr IndexRange index_range() 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
MutableAttributeAccessor attributes_for_write()
Span< float3 > positions() const
AttributeAccessor attributes() 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
MutableSpan< ColorGeometry4f > fill_colors_for_write()
MutableSpan< ColorGeometry4f > vertex_colors_for_write()
void foreach_index(Fn &&fn) const
void * MEM_dupallocN(const void *vmemh)
T safe_divide(const T &a, const T &b)
T length(const VecBase< T, Size > &a)
T interpolate(const T &a, const T &b, const FactorT &t)
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)
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)
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 draw_custom_curve_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 ColorGeometry4f apply_uniform_tint(const GreasePencilTintModifierData &tmd, const ColorGeometry4f &input_color, const float factor)
static void modify_curves(ModifierData &md, const ModifierEvalContext &ctx, Drawing &drawing, bke::GreasePencilDrawingEditHints *edit_hints)
static void foreach_working_space_color(ModifierData *md, const IDTypeForeachColorFunctionCallback &fn)
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)
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
static void modify_geometry_set(ModifierData *md, const ModifierEvalContext *ctx, bke::GeometrySet *geometry_set)
static void modify_fill_color(Object &ob, const GreasePencilColorModifierData &cmd, Drawing &drawing, const IndexMask &curves_mask)
static ColorGeometry4f get_base_color(const ColorGeometry4f &input_color, const ColorGeometry4f &material_color)
static void free_data(ModifierData *md)
static void panel_register(ARegionType *region_type)
static ColorGeometry4f apply_gradient_tint(const GreasePencilTintModifierData &tmd, const float4x4 &matrix, const float3 &position, const ColorGeometry4f &input_color, const float factor)
static void modify_stroke_color(Object &ob, const GreasePencilColorModifierData &cmd, bke::CurvesGeometry &curves, const IndexMask &curves_mask, const MutableSpan< ColorGeometry4f > vertex_colors)
static void modify_opacity(const GreasePencilTintModifierData &tmd, bke::CurvesGeometry &curves, const IndexMask &curves_mask)
static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
static bool is_disabled(const Scene *, ModifierData *md, bool)
static void blend_read(BlendDataReader *reader, ModifierData *md)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
struct CurveMapping * custom_curve
GreasePencilModifierInfluenceData influence
struct ColorBand * color_ramp
GreasePencilRuntimeHandle * runtime
struct MaterialGPencilStyle * gp_style
VecBase< T, 3 > xyz() const
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)
void active_set(bool active)
void separator(float factor=1.0f, LayoutSeparatorType type=LayoutSeparatorType::Auto)
uiLayout & row(bool align)
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)