Example #1
0
        public Kh2Map(GraphicsDevice graphics, IDataContent content, string path)
        {
            _graphics = graphics;

            var binarc = content.FileOpen(path).Using(Bar.Read);

            _skybox0MeshGroup = FromMdlx(graphics, binarc, "SK0") ?? Empty;
            _skybox1MeshGroup = FromMdlx(graphics, binarc, "SK1") ?? Empty;
            _mapMeshGroup     = FromMdlx(graphics, binarc, "MAP") ?? Empty;

            _bobEntities = binarc.ForEntry("out", Bar.EntryType.BgObjPlacement, BobDescriptor.Read)?
                           .Select(x => new BobEntity(x))?.ToList() ?? new List <BobEntity>();

            var bobModels   = binarc.ForEntries("BOB", Bar.EntryType.Model, Mdlx.Read).ToList();
            var bobTextures = binarc.ForEntries("BOB", Bar.EntryType.ModelTexture, ModelTexture.Read).ToList();

            _bobModels = new List <MeshGroup>(bobModels.Count);
            for (var i = 0; i < bobModels.Count; i++)
            {
                _bobModels.Add(new MeshGroup
                {
                    MeshDescriptors = MeshLoader.FromKH2(bobModels[i]).MeshDescriptors,
                    Textures        = bobTextures[i].LoadTextures(graphics).ToArray()
                });
            }
        }
Example #2
0
        private void LoadMap(int worldIndex, int placeIndex)
        {
            Log.Info($"Map={worldIndex},{placeIndex}");

            var fileName = Kernel.GetMapFileName(worldIndex, placeIndex);
            var entries  = _dataContent.FileOpen(fileName).Using(Bar.Read);

            AddMesh(FromMdlx(_graphics.GraphicsDevice, entries, "SK0"));
            AddMesh(FromMdlx(_graphics.GraphicsDevice, entries, "SK1"));
            AddMesh(FromMdlx(_graphics.GraphicsDevice, entries, "MAP"));

            _bobEntities = entries.ForEntry("out", Bar.EntryType.BgObjPlacement, BobDescriptor.Read)?
                           .Select(x => new BobEntity(x))?.ToList() ?? new List <BobEntity>();

            var bobModels   = entries.ForEntries("BOB", Bar.EntryType.Model, Mdlx.Read).ToList();
            var bobTextures = entries.ForEntries("BOB", Bar.EntryType.ModelTexture, ModelTexture.Read).ToList();

            for (var i = 0; i < bobModels.Count; i++)
            {
                _bobModels.Add(new MeshGroup
                {
                    MeshDescriptors = MeshLoader.FromKH2(bobModels[i]).MeshDescriptors,
                    Textures        = bobTextures[i].LoadTextures(_graphics.GraphicsDevice).ToArray()
                });
            }
        }
Example #3
0
 private static MeshGroup FromMdlx(
     GraphicsDevice graphics, ArchiveManager archiveManager, string modelName, string textureName)
 {
     Log.Info($"Load model={modelName} texture={textureName}");
     return(MeshLoader.FromKH2(graphics,
                               archiveManager.Get <Mdlx>(modelName),
                               archiveManager.Get <ModelTexture>(textureName)));
 }
Example #4
0
 public void Invalidate()
 {
     MeshGroup = new MeshGroup
     {
         MeshDescriptors = MeshLoader.FromKH2(_model).MeshDescriptors,
         Textures        = _kingdomTextures
     };
 }
