Skip to content

Commit f25676c

Browse files
committed
Merge pull request godotengine#92284 from fire/vsk-bake-fps-4.3
Add `bake_fps` for FBXDocument, GLTFDocument and both import-export.
2 parents bceebdf + 24f5600 commit f25676c

13 files changed

+76
-35
lines changed

modules/fbx/editor/editor_scene_importer_ufbx.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,15 @@ Node *EditorSceneFormatImporterUFBX::import_scene(const String &p_path, uint32_t
8080
state->set_import_as_skeleton_bones(true);
8181
}
8282
p_flags |= EditorSceneFormatImporter::IMPORT_USE_NAMED_SKIN_BINDS;
83+
state->set_bake_fps(p_options["animation/fps"]);
8384
Error err = fbx->append_from_file(path, state, p_flags, p_path.get_base_dir());
8485
if (err != OK) {
8586
if (r_err) {
8687
*r_err = FAILED;
8788
}
8889
return nullptr;
8990
}
90-
return fbx->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"], false);
91+
return fbx->generate_scene(state, state->get_bake_fps(), (bool)p_options["animation/trimming"], false);
9192
}
9293

9394
Variant EditorSceneFormatImporterUFBX::get_option_visibility(const String &p_path, bool p_for_animation,

modules/fbx/fbx_document.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1381,6 +1381,10 @@ Error FBXDocument::_parse_animations(Ref<FBXState> p_state) {
13811381
additional_data["time_end"] = fbx_anim_stack->time_end;
13821382
animation->set_additional_data("GODOT_animation_time_begin_time_end", additional_data);
13831383
ufbx_bake_opts opts = {};
1384+
opts.resample_rate = p_state->get_bake_fps();
1385+
opts.minimum_sample_rate = p_state->get_bake_fps();
1386+
opts.max_keyframe_segments = 1024;
1387+
13841388
ufbx_error error;
13851389
ufbx_unique_ptr<ufbx_baked_anim> fbx_baked_anim{ ufbx_bake_anim(fbx_scene, fbx_anim_stack->anim, &opts, &error) };
13861390
if (!fbx_baked_anim) {
@@ -1759,7 +1763,7 @@ void FBXDocument::_generate_skeleton_bone_node(Ref<FBXState> p_state, const GLTF
17591763
}
17601764
}
17611765

1762-
void FBXDocument::_import_animation(Ref<FBXState> p_state, AnimationPlayer *p_animation_player, const GLTFAnimationIndex p_index, const float p_bake_fps, const bool p_trimming, const bool p_remove_immutable_tracks) {
1766+
void FBXDocument::_import_animation(Ref<FBXState> p_state, AnimationPlayer *p_animation_player, const GLTFAnimationIndex p_index, const bool p_trimming, const bool p_remove_immutable_tracks) {
17631767
Ref<GLTFAnimation> anim = p_state->animations[p_index];
17641768

17651769
String anim_name = anim->get_name();
@@ -1771,7 +1775,7 @@ void FBXDocument::_import_animation(Ref<FBXState> p_state, AnimationPlayer *p_an
17711775
Ref<Animation> animation;
17721776
animation.instantiate();
17731777
animation->set_name(anim_name);
1774-
animation->set_step(1.0 / p_bake_fps);
1778+
animation->set_step(1.0 / p_state->get_bake_fps());
17751779

17761780
if (anim->get_loop()) {
17771781
animation->set_loop_mode(Animation::LOOP_LINEAR);
@@ -2118,6 +2122,7 @@ Node *FBXDocument::generate_scene(Ref<GLTFState> p_state, float p_bake_fps, bool
21182122
ERR_FAIL_COND_V(state.is_null(), nullptr);
21192123
ERR_FAIL_NULL_V(state, nullptr);
21202124
ERR_FAIL_INDEX_V(0, state->root_nodes.size(), nullptr);
2125+
p_state->set_bake_fps(p_bake_fps);
21212126
GLTFNodeIndex fbx_root = state->root_nodes.write[0];
21222127
Node *fbx_root_node = state->get_scene_node(fbx_root);
21232128
Node *root = fbx_root_node;
@@ -2131,7 +2136,7 @@ Node *FBXDocument::generate_scene(Ref<GLTFState> p_state, float p_bake_fps, bool
21312136
root->add_child(ap, true);
21322137
ap->set_owner(root);
21332138
for (int i = 0; i < state->animations.size(); i++) {
2134-
_import_animation(state, ap, i, p_bake_fps, p_trimming, p_remove_immutable_tracks);
2139+
_import_animation(state, ap, i, p_trimming, p_remove_immutable_tracks);
21352140
}
21362141
}
21372142
ERR_FAIL_NULL_V(root, nullptr);

modules/fbx/fbx_document.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class FBXDocument : public GLTFDocument {
9999
void _generate_scene_node(Ref<FBXState> p_state, const GLTFNodeIndex p_node_index, Node *p_scene_parent, Node *p_scene_root);
100100
void _generate_skeleton_bone_node(Ref<FBXState> p_state, const GLTFNodeIndex p_node_index, Node *p_scene_parent, Node *p_scene_root);
101101
void _import_animation(Ref<FBXState> p_state, AnimationPlayer *p_animation_player,
102-
const GLTFAnimationIndex p_index, const float p_bake_fps, const bool p_trimming, const bool p_remove_immutable_tracks);
102+
const GLTFAnimationIndex p_index, const bool p_trimming, const bool p_remove_immutable_tracks);
103103
Error _parse(Ref<FBXState> p_state, String p_path, Ref<FileAccess> p_file);
104104
};
105105

modules/gltf/doc_classes/GLTFDocument.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
<param index="3" name="remove_immutable_tracks" type="bool" default="true" />
6161
<description>
6262
Takes a [GLTFState] object through the [param state] parameter and returns a Godot Engine scene node.
63+
The [param bake_fps] parameter overrides the bake_fps in [param state].
6364
</description>
6465
</method>
6566
<method name="register_gltf_document_extension" qualifiers="static">

modules/gltf/doc_classes/GLTFState.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,9 @@
275275
</method>
276276
</methods>
277277
<members>
278+
<member name="bake_fps" type="float" setter="set_bake_fps" getter="get_bake_fps" default="30.0">
279+
The baking fps of the animation for either import or export.
280+
</member>
278281
<member name="base_path" type="String" setter="set_base_path" getter="get_base_path" default="&quot;&quot;">
279282
The folder path associated with this GLTF data. This is used to find other files the GLTF file references, like images or binary buffers. This will be set during import when appending from a file, and will be set during export when writing to a file.
280283
</member>

modules/gltf/editor/editor_scene_exporter_gltf_plugin.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ void SceneExporterGLTFPlugin::_export_scene_as_gltf(const String &p_file_path) {
107107
state->set_copyright(_export_settings->get_copyright());
108108
int32_t flags = 0;
109109
flags |= EditorSceneFormatImporter::IMPORT_USE_NAMED_SKIN_BINDS;
110+
state->set_bake_fps(_export_settings->get_bake_fps());
110111
Error err = _gltf_document->append_from_scene(root, state, flags);
111112
if (err != OK) {
112113
ERR_PRINT(vformat("glTF2 save scene error %s.", itos(err)));

modules/gltf/editor/editor_scene_exporter_gltf_settings.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,4 +182,16 @@ void EditorSceneExporterGLTFSettings::_bind_methods() {
182182
ClassDB::bind_method(D_METHOD("get_copyright"), &EditorSceneExporterGLTFSettings::get_copyright);
183183
ClassDB::bind_method(D_METHOD("set_copyright", "copyright"), &EditorSceneExporterGLTFSettings::set_copyright);
184184
ADD_PROPERTY(PropertyInfo(Variant::STRING, "copyright", PROPERTY_HINT_PLACEHOLDER_TEXT, "Example: 2014 Godette"), "set_copyright", "get_copyright");
185+
186+
ClassDB::bind_method(D_METHOD("get_bake_fps"), &EditorSceneExporterGLTFSettings::get_bake_fps);
187+
ClassDB::bind_method(D_METHOD("set_bake_fps", "bake_fps"), &EditorSceneExporterGLTFSettings::set_bake_fps);
188+
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "bake_fps"), "set_bake_fps", "get_bake_fps");
189+
}
190+
191+
double EditorSceneExporterGLTFSettings::get_bake_fps() const {
192+
return _bake_fps;
193+
}
194+
195+
void EditorSceneExporterGLTFSettings::set_bake_fps(const double p_bake_fps) {
196+
_bake_fps = p_bake_fps;
185197
}

modules/gltf/editor/editor_scene_exporter_gltf_settings.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class EditorSceneExporterGLTFSettings : public RefCounted {
4242
HashMap<String, Ref<GLTFDocumentExtension>> _config_name_to_extension_map;
4343

4444
String _copyright;
45+
double _bake_fps = 30.0;
4546

4647
protected:
4748
static void _bind_methods();
@@ -58,6 +59,9 @@ class EditorSceneExporterGLTFSettings : public RefCounted {
5859

5960
String get_copyright() const;
6061
void set_copyright(const String &p_copyright);
62+
63+
double get_bake_fps() const;
64+
void set_bake_fps(const double p_bake_fps);
6165
};
6266

6367
#endif // TOOLS_ENABLED

modules/gltf/editor/editor_scene_importer_gltf.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ Node *EditorSceneFormatImporterGLTF::import_scene(const String &p_path, uint32_t
6262
if (p_options.has(SNAME("nodes/import_as_skeleton_bones")) ? (bool)p_options[SNAME("nodes/import_as_skeleton_bones")] : false) {
6363
state->set_import_as_skeleton_bones(true);
6464
}
65+
state->set_bake_fps(p_options["animation/fps"]);
6566
Error err = gltf->append_from_file(p_path, state, p_flags);
6667
if (err != OK) {
6768
if (r_err) {
@@ -75,9 +76,9 @@ Node *EditorSceneFormatImporterGLTF::import_scene(const String &p_path, uint32_t
7576

7677
#ifndef DISABLE_DEPRECATED
7778
bool trimming = p_options.has("animation/trimming") ? (bool)p_options["animation/trimming"] : false;
78-
return gltf->generate_scene(state, (float)p_options["animation/fps"], trimming, false);
79+
return gltf->generate_scene(state, state->get_bake_fps(), trimming, false);
7980
#else
80-
return gltf->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"], false);
81+
return gltf->generate_scene(state, state->get_bake_fps(), (bool)p_options["animation/trimming"], false);
8182
#endif
8283
}
8384

modules/gltf/gltf_document.cpp

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4860,7 +4860,7 @@ Error GLTFDocument::_serialize_animations(Ref<GLTFState> p_state) {
48604860
t["sampler"] = samplers.size();
48614861
Dictionary s;
48624862
Vector<real_t> times;
4863-
const double increment = 1.0 / BAKE_FPS;
4863+
const double increment = 1.0 / p_state->get_bake_fps();
48644864
{
48654865
double time = 0.0;
48664866
bool last = false;
@@ -5902,7 +5902,8 @@ T GLTFDocument::_interpolate_track(const Vector<real_t> &p_times, const Vector<T
59025902
ERR_FAIL_V(p_values[0]);
59035903
}
59045904

5905-
void GLTFDocument::_import_animation(Ref<GLTFState> p_state, AnimationPlayer *p_animation_player, const GLTFAnimationIndex p_index, const float p_bake_fps, const bool p_trimming, const bool p_remove_immutable_tracks) {
5905+
void GLTFDocument::_import_animation(Ref<GLTFState> p_state, AnimationPlayer *p_animation_player, const GLTFAnimationIndex p_index, const bool p_trimming, const bool p_remove_immutable_tracks) {
5906+
ERR_FAIL_COND(p_state.is_null());
59065907
Ref<GLTFAnimation> anim = p_state->animations[p_index];
59075908

59085909
String anim_name = anim->get_name();
@@ -5914,7 +5915,7 @@ void GLTFDocument::_import_animation(Ref<GLTFState> p_state, AnimationPlayer *p_
59145915
Ref<Animation> animation;
59155916
animation.instantiate();
59165917
animation->set_name(anim_name);
5917-
animation->set_step(1.0 / p_bake_fps);
5918+
animation->set_step(1.0 / p_state->get_bake_fps());
59185919

59195920
if (anim->get_loop()) {
59205921
animation->set_loop_mode(Animation::LOOP_LINEAR);
@@ -6081,7 +6082,7 @@ void GLTFDocument::_import_animation(Ref<GLTFState> p_state, AnimationPlayer *p_
60816082
}
60826083
}
60836084

6084-
const double increment = 1.0 / p_bake_fps;
6085+
const double increment = 1.0 / p_state->get_bake_fps();
60856086
double time = anim_start;
60866087

60876088
Vector3 base_pos;
@@ -6158,7 +6159,7 @@ void GLTFDocument::_import_animation(Ref<GLTFState> p_state, AnimationPlayer *p_
61586159
}
61596160
} else {
61606161
// CATMULLROMSPLINE or CUBIC_SPLINE have to be baked, apologies.
6161-
const double increment = 1.0 / p_bake_fps;
6162+
const double increment = 1.0 / p_state->get_bake_fps();
61626163
double time = 0.0;
61636164
bool last = false;
61646165
while (true) {
@@ -6372,7 +6373,7 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> p_sta
63726373
p_track.scale_track.times.clear();
63736374
p_track.scale_track.values.clear();
63746375
// CATMULLROMSPLINE or CUBIC_SPLINE have to be baked, apologies.
6375-
const double increment = 1.0 / BAKE_FPS;
6376+
const double increment = 1.0 / p_state->get_bake_fps();
63766377
double time = 0.0;
63776378
bool last = false;
63786379
while (true) {
@@ -6407,7 +6408,7 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> p_sta
64076408
p_track.position_track.times.clear();
64086409
p_track.position_track.values.clear();
64096410
// CATMULLROMSPLINE or CUBIC_SPLINE have to be baked, apologies.
6410-
const double increment = 1.0 / BAKE_FPS;
6411+
const double increment = 1.0 / p_state->get_bake_fps();
64116412
double time = 0.0;
64126413
bool last = false;
64136414
while (true) {
@@ -6442,7 +6443,7 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> p_sta
64426443
p_track.rotation_track.times.clear();
64436444
p_track.rotation_track.values.clear();
64446445
// CATMULLROMSPLINE or CUBIC_SPLINE have to be baked, apologies.
6445-
const double increment = 1.0 / BAKE_FPS;
6446+
const double increment = 1.0 / p_state->get_bake_fps();
64466447
double time = 0.0;
64476448
bool last = false;
64486449
while (true) {
@@ -6482,7 +6483,7 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> p_sta
64826483
p_track.position_track.times.clear();
64836484
p_track.position_track.values.clear();
64846485
// CATMULLROMSPLINE or CUBIC_SPLINE have to be baked, apologies.
6485-
const double increment = 1.0 / BAKE_FPS;
6486+
const double increment = 1.0 / p_state->get_bake_fps();
64866487
double time = 0.0;
64876488
bool last = false;
64886489
while (true) {
@@ -6515,7 +6516,7 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> p_sta
65156516
p_track.rotation_track.times.clear();
65166517
p_track.rotation_track.values.clear();
65176518
// CATMULLROMSPLINE or CUBIC_SPLINE have to be baked, apologies.
6518-
const double increment = 1.0 / BAKE_FPS;
6519+
const double increment = 1.0 / p_state->get_bake_fps();
65196520
double time = 0.0;
65206521
bool last = false;
65216522
while (true) {
@@ -6551,7 +6552,7 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> p_sta
65516552
p_track.scale_track.times.clear();
65526553
p_track.scale_track.values.clear();
65536554
// CATMULLROMSPLINE or CUBIC_SPLINE have to be baked, apologies.
6554-
const double increment = 1.0 / BAKE_FPS;
6555+
const double increment = 1.0 / p_state->get_bake_fps();
65556556
double time = 0.0;
65566557
bool last = false;
65576558
while (true) {
@@ -6577,14 +6578,14 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> p_sta
65776578
}
65786579
}
65796580
} else if (track_type == Animation::TYPE_BEZIER) {
6580-
const int32_t keys = anim_end * BAKE_FPS;
6581+
const int32_t keys = anim_end * p_state->get_bake_fps();
65816582
if (path.contains(":scale")) {
65826583
if (!p_track.scale_track.times.size()) {
65836584
p_track.scale_track.interpolation = gltf_interpolation;
65846585
Vector<real_t> new_times;
65856586
new_times.resize(keys);
65866587
for (int32_t key_i = 0; key_i < keys; key_i++) {
6587-
new_times.write[key_i] = key_i / BAKE_FPS;
6588+
new_times.write[key_i] = key_i / p_state->get_bake_fps();
65886589
}
65896590
p_track.scale_track.times = new_times;
65906591

@@ -6597,11 +6598,11 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> p_sta
65976598
for (int32_t key_i = 0; key_i < keys; key_i++) {
65986599
Vector3 bezier_track = p_track.scale_track.values[key_i];
65996600
if (path.contains(":scale:x")) {
6600-
bezier_track.x = p_animation->bezier_track_interpolate(p_track_i, key_i / BAKE_FPS);
6601+
bezier_track.x = p_animation->bezier_track_interpolate(p_track_i, key_i / p_state->get_bake_fps());
66016602
} else if (path.contains(":scale:y")) {
6602-
bezier_track.y = p_animation->bezier_track_interpolate(p_track_i, key_i / BAKE_FPS);
6603+
bezier_track.y = p_animation->bezier_track_interpolate(p_track_i, key_i / p_state->get_bake_fps());
66036604
} else if (path.contains(":scale:z")) {
6604-
bezier_track.z = p_animation->bezier_track_interpolate(p_track_i, key_i / BAKE_FPS);
6605+
bezier_track.z = p_animation->bezier_track_interpolate(p_track_i, key_i / p_state->get_bake_fps());
66056606
}
66066607
p_track.scale_track.values.write[key_i] = bezier_track;
66076608
}
@@ -6612,7 +6613,7 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> p_sta
66126613
Vector<real_t> new_times;
66136614
new_times.resize(keys);
66146615
for (int32_t key_i = 0; key_i < keys; key_i++) {
6615-
new_times.write[key_i] = key_i / BAKE_FPS;
6616+
new_times.write[key_i] = key_i / p_state->get_bake_fps();
66166617
}
66176618
p_track.position_track.times = new_times;
66186619

@@ -6622,11 +6623,11 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> p_sta
66226623
for (int32_t key_i = 0; key_i < keys; key_i++) {
66236624
Vector3 bezier_track = p_track.position_track.values[key_i];
66246625
if (path.contains(":position:x")) {
6625-
bezier_track.x = p_animation->bezier_track_interpolate(p_track_i, key_i / BAKE_FPS);
6626+
bezier_track.x = p_animation->bezier_track_interpolate(p_track_i, key_i / p_state->get_bake_fps());
66266627
} else if (path.contains(":position:y")) {
6627-
bezier_track.y = p_animation->bezier_track_interpolate(p_track_i, key_i / BAKE_FPS);
6628+
bezier_track.y = p_animation->bezier_track_interpolate(p_track_i, key_i / p_state->get_bake_fps());
66286629
} else if (path.contains(":position:z")) {
6629-
bezier_track.z = p_animation->bezier_track_interpolate(p_track_i, key_i / BAKE_FPS);
6630+
bezier_track.z = p_animation->bezier_track_interpolate(p_track_i, key_i / p_state->get_bake_fps());
66306631
}
66316632
p_track.position_track.values.write[key_i] = bezier_track;
66326633
}
@@ -6636,7 +6637,7 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> p_sta
66366637
Vector<real_t> new_times;
66376638
new_times.resize(keys);
66386639
for (int32_t key_i = 0; key_i < keys; key_i++) {
6639-
new_times.write[key_i] = key_i / BAKE_FPS;
6640+
new_times.write[key_i] = key_i / p_state->get_bake_fps();
66406641
}
66416642
p_track.rotation_track.times = new_times;
66426643

@@ -6645,13 +6646,13 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> p_sta
66456646
for (int32_t key_i = 0; key_i < keys; key_i++) {
66466647
Quaternion bezier_track = p_track.rotation_track.values[key_i];
66476648
if (path.contains(":rotation:x")) {
6648-
bezier_track.x = p_animation->bezier_track_interpolate(p_track_i, key_i / BAKE_FPS);
6649+
bezier_track.x = p_animation->bezier_track_interpolate(p_track_i, key_i / p_state->get_bake_fps());
66496650
} else if (path.contains(":rotation:y")) {
6650-
bezier_track.y = p_animation->bezier_track_interpolate(p_track_i, key_i / BAKE_FPS);
6651+
bezier_track.y = p_animation->bezier_track_interpolate(p_track_i, key_i / p_state->get_bake_fps());
66516652
} else if (path.contains(":rotation:z")) {
6652-
bezier_track.z = p_animation->bezier_track_interpolate(p_track_i, key_i / BAKE_FPS);
6653+
bezier_track.z = p_animation->bezier_track_interpolate(p_track_i, key_i / p_state->get_bake_fps());
66536654
} else if (path.contains(":rotation:w")) {
6654-
bezier_track.w = p_animation->bezier_track_interpolate(p_track_i, key_i / BAKE_FPS);
6655+
bezier_track.w = p_animation->bezier_track_interpolate(p_track_i, key_i / p_state->get_bake_fps());
66556656
}
66566657
p_track.rotation_track.values.write[key_i] = bezier_track;
66576658
}
@@ -7305,6 +7306,7 @@ Node *GLTFDocument::generate_scene(Ref<GLTFState> p_state, float p_bake_fps, boo
73057306
ERR_FAIL_NULL_V(state, nullptr);
73067307
ERR_FAIL_INDEX_V(0, state->root_nodes.size(), nullptr);
73077308
Error err = OK;
7309+
p_state->set_bake_fps(p_bake_fps);
73087310
Node *root = _generate_scene_node_tree(state);
73097311
ERR_FAIL_NULL_V(root, nullptr);
73107312
_process_mesh_instances(state, root);
@@ -7313,7 +7315,7 @@ Node *GLTFDocument::generate_scene(Ref<GLTFState> p_state, float p_bake_fps, boo
73137315
root->add_child(ap, true);
73147316
ap->set_owner(root);
73157317
for (int i = 0; i < state->animations.size(); i++) {
7316-
_import_animation(state, ap, i, p_bake_fps, p_trimming, p_remove_immutable_tracks);
7318+
_import_animation(state, ap, i, p_trimming, p_remove_immutable_tracks);
73177319
}
73187320
}
73197321
for (KeyValue<GLTFNodeIndex, Node *> E : state->scene_nodes) {

0 commit comments

Comments
 (0)