diff options
Diffstat (limited to 'lyt/window.cpp')
-rw-r--r-- | lyt/window.cpp | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/lyt/window.cpp b/lyt/window.cpp new file mode 100644 index 0000000..0430229 --- /dev/null +++ b/lyt/window.cpp @@ -0,0 +1,184 @@ +#include "window.h" +#include "layout.h" +#include "common.h" + + +LYTWindowFrame::LYTWindowFrame(LYTWindow &window) : m_window(window) { +} + +void LYTWindowFrame::writeToDataStream(QDataStream &out) { + // calculate the material number + int materialNum = m_window.m_layout.materials.keys().indexOf(materialName); + out << (quint16)materialNum; + + out << (quint8)type; + out.skipRawData(1); // padding +} + +void LYTWindowFrame::readFromDataStream(QDataStream &in) { + // read the material name + quint16 materialNum; + in >> (quint16&)materialNum; + + materialName = m_window.m_layout.materials.keys().at(materialNum); + + in >> (quint8&)type; + in.skipRawData(1); // padding +} + +void LYTWindowFrame::dumpToDebug() { + qDebug() << "LYTWindowFrame @" << (void*)this << "- type:" << type << "- material:" << materialName; +} + + + +LYTWindow::LYTWindow(LYTLayout &layout) : LYTPane(layout) { +} + +LYTWindow::~LYTWindow() { + foreach (LYTWindowFrame *frame, frames) + delete frame; +} + + + +// all of this needs to be done + +void LYTWindow::dumpToDebug(bool showHeading) { + if (showHeading) + qDebug() << "LYTWindow" << name << "@" << (void*)this; + + LYTPane::dumpToDebug(false); + + qDebug() << "- Content VtxColours:" << contentVtxColours[0] << "-" << contentVtxColours[1]; + qDebug() << " " << contentVtxColours[2] << "-" << contentVtxColours[3]; + qDebug() << "- Content Material:" << contentMaterialName; + qDebug() << "- Content Tex Coords:" << contentTexCoords.count(); + + foreach (LYTTexCoords texCoord, contentTexCoords) { + qDebug() << "----" << texCoord.coord[0] << "-" << texCoord.coord[1] << "-" << texCoord.coord[2] << "-" << texCoord.coord[3]; + } + + qDebug() << "- Content Overflow: Left" << contentOverflowLeft << "- Right" << contentOverflowRight; + qDebug() << " Top" << contentOverflowTop << "- Bottom" << contentOverflowBottom; + + qDebug() << "- Frames:" << frames.count(); + + foreach (LYTWindowFrame *frame, frames) { + frame->dumpToDebug(); + } +} + + + +void LYTWindow::writeToDataStream(QDataStream &out) { + LYTPane::writeToDataStream(out); + + out << (float)contentOverflowLeft; + out << (float)contentOverflowRight; + out << (float)contentOverflowTop; + out << (float)contentOverflowBottom; + + out << (quint8)frames.count(); + out.skipRawData(3); // padding + + out << (quint32)0x68; // offset to content struct + out << (quint32)(0x7C + (contentTexCoords.count()*0x20)); // offset to frame offset list + + for (int i = 0; i < 4; i++) + WriteRGBA8Color(contentVtxColours[i], out); + + // calculate the material number + int materialNum = m_layout.materials.keys().indexOf(contentMaterialName); + out << (quint16)materialNum; + + // write texcoords + out << (quint8)contentTexCoords.count(); + out.skipRawData(1); // padding + + foreach (LYTTexCoords texCoord, contentTexCoords) { + for (int i = 0; i < 4; i++) + WritePointF(out, texCoord.coord[i]); + } + + // write frame offsets + quint32 frameOffset = 0x7C; // end of fixed-size part of content struct + frameOffset += (contentTexCoords.count() * 0x20); // end of content struct + frameOffset += (frames.count() * 4); // end of offset list + + for (int i = 0; i < frames.count(); i++) { + out << (quint32)frameOffset; + frameOffset += 4; // size of frame struct + } + + // now write frames + foreach (LYTWindowFrame *frame, frames) { + frame->writeToDataStream(out); + } +} + + +void LYTWindow::readFromDataStream(QDataStream &in) { + qint64 startPos = in.device()->pos(); + + LYTPane::readFromDataStream(in); + + in >> (float&)contentOverflowLeft; + in >> (float&)contentOverflowRight; + in >> (float&)contentOverflowTop; + in >> (float&)contentOverflowBottom; + + quint8 frameCount; + in >> (quint8&)frameCount; + in.skipRawData(3); // padding + + quint32 contentOffset, frameListOffset; + in >> (quint32&)contentOffset; + in >> (quint32&)frameListOffset; + + // read content struct + // subtract 8 from the offset because section.data doesn't contain + // the nw4r::ut::BinaryBlockHeader whereas these offsets do count it + in.device()->seek(startPos + contentOffset - 8); + + for (int i = 0; i < 4; i++) + ReadRGBA8Color(contentVtxColours[i], in); + + // read the material name + quint16 materialNum; + in >> (quint16&)materialNum; + + contentMaterialName = m_layout.materials.keys().at(materialNum); + + // read texcoords + quint8 texCoordNum; + in >> (quint8&)texCoordNum; + in.skipRawData(1); // padding + + contentTexCoords.resize(texCoordNum); + + foreach (LYTTexCoords texCoord, contentTexCoords) { + for (int i = 0; i < 4; i++) + ReadPointF(in, texCoord.coord[i]); + } + + // read frame offset list + // subtract 8 from the offset once again + in.device()->seek(startPos + frameListOffset - 8); + + QVector<quint32> frameOffsets(frameCount); + + for (int i = 0; i < frameCount; i++) { + quint32 offset; + in >> (quint32&)offset; + frameOffsets[i] = offset; + } + + // now read each frame + for (int i = 0; i < frameCount; i++) { + in.device()->seek(frameOffsets[i] - 8); + + frames.append(new LYTWindowFrame(*this)); + frames.last()->readFromDataStream(in); + } +} |