GPv3: Opacity modifier #116946

Merged
Lukas Tönne merged 52 commits from LukasTonne/blender:gp3-opacity-modifier into main 2024-01-16 16:56:22 +01:00
5 changed files with 93 additions and 16 deletions
Showing only changes of commit 1e94f8519a - Show all commits

View File

@ -2512,6 +2512,14 @@ typedef struct GreasePencilModifierVertexGroupData {
char _pad[4];
} GreasePencilModifierVertexGroupData;
typedef struct GreasePencilModifierCustomCurveData {
struct CurveMapping *curve;
/** GreasePencilModifierFilterFlag */
int flag;
char _pad1[4];
void *_pad2;
} GreasePencilModifierCustomCurveData;
typedef enum GreasePencilModifierInfluenceFlag {
GREASE_PENCIL_INFLUENCE_INVERT_LAYER_FILTER = (1 << 0),
GREASE_PENCIL_INFLUENCE_USE_LAYER_PASS_FILTER = (1 << 1),
@ -2520,6 +2528,7 @@ typedef enum GreasePencilModifierInfluenceFlag {
GREASE_PENCIL_INFLUENCE_USE_MATERIAL_PASS_FILTER = (1 << 4),
GREASE_PENCIL_INFLUENCE_INVERT_MATERIAL_PASS_FILTER = (1 << 5),
GREASE_PENCIL_INFLUENCE_INVERT_VERTEX_GROUP = (1 << 6),
GREASE_PENCIL_INFLUENCE_USE_CUSTOM_CURVE = (1 << 7),
} GreasePencilModifierInfluenceFlag;
/**
@ -2530,6 +2539,7 @@ typedef struct GreasePencilModifierInfluenceData {
GreasePencilModifierLayerFilter layer_filter;
GreasePencilModifierMaterialFilter material_filter;
GreasePencilModifierVertexGroupData vertex_group;
GreasePencilModifierCustomCurveData custom_curve;
} GreasePencilModifierInfluenceData;
typedef struct GreasePencilOpacityModifierData {

View File

@ -7593,11 +7593,35 @@ static void rna_def_modifier_grease_pencil_vertex_group(BlenderRNA *brna)
RNA_define_lib_overridable(false);
}
static void rna_def_modifier_grease_pencil_custom_curve(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
srna = RNA_def_struct(brna, "GreasePencilModifierCustomCurveData", nullptr);
RNA_def_struct_ui_text(srna,
"Grease Pencil Modifier Custom Curve",
"Custom curve settings for grease pencil modifiers");
RNA_def_struct_sdna(srna, "GreasePencilModifierCustomCurveData");
prop = RNA_def_property(srna, "use_custom_curve", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, nullptr, "flag", GREASE_PENCIL_INFLUENCE_USE_CUSTOM_CURVE);
RNA_def_property_ui_text(
prop, "Use Custom Curve", "Use a custom curve to define a factor along the strokes");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, nullptr, "curve");
RNA_def_property_ui_text(prop, "Curve", "Custom curve to apply effect");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
/** Utility function to register common influence properties for grease pencil modifiers. */
static void rna_def_modifier_grease_pencil_influence_properties(StructRNA *srna,
const char *layer_filter_sdna,
const char *material_filter_sdna,
const char *vertex_group_sdna)
const char *vertex_group_sdna,
const char *custom_curve_sdna)
{
PropertyRNA *prop;
@ -7619,6 +7643,12 @@ static void rna_def_modifier_grease_pencil_influence_properties(StructRNA *srna,
RNA_def_property_struct_type(prop, "GreasePencilModifierVertexGroupData");
RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group settings");
}
if (custom_curve_sdna) {
prop = RNA_def_property(srna, "custom_curve", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, nullptr, custom_curve_sdna);
RNA_def_property_struct_type(prop, "GreasePencilModifierCustomCurveData");
RNA_def_property_ui_text(prop, "Custom Curve", "Custom curve settings");
}
}
static void rna_def_modifier_grease_pencil_opacity(BlenderRNA *brna)
@ -7631,8 +7661,11 @@ static void rna_def_modifier_grease_pencil_opacity(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "GreasePencilOpacityModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_OPACITY);
rna_def_modifier_grease_pencil_influence_properties(
srna, "influence.layer_filter", "influence.material_filter", "influence.vertex_group");
rna_def_modifier_grease_pencil_influence_properties(srna,
"influence.layer_filter",
"influence.material_filter",
"influence.vertex_group",
"influence.custom_curve");
prop = RNA_def_property(srna, "open_influence_panel", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(
@ -7812,6 +7845,7 @@ void RNA_def_modifier(BlenderRNA *brna)
rna_def_modifier_grease_pencil_layer_filter(brna);
rna_def_modifier_grease_pencil_material_filter(brna);
rna_def_modifier_grease_pencil_vertex_group(brna);
rna_def_modifier_grease_pencil_custom_curve(brna);
}
#endif

View File

@ -59,7 +59,7 @@ static void init_data(ModifierData *md)
sizeof(*(omd)) - OFFSETOF_STRUCT_AFTER(omd, modifier));
}
LukasTonne marked this conversation as resolved Outdated

