GPv3: Conversion code for remaining modifiers #118523

Merged
Lukas Tönne merged 12 commits from LukasTonne/blender:gp3-modifier-conversion-all into main 2024-02-23 19:18:04 +01:00
1 changed files with 671 additions and 45 deletions

View File

@ -28,6 +28,7 @@
#include "BLI_color.hh"
#include "BLI_function_ref.hh"
#include "BLI_listbase.h"
#include "BLI_math_matrix.h"
#include "BLI_math_vector_types.hh"
#include "BLI_string.h"
#include "BLI_string_utf8.h"
@ -748,6 +749,8 @@ static void legacy_object_modifier_influence(GreasePencilModifierInfluenceData &
CurveMapping **custom_curve,
const bool use_custom_curve)
{
influence.flag = 0;
STRNCPY(influence.layer_name, layername.data());
if (invert_layer) {
influence.flag |= GREASE_PENCIL_INFLUENCE_INVERT_LAYER_FILTER;
@ -792,25 +795,346 @@ static void legacy_object_modifier_influence(GreasePencilModifierInfluenceData &
}
}
static void legacy_object_modifier_array(Object &object, GpencilModifierData &legacy_md)
{
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilArray, legacy_md);
auto &md_array = reinterpret_cast<GreasePencilArrayModifierData &>(md);
auto &legacy_md_array = reinterpret_cast<ArrayGpencilModifierData &>(legacy_md);
md_array.object = legacy_md_array.object;
legacy_md_array.object = nullptr;
md_array.count = legacy_md_array.count;
md_array.flag = 0;
if (legacy_md_array.flag & GP_ARRAY_UNIFORM_RANDOM_SCALE) {
md_array.flag |= MOD_GREASE_PENCIL_ARRAY_UNIFORM_RANDOM_SCALE;
}
if (legacy_md_array.flag & GP_ARRAY_USE_OB_OFFSET) {
md_array.flag |= MOD_GREASE_PENCIL_ARRAY_USE_OB_OFFSET;
}
if (legacy_md_array.flag & GP_ARRAY_USE_OFFSET) {
md_array.flag |= MOD_GREASE_PENCIL_ARRAY_USE_OFFSET;
}
if (legacy_md_array.flag & GP_ARRAY_USE_RELATIVE) {
md_array.flag |= MOD_GREASE_PENCIL_ARRAY_USE_RELATIVE;
}
copy_v3_v3(md_array.offset, legacy_md_array.offset);
copy_v3_v3(md_array.shift, legacy_md_array.shift);
copy_v3_v3(md_array.rnd_offset, legacy_md_array.rnd_offset);
copy_v3_v3(md_array.rnd_rot, legacy_md_array.rnd_rot);
copy_v3_v3(md_array.rnd_scale, legacy_md_array.rnd_scale);
md_array.seed = legacy_md_array.seed;
md_array.mat_rpl = legacy_md_array.mat_rpl;
legacy_object_modifier_influence(md_array.influence,
legacy_md_array.layername,
legacy_md_array.layer_pass,
legacy_md_array.flag & GP_ARRAY_INVERT_LAYER,
legacy_md_array.flag & GP_ARRAY_INVERT_LAYERPASS,
&legacy_md_array.material,
legacy_md_array.pass_index,
legacy_md_array.flag & GP_ARRAY_INVERT_MATERIAL,
legacy_md_array.flag & GP_ARRAY_INVERT_PASS,
"",
false,
nullptr,
false);
}
static void legacy_object_modifier_color(Object &object, GpencilModifierData &legacy_md)
{
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilColor, legacy_md);
auto &md_color = reinterpret_cast<GreasePencilColorModifierData &>(md);
auto &legacy_md_color = reinterpret_cast<ColorGpencilModifierData &>(legacy_md);
switch (eModifyColorGpencil_Flag(legacy_md_color.modify_color)) {
case GP_MODIFY_COLOR_BOTH:
md_color.color_mode = MOD_GREASE_PENCIL_COLOR_BOTH;
break;
case GP_MODIFY_COLOR_STROKE:
md_color.color_mode = MOD_GREASE_PENCIL_COLOR_STROKE;
break;
case GP_MODIFY_COLOR_FILL:
md_color.color_mode = MOD_GREASE_PENCIL_COLOR_FILL;
break;
case GP_MODIFY_COLOR_HARDNESS:
md_color.color_mode = MOD_GREASE_PENCIL_COLOR_HARDNESS;
break;
}
copy_v3_v3(md_color.hsv, legacy_md_color.hsv);
legacy_object_modifier_influence(md_color.influence,
legacy_md_color.layername,
legacy_md_color.layer_pass,
legacy_md_color.flag & GP_COLOR_INVERT_LAYER,
legacy_md_color.flag & GP_COLOR_INVERT_LAYERPASS,
&legacy_md_color.material,
legacy_md_color.pass_index,
legacy_md_color.flag & GP_COLOR_INVERT_MATERIAL,
legacy_md_color.flag & GP_COLOR_INVERT_PASS,
"",
false,
&legacy_md_color.curve_intensity,
legacy_md_color.flag & GP_COLOR_CUSTOM_CURVE);
}
static void legacy_object_modifier_dash(Object &object, GpencilModifierData &legacy_md)
{
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilDash, legacy_md);
auto &md_dash = reinterpret_cast<GreasePencilDashModifierData &>(md);
auto &legacy_md_dash = reinterpret_cast<DashGpencilModifierData &>(legacy_md);
md_dash.dash_offset = legacy_md_dash.dash_offset;
md_dash.segment_active_index = legacy_md_dash.segment_active_index;
md_dash.segments_num = legacy_md_dash.segments_len;
md_dash.segments_array = MEM_cnew_array<GreasePencilDashModifierSegment>(
legacy_md_dash.segments_len, __func__);
for (const int i : IndexRange(md_dash.segments_num)) {
GreasePencilDashModifierSegment &dst_segment = md_dash.segments_array[i];
const DashGpencilModifierSegment &src_segment = legacy_md_dash.segments[i];
STRNCPY(dst_segment.name, src_segment.name);
dst_segment.flag = 0;
if (src_segment.flag & GP_DASH_USE_CYCLIC) {
dst_segment.flag |= MOD_GREASE_PENCIL_DASH_USE_CYCLIC;
}
dst_segment.dash = src_segment.dash;
dst_segment.gap = src_segment.gap;
dst_segment.opacity = src_segment.opacity;
dst_segment.radius = src_segment.radius;
dst_segment.mat_nr = src_segment.mat_nr;
}
legacy_object_modifier_influence(md_dash.influence,
legacy_md_dash.layername,
legacy_md_dash.layer_pass,
legacy_md_dash.flag & GP_DASH_INVERT_LAYER,
legacy_md_dash.flag & GP_DASH_INVERT_LAYERPASS,
&legacy_md_dash.material,
legacy_md_dash.pass_index,
legacy_md_dash.flag & GP_DASH_INVERT_MATERIAL,
legacy_md_dash.flag & GP_DASH_INVERT_PASS,
"",
false,
nullptr,
false);
}
static void legacy_object_modifier_hook(Object &object, GpencilModifierData &legacy_md)
{
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilHook, legacy_md);
auto &md_hook = reinterpret_cast<GreasePencilHookModifierData &>(md);
auto &legacy_md_hook = reinterpret_cast<HookGpencilModifierData &>(legacy_md);
md_hook.flag = 0;
if (legacy_md_hook.flag & GP_HOOK_UNIFORM_SPACE) {
md_hook.flag |= MOD_GREASE_PENCIL_HOOK_UNIFORM_SPACE;
}
switch (eHookGpencil_Falloff(legacy_md_hook.falloff_type)) {
case eGPHook_Falloff_None:
md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_None;
break;
case eGPHook_Falloff_Curve:
md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Curve;
break;
case eGPHook_Falloff_Sharp:
md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Sharp;
break;
case eGPHook_Falloff_Smooth:
md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Smooth;
break;
case eGPHook_Falloff_Root:
md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Root;
break;
case eGPHook_Falloff_Linear:
md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Linear;
break;
case eGPHook_Falloff_Const:
md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Const;
break;
case eGPHook_Falloff_Sphere:
md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_Sphere;
break;
case eGPHook_Falloff_InvSquare:
md_hook.falloff_type = MOD_GREASE_PENCIL_HOOK_Falloff_InvSquare;
break;
}
md_hook.object = legacy_md_hook.object;
legacy_md_hook.object = nullptr;
STRNCPY(md_hook.subtarget, legacy_md_hook.subtarget);
copy_m4_m4(md_hook.parentinv, legacy_md_hook.parentinv);
copy_v3_v3(md_hook.cent, legacy_md_hook.cent);
md_hook.falloff = legacy_md_hook.falloff;
md_hook.force = legacy_md_hook.force;
legacy_object_modifier_influence(md_hook.influence,
legacy_md_hook.layername,
legacy_md_hook.layer_pass,
legacy_md_hook.flag & GP_HOOK_INVERT_LAYER,
legacy_md_hook.flag & GP_HOOK_INVERT_LAYERPASS,
&legacy_md_hook.material,
legacy_md_hook.pass_index,
legacy_md_hook.flag & GP_HOOK_INVERT_MATERIAL,
legacy_md_hook.flag & GP_HOOK_INVERT_PASS,
legacy_md_hook.vgname,
legacy_md_hook.flag & GP_HOOK_INVERT_VGROUP,
&legacy_md_hook.curfalloff,
true);
}
static void legacy_object_modifier_lattice(Object &object, GpencilModifierData &legacy_md)
{
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilLattice, legacy_md);
auto &md_lattice = reinterpret_cast<GreasePencilLatticeModifierData &>(md);
auto &legacy_md_lattice = reinterpret_cast<LatticeGpencilModifierData &>(legacy_md);
md_lattice.object = legacy_md_lattice.object;
legacy_md_lattice.object = nullptr;
md_lattice.strength = legacy_md_lattice.strength;
legacy_object_modifier_influence(md_lattice.influence,
legacy_md_lattice.layername,
legacy_md_lattice.layer_pass,
legacy_md_lattice.flag & GP_LATTICE_INVERT_LAYER,
legacy_md_lattice.flag & GP_LATTICE_INVERT_LAYERPASS,
&legacy_md_lattice.material,
legacy_md_lattice.pass_index,
legacy_md_lattice.flag & GP_LATTICE_INVERT_MATERIAL,
legacy_md_lattice.flag & GP_LATTICE_INVERT_PASS,
legacy_md_lattice.vgname,
legacy_md_lattice.flag & GP_LATTICE_INVERT_VGROUP,
nullptr,
false);
}
static void legacy_object_modifier_length(Object &object, GpencilModifierData &legacy_md)
{
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilLength, legacy_md);
auto &md_length = reinterpret_cast<GreasePencilLengthModifierData &>(md);
auto &legacy_md_length = reinterpret_cast<LengthGpencilModifierData &>(legacy_md);
md_length.flag = legacy_md_length.flag;
md_length.start_fac = legacy_md_length.start_fac;
md_length.end_fac = legacy_md_length.end_fac;
md_length.rand_start_fac = legacy_md_length.rand_start_fac;
md_length.rand_end_fac = legacy_md_length.rand_end_fac;
md_length.rand_offset = legacy_md_length.rand_offset;
md_length.overshoot_fac = legacy_md_length.overshoot_fac;
md_length.seed = legacy_md_length.seed;
md_length.step = legacy_md_length.step;
md_length.mode = legacy_md_length.mode;
md_length.point_density = legacy_md_length.point_density;
md_length.segment_influence = legacy_md_length.segment_influence;
md_length.max_angle = legacy_md_length.max_angle;
legacy_object_modifier_influence(md_length.influence,
legacy_md_length.layername,
legacy_md_length.layer_pass,
legacy_md_length.flag & GP_LENGTH_INVERT_LAYER,
legacy_md_length.flag & GP_LENGTH_INVERT_LAYERPASS,
&legacy_md_length.material,
legacy_md_length.pass_index,
legacy_md_length.flag & GP_LENGTH_INVERT_MATERIAL,
legacy_md_length.flag & GP_LENGTH_INVERT_PASS,
"",
false,
nullptr,
false);
}
static void legacy_object_modifier_mirror(Object &object, GpencilModifierData &legacy_md)
{
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilMirror, legacy_md);
auto &md_mirror = reinterpret_cast<GreasePencilMirrorModifierData &>(md);
auto &legacy_md_mirror = reinterpret_cast<MirrorGpencilModifierData &>(legacy_md);
md_mirror.object = legacy_md_mirror.object;
legacy_md_mirror.object = nullptr;
md_mirror.flag = 0;
if (legacy_md_mirror.flag & GP_MIRROR_AXIS_X) {
md_mirror.flag |= MOD_GREASE_PENCIL_MIRROR_AXIS_X;
}
if (legacy_md_mirror.flag & GP_MIRROR_AXIS_Y) {
md_mirror.flag |= MOD_GREASE_PENCIL_MIRROR_AXIS_Y;
}
if (legacy_md_mirror.flag & GP_MIRROR_AXIS_Z) {
md_mirror.flag |= MOD_GREASE_PENCIL_MIRROR_AXIS_Z;
}
legacy_object_modifier_influence(md_mirror.influence,
legacy_md_mirror.layername,
legacy_md_mirror.layer_pass,
legacy_md_mirror.flag & GP_MIRROR_INVERT_LAYER,
legacy_md_mirror.flag & GP_MIRROR_INVERT_LAYERPASS,
&legacy_md_mirror.material,
legacy_md_mirror.pass_index,
legacy_md_mirror.flag & GP_MIRROR_INVERT_MATERIAL,
legacy_md_mirror.flag & GP_MIRROR_INVERT_PASS,
"",
false,
nullptr,
false);
}
static void legacy_object_modifier_multiply(Object &object, GpencilModifierData &legacy_md)
{
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilMultiply, legacy_md);
auto &md_multiply = reinterpret_cast<GreasePencilMultiModifierData &>(md);
auto &legacy_md_multiply = reinterpret_cast<MultiplyGpencilModifierData &>(legacy_md);
md_multiply.flag = 0;
if (legacy_md_multiply.flags & GP_MULTIPLY_ENABLE_FADING) {
md_multiply.flag |= MOD_GREASE_PENCIL_MULTIPLY_ENABLE_FADING;
}
md_multiply.duplications = legacy_md_multiply.duplications;
md_multiply.distance = legacy_md_multiply.distance;
md_multiply.offset = legacy_md_multiply.offset;
md_multiply.fading_center = legacy_md_multiply.fading_center;
md_multiply.fading_thickness = legacy_md_multiply.fading_thickness;
md_multiply.fading_opacity = legacy_md_multiply.fading_opacity;
/* Note: This looks wrong, but GPv2 version uses Mirror modifier flags in its `flag` property
* and own flags in its `flags` property. */
legacy_object_modifier_influence(md_multiply.influence,
legacy_md_multiply.layername,
legacy_md_multiply.layer_pass,
legacy_md_multiply.flag & GP_MIRROR_INVERT_LAYER,
legacy_md_multiply.flag & GP_MIRROR_INVERT_LAYERPASS,
&legacy_md_multiply.material,
legacy_md_multiply.pass_index,
legacy_md_multiply.flag & GP_MIRROR_INVERT_MATERIAL,
legacy_md_multiply.flag & GP_MIRROR_INVERT_PASS,
"",
false,
nullptr,
false);
}
static void legacy_object_modifier_noise(Object &object, GpencilModifierData &legacy_md)
{
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilNoise, legacy_md);
auto &gp_md_noise = reinterpret_cast<GreasePencilNoiseModifierData &>(md);
auto &md_noise = reinterpret_cast<GreasePencilNoiseModifierData &>(md);
auto &legacy_md_noise = reinterpret_cast<NoiseGpencilModifierData &>(legacy_md);
gp_md_noise.flag = legacy_md_noise.flag;
gp_md_noise.factor = legacy_md_noise.factor;
gp_md_noise.factor_strength = legacy_md_noise.factor_strength;
gp_md_noise.factor_thickness = legacy_md_noise.factor_thickness;
gp_md_noise.factor_uvs = legacy_md_noise.factor_uvs;
gp_md_noise.noise_scale = legacy_md_noise.noise_scale;
gp_md_noise.noise_offset = legacy_md_noise.noise_offset;
gp_md_noise.noise_mode = legacy_md_noise.noise_mode;
gp_md_noise.step = legacy_md_noise.step;
gp_md_noise.seed = legacy_md_noise.seed;
md_noise.flag = legacy_md_noise.flag;
md_noise.factor = legacy_md_noise.factor;
md_noise.factor_strength = legacy_md_noise.factor_strength;
md_noise.factor_thickness = legacy_md_noise.factor_thickness;
md_noise.factor_uvs = legacy_md_noise.factor_uvs;
md_noise.noise_scale = legacy_md_noise.noise_scale;
md_noise.noise_offset = legacy_md_noise.noise_offset;
md_noise.noise_mode = legacy_md_noise.noise_mode;
md_noise.step = legacy_md_noise.step;
md_noise.seed = legacy_md_noise.seed;
legacy_object_modifier_influence(gp_md_noise.influence,
legacy_object_modifier_influence(md_noise.influence,
legacy_md_noise.layername,
legacy_md_noise.layer_pass,
legacy_md_noise.flag & GP_NOISE_INVERT_LAYER,
@ -825,28 +1149,205 @@ static void legacy_object_modifier_noise(Object &object, GpencilModifierData &le
legacy_md_noise.flag & GP_NOISE_CUSTOM_CURVE);
}
static GreasePencilModifierColorMode convert_color_mode(eGp_Vertex_Mode legacy_mode)
static void legacy_object_modifier_offset(Object &object, GpencilModifierData &legacy_md)
{
switch (legacy_mode) {
case GPPAINT_MODE_BOTH:
return MOD_GREASE_PENCIL_COLOR_BOTH;
case GPPAINT_MODE_STROKE:
return MOD_GREASE_PENCIL_COLOR_STROKE;
case GPPAINT_MODE_FILL:
return MOD_GREASE_PENCIL_COLOR_FILL;
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilOffset, legacy_md);
auto &md_offset = reinterpret_cast<GreasePencilOffsetModifierData &>(md);
auto &legacy_md_offset = reinterpret_cast<OffsetGpencilModifierData &>(legacy_md);
md_offset.flag = 0;
if (legacy_md_offset.flag & GP_OFFSET_UNIFORM_RANDOM_SCALE) {
md_offset.flag |= MOD_GREASE_PENCIL_OFFSET_UNIFORM_RANDOM_SCALE;
}
return MOD_GREASE_PENCIL_COLOR_BOTH;
switch (eOffsetGpencil_Mode(legacy_md_offset.mode)) {
case GP_OFFSET_RANDOM:
md_offset.offset_mode = MOD_GREASE_PENCIL_OFFSET_RANDOM;
break;
case GP_OFFSET_LAYER:
md_offset.offset_mode = MOD_GREASE_PENCIL_OFFSET_LAYER;
break;
case GP_OFFSET_MATERIAL:
md_offset.offset_mode = MOD_GREASE_PENCIL_OFFSET_MATERIAL;
break;
case GP_OFFSET_STROKE:
md_offset.offset_mode = MOD_GREASE_PENCIL_OFFSET_STROKE;
break;
}
copy_v3_v3(md_offset.loc, legacy_md_offset.loc);
copy_v3_v3(md_offset.rot, legacy_md_offset.rot);
copy_v3_v3(md_offset.scale, legacy_md_offset.scale);
copy_v3_v3(md_offset.stroke_loc, legacy_md_offset.rnd_offset);
copy_v3_v3(md_offset.stroke_rot, legacy_md_offset.rnd_rot);
copy_v3_v3(md_offset.stroke_scale, legacy_md_offset.rnd_scale);
md_offset.seed = legacy_md_offset.seed;
md_offset.stroke_step = legacy_md_offset.stroke_step;
md_offset.stroke_start_offset = legacy_md_offset.stroke_start_offset;
legacy_object_modifier_influence(md_offset.influence,
legacy_md_offset.layername,
legacy_md_offset.layer_pass,
legacy_md_offset.flag & GP_OFFSET_INVERT_LAYER,
legacy_md_offset.flag & GP_OFFSET_INVERT_LAYERPASS,
&legacy_md_offset.material,
legacy_md_offset.pass_index,
legacy_md_offset.flag & GP_OFFSET_INVERT_MATERIAL,
legacy_md_offset.flag & GP_OFFSET_INVERT_PASS,
legacy_md_offset.vgname,
legacy_md_offset.flag & GP_OFFSET_INVERT_VGROUP,
nullptr,
false);
}
static GreasePencilTintModifierMode convert_tint_mode(eTintGpencil_Type legacy_mode)
static void legacy_object_modifier_opacity(Object &object, GpencilModifierData &legacy_md)
{
switch (legacy_mode) {
case GP_TINT_UNIFORM:
return MOD_GREASE_PENCIL_TINT_UNIFORM;
case GP_TINT_GRADIENT:
return MOD_GREASE_PENCIL_TINT_GRADIENT;
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilOpacity, legacy_md);
auto &md_opacity = reinterpret_cast<GreasePencilOpacityModifierData &>(md);
auto &legacy_md_opacity = reinterpret_cast<OpacityGpencilModifierData &>(legacy_md);
md_opacity.flag = 0;
if (legacy_md_opacity.flag & GP_OPACITY_NORMALIZE) {
md_opacity.flag |= MOD_GREASE_PENCIL_OPACITY_USE_UNIFORM_OPACITY;
}
return MOD_GREASE_PENCIL_TINT_UNIFORM;
if (legacy_md_opacity.flag & GP_OPACITY_WEIGHT_FACTOR) {
md_opacity.flag |= MOD_GREASE_PENCIL_OPACITY_USE_WEIGHT_AS_FACTOR;
}
switch (eModifyColorGpencil_Flag(legacy_md_opacity.modify_color)) {
case GP_MODIFY_COLOR_BOTH:
md_opacity.color_mode = MOD_GREASE_PENCIL_COLOR_BOTH;
break;
case GP_MODIFY_COLOR_STROKE:
md_opacity.color_mode = MOD_GREASE_PENCIL_COLOR_STROKE;
break;
case GP_MODIFY_COLOR_FILL:
md_opacity.color_mode = MOD_GREASE_PENCIL_COLOR_FILL;
break;
case GP_MODIFY_COLOR_HARDNESS:
md_opacity.color_mode = MOD_GREASE_PENCIL_COLOR_HARDNESS;
break;
}
md_opacity.color_factor = legacy_md_opacity.factor;
md_opacity.hardness_factor = legacy_md_opacity.hardness;
legacy_object_modifier_influence(md_opacity.influence,
legacy_md_opacity.layername,
legacy_md_opacity.layer_pass,
legacy_md_opacity.flag & GP_OPACITY_INVERT_LAYER,
legacy_md_opacity.flag & GP_OPACITY_INVERT_LAYERPASS,
&legacy_md_opacity.material,
legacy_md_opacity.pass_index,
legacy_md_opacity.flag & GP_OPACITY_INVERT_MATERIAL,
legacy_md_opacity.flag & GP_OPACITY_INVERT_PASS,
legacy_md_opacity.vgname,
legacy_md_opacity.flag & GP_OPACITY_INVERT_VGROUP,
&legacy_md_opacity.curve_intensity,
legacy_md_opacity.flag & GP_OPACITY_CUSTOM_CURVE);
}
static void legacy_object_modifier_smooth(Object &object, GpencilModifierData &legacy_md)
{
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilSmooth, legacy_md);
auto &md_smooth = reinterpret_cast<GreasePencilSmoothModifierData &>(md);
auto &legacy_md_smooth = reinterpret_cast<SmoothGpencilModifierData &>(legacy_md);
md_smooth.flag = 0;
if (legacy_md_smooth.flag & GP_SMOOTH_MOD_LOCATION) {
md_smooth.flag |= MOD_GREASE_PENCIL_SMOOTH_MOD_LOCATION;
}
if (legacy_md_smooth.flag & GP_SMOOTH_MOD_STRENGTH) {
md_smooth.flag |= MOD_GREASE_PENCIL_SMOOTH_MOD_STRENGTH;
}
if (legacy_md_smooth.flag & GP_SMOOTH_MOD_THICKNESS) {
md_smooth.flag |= MOD_GREASE_PENCIL_SMOOTH_MOD_THICKNESS;
}
if (legacy_md_smooth.flag & GP_SMOOTH_MOD_UV) {
md_smooth.flag |= MOD_GREASE_PENCIL_SMOOTH_MOD_UV;
}
if (legacy_md_smooth.flag & GP_SMOOTH_KEEP_SHAPE) {
md_smooth.flag |= MOD_GREASE_PENCIL_SMOOTH_KEEP_SHAPE;
}
md_smooth.factor = legacy_md_smooth.factor;
md_smooth.step = legacy_md_smooth.step;
legacy_object_modifier_influence(md_smooth.influence,
legacy_md_smooth.layername,
legacy_md_smooth.layer_pass,
legacy_md_smooth.flag & GP_SMOOTH_INVERT_LAYER,
legacy_md_smooth.flag & GP_SMOOTH_INVERT_LAYERPASS,
&legacy_md_smooth.material,
legacy_md_smooth.pass_index,
legacy_md_smooth.flag & GP_SMOOTH_INVERT_MATERIAL,
legacy_md_smooth.flag & GP_SMOOTH_INVERT_PASS,
legacy_md_smooth.vgname,
legacy_md_smooth.flag & GP_SMOOTH_INVERT_VGROUP,
&legacy_md_smooth.curve_intensity,
legacy_md_smooth.flag & GP_SMOOTH_CUSTOM_CURVE);
}
static void legacy_object_modifier_subdiv(Object &object, GpencilModifierData &legacy_md)
{
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilSubdiv, legacy_md);
auto &md_subdiv = reinterpret_cast<GreasePencilSubdivModifierData &>(md);
auto &legacy_md_subdiv = reinterpret_cast<SubdivGpencilModifierData &>(legacy_md);
switch (eSubdivGpencil_Type(legacy_md_subdiv.type)) {
case GP_SUBDIV_CATMULL:
md_subdiv.type = MOD_GREASE_PENCIL_SUBDIV_CATMULL;
break;
case GP_SUBDIV_SIMPLE:
md_subdiv.type = MOD_GREASE_PENCIL_SUBDIV_SIMPLE;
break;
}
md_subdiv.level = legacy_md_subdiv.level;
legacy_object_modifier_influence(md_subdiv.influence,
legacy_md_subdiv.layername,
legacy_md_subdiv.layer_pass,
legacy_md_subdiv.flag & GP_SUBDIV_INVERT_LAYER,
legacy_md_subdiv.flag & GP_SUBDIV_INVERT_LAYERPASS,
&legacy_md_subdiv.material,
legacy_md_subdiv.pass_index,
legacy_md_subdiv.flag & GP_SUBDIV_INVERT_MATERIAL,
legacy_md_subdiv.flag & GP_SUBDIV_INVERT_PASS,
"",
false,
nullptr,
false);
}
static void legacy_object_modifier_thickness(Object &object, GpencilModifierData &legacy_md)
{
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilThickness, legacy_md);
auto &md_thickness = reinterpret_cast<GreasePencilThickModifierData &>(md);
auto &legacy_md_thickness = reinterpret_cast<ThickGpencilModifierData &>(legacy_md);
md_thickness.flag = 0;
if (legacy_md_thickness.flag & GP_THICK_NORMALIZE) {
md_thickness.flag |= MOD_GREASE_PENCIL_THICK_NORMALIZE;
}
if (legacy_md_thickness.flag & GP_THICK_WEIGHT_FACTOR) {
md_thickness.flag |= MOD_GREASE_PENCIL_THICK_WEIGHT_FACTOR;
}
md_thickness.thickness_fac = legacy_md_thickness.thickness_fac;
md_thickness.thickness = legacy_md_thickness.thickness;
legacy_object_modifier_influence(md_thickness.influence,
legacy_md_thickness.layername,
legacy_md_thickness.layer_pass,
legacy_md_thickness.flag & GP_THICK_INVERT_LAYER,
legacy_md_thickness.flag & GP_THICK_INVERT_LAYERPASS,
&legacy_md_thickness.material,
legacy_md_thickness.pass_index,
legacy_md_thickness.flag & GP_THICK_INVERT_MATERIAL,
legacy_md_thickness.flag & GP_THICK_INVERT_PASS,
legacy_md_thickness.vgname,
legacy_md_thickness.flag & GP_THICK_INVERT_VGROUP,
&legacy_md_thickness.curve_thickness,
legacy_md_thickness.flag & GP_THICK_CUSTOM_CURVE);
}
static void legacy_object_modifier_tint(Object &object, GpencilModifierData &legacy_md)
@ -860,8 +1361,25 @@ static void legacy_object_modifier_tint(Object &object, GpencilModifierData &leg
if (legacy_md_tint.flag & GP_TINT_WEIGHT_FACTOR) {
md_tint.flag |= MOD_GREASE_PENCIL_TINT_USE_WEIGHT_AS_FACTOR;
}
md_tint.color_mode = convert_color_mode(eGp_Vertex_Mode(legacy_md_tint.mode));
md_tint.tint_mode = convert_tint_mode(eTintGpencil_Type(legacy_md_tint.type));
switch (eGp_Vertex_Mode(legacy_md_tint.mode)) {
case GPPAINT_MODE_BOTH:
md_tint.color_mode = MOD_GREASE_PENCIL_COLOR_BOTH;
break;
case GPPAINT_MODE_STROKE:
md_tint.color_mode = MOD_GREASE_PENCIL_COLOR_STROKE;
break;
case GPPAINT_MODE_FILL:
md_tint.color_mode = MOD_GREASE_PENCIL_COLOR_FILL;
break;
}
switch (eTintGpencil_Type(legacy_md_tint.type)) {
case GP_TINT_UNIFORM:
md_tint.tint_mode = MOD_GREASE_PENCIL_TINT_UNIFORM;
break;
case GP_TINT_GRADIENT:
md_tint.tint_mode = MOD_GREASE_PENCIL_TINT_GRADIENT;
break;
}
md_tint.factor = legacy_md_tint.factor;
md_tint.radius = legacy_md_tint.radius;
copy_v3_v3(md_tint.color, legacy_md_tint.rgb);
@ -886,6 +1404,84 @@ static void legacy_object_modifier_tint(Object &object, GpencilModifierData &leg
legacy_md_tint.flag & GP_TINT_CUSTOM_CURVE);
}
static void legacy_object_modifier_weight_angle(Object &object, GpencilModifierData &legacy_md)
{
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilWeightAngle, legacy_md);
auto &md_weight_angle = reinterpret_cast<GreasePencilWeightAngleModifierData &>(md);
auto &legacy_md_weight_angle = reinterpret_cast<WeightAngleGpencilModifierData &>(legacy_md);
md_weight_angle.flag = 0;
if (legacy_md_weight_angle.flag & GP_WEIGHT_MULTIPLY_DATA) {
md_weight_angle.flag |= MOD_GREASE_PENCIL_WEIGHT_ANGLE_MULTIPLY_DATA;
}
if (legacy_md_weight_angle.flag & GP_WEIGHT_INVERT_OUTPUT) {
md_weight_angle.flag |= MOD_GREASE_PENCIL_WEIGHT_ANGLE_INVERT_OUTPUT;
}
switch (eGpencilModifierSpace(legacy_md_weight_angle.space)) {
case GP_SPACE_LOCAL:
md_weight_angle.space = MOD_GREASE_PENCIL_WEIGHT_ANGLE_SPACE_LOCAL;
break;
case GP_SPACE_WORLD:
md_weight_angle.space = MOD_GREASE_PENCIL_WEIGHT_ANGLE_SPACE_WORLD;
break;
}
md_weight_angle.axis = legacy_md_weight_angle.axis;
STRNCPY(md_weight_angle.target_vgname, legacy_md_weight_angle.target_vgname);
md_weight_angle.min_weight = legacy_md_weight_angle.min_weight;
md_weight_angle.angle = legacy_md_weight_angle.angle;
legacy_object_modifier_influence(md_weight_angle.influence,
legacy_md_weight_angle.layername,
legacy_md_weight_angle.layer_pass,
legacy_md_weight_angle.flag & GP_WEIGHT_INVERT_LAYER,
legacy_md_weight_angle.flag & GP_WEIGHT_INVERT_LAYERPASS,
&legacy_md_weight_angle.material,
legacy_md_weight_angle.pass_index,
legacy_md_weight_angle.flag & GP_WEIGHT_INVERT_MATERIAL,
legacy_md_weight_angle.flag & GP_WEIGHT_INVERT_PASS,
legacy_md_weight_angle.vgname,
legacy_md_weight_angle.flag & GP_WEIGHT_INVERT_VGROUP,
nullptr,
false);
}
static void legacy_object_modifier_weight_proximity(Object &object, GpencilModifierData &legacy_md)
{
ModifierData &md = legacy_object_modifier_common(
object, eModifierType_GreasePencilWeightProximity, legacy_md);
auto &md_weight_prox = reinterpret_cast<GreasePencilWeightProximityModifierData &>(md);
auto &legacy_md_weight_prox = reinterpret_cast<WeightProxGpencilModifierData &>(legacy_md);
md_weight_prox.flag = 0;
if (legacy_md_weight_prox.flag & GP_WEIGHT_MULTIPLY_DATA) {
md_weight_prox.flag |= MOD_GREASE_PENCIL_WEIGHT_PROXIMITY_MULTIPLY_DATA;
}
if (legacy_md_weight_prox.flag & GP_WEIGHT_INVERT_OUTPUT) {
md_weight_prox.flag |= MOD_GREASE_PENCIL_WEIGHT_PROXIMITY_INVERT_OUTPUT;
}
STRNCPY(md_weight_prox.target_vgname, legacy_md_weight_prox.target_vgname);
md_weight_prox.min_weight = legacy_md_weight_prox.min_weight;
md_weight_prox.dist_start = legacy_md_weight_prox.dist_start;
md_weight_prox.dist_end = legacy_md_weight_prox.dist_end;
md_weight_prox.object = legacy_md_weight_prox.object;
legacy_md_weight_prox.object = nullptr;
legacy_object_modifier_influence(md_weight_prox.influence,
legacy_md_weight_prox.layername,
legacy_md_weight_prox.layer_pass,
legacy_md_weight_prox.flag & GP_WEIGHT_INVERT_LAYER,
legacy_md_weight_prox.flag & GP_WEIGHT_INVERT_LAYERPASS,
&legacy_md_weight_prox.material,
legacy_md_weight_prox.pass_index,
legacy_md_weight_prox.flag & GP_WEIGHT_INVERT_MATERIAL,
legacy_md_weight_prox.flag & GP_WEIGHT_INVERT_PASS,
legacy_md_weight_prox.vgname,
legacy_md_weight_prox.flag & GP_WEIGHT_INVERT_VGROUP,
nullptr,
false);
}
static void legacy_object_modifiers(Main & /*bmain*/, Object &object)
{
BLI_assert(BLI_listbase_is_empty(&object.modifiers));
@ -897,34 +1493,64 @@ static void legacy_object_modifiers(Main & /*bmain*/, Object &object)
case eGpencilModifierType_None:
/* Unknown type, just ignore. */
break;
case eGpencilModifierType_Noise: {
case eGpencilModifierType_Array:
legacy_object_modifier_array(object, *gpd_md);
break;
case eGpencilModifierType_Color:
legacy_object_modifier_color(object, *gpd_md);
break;
case eGpencilModifierType_Dash:
legacy_object_modifier_dash(object, *gpd_md);
break;
case eGpencilModifierType_Hook:
legacy_object_modifier_hook(object, *gpd_md);
break;
case eGpencilModifierType_Lattice:
legacy_object_modifier_lattice(object, *gpd_md);
break;
case eGpencilModifierType_Length:
legacy_object_modifier_length(object, *gpd_md);
break;
case eGpencilModifierType_Mirror:
legacy_object_modifier_mirror(object, *gpd_md);
break;
case eGpencilModifierType_Multiply:
legacy_object_modifier_multiply(object, *gpd_md);
break;
case eGpencilModifierType_Noise:
legacy_object_modifier_noise(object, *gpd_md);
break;
}
case eGpencilModifierType_Offset:
legacy_object_modifier_offset(object, *gpd_md);
break;
case eGpencilModifierType_Opacity:
legacy_object_modifier_opacity(object, *gpd_md);
break;
case eGpencilModifierType_Smooth:
legacy_object_modifier_smooth(object, *gpd_md);
break;
case eGpencilModifierType_Subdiv:
legacy_object_modifier_subdiv(object, *gpd_md);
break;
case eGpencilModifierType_Thick:
legacy_object_modifier_thickness(object, *gpd_md);
break;
case eGpencilModifierType_Tint:
legacy_object_modifier_tint(object, *gpd_md);
break;
case eGpencilModifierType_Array:
case eGpencilModifierType_WeightAngle:
legacy_object_modifier_weight_angle(object, *gpd_md);
break;
case eGpencilModifierType_WeightProximity:
legacy_object_modifier_weight_proximity(object, *gpd_md);
break;
case eGpencilModifierType_Build:
case eGpencilModifierType_Opacity:
case eGpencilModifierType_Color:
case eGpencilModifierType_Lattice:
case eGpencilModifierType_Simplify:
case eGpencilModifierType_Smooth:
case eGpencilModifierType_Hook:
case eGpencilModifierType_Offset:
case eGpencilModifierType_Mirror:
case eGpencilModifierType_Armature:
case eGpencilModifierType_Time:
case eGpencilModifierType_Multiply:
case eGpencilModifierType_Texture:
case eGpencilModifierType_Lineart:
case eGpencilModifierType_Length:
case eGpencilModifierType_WeightProximity:
case eGpencilModifierType_Dash:
case eGpencilModifierType_WeightAngle:
case eGpencilModifierType_Shrinkwrap:
case eGpencilModifierType_Envelope:
case eGpencilModifierType_Outline: