Complete M16 action select circle parity
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled

This commit is contained in:
mes123456
2026-08-20 22:57:59 -04:00
parent fb5abd8e37
commit 6a0b980d75
368 changed files with 17417 additions and 117 deletions

View File

@@ -31,6 +31,7 @@
#include "BLO_core_file_reader.hh"
#include "DNA_genfile.h"
#include "DNA_anim_enums.h"
#include "DNA_curve_enums.h"
#include "DNA_lattice_types.h"
#include "DNA_mask_types.h"
@@ -1466,8 +1467,8 @@ std::string modifier_type_name(const int64_t type)
"ARRAY", "EDGE_SPLIT", "DISPLACE", "UV_PROJECT", "SMOOTH", "CAST",
"MESH_DEFORM", "PARTICLE_SYSTEM", "PARTICLE_INSTANCE", "EXPLODE", "CLOTH", "COLLISION",
"BEVEL", "SHRINKWRAP", "FLUID_SIM", "MASK", "SIMPLE_DEFORM", "MULTIRES",
"SURFACE", "UNSUPPORTED_31", "SHAPE_KEY", "SOLIDIFY", "SCREW", "WARP", "WEIGHT_VG_EDIT",
"WEIGHT_VG_MIX", "WEIGHT_VG_PROXIMITY", "OCEAN", "DYNAMIC_PAINT", "REMESH", "SKIN",
"SURFACE", "UNSUPPORTED_31", "SHAPE_KEY", "SOLIDIFY", "SCREW", "WARP", "VERTEX_WEIGHT_EDIT",
"VERTEX_WEIGHT_MIX", "VERTEX_WEIGHT_PROXIMITY", "OCEAN", "DYNAMIC_PAINT", "REMESH", "SKIN",
"LAPLACIANSMOOTH", "TRIANGULATE", "UV_WARP", "MESH_CACHE", "LAPLACIANDEFORM", "WIREFRAME",
"DATA_TRANSFER", "NORMAL_EDIT", "CORRECTIVE_SMOOTH", "MESH_SEQUENCE_CACHE", "SURFACE_DEFORM",
"WEIGHTED_NORMAL", "WELD", "FLUID", "NODES", "MESH_TO_VOLUME", "VOLUME_DISPLACE", "VOLUME_TO_MESH",
@@ -1634,8 +1635,8 @@ json modifier_parameters(const ParsedBlend &blend,
parameters["symmetryAxes"] = read_integer(*blend.sdna, modifier, "symmetry_axes").value_or(1);
break;
case 33:
parameters["thickness"] = read_float(*blend.sdna, modifier, "offset_fac").value_or(0.01f);
parameters["offset"] = read_float(*blend.sdna, modifier, "offset").value_or(-1.0f);
parameters["thickness"] = read_float(*blend.sdna, modifier, "offset").value_or(0.01f);
parameters["offset"] = read_float(*blend.sdna, modifier, "offset_fac").value_or(-1.0f);
break;
case 34:
append_target("ob_axis");
@@ -2544,6 +2545,7 @@ json fcurve_channel(const ParsedBlend &blend, const ElementRef &fcurve)
const std::optional<uint64_t> path_pointer = read_pointer(*blend.sdna, fcurve, "rna_path");
const std::string path = path_pointer ? read_raw_string(blend, *path_pointer, 2048) : std::string();
const int64_t array_index = read_integer(*blend.sdna, fcurve, "array_index").value_or(-1);
const int64_t extrapolation = read_integer(*blend.sdna, fcurve, "extend").value_or(FCURVE_EXTRAPOLATE_CONSTANT);
const std::string channel_path = path.empty() || array_index < 0 ?
path :
path + "[" + std::to_string(array_index) + "]";
@@ -2563,8 +2565,31 @@ json fcurve_channel(const ParsedBlend &blend, const ElementRef &fcurve)
const float value = values[4];
if (!std::isfinite(frame) || !std::isfinite(value)) continue;
const int interpolation = int(read_integer(*blend.sdna, *point, "ipo").value_or(2));
const bool selected = (read_integer(*blend.sdna, *point, "f2").value_or(0) & BEZT_FLAG_SELECT) != 0;
const int easing = int(read_integer(*blend.sdna, *point, "easing").value_or(BEZT_IPO_EASE_AUTO));
const int handle_left = int(read_integer(*blend.sdna, *point, "h1").value_or(HD_FREE));
const int handle_right = int(read_integer(*blend.sdna, *point, "h2").value_or(HD_FREE));
const int keyframe_type = int(read_integer(*blend.sdna, *point, "hide").value_or(BEZT_KEYTYPE_KEYFRAME));
const char *interpolation_name = interpolation == 0 ? "CONSTANT" : interpolation == 1 ? "LINEAR" : "BEZIER";
keyframes.push_back({{"frame", frame}, {"value", json::array({value})}, {"interpolation", interpolation_name}});
const char *easing_name = easing == BEZT_IPO_EASE_IN ? "EASE_IN" :
easing == BEZT_IPO_EASE_OUT ? "EASE_OUT" :
easing == BEZT_IPO_EASE_IN_OUT ? "EASE_IN_OUT" : "AUTO";
const char *handle_name = handle_left == HD_VECT && handle_right == HD_VECT ? "VECTOR" :
handle_left == HD_ALIGN && handle_right == HD_ALIGN ? "ALIGNED" :
handle_left == HD_AUTO_ANIM && handle_right == HD_AUTO_ANIM ? "AUTO_CLAMPED" :
handle_left == HD_AUTO && handle_right == HD_AUTO ? "AUTO" : "FREE";
const char *keyframe_type_name = keyframe_type == BEZT_KEYTYPE_EXTREME ? "EXTREME" :
keyframe_type == BEZT_KEYTYPE_BREAKDOWN ? "BREAKDOWN" :
keyframe_type == BEZT_KEYTYPE_JITTER ? "JITTER" :
keyframe_type == BEZT_KEYTYPE_MOVEHOLD ? "MOVING_HOLD" :
keyframe_type == BEZT_KEYTYPE_GENERATED ? "GENERATED" : "KEYFRAME";
keyframes.push_back({{"frame", frame},
{"value", json::array({value})},
{"interpolation", interpolation_name},
{"easing", easing_name},
{"handleType", handle_name},
{"keyframeType", keyframe_type_name},
{"selected", selected}});
frame_start = std::min(frame_start, frame);
frame_end = std::max(frame_end, frame);
}
@@ -2591,6 +2616,7 @@ json fcurve_channel(const ParsedBlend &blend, const ElementRef &fcurve)
}
return { {"path", channel_path},
{"interpolation", channel_interpolation.empty() ? "BEZIER" : channel_interpolation},
{"extrapolation", extrapolation == FCURVE_EXTRAPOLATE_LINEAR ? "LINEAR" : "CONSTANT"},
{"keyframes", std::move(keyframes)},
{"frameStart", std::isfinite(frame_start) ? frame_start : 0.0f},
{"frameEnd", std::isfinite(frame_end) ? frame_end : 0.0f} };
@@ -2625,6 +2651,11 @@ void append_action_animation(const ParsedBlend &blend,
if (!visited.insert(visit_key).second) return;
json channels = json::array();
json markers = json::array();
for (const ElementRef &marker : linked_list_elements(blend, *action, "markers")) {
markers.push_back({{"name", read_string(*blend.sdna, marker, "name")},
{"frame", read_integer(*blend.sdna, marker, "frame").value_or(0)}});
}
const float action_frame_start = read_float(*blend.sdna, *action, "frame_start").value_or(0.0f);
const float action_frame_end = read_float(*blend.sdna, *action, "frame_end").value_or(0.0f);
float frame_start = std::numeric_limits<float>::infinity();
@@ -2674,7 +2705,7 @@ void append_action_animation(const ParsedBlend &blend,
}
}
}
if (channels.empty()) return;
if (channels.empty() && markers.empty()) return;
json unique_channels = json::array();
std::unordered_set<std::string> channel_keys;
for (const json &channel : channels) {
@@ -2689,6 +2720,7 @@ void append_action_animation(const ParsedBlend &blend,
{"targetId", target_id},
{"frameStart", std::isfinite(frame_start) ? frame_start : 0.0f},
{"frameEnd", std::isfinite(frame_end) ? frame_end : 0.0f},
{"markers", std::move(markers)},
{"channels", std::move(channels)}});
}
@@ -4023,6 +4055,11 @@ json scene_ir_from_blend(const ParsedBlend &blend,
scene_fps = int(read_integer(*blend.sdna, *render, "frs_sec").value_or(24));
scene_fps_base = read_float(*blend.sdna, *render, "frs_sec_base").value_or(1.0f);
scene["renderEngine"] = read_string(*blend.sdna, *render, "engine");
const int64_t render_flags = read_integer(*blend.sdna, *render, "flag").value_or(0);
if ((render_flags & SCER_PRV_RANGE) != 0) {
scene["previewRange"] = {{"start", read_integer(*blend.sdna, *render, "psfra").value_or(frame_start)},
{"end", read_integer(*blend.sdna, *render, "pefra").value_or(frame_end)}};
}
}
if (const std::optional<ElementRef> units = embedded_element(*blend.sdna, element, "unit")) {
unit_system = int(read_integer(*blend.sdna, *units, "system").value_or(unit_system));