You can write const auto * with the cast, it might keep it on one line

You can write `const auto *` with the cast, it might keep it on one line
greasepencil::init_influence_data(&omd->influence);
greasepencil::init_influence_data(&omd->influence, true);
}
static void copy_data(const ModifierData *md, ModifierData *target, const int flag)
@ -67,10 +67,19 @@ static void copy_data(const ModifierData *md, ModifierData *target, const int fl
const GreasePencilOpacityModifierData *omd = (const GreasePencilOpacityModifierData *)md;
GreasePencilOpacityModifierData *tomd = (GreasePencilOpacityModifierData *)target;
greasepencil::free_influence_data(&tomd->influence);
BKE_modifier_copydata_generic(md, target, flag);
greasepencil::copy_influence_data(&omd->influence, &tomd->influence, flag);
}
static void free_data(ModifierData *md)
{
GreasePencilOpacityModifierData *omd = (GreasePencilOpacityModifierData *)md;
greasepencil::free_influence_data(&omd->influence);
}
static void required_data_mask(ModifierData *md, CustomData_MeshMasks *r_cddata_masks)
LukasTonne marked this conversation as resolved
Review

You should just be able to retrieve the vertex group as an attribute

You should just be able to retrieve the vertex group as an attribute
Review

Took some explaining from @filedescriptor how this works (maybe a good topic for technical docs?). As far as i understand the VArray wrapper for the curves->deform_verts() is ok here, since we're only using a single vertex group. For something like the armature modifier i'd guess we still want to use the MDeformVert directly.

Took some explaining from @filedescriptor how this works (maybe a good topic for technical docs?). As far as i understand the `VArray` wrapper for the `curves->deform_verts()` is ok here, since we're only using a single vertex group. For something like the armature modifier i'd guess we still want to use the `MDeformVert` directly.
Review

Right, exactly

Right, exactly
{
GreasePencilOpacityModifierData *omd = (GreasePencilOpacityModifierData *)md;
@ -85,13 +94,6 @@ static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void
greasepencil::foreach_influence_ID_link(&omd->influence, ob, walk, user_data);
}
static void free_data(ModifierData *md)
{
GreasePencilOpacityModifierData *omd = (GreasePencilOpacityModifierData *)md;
greasepencil::free_influence_data(&omd->influence);
}
static void modify_curves(ModifierData *md,
LukasTonne marked this conversation as resolved Outdated

Use the * operator overload to just store the VArray directly here

Use the * operator overload to just store the VArray directly here
const ModifierEvalContext *ctx,
bke::CurvesGeometry &curves)
@ -152,9 +154,11 @@ static void panel_draw(const bContext *C, Panel *panel)
PointerRNA layer_filter_ptr = RNA_pointer_get(ptr, "layer_filter");
PointerRNA material_filter_ptr = RNA_pointer_get(ptr, "material_filter");
PointerRNA vertex_group_ptr = RNA_pointer_get(ptr, "vertex_group");
PointerRNA custom_curve_ptr = RNA_pointer_get(ptr, "custom_curve");
greasepencil::draw_layer_filter_settings(C, influence_panel, &layer_filter_ptr);
greasepencil::draw_material_filter_settings(C, influence_panel, &material_filter_ptr);
greasepencil::draw_vertex_group_settings(C, influence_panel, &vertex_group_ptr);
greasepencil::draw_custom_curve_settings(C, influence_panel, &custom_curve_ptr);
}
uiLayoutSetPropSep(layout, true);

View File

