void STRG::_read(athena::io::IStreamReader& reader) { atUint32 langCount = reader.readUint32Big(); atUint32 strCount = reader.readUint32Big(); std::vector<FourCC> readLangs; readLangs.reserve(langCount); for (atUint32 l=0 ; l<langCount ; ++l) { DNAFourCC lang; lang.read(reader); readLangs.emplace_back(lang); reader.seek(4); } langs.clear(); langs.reserve(langCount); for (FourCC& lang : readLangs) { std::vector<std::wstring> strs; reader.seek(strCount * 4 + 4); for (atUint32 s=0 ; s<strCount ; ++s) strs.emplace_back(reader.readWStringBig()); langs.emplace_back(lang, strs); } langMap.clear(); langMap.reserve(langCount); for (std::pair<FourCC, std::vector<std::wstring>>& item : langs) langMap.emplace(item.first, &item.second); }
void ANIM::ANIM2::read(athena::io::IStreamReader& reader) { Header head; head.read(reader); evnt = head.evnt; mainInterval = head.interval; WordBitmap keyBmp; keyBmp.read(reader, head.keyBitmapBitCount); frames.clear(); atUint32 frameAccum = 0; for (bool bit : keyBmp) { if (bit) frames.push_back(frameAccum); ++frameAccum; } reader.seek(8); bones.clear(); bones.reserve(head.boneChannelCount); channels.clear(); channels.reserve(head.boneChannelCount); atUint16 keyframeCount = 0; for (size_t b=0 ; b<head.boneChannelCount ; ++b) { ChannelDesc desc; desc.read(reader); bones.emplace_back(desc.id, desc.keyCount2 != 0); if (desc.keyCount1) { channels.emplace_back(); DNAANIM::Channel& chan = channels.back(); chan.type = DNAANIM::Channel::Type::Rotation; chan.i[0] = desc.initRX; chan.q[0] = desc.qRX; chan.i[1] = desc.initRY; chan.q[1] = desc.qRY; chan.i[2] = desc.initRZ; chan.q[2] = desc.qRZ; } keyframeCount = std::max(keyframeCount, desc.keyCount1); if (desc.keyCount2) { channels.emplace_back(); DNAANIM::Channel& chan = channels.back(); chan.type = DNAANIM::Channel::Type::Translation; chan.i[0] = desc.initTX; chan.q[0] = desc.qTX; chan.i[1] = desc.initTY; chan.q[1] = desc.qTY; chan.i[2] = desc.initTZ; chan.q[2] = desc.qTZ; } } size_t bsSize = DNAANIM::ComputeBitstreamSize(keyframeCount, channels); std::unique_ptr<atUint8[]> bsData = reader.readUBytes(bsSize); DNAANIM::BitstreamReader bsReader; chanKeys = bsReader.read(bsData.get(), keyframeCount, channels, head.rotDiv, head.translationMult); }