diff options
Diffstat (limited to 'modules/gltf')
-rw-r--r-- | modules/gltf/doc_classes/GLTFSkeleton.xml | 30 | ||||
-rw-r--r-- | modules/gltf/doc_classes/GLTFSkin.xml | 27 | ||||
-rw-r--r-- | modules/gltf/doc_classes/GLTFState.xml | 153 | ||||
-rw-r--r-- | modules/gltf/doc_classes/PackedSceneGLTF.xml | 45 | ||||
-rw-r--r-- | modules/gltf/gltf_document.cpp | 30 |
5 files changed, 105 insertions, 180 deletions
diff --git a/modules/gltf/doc_classes/GLTFSkeleton.xml b/modules/gltf/doc_classes/GLTFSkeleton.xml index 40563c9ac6..6e83cec252 100644 --- a/modules/gltf/doc_classes/GLTFSkeleton.xml +++ b/modules/gltf/doc_classes/GLTFSkeleton.xml @@ -8,50 +8,40 @@ </tutorials> <methods> <method name="get_bone_attachment"> - <return type="BoneAttachment3D"> - </return> - <argument index="0" name="idx" type="int"> - </argument> + <return type="BoneAttachment3D" /> + <argument index="0" name="idx" type="int" /> <description> </description> </method> <method name="get_bone_attachment_count"> - <return type="int"> - </return> + <return type="int" /> <description> </description> </method> <method name="get_godot_bone_node"> - <return type="Dictionary"> - </return> + <return type="Dictionary" /> <description> </description> </method> <method name="get_godot_skeleton"> - <return type="Skeleton3D"> - </return> + <return type="Skeleton3D" /> <description> </description> </method> <method name="get_unique_names"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="set_godot_bone_node"> - <return type="void"> - </return> - <argument index="0" name="godot_bone_node" type="Dictionary"> - </argument> + <return type="void" /> + <argument index="0" name="godot_bone_node" type="Dictionary" /> <description> </description> </method> <method name="set_unique_names"> - <return type="void"> - </return> - <argument index="0" name="unique_names" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="unique_names" type="Array" /> <description> </description> </method> diff --git a/modules/gltf/doc_classes/GLTFSkin.xml b/modules/gltf/doc_classes/GLTFSkin.xml index e20e127e52..107ca960cd 100644 --- a/modules/gltf/doc_classes/GLTFSkin.xml +++ b/modules/gltf/doc_classes/GLTFSkin.xml @@ -8,44 +8,35 @@ </tutorials> <methods> <method name="get_inverse_binds"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="get_joint_i_to_bone_i"> - <return type="Dictionary"> - </return> + <return type="Dictionary" /> <description> </description> </method> <method name="get_joint_i_to_name"> - <return type="Dictionary"> - </return> + <return type="Dictionary" /> <description> </description> </method> <method name="set_inverse_binds"> - <return type="void"> - </return> - <argument index="0" name="inverse_binds" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="inverse_binds" type="Array" /> <description> </description> </method> <method name="set_joint_i_to_bone_i"> - <return type="void"> - </return> - <argument index="0" name="joint_i_to_bone_i" type="Dictionary"> - </argument> + <return type="void" /> + <argument index="0" name="joint_i_to_bone_i" type="Dictionary" /> <description> </description> </method> <method name="set_joint_i_to_name"> - <return type="void"> - </return> - <argument index="0" name="joint_i_to_name" type="Dictionary"> - </argument> + <return type="void" /> + <argument index="0" name="joint_i_to_name" type="Dictionary" /> <description> </description> </method> diff --git a/modules/gltf/doc_classes/GLTFState.xml b/modules/gltf/doc_classes/GLTFState.xml index a7b5b7b43e..ae976fc04c 100644 --- a/modules/gltf/doc_classes/GLTFState.xml +++ b/modules/gltf/doc_classes/GLTFState.xml @@ -8,236 +8,185 @@ </tutorials> <methods> <method name="get_accessors"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="get_animation_player"> - <return type="AnimationPlayer"> - </return> - <argument index="0" name="idx" type="int"> - </argument> + <return type="AnimationPlayer" /> + <argument index="0" name="idx" type="int" /> <description> </description> </method> <method name="get_animation_players_count"> - <return type="int"> - </return> - <argument index="0" name="idx" type="int"> - </argument> + <return type="int" /> + <argument index="0" name="idx" type="int" /> <description> </description> </method> <method name="get_animations"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="get_buffer_views"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="get_cameras"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="get_images"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="get_lights"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="get_materials"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="get_meshes"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="get_nodes"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="get_scene_node"> - <return type="Node"> - </return> - <argument index="0" name="idx" type="int"> - </argument> + <return type="Node" /> + <argument index="0" name="idx" type="int" /> <description> </description> </method> <method name="get_skeleton_to_node"> - <return type="Dictionary"> - </return> + <return type="Dictionary" /> <description> </description> </method> <method name="get_skeletons"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="get_skins"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="get_textures"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="get_unique_animation_names"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="get_unique_names"> - <return type="Array"> - </return> + <return type="Array" /> <description> </description> </method> <method name="set_accessors"> - <return type="void"> - </return> - <argument index="0" name="accessors" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="accessors" type="Array" /> <description> </description> </method> <method name="set_animations"> - <return type="void"> - </return> - <argument index="0" name="animations" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="animations" type="Array" /> <description> </description> </method> <method name="set_buffer_views"> - <return type="void"> - </return> - <argument index="0" name="buffer_views" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="buffer_views" type="Array" /> <description> </description> </method> <method name="set_cameras"> - <return type="void"> - </return> - <argument index="0" name="cameras" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="cameras" type="Array" /> <description> </description> </method> <method name="set_images"> - <return type="void"> - </return> - <argument index="0" name="images" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="images" type="Array" /> <description> </description> </method> <method name="set_lights"> - <return type="void"> - </return> - <argument index="0" name="lights" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="lights" type="Array" /> <description> </description> </method> <method name="set_materials"> - <return type="void"> - </return> - <argument index="0" name="materials" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="materials" type="Array" /> <description> </description> </method> <method name="set_meshes"> - <return type="void"> - </return> - <argument index="0" name="meshes" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="meshes" type="Array" /> <description> </description> </method> <method name="set_nodes"> - <return type="void"> - </return> - <argument index="0" name="nodes" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="nodes" type="Array" /> <description> </description> </method> <method name="set_skeleton_to_node"> - <return type="void"> - </return> - <argument index="0" name="skeleton_to_node" type="Dictionary"> - </argument> + <return type="void" /> + <argument index="0" name="skeleton_to_node" type="Dictionary" /> <description> </description> </method> <method name="set_skeletons"> - <return type="void"> - </return> - <argument index="0" name="skeletons" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="skeletons" type="Array" /> <description> </description> </method> <method name="set_skins"> - <return type="void"> - </return> - <argument index="0" name="skins" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="skins" type="Array" /> <description> </description> </method> <method name="set_textures"> - <return type="void"> - </return> - <argument index="0" name="textures" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="textures" type="Array" /> <description> </description> </method> <method name="set_unique_animation_names"> - <return type="void"> - </return> - <argument index="0" name="unique_animation_names" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="unique_animation_names" type="Array" /> <description> </description> </method> <method name="set_unique_names"> - <return type="void"> - </return> - <argument index="0" name="unique_names" type="Array"> - </argument> + <return type="void" /> + <argument index="0" name="unique_names" type="Array" /> <description> </description> </method> diff --git a/modules/gltf/doc_classes/PackedSceneGLTF.xml b/modules/gltf/doc_classes/PackedSceneGLTF.xml index a22111e9b7..d0136c6402 100644 --- a/modules/gltf/doc_classes/PackedSceneGLTF.xml +++ b/modules/gltf/doc_classes/PackedSceneGLTF.xml @@ -8,44 +8,29 @@ </tutorials> <methods> <method name="export_gltf"> - <return type="int" enum="Error"> - </return> - <argument index="0" name="node" type="Node"> - </argument> - <argument index="1" name="path" type="String"> - </argument> - <argument index="2" name="flags" type="int" default="0"> - </argument> - <argument index="3" name="bake_fps" type="float" default="1000.0"> - </argument> + <return type="int" enum="Error" /> + <argument index="0" name="node" type="Node" /> + <argument index="1" name="path" type="String" /> + <argument index="2" name="flags" type="int" default="0" /> + <argument index="3" name="bake_fps" type="float" default="1000.0" /> <description> </description> </method> <method name="import_gltf_scene"> - <return type="Node"> - </return> - <argument index="0" name="path" type="String"> - </argument> - <argument index="1" name="flags" type="int" default="0"> - </argument> - <argument index="2" name="bake_fps" type="float" default="1000.0"> - </argument> - <argument index="3" name="state" type="GLTFState" default="null"> - </argument> + <return type="Node" /> + <argument index="0" name="path" type="String" /> + <argument index="1" name="flags" type="int" default="0" /> + <argument index="2" name="bake_fps" type="float" default="1000.0" /> + <argument index="3" name="state" type="GLTFState" default="null" /> <description> </description> </method> <method name="pack_gltf"> - <return type="void"> - </return> - <argument index="0" name="path" type="String"> - </argument> - <argument index="1" name="flags" type="int" default="0"> - </argument> - <argument index="2" name="bake_fps" type="float" default="1000.0"> - </argument> - <argument index="3" name="state" type="GLTFState" default="null"> - </argument> + <return type="void" /> + <argument index="0" name="path" type="String" /> + <argument index="1" name="flags" type="int" default="0" /> + <argument index="2" name="bake_fps" type="float" default="1000.0" /> + <argument index="3" name="state" type="GLTFState" default="null" /> <description> </description> </method> diff --git a/modules/gltf/gltf_document.cpp b/modules/gltf/gltf_document.cpp index 30d023606f..be44f66423 100644 --- a/modules/gltf/gltf_document.cpp +++ b/modules/gltf/gltf_document.cpp @@ -3002,24 +3002,31 @@ Error GLTFDocument::_parse_images(Ref<GLTFState> state, const String &p_base_pat Ref<Image> img; + // First we honor the mime types if they were defined. if (mimetype == "image/png") { // Load buffer as PNG. ERR_FAIL_COND_V(Image::_png_mem_loader_func == nullptr, ERR_UNAVAILABLE); img = Image::_png_mem_loader_func(data_ptr, data_size); } else if (mimetype == "image/jpeg") { // Loader buffer as JPEG. ERR_FAIL_COND_V(Image::_jpg_mem_loader_func == nullptr, ERR_UNAVAILABLE); img = Image::_jpg_mem_loader_func(data_ptr, data_size); - } else { - // We can land here if we got an URI with base64-encoded data with application/* MIME type, - // and the optional mimeType property was not defined to tell us how to handle this data (or was invalid). - // So let's try PNG first, then JPEG. + } + + // If we didn't pass the above tests, we attempt loading as PNG and then + // JPEG directly. + // This covers URIs with base64-encoded data with application/* type but + // no optional mimeType property, or bufferViews with a bogus mimeType + // (e.g. `image/jpeg` but the data is actually PNG). + // That's not *exactly* what the spec mandates but this lets us be + // lenient with bogus glb files which do exist in production. + if (img.is_null()) { // Try PNG first. ERR_FAIL_COND_V(Image::_png_mem_loader_func == nullptr, ERR_UNAVAILABLE); img = Image::_png_mem_loader_func(data_ptr, data_size); - if (img.is_null()) { - ERR_FAIL_COND_V(Image::_jpg_mem_loader_func == nullptr, ERR_UNAVAILABLE); - img = Image::_jpg_mem_loader_func(data_ptr, data_size); - } } - + if (img.is_null()) { // And then JPEG. + ERR_FAIL_COND_V(Image::_jpg_mem_loader_func == nullptr, ERR_UNAVAILABLE); + img = Image::_jpg_mem_loader_func(data_ptr, data_size); + } + // Now we've done our best, fix your scenes. if (img.is_null()) { ERR_PRINT(vformat("glTF: Couldn't load image index '%d' with its given mimetype: %s.", i, mimetype)); state->images.push_back(Ref<Texture2D>()); @@ -5531,7 +5538,10 @@ struct EditorSceneImporterGLTFInterpolate<Quaternion> { template <class T> T GLTFDocument::_interpolate_track(const Vector<float> &p_times, const Vector<T> &p_values, const float p_time, const GLTFAnimation::Interpolation p_interp) { ERR_FAIL_COND_V(!p_values.size(), T()); - ERR_FAIL_COND_V(p_times.size() != p_values.size(), p_values[0]); + if (p_times.size() != p_values.size()) { + ERR_PRINT_ONCE("The interpolated values are not corresponding to its times."); + return p_values[0]; + } //could use binary search, worth it? int idx = -1; for (int i = 0; i < p_times.size(); i++) { |