@ -15,6 +15,7 @@
#include "DNA_modifier_types.h"
#include "DNA_screen_types.h"
#include "BKE_colortools.hh"
#include "BKE_curves.hh"
#include "BKE_grease_pencil.hh"
#include "BKE_lib_query.h"
@ -36,16 +37,31 @@ namespace blender::greasepencil {
using bke::greasepencil::Drawing;
using bke::greasepencil::Layer;
void init_influence_data(GreasePencilModifierInfluenceData * /*influence_data*/) {}
void init_influence_data(GreasePencilModifierInfluenceData *influence_data,
const bool has_custom_curve)
{
if (has_custom_curve) {
influence_data->custom_curve.curve = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
BKE_curvemapping_init(influence_data->custom_curve.curve);
}
}
void copy_influence_data(const GreasePencilModifierInfluenceData *influence_data_src,
GreasePencilModifierInfluenceData *influence_data_dst,
const int /*flag*/)
{
memcpy(influence_data_dst, influence_data_src, sizeof(GreasePencilModifierInfluenceData));
influence_data_dst->custom_curve.curve = BKE_curvemapping_copy(
influence_data_src->custom_curve.curve);
}
void free_influence_data(GreasePencilModifierInfluenceData * /*influence_data*/) {}
void free_influence_data(GreasePencilModifierInfluenceData *influence_data)
{
if (influence_data->custom_curve.curve) {
BKE_curvemapping_free(influence_data->custom_curve.curve);
influence_data->custom_curve.curve = nullptr;
}
}
void foreach_influence_ID_link(GreasePencilModifierInfluenceData *influence_data,
Object *ob,
@ -112,7 +128,7 @@ void draw_material_filter_settings(const bContext * /*C*/, uiLayout *layout, Poi
void draw_vertex_group_settings(const bContext * /*C*/, uiLayout *layout, PointerRNA *ptr)
{
PointerRNA ob_ptr = RNA_pointer_create(ptr->owner_id, &RNA_Object, ptr->owner_id);
bool has_vertex_group = RNA_string_length(ptr, "name") != 0;
bool has_vertex_group = RNA_string_length(ptr, "vertex_group_name") != 0;
uiLayout *row, *sub;
uiLayoutSetPropSep(layout, true);
@ -125,6 +141,18 @@ void draw_vertex_group_settings(const bContext * /*C*/, uiLayout *layout, Pointe
uiItemR(sub, ptr, "invert_vertex_group", UI_ITEM_NONE, "", ICON_ARROW_LEFTRIGHT);
}
void draw_custom_curve_settings(const bContext * /*C*/, uiLayout *layout, PointerRNA *ptr)
{
bool use_custom_curve = RNA_boolean_get(ptr, "use_custom_curve");
uiLayoutSetPropSep(layout, true);
uiItemR(layout, ptr, "use_custom_curve", UI_ITEM_NONE, nullptr, ICON_NONE);
if (use_custom_curve) {
uiTemplateCurveMapping(layout, ptr, "curve", 0, false, false, false, false);
}
}
/**
* Get a list of pass IDs used by grease pencil materials.
* This way the material pass can be looked up by index instead of having to get the material for

View File

@ -31,7 +31,7 @@ class Drawing;
namespace blender::greasepencil {
void init_influence_data(GreasePencilModifierInfluenceData *influence_data);
void init_influence_data(GreasePencilModifierInfluenceData *influence_data, bool has_custom_curve);
void copy_influence_data(const GreasePencilModifierInfluenceData *influence_data_src,
GreasePencilModifierInfluenceData *influence_data_dst,
int flag);
@ -43,7 +43,8 @@ void foreach_influence_ID_link(GreasePencilModifierInfluenceData *influence_data
void draw_layer_filter_settings(const bContext *C, uiLayout *layout, PointerRNA *ptr);
void draw_material_filter_settings(const bContext *C, uiLayout *layout, PointerRNA *ptr);
void draw_vertex_group_settings(const bContext * /*C*/, uiLayout *layout, PointerRNA *ptr);
void draw_vertex_group_settings(const bContext *C, uiLayout *layout, PointerRNA *ptr);
void draw_custom_curve_settings(const bContext *C, uiLayout *layout, PointerRNA *ptr);
IndexMask get_filtered_layer_mask(const GreasePencil &grease_pencil,
const GreasePencilModifierLayerFilter &filter,