summaryrefslogtreecommitdiffstats
path: root/modules/fbx/fbx_document.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/fbx/fbx_document.cpp')
-rw-r--r--modules/fbx/fbx_document.cpp38
1 files changed, 37 insertions, 1 deletions
diff --git a/modules/fbx/fbx_document.cpp b/modules/fbx/fbx_document.cpp
index 6e9b85dc35..1361e871de 100644
--- a/modules/fbx/fbx_document.cpp
+++ b/modules/fbx/fbx_document.cpp
@@ -217,6 +217,16 @@ static ufbx_skin_deformer *_find_skin_deformer(ufbx_skin_cluster *p_cluster) {
return nullptr;
}
+static String _find_element_name(ufbx_element *p_element) {
+ if (p_element->name.length > 0) {
+ return FBXDocument::_as_string(p_element->name);
+ } else if (p_element->instances.count > 0) {
+ return _find_element_name(&p_element->instances[0]->element);
+ } else {
+ return "";
+ }
+}
+
struct ThreadPoolFBX {
struct Group {
ufbx_thread_pool_context ctx = {};
@@ -2026,7 +2036,7 @@ Error FBXDocument::_parse(Ref<FBXState> p_state, String p_path, Ref<FileAccess>
opts.space_conversion = UFBX_SPACE_CONVERSION_MODIFY_GEOMETRY;
if (!p_state->get_allow_geometry_helper_nodes()) {
opts.geometry_transform_handling = UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY_NO_FALLBACK;
- opts.inherit_mode_handling = UFBX_INHERIT_MODE_HANDLING_IGNORE;
+ opts.inherit_mode_handling = UFBX_INHERIT_MODE_HANDLING_COMPENSATE_NO_FALLBACK;
} else {
opts.geometry_transform_handling = UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES;
opts.inherit_mode_handling = UFBX_INHERIT_MODE_HANDLING_COMPENSATE;
@@ -2068,6 +2078,32 @@ Error FBXDocument::_parse(Ref<FBXState> p_state, String p_path, Ref<FileAccess>
ERR_FAIL_V_MSG(ERR_PARSE_ERROR, err_buf);
}
+ const int max_warning_count = 10;
+ int warning_count[UFBX_WARNING_TYPE_COUNT] = {};
+ int ignored_warning_count = 0;
+ for (const ufbx_warning &warning : p_state->scene->metadata.warnings) {
+ if (warning_count[warning.type]++ < max_warning_count) {
+ if (warning.count > 1) {
+ WARN_PRINT(vformat("FBX: ufbx warning: %s (x%d)", _as_string(warning.description), (int)warning.count));
+ } else {
+ String element_name;
+ if (warning.element_id != UFBX_NO_INDEX) {
+ element_name = _find_element_name(p_state->scene->elements[warning.element_id]);
+ }
+ if (!element_name.is_empty()) {
+ WARN_PRINT(vformat("FBX: ufbx warning in '%s': %s", element_name, _as_string(warning.description)));
+ } else {
+ WARN_PRINT(vformat("FBX: ufbx warning: %s", _as_string(warning.description)));
+ }
+ }
+ } else {
+ ignored_warning_count++;
+ }
+ }
+ if (ignored_warning_count > 0) {
+ WARN_PRINT(vformat("FBX: ignored %d further ufbx warnings", ignored_warning_count));
+ }
+
err = _parse_fbx_state(p_state, p_path);
ERR_FAIL_COND_V(err != OK, err);