11#include <fmt/format.h>
148 const bool is_transfer_between_ids;
188 bool has_changes =
false;
195 : conversion_data(conversion_data),
200 is_transfer_between_ids(
false),
202 fcurve_convertors(fcurve_convertors)
210 : conversion_data(conversion_data),
215 is_transfer_between_ids(
true),
217 fcurve_convertors(fcurve_convertors)
223 using FCurveCallback = bool(
bAction *owner_action,
FCurve &fcurve);
224 using ActionCallback = bool(
bAction &action);
228 bool is_valid()
const
230 return this->animdata_src !=
nullptr;
234 bool legacy_fcurves_is_valid_for_root_path(
FCurve &fcurve,
StringRefNull legacy_root_path)
const
250 bool animation_fcurve_is_valid(
bAction *owner_action,
FCurve &fcurve)
const
252 if (!this->is_valid()) {
258 !
ELEM(owner_action, this->animdata_src->
action, this->animdata_src->tmpact))
262 if (!legacy_fcurves_is_valid_for_root_path(fcurve, this->
root_path_src)) {
270 bool fcurve_foreach_in_action(
bAction *owner_action,
271 blender::FunctionRef<FCurveCallback> callback)
const
273 bool is_changed =
false;
275 const bool local_is_changed = callback(owner_action, fcurve);
276 is_changed = is_changed || local_is_changed;
282 bool fcurve_foreach_in_listbase(
ListBase &fcurves,
283 blender::FunctionRef<FCurveCallback> callback)
const
285 bool is_changed =
false;
287 const bool local_is_changed = callback(
nullptr, *fcurve);
288 is_changed = is_changed || local_is_changed;
293 bool nla_strip_fcurve_foreach(
NlaStrip &nla_strip,
294 blender::FunctionRef<FCurveCallback> callback)
const
296 bool is_changed =
false;
298 if (this->fcurve_foreach_in_action(nla_strip.
act, callback)) {
304 const bool local_is_changed = this->nla_strip_fcurve_foreach(*nla_strip_children, callback);
305 is_changed = is_changed || local_is_changed;
310 bool animdata_fcurve_foreach(
AnimData &anim_data,
311 blender::FunctionRef<FCurveCallback> callback)
const
313 bool is_changed =
false;
315 if (this->fcurve_foreach_in_action(anim_data.
action, callback)) {
321 if (this->fcurve_foreach_in_action(anim_data.
tmpact, callback)) {
328 const bool local_is_changed = this->fcurve_foreach_in_listbase(anim_data.
drivers, callback);
329 is_changed = is_changed || local_is_changed;
335 if (this->skip_nla) {
341 const bool local_is_changed = this->nla_strip_fcurve_foreach(*nla_strip, callback);
342 is_changed = is_changed || local_is_changed;
348 bool action_process(
bAction &action, blender::FunctionRef<ActionCallback> callback)
const
350 if (callback(action)) {
357 bool nla_strip_action_foreach(
NlaStrip &nla_strip,
358 blender::FunctionRef<ActionCallback> callback)
const
360 bool is_changed =
false;
362 is_changed = action_process(*nla_strip.
act, callback);
365 is_changed = is_changed || this->nla_strip_action_foreach(*nla_strip_children, callback);
370 bool animdata_action_foreach(
AnimData &anim_data,
371 blender::FunctionRef<ActionCallback> callback)
const
373 bool is_changed =
false;
376 is_changed = is_changed || action_process(*anim_data.
action, callback);
379 is_changed = is_changed || action_process(*anim_data.
tmpact, callback);
385 if (this->skip_nla) {
391 is_changed = is_changed || this->nla_strip_action_foreach(*nla_strip, callback);
404 if (!this->is_valid()) {
408 if (
GS(id_src.name) !=
GS(id_dst.name)) {
412 bool has_animation =
false;
413 auto animation_detection_cb = [&](
bAction *owner_action,
FCurve &fcurve) ->
bool {
418 if (!this->animation_fcurve_is_valid(owner_action, fcurve)) {
421 if (this->fcurve_convertors.
is_empty()) {
422 has_animation =
true;
427 const std::string rna_path_src = fmt::format(
428 "{}{}", this->root_path_src, fcurve_convertor.relative_rna_path_src);
429 if (rna_path == rna_path_src) {
430 has_animation =
true;
437 this->animdata_fcurve_foreach(*this->animdata_src, animation_detection_cb);
438 return has_animation;
449 if (!this->is_valid()) {
456 const std::string &rna_path_dst) {
458 fcurve.rna_path =
BLI_strdupn(rna_path_dst.c_str(), rna_path_dst.size());
459 if (fcurve_convertor && fcurve_convertor->
convert_cb) {
462 this->has_changes =
true;
464 if (!this->is_transfer_between_ids) {
468 if (owner_action == this->animdata_src->
action) {
469 this->fcurves_from_src_main_action.
append(&fcurve);
471 else if (owner_action == this->animdata_src->
tmpact) {
472 this->fcurves_from_src_tmp_action.
append(&fcurve);
476 this->fcurves_from_src_drivers.
append(&fcurve);
481 if (this->fcurve_convertors.
is_empty()) {
482 auto fcurve_root_path_convert_cb = [&](
bAction *owner_action,
FCurve &fcurve) ->
bool {
483 if (!legacy_fcurves_is_valid_for_root_path(fcurve, this->root_path_src)) {
487 const std::string rna_path_dst = fmt::format(
488 "{}{}", this->root_path_dst, rna_path.
substr(
int64_t(this->root_path_src.size())));
489 fcurve_convert_cb(
nullptr, owner_action, fcurve, rna_path_dst);
493 this->animdata_fcurve_foreach(*(this->animdata_src), fcurve_root_path_convert_cb);
499 auto fcurve_full_path_convert_cb = [&](
bAction *owner_action,
FCurve &fcurve) ->
bool {
500 if (!animation_fcurve_is_valid(owner_action, fcurve)) {
505 const std::string rna_path_src = fmt::format(
507 if (rna_path == rna_path_src) {
508 const std::string rna_path_dst = fmt::format(
510 fcurve_convert_cb(&fcurve_convertor, owner_action, fcurve, rna_path_dst);
517 this->animdata_fcurve_foreach(*(this->animdata_src), fcurve_full_path_convert_cb);
532 if (!this->is_valid()) {
539 if (!this->animdata_dst) {
542 auto actions_idroot_ensure = [&](
bAction &action) ->
bool {
546 this->animdata_action_foreach(*this->animdata_dst, actions_idroot_ensure);
549 if (&id_src == &id_dst) {
550 if (this->has_changes) {
557 if (this->fcurves_from_src_main_action.
is_empty() &&
558 this->fcurves_from_src_tmp_action.is_empty() && this->fcurves_from_src_drivers.is_empty())
562 if (!this->animdata_dst) {
566 auto fcurves_move = [&](
bAction *action_dst,
570 for (
FCurve *fcurve : fcurves) {
572 action_dst->wrap(), slot_handle_dst, action_src->wrap(), *fcurve);
576 auto fcurves_move_between_listbases =
578 for (
FCurve *fcurve : fcurves) {
585 if (!this->fcurves_from_src_main_action.
is_empty()) {
586 if (!this->animdata_dst->
action) {
589 this->conversion_data.
bmain,
590 this->animdata_src->action ? this->animdata_src->action->id.name + 2 :
nullptr);
594 BLI_assert_msg(ok,
"Expecting action assignment to work when converting Grease Pencil");
597 fcurves_move(this->animdata_dst->
action,
598 this->animdata_dst->slot_handle,
599 this->animdata_src->action,
600 this->fcurves_from_src_main_action);
601 this->fcurves_from_src_main_action.
clear();
603 if (!this->fcurves_from_src_tmp_action.
is_empty()) {
604 if (!this->animdata_dst->
tmpact) {
607 this->conversion_data.
bmain,
608 this->animdata_src->tmpact ? this->animdata_src->tmpact->id.name + 2 :
nullptr);
612 BLI_assert_msg(ok,
"Expecting tmpact assignment to work when converting Grease Pencil");
615 fcurves_move(this->animdata_dst->
tmpact,
616 this->animdata_dst->tmp_slot_handle,
617 this->animdata_src->tmpact,
618 this->fcurves_from_src_tmp_action);
619 this->fcurves_from_src_tmp_action.
clear();
621 if (!this->fcurves_from_src_drivers.
is_empty()) {
622 fcurves_move_between_listbases(this->animdata_dst->
drivers,
623 this->animdata_src->drivers,
624 this->fcurves_from_src_drivers);
625 this->fcurves_from_src_drivers.
clear();
644 const int num_vertex_groups,
648 Array<int> is_group_used(num_vertex_groups,
false);
656 if (weight.def_nr >= num_vertex_groups) {
660 is_group_used[weight.def_nr] =
true;
669 if (!is_group_used[old_group_i]) {
670 r_indices[old_group_i] = -1;
673 r_indices[old_group_i] = new_group_i++;
676 BLI_addtail(&r_vertex_group_names, def_group_copy);
684 const float uv_rotation,
696 const float2 diagonal = maxv - minv;
697 const float sin_rotation =
sin(uv_rotation);
698 const float cos_rotation =
cos(uv_rotation);
700 float2(-sin_rotation, cos_rotation));
705 texture_matrix[2] -= minv;
709 texture_matrix[2] += uv_translation;
712 texture_matrix[2] -= center;
713 texture_matrix = rotation * texture_matrix;
714 texture_matrix[2] += center;
719 return texture_matrix;
739 const bGPDspoint *point3 = &points[int(totpoints * 0.75f)];
749 const float3 local_3 = (totpoints == 2) ? (pt3 * 0.001f) - pt0 : pt3 - pt0;
781 strokemat4x3[2][2] = 0.0f;
782 strokemat4x3[3][2] = 1.0f;
784 return texture_matrix * strokemat4x3;
799 bool has_bezier_stroke =
false;
805 if (gps->editcurve->tot_curve_points == 0) {
808 has_bezier_stroke =
true;
809 num_points += gps->editcurve->tot_curve_points;
813 if (gps->totpoints == 0) {
816 num_points += gps->totpoints;
820 offsets.
append(num_points);
824 if (num_strokes == 0) {
830 curves.resize(num_points, num_strokes);
831 curves.offsets_for_write().copy_from(offsets);
836 if (!has_bezier_stroke) {
841 curves.curve_types_for_write().copy_from(curve_types);
842 curves.update_curve_types();
850 gpf, vertex_group_names, num_vertex_groups, stroke_vertex_group_names, stroke_def_nr_map);
852 curves.vertex_group_names = stroke_vertex_group_names;
857 dst_dvert = src_dvert;
861 if (weight.def_nr >= num_vertex_groups) {
866 weight.def_nr = stroke_def_nr_map[weight.def_nr];
873 curves.handle_positions_left_for_write() :
876 curves.handle_positions_right_for_write() :
916 if (gps->totpoints == 0 ||
917 (gps->editcurve !=
nullptr && gps->editcurve->tot_curve_points == 0))
924 const uint32_t clamped_init_time = uint32_t(
925 std::clamp(gps->inittime * 1e3, 0.0,
double(std::numeric_limits<uint32_t>::max())));
926 stroke_init_times.span[stroke_i] =
float(clamped_init_time) /
float(1e3);
927 stroke_start_caps.span[stroke_i] = int8_t(gps->caps[0]);
928 stroke_end_caps.span[stroke_i] = int8_t(gps->caps[1]);
929 stroke_softness.span[stroke_i] = 1.0f - gps->hardness;
930 stroke_point_aspect_ratios.span[stroke_i] = gps->aspect_ratio[0] /
931 max_ff(gps->aspect_ratio[1], 1
e-8);
933 stroke_materials.
span[stroke_i] = gps->mat_nr;
935 const IndexRange points = points_by_curve[stroke_i];
940 handle_positions_left.
slice(points) :
943 handle_positions_right.
slice(points) :
958 for (const int point_i : range) {
959 const bGPDspoint &pt = src_points[point_i];
960 dst_positions[point_i] = float3(pt.x, pt.y, pt.z);
961 dst_radii[point_i] = stroke_thickness * pt.pressure;
962 dst_opacities[point_i] = pt.strength;
963 dst_deltatimes[point_i] = pt.time;
964 dst_rotations[point_i] = pt.uv_rot;
965 dst_vertex_colors[point_i] = ColorGeometry4f(pt.vert_color);
966 dst_selection[point_i] = (pt.flag & GP_SPOINT_SELECT) != 0;
967 if (use_dverts && gps->dvert) {
968 copy_dvert(gps->dvert[point_i], dst_dverts[point_i]);
975 BLI_assert(points.size() == gps->editcurve->tot_curve_points);
977 gps->editcurve->tot_curve_points};
980 for (const int point_i : range) {
981 const bGPDcurve_point &cpt = src_curve_points[point_i];
982 dst_positions[point_i] = float3(cpt.bezt.vec[1]);
983 dst_handle_positions_left[point_i] = float3(cpt.bezt.vec[0]);
984 dst_handle_positions_right[point_i] = float3(cpt.bezt.vec[2]);
985 dst_radii[point_i] = stroke_thickness * cpt.pressure;
986 dst_opacities[point_i] = cpt.strength;
987 dst_rotations[point_i] = cpt.uv_rot;
988 dst_vertex_colors[point_i] = ColorGeometry4f(cpt.vert_color);
989 dst_selection[point_i] = (cpt.flag & GP_CURVE_POINT_SELECT) != 0;
990 if (use_dverts && gps->dvert) {
991 copy_dvert(gps->dvert[point_i], dst_dverts[point_i]);
1002 legacy_texture_matrices[stroke_i] = legacy_texture_matrix;
1008 curves.tag_normals_changed();
1009 drawing.set_texture_matrices(legacy_texture_matrices.as_span(), curves.curves_range());
1011 delta_times.finish();
1015 stroke_cyclic.finish();
1016 stroke_init_times.finish();
1017 stroke_start_caps.finish();
1018 stroke_end_caps.finish();
1019 stroke_softness.finish();
1020 stroke_point_aspect_ratios.finish();
1021 stroke_materials.finish();
1073 new_layer.
blend_mode = int8_t(gpl->blend_mode);
1093 LayerMask *new_mask = MEM_new<LayerMask>(__func__,
mask->name);
1097 new_layer.
opacity = gpl->opacity;
1100 Drawing *dst_drawing = grease_pencil.insert_frame(
1102 if (dst_drawing ==
nullptr) {
1117 grease_pencil.set_active_layer(&new_layer);
1131 layer_passes.
span[layer_idx] = int(gpl->pass_index);
1176 conversion_data, grease_pencil.
id, gpd.
id, {{
".location",
".translation"}});
1177 for (
const Layer *layer_iter : grease_pencil.layers()) {
1179 char layer_name_esc[
sizeof((
bGPDlayer{}).info) * 2];
1180 BLI_str_escape(layer_name_esc, layer_iter->name().c_str(),
sizeof(layer_name_esc));
1181 std::string layer_root_path = fmt::format(
"layers[\"{}\"]", layer_name_esc);
1182 animdata_gpdata_transfer.root_path_dst = layer_root_path;
1183 animdata_gpdata_transfer.root_path_src = layer_root_path;
1184 animdata_gpdata_transfer.fcurves_convert();
1186 animdata_gpdata_transfer.fcurves_convert_finalize();
1213 radius_offset_data.min = -
FLT_MAX;
1214 radius_offset_data.max =
FLT_MAX;
1227 set_curve_radius->
location[0] = 600;
1228 set_curve_radius->
location[1] = 160;
1230 nullptr, *group,
"GeometryNodeInputNamedLayerSelection");
1231 named_layer_selection->
location[0] = 200;
1232 named_layer_selection->
location[1] = 100;
1239 add->location[0] = 200;
1240 add->location[1] = 0;
1262 *named_layer_selection,
1265 *named_layer_selection,
1303 conversion_data, dst_object.
id, src_object_data.
id, {{
"pixel_factor",
".thickness_factor"}});
1306 const float thickness_factor = src_object_data.pixfactor;
1307 const bool has_thickness_factor_animation =
1308 animdata_thickness_transfer.source_has_animation_to_convert();
1309 const bool has_thickness_factor = thickness_factor != 1.0f || has_thickness_factor_animation;
1311 if (!has_thickness_factor) {
1326 if (has_thickness_factor_animation) {
1327 char modifier_name_esc[
MAX_NAME * 2];
1329 animdata_thickness_transfer.root_path_dst = fmt::format(
"modifiers[\"{}\"]",
1332 animdata_thickness_transfer.fcurves_convert();
1335 animdata_thickness_transfer.fcurves_convert_finalize();
1380 animdata_convert_thickness.root_path_src = fmt::format(
"modifiers[\"{}\"]",
modifier_name);
1381 animdata_convert_thickness.root_path_dst = fmt::format(
"modifiers[\"{}\"]",
modifier_name);
1383 if (!animdata_convert_thickness.source_has_animation_to_convert()) {
1386 animdata_convert_thickness.fcurves_convert();
1389 animdata_convert_thickness.fcurves_convert_finalize();
1403 {{
".tint_color",
".color"}, {
".tint_factor",
".factor"}});
1405 AnimDataConvertor animdata_thickness_transfer(
1409 {{
".line_change",
"[\"Socket_2\"]", fcurve_convert_thickness_cb}});
1414 const float tint_factor = gpl->tintcolor[3];
1415 const int thickness_px = gpl->line_change;
1417 char layer_name_esc[
sizeof(gpl->info) * 2];
1418 BLI_str_escape(layer_name_esc, gpl->info,
sizeof(layer_name_esc));
1419 animdata_tint_transfer.root_path_src = fmt::format(
"layers[\"{}\"]", layer_name_esc);
1420 animdata_thickness_transfer.root_path_src = fmt::format(
"layers[\"{}\"]", layer_name_esc);
1422 const bool has_tint_adjustment_animation =
1423 animdata_tint_transfer.source_has_animation_to_convert();
1424 const bool has_thickness_adjustment_animation =
1425 animdata_thickness_transfer.source_has_animation_to_convert();
1428 const bool has_tint_adjustment = tint_factor > 0.0f || has_tint_adjustment_animation;
1429 const bool has_thickness_adjustment = thickness_px != 0 || has_thickness_adjustment_animation;
1432 if (has_tint_adjustment) {
1437 tmd->
factor = tint_factor;
1448 if (has_tint_adjustment_animation) {
1449 char modifier_name_esc[
MAX_NAME * 2];
1451 animdata_tint_transfer.root_path_dst = fmt::format(
"modifiers[\"{}\"]", modifier_name_esc);
1453 animdata_tint_transfer.fcurves_convert();
1457 if (has_thickness_adjustment) {
1465 const auto offset_radius_ntree_ensure = [&](
Library *owner_library) {
1475 if (ntree_iter->id.lib != owner_library) {
1478 if (
STREQ(ntree_iter->id.name + 2, OFFSET_RADIUS_NODETREE_NAME)) {
1490 bNodeTree *offset_radius_node_tree = offset_radius_ntree_ensure(dst_object.id.lib);
1498 md->node_group = offset_radius_node_tree;
1514 if (has_thickness_adjustment_animation) {
1515 char modifier_name_esc[
MAX_NAME * 2];
1517 animdata_thickness_transfer.root_path_dst = fmt::format(
"modifiers[\"{}\"]",
1520 animdata_thickness_transfer.fcurves_convert();
1525 animdata_tint_transfer.fcurves_convert_finalize();
1526 animdata_thickness_transfer.fcurves_convert_finalize();
1544 for (md =
static_cast<ModifierData *
>(
object.modifiers.first);
1558 if (legacy_md.
name[0]) {
1574 char legacy_name_esc[
MAX_NAME * 2];
1576 anim_convertor.
root_path_src = fmt::format(
"grease_pencil_modifiers[\"{}\"]", legacy_name_esc);
1580 anim_convertor.
root_path_dst = fmt::format(
"modifiers[\"{}\"]", new_name_esc);
1591 const int layer_pass,
1592 const bool invert_layer,
1593 const bool invert_layer_pass,
1595 const int material_pass,
1596 const bool invert_material,
1597 const bool invert_material_pass,
1599 const bool invert_vertex_group,
1601 const bool use_custom_curve)
1610 if (layer_pass > 0) {
1613 if (invert_layer_pass) {
1619 *material =
nullptr;
1621 if (invert_material) {
1625 if (material_pass > 0) {
1628 if (invert_material_pass) {
1633 if (invert_vertex_group) {
1642 *custom_curve =
nullptr;
1644 if (use_custom_curve) {
1658 md_armature.
object = legacy_md_armature.object;
1659 legacy_md_armature.object =
nullptr;
1660 md_armature.deformflag = legacy_md_armature.deformflag;
1671 legacy_md_armature.vgname,
1686 md_array.
object = legacy_md_array.object;
1687 legacy_md_array.object =
nullptr;
1688 md_array.count = legacy_md_array.count;
1702 copy_v3_v3(md_array.offset, legacy_md_array.offset);
1703 copy_v3_v3(md_array.shift, legacy_md_array.shift);
1704 copy_v3_v3(md_array.rnd_offset, legacy_md_array.rnd_offset);
1705 copy_v3_v3(md_array.rnd_rot, legacy_md_array.rnd_rot);
1706 copy_v3_v3(md_array.rnd_scale, legacy_md_array.rnd_scale);
1707 md_array.seed = legacy_md_array.seed;
1708 md_array.mat_rpl = legacy_md_array.mat_rpl;
1711 legacy_md_array.layername,
1712 legacy_md_array.layer_pass,
1715 &legacy_md_array.material,
1716 legacy_md_array.pass_index,
1748 copy_v3_v3(md_color.hsv, legacy_md_color.hsv);
1751 legacy_md_color.layername,
1752 legacy_md_color.layer_pass,
1755 &legacy_md_color.material,
1756 legacy_md_color.pass_index,
1761 &legacy_md_color.curve_intensity,
1775 md_dash.segment_active_index = legacy_md_dash.segment_active_index;
1776 md_dash.segments_num = legacy_md_dash.segments_len;
1779 legacy_md_dash.segments_len, __func__);
1780 for (
const int i :
IndexRange(md_dash.segments_num)) {
1784 dst_segment.
flag = 0;
1788 dst_segment.
dash = src_segment.
dash;
1789 dst_segment.
gap = src_segment.
gap;
1796 legacy_md_dash.layername,
1797 legacy_md_dash.layer_pass,
1800 &legacy_md_dash.material,
1801 legacy_md_dash.pass_index,
1830 md_envelope.
mat_nr = legacy_md_envelope.mat_nr;
1831 md_envelope.thickness = legacy_md_envelope.thickness;
1832 md_envelope.strength = legacy_md_envelope.strength;
1833 md_envelope.skip = legacy_md_envelope.skip;
1834 md_envelope.spread = legacy_md_envelope.spread;
1837 legacy_md_envelope.layername,
1838 legacy_md_envelope.layer_pass,
1841 &legacy_md_envelope.material,
1842 legacy_md_envelope.pass_index,
1845 legacy_md_envelope.vgname,
1893 md_hook.object = legacy_md_hook.object;
1894 legacy_md_hook.object =
nullptr;
1895 STRNCPY(md_hook.subtarget, legacy_md_hook.subtarget);
1896 copy_m4_m4(md_hook.parentinv, legacy_md_hook.parentinv);
1897 copy_v3_v3(md_hook.cent, legacy_md_hook.cent);
1898 md_hook.falloff = legacy_md_hook.falloff;
1899 md_hook.force = legacy_md_hook.force;
1902 legacy_md_hook.layername,
1903 legacy_md_hook.layer_pass,
1906 &legacy_md_hook.material,
1907 legacy_md_hook.pass_index,
1910 legacy_md_hook.vgname,
1912 &legacy_md_hook.curfalloff,
1925 md_lattice.
object = legacy_md_lattice.object;
1926 legacy_md_lattice.object =
nullptr;
1927 md_lattice.strength = legacy_md_lattice.strength;
1930 legacy_md_lattice.layername,
1931 legacy_md_lattice.layer_pass,
1934 &legacy_md_lattice.material,
1935 legacy_md_lattice.pass_index,
1938 legacy_md_lattice.vgname,
1953 md_length.
flag = legacy_md_length.flag;
1954 md_length.start_fac = legacy_md_length.start_fac;
1955 md_length.end_fac = legacy_md_length.end_fac;
1956 md_length.rand_start_fac = legacy_md_length.rand_start_fac;
1957 md_length.rand_end_fac = legacy_md_length.rand_end_fac;
1958 md_length.rand_offset = legacy_md_length.rand_offset;
1959 md_length.overshoot_fac = legacy_md_length.overshoot_fac;
1960 md_length.seed = legacy_md_length.seed;
1961 md_length.step = legacy_md_length.step;
1962 md_length.mode = legacy_md_length.mode;
1963 md_length.point_density = legacy_md_length.point_density;
1964 md_length.segment_influence = legacy_md_length.segment_influence;
1965 md_length.max_angle = legacy_md_length.max_angle;
1968 legacy_md_length.layername,
1969 legacy_md_length.layer_pass,
1972 &legacy_md_length.material,
1973 legacy_md_length.pass_index,
1991 md_mirror.
object = legacy_md_mirror.object;
1992 legacy_md_mirror.object =
nullptr;
2005 legacy_md_mirror.layername,
2006 legacy_md_mirror.layer_pass,
2009 &legacy_md_mirror.material,
2010 legacy_md_mirror.pass_index,
2028 md_multiply.
flag = 0;
2032 md_multiply.duplications = legacy_md_multiply.duplications;
2033 md_multiply.distance = legacy_md_multiply.distance;
2034 md_multiply.offset = legacy_md_multiply.offset;
2035 md_multiply.fading_center = legacy_md_multiply.fading_center;
2036 md_multiply.fading_thickness = legacy_md_multiply.fading_thickness;
2037 md_multiply.fading_opacity = legacy_md_multiply.fading_opacity;
2042 legacy_md_multiply.layername,
2043 legacy_md_multiply.layer_pass,
2046 &legacy_md_multiply.material,
2047 legacy_md_multiply.pass_index,
2065 md_noise.
flag = legacy_md_noise.flag;
2066 md_noise.factor = legacy_md_noise.factor;
2067 md_noise.factor_strength = legacy_md_noise.factor_strength;
2068 md_noise.factor_thickness = legacy_md_noise.factor_thickness;
2069 md_noise.factor_uvs = legacy_md_noise.factor_uvs;
2070 md_noise.noise_scale = legacy_md_noise.noise_scale;
2071 md_noise.noise_offset = legacy_md_noise.noise_offset;
2072 md_noise.noise_mode = legacy_md_noise.noise_mode;
2073 md_noise.step = legacy_md_noise.step;
2074 md_noise.seed = legacy_md_noise.seed;
2077 legacy_md_noise.layername,
2078 legacy_md_noise.layer_pass,
2081 &legacy_md_noise.material,
2082 legacy_md_noise.pass_index,
2085 legacy_md_noise.vgname,
2087 &legacy_md_noise.curve_intensity,
2118 copy_v3_v3(md_offset.loc, legacy_md_offset.loc);
2119 copy_v3_v3(md_offset.rot, legacy_md_offset.rot);
2120 copy_v3_v3(md_offset.scale, legacy_md_offset.scale);
2121 copy_v3_v3(md_offset.stroke_loc, legacy_md_offset.rnd_offset);
2122 copy_v3_v3(md_offset.stroke_rot, legacy_md_offset.rnd_rot);
2123 copy_v3_v3(md_offset.stroke_scale, legacy_md_offset.rnd_scale);
2124 md_offset.seed = legacy_md_offset.seed;
2125 md_offset.stroke_step = legacy_md_offset.stroke_step;
2126 md_offset.stroke_start_offset = legacy_md_offset.stroke_start_offset;
2129 legacy_md_offset.layername,
2130 legacy_md_offset.layer_pass,
2133 &legacy_md_offset.material,
2134 legacy_md_offset.pass_index,
2137 legacy_md_offset.vgname,
2152 md_opacity.
flag = 0;
2173 md_opacity.color_factor = legacy_md_opacity.factor;
2174 md_opacity.hardness_factor = legacy_md_opacity.hardness;
2180 conversion_data,
object.
id,
object.
id, {{
".factor",
".color_factor"}});
2182 anim_convertor_factor.root_path_dst = fmt::format(
"modifiers[\"{}\"]",
modifier_name);
2183 anim_convertor_factor.fcurves_convert();
2184 anim_convertor_factor.fcurves_convert_finalize();
2186 conversion_data,
object.
id,
object.
id, {{
".hardness",
".hardness_factor"}});
2188 anim_convertor_hardness.root_path_dst = fmt::format(
"modifiers[\"{}\"]",
modifier_name);
2189 anim_convertor_hardness.fcurves_convert();
2190 anim_convertor_hardness.fcurves_convert_finalize();
2194 legacy_md_opacity.layername,
2195 legacy_md_opacity.layer_pass,
2198 &legacy_md_opacity.material,
2199 legacy_md_opacity.pass_index,
2202 legacy_md_opacity.vgname,
2204 &legacy_md_opacity.curve_intensity,
2217 md_outline.
flag = 0;
2221 md_outline.object = legacy_md_outline.object;
2222 legacy_md_outline.object =
nullptr;
2223 md_outline.outline_material = legacy_md_outline.outline_material;
2224 legacy_md_outline.outline_material =
nullptr;
2225 md_outline.sample_length = legacy_md_outline.sample_length;
2226 md_outline.subdiv = legacy_md_outline.subdiv;
2227 md_outline.thickness = legacy_md_outline.thickness;
2230 legacy_md_outline.layername,
2231 legacy_md_outline.layer_pass,
2234 &legacy_md_outline.material,
2235 legacy_md_outline.pass_index,
2255 md_shrinkwrap.
shrink_type = legacy_md_shrinkwrap.shrink_type;
2257 md_shrinkwrap.shrink_opts = legacy_md_shrinkwrap.shrink_opts;
2259 md_shrinkwrap.shrink_mode = legacy_md_shrinkwrap.shrink_mode;
2261 md_shrinkwrap.proj_axis = legacy_md_shrinkwrap.proj_axis;
2263 md_shrinkwrap.target = legacy_md_shrinkwrap.target;
2264 legacy_md_shrinkwrap.target =
nullptr;
2265 md_shrinkwrap.aux_target = legacy_md_shrinkwrap.aux_target;
2266 legacy_md_shrinkwrap.aux_target =
nullptr;
2267 md_shrinkwrap.keep_dist = legacy_md_shrinkwrap.keep_dist;
2268 md_shrinkwrap.proj_limit = legacy_md_shrinkwrap.proj_limit;
2269 md_shrinkwrap.subsurf_levels = legacy_md_shrinkwrap.subsurf_levels;
2270 md_shrinkwrap.smooth_factor = legacy_md_shrinkwrap.smooth_factor;
2271 md_shrinkwrap.smooth_step = legacy_md_shrinkwrap.smooth_step;
2274 legacy_md_shrinkwrap.layername,
2275 legacy_md_shrinkwrap.layer_pass,
2278 &legacy_md_shrinkwrap.material,
2279 legacy_md_shrinkwrap.pass_index,
2282 legacy_md_shrinkwrap.vgname,
2313 md_smooth.factor = legacy_md_smooth.factor;
2314 md_smooth.step = legacy_md_smooth.step;
2317 legacy_md_smooth.layername,
2318 legacy_md_smooth.layer_pass,
2321 &legacy_md_smooth.material,
2322 legacy_md_smooth.pass_index,
2325 legacy_md_smooth.vgname,
2327 &legacy_md_smooth.curve_intensity,
2348 md_subdiv.
level = legacy_md_subdiv.level;
2351 legacy_md_subdiv.layername,
2352 legacy_md_subdiv.layer_pass,
2355 &legacy_md_subdiv.material,
2356 legacy_md_subdiv.pass_index,
2393 md_texture.
uv_offset = legacy_md_texture.uv_offset;
2394 md_texture.uv_scale = legacy_md_texture.uv_scale;
2395 md_texture.fill_rotation = legacy_md_texture.fill_rotation;
2396 copy_v2_v2(md_texture.fill_offset, legacy_md_texture.fill_offset);
2397 md_texture.fill_scale = legacy_md_texture.fill_scale;
2398 md_texture.layer_pass = legacy_md_texture.layer_pass;
2399 md_texture.alignment_rotation = legacy_md_texture.alignment_rotation;
2402 legacy_md_texture.layername,
2403 legacy_md_texture.layer_pass,
2406 &legacy_md_texture.material,
2407 legacy_md_texture.pass_index,
2410 legacy_md_texture.vgname,
2425 md_thickness.
flag = 0;
2432 md_thickness.thickness_fac = legacy_md_thickness.thickness_fac;
2436 legacy_md_thickness.layername,
2437 legacy_md_thickness.layer_pass,
2440 &legacy_md_thickness.material,
2441 legacy_md_thickness.pass_index,
2444 legacy_md_thickness.vgname,
2446 &legacy_md_thickness.curve_thickness,
2483 md_time.offset = legacy_md_time.offset;
2484 md_time.frame_scale = legacy_md_time.frame_scale;
2485 md_time.sfra = legacy_md_time.sfra;
2486 md_time.efra = legacy_md_time.efra;
2487 md_time.segment_active_index = legacy_md_time.segment_active_index;
2488 md_time.segments_num = legacy_md_time.segments_len;
2491 legacy_md_time.segments_len, __func__);
2492 for (
const int i :
IndexRange(md_time.segments_num)) {
2514 legacy_md_time.layername,
2515 legacy_md_time.layer_pass,
2560 md_tint.factor = legacy_md_tint.factor;
2561 md_tint.radius = legacy_md_tint.radius;
2562 copy_v3_v3(md_tint.color, legacy_md_tint.rgb);
2563 md_tint.object = legacy_md_tint.object;
2564 legacy_md_tint.object =
nullptr;
2566 md_tint.color_ramp = legacy_md_tint.colorband;
2567 legacy_md_tint.colorband =
nullptr;
2570 legacy_md_tint.layername,
2571 legacy_md_tint.layer_pass,
2574 &legacy_md_tint.material,
2575 legacy_md_tint.pass_index,
2578 legacy_md_tint.vgname,
2580 &legacy_md_tint.curve_intensity,
2593 md_weight_angle.
flag = 0;
2608 md_weight_angle.axis = legacy_md_weight_angle.axis;
2609 STRNCPY(md_weight_angle.target_vgname, legacy_md_weight_angle.target_vgname);
2610 md_weight_angle.min_weight = legacy_md_weight_angle.min_weight;
2611 md_weight_angle.angle = legacy_md_weight_angle.angle;
2614 legacy_md_weight_angle.layername,
2615 legacy_md_weight_angle.layer_pass,
2618 &legacy_md_weight_angle.material,
2619 legacy_md_weight_angle.pass_index,
2622 legacy_md_weight_angle.vgname,
2637 md_weight_prox.
flag = 0;
2644 STRNCPY(md_weight_prox.target_vgname, legacy_md_weight_prox.target_vgname);
2645 md_weight_prox.min_weight = legacy_md_weight_prox.min_weight;
2646 md_weight_prox.dist_start = legacy_md_weight_prox.dist_start;
2647 md_weight_prox.dist_end = legacy_md_weight_prox.dist_end;
2648 md_weight_prox.object = legacy_md_weight_prox.object;
2649 legacy_md_weight_prox.object =
nullptr;
2652 legacy_md_weight_prox.layername,
2653 legacy_md_weight_prox.layer_pass,
2656 &legacy_md_weight_prox.material,
2657 legacy_md_weight_prox.pass_index,
2660 legacy_md_weight_prox.vgname,
2695 switch (legacy_md_build.mode) {
2708 switch (legacy_md_build.time_alignment) {
2718 switch (legacy_md_build.time_mode) {
2731 switch (legacy_md_build.transition) {
2744 md_build.start_frame = legacy_md_build.start_frame;
2745 md_build.end_frame = legacy_md_build.end_frame;
2746 md_build.start_delay = legacy_md_build.start_delay;
2747 md_build.length = legacy_md_build.length;
2748 md_build.fade_fac = legacy_md_build.fade_fac;
2749 md_build.fade_opacity_strength = legacy_md_build.fade_opacity_strength;
2750 md_build.fade_thickness_strength = legacy_md_build.fade_thickness_strength;
2751 md_build.percentage_fac = legacy_md_build.percentage_fac;
2752 md_build.speed_fac = legacy_md_build.speed_fac;
2753 md_build.speed_maxgap = legacy_md_build.speed_maxgap;
2754 md_build.object = legacy_md_build.object;
2755 STRNCPY(md_build.target_vgname, legacy_md_build.target_vgname);
2758 legacy_md_build.layername,
2759 legacy_md_build.layer_pass,
2762 &legacy_md_build.material,
2763 legacy_md_build.pass_index,
2766 legacy_md_build.target_vgname,
2781 switch (legacy_md_simplify.mode) {
2796 md_simplify.
step = legacy_md_simplify.step;
2797 md_simplify.factor = legacy_md_simplify.factor;
2798 md_simplify.length = legacy_md_simplify.length;
2799 md_simplify.sharp_threshold = legacy_md_simplify.sharp_threshold;
2800 md_simplify.distance = legacy_md_simplify.distance;
2803 legacy_md_simplify.layername,
2804 legacy_md_simplify.layer_pass,
2807 &legacy_md_simplify.material,
2808 legacy_md_simplify.pass_index,
2824 switch (gpd_md->type) {
2951 object_gpv2.
add(legacy_gpd);
2957 auto sanitize_gpv2_annotation = [&](
bGPdata **legacy_gpd_p) {
2958 bGPdata *legacy_gpd = *legacy_gpd_p;
2964 if (!object_gpv2.
contains(legacy_gpd)) {
2976 if (!new_annotation_gpd) {
2985 annotations_gpv2.
add_overwrite(legacy_gpd, new_annotation_gpd);
2991 *legacy_gpd_p = new_annotation_gpd;
2996 sanitize_gpv2_annotation(&scene->gpd);
3002 sanitize_gpv2_annotation(&node_tree->gpd);
3007 sanitize_gpv2_annotation(&node_tree->gpd);
3011 sanitize_gpv2_annotation(&movie_clip->gpd);
3015 sanitize_gpv2_annotation(&mvc_track->gpd);
3020 for (
int i = 0;
i < mvc_plane_track->point_tracksnr;
i++) {
3021 sanitize_gpv2_annotation(&mvc_plane_track->point_tracks[
i]->gpd);
3033 sanitize_gpv2_annotation(&space_sequencer->
gpd);
3038 sanitize_gpv2_annotation(&space_image->
gpd);
3043 sanitize_gpv2_annotation(&space_node->
gpd);
3079 const bool do_gpencil_data_conversion = (new_grease_pencil ==
nullptr);
3081 if (!new_grease_pencil) {
3087 object.data = new_grease_pencil;
3094 if (do_gpencil_data_conversion) {
3141 legacy_gpd,
nullptr);
3142 if (!new_grease_pencil) {
3149 gpd_remapper.
add(&legacy_gpd->id, &new_grease_pencil->
id);
3159 ID *item_new_id = BKE_blendfile_link_append_context_item_newid_get(lapp_context, item);
3160 if (!item_new_id || GS(item_new_id->name) != ID_GD_LEGACY) {
3165 reinterpret_cast<bGPdata *
>(item_new_id));
3166 if (item_grease_pencil && *item_grease_pencil) {
3168 lapp_context, item, &(*item_grease_pencil)->id);
Functions and classes to work with Actions.
Functionality to iterate an Action in various ways.
Blender kernel action and pose functionality.
AnimData * BKE_animdata_copy_in_lib(Main *bmain, std::optional< Library * > owner_library, AnimData *adt, int flag)
bool BKE_animdata_action_ensure_idroot(const ID *owner, bAction *action)
AnimData * BKE_animdata_ensure_id(ID *id)
AnimData * BKE_animdata_from_id(const ID *id)
void BKE_blendfile_link_append_context_item_foreach(BlendfileLinkAppendContext *lapp_context, blender::FunctionRef< bool(BlendfileLinkAppendContext *lapp_context, BlendfileLinkAppendContextItem *item)> callback_function, eBlendfileLinkAppendForeachItemFlag flag)
void BKE_blendfile_link_append_context_item_newid_set(BlendfileLinkAppendContext *lapp_context, BlendfileLinkAppendContextItem *item, ID *new_id)
eBlendfileLinkAppendForeachItemFlag
@ BKE_BLENDFILE_LINK_APPEND_FOREACH_ITEM_FLAG_DO_DIRECT
@ BKE_BLENDFILE_LINK_APPEND_FOREACH_ITEM_FLAG_DO_INDIRECT
Low-level operations for curves.
void BKE_fcurve_handles_recalc(FCurve *fcu)
void BKE_gpencil_modifier_free_ex(struct GpencilModifierData *md, int flag)
Low-level operations for grease pencil.
bool IDP_AddToGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
IDPropertyUIData * IDP_ui_data_ensure(IDProperty *prop)
struct ID * BKE_id_copy_in_lib(Main *bmain, std::optional< Library * > owner_library, const ID *id, std::optional< const ID * > new_owner_id, ID **new_id_p, int flag)
void * BKE_id_new_in_lib(Main *bmain, std::optional< Library * > owner_library, short type, const char *name)
void id_fake_user_set(ID *id)
void id_us_plus_no_lib(ID *id)
void BKE_libblock_remap_multiple(Main *bmain, blender::bke::id::IDRemapper &mappings, const int remap_flags)
@ ID_REMAP_ALLOW_IDTYPE_MISMATCH
#define FOREACH_MAIN_ID_END
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
General operations, lookup, etc. for materials.
void BKE_id_materials_copy(Main *bmain, ID *id_src, ID *id_dst)
const ModifierTypeInfo * BKE_modifier_get_info(ModifierType type)
void BKE_modifiers_persistent_uid_init(const Object &object, ModifierData &md)
@ eModifierTypeFlag_RequiresOriginalData
void BKE_modifier_unique_name(ListBase *modifiers, ModifierData *md)
ModifierData * BKE_modifier_new(int type)
void BKE_ntree_update_after_single_tree_change(Main &bmain, bNodeTree &modified_tree, const NodeTreeUpdateExtraParams ¶ms={})
General operations, lookup, etc. for blender objects.
void BKE_object_free_derived_caches(Object *ob)
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(ListBase *lb)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_pophead(ListBase *listbase) ATTR_NONNULL(1)
void BLI_insertlinkbefore(ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
MINLINE float max_ff(float a, float b)
void copy_m4_m4(float m1[4][4], const float m2[4][4])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
char * BLI_strdupn(const char *str, size_t len) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
char * STRNCPY(char(&dst)[N], const char *src)
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define SNPRINTF_UTF8(dst, format,...)
#define STRNCPY_UTF8(dst, src)
#define UNUSED_VARS_NDEBUG(...)
#define SET_FLAG_FROM_TEST(value, test, flag)
external readfile function prototypes.
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
@ GP_CURVE_NEEDS_STROKE_UPDATE
@ GP_LAYER_DISABLE_MASKS_IN_VIEWLAYER
@ GP_DATA_AUTOLOCK_LAYERS
@ GP_OUTLINE_INVERT_MATERIAL
@ GP_OUTLINE_INVERT_LAYER
@ GP_OUTLINE_INVERT_LAYERPASS
@ GP_TIME_SEG_MODE_PINGPONG
@ GP_TIME_SEG_MODE_REVERSE
@ GP_TIME_SEG_MODE_NORMAL
@ GP_SUBDIV_INVERT_MATERIAL
@ GP_SUBDIV_INVERT_LAYERPASS
@ GP_LATTICE_INVERT_LAYERPASS
@ GP_LATTICE_INVERT_LAYER
@ GP_LATTICE_INVERT_VGROUP
@ GP_LATTICE_INVERT_MATERIAL
@ GP_BUILD_TRANSITION_SHRINK
@ GP_BUILD_TRANSITION_VANISH
@ GP_BUILD_TRANSITION_GROW
@ GP_WEIGHT_INVERT_VGROUP
@ GP_WEIGHT_INVERT_OUTPUT
@ GP_WEIGHT_INVERT_MATERIAL
@ GP_WEIGHT_INVERT_LAYERPASS
@ GP_WEIGHT_MULTIPLY_DATA
@ GP_BUILD_MODE_SEQUENTIAL
@ GP_BUILD_MODE_CONCURRENT
@ GP_ENVELOPE_INVERT_LAYERPASS
@ GP_ENVELOPE_INVERT_LAYER
@ GP_ENVELOPE_INVERT_PASS
@ GP_ENVELOPE_INVERT_VGROUP
@ GP_ENVELOPE_INVERT_MATERIAL
@ GP_SIMPLIFY_INVERT_LAYER
@ GP_SIMPLIFY_INVERT_PASS
@ GP_SIMPLIFY_INVERT_MATERIAL
@ GP_SIMPLIFY_INVERT_LAYERPASS
@ GP_HOOK_INVERT_MATERIAL
@ GP_HOOK_INVERT_LAYERPASS
@ GP_TIME_INVERT_LAYERPASS
@ GP_COLOR_INVERT_LAYERPASS
@ GP_COLOR_INVERT_MATERIAL
@ GP_SMOOTH_INVERT_LAYERPASS
@ GP_SMOOTH_MOD_THICKNESS
@ GP_SMOOTH_INVERT_MATERIAL
@ GP_SMOOTH_INVERT_VGROUP
@ GP_BUILD_TIMEALIGN_START
@ GP_OPACITY_WEIGHT_FACTOR
@ GP_OPACITY_INVERT_LAYER
@ GP_OPACITY_INVERT_VGROUP
@ GP_OPACITY_CUSTOM_CURVE
@ GP_OPACITY_INVERT_MATERIAL
@ GP_OPACITY_INVERT_LAYERPASS
@ GP_THICK_INVERT_MATERIAL
@ GP_THICK_INVERT_LAYERPASS
@ GP_MULTIPLY_ENABLE_FADING
@ GP_BUILD_TIMEMODE_FRAMES
@ GP_BUILD_TIMEMODE_PERCENTAGE
@ GP_BUILD_TIMEMODE_DRAWSPEED
@ eGPHook_Falloff_InvSquare
@ GP_OFFSET_INVERT_MATERIAL
@ GP_OFFSET_UNIFORM_RANDOM_SCALE
@ GP_OFFSET_INVERT_VGROUP
@ GP_OFFSET_INVERT_LAYERPASS
@ GP_TINT_INVERT_LAYERPASS
@ GP_TINT_INVERT_MATERIAL
@ GP_MIRROR_INVERT_MATERIAL
@ GP_MIRROR_INVERT_LAYERPASS
@ GP_DASH_INVERT_LAYERPASS
@ GP_DASH_INVERT_MATERIAL
@ GP_MODIFY_COLOR_HARDNESS
@ GP_SHRINKWRAP_INVERT_LAYER
@ GP_SHRINKWRAP_INVERT_VGROUP
@ GP_SHRINKWRAP_INVERT_LAYERPASS
@ GP_SHRINKWRAP_INVERT_PASS
@ GP_SHRINKWRAP_INVERT_MATERIAL
@ GP_TEX_INVERT_LAYERPASS
@ eGpencilModifierType_Dash
@ eGpencilModifierType_Array
@ eGpencilModifierType_Noise
@ eGpencilModifierType_Mirror
@ eGpencilModifierType_Color
@ eGpencilModifierType_Multiply
@ eGpencilModifierType_Texture
@ eGpencilModifierType_Subdiv
@ eGpencilModifierType_Length
@ eGpencilModifierType_Lattice
@ eGpencilModifierType_Opacity
@ eGpencilModifierType_Hook
@ eGpencilModifierType_Simplify
@ eGpencilModifierType_Shrinkwrap
@ eGpencilModifierType_WeightProximity
@ eGpencilModifierType_Armature
@ eGpencilModifierType_WeightAngle
@ eGpencilModifierType_Lineart
@ eGpencilModifierType_None
@ eGpencilModifierType_Smooth
@ eGpencilModifierType_Tint
@ eGpencilModifierType_Outline
@ eGpencilModifierType_Envelope
@ eGpencilModifierType_Time
@ eGpencilModifierType_Thick
@ eGpencilModifierType_Build
@ eGpencilModifierType_Offset
@ GP_LAYER_TREE_NODE_MUTE
@ GP_LAYER_TREE_NODE_HIDE_ONION_SKINNING
@ GP_LAYER_TREE_NODE_USE_LIGHTS
@ GP_LAYER_TREE_NODE_HIDE_MASKS
@ GP_LAYER_TREE_NODE_DISABLE_MASKS_IN_VIEWLAYER
@ GREASE_PENCIL_AUTOLOCK_LAYERS
@ GREASE_PENCIL_ANIM_CHANNEL_EXPANDED
@ GREASE_PENCIL_STROKE_ORDER_3D
@ GP_ONION_SKINNING_USE_FADE
@ GP_ONION_SKINNING_SHOW_LOOP
@ GP_ONION_SKINNING_USE_CUSTOM_COLORS
#define GREASE_PENCIL_ONION_SKINNING_FILTER_ALL
@ GP_LENGTH_INVERT_MATERIAL
@ GP_LENGTH_INVERT_LAYERPASS
@ GP_ARRAY_UNIFORM_RANDOM_SCALE
@ GP_ARRAY_INVERT_MATERIAL
@ GP_ARRAY_INVERT_LAYERPASS
@ GP_NOISE_INVERT_MATERIAL
@ GP_NOISE_INVERT_LAYERPASS
@ eModifierFlag_OverrideLibrary_Local
@ MOD_GREASE_PENCIL_MULTIPLY_ENABLE_FADING
@ MOD_GREASE_PENCIL_SMOOTH_MOD_LOCATION
@ MOD_GREASE_PENCIL_SMOOTH_MOD_STRENGTH
@ MOD_GREASE_PENCIL_SMOOTH_KEEP_SHAPE
@ MOD_GREASE_PENCIL_SMOOTH_MOD_UV
@ MOD_GREASE_PENCIL_SMOOTH_MOD_THICKNESS
@ GREASE_PENCIL_INFLUENCE_INVERT_VERTEX_GROUP
@ GREASE_PENCIL_INFLUENCE_USE_MATERIAL_PASS_FILTER
@ GREASE_PENCIL_INFLUENCE_USE_LAYER_PASS_FILTER
@ GREASE_PENCIL_INFLUENCE_INVERT_LAYER_FILTER
@ GREASE_PENCIL_INFLUENCE_USE_CUSTOM_CURVE
@ GREASE_PENCIL_INFLUENCE_INVERT_MATERIAL_PASS_FILTER
@ GREASE_PENCIL_INFLUENCE_INVERT_MATERIAL_FILTER
@ GREASE_PENCIL_INFLUENCE_INVERT_LAYER_PASS_FILTER
@ MOD_GREASE_PENCIL_WEIGHT_ANGLE_SPACE_WORLD
@ MOD_GREASE_PENCIL_WEIGHT_ANGLE_SPACE_LOCAL
@ MOD_GREASE_PENCIL_HOOK_UNIFORM_SPACE
@ MOD_GREASE_PENCIL_OFFSET_UNIFORM_RANDOM_SCALE
@ MOD_GREASE_PENCIL_MIRROR_AXIS_Z
@ MOD_GREASE_PENCIL_MIRROR_AXIS_X
@ MOD_GREASE_PENCIL_MIRROR_AXIS_Y
@ MOD_GREASE_PENCIL_WEIGHT_ANGLE_MULTIPLY_DATA
@ MOD_GREASE_PENCIL_WEIGHT_ANGLE_INVERT_OUTPUT
@ MOD_GREASE_PENCIL_OPACITY_USE_WEIGHT_AS_FACTOR
@ MOD_GREASE_PENCIL_OPACITY_USE_UNIFORM_OPACITY
@ 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
@ MOD_GREASE_PENCIL_BUILD_TIMEMODE_PERCENTAGE
@ MOD_GREASE_PENCIL_BUILD_TIMEMODE_DRAWSPEED
@ MOD_GREASE_PENCIL_BUILD_TIMEMODE_FRAMES
@ MOD_GREASE_PENCIL_BUILD_TIMEALIGN_START
@ MOD_GREASE_PENCIL_BUILD_TIMEALIGN_END
@ MOD_GREASE_PENCIL_THICK_WEIGHT_FACTOR
@ MOD_GREASE_PENCIL_THICK_NORMALIZE
@ MOD_GREASE_PENCIL_SIMPLIFY_FIXED
@ MOD_GREASE_PENCIL_SIMPLIFY_MERGE
@ MOD_GREASE_PENCIL_SIMPLIFY_ADAPTIVE
@ MOD_GREASE_PENCIL_SIMPLIFY_SAMPLE
@ MOD_GREASE_PENCIL_TIME_MODE_FIX
@ MOD_GREASE_PENCIL_TIME_MODE_CHAIN
@ MOD_GREASE_PENCIL_TIME_MODE_PINGPONG
@ MOD_GREASE_PENCIL_TIME_MODE_NORMAL
@ MOD_GREASE_PENCIL_TIME_MODE_REVERSE
@ MOD_GREASE_PENCIL_SUBDIV_CATMULL
@ MOD_GREASE_PENCIL_SUBDIV_SIMPLE
@ MOD_GREASE_PENCIL_COLOR_FILL
@ MOD_GREASE_PENCIL_COLOR_STROKE
@ MOD_GREASE_PENCIL_COLOR_BOTH
@ MOD_GREASE_PENCIL_COLOR_HARDNESS
@ MOD_GREASE_PENCIL_BUILD_MODE_SEQUENTIAL
@ MOD_GREASE_PENCIL_BUILD_MODE_ADDITIVE
@ MOD_GREASE_PENCIL_BUILD_MODE_CONCURRENT
@ MOD_GREASE_PENCIL_TIME_KEEP_LOOP
@ MOD_GREASE_PENCIL_TIME_CUSTOM_RANGE
@ MOD_GREASE_PENCIL_BUILD_RESTRICT_TIME
@ MOD_GREASE_PENCIL_BUILD_USE_FADING
@ MOD_GREASE_PENCIL_DASH_USE_CYCLIC
@ MOD_GREASE_PENCIL_TINT_UNIFORM
@ MOD_GREASE_PENCIL_TINT_GRADIENT
@ MOD_GREASE_PENCIL_OUTLINE_KEEP_SHAPE
@ MOD_GREASE_PENCIL_TINT_USE_WEIGHT_AS_FACTOR
@ eModifierType_GreasePencilSmooth
@ eModifierType_GreasePencilWeightProximity
@ eModifierType_GreasePencilMirror
@ eModifierType_GreasePencilOffset
@ eModifierType_GreasePencilThickness
@ eModifierType_GreasePencilEnvelope
@ eModifierType_GreasePencilArmature
@ eModifierType_GreasePencilSubdiv
@ eModifierType_GreasePencilTint
@ eModifierType_GreasePencilNoise
@ eModifierType_GreasePencilMultiply
@ eModifierType_GreasePencilBuild
@ eModifierType_GreasePencilTime
@ eModifierType_GreasePencilTexture
@ eModifierType_GreasePencilSimplify
@ eModifierType_GreasePencilColor
@ eModifierType_GreasePencilDash
@ eModifierType_GreasePencilLineart
@ eModifierType_GreasePencilOutline
@ eModifierType_GreasePencilWeightAngle
@ eModifierType_GreasePencilOpacity
@ eModifierType_GreasePencilLength
@ eModifierType_GreasePencilShrinkwrap
@ eModifierType_GreasePencilLattice
@ eModifierType_GreasePencilHook
@ eModifierType_GreasePencilArray
@ MOD_GREASE_PENCIL_HOOK_Falloff_None
@ MOD_GREASE_PENCIL_HOOK_Falloff_Root
@ MOD_GREASE_PENCIL_HOOK_Falloff_InvSquare
@ MOD_GREASE_PENCIL_HOOK_Falloff_Const
@ MOD_GREASE_PENCIL_HOOK_Falloff_Linear
@ MOD_GREASE_PENCIL_HOOK_Falloff_Sphere
@ MOD_GREASE_PENCIL_HOOK_Falloff_Smooth
@ MOD_GREASE_PENCIL_HOOK_Falloff_Curve
@ MOD_GREASE_PENCIL_HOOK_Falloff_Sharp
@ MOD_GREASE_PENCIL_TEXTURE_STROKE_AND_FILL
@ MOD_GREASE_PENCIL_TEXTURE_FILL
@ MOD_GREASE_PENCIL_TEXTURE_STROKE
@ MOD_GREASE_PENCIL_WEIGHT_PROXIMITY_INVERT_OUTPUT
@ MOD_GREASE_PENCIL_WEIGHT_PROXIMITY_MULTIPLY_DATA
@ MOD_GREASE_PENCIL_ENVELOPE_SEGMENTS
@ MOD_GREASE_PENCIL_ENVELOPE_FILLS
@ MOD_GREASE_PENCIL_ENVELOPE_DEFORM
@ MOD_GREASE_PENCIL_BUILD_TRANSITION_VANISH
@ MOD_GREASE_PENCIL_BUILD_TRANSITION_SHRINK
@ MOD_GREASE_PENCIL_BUILD_TRANSITION_GROW
@ MOD_GREASE_PENCIL_TEXTURE_FIT_STROKE
@ MOD_GREASE_PENCIL_TEXTURE_CONSTANT_LENGTH
@ MOD_GREASE_PENCIL_OFFSET_STROKE
@ MOD_GREASE_PENCIL_OFFSET_MATERIAL
@ MOD_GREASE_PENCIL_OFFSET_LAYER
@ MOD_GREASE_PENCIL_OFFSET_RANDOM
@ MOD_GREASE_PENCIL_TIME_SEG_MODE_NORMAL
@ MOD_GREASE_PENCIL_TIME_SEG_MODE_REVERSE
@ MOD_GREASE_PENCIL_TIME_SEG_MODE_PINGPONG
@ NODE_INTERFACE_SOCKET_OUTPUT
@ NODE_INTERFACE_SOCKET_INPUT
@ GEO_NODE_ASSET_MODIFIER
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
const Value * lookup_ptr(const Key &key) const
bool add(const Key &key, const Value &value)
Value lookup_default(const Key &key, const Value &default_value) const
void add_new(const Key &key, const Value &value)
void reinitialize(const int64_t new_size)
constexpr int64_t size() const
bool add_overwrite(const Key &key, const Value &value)
Value & lookup_or_add(const Key &key, const Value &value)
constexpr MutableSpan slice(const int64_t start, const int64_t size) const
bool contains(const Key &key) const
constexpr IndexRange index_range() const
constexpr StringRef substr(int64_t start, int64_t size) const
constexpr bool startswith(StringRef prefix) const
void copy_utf8_truncated(char *dst, int64_t dst_size) const
void append(const T &value)
Slot & slot_add_for_id(const ID &animated_id)
GSpanAttributeWriter lookup_or_add_for_write_span(StringRef attribute_id, AttrDomain domain, AttrType data_type, const AttributeInit &initializer=AttributeInitDefaultValue())
MutableSpan< float > opacities_for_write()
MutableSpan< float > radii_for_write()
bke::CurvesGeometry & strokes_for_write()
MutableSpan< ColorGeometry4f > fill_colors_for_write()
MutableSpan< ColorGeometry4f > vertex_colors_for_write()
void set_view_layer_name(StringRef new_name)
const GreasePencilFrame * frame_at(const int frame_number) const
void set_parent_bone_name(StringRef new_name)
std::string root_path_src
AnimDataConvertor(ConversionData &conversion_data, ID &id_dst, ID &id_src, const Array< AnimDataFCurveConvertor > fcurve_convertors={})
void fcurves_convert_finalize()
AnimDataConvertor(ConversionData &conversion_data, ID &id_src, const Array< AnimDataFCurveConvertor > fcurve_convertors={})
bool source_has_animation_to_convert() const
std::string root_path_dst
AnimDataConvertor()=delete
bool allow_idtype_mismatch
void add(ID *old_id, ID *new_id)
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
VecBase< float, D > normalize(VecOp< float, D >) RET
MatBase< R, C > transpose(MatBase< C, R >) RET
VecBase< float, 3 > cross(VecOp< float, 3 >, VecOp< float, 3 >) RET
VecBase< float, 3 > float3
static const char * modifier_name[LS_MODIFIER_NUM]
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
static void add(blender::Map< std::string, std::string > &messages, Message &msg)
void action_fcurve_move(Action &action_dst, slot_handle_t action_slot_dst, Action &action_src, FCurve &fcurve)
Action & action_add(Main &bmain, StringRefNull name)
void foreach_fcurve_in_action(Action &action, FunctionRef< void(FCurve &fcurve)> callback)
decltype(::ActionSlot::handle) slot_handle_t
bool assign_tmpaction(bAction *action, OwnedAnimData owned_adt)
bool assign_action(bAction *action, ID &animated_id)
static void fcurve_convert_thickness_cb(FCurve &fcurve)
static void legacy_object_modifier_subdiv(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
void(FCurve &fcurve) FCurveConvertCB
static void legacy_object_modifier_mirror(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
constexpr const char * OFFSET_RADIUS_NODETREE_NAME
static bNodeTree * offset_radius_node_tree_add(ConversionData &conversion_data, Library *library)
static void legacy_object_modifier_time(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_color(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static ModifierData & legacy_object_modifier_common(ConversionData &conversion_data, Object &object, const ModifierType type, GpencilModifierData &legacy_md)
static void legacy_object_modifier_offset(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_opacity(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_lineart(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_armature(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_shrinkwrap(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void thickness_factor_to_modifier(ConversionData &conversion_data, bGPdata &src_object_data, Object &dst_object)
static void legacy_object_modifier_envelope(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_outline(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_thickness(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_gpencil_to_grease_pencil(ConversionData &conversion_data, GreasePencil &grease_pencil, bGPdata &gpd)
static void legacy_object_modifier_weight_angle(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_tint(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
void lineart_unwrap_v3(LineartGpencilModifierData *lmd_legacy, const GreasePencilLineartModifierData *lmd)
static void legacy_object_modifier_noise(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
void legacy_main(Main &bmain, BlendfileLinkAppendContext *lapp_context, BlendFileReadReport &reports)
static blender::float4x2 get_legacy_texture_matrix(bGPDstroke *gps)
static void legacy_object_thickness_modifier_thickness_anim(ConversionData &conversion_data, Object &object)
static void layer_adjustments_to_modifiers(ConversionData &conversion_data, bGPdata &src_object_data, Object &dst_object)
static void legacy_object_modifier_texture(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifiers(ConversionData &conversion_data, Object &object)
static Drawing legacy_gpencil_frame_to_grease_pencil_drawing(const bGPDframe &gpf, const ListBase &vertex_group_names)
static float3x2 get_legacy_stroke_to_texture_matrix(const float2 uv_translation, const float uv_rotation, const float2 uv_scale)
static void legacy_object_modifier_dash(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_build(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_array(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_multiply(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_smooth(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_gpencil_sanitize_annotations(Main &bmain)
static void find_used_vertex_groups(const bGPDframe &gpf, const ListBase &vertex_group_names, const int num_vertex_groups, ListBase &r_vertex_group_names, Array< int > &r_indices)
static blender::float4x2 get_legacy_layer_to_stroke_matrix(bGPDstroke *gps)
void lineart_wrap_v3(const LineartGpencilModifierData *lmd_legacy, GreasePencilLineartModifierData *lmd)
static void legacy_object_modifier_lattice(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_weight_proximity(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_influence(GreasePencilModifierInfluenceData &influence, StringRef layername, const int layer_pass, const bool invert_layer, const bool invert_layer_pass, Material **material, const int material_pass, const bool invert_material, const bool invert_material_pass, StringRef vertex_group_name, const bool invert_vertex_group, CurveMapping **custom_curve, const bool use_custom_curve)
static void legacy_object_modifier_hook(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_gpencil_object(ConversionData &conversion_data, Object &object)
static void legacy_object_modifier_length(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
static void legacy_object_modifier_simplify(ConversionData &conversion_data, Object &object, GpencilModifierData &legacy_md)
constexpr float LEGACY_RADIUS_CONVERSION_FACTOR
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRef prop_name, int32_t value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_INT, set its name and value.
std::unique_ptr< IDProperty, IDPropertyDeleter > create_group(StringRef prop_name, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_GROUP.
bNodeSocket * node_find_socket(bNode &node, eNodeSocketInOut in_out, StringRef identifier)
bNode * node_add_node(const bContext *C, bNodeTree &ntree, StringRef idname, std::optional< int > unique_identifier=std::nullopt)
bool node_set_selected(bNode &node, bool select)
bNodeLink & node_add_link(bNodeTree &ntree, bNode &fromnode, bNodeSocket &fromsock, bNode &tonode, bNodeSocket &tosock)
bNodeTree * node_tree_add_in_lib(Main *bmain, Library *owner_library, StringRefNull name, StringRefNull idname)
bNodeTree * node_tree_from_id(ID *id)
T safe_divide(const T &a, const T &b)
T average(const VecBase< T, Size > &a)
MatT from_scale(const VecBase< typename MatT::base_type, ScaleDim > &scale)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
MatBase< float, 2, 2 > float2x2
MatBase< float, 2, 4 > float2x4
VecBase< float, 4 > float4
VecBase< float, 2 > float2
MatBase< float, 4, 2 > float4x2
MatBase< float, 3, 2 > float3x2
MatBase< float, 4, 3 > float4x3
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
static void def_group(BlenderRNA *, StructRNA *srna)
GreasePencilLayerTreeNode base
unsigned char shadow_selection
unsigned char material_mask_bits
struct Object * source_object
float chaining_image_threshold
struct LineartCache * cache
char level_start_override
char source_vertex_group[64]
struct Material * target_material
float angle_splitting_threshold
struct LineartData * la_data_ptr
unsigned char mask_switches
struct Collection * source_collection
struct Object * source_camera
char shadow_use_silhouette_override
unsigned char intersection_mask
float stroke_depth_offset
short edge_types_override
char shadow_selection_override
unsigned char silhouette_selection
struct Object * light_contour_object
float chain_smooth_tolerance
struct Material * material
char vertex_group_name[64]
struct CurveMapping * custom_curve
int16_t num_frames_before
GreasePencilModifierInfluenceData influence
int vertex_group_active_index
ListBase vertex_group_names
GreasePencilOnionSkinningSettings onion_skinning_settings
IDProperty * system_properties
struct Collection * source_collection
char shadow_use_silhouette_override
struct Object * light_contour_object
float angle_splitting_threshold
unsigned char mask_switches
short edge_types_override
char shadow_selection_override
struct LineartCache * cache
struct Object * source_camera
char source_vertex_group[64]
unsigned char shadow_selection
float chain_smooth_tolerance
float chaining_image_threshold
struct LineartData * la_data_ptr
unsigned char intersection_mask
char level_start_override
struct Material * target_material
unsigned char material_mask_bits
unsigned char silhouette_selection
struct Object * source_object
float stroke_depth_offset
struct ModifierData * next
ListBase vertex_group_names
int vertex_group_active_index
struct GeometryNodeAssetTraits * geometry_node_asset_traits
bNodeTreeInterface tree_interface
static MatBase identity()
MutableVArraySpan< T > span
blender::FunctionRef< FCurveConvertCB > convert_cb
const char * relative_rna_path_src
AnimDataFCurveConvertor(const char *relative_rna_path_src, const char *relative_rna_path_dst, blender::FunctionRef< FCurveConvertCB > convert_cb={nullptr})
const char * relative_rna_path_dst
Map< Library *, bNodeTree * > offset_radius_ntree_by_library
Map< bGPdata *, GreasePencil * > legacy_to_greasepencil_data
ConversionData(Main &bmain, BlendfileLinkAppendContext *lapp_context)
BlendfileLinkAppendContext * lapp_context