public void ReadFromFilePart2(BinaryReader reader, FrameSkeleton skeleton, FrameBlendInfo blendInfo) { this.skeleton = skeleton; this.blendInfo = blendInfo; //do rest matrices. restPose = new TransformMatrix[skeleton.NumBones[0]]; for (int i = 0; i != restPose.Length; i++) { restPose[i] = new TransformMatrix(reader); } //unknown transform. unkTrasform = new TransformMatrix(reader); //attachments. int length1 = reader.ReadInt32(); attachmentReferences = new AttachmentReference[length1]; for (int i = 0; i != length1; i++) { attachmentReferences[i] = new AttachmentReference(reader); } //unknwon. unkFlags = reader.ReadUInt32(); physSplitSize = reader.ReadInt32(); hitBoxSize = reader.ReadInt32(); if (physSplitSize > 0) { nPhysSplits = reader.ReadInt16(); } else { nPhysSplits = 0; } int totalSplits = 0; blendMeshSplits = new WeightedByMeshSplit[nPhysSplits]; for (int i = 0; i != nPhysSplits; i++) { blendMeshSplits[i] = new WeightedByMeshSplit(reader); totalSplits += blendMeshSplits[i].Data.Length; } hitBoxInfo = new HitBoxInfo[totalSplits]; for (int i = 0; i != hitBoxInfo.Length; i++) { hitBoxInfo[i] = new HitBoxInfo(reader); } }
/// <summary> /// Reads the file into the memory. /// </summary> /// <param name="reader"></param> public void ReadFromFile(BinaryReader reader) { header = new FrameHeader(); header.ReadFromFile(reader); objectTypes = new int[header.NumObjects]; frameBlocks = new int[header.SceneFolders.Length + header.NumGeometries + header.NumMaterialResources + header.NumBlendInfos + header.NumSkeletons + header.NumSkelHierachies]; int j = 0; for (int i = 0; i != header.SceneFolders.Length; i++) { frameScenes.Add(header.SceneFolders[i].RefID, header.SceneFolders[i]); frameBlocks[j++] = header.SceneFolders[i].RefID; } for (int i = 0; i != header.NumGeometries; i++) { FrameGeometry geo = new FrameGeometry(reader); frameGeometries.Add(geo.RefID, geo); frameBlocks[j++] = geo.RefID; } for (int i = 0; i != header.NumMaterialResources; i++) { FrameMaterial mat = new FrameMaterial(reader); frameMaterials.Add(mat.RefID, mat); frameBlocks[j++] = mat.RefID; } for (int i = 0; i != header.NumBlendInfos; i++) { FrameBlendInfo blendInfo = new FrameBlendInfo(reader); frameBlendInfos.Add(blendInfo.RefID, blendInfo); frameBlocks[j++] = blendInfo.RefID; } for (int i = 0; i != header.NumSkeletons; i++) { FrameSkeleton skeleton = new FrameSkeleton(reader); frameSkeletons.Add(skeleton.RefID, skeleton); frameBlocks[j++] = skeleton.RefID; } for (int i = 0; i != header.NumSkelHierachies; i++) { FrameSkeletonHierachy skeletonHierachy = new FrameSkeletonHierachy(reader); frameSkeletonHierachies.Add(skeletonHierachy.RefID, skeletonHierachy); frameBlocks[j++] = skeletonHierachy.RefID; } if (header.NumObjects > 0) { for (int i = 0; i != header.NumObjects; i++) { objectTypes[i] = reader.ReadInt32(); } for (int i = 0; i != header.NumObjects; i++) { FrameObjectBase newObject = new FrameObjectBase(); if (objectTypes[i] == (int)ObjectType.Joint) { newObject = new FrameObjectJoint(reader); } else if (objectTypes[i] == (int)ObjectType.SingleMesh) { newObject = new FrameObjectSingleMesh(reader); FrameObjectSingleMesh mesh = newObject as FrameObjectSingleMesh; if (mesh.MeshIndex != -1) { mesh.AddRef(FrameEntryRefTypes.Mesh, frameBlocks[mesh.MeshIndex]); } if (mesh.MaterialIndex != -1) { mesh.AddRef(FrameEntryRefTypes.Material, frameBlocks[mesh.MaterialIndex]); } } else if (objectTypes[i] == (int)ObjectType.Frame) { newObject = new FrameObjectFrame(reader); } else if (objectTypes[i] == (int)ObjectType.Light) { newObject = new FrameObjectLight(reader); } else if (objectTypes[i] == (int)ObjectType.Camera) { newObject = new FrameObjectCamera(reader); } else if (objectTypes[i] == (int)ObjectType.Component_U00000005) { newObject = new FrameObjectComponent_U005(reader); } else if (objectTypes[i] == (int)ObjectType.Sector) { newObject = new FrameObjectSector(reader); } else if (objectTypes[i] == (int)ObjectType.Dummy) { newObject = new FrameObjectDummy(reader); } else if (objectTypes[i] == (int)ObjectType.ParticleDeflector) { newObject = new FrameObjectDeflector(reader); } else if (objectTypes[i] == (int)ObjectType.Area) { newObject = new FrameObjectArea(reader); } else if (objectTypes[i] == (int)ObjectType.Target) { newObject = new FrameObjectTarget(reader); } else if (objectTypes[i] == (int)ObjectType.Model) { FrameObjectModel mesh = new FrameObjectModel(reader); mesh.ReadFromFile(reader); mesh.ReadFromFilePart2(reader, frameSkeletons[frameBlocks[mesh.SkeletonIndex]], frameBlendInfos[frameBlocks[mesh.BlendInfoIndex]]); mesh.AddRef(FrameEntryRefTypes.Mesh, frameBlocks[mesh.MeshIndex]); mesh.AddRef(FrameEntryRefTypes.Material, frameBlocks[mesh.MaterialIndex]); mesh.AddRef(FrameEntryRefTypes.BlendInfo, frameBlocks[mesh.BlendInfoIndex]); mesh.AddRef(FrameEntryRefTypes.Skeleton, frameBlocks[mesh.SkeletonIndex]); mesh.AddRef(FrameEntryRefTypes.SkeletonHierachy, frameBlocks[mesh.SkeletonHierachyIndex]); newObject = mesh; } else if (objectTypes[i] == (int)ObjectType.Collision) { newObject = new FrameObjectCollision(reader); } frameObjects.Add(newObject.RefID, newObject); } } DefineFrameBlockParents(); }