ANIM serialization fix

This commit is contained in:
Jack Andersen 2018-03-03 20:15:40 -10:00
parent 48c285be11
commit 055de86170
5 changed files with 9 additions and 10 deletions

View File

@ -268,9 +268,9 @@ void WordBitmap::write(athena::io::IStreamWriter& writer) const
for (atUint32 word : m_words) for (atUint32 word : m_words)
writer.writeUint32Big(word); writer.writeUint32Big(word);
} }
size_t WordBitmap::binarySize(size_t __isz) const void WordBitmap::binarySize(size_t& __isz) const
{ {
return __isz + m_words.size() * 4; __isz += m_words.size() * 4;
} }
} }

View File

@ -306,7 +306,7 @@ public:
void read(athena::io::IStreamReader& reader, size_t bitCount); void read(athena::io::IStreamReader& reader, size_t bitCount);
void write(athena::io::IStreamWriter& writer) const; void write(athena::io::IStreamWriter& writer) const;
void reserve(size_t bitCount) { m_words.reserve((bitCount + 31) / 32); } void reserve(size_t bitCount) { m_words.reserve((bitCount + 31) / 32); }
size_t binarySize(size_t __isz) const; void binarySize(size_t& __isz) const;
size_t getBitCount() const {return m_bitCount;} size_t getBitCount() const {return m_bitCount;}
bool getBit(size_t idx) const bool getBit(size_t idx) const
{ {

View File

@ -459,7 +459,6 @@ void ANIM::ANIM2::Enumerate<BigDNA::Write>(athena::io::IStreamWriter& writer)
head.binarySize(scratchSize); head.binarySize(scratchSize);
keyBmp.binarySize(scratchSize); keyBmp.binarySize(scratchSize);
scratchSize += bsSize; scratchSize += bsSize;
head.scratchSize = scratchSize;
if (m_version == 3) if (m_version == 3)
{ {
for (const std::pair<atUint32, bool>& bone : bones) for (const std::pair<atUint32, bool>& bone : bones)
@ -468,7 +467,7 @@ void ANIM::ANIM2::Enumerate<BigDNA::Write>(athena::io::IStreamWriter& writer)
desc.keyCount1 = keyframeCount; desc.keyCount1 = keyframeCount;
if (bone.second) if (bone.second)
desc.keyCount2 = keyframeCount; desc.keyCount2 = keyframeCount;
head.scratchSize = desc.binarySize(head.scratchSize); desc.binarySize(scratchSize);
} }
} }
else else
@ -479,9 +478,10 @@ void ANIM::ANIM2::Enumerate<BigDNA::Write>(athena::io::IStreamWriter& writer)
desc.keyCount1 = keyframeCount; desc.keyCount1 = keyframeCount;
if (bone.second) if (bone.second)
desc.keyCount2 = keyframeCount; desc.keyCount2 = keyframeCount;
head.scratchSize = desc.binarySize(head.scratchSize); desc.binarySize(scratchSize);
} }
} }
head.scratchSize = scratchSize;
head.write(writer); head.write(writer);
keyBmp.write(writer); keyBmp.write(writer);

View File

@ -133,12 +133,11 @@ struct ANIM : BigDNA
writer.writeUByte(qTZ); writer.writeUByte(qTZ);
} }
} }
size_t binarySize(size_t __isz) const void binarySize(size_t& __isz) const
{ {
__isz += 17; __isz += 17;
if (keyCount2) if (keyCount2)
__isz += 9; __isz += 9;
return __isz;
} }
}; };
@ -185,12 +184,11 @@ struct ANIM : BigDNA
writer.writeUint32Big(QinitTZ); writer.writeUint32Big(QinitTZ);
} }
} }
size_t binarySize(size_t __isz) const void binarySize(size_t& __isz) const
{ {
__isz += 24; __isz += 24;
if (keyCount2) if (keyCount2)
__isz += 12; __isz += 12;
return __isz;
} }
}; };
}; };

View File

@ -88,6 +88,7 @@ std::unique_ptr<u32[]> CFBStreamedCompression::GetRotationsAndOffsets(u32 words,
u32 bsWords = ComputeBitstreamWords(chans); u32 bsWords = ComputeBitstreamWords(chans);
u32* bsPtr = reinterpret_cast<u32*>(bs); u32* bsPtr = reinterpret_cast<u32*>(bs);
size_t wordsz = bsPtr - ret.get();
for (u32 w=0 ; w<bsWords ; ++w) for (u32 w=0 ; w<bsWords ; ++w)
bsPtr[w] = in.readUint32Big(); bsPtr[w] = in.readUint32Big();