Пример #1
0
        public override void OnClick()
        {
            if (loaded)
            {
                return;
            }

            STGenericModel model = new STGenericModel(Label);

            model.Skeleton = new SkeletonFormat();
            model.Meshes.Add(new STGenericMesh());

            if (DataParser.Version == DICT.GameVersion.LM2)
            {
                model.Skeleton = LM2.SkeletonChunk.Read(File.ChunkEntry.SubData);
            }
            if (DataParser.Version == DICT.GameVersion.LM3)
            {
                model.Skeleton = LM3.SkeletonChunk.Read(File.ChunkEntry.SubData);
            }

            Tag = new ModelFormat(model);

            foreach (var child in model.CreateTreeHiearchy().Children)
            {
                AddChild(child);
            }

            loaded = true;
        }
Пример #2
0
        public override void OnClick()
        {
            if (loaded)
            {
                return;
            }

            STGenericModel model = new STGenericModel(Label);

            model.Skeleton = new SkeletonFormat();
            for (int i = 0; i < DataParser.Files.Count; i++)
            {
                if (DataParser.Files[i].Hash == File.Hash &&
                    DataParser.Files[i].ChunkEntry.ChunkType == ChunkFileType.Skeleton)
                {
                    if (DataParser.Version == DICT.GameVersion.LM2)
                    {
                        model.Skeleton = LM2.SkeletonChunk.Read(DataParser.Files[i].ChunkEntry.SubData);
                    }
                    if (DataParser.Version == DICT.GameVersion.LM3)
                    {
                        model.Skeleton = LM3.SkeletonChunk.Read(DataParser.Files[i].ChunkEntry.SubData);
                    }
                }
            }

            Dictionary <uint, int> boneHashToID = ((SkeletonFormat)model.Skeleton).BoneHashToID;

            if (DataParser.Version == DICT.GameVersion.LM3)
            {
                var modelList = ModelChunk.Read(File.ChunkEntry.SubData, boneHashToID);

                /*   var materialChunk = File.ChunkEntry.SubData.FirstOrDefault(x => x.ChunkType == ChunkDataType.MaterialData);
                 * var materialLookupChunk = File.ChunkEntry.SubData.FirstOrDefault(x => x.ChunkType == ChunkDataType.MaterialLookupTable);
                 *
                 * var matChunks = MaterialLoaderHelper.CreateMaterialChunkList(materialChunk.Data,
                 *     materialLookupChunk.Data, modelList.SelectMany(x => x.Meshes).ToList());*/

                int index = 0;
                foreach (var mdl in modelList)
                {
                    foreach (var mesh in mdl.Meshes)
                    {
                        var genericMesh = new STGenericMesh();
                        genericMesh.Name = Hashing.CreateHashString(mesh.MeshHeader.Hash);
                        if (Hashing.HashNames.ContainsKey(mesh.MeshHeader.MaterialHash))
                        {
                            genericMesh.Name += $"_{Hashing.CreateHashString(mesh.MeshHeader.MaterialHash)}";
                        }

                        Console.WriteLine($"MESH_HASHM {Hashing.CreateHashString(mesh.MeshHeader.MaterialHash)}");
                        Console.WriteLine($"MESH_HASHV {Hashing.CreateHashString(mesh.MeshHeader.VertexFormatHash)}");

                        genericMesh.Vertices.AddRange(mesh.Vertices);

                        var poly = new STPolygonGroup();
                        poly.Faces = mesh.Faces.ToList();
                        genericMesh.PolygonGroups.Add(poly);
                        model.Meshes.Add(genericMesh);

                        var material = new LMMaterial();
                        poly.Material = material;

                        material.TextureMaps.Add(new STGenericTextureMap()
                        {
                            Name = Hashing.CreateHashString(mesh.Material.DiffuseHash),
                            Type = STTextureType.Diffuse,
                        });
                        index++;
                    }
                }
            }
            else
            {
                var modelList = LM2.ModelChunk.Read(File.ChunkEntry.SubData, boneHashToID);
                foreach (var mdl in modelList)
                {
                    foreach (var mesh in mdl.Meshes)
                    {
                        var genericMesh = new STGenericMesh();
                        genericMesh.Name = Hashing.CreateHashString(mesh.MeshHeader.Hash);
                        if (Hashing.HashNames.ContainsKey(mesh.MeshHeader.MaterialHash))
                        {
                            genericMesh.Name += $"_{Hashing.CreateHashString(mesh.MeshHeader.MaterialHash)}";
                        }

                        genericMesh.Name += $"_{mesh.MeshHeader.VertexFormatHash}_{VertexLoaderExtension.GetStride(mesh.MeshHeader.VertexFormatHash)}";

                        uint vertexStride = VertexLoaderExtension.GetStride(mesh.MeshHeader.VertexFormatHash);

                        if (mesh.Vertices.Count == 0)
                        {
                            continue;
                        }

                        genericMesh.Vertices.AddRange(mesh.Vertices);

                        var poly = new STPolygonGroup();
                        poly.Faces = mesh.Faces.ToList();
                        genericMesh.PolygonGroups.Add(poly);
                        model.Meshes.Add(genericMesh);

                        var material = new LMMaterial();
                        material.IsAmbientMap = mesh.Material.IsAmbientMap;
                        poly.Material         = material;

                        material.TextureMaps.Add(new STGenericTextureMap()
                        {
                            Name = Hashing.CreateHashString(mesh.Material.DiffuseTextureHash),
                            Type = STTextureType.Diffuse,
                        });

                        if (mesh.Material.HasShadowMap)
                        {
                            material.TextureMaps.Add(new STGenericTextureMap()
                            {
                                Name = Hashing.CreateHashString(mesh.Material.ShadowTextureHash),
                                Type = STTextureType.Shadow,
                            });
                        }
                    }
                }
            }


            Tag = new ModelFormat(model);

            foreach (var child in model.CreateTreeHiearchy().Children)
            {
                AddChild(child);
            }

            loaded = true;
        }