11#include <fmt/format.h>
146 const bool is_transfer_between_ids;
184 bool has_changes =
false;
191 : conversion_data(conversion_data),
196 is_transfer_between_ids(
false),
198 fcurve_convertors(fcurve_convertors)
206 : conversion_data(conversion_data),
211 is_transfer_between_ids(
true),
213 fcurve_convertors(fcurve_convertors)
219 using FCurveCallback = bool(
bAction *owner_action,
FCurve &fcurve);
220 using ActionCallback = bool(
bAction &action);
224 bool is_valid()
const
226 return this->animdata_src !=
nullptr;
230 bool legacy_fcurves_is_valid_for_root_path(
FCurve &fcurve,
StringRefNull legacy_root_path)
const
246 bool animation_fcurve_is_valid(
bAction *owner_action,
FCurve &fcurve)
const
248 if (!this->is_valid()) {
254 !
ELEM(owner_action, this->animdata_src->
action, this->animdata_src->tmpact))
258 if (!legacy_fcurves_is_valid_for_root_path(fcurve, this->
root_path_src)) {
266 bool fcurve_foreach_in_action(
bAction *owner_action,
267 blender::FunctionRef<FCurveCallback> callback)
const
269 bool is_changed =
false;
271 const bool local_is_changed = callback(owner_action, fcurve);
272 is_changed = is_changed || local_is_changed;
278 bool fcurve_foreach_in_listbase(
ListBase &fcurves,
279 blender::FunctionRef<FCurveCallback> callback)
const
281 bool is_changed =
false;
283 const bool local_is_changed = callback(
nullptr, *fcurve);
284 is_changed = is_changed || local_is_changed;
289 bool nla_strip_fcurve_foreach(
NlaStrip &nla_strip,
290 blender::FunctionRef<FCurveCallback> callback)
const
292 bool is_changed =
false;
294 if (this->fcurve_foreach_in_action(nla_strip.
act, callback)) {
300 const bool local_is_changed = this->nla_strip_fcurve_foreach(*nla_strip_children, callback);
301 is_changed = is_changed || local_is_changed;
306 bool animdata_fcurve_foreach(
AnimData &anim_data,
307 blender::FunctionRef<FCurveCallback> callback)
const
309 bool is_changed =
false;
311 if (this->fcurve_foreach_in_action(anim_data.
action, callback)) {
317 if (this->fcurve_foreach_in_action(anim_data.
tmpact, callback)) {
324 const bool local_is_changed = this->fcurve_foreach_in_listbase(anim_data.
drivers, callback);
325 is_changed = is_changed || local_is_changed;
331 if (this->skip_nla) {
337 const bool local_is_changed = this->nla_strip_fcurve_foreach(*nla_strip, callback);
338 is_changed = is_changed || local_is_changed;
344 bool action_process(
bAction &action, blender::FunctionRef<ActionCallback> callback)
const
346 if (callback(action)) {
353 bool nla_strip_action_foreach(
NlaStrip &nla_strip,
354 blender::FunctionRef<ActionCallback> callback)
const
356 bool is_changed =
false;
358 is_changed = action_process(*nla_strip.
act, callback);
361 is_changed = is_changed || this->nla_strip_action_foreach(*nla_strip_children, callback);
366 bool animdata_action_foreach(
AnimData &anim_data,
367 blender::FunctionRef<ActionCallback> callback)
const
369 bool is_changed =
false;
372 is_changed = is_changed || action_process(*anim_data.
action, callback);
375 is_changed = is_changed || action_process(*anim_data.
tmpact, callback);
381 if (this->skip_nla) {
387 is_changed = is_changed || this->nla_strip_action_foreach(*nla_strip, callback);
400 if (!this->is_valid()) {
404 if (
GS(id_src.name) !=
GS(id_dst.name)) {
408 bool has_animation =
false;
409 auto animation_detection_cb = [&](
bAction *owner_action,
FCurve &fcurve) ->
bool {
414 if (!this->animation_fcurve_is_valid(owner_action, fcurve)) {
417 if (this->fcurve_convertors.
is_empty()) {
418 has_animation =
true;
423 const std::string rna_path_src = fmt::format(
424 "{}{}", this->root_path_src, fcurve_convertor.relative_rna_path_src);
425 if (rna_path == rna_path_src) {
426 has_animation =
true;
433 this->animdata_fcurve_foreach(*this->animdata_src, animation_detection_cb);
434 return has_animation;
445 if (!this->is_valid()) {
452 const std::string &rna_path_dst) {
454 fcurve.rna_path =
BLI_strdupn(rna_path_dst.c_str(), rna_path_dst.size());
455 if (fcurve_convertor && fcurve_convertor->
convert_cb) {
458 this->has_changes =
true;
460 if (!this->is_transfer_between_ids) {
464 if (owner_action == this->animdata_src->
action) {
465 this->fcurves_from_src_main_action.
append(&fcurve);
467 else if (owner_action == this->animdata_src->
tmpact) {
468 this->fcurves_from_src_tmp_action.
append(&fcurve);
472 this->fcurves_from_src_drivers.
append(&fcurve);
477 if (this->fcurve_convertors.
is_empty()) {
478 auto fcurve_root_path_convert_cb = [&](
bAction *owner_action,
FCurve &fcurve) ->
bool {
479 if (!legacy_fcurves_is_valid_for_root_path(fcurve, this->root_path_src)) {
483 const std::string rna_path_dst = fmt::format(
484 "{}{}", this->root_path_dst, rna_path.
substr(
int64_t(this->root_path_src.size())));
485 fcurve_convert_cb(
nullptr, owner_action, fcurve, rna_path_dst);
489 this->animdata_fcurve_foreach(*(this->animdata_src), fcurve_root_path_convert_cb);
495 auto fcurve_full_path_convert_cb = [&](
bAction *owner_action,
FCurve &fcurve) ->
bool {
496 if (!animation_fcurve_is_valid(owner_action, fcurve)) {
501 const std::string rna_path_src = fmt::format(
503 if (rna_path == rna_path_src) {
504 const std::string rna_path_dst = fmt::format(
506 fcurve_convert_cb(&fcurve_convertor, owner_action, fcurve, rna_path_dst);
513 this->animdata_fcurve_foreach(*(this->animdata_src), fcurve_full_path_convert_cb);
528 if (!this->is_valid()) {
535 if (!this->animdata_dst) {
538 auto actions_idroot_ensure = [&](
bAction &action) ->
bool {
542 this->animdata_action_foreach(*this->animdata_dst, actions_idroot_ensure);
545 if (&id_src == &id_dst) {
546 if (this->has_changes) {
553 if (this->fcurves_from_src_main_action.
is_empty() &&
554 this->fcurves_from_src_tmp_action.is_empty() && this->fcurves_from_src_drivers.is_empty())
558 if (!this->animdata_dst) {
562 auto fcurves_move = [&](
bAction *action_dst,
566 for (
FCurve *fcurve : fcurves) {
568 action_dst->wrap(), slot_handle_dst, action_src->wrap(), *fcurve);
572 auto fcurves_move_between_listbases =
574 for (
FCurve *fcurve : fcurves) {
581 if (!this->fcurves_from_src_main_action.
is_empty()) {
582 if (!this->animdata_dst->
action) {
585 this->conversion_data.
bmain,
586 this->animdata_src->action ? this->animdata_src->action->id.name + 2 :
nullptr);
591 BLI_assert_msg(ok,
"Expecting action assignment to work when converting Grease Pencil");
594 fcurves_move(this->animdata_dst->
action,
595 this->animdata_dst->slot_handle,
596 this->animdata_src->action,
597 this->fcurves_from_src_main_action);
598 this->fcurves_from_src_main_action.
clear();
600 if (!this->fcurves_from_src_tmp_action.
is_empty()) {
601 if (!this->animdata_dst->
tmpact) {
604 this->conversion_data.
bmain,
605 this->animdata_src->tmpact ? this->animdata_src->tmpact->id.name + 2 :
nullptr);
610 BLI_assert_msg(ok,
"Expecting tmpact assignment to work when converting Grease Pencil");
613 fcurves_move(this->animdata_dst->
tmpact,
614 this->animdata_dst->tmp_slot_handle,
615 this->animdata_src->tmpact,
616 this->fcurves_from_src_tmp_action);
617 this->fcurves_from_src_tmp_action.
clear();
619 if (!this->fcurves_from_src_drivers.
is_empty()) {
620 fcurves_move_between_listbases(this->animdata_dst->
drivers,
621 this->animdata_src->drivers,
622 this->fcurves_from_src_drivers);
623 this->fcurves_from_src_drivers.
clear();
642 const int num_vertex_groups,
646 Array<int> is_group_used(num_vertex_groups,
false);
654 if (weight.def_nr >= num_vertex_groups) {
658 is_group_used[weight.def_nr] =
true;
667 if (!is_group_used[old_group_i]) {
668 r_indices[old_group_i] = -1;
671 r_indices[old_group_i] = new_group_i++;
674 BLI_addtail(&r_vertex_group_names, def_group_copy);
682 const float uv_rotation,
694 const float2 diagonal = maxv - minv;
695 const float sin_rotation = sin(uv_rotation);
696 const float cos_rotation =
cos(uv_rotation);
698 float2(-sin_rotation, cos_rotation));
703 texture_matrix[2] -= minv;
707 texture_matrix[2] += uv_translation;
710 texture_matrix[2] -= center;
711 texture_matrix = rotation * texture_matrix;
712 texture_matrix[2] += center;
717 return texture_matrix;
747 const float3 local_3 = (totpoints == 2) ? (pt3 * 0.001f) - pt0 : pt3 - pt0;
779 strokemat4x3[2][2] = 0.0f;
780 strokemat4x3[3][2] = 1.0f;
782 return texture_matrix * strokemat4x3;
797 bool has_bezier_stroke =
false;
803 if (gps->editcurve->tot_curve_points == 0) {
806 has_bezier_stroke =
true;
807 num_points += gps->editcurve->tot_curve_points;
811 if (gps->totpoints == 0) {
814 num_points += gps->totpoints;
818 offsets.
append(num_points);
822 if (num_strokes == 0) {
828 curves.resize(num_points, num_strokes);
829 curves.offsets_for_write().copy_from(offsets);
834 if (!has_bezier_stroke) {
839 curves.curve_types_for_write().copy_from(curve_types);
840 curves.update_curve_types();
848 gpf, vertex_group_names, num_vertex_groups, stroke_vertex_group_names, stroke_def_nr_map);
850 curves.vertex_group_names = stroke_vertex_group_names;
855 dst_dvert = src_dvert;
859 if (weight.def_nr >= num_vertex_groups) {
864 weight.def_nr = stroke_def_nr_map[weight.def_nr];
871 curves.handle_positions_left_for_write() :
874 curves.handle_positions_right_for_write() :
912 if (gps->totpoints == 0 ||
913 (gps->editcurve !=
nullptr && gps->editcurve->tot_curve_points == 0))
920 stroke_init_times.span[stroke_i] =
float(
uint32_t(gps->inittime *
double(1e3))) /
float(1e3);
921 stroke_start_caps.span[stroke_i] =
int8_t(gps->caps[0]);
922 stroke_end_caps.span[stroke_i] =
int8_t(gps->caps[1]);
923 stroke_softness.span[stroke_i] = 1.0f - gps->hardness;
924 stroke_point_aspect_ratios.span[stroke_i] = gps->aspect_ratio[0] /
925 max_ff(gps->aspect_ratio[1], 1
e-8);
927 stroke_materials.
span[stroke_i] = gps->mat_nr;
929 const IndexRange points = points_by_curve[stroke_i];
934 handle_positions_left.
slice(points) :
937 handle_positions_right.
slice(points) :
952 for (const int point_i : range) {
953 const bGPDspoint &pt = src_points[point_i];
954 dst_positions[point_i] = float3(pt.x, pt.y, pt.z);
955 dst_radii[point_i] = stroke_thickness * pt.pressure;
956 dst_opacities[point_i] = pt.strength;
957 dst_deltatimes[point_i] = pt.time;
958 dst_rotations[point_i] = pt.uv_rot;
959 dst_vertex_colors[point_i] = ColorGeometry4f(pt.vert_color);
960 dst_selection[point_i] = (pt.flag & GP_SPOINT_SELECT) != 0;
961 if (use_dverts && gps->dvert) {
962 copy_dvert(gps->dvert[point_i], dst_dverts[point_i]);
969 BLI_assert(points.size() == gps->editcurve->tot_curve_points);
971 gps->editcurve->tot_curve_points};
974 for (const int point_i : range) {
975 const bGPDcurve_point &cpt = src_curve_points[point_i];
976 dst_positions[point_i] = float3(cpt.bezt.vec[1]);
977 dst_handle_positions_left[point_i] = float3(cpt.bezt.vec[0]);
978 dst_handle_positions_right[point_i] = float3(cpt.bezt.vec[2]);
979 dst_radii[point_i] = stroke_thickness * cpt.pressure;
980 dst_opacities[point_i] = cpt.strength;
981 dst_rotations[point_i] = cpt.uv_rot;
982 dst_vertex_colors[point_i] = ColorGeometry4f(cpt.vert_color);
983 dst_selection[point_i] = (cpt.flag & GP_CURVE_POINT_SELECT) != 0;
984 if (use_dverts && gps->dvert) {
985 copy_dvert(gps->dvert[point_i], dst_dverts[point_i]);
996 legacy_texture_matrices[stroke_i] = legacy_texture_matrix;
1002 curves.tag_normals_changed();
1003 drawing.set_texture_matrices(legacy_texture_matrices.as_span(), curves.curves_range());
1005 delta_times.finish();
1009 stroke_cyclic.finish();
1010 stroke_init_times.finish();
1011 stroke_start_caps.finish();
1012 stroke_end_caps.finish();
1013 stroke_softness.finish();
1014 stroke_point_aspect_ratios.finish();
1015 stroke_materials.finish();
1047 Layer &new_layer = grease_pencil.add_layer(
1085 LayerMask *new_mask = MEM_new<LayerMask>(__func__,
mask->name);
1089 new_layer.
opacity = gpl->opacity;
1092 Drawing *dst_drawing = grease_pencil.insert_frame(
1094 if (dst_drawing ==
nullptr) {
1109 grease_pencil.set_active_layer(&new_layer);
1123 layer_passes.
span[layer_idx] =
int(gpl->pass_index);
1168 conversion_data, grease_pencil.
id, gpd.
id, {{
".location",
".translation"}});
1169 for (
const Layer *layer_iter : grease_pencil.layers()) {
1171 char layer_name_esc[
sizeof((
bGPDlayer{}).info) * 2];
1172 BLI_str_escape(layer_name_esc, layer_iter->name().c_str(),
sizeof(layer_name_esc));
1173 std::string layer_root_path = fmt::format(
"layers[\"{}\"]", layer_name_esc);
1174 animdata_gpdata_transfer.root_path_dst = layer_root_path;
1175 animdata_gpdata_transfer.root_path_src = layer_root_path;
1176 animdata_gpdata_transfer.fcurves_convert();
1178 animdata_gpdata_transfer.fcurves_convert_finalize();
1205 radius_offset_data.min = -
FLT_MAX;
1206 radius_offset_data.max =
FLT_MAX;
1212 group_output->
locx = 800;
1213 group_output->
locy = 160;
1215 group_input->
locx = 0;
1216 group_input->
locy = 160;
1219 set_curve_radius->
locx = 600;
1220 set_curve_radius->
locy = 160;
1222 nullptr, group,
"GeometryNodeInputNamedLayerSelection");
1223 named_layer_selection->
locx = 200;
1224 named_layer_selection->
locy = 100;
1226 input_radius->
locx = 0;
1227 input_radius->
locy = 0;
1235 clamp_radius->
locx = 400;
1236 clamp_radius->
locy = 0;
1254 named_layer_selection,
1257 named_layer_selection,
1295 conversion_data, dst_object.
id, src_object_data.
id, {{
"pixel_factor",
".thickness_factor"}});
1298 const float thickness_factor = src_object_data.pixfactor;
1299 const bool has_thickness_factor_animation =
1300 animdata_thickness_transfer.source_has_animation_to_convert();
1301 const bool has_thickness_factor = thickness_factor != 1.0f || has_thickness_factor_animation;
1303 if (!has_thickness_factor) {
1318 if (has_thickness_factor_animation) {
1319 char modifier_name_esc[
MAX_NAME * 2];
1321 animdata_thickness_transfer.root_path_dst = fmt::format(
"modifiers[\"{}\"]",
1324 animdata_thickness_transfer.fcurves_convert();
1327 animdata_thickness_transfer.fcurves_convert_finalize();
1372 animdata_convert_thickness.root_path_src = fmt::format(
"modifiers[\"{}\"]",
modifier_name);
1373 animdata_convert_thickness.root_path_dst = fmt::format(
"modifiers[\"{}\"]",
modifier_name);
1375 if (!animdata_convert_thickness.source_has_animation_to_convert()) {
1378 animdata_convert_thickness.fcurves_convert();
1381 animdata_convert_thickness.fcurves_convert_finalize();
1395 {{
".tint_color",
".color"}, {
".tint_factor",
".factor"}});
1397 AnimDataConvertor animdata_thickness_transfer(
1401 {{
".line_change",
"[\"Socket_2\"]", fcurve_convert_thickness_cb}});
1406 const float tint_factor = gpl->tintcolor[3];
1407 const int thickness_px = gpl->line_change;
1409 char layer_name_esc[
sizeof(gpl->info) * 2];
1410 BLI_str_escape(layer_name_esc, gpl->info,
sizeof(layer_name_esc));
1411 animdata_tint_transfer.root_path_src = fmt::format(
"layers[\"{}\"]", layer_name_esc);
1412 animdata_thickness_transfer.root_path_src = fmt::format(
"layers[\"{}\"]", layer_name_esc);
1414 const bool has_tint_adjustment_animation =
1415 animdata_tint_transfer.source_has_animation_to_convert();
1416 const bool has_thickness_adjustment_animation =
1417 animdata_thickness_transfer.source_has_animation_to_convert();
1420 const bool has_tint_adjustment = tint_factor > 0.0f || has_tint_adjustment_animation;
1421 const bool has_thickness_adjustment = thickness_px != 0 || has_thickness_adjustment_animation;
1424 if (has_tint_adjustment) {
1429 tmd->
factor = tint_factor;
1440 if (has_tint_adjustment_animation) {
1441 char modifier_name_esc[
MAX_NAME * 2];
1443 animdata_tint_transfer.root_path_dst = fmt::format(
"modifiers[\"{}\"]", modifier_name_esc);
1445 animdata_tint_transfer.fcurves_convert();
1449 if (has_thickness_adjustment) {
1457 const auto offset_radius_ntree_ensure = [&](
Library *owner_library) {
1467 if (ntree_iter->id.lib != owner_library) {
1470 if (
STREQ(ntree_iter->id.name + 2, OFFSET_RADIUS_NODETREE_NAME)) {
1482 bNodeTree *offset_radius_node_tree = offset_radius_ntree_ensure(dst_object.id.lib);
1490 md->node_group = offset_radius_node_tree;
1506 if (has_thickness_adjustment_animation) {
1507 char modifier_name_esc[
MAX_NAME * 2];
1509 animdata_thickness_transfer.root_path_dst = fmt::format(
"modifiers[\"{}\"]",
1512 animdata_thickness_transfer.fcurves_convert();
1517 animdata_tint_transfer.fcurves_convert_finalize();
1518 animdata_thickness_transfer.fcurves_convert_finalize();
1536 for (md =
static_cast<ModifierData *
>(
object.modifiers.first);
1548 if (legacy_md.
name[0]) {
1564 char legacy_name_esc[
MAX_NAME * 2];
1566 anim_convertor.
root_path_src = fmt::format(
"grease_pencil_modifiers[\"{}\"]", legacy_name_esc);
1570 anim_convertor.
root_path_dst = fmt::format(
"modifiers[\"{}\"]", new_name_esc);
1581 const int layer_pass,
1582 const bool invert_layer,
1583 const bool invert_layer_pass,
1585 const int material_pass,
1586 const bool invert_material,
1587 const bool invert_material_pass,
1589 const bool invert_vertex_group,
1591 const bool use_custom_curve)
1600 if (layer_pass > 0) {
1603 if (invert_layer_pass) {
1609 *material =
nullptr;
1611 if (invert_material) {
1615 if (material_pass > 0) {
1618 if (invert_material_pass) {
1623 if (invert_vertex_group) {
1632 *custom_curve =
nullptr;
1634 if (use_custom_curve) {
1648 md_armature.
object = legacy_md_armature.object;
1649 legacy_md_armature.object =
nullptr;
1650 md_armature.deformflag = legacy_md_armature.deformflag;
1661 legacy_md_armature.vgname,
1676 md_array.
object = legacy_md_array.object;
1677 legacy_md_array.object =
nullptr;
1678 md_array.count = legacy_md_array.count;
1692 copy_v3_v3(md_array.offset, legacy_md_array.offset);
1693 copy_v3_v3(md_array.shift, legacy_md_array.shift);
1694 copy_v3_v3(md_array.rnd_offset, legacy_md_array.rnd_offset);
1695 copy_v3_v3(md_array.rnd_rot, legacy_md_array.rnd_rot);
1696 copy_v3_v3(md_array.rnd_scale, legacy_md_array.rnd_scale);
1697 md_array.seed = legacy_md_array.seed;
1698 md_array.mat_rpl = legacy_md_array.mat_rpl;
1701 legacy_md_array.layername,
1702 legacy_md_array.layer_pass,
1705 &legacy_md_array.material,
1706 legacy_md_array.pass_index,
1738 copy_v3_v3(md_color.hsv, legacy_md_color.hsv);
1741 legacy_md_color.layername,
1742 legacy_md_color.layer_pass,
1745 &legacy_md_color.material,
1746 legacy_md_color.pass_index,
1751 &legacy_md_color.curve_intensity,
1765 md_dash.segment_active_index = legacy_md_dash.segment_active_index;
1766 md_dash.segments_num = legacy_md_dash.segments_len;
1768 md_dash.segments_array = MEM_cnew_array<GreasePencilDashModifierSegment>(
1769 legacy_md_dash.segments_len, __func__);
1770 for (
const int i :
IndexRange(md_dash.segments_num)) {
1774 dst_segment.
flag = 0;
1778 dst_segment.
dash = src_segment.
dash;
1779 dst_segment.
gap = src_segment.
gap;
1786 legacy_md_dash.layername,
1787 legacy_md_dash.layer_pass,
1790 &legacy_md_dash.material,
1791 legacy_md_dash.pass_index,
1820 md_envelope.
mat_nr = legacy_md_envelope.mat_nr;
1821 md_envelope.thickness = legacy_md_envelope.thickness;
1822 md_envelope.strength = legacy_md_envelope.strength;
1823 md_envelope.skip = legacy_md_envelope.skip;
1824 md_envelope.spread = legacy_md_envelope.spread;
1827 legacy_md_envelope.layername,
1828 legacy_md_envelope.layer_pass,
1831 &legacy_md_envelope.material,
1832 legacy_md_envelope.pass_index,
1835 legacy_md_envelope.vgname,
1883 md_hook.object = legacy_md_hook.object;
1884 legacy_md_hook.object =
nullptr;
1885 STRNCPY(md_hook.subtarget, legacy_md_hook.subtarget);
1886 copy_m4_m4(md_hook.parentinv, legacy_md_hook.parentinv);
1887 copy_v3_v3(md_hook.cent, legacy_md_hook.cent);
1888 md_hook.falloff = legacy_md_hook.falloff;
1889 md_hook.force = legacy_md_hook.force;
1892 legacy_md_hook.layername,
1893 legacy_md_hook.layer_pass,
1896 &legacy_md_hook.material,
1897 legacy_md_hook.pass_index,
1900 legacy_md_hook.vgname,
1902 &legacy_md_hook.curfalloff,
1915 md_lattice.
object = legacy_md_lattice.object;
1916 legacy_md_lattice.object =
nullptr;
1917 md_lattice.strength = legacy_md_lattice.strength;
1920 legacy_md_lattice.layername,
1921 legacy_md_lattice.layer_pass,
1924 &legacy_md_lattice.material,
1925 legacy_md_lattice.pass_index,
1928 legacy_md_lattice.vgname,
1943 md_length.
flag = legacy_md_length.flag;
1944 md_length.start_fac = legacy_md_length.start_fac;
1945 md_length.end_fac = legacy_md_length.end_fac;
1946 md_length.rand_start_fac = legacy_md_length.rand_start_fac;
1947 md_length.rand_end_fac = legacy_md_length.rand_end_fac;
1948 md_length.rand_offset = legacy_md_length.rand_offset;
1949 md_length.overshoot_fac = legacy_md_length.overshoot_fac;
1950 md_length.seed = legacy_md_length.seed;
1951 md_length.step = legacy_md_length.step;
1952 md_length.mode = legacy_md_length.mode;
1953 md_length.point_density = legacy_md_length.point_density;
1954 md_length.segment_influence = legacy_md_length.segment_influence;
1955 md_length.max_angle = legacy_md_length.max_angle;
1958 legacy_md_length.layername,
1959 legacy_md_length.layer_pass,
1962 &legacy_md_length.material,
1963 legacy_md_length.pass_index,
1981 md_mirror.
object = legacy_md_mirror.object;
1982 legacy_md_mirror.object =
nullptr;
1995 legacy_md_mirror.layername,
1996 legacy_md_mirror.layer_pass,
1999 &legacy_md_mirror.material,
2000 legacy_md_mirror.pass_index,
2018 md_multiply.
flag = 0;
2022 md_multiply.duplications = legacy_md_multiply.duplications;
2023 md_multiply.distance = legacy_md_multiply.distance;
2024 md_multiply.offset = legacy_md_multiply.offset;
2025 md_multiply.fading_center = legacy_md_multiply.fading_center;
2026 md_multiply.fading_thickness = legacy_md_multiply.fading_thickness;
2027 md_multiply.fading_opacity = legacy_md_multiply.fading_opacity;
2032 legacy_md_multiply.layername,
2033 legacy_md_multiply.layer_pass,
2036 &legacy_md_multiply.material,
2037 legacy_md_multiply.pass_index,
2055 md_noise.
flag = legacy_md_noise.flag;
2056 md_noise.factor = legacy_md_noise.factor;
2057 md_noise.factor_strength = legacy_md_noise.factor_strength;
2058 md_noise.factor_thickness = legacy_md_noise.factor_thickness;
2059 md_noise.factor_uvs = legacy_md_noise.factor_uvs;
2060 md_noise.noise_scale = legacy_md_noise.noise_scale;
2061 md_noise.noise_offset = legacy_md_noise.noise_offset;
2062 md_noise.noise_mode = legacy_md_noise.noise_mode;
2063 md_noise.step = legacy_md_noise.step;
2064 md_noise.seed = legacy_md_noise.seed;
2067 legacy_md_noise.layername,
2068 legacy_md_noise.layer_pass,
2071 &legacy_md_noise.material,
2072 legacy_md_noise.pass_index,
2075 legacy_md_noise.vgname,
2077 &legacy_md_noise.curve_intensity,
2108 copy_v3_v3(md_offset.loc, legacy_md_offset.loc);
2109 copy_v3_v3(md_offset.rot, legacy_md_offset.rot);
2110 copy_v3_v3(md_offset.scale, legacy_md_offset.scale);
2111 copy_v3_v3(md_offset.stroke_loc, legacy_md_offset.rnd_offset);
2112 copy_v3_v3(md_offset.stroke_rot, legacy_md_offset.rnd_rot);
2113 copy_v3_v3(md_offset.stroke_scale, legacy_md_offset.rnd_scale);
2114 md_offset.seed = legacy_md_offset.seed;
2115 md_offset.stroke_step = legacy_md_offset.stroke_step;
2116 md_offset.stroke_start_offset = legacy_md_offset.stroke_start_offset;
2119 legacy_md_offset.layername,
2120 legacy_md_offset.layer_pass,
2123 &legacy_md_offset.material,
2124 legacy_md_offset.pass_index,
2127 legacy_md_offset.vgname,
2142 md_opacity.
flag = 0;
2163 md_opacity.color_factor = legacy_md_opacity.factor;
2164 md_opacity.hardness_factor = legacy_md_opacity.hardness;
2167 legacy_md_opacity.layername,
2168 legacy_md_opacity.layer_pass,
2171 &legacy_md_opacity.material,
2172 legacy_md_opacity.pass_index,
2175 legacy_md_opacity.vgname,
2177 &legacy_md_opacity.curve_intensity,
2190 md_outline.
flag = 0;
2194 md_outline.object = legacy_md_outline.object;
2195 legacy_md_outline.object =
nullptr;
2196 md_outline.outline_material = legacy_md_outline.outline_material;
2197 legacy_md_outline.outline_material =
nullptr;
2198 md_outline.sample_length = legacy_md_outline.sample_length;
2199 md_outline.subdiv = legacy_md_outline.subdiv;
2200 md_outline.thickness = legacy_md_outline.thickness;
2203 legacy_md_outline.layername,
2204 legacy_md_outline.layer_pass,
2207 &legacy_md_outline.material,
2208 legacy_md_outline.pass_index,
2228 md_shrinkwrap.
shrink_type = legacy_md_shrinkwrap.shrink_type;
2230 md_shrinkwrap.shrink_opts = legacy_md_shrinkwrap.shrink_opts;
2232 md_shrinkwrap.shrink_mode = legacy_md_shrinkwrap.shrink_mode;
2234 md_shrinkwrap.proj_axis = legacy_md_shrinkwrap.proj_axis;
2236 md_shrinkwrap.target = legacy_md_shrinkwrap.target;
2237 legacy_md_shrinkwrap.target =
nullptr;
2238 md_shrinkwrap.aux_target = legacy_md_shrinkwrap.aux_target;
2239 legacy_md_shrinkwrap.aux_target =
nullptr;
2240 md_shrinkwrap.keep_dist = legacy_md_shrinkwrap.keep_dist;
2241 md_shrinkwrap.proj_limit = legacy_md_shrinkwrap.proj_limit;
2242 md_shrinkwrap.subsurf_levels = legacy_md_shrinkwrap.subsurf_levels;
2243 md_shrinkwrap.smooth_factor = legacy_md_shrinkwrap.smooth_factor;
2244 md_shrinkwrap.smooth_step = legacy_md_shrinkwrap.smooth_step;
2247 legacy_md_shrinkwrap.layername,
2248 legacy_md_shrinkwrap.layer_pass,
2251 &legacy_md_shrinkwrap.material,
2252 legacy_md_shrinkwrap.pass_index,
2255 legacy_md_shrinkwrap.vgname,
2286 md_smooth.factor = legacy_md_smooth.factor;
2287 md_smooth.step = legacy_md_smooth.step;
2290 legacy_md_smooth.layername,
2291 legacy_md_smooth.layer_pass,
2294 &legacy_md_smooth.material,
2295 legacy_md_smooth.pass_index,
2298 legacy_md_smooth.vgname,
2300 &legacy_md_smooth.curve_intensity,
2321 md_subdiv.
level = legacy_md_subdiv.level;
2324 legacy_md_subdiv.layername,
2325 legacy_md_subdiv.layer_pass,
2328 &legacy_md_subdiv.material,
2329 legacy_md_subdiv.pass_index,
2366 md_texture.
uv_offset = legacy_md_texture.uv_offset;
2367 md_texture.uv_scale = legacy_md_texture.uv_scale;
2368 md_texture.fill_rotation = legacy_md_texture.fill_rotation;
2369 copy_v2_v2(md_texture.fill_offset, legacy_md_texture.fill_offset);
2370 md_texture.fill_scale = legacy_md_texture.fill_scale;
2371 md_texture.layer_pass = legacy_md_texture.layer_pass;
2372 md_texture.alignment_rotation = legacy_md_texture.alignment_rotation;
2375 legacy_md_texture.layername,
2376 legacy_md_texture.layer_pass,
2379 &legacy_md_texture.material,
2380 legacy_md_texture.pass_index,
2383 legacy_md_texture.vgname,
2398 md_thickness.
flag = 0;
2405 md_thickness.thickness_fac = legacy_md_thickness.thickness_fac;
2409 legacy_md_thickness.layername,
2410 legacy_md_thickness.layer_pass,
2413 &legacy_md_thickness.material,
2414 legacy_md_thickness.pass_index,
2417 legacy_md_thickness.vgname,
2419 &legacy_md_thickness.curve_thickness,
2456 md_time.offset = legacy_md_time.offset;
2457 md_time.frame_scale = legacy_md_time.frame_scale;
2458 md_time.sfra = legacy_md_time.sfra;
2459 md_time.efra = legacy_md_time.efra;
2460 md_time.segment_active_index = legacy_md_time.segment_active_index;
2461 md_time.segments_num = legacy_md_time.segments_len;
2463 md_time.segments_array = MEM_cnew_array<GreasePencilTimeModifierSegment>(
2464 legacy_md_time.segments_len, __func__);
2465 for (
const int i :
IndexRange(md_time.segments_num)) {
2487 legacy_md_time.layername,
2488 legacy_md_time.layer_pass,
2533 md_tint.factor = legacy_md_tint.factor;
2534 md_tint.radius = legacy_md_tint.radius;
2535 copy_v3_v3(md_tint.color, legacy_md_tint.rgb);
2536 md_tint.object = legacy_md_tint.object;
2537 legacy_md_tint.object =
nullptr;
2539 md_tint.color_ramp = legacy_md_tint.colorband;
2540 legacy_md_tint.colorband =
nullptr;
2543 legacy_md_tint.layername,
2544 legacy_md_tint.layer_pass,
2547 &legacy_md_tint.material,
2548 legacy_md_tint.pass_index,
2551 legacy_md_tint.vgname,
2553 &legacy_md_tint.curve_intensity,
2566 md_weight_angle.
flag = 0;
2581 md_weight_angle.axis = legacy_md_weight_angle.axis;
2582 STRNCPY(md_weight_angle.target_vgname, legacy_md_weight_angle.target_vgname);
2583 md_weight_angle.min_weight = legacy_md_weight_angle.min_weight;
2584 md_weight_angle.angle = legacy_md_weight_angle.angle;
2587 legacy_md_weight_angle.layername,
2588 legacy_md_weight_angle.layer_pass,
2591 &legacy_md_weight_angle.material,
2592 legacy_md_weight_angle.pass_index,
2595 legacy_md_weight_angle.vgname,
2610 md_weight_prox.
flag = 0;
2617 STRNCPY(md_weight_prox.target_vgname, legacy_md_weight_prox.target_vgname);
2618 md_weight_prox.min_weight = legacy_md_weight_prox.min_weight;
2619 md_weight_prox.dist_start = legacy_md_weight_prox.dist_start;
2620 md_weight_prox.dist_end = legacy_md_weight_prox.dist_end;
2621 md_weight_prox.object = legacy_md_weight_prox.object;
2622 legacy_md_weight_prox.object =
nullptr;
2625 legacy_md_weight_prox.layername,
2626 legacy_md_weight_prox.layer_pass,
2629 &legacy_md_weight_prox.material,
2630 legacy_md_weight_prox.pass_index,
2633 legacy_md_weight_prox.vgname,
2668 switch (legacy_md_build.mode) {
2681 switch (legacy_md_build.time_alignment) {
2691 switch (legacy_md_build.time_mode) {
2704 switch (legacy_md_build.transition) {
2717 md_build.start_frame = legacy_md_build.start_frame;
2718 md_build.end_frame = legacy_md_build.end_frame;
2719 md_build.start_delay = legacy_md_build.start_delay;
2720 md_build.length = legacy_md_build.length;
2721 md_build.fade_fac = legacy_md_build.fade_fac;
2722 md_build.fade_opacity_strength = legacy_md_build.fade_opacity_strength;
2723 md_build.fade_thickness_strength = legacy_md_build.fade_thickness_strength;
2724 md_build.percentage_fac = legacy_md_build.percentage_fac;
2725 md_build.speed_fac = legacy_md_build.speed_fac;
2726 md_build.speed_maxgap = legacy_md_build.speed_maxgap;
2727 md_build.object = legacy_md_build.object;
2728 STRNCPY(md_build.target_vgname, legacy_md_build.target_vgname);
2731 legacy_md_build.layername,
2732 legacy_md_build.layer_pass,
2735 &legacy_md_build.material,
2736 legacy_md_build.pass_index,
2739 legacy_md_build.target_vgname,
2754 switch (legacy_md_simplify.mode) {
2769 md_simplify.
step = legacy_md_simplify.step;
2770 md_simplify.factor = legacy_md_simplify.factor;
2771 md_simplify.length = legacy_md_simplify.length;
2772 md_simplify.sharp_threshold = legacy_md_simplify.sharp_threshold;
2773 md_simplify.distance = legacy_md_simplify.distance;
2776 legacy_md_simplify.layername,
2777 legacy_md_simplify.layer_pass,
2780 &legacy_md_simplify.material,
2781 legacy_md_simplify.pass_index,
2797 switch (gpd_md->type) {
2924 object_gpv2.
add(legacy_gpd);
2930 auto sanitize_gpv2_annotation = [&](
bGPdata **legacy_gpd_p) {
2931 bGPdata *legacy_gpd = *legacy_gpd_p;
2937 if (!object_gpv2.
contains(legacy_gpd)) {
2949 if (!new_annotation_gpd) {
2954 annotations_gpv2.
add_overwrite(legacy_gpd, new_annotation_gpd);
2960 *legacy_gpd_p = new_annotation_gpd;
2965 sanitize_gpv2_annotation(&scene->gpd);
2971 sanitize_gpv2_annotation(&
node_tree->gpd);
2976 sanitize_gpv2_annotation(&
node_tree->gpd);
2980 sanitize_gpv2_annotation(&movie_clip->gpd);
2984 sanitize_gpv2_annotation(&mvc_track->gpd);
2989 for (
int i = 0; i < mvc_plane_track->point_tracksnr; i++) {
2990 sanitize_gpv2_annotation(&mvc_plane_track->point_tracks[i]->gpd);
3002 sanitize_gpv2_annotation(&space_sequencer->
gpd);
3007 sanitize_gpv2_annotation(&space_image->
gpd);
3012 sanitize_gpv2_annotation(&space_node->
gpd);
3048 const bool do_gpencil_data_conversion = (new_grease_pencil ==
nullptr);
3050 if (!new_grease_pencil) {
3056 object.data = new_grease_pencil;
3063 if (do_gpencil_data_conversion) {
3110 legacy_gpd,
nullptr);
3111 if (!new_grease_pencil) {
3118 gpd_remapper.
add(&legacy_gpd->id, &new_grease_pencil->
id);
3128 ID *item_new_id = BKE_blendfile_link_append_context_item_newid_get(lapp_context, item);
3129 if (!item_new_id || GS(item_new_id->name) != ID_GD_LEGACY) {
3134 reinterpret_cast<bGPdata *
>(item_new_id));
3135 if (item_grease_pencil && *item_grease_pencil) {
3137 lapp_context, item, &(*item_grease_pencil)->id);
Functions and classes to work with Actions.
Functionality to iterate an Action in various ways.
Functions for backward compatibility with the legacy Action API.
Blender kernel action and pose functionality.
AnimData * BKE_animdata_copy_in_lib(Main *bmain, std::optional< Library * > owner_library, AnimData *adt, int flag)
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)
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)
struct ID * BKE_id_copy_in_lib(Main *bmain, std::optional< Library * > owner_library, const ID *id, const ID *new_owner_id, ID **new_id_p, int flag)
void id_us_plus_no_lib(ID *id)
@ ID_REMAP_ALLOW_IDTYPE_MISMATCH
void BKE_libblock_remap_multiple(Main *bmain, blender::bke::id::IDRemapper &mappings, const int remap_flags)
#define FOREACH_MAIN_ID_END
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
General operations, lookup, etc. for materials.
void BKE_id_materials_copy(struct Main *bmain, struct ID *id_src, struct 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_main_tree(Main *bmain, bNodeTree *ntree, NodeTreeUpdateExtraParams *params)
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)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
void * BLI_pophead(ListBase *listbase) ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT 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])
#define STRNCPY(dst, src)
char * BLI_strdupn(const char *str, size_t len) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define SNPRINTF(dst, format,...)
int char char int int int int size_t BLI_strnlen(const char *str, size_t maxlen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#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_LENGTH_INVERT_MATERIAL
@ GP_LENGTH_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_ARRAY_UNIFORM_RANDOM_SCALE
@ GP_ARRAY_INVERT_MATERIAL
@ GP_ARRAY_INVERT_LAYERPASS
@ 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_NOISE_INVERT_MATERIAL
@ GP_NOISE_INVERT_LAYERPASS
@ 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
@ 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
#define USER_EXPERIMENTAL_TEST(userdef, member)
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
btMatrix3x3 transpose() const
Return the transpose of the matrix.
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
VecBase< float, 3 > float3
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
constexpr const char * data() 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, eCustomDataType 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_parent_bone_name(const char *new_name)
void set_view_layer_name(const char *new_name)
const GreasePencilFrame * frame_at(const int frame_number) const
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)
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
static const char * modifier_name[LS_MODIFIER_NUM]
void MEM_freeN(void *vmemh)
void *(* MEM_dupallocN)(const void *vmemh)
ccl_device_inline float cross(const float2 a, const float2 b)
ccl_device_inline float3 cos(float3 v)
ccl_device_inline float4 mask(const int4 mask, const float4 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)
bool assign_tmpaction(bAction *action, OwnedAnimData owned_adt)
decltype(::ActionSlot::handle) slot_handle_t
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(StringRefNull 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(StringRefNull prop_name, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_GROUP.
bNodeTree * node_tree_add_in_lib(Main *bmain, Library *owner_library, const char *name, const char *idname)
bNodeLink * node_add_link(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
bNode * node_add_node(const bContext *C, bNodeTree *ntree, const char *idname)
bool node_set_selected(bNode *node, bool select)
bNodeTree * node_tree_from_id(ID *id)
bNodeSocket * node_find_socket(bNode *node, eNodeSocketInOut in_out, StringRef identifier)
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
GPU_SHADER_INTERFACE_INFO(overlay_edit_curve_handle_iface, "vert").flat(Type pos vertex_in(1, Type::UINT, "data") .vertex_out(overlay_edit_curve_handle_iface) .geometry_layout(PrimitiveIn Frequency::GEOMETRY storage_buf(1, Qualifier::READ, "uint", "data[]", Frequency::GEOMETRY) .push_constant(Type Frequency::GEOMETRY selection[]
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
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