void HwMesh::loadSkin() { isAnimated = true; DWORD tmp; char s[255]; pSkelet = new HwSkeleton(); HwSkeletBone *bone; DWORD bCount; f->read((char *)&bCount, sizeof(DWORD)); pSkelet->init(bCount); //BONES ------------------------------- for (int i = 0; i < bCount; i++) { //name f->read((char *)&tmp, sizeof(DWORD)); f->read((char *)s, tmp); f->seekg(1, ios::cur); s[tmp] = '\0'; bone = pSkelet->newBone(s); // pos & rot D3DXVECTOR3 v; D3DXQUATERNION r; f->read((char *)&v, sizeof(D3DXVECTOR3)); f->read((char *)&r, sizeof(D3DXQUATERNION)); bone->position() = v; bone->rotation() = r; } //END BONES --------------------------- while (true) { f->read((char *)&tmp, sizeof(DWORD)); if (tmp == HWMT_SUB) readAnimSub(); else if (tmp == HWMT_ANIM) readAnim(); else break; } }
void Model_KotOR::load(ParserContext &ctx) { if (ctx.mdl->readUint32LE() != 0) throw Common::Exception("Unsupported KotOR ASCII MDL"); uint32 sizeModelData = ctx.mdl->readUint32LE(); uint32 sizeRawData = ctx.mdl->readUint32LE(); ctx.offModelData = 12; ctx.offRawData = ctx.offModelData + sizeModelData; ctx.mdl->skip(8); // Function pointers _name = Common::readStringFixed(*ctx.mdl, Common::kEncodingASCII, 32); uint32 nodeHeadPointer = ctx.mdl->readUint32LE(); uint32 nodeCount = ctx.mdl->readUint32LE(); ctx.mdl->skip(24 + 4); // Unknown + Reference count uint8 type = ctx.mdl->readByte(); ctx.mdl->skip(3 + 2); // Padding + Unknown uint8 classification = ctx.mdl->readByte(); uint8 fogged = ctx.mdl->readByte(); ctx.mdl->skip(4); // Unknown uint32 animOffset, animCount; readArrayDef(*ctx.mdl, animOffset, animCount); ctx.mdl->skip(4); // Parent model pointer float boundingMin[3], boundingMax[3]; boundingMin[0] = ctx.mdl->readIEEEFloatLE(); boundingMin[1] = ctx.mdl->readIEEEFloatLE(); boundingMin[2] = ctx.mdl->readIEEEFloatLE(); boundingMax[0] = ctx.mdl->readIEEEFloatLE(); boundingMax[1] = ctx.mdl->readIEEEFloatLE(); boundingMax[2] = ctx.mdl->readIEEEFloatLE(); float radius = ctx.mdl->readIEEEFloatLE(); float modelScale = ctx.mdl->readIEEEFloatLE(); _superModelName = Common::readStringFixed(*ctx.mdl, Common::kEncodingASCII, 32); ctx.mdl->skip(4); // Root node pointer again ctx.mdl->skip(12); // Unknown uint32 nameOffset, nameCount; readArrayDef(*ctx.mdl, nameOffset, nameCount); std::vector<uint32> nameOffsets; readArray(*ctx.mdl, ctx.offModelData + nameOffset, nameCount, nameOffsets); readStrings(*ctx.mdl, nameOffsets, ctx.offModelData, ctx.names); newState(ctx); ModelNode_KotOR *rootNode = new ModelNode_KotOR(*this); ctx.nodes.push_back(rootNode); ctx.mdl->seek(ctx.offModelData + nodeHeadPointer); rootNode->load(ctx); addState(ctx); std::vector<uint32> animOffsets; readArray(*ctx.mdl, ctx.offModelData + animOffset, animCount, animOffsets); for (std::vector<uint32>::const_iterator offset = animOffsets.begin(); offset != animOffsets.end(); ++offset) { newState(ctx); readAnim(ctx, ctx.offModelData + *offset); addState(ctx); } }