Пример #1
0
        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));
                }
            }
        }