diff --git a/gltf/gltfpack.cpp b/gltf/gltfpack.cpp index 62ae7b32..a01f2070 100644 --- a/gltf/gltfpack.cpp +++ b/gltf/gltfpack.cpp @@ -484,22 +484,15 @@ static void process(cgltf_data* data, const char* input_path, const char* output { const cgltf_image& image = data->images[i]; + std::string* encoded = (encoded_images.size() && !encoded_images[i].empty()) ? &encoded_images[i] : NULL; + comma(json_images); append(json_images, "{"); - if (encoded_images.size() && !encoded_images[i].empty()) - { - if (encoded_images[i].compare(0, 5, "error") == 0) - writeImageError(json_images, "encode", int(i), image.uri, encoded_images[i].c_str()); - else - writeEncodedImage(json_images, views, image, encoded_images[i], images[i], i, output_path, settings); - - encoded_images[i] = std::string(); // reclaim memory early - } - else - { - writeImage(json_images, views, image, images[i], i, input_path, output_path, settings); - } + writeImage(json_images, views, image, images[i], encoded, i, input_path, output_path, settings); append(json_images, "}"); + + if (encoded) + *encoded = std::string(); // reclaim memory early } for (size_t i = 0; i < data->textures_count; ++i) diff --git a/gltf/gltfpack.h b/gltf/gltfpack.h index e2260846..5e221d67 100644 --- a/gltf/gltfpack.h +++ b/gltf/gltfpack.h @@ -368,9 +368,7 @@ const char* animationPath(cgltf_animation_path_type type); void writeMaterial(std::string& json, const cgltf_data* data, const cgltf_material& material, const QuantizationPosition* qp, const QuantizationTexture* qt, std::vector& textures); void writeBufferView(std::string& json, BufferView::Kind kind, StreamFormat::Filter filter, size_t count, size_t stride, size_t bin_offset, size_t bin_size, BufferView::Compression compression, size_t compressed_offset, size_t compressed_size); void writeSampler(std::string& json, const cgltf_sampler& sampler); -void writeImage(std::string& json, std::vector& views, const cgltf_image& image, const ImageInfo& info, size_t index, const char* input_path, const char* output_path, const Settings& settings); -void writeImageError(std::string& json, const char* action, size_t index, const char* uri, const char* reason = NULL); -void writeEncodedImage(std::string& json, std::vector& views, const cgltf_image& image, const std::string& encoded, const ImageInfo& info, size_t index, const char* output_path, const Settings& settings); +void writeImage(std::string& json, std::vector& views, const cgltf_image& image, const ImageInfo& info, const std::string* encoded, size_t index, const char* input_path, const char* output_path, const Settings& settings); void writeTexture(std::string& json, const cgltf_texture& texture, const ImageInfo* info, cgltf_data* data, const Settings& settings); void writeMeshAttributes(std::string& json, std::vector& views, std::string& json_accessors, size_t& accr_offset, const Mesh& mesh, int target, const QuantizationPosition& qp, const QuantizationTexture& qt, const Settings& settings); size_t writeMeshIndices(std::vector& views, std::string& json_accessors, size_t& accr_offset, const Mesh& mesh, const Settings& settings); diff --git a/gltf/write.cpp b/gltf/write.cpp index 96794bb8..2ab0d190 100644 --- a/gltf/write.cpp +++ b/gltf/write.cpp @@ -896,6 +896,15 @@ void writeSampler(std::string& json, const cgltf_sampler& sampler) } } +static void writeImageError(std::string& json, const char* action, size_t index, const char* uri, const char* reason) +{ + append(json, "\"uri\":\""); + append(json, "data:image/png;base64,ERR/"); + append(json, "\""); + + fprintf(stderr, "Warning: unable to %s image %d (%s), skipping%s%s%s\n", action, int(index), uri ? uri : "embedded", reason ? " (" : "", reason ? reason : "", reason ? ")" : ""); +} + static void writeImageData(std::string& json, std::vector& views, size_t index, const char* uri, const char* mime_type, const std::string& contents, const char* output_path, TextureKind kind, bool embed) { bool dataUri = uri && strncmp(uri, "data:", 5) == 0; @@ -922,8 +931,18 @@ static void writeImageData(std::string& json, std::vector& views, si } } -void writeImage(std::string& json, std::vector& views, const cgltf_image& image, const ImageInfo& info, size_t index, const char* input_path, const char* output_path, const Settings& settings) +void writeImage(std::string& json, std::vector& views, const cgltf_image& image, const ImageInfo& info, const std::string* encoded, size_t index, const char* input_path, const char* output_path, const Settings& settings) { + if (encoded) + { + // image was pre-encoded via encodeImages (which might have failed!) + if (encoded->compare(0, 5, "error") == 0) + writeImageError(json, "encode", int(index), image.uri, encoded->c_str()); + else + writeImageData(json, views, index, image.uri, "image/ktx2", *encoded, output_path, info.kind, settings.texture_embed); + return; + } + bool dataUri = image.uri && strncmp(image.uri, "data:", 5) == 0; if (image.uri && !dataUri && settings.texture_ref) @@ -939,27 +958,13 @@ void writeImage(std::string& json, std::vector& views, const cgltf_i std::string mime_type; if (!readImage(image, input_path, img_data, mime_type)) { - writeImageError(json, "read", index, image.uri); + writeImageError(json, "read", index, image.uri, NULL); return; } writeImageData(json, views, index, image.uri, mime_type.c_str(), img_data, output_path, info.kind, settings.texture_embed); } -void writeImageError(std::string& json, const char* action, size_t index, const char* uri, const char* reason) -{ - append(json, "\"uri\":\""); - append(json, "data:image/png;base64,ERR/"); - append(json, "\""); - - fprintf(stderr, "Warning: unable to %s image %d (%s), skipping%s%s%s\n", action, int(index), uri ? uri : "embedded", reason ? " (" : "", reason ? reason : "", reason ? ")" : ""); -} - -void writeEncodedImage(std::string& json, std::vector& views, const cgltf_image& image, const std::string& encoded, const ImageInfo& info, size_t index, const char* output_path, const Settings& settings) -{ - writeImageData(json, views, index, image.uri, "image/ktx2", encoded, output_path, info.kind, settings.texture_embed); -} - void writeTexture(std::string& json, const cgltf_texture& texture, const ImageInfo* info, cgltf_data* data, const Settings& settings) { if (texture.image)