#include #include #include #include #include #include "document_saver.h" #include "image_forever.h" DocumentSaver::DocumentSaver(const QString *filename, dust3d::Snapshot *snapshot, QByteArray *turnaroundPngByteArray) : m_filename(filename), m_snapshot(snapshot), m_turnaroundPngByteArray(turnaroundPngByteArray) { } DocumentSaver::~DocumentSaver() { delete m_snapshot; delete m_turnaroundPngByteArray; } void DocumentSaver::process() { save(m_filename, m_snapshot, m_turnaroundPngByteArray); emit finished(); } void DocumentSaver::collectUsedResourceIds(const dust3d::Snapshot *snapshot, std::set &imageIds) { for (const auto &material: snapshot->materials) { for (auto &layer: material.second) { for (auto &mapItem: layer.second) { auto findImageIdString = mapItem.find("linkData"); if (findImageIdString == mapItem.end()) continue; dust3d::Uuid imageId = dust3d::Uuid(findImageIdString->second); imageIds.insert(imageId); } } } } bool DocumentSaver::save(const QString *filename, dust3d::Snapshot *snapshot, const QByteArray *turnaroundPngByteArray) { dust3d::Ds3FileWriter ds3Writer; { std::string modelXml; saveSnapshotToXmlString(*snapshot, modelXml); if (modelXml.size() > 0) { ds3Writer.add("model.xml", "model", modelXml.c_str(), modelXml.size()); } } if (nullptr != turnaroundPngByteArray && turnaroundPngByteArray->size() > 0) ds3Writer.add("canvas.png", "asset", turnaroundPngByteArray->data(), turnaroundPngByteArray->size()); std::set imageIds; collectUsedResourceIds(snapshot, imageIds); for (const auto &imageId: imageIds) { const QByteArray *pngByteArray = ImageForever::getPngByteArray(imageId); if (nullptr == pngByteArray) continue; if (pngByteArray->size() > 0) ds3Writer.add("images/" + imageId.toString() + ".png", "asset", pngByteArray->data(), pngByteArray->size()); } return ds3Writer.save(filename->toUtf8().constData()); }