Merge pull request #105787 from zodywoolsey/fbx-runtime-fixing

Fix fbx runtime import not generating meshes properly
This commit is contained in:
Thaddeus Crews
2025-04-27 19:21:19 -05:00
4 changed files with 64 additions and 14 deletions

View File

@ -40,6 +40,8 @@ module_obj = []
env_fbx.add_source_files(module_obj, "*.cpp") env_fbx.add_source_files(module_obj, "*.cpp")
env_fbx.add_source_files(module_obj, "structures/*.cpp") env_fbx.add_source_files(module_obj, "structures/*.cpp")
SConscript("extensions/SCsub")
if env.editor_build: if env.editor_build:
env_fbx.add_source_files(module_obj, "editor/*.cpp") env_fbx.add_source_files(module_obj, "editor/*.cpp")

View File

@ -0,0 +1,11 @@
#!/usr/bin/env python
from misc.utility.scons_hints import *
Import("env")
Import("env_modules")
env_gltf = env_modules.Clone()
# Godot source files
env_gltf.add_source_files(env.modules_sources, "*.cpp")

View File

@ -2103,6 +2103,15 @@ Error FBXDocument::_parse(Ref<FBXState> p_state, String p_path, Ref<FileAccess>
WARN_PRINT(vformat("FBX: ignored %d further ufbx warnings", ignored_warning_count)); WARN_PRINT(vformat("FBX: ignored %d further ufbx warnings", ignored_warning_count));
} }
document_extensions.clear();
for (Ref<GLTFDocumentExtension> ext : all_document_extensions) {
ERR_CONTINUE(ext.is_null());
err = ext->import_preflight(p_state, p_state->json["extensionsUsed"]);
if (err == OK) {
document_extensions.push_back(ext);
}
}
err = _parse_fbx_state(p_state, p_path); err = _parse_fbx_state(p_state, p_path);
ERR_FAIL_COND_V(err != OK, err); ERR_FAIL_COND_V(err != OK, err);
@ -2130,6 +2139,27 @@ Node *FBXDocument::generate_scene(Ref<GLTFState> p_state, float p_bake_fps, bool
_import_animation(state, ap, i, p_trimming, p_remove_immutable_tracks); _import_animation(state, ap, i, p_trimming, p_remove_immutable_tracks);
} }
} }
for (KeyValue<GLTFNodeIndex, Node *> E : state->scene_nodes) {
ERR_CONTINUE(!E.value);
for (Ref<GLTFDocumentExtension> ext : document_extensions) {
ERR_CONTINUE(ext.is_null());
Dictionary node_json;
if (state->json.has("nodes")) {
Array nodes = state->json["nodes"];
if (0 <= E.key && E.key < nodes.size()) {
node_json = nodes[E.key];
}
}
Ref<GLTFNode> gltf_node = state->nodes[E.key];
Error err = ext->import_node(p_state, gltf_node, node_json, E.value);
ERR_CONTINUE(err != OK);
}
}
for (Ref<GLTFDocumentExtension> ext : document_extensions) {
ERR_CONTINUE(ext.is_null());
Error err = ext->import_post(p_state, root);
ERR_CONTINUE(err != OK);
}
ERR_FAIL_NULL_V(root, nullptr); ERR_FAIL_NULL_V(root, nullptr);
return root; return root;
} }
@ -2148,12 +2178,11 @@ Error FBXDocument::append_from_buffer(PackedByteArray p_bytes, String p_base_pat
state->base_path = p_base_path.get_base_dir(); state->base_path = p_base_path.get_base_dir();
err = _parse(state, state->base_path, file_access); err = _parse(state, state->base_path, file_access);
ERR_FAIL_COND_V(err != OK, err); ERR_FAIL_COND_V(err != OK, err);
// TODO: 202040118 // fire for (Ref<GLTFDocumentExtension> ext : document_extensions) {
// for (Ref<GLTFDocumentExtension> ext : get_all_gltf_document_extensions()) { ERR_CONTINUE(ext.is_null());
// ERR_CONTINUE(ext.is_null()); err = ext->import_post_parse(state);
// err = ext->import_post_parse(state); ERR_FAIL_COND_V(err != OK, err);
// ERR_FAIL_COND_V(err != OK, err); }
// }
return OK; return OK;
} }
@ -2247,12 +2276,11 @@ Error FBXDocument::append_from_file(String p_path, Ref<GLTFState> p_state, uint3
state->base_path = base_path; state->base_path = base_path;
err = _parse(p_state, base_path, file); err = _parse(p_state, base_path, file);
ERR_FAIL_COND_V(err != OK, err); ERR_FAIL_COND_V(err != OK, err);
// TODO: 20240118 // fire for (Ref<GLTFDocumentExtension> ext : document_extensions) {
// for (Ref<GLTFDocumentExtension> ext : document_extensions) { ERR_CONTINUE(ext.is_null());
// ERR_CONTINUE(ext.is_null()); err = ext->import_post_parse(p_state);
// err = ext->import_post_parse(p_state); ERR_FAIL_COND_V(err != OK, err);
// ERR_FAIL_COND_V(err != OK, err); }
// }
return OK; return OK;
} }

View File

@ -30,6 +30,7 @@
#include "register_types.h" #include "register_types.h"
#include "../gltf/extensions/gltf_document_extension_convert_importer_mesh.h"
#include "fbx_document.h" #include "fbx_document.h"
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
@ -53,10 +54,19 @@ static void _editor_init() {
} }
#endif // TOOLS_ENABLED #endif // TOOLS_ENABLED
#define FBX_REGISTER_DOCUMENT_EXTENSION(m_doc_ext_class) \
Ref<m_doc_ext_class> extension_##m_doc_ext_class; \
extension_##m_doc_ext_class.instantiate(); \
FBXDocument::register_gltf_document_extension(extension_##m_doc_ext_class);
void initialize_fbx_module(ModuleInitializationLevel p_level) { void initialize_fbx_module(ModuleInitializationLevel p_level) {
if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) { if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) {
GDREGISTER_CLASS(FBXDocument); GDREGISTER_CLASS(FBXDocument);
GDREGISTER_CLASS(FBXState); GDREGISTER_CLASS(FBXState);
bool is_editor = Engine::get_singleton()->is_editor_hint();
if (!is_editor) {
FBX_REGISTER_DOCUMENT_EXTENSION(GLTFDocumentExtensionConvertImporterMesh);
}
} }
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
@ -77,6 +87,5 @@ void uninitialize_fbx_module(ModuleInitializationLevel p_level) {
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) { if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
return; return;
} }
// TODO: 20240118 // fire FBXDocument::unregister_all_gltf_document_extensions();
// FBXDocument::unregister_all_gltf_document_extensions();
} }