dont serialize a couple of empty arrays

This commit is contained in:
Selmar Kok 2020-01-28 13:45:38 +01:00
parent e2c3fe1c0b
commit eb9d29c06e

View File

@ -7003,14 +7003,16 @@ static void SerializeGltfTexture(Texture &texture, json &o) {
/// ///
static void SerializeGltfModel(Model *model, json &o) { static void SerializeGltfModel(Model *model, json &o) {
// ACCESSORS // ACCESSORS
json accessors; if (model->accessors.size()) {
JsonReserveArray(accessors, model->accessors.size()); json accessors;
for (unsigned int i = 0; i < model->accessors.size(); ++i) { JsonReserveArray(accessors, model->accessors.size());
json accessor; for (unsigned int i = 0; i < model->accessors.size(); ++i) {
SerializeGltfAccessor(model->accessors[i], accessor); json accessor;
JsonPushBack(accessors, std::move(accessor)); SerializeGltfAccessor(model->accessors[i], accessor);
JsonPushBack(accessors, std::move(accessor));
}
JsonAddMember(o, "accessors", std::move(accessors));
} }
JsonAddMember(o, "accessors", std::move(accessors));
// ANIMATIONS // ANIMATIONS
if (model->animations.size()) { if (model->animations.size()) {
@ -7033,14 +7035,16 @@ static void SerializeGltfModel(Model *model, json &o) {
JsonAddMember(o, "asset", std::move(asset)); JsonAddMember(o, "asset", std::move(asset));
// BUFFERVIEWS // BUFFERVIEWS
json bufferViews; if(model->bufferViews.size()) {
JsonReserveArray(bufferViews, model->bufferViews.size()); json bufferViews;
for (unsigned int i = 0; i < model->bufferViews.size(); ++i) { JsonReserveArray(bufferViews, model->bufferViews.size());
json bufferView; for (unsigned int i = 0; i < model->bufferViews.size(); ++i) {
SerializeGltfBufferView(model->bufferViews[i], bufferView); json bufferView;
JsonPushBack(bufferViews, std::move(bufferView)); SerializeGltfBufferView(model->bufferViews[i], bufferView);
JsonPushBack(bufferViews, std::move(bufferView));
}
JsonAddMember(o, "bufferViews", std::move(bufferViews));
} }
JsonAddMember(o, "bufferViews", std::move(bufferViews));
// Extensions used // Extensions used
if (model->extensionsUsed.size()) { if (model->extensionsUsed.size()) {
@ -7304,20 +7308,21 @@ bool TinyGLTF::WriteGltfSceneToStream(Model *model, std::ostream &stream,
SerializeGltfModel(model, output); SerializeGltfModel(model, output);
// BUFFERS // BUFFERS
std::vector<std::string> usedUris;
std::vector<unsigned char> binBuffer; std::vector<unsigned char> binBuffer;
json buffers; if(model->buffers.size()) {
JsonReserveArray(buffers, model->buffers.size()); json buffers;
for (unsigned int i = 0; i < model->buffers.size(); ++i) { JsonReserveArray(buffers, model->buffers.size());
json buffer; for (unsigned int i = 0; i < model->buffers.size(); ++i) {
if (writeBinary && i==0 && model->buffers[i].uri.empty()){ json buffer;
SerializeGltfBufferBin(model->buffers[i], buffer,binBuffer); if (writeBinary && i==0 && model->buffers[i].uri.empty()){
} else { SerializeGltfBufferBin(model->buffers[i], buffer,binBuffer);
SerializeGltfBuffer(model->buffers[i], buffer); } else {
SerializeGltfBuffer(model->buffers[i], buffer);
}
JsonPushBack(buffers, std::move(buffer));
} }
JsonPushBack(buffers, std::move(buffer)); JsonAddMember(output, "buffers", std::move(buffers));
} }
JsonAddMember(output, "buffers", std::move(buffers));
// IMAGES // IMAGES
if (model->images.size()) { if (model->images.size()) {
@ -7371,44 +7376,46 @@ bool TinyGLTF::WriteGltfSceneToFile(Model *model, const std::string &filename,
// BUFFERS // BUFFERS
std::vector<std::string> usedUris; std::vector<std::string> usedUris;
std::vector<unsigned char> binBuffer; std::vector<unsigned char> binBuffer;
json buffers; if (model->buffers.size()) {
JsonReserveArray(buffers, model->buffers.size()); json buffers;
for (unsigned int i = 0; i < model->buffers.size(); ++i) { JsonReserveArray(buffers, model->buffers.size());
json buffer; for (unsigned int i = 0; i < model->buffers.size(); ++i) {
if (writeBinary && i==0 && model->buffers[i].uri.empty()){ json buffer;
SerializeGltfBufferBin(model->buffers[i], buffer,binBuffer); if (writeBinary && i==0 && model->buffers[i].uri.empty()){
} else if (embedBuffers) { SerializeGltfBufferBin(model->buffers[i], buffer,binBuffer);
SerializeGltfBuffer(model->buffers[i], buffer); } else if (embedBuffers) {
} else { SerializeGltfBuffer(model->buffers[i], buffer);
std::string binSavePath;
std::string binUri;
if (!model->buffers[i].uri.empty() && !IsDataURI(model->buffers[i].uri)) {
binUri = model->buffers[i].uri;
} else { } else {
binUri = defaultBinFilename + defaultBinFileExt; std::string binSavePath;
bool inUse = true; std::string binUri;
int numUsed = 0; if (!model->buffers[i].uri.empty() && !IsDataURI(model->buffers[i].uri)) {
while (inUse) { binUri = model->buffers[i].uri;
inUse = false; } else {
for (const std::string &usedName : usedUris) { binUri = defaultBinFilename + defaultBinFileExt;
if (binUri.compare(usedName) != 0) continue; bool inUse = true;
inUse = true; int numUsed = 0;
binUri = defaultBinFilename + std::to_string(numUsed++) + while (inUse) {
defaultBinFileExt; inUse = false;
break; for (const std::string &usedName : usedUris) {
if (binUri.compare(usedName) != 0) continue;
inUse = true;
binUri = defaultBinFilename + std::to_string(numUsed++) +
defaultBinFileExt;
break;
}
} }
} }
usedUris.push_back(binUri);
binSavePath = JoinPath(baseDir, binUri);
if (!SerializeGltfBuffer(model->buffers[i], buffer, binSavePath,
binUri)) {
return false;
}
} }
usedUris.push_back(binUri); JsonPushBack(buffers, std::move(buffer));
binSavePath = JoinPath(baseDir, binUri);
if (!SerializeGltfBuffer(model->buffers[i], buffer, binSavePath,
binUri)) {
return false;
}
} }
JsonPushBack(buffers, std::move(buffer));
}
JsonAddMember(output, "buffers", std::move(buffers)); JsonAddMember(output, "buffers", std::move(buffers));
}
// IMAGES // IMAGES
if (model->images.size()) { if (model->images.size()) {