Example #5
0
        public MeshGroup this[int objId]
        {
            get
            {
                if (_meshGroups.TryGetValue(objId, out var meshGroup))
                {
                    return(meshGroup);
                }

                var objEntryName = _objEntryLookupReversed[objId];

                var modelPath     = Path.Combine(_objPath, objEntryName);
                var modelFileName = modelPath + ".mdlx";
                if (File.Exists(modelFileName))
                {
                    var mdlxEntries = File.OpenRead(modelFileName).Using(Bar.Read);
                    var modelEntry  = mdlxEntries.FirstOrDefault(x => x.Type == Bar.EntryType.Model);
                    if (modelEntry != null)
                    {
                        var          model    = Mdlx.Read(modelEntry.Stream);
                        ModelTexture textures = null;

                        var textureEntry = mdlxEntries.FirstOrDefault(x => x.Type == Bar.EntryType.ModelTexture);
                        if (textureEntry != null)
                        {
                            textures = ModelTexture.Read(textureEntry.Stream);
                        }

                        var modelMotion = MeshLoader.FromKH2(model);
                        modelMotion.ApplyMotion(modelMotion.InitialPose);
                        meshGroup = new MeshGroup
                        {
                            MeshDescriptors = modelMotion.MeshDescriptors,
                            Textures        = textures == null ? new IKingdomTexture[0] : textures.LoadTextures(_graphics).ToArray()
                        };
                    }
                    else
                    {
                        meshGroup = EmptyMeshGroup;
                    }
                }
                else
                {
                    meshGroup = EmptyMeshGroup;
                }

                _meshGroups[objId] = meshGroup;
                return(meshGroup);
            }
        }
Example #6
0
        public void LoadMesh(GraphicsDevice graphics)
        {
            var objEntry = Kernel.ObjEntries.FirstOrDefault(x => x.ObjectId == ObjectId);

            if (objEntry == null)
            {
                Log.Warn("Object ID {0} not found.", ObjectId);
                return;
            }

            IsPlayer = objEntry.ObjectType == Objentry.Type.PLAYER;

            var modelName = $"obj/{objEntry.ModelName}.mdlx";

            using var stream = Kernel.DataContent.FileOpen(modelName);
            var entries = Bar.Read(stream);

            _model = entries.ForEntry(x => x.Type == Bar.EntryType.Model, Mdlx.Read);
            Model  = MeshLoader.FromKH2(_model);

            var texture = entries.ForEntry("tim_", Bar.EntryType.ModelTexture, ModelTexture.Read);

            Textures = texture.LoadTextures(graphics).ToArray();

            ObjectCollisions = entries.ForEntry(x => x.Type == Bar.EntryType.ModelCollision && x.Stream.Length > 0,
                                                ObjectCollision.Read) ?? new List <ObjectCollision>();

            try
            {
                var msetName = $"obj/{objEntry.AnimationName}";
                if (Kernel.DataContent.FileExists(msetName))
                {
                    var msetEntries = Kernel.DataContent.FileOpen(msetName).Using(Bar.Read);
                    Motion = new Kh2MotionEngine(msetEntries)
                    {
                        CurrentAnimationIndex = 0
                    };
                }
                else
                {
                    Motion = new Kh2MotionEngine();
                    Log.Warn("MSET {0} does not exist", objEntry.AnimationName);
                }
            }
            catch (System.NotImplementedException)
            {
                Motion = null;
            }
        }
Example #7
0
        public void LoadMesh(GraphicsDevice graphics)
        {
            var objEntry = Kernel.ObjEntries.FirstOrDefault(x => x.ObjectId == ObjectId);

            if (objEntry == null)
            {
                Log.Warn($"Object ID {ObjectId} not found.");
                return;
            }

            var fileName = $"obj/{objEntry.ModelName}.mdlx";

            using var stream = Kernel.DataContent.FileOpen(fileName);
            var entries = Bar.Read(stream);
            var model   = entries.ForEntry(x => x.Type == Bar.EntryType.Model, Mdlx.Read);
            var texture = entries.ForEntry("tim_", Bar.EntryType.ModelTexture, ModelTexture.Read);

            Mesh = MeshLoader.FromKH2(graphics, model, texture);
        }
