summaryrefslogtreecommitdiff
path: root/lyt
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lyt/animation.cpp220
-rw-r--r--lyt/animation.h68
-rw-r--r--lyt/materials/tevswaptable.cpp8
-rw-r--r--lyt/textbox.cpp13
-rw-r--r--lyt/textbox.h4
5 files changed, 302 insertions, 11 deletions
diff --git a/lyt/animation.cpp b/lyt/animation.cpp
new file mode 100644
index 0000000..d5e87d3
--- /dev/null
+++ b/lyt/animation.cpp
@@ -0,0 +1,220 @@
+#include "animation.h"
+#include "lyt/binaryfile.h"
+
+LYTAnimation::~LYTAnimation() {
+
+}
+
+LYTAnimation::LYTAnimation(QByteArray data) {
+ LYTBinaryFile file(data);
+
+ foreach (const LYTBinaryFileSection &section, file.sections) {
+ switch (section.magic.value) {
+ case 'pat1': {
+ // Info
+ QDataStream in(section.data);
+ InitDataStream(in);
+
+ quint16 groupCount;
+ quint32 nameOffset, groupOffset;
+ quint8 flag;
+
+ in >> sourceTagNumber;
+ in >> groupCount;
+ in >> nameOffset;
+ in >> groupOffset;
+ in >> sourceStartFrame;
+ in >> sourceEndFrame;
+ in >> flag;
+
+ qDebug() << "Source: Tag:" << sourceTagNumber << "- Frames:" << sourceStartFrame << "to" << sourceEndFrame;
+ qDebug() << "Groups: Offset" << groupOffset << ", count" << groupCount << "- Name offset:" << nameOffset;
+
+ recursiveBind = ((flag & 1) != 0);
+ qDebug() << "Flag:" << flag << "; Recursive bind:" << recursiveBind;
+
+ in.device()->seek(nameOffset - 8);
+ // a royal hack
+ name = ReadFixedLengthASCII(in, groupOffset-nameOffset);
+ qDebug() << "Rlan name:" << name;
+
+ groups.reserve(groupCount);
+ in.device()->seek(groupOffset - 8);
+
+ for (int i = 0; i < groupCount; i++) {
+ LYTAnimGroupInfo info;
+ info.name = ReadFixedLengthASCII(in, 17);
+ in >> info.unusedFlag;
+ in.skipRawData(2);
+ groups.append(info);
+
+ qDebug() << "Group name:" << info.name;
+ }
+
+ break;
+ }
+
+ case 'pai1': {
+ // Bits
+ QDataStream in(section.data);
+ InitDataStream(in);
+
+ quint8 loop;
+ quint16 fileCount, blockCount;
+ quint32 offsetOffset;
+
+ in >> frameSize;
+ in >> loop;
+ in.skipRawData(1);
+ in >> fileCount;
+ in >> blockCount;
+ in >> offsetOffset;
+
+ qDebug() << "Loop:" << loop << "- File count:" << fileCount << ", Block count:" << blockCount;
+ qDebug() << "Offset Offset:" << offsetOffset;
+
+ this->loop = (loop & 1);
+
+ importedFiles.reserve(fileCount);
+
+ for (int i = 0; i < fileCount; i++) {
+ quint32 offs;
+ in >> offs;
+
+ qint64 saveMe = in.device()->pos();
+ in.device()->seek(offs-8);
+ importedFiles.append(ReadVariableLengthASCII(in));
+ in.device()->seek(saveMe);
+
+ qDebug() << "Imported file:" << importedFiles.last();
+ }
+
+ // Now, each block
+ in.device()->seek(offsetOffset-8);
+ blocks.reserve(blockCount);
+
+ for (int i = 0; i < blockCount; i++) {
+ quint32 blockOffs;
+ in >> blockOffs;
+ qint64 saveInList = in.device()->pos();
+ in.device()->seek(blockOffs - 8);
+
+ // Block.
+ LYTAnimBlock block;
+ block.name = ReadFixedLengthASCII(in, 20);
+ quint8 pieceCount, type;
+ in >> pieceCount;
+ in >> type;
+ in.skipRawData(2);
+
+ block.isMaterial = (type == 1);
+
+ qDebug() << "Block @ " << QString::number(blockOffs,16) << ":" << block.name << "- Piece Count:" << pieceCount << "- Type:" << type << "IsMaterial:" << block.isMaterial;
+
+ // Now, the piece list
+ block.pieces.reserve(pieceCount);
+
+ for (int j = 0; j < pieceCount; j++) {
+ quint32 pieceOffs;
+ in >> pieceOffs;
+ qint64 saveInList2 = in.device()->pos();
+ in.device()->seek(blockOffs + pieceOffs - 8);
+
+ // Piece
+ LYTAnimPiece piece;
+ Magic pieceMagic(0);
+ in >> pieceMagic.value;
+
+ switch (pieceMagic.value) {
+ case 'RLPA': piece.type = piece.PaneAnim; break;
+ case 'RLTS': piece.type = piece.TexSRTAnim; break;
+ case 'RLVI': piece.type = piece.VisAnim; break;
+ case 'RLVC': piece.type = piece.VtxClrAnim; break;
+ case 'RLMC': piece.type = piece.MatClrAnim; break;
+ case 'RLTP': piece.type = piece.TexPatAnim; break;
+ case 'RLIM': piece.type = piece.IndTexSRTAnim; break;
+ }
+
+ quint8 entryCount;
+ in >> entryCount;
+ in.skipRawData(3);
+ qDebug("Piece: %c%c%c%c, Entry Count: %d", pieceMagic.str[3], pieceMagic.str[2], pieceMagic.str[1], pieceMagic.str[0], entryCount);
+
+ piece.entries.reserve(entryCount);
+
+ // ANOTHER LIST ARGHHHH
+ for (int k = 0; k < entryCount; k++) {
+ quint32 entryOffs;
+ in >> entryOffs;
+ qint64 saveInList3 = in.device()->pos();
+ in.device()->seek(blockOffs + pieceOffs + entryOffs - 8);
+
+ // Entry
+ LYTAnimEntry entry;
+ in >> entry.id;
+ in >> entry.target;
+ in >> entry.curveType;
+ in.skipRawData(1);
+
+ quint16 keyCount;
+ quint32 keyOffset;
+
+ in >> keyCount;
+ in.skipRawData(2);
+ in >> keyOffset;
+
+ qDebug() << "Entry ID:" << entry.id << "Target:" << entry.target << "CurveType:" << entry.curveType << "KeyCount:" << keyCount << "KeyOffset:" << keyOffset;
+
+ in.device()->seek(blockOffs + pieceOffs + entryOffs + keyOffset - 8);
+
+ if (piece.type == piece.TexPatAnim || piece.type == piece.VisAnim) {
+ entry.stepKeys.reserve(keyCount);
+
+ for (int l = 0; l < keyCount; l++) {
+ // Step Key
+ LYTAnimStepKey key;
+ in >> key.frame;
+ in >> key.value;
+ in.skipRawData(2);
+ qDebug() << "Step Key:" << key.frame << key.value;
+
+ entry.stepKeys.append(key);
+ }
+
+ } else {
+ entry.keys.reserve(keyCount);
+
+ for (int l = 0; l < keyCount; l++) {
+ // Key
+ LYTAnimHermiteKey key;
+ in >> key.frame;
+ in >> key.value;
+ in >> key.slope;
+ qDebug() << "Key:" << key.frame << key.value << key.slope;
+
+ entry.keys.append(key);
+ }
+ }
+
+ piece.entries.append(entry);
+ in.device()->seek(saveInList3);
+ }
+
+ block.pieces.append(piece);
+ in.device()->seek(saveInList2);
+ }
+
+ blocks.append(block);
+ in.device()->seek(saveInList);
+ }
+
+ break;
+ }
+
+ case 'pah1':
+ // Share
+ qFatal("AnimShare unsupported");
+ break;
+ }
+ }
+}
diff --git a/lyt/animation.h b/lyt/animation.h
new file mode 100644
index 0000000..efd626a
--- /dev/null
+++ b/lyt/animation.h
@@ -0,0 +1,68 @@
+#ifndef LYTANIMATION_H
+#define LYTANIMATION_H
+
+#include <QString>
+#include <QVector>
+#include <QList>
+#include <QStringList>
+
+struct LYTAnimGroupInfo {
+ QString name;
+ quint8 unusedFlag;
+};
+
+struct LYTAnimStepKey {
+ float frame;
+ quint16 value;
+};
+
+struct LYTAnimHermiteKey {
+ float frame, value, slope;
+};
+
+struct LYTAnimEntry {
+ quint8 id, target, curveType;
+ QVector<LYTAnimHermiteKey> keys;
+ QVector<LYTAnimStepKey> stepKeys;
+};
+
+struct LYTAnimPiece {
+ enum Type {
+ PaneAnim = 0,
+ TexSRTAnim,
+ VisAnim,
+ VtxClrAnim,
+ MatClrAnim,
+ TexPatAnim,
+ IndTexSRTAnim
+ };
+
+ Type type;
+ QList<LYTAnimEntry> entries;
+};
+
+struct LYTAnimBlock {
+ QString name;
+ bool isMaterial;
+ QList<LYTAnimPiece> pieces;
+};
+
+class LYTAnimation {
+public:
+ LYTAnimation(QByteArray data);
+ ~LYTAnimation();
+
+ QString name;
+ quint16 sourceTagNumber;
+ quint16 sourceStartFrame, sourceEndFrame;
+ bool recursiveBind;
+
+ QList<LYTAnimGroupInfo> groups;
+
+ quint16 frameSize;
+ bool loop;
+ QStringList importedFiles;
+ QList<LYTAnimBlock> blocks;
+};
+
+#endif // LYTANIMATION_H
diff --git a/lyt/materials/tevswaptable.cpp b/lyt/materials/tevswaptable.cpp
index a13a491..9121b78 100644
--- a/lyt/materials/tevswaptable.cpp
+++ b/lyt/materials/tevswaptable.cpp
@@ -50,10 +50,10 @@ void LYTTevSwapTable::readFromDataStream(QDataStream &in) {
quint8 val;
in >> (quint8&)val;
- mode[i].red = BitExtract(val, 2, 32 - 8);
- mode[i].green = BitExtract(val, 2, 32 - 6);
- mode[i].blue = BitExtract(val, 2, 32 - 4);
- mode[i].alpha = BitExtract(val, 2, 32 - 2);
+ mode[i].red = BitExtract(val, 2, 32 - 2);
+ mode[i].green = BitExtract(val, 2, 32 - 4);
+ mode[i].blue = BitExtract(val, 2, 32 - 6);
+ mode[i].alpha = BitExtract(val, 2, 32 - 8);
}
}
diff --git a/lyt/textbox.cpp b/lyt/textbox.cpp
index e943963..c845618 100644
--- a/lyt/textbox.cpp
+++ b/lyt/textbox.cpp
@@ -39,7 +39,7 @@ void LYTTextBox::dumpToDebug(bool showHeading) const {
qDebug() << "- Text:" << text;
qDebug() << "- Buffer Length:" << bufferLength;
qDebug() << "- Material:" << materialName << "- Font:" << fontName;
- qDebug() << "- Alignment:" << alignment << "- Alignment Override:" << alignmentOverride;
+ //qDebug() << "- Alignment:" << alignment << "- Alignment Override:" << alignmentOverride;
qDebug() << "- Colours:" << colour1 << "--" << colour2;
qDebug() << "- Font Size:" << fontSizeX << "x" << fontSizeY;
qDebug() << "- Char Space:" << charSpace << "- Line Space:" << lineSpace;
@@ -61,8 +61,8 @@ void LYTTextBox::writeToDataStream(QDataStream &out) const {
out << (quint16)materialNum;
out << (quint16)fontNum;
- out << (quint8)alignment;
- out << (quint8)alignmentOverride;
+ out << (quint8)(((int)textHorzPos) + (((int)textVertPos) * 3));
+ out << (quint8)alignment;
WritePadding(2, out);
@@ -110,8 +110,11 @@ void LYTTextBox::readFromDataStream(QDataStream &in) {
materialName = m_layout.materials.getNameOfIndex(materialNum);
fontName = m_layout.m_fontRefs.at(fontNum);
- in >> (quint8&)alignment;
- in >> (quint8&)alignmentOverride;
+ quint8 whatpos;
+ in >> (quint8&)whatpos;
+ textHorzPos = (OriginType)(whatpos % 3);
+ textVertPos = (OriginType)(whatpos / 3);
+ in >> (quint8&)alignment;
in.skipRawData(2); // padding
diff --git a/lyt/textbox.h b/lyt/textbox.h
index c61ef3a..564325d 100644
--- a/lyt/textbox.h
+++ b/lyt/textbox.h
@@ -42,8 +42,8 @@ public:
QString materialName;
QString fontName;
- quint8 alignment;
- quint8 alignmentOverride;
+ OriginType textHorzPos, textVertPos;
+ quint8 alignment;
QColor colour1;
QColor colour2;