GLTF: Fixed external images getting embedded on import

Added a map to keep track of external images during import, and used
that map to instance the textures using the resource loader instead of
creating a new texture from scratch
This commit is contained in:
pablitar 2024-07-22 13:51:53 -03:00 committed by Relintai
parent 989f0e66c2
commit 82d3a7204b
2 changed files with 18 additions and 8 deletions

View File

@ -3129,6 +3129,7 @@ Error GLTFDocument::_parse_images(Ref<GLTFState> p_state, const String &p_base_p
Ref<Texture> texture = ResourceLoader::load(uri); Ref<Texture> texture = ResourceLoader::load(uri);
if (texture.is_valid()) { if (texture.is_valid()) {
p_state->images.push_back(texture->get_data()); p_state->images.push_back(texture->get_data());
p_state->external_images_paths.insert(i, uri);
continue; continue;
} else if (mimetype == "image/png" || mimetype == "image/jpeg") { } else if (mimetype == "image/png" || mimetype == "image/jpeg") {
// Fallback to loading as byte array. // Fallback to loading as byte array.
@ -3257,17 +3258,25 @@ Error GLTFDocument::_parse_textures(Ref<GLTFState> p_state) {
} }
p_state->textures.push_back(t); p_state->textures.push_back(t);
Ref<Texture> tex;
// Create and cache the texture used in the engine // Create and cache the texture used in the engine
Ref<ImageTexture> imgTex; if (p_state->external_images_paths.has(t->get_src_image())) {
imgTex.instance(); tex = ResourceLoader::load(p_state->external_images_paths[t->get_src_image()]);
imgTex->create_from_image(p_state->images[t->get_src_image()]); } else {
Ref<ImageTexture> img_tex;
img_tex.instance();
img_tex->create_from_image(p_state->images[t->get_src_image()]);
// Set texture filter and repeat based on sampler settings // Set texture filter and repeat based on sampler settings. Only supported for embedded textures
const Ref<GLTFTextureSampler> sampler = _get_sampler_for_texture(p_state, i); const Ref<GLTFTextureSampler> sampler = _get_sampler_for_texture(p_state, i);
Texture::Flags flags = sampler->get_texture_flags(); Texture::Flags flags = sampler->get_texture_flags();
imgTex->set_flags(flags); img_tex->set_flags(flags);
p_state->texture_cache.insert(i, imgTex); tex = img_tex;
}
p_state->texture_cache.insert(i, tex);
} }
return OK; return OK;

View File

@ -79,6 +79,7 @@ class GLTFState : public Resource {
Vector<Ref<GLTFTextureSampler>> texture_samplers; Vector<Ref<GLTFTextureSampler>> texture_samplers;
Ref<GLTFTextureSampler> default_texture_sampler; Ref<GLTFTextureSampler> default_texture_sampler;
Vector<Ref<Image>> images; Vector<Ref<Image>> images;
RBMap<GLTFImageIndex, String> external_images_paths;
RBMap<GLTFTextureIndex, Ref<Texture>> texture_cache; RBMap<GLTFTextureIndex, Ref<Texture>> texture_cache;
Vector<String> extensions_used; Vector<String> extensions_used;
Vector<String> extensions_required; Vector<String> extensions_required;