Example #8
0
        private static MeshGroup FromMdlx(GraphicsDevice graphics, IEnumerable <Bar.Entry> entries, string name)
        {
            var model = entries.ForEntry(name, Bar.EntryType.Model, Mdlx.Read);

            if (model == null)
            {
                return(null);
            }

            var textures = entries.ForEntry(name, Bar.EntryType.ModelTexture, ModelTexture.Read);

            if (model == null)
            {
                return(null);
            }

            return(new MeshGroup
            {
                MeshDescriptors = MeshLoader.FromKH2(model).MeshDescriptors,
                Textures = textures.LoadTextures(graphics).ToArray()
            });
        }
        public MeshGroup this[int objId]
        {
            get
            {
                if (_meshGroups.TryGetValue(objId, out var meshGroup))
                {
                    return(meshGroup);
                }

                var objEntryName = _objEntryLookupReversed[objId];

                var modelPath     = Path.Combine(_objPath, objEntryName);
                var modelFileName = modelPath + ".mdlx";
                if (File.Exists(modelFileName))
                {
                    var mdlxEntries = File.OpenRead(modelFileName).Using(Bar.Read);
                    var modelEntry  = mdlxEntries.FirstOrDefault(x => x.Type == Bar.EntryType.Model);
                    if (modelEntry != null)
                    {
                        var model    = Mdlx.Read(modelEntry.Stream);
                        var textures = ModelTexture.Read(mdlxEntries.First(x => x.Type == Bar.EntryType.ModelTexture).Stream);
                        meshGroup = MeshLoader.FromKH2(_graphics, model, textures);
                    }
                    else
                    {
                        meshGroup = EmptyMeshGroup;
                    }
                }
                else
                {
                    meshGroup = EmptyMeshGroup;
                }

                _meshGroups[objId] = meshGroup;
                return(meshGroup);
            }
        }
Example #10
0
        private void LoadMap(int worldIndex, int placeIndex)
        {
            Log.Info($"Map={worldIndex},{placeIndex}");

            string fileName;

            if (_kernel.IsReMix)
            {
                fileName = $"map/{Constants.WorldIds[worldIndex]}{placeIndex:D02}.map";
            }
            else
            {
                fileName = $"map/{_kernel.Language}/{Constants.WorldIds[worldIndex]}{placeIndex:D02}.map";
            }

            var entries = _dataContent.FileOpen(fileName).Using(Bar.Read);

            AddMesh(FromMdlx(_graphics.GraphicsDevice, entries, "SK0"));
            AddMesh(FromMdlx(_graphics.GraphicsDevice, entries, "SK1"));
            AddMesh(FromMdlx(_graphics.GraphicsDevice, entries, "MAP"));

            _bobEntities = entries.ForEntry("out", Bar.EntryType.BobDescriptor, BobDescriptor.Read)?
                           .Select(x => new BobEntity(x))?.ToList() ?? new List <BobEntity>();

            var bobModels   = entries.ForEntries("BOB", Bar.EntryType.Model, Mdlx.Read).ToList();
            var bobTextures = entries.ForEntries("BOB", Bar.EntryType.ModelTexture, ModelTexture.Read).ToList();

            for (var i = 0; i < bobModels.Count; i++)
            {
                var bobMesh = MeshLoader.FromKH2(_graphics.GraphicsDevice, bobModels[i], bobTextures[i]);
                if (bobMesh != null)
                {
                    _bobModels.Add(bobMesh);
                }
            }
        }
Example #11
0
 private static MeshGroup FromMdlx(GraphicsDevice graphics, IEnumerable <Bar.Entry> entries, string name)
 {
     return(MeshLoader.FromKH2(graphics,
                               entries.ForEntry(name, Bar.EntryType.Model, Mdlx.Read),
                               entries.ForEntry(name, Bar.EntryType.ModelTexture, ModelTexture.Read)));
 }
Example #12
0
 public void Invalidate()
 {
     MeshGroup          = MeshLoader.FromKH2(_model);
     MeshGroup.Textures = _kingdomTextures;
 }