tahoma2d/toonz/sources/image/mesh/tiio_mesh.cpp

213 lines
5.5 KiB
C++
Raw Normal View History

2016-03-19 06:57:51 +13:00
// TnzCore includes
#include "tstream.h"
#include "timageinfo.h"
#include "tmeshimage.h"
#include "tiio_mesh.h"
// TODO: Eccezioni. Vedi come funziona in toonzscene.cpp
//********************************************************************************
// TImageWriterMesh definition
//********************************************************************************
2016-06-15 18:43:10 +12:00
class TImageWriterMesh : public TImageWriter {
TFrameId m_fid; //!< The frame id
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TImageWriterMesh(const TFilePath &fp, const TFrameId &frameId);
~TImageWriterMesh() {}
2016-03-19 06:57:51 +13:00
public:
2016-06-19 20:06:29 +12:00
void save(const TImageP &) override;
2016-03-19 06:57:51 +13:00
private:
2016-06-15 18:43:10 +12:00
TImageWriterMesh(const TImageWriterMesh &);
TImageWriterMesh &operator=(const TImageWriterMesh &src);
2016-03-19 06:57:51 +13:00
};
//--------------------------------------------------------------------------
TImageWriterMesh::TImageWriterMesh(const TFilePath &fp, const TFrameId &frameId)
2016-06-15 18:43:10 +12:00
: TImageWriter(fp), m_fid(frameId) {}
2016-03-19 06:57:51 +13:00
//--------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void TImageWriterMesh::save(const TImageP &img) {
TFilePath imagePath(this->m_path.withFrame(m_fid));
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
TOStream ostream(imagePath, true); // Use compression
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
TMeshImageP mi = img;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// Save Header
ostream.openChild("header");
{
// Save version
ostream.openChild("version");
ostream << 1 << 19;
ostream.closeChild();
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// Save dpi
ostream.openChild("dpi");
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
double dpiX, dpiY;
mi->getDpi(dpiX, dpiY);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
ostream << dpiX << dpiY;
ostream.closeChild();
}
ostream.closeChild();
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// Save meshes
const std::vector<TTextureMeshP> &meshes = mi->meshes();
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
int m, mCount = meshes.size();
for (m = 0; m < mCount; ++m) {
ostream.openChild("mesh");
ostream << *meshes[m];
ostream.closeChild();
}
2016-03-19 06:57:51 +13:00
}
//********************************************************************************
// TImageReaderMesh definition
//********************************************************************************
2016-06-15 18:43:10 +12:00
class TImageReaderMesh : public TImageReader {
TFrameId m_fid; //<! Current frame id
mutable TImageInfo m_info; //!< The image's infos
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TImageReaderMesh(const TFilePath &fp, const TFrameId &frameId);
~TImageReaderMesh() {}
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
const TImageInfo *getImageInfo() const override;
TImageP load() override;
2016-03-19 06:57:51 +13:00
private:
2016-06-15 18:43:10 +12:00
//! Reference to level reader
TLevelReaderMesh *m_lrp;
2016-03-19 06:57:51 +13:00
private:
2016-06-15 18:43:10 +12:00
void readHeader(TIStream &is) const;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// not implemented
TImageReaderMesh(const TImageReaderMesh &);
TImageReaderMesh &operator=(const TImageReaderMesh &src);
2016-03-19 06:57:51 +13:00
};
//--------------------------------------------------------------------------
TImageReaderMesh::TImageReaderMesh(const TFilePath &fp, const TFrameId &frameId)
2016-06-15 18:43:10 +12:00
: TImageReader(fp), m_fid(frameId) {}
2016-03-19 06:57:51 +13:00
//--------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
const TImageInfo *TImageReaderMesh::getImageInfo() const {
if (!m_info.m_valid) {
// Load info from file
TFilePath imagePath(this->m_path.withFrame(m_fid));
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
TIStream is(imagePath);
readHeader(is);
}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
return &m_info;
2016-03-19 06:57:51 +13:00
}
//--------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void TImageReaderMesh::readHeader(TIStream &is) const {
std::string tagName;
// Open header tag
is.openChild(tagName);
assert(tagName == "header");
{
// Read header entries
while (is.openChild(tagName)) {
if (tagName == "version") {
int major, minor;
is >> major >> minor;
is.setVersion(VersionNumber(major, minor));
is.closeChild();
} else if (tagName == "dpi") {
is >> m_info.m_dpix >> m_info.m_dpiy;
assert(m_info.m_dpix > 0.0 && m_info.m_dpiy > 0.0);
is.closeChild();
} else
is.skipCurrentTag();
}
}
is.closeChild();
m_info.m_valid = true;
2016-03-19 06:57:51 +13:00
}
//--------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
TImageP TImageReaderMesh::load() {
TMeshImageP mi(new TMeshImage);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
TFilePath imagePath(this->m_path.withFrame(m_fid));
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
TIStream is(imagePath);
readHeader(is);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
mi->setDpi(m_info.m_dpix, m_info.m_dpiy);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// Meshes
std::vector<TTextureMeshP> &meshes = mi->meshes();
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
std::string tagName;
while (is.openChild(tagName)) {
if (tagName == "mesh") {
meshes.push_back(new TTextureMesh);
is >> *meshes.back();
is.closeChild();
} else
is.skipCurrentTag();
}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
return mi;
2016-03-19 06:57:51 +13:00
}
//********************************************************************************
// TLevelWriterMesh implementation
//********************************************************************************
TLevelWriterMesh::TLevelWriterMesh(const TFilePath &path, TPropertyGroup *winfo)
2016-06-15 18:43:10 +12:00
: TLevelWriter(path, winfo) {}
2016-03-19 06:57:51 +13:00
//--------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
TLevelWriterMesh::~TLevelWriterMesh() {}
2016-03-19 06:57:51 +13:00
//--------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
TImageWriterP TLevelWriterMesh::getFrameWriter(TFrameId fid) {
return new TImageWriterMesh(this->m_path, fid);
2016-03-19 06:57:51 +13:00
}
//********************************************************************************
// TLevelReaderMesh implementation
//********************************************************************************
TLevelReaderMesh::TLevelReaderMesh(const TFilePath &path)
2016-06-15 18:43:10 +12:00
: TLevelReader(path) {}
2016-03-19 06:57:51 +13:00
//--------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
TLevelReaderMesh::~TLevelReaderMesh() {}
2016-03-19 06:57:51 +13:00
//--------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
TImageReaderP TLevelReaderMesh::getFrameReader(TFrameId fid) {
return new TImageReaderMesh(this->m_path, fid);
2016-03-19 06:57:51 +13:00
}