internal static void LoadZoneFile(string path, EngineCore engine) { using (var zip = ZipFile.OpenRead(path)) { using (var ms = new MemoryStream()) { using (var temp = zip.GetEntry("main.oes")?.Open()) temp?.CopyTo(ms); ms.Position = 0; var zone = OESFile.Read <OESZone>(ms); WriteLine($"Loading {zone.Name}"); engine.Add(FromMeshes(FromSkin(zone.Find <OESSkin>().First(), zip), new[] { Matrix4x4.Identity }, zone.Find <OESStaticMesh>())); var objInstances = zone.Find <OESObject>().ToDictionary(x => x, x => new List <Matrix4x4>()); zone.Find <OESInstance>().ForEach(inst => { objInstances[inst.Object].Add(Matrix4x4.CreateScale(inst.Scale) * Matrix4x4.CreateFromQuaternion(inst.Rotation) * Matrix4x4.CreateTranslation(inst.Position)); }); foreach (var(obj, instances) in objInstances) { engine.Add(FromMeshes( FromSkin(obj.Find <OESSkin>().First(), zip), instances.ToArray(), obj.Find <OESStaticMesh>() )); } zone.Find <OESLight>().ForEach(light => engine.AddLight(light.Position, light.Radius, light.Attenuation, light.Color)); } } }