コード例 #1
0
ファイル: Program.cs プロジェクト: jam1garner/SSBHLib
        public static Matl LibraryToMATL(MaterialLibrary library)
        {
            Matl matl = new Matl
            {
                Entries = new MatlEntry[library.material.Length]
            };

            for (int i = 0; i < library.material.Length; i++)
            {
                MatlEntry entry = new MatlEntry
                {
                    MaterialLabel = library.material[i].label,
                    MaterialName  = library.material[i].name,
                    Attributes    = new MatlAttribute[library.material[i].param.Length]
                };

                for (int j = 0; j < library.material[i].param.Length; j++)
                {
                    entry.Attributes[j] = new MatlAttribute
                    {
                        ParamId = library.material[i].param[j].name,

                        DataObject = library.material[i].param[j].value
                    };
                }

                matl.Entries[i] = entry;
            }

            return(matl);
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: jam1garner/SSBHLib
        public static MaterialLibrary MATLtoLibrary(Matl matlFile)
        {
            MaterialLibrary library = new MaterialLibrary
            {
                material = new Material[matlFile.Entries.Length]
            };

            int entryIndex = 0;

            foreach (var entry in matlFile.Entries)
            {
                Material mat = new Material();
                mat.name  = entry.MaterialName;
                mat.label = entry.MaterialLabel;

                mat.param = new MatlXmlAttribute[entry.Attributes.Length];

                int attribIndex = 0;
                foreach (var attr in entry.Attributes)
                {
                    MatlXmlAttribute attrib = new MatlXmlAttribute();
                    attrib.name              = attr.ParamId;
                    attrib.value             = attr.DataObject;
                    mat.param[attribIndex++] = attrib;
                }

                library.material[entryIndex] = mat;
                entryIndex++;
            }

            return(library);
        }
コード例 #3
0
ファイル: MatlNode.cs プロジェクト: zabimaru1000/SSBHLib
 public override void Open()
 {
     if (Ssbh.TryParseSsbhFile(AbsolutePath, out Matl newMaterial))
     {
         Material = newMaterial;
     }
 }
コード例 #4
0
ファイル: Program.cs プロジェクト: jam1garner/SSBHLib
        private static void SerializeMatl(string inputPath, string outputPath, XmlSerializer serializer)
        {
            if (outputPath == null)
            {
                outputPath = GetFullPathWithoutExtension(inputPath) + "_out.xml";
            }

            Console.WriteLine($"Converting {Path.GetFileName(inputPath)} to {outputPath}...");
            if (Ssbh.TryParseSsbhFile(inputPath, out SsbhFile file))
            {
                Matl matlFile = (Matl)file;

                MaterialLibrary library = MATLtoLibrary(matlFile);

                using (TextWriter writer = new StringWriter())
                {
                    serializer.Serialize(writer, library);
                    string serial = writer.ToString();
                    File.WriteAllText(outputPath, serial);
                }
            }
            else
            {
                Console.WriteLine("Error reading matl file");
            }
        }
コード例 #5
0
        private static MaterialLibrary MatlToLibrary(Matl matlFile)
        {
            var library = new MaterialLibrary
            {
                materials = matlFile.Entries.Select(e => CreateMaterial(e)).ToArray()
            };

            return(library);
        }
コード例 #6
0
 public override void Open()
 {
     if (Ssbh.TryParseSsbhFile(AbsolutePath, out SsbhFile ssbhFile))
     {
         if (ssbhFile is Matl)
         {
             Material = (Matl)ssbhFile;
         }
     }
 }
コード例 #7
0
        private static Matl LibraryToMATL(MaterialLibrary library)
        {
            var matl = new Matl();

            if (library.materials != null)
            {
                matl.Entries = library.materials.Select(m => CreateEntry(m)).ToArray();
            }

            return(matl);
        }
コード例 #8
0
        public void SetAutoMaterial(int id)
        {
            Matl FemapMaterial = FemapModel.feMatl;

            FemapMaterial.Active = 1;
            FemapMaterial.type   = zMaterialType.FMT_ISOTROPIC;
            FemapMaterial.GetLibrary(id);
            FemapMaterial.Put(1);
            FemapMaterial.Reset();
            FemapModel.feView.Regenerate();
        }
コード例 #9
0
ファイル: SerializeMatl.cs プロジェクト: ssbucarlos/SSBHLib
        public void EmptyMatl()
        {
            var matl   = new Matl();
            var writer = new StringWriter();

            MatlSerialization.SerializeMatl(writer, matl);
            var expected = @"<?xml version=""1.0"" encoding=""utf-16""?>
<MaterialLibrary xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" />";

            Assert.AreEqual(expected, writer.ToString());
        }
コード例 #10
0
ファイル: Program.cs プロジェクト: Struggleton/SSBHLib
        private static void DeserializeXml(string inputPath, string outputPath, XmlSerializer serializer)
        {
            Console.WriteLine($"Converting {Path.GetFileName(inputPath)} to {outputPath}.numatb...");
            using (TextReader reader = new StringReader(File.ReadAllText(inputPath)))
            {
                var result = (MaterialLibrary)serializer.Deserialize(reader);

                Matl newmatl = LibraryToMATL(result);

                Ssbh.TrySaveSsbhFile(outputPath, newmatl);
            }
        }
コード例 #11
0
ファイル: NumdlNode.cs プロジェクト: kira0x1/SSBHLib
        private IRenderable CreateRenderableModel()
        {
            NumsbhNode meshNode = null;
            NuhlpbNode hlpbNode = null;
            RSkeleton  skeleton = null;
            Matl       material = null;

            var textureByName = new Dictionary <string, SFGraphics.GLObjects.Textures.Texture>();

            GetNodesForRendering(ref meshNode, ref hlpbNode, ref skeleton, ref material, textureByName);

            return(new RNumdl(model, skeleton, material, meshNode, hlpbNode, textureByName));
        }
コード例 #12
0
ファイル: NumdlNode.cs プロジェクト: zabimaru1000/SSBHLib
        private IRenderable CreateRenderableModel()
        {
            NumsbhNode meshNode = null;
            NuhlpbNode hlpbNode = null;
            RSkeleton  skeleton = null;
            Matl       material = null;
            XmbNode    modelXmb = null;
            XmbNode    lodXmb   = null;

            var textureByName = new Dictionary <string, RTexture>();

            GetNodesForRendering(ref meshNode, ref hlpbNode, ref skeleton, ref material, ref modelXmb, ref lodXmb, textureByName);

            return(new RNumdl(model, skeleton, material, meshNode, hlpbNode, modelXmb, lodXmb, textureByName));
        }
コード例 #13
0
ファイル: FEAForm.cs プロジェクト: ehotsk8/SPMAC_Femap-API
        public FEAForm(model FemapModel)
        {
            InitializeComponent();
            this.FemapModel = FemapModel;
            newPropertyRadioButton.IsChecked = true;
            propertyComboBox.Enabled         = false;

            Matl materials = FemapModel.feMatl;

            materials.GetTitleList(1, FemapModel.feMatl.CountSet(),
                                   out CountMaterials, out MaterialsIDs, out MaterialsTitles);

            List <ListData> materialList = new List <ListData>();

            if (CountMaterials > 0)
            {
                for (int i = 0; i < ((string[])MaterialsTitles).Length; i++)
                {
                    materialList.Add(new ListData(((string[])MaterialsTitles)[i]));
                }
                MaterialComboBox.DataSource = materialList;
                UpdateCombo(CountMaterials, (string[])MaterialsTitles, (int[])MaterialsIDs);
            }

            Prop properties = FemapModel.feProp;

            properties.GetTitleList(1, FemapModel.feProp.CountSet(),
                                    out CountOfProperties, out PropertyIDs, out PropertyTitles);

            List <ListData> propertyList = new List <ListData>();

            if (CountOfProperties > 0)
            {
                for (int i = 0; i < ((string[])PropertyTitles).Length; i++)
                {
                    propertyList.Add(new ListData(((string[])PropertyTitles)[i]));
                }
                propertyComboBox.DataSource = propertyList;
                UpdateCombo(CountOfProperties, (string[])PropertyTitles, (int[])PropertyIDs);
                listOfPropertyRadioButton.IsChecked = true;
                TitleBox.Enabled         = false;
                propertyComboBox.Enabled = true;
            }
        }
コード例 #14
0
        public RNumdl(Modl modl, RSkeleton skeleton, Matl matl, NumshbNode meshNode, NuhlpbNode hlpbNode, XmbNode modelXmb, XmbNode lodXmb,
                      Dictionary <string, RTexture> textureByName)
        {
            Modl          = modl;
            Skeleton      = skeleton;
            Matl          = matl;
            ModelXmb      = modelXmb?.Xmb;
            LodXmb        = lodXmb?.Xmb;
            TextureByName = textureByName;

            if (meshNode != null)
            {
                RenderModel = meshNode.GetRenderModel(Skeleton);
            }

            UpdateMaterials(matl);
            if (Skeleton != null)
            {
                hlpbNode?.AddToRenderSkeleton(Skeleton);
            }
        }
コード例 #15
0
ファイル: NumdlNode.cs プロジェクト: schiggysmallz/SSBHLib
        private IRenderable CreateRenderableModel()
        {
            NumsbhNode meshNode = null;
            NuhlpbNode hlpbNode = null;
            RSkeleton  skeleton = null;
            Matl       material = null;
            // TODO: Add remaining default textures.
            var textureByName = new Dictionary <string, SFGraphics.GLObjects.Textures.Texture>
            {
                { "#replace_cubemap", Rendering.Resources.DefaultTextures.Instance.SpecularPbr },
                { "/common/shader/sfxpbs/default_normal", Rendering.Resources.DefaultTextures.Instance.DefaultNormal },
                { "/common/shader/sfxpbs/default_params", Rendering.Resources.DefaultTextures.Instance.DefaultPrm },
                { "/common/shader/sfxpbs/default_black", Rendering.Resources.DefaultTextures.Instance.DefaultBlack },
                { "/common/shader/sfxpbs/default_white", Rendering.Resources.DefaultTextures.Instance.DefaultWhite },
                { "/common/shader/sfxpbs/default_color", Rendering.Resources.DefaultTextures.Instance.DefaultWhite }
            };

            GetNodesForRendering(ref meshNode, ref hlpbNode, ref skeleton, ref material, textureByName);

            return(new RNumdl(model, skeleton, material, meshNode, hlpbNode, textureByName));
        }
コード例 #16
0
        private MaterialCollection CreateMaterialCollection(string name, Dictionary <string, RMaterial> materialByName, Matl matl)
        {
            var collection = new MaterialCollection(name);

            for (int i = 0; i < matl.Entries.Length; i++)
            {
                // Pass a reference to the render material to enable real time updates.
                materialByName.TryGetValue(matl.Entries[i].MaterialLabel, out RMaterial? rMaterial);

                var material = CreateMaterial(matl.Entries[i], i, rMaterial);
                collection.Materials.Add(material);
            }

            return(collection);
        }
コード例 #17
0
ファイル: NumdlbNode.cs プロジェクト: ssbucarlos/SSBHLib
        private void GetNodesForRendering(ref NumshbNode meshNode, ref NuhlpbNode hlpbNode, ref RSkeleton skeleton, ref Matl material, ref XmbNode modelXmb, ref XmbNode lodXmb,
                                          Dictionary <string, RTexture> textureByName)
        {
            // TODO: There's probably a cleaner way of doing this.
            foreach (FileNode fileNode in Parent.Nodes)
            {
                if (fileNode is NuhlpbNode node)
                {
                    hlpbNode = node;
                }
                else if (fileNode is NutexbNode nutexNode)
                {
                    var texture = (RTexture)nutexNode.Renderable.Value;

                    // Use the file name instead of the internal name.
                    // Ignore case.
                    var textureName = System.IO.Path.GetFileNameWithoutExtension(fileNode.Text).ToLower();
                    textureByName[textureName] = texture;
                }
                else if (fileNode.Text.Equals(model.MeshString))
                {
                    meshNode = (NumshbNode)fileNode;
                }
                else if (fileNode.Text.Equals(model.SkeletonFileName))
                {
                    skeleton = (RSkeleton)((NusktbNode)fileNode).Renderable.Value;
                }
                else if (fileNode.Text.Equals(model.MaterialFileNames[0].MaterialFileName))
                {
                    material = ((NumatbNode)fileNode).Material;
                }
                else if (fileNode.Text.Equals("model.xmb"))
                {
                    modelXmb = (XmbNode)fileNode;
                }
                else if (fileNode.Text.Equals("lod.xmb"))
                {
                    lodXmb = (XmbNode)fileNode;
                }
            }
        }
コード例 #18
0
ファイル: NumdlNode.cs プロジェクト: schiggysmallz/SSBHLib
 private void GetNodesForRendering(ref NumsbhNode meshNode, ref NuhlpbNode hlpbNode, ref RSkeleton skeleton, ref Matl material, Dictionary <string, SFGraphics.GLObjects.Textures.Texture> textureByName)
 {
     foreach (FileNode fileNode in Parent.Nodes)
     {
         if (fileNode is NuhlpbNode node)
         {
             hlpbNode = node;
         }
         else if (fileNode is NutexNode nutexNode)
         {
             var texture = (RTexture)nutexNode.GetRenderableNode();
             textureByName[nutexNode.TexName.ToLower()] = texture.RenderTexture;
         }
         else if (fileNode.Text.Equals(model.MeshString))
         {
             meshNode = (NumsbhNode)fileNode;
         }
         else if (fileNode.Text.Equals(model.SkeletonFileName))
         {
             skeleton = (RSkeleton)((SkelNode)fileNode).GetRenderableNode();
         }
         else if (fileNode.Text.Equals(model.MaterialFileNames[0].MaterialFileName))
         {
             material = ((MatlNode)fileNode).Material;
         }
     }
 }
コード例 #19
0
ファイル: NumdlNode.cs プロジェクト: schiggysmallz/SSBHLib
        public IOModel GetIOModel()
        {
            IOModel outModel = new IOModel();

            Mesh meshFile     = null;
            Matl materialFile = null;

            foreach (FileNode n in Parent.Nodes)
            {
                if (n.Text.Equals(model.MeshString))
                {
                    meshFile = ((NumsbhNode)n).mesh;
                }
                if (n.Text.Equals(model.SkeletonFileName))
                {
                    outModel.Skeleton = (RSkeleton)((SkelNode)n).GetRenderableNode();
                }
                if (n.Text.Equals(model.MaterialFileNames[0].MaterialFileName))
                {
                    materialFile = ((MatlNode)n).Material;
                }
            }

            Dictionary <string, int> indexByBoneName = new Dictionary <string, int>();

            if (outModel.Skeleton != null)
            {
                for (int i = 0; i < outModel.Skeleton.Bones.Count; i++)
                {
                    indexByBoneName.Add(outModel.Skeleton.Bones[i].Name, i);
                }
            }

            Dictionary <string, int> materialNameToIndex = new Dictionary <string, int>();

            if (materialFile != null)
            {
                int materialIndex = 0;
                foreach (var entry in materialFile.Entries)
                {
                    materialNameToIndex.Add(entry.ShaderLabel, materialIndex++);
                    IOMaterial material = new IOMaterial
                    {
                        Name = entry.ShaderLabel
                    };
                    outModel.Materials.Add(material);

                    foreach (var attr in entry.Attributes)
                    {
                        if (attr.ParamId == MatlEnums.ParamId.Texture0)
                        {
                            IOTexture dif = new IOTexture
                            {
                                Name = attr.DataObject.ToString()
                            };
                            material.DiffuseTexture = dif;
                        }
                    }
                }
            }

            if (meshFile != null)
            {
                SsbhVertexAccessor vertexAccessor = new SsbhVertexAccessor(meshFile);
                {
                    SsbhRiggingAccessor riggingAccessor = new SsbhRiggingAccessor(meshFile);
                    foreach (MeshObject obj in meshFile.Objects)
                    {
                        IOMesh outMesh = new IOMesh()
                        {
                            Name = obj.Name,
                        };
                        outModel.Meshes.Add(outMesh);

                        // get material
                        if (materialFile != null)
                        {
                            foreach (var entry in model.ModelEntries)
                            {
                                if (entry.MeshName.Equals(obj.Name) && entry.SubIndex == obj.SubMeshIndex)
                                {
                                    outMesh.MaterialIndex = materialNameToIndex[entry.MaterialLabel];
                                    break;
                                }
                            }
                        }

                        IOVertex[] vertices = new IOVertex[obj.VertexCount];
                        for (int i = 0; i < vertices.Length; i++)
                        {
                            vertices[i] = new IOVertex();
                        }

                        foreach (MeshAttribute attr in obj.Attributes)
                        {
                            SsbhVertexAttribute[] values = vertexAccessor.ReadAttribute(attr.AttributeStrings[0].Name, 0, obj.VertexCount, obj);

                            if (attr.AttributeStrings[0].Name.Equals("Position0"))
                            {
                                outMesh.HasPositions = true;
                                for (int i = 0; i < values.Length; i++)
                                {
                                    vertices[i].Position = new OpenTK.Vector3(values[i].X, values[i].Y, values[i].Z);
                                }
                            }
                            if (attr.AttributeStrings[0].Name.Equals("Normal0"))
                            {
                                outMesh.HasNormals = true;
                                for (int i = 0; i < values.Length; i++)
                                {
                                    vertices[i].Normal = new OpenTK.Vector3(values[i].X, values[i].Y, values[i].Z);
                                }
                            }

                            // Flip UVs vertically for export.
                            if (attr.AttributeStrings[0].Name.Equals("map1"))
                            {
                                outMesh.HasUV0 = true;
                                for (int i = 0; i < values.Length; i++)
                                {
                                    vertices[i].UV0 = new OpenTK.Vector2(values[i].X, 1 - values[i].Y);
                                }
                            }
                            if (attr.AttributeStrings[0].Name.Equals("uvSet"))
                            {
                                outMesh.HasUV1 = true;
                                for (int i = 0; i < values.Length; i++)
                                {
                                    vertices[i].UV1 = new OpenTK.Vector2(values[i].X, 1 - values[i].Y);
                                }
                            }
                            if (attr.AttributeStrings[0].Name.Equals("uvSet1"))
                            {
                                outMesh.HasUV2 = true;
                                for (int i = 0; i < values.Length; i++)
                                {
                                    vertices[i].UV2 = new OpenTK.Vector2(values[i].X, 1 - values[i].Y);
                                }
                            }
                            if (attr.AttributeStrings[0].Name.Equals("uvSet2"))
                            {
                                outMesh.HasUV3 = true;
                                for (int i = 0; i < values.Length; i++)
                                {
                                    vertices[i].UV3 = new OpenTK.Vector2(values[i].X, 1 - values[i].Y);
                                }
                            }
                            if (attr.AttributeStrings[0].Name.Equals("colorSet1"))
                            {
                                outMesh.HasColor = true;
                                for (int i = 0; i < values.Length; i++)
                                {
                                    vertices[i].Color = new OpenTK.Vector4(values[i].X, values[i].Y, values[i].Z, values[i].W) / 127f;
                                }
                            }
                        }

                        // Fix SingleBinds
                        if (outModel.Skeleton != null && !obj.ParentBoneName.Equals(""))
                        {
                            int parentIndex = outModel.Skeleton.GetBoneIndex(obj.ParentBoneName);
                            if (parentIndex != -1)
                            {
                                for (int i = 0; i < vertices.Length; i++)
                                {
                                    vertices[i].Position      = OpenTK.Vector3.TransformPosition(vertices[i].Position, outModel.Skeleton.Bones[parentIndex].WorldTransform);
                                    vertices[i].Normal        = OpenTK.Vector3.TransformNormal(vertices[i].Normal, outModel.Skeleton.Bones[parentIndex].WorldTransform);
                                    vertices[i].BoneIndices.X = indexByBoneName[obj.ParentBoneName];
                                    vertices[i].BoneWeights.X = 1;
                                    outMesh.HasBoneWeights    = true;
                                }
                            }
                        }

                        // Apply Rigging
                        SsbhVertexInfluence[] influences = riggingAccessor.ReadRiggingBuffer(obj.Name, (int)obj.SubMeshIndex);

                        foreach (SsbhVertexInfluence influence in influences)
                        {
                            outMesh.HasBoneWeights = true;

                            // Some influences refer to bones that don't exist in the skeleton.
                            // _eff bones?
                            if (!indexByBoneName.ContainsKey(influence.BoneName))
                            {
                                continue;
                            }

                            if (vertices[influence.VertexIndex].BoneWeights.X == 0)
                            {
                                vertices[influence.VertexIndex].BoneIndices.X = indexByBoneName[influence.BoneName];
                                vertices[influence.VertexIndex].BoneWeights.X = influence.Weight;
                            }
                            else if (vertices[influence.VertexIndex].BoneWeights.Y == 0)
                            {
                                vertices[influence.VertexIndex].BoneIndices.Y = indexByBoneName[influence.BoneName];
                                vertices[influence.VertexIndex].BoneWeights.Y = influence.Weight;
                            }
                            else if (vertices[influence.VertexIndex].BoneWeights.Z == 0)
                            {
                                vertices[influence.VertexIndex].BoneIndices.Z = indexByBoneName[influence.BoneName];
                                vertices[influence.VertexIndex].BoneWeights.Z = influence.Weight;
                            }
                            else if (vertices[influence.VertexIndex].BoneWeights.W == 0)
                            {
                                vertices[influence.VertexIndex].BoneIndices.W = indexByBoneName[influence.BoneName];
                                vertices[influence.VertexIndex].BoneWeights.W = influence.Weight;
                            }
                        }

                        outMesh.Vertices.AddRange(vertices);
                        outMesh.Indices.AddRange(vertexAccessor.ReadIndices(0, obj.IndexCount, obj));
                    }
                }
            }


            return(outModel);
        }
コード例 #20
0
        public static void SerializeMatl(TextWriter writer, Matl matl)
        {
            var library = MatlToLibrary(matl);

            serializer.Serialize(writer, library);
        }
コード例 #21
0
ファイル: NumdlNode.cs プロジェクト: zabimaru1000/SSBHLib
 private void GetNodesForRendering(ref NumsbhNode meshNode, ref NuhlpbNode hlpbNode, ref RSkeleton skeleton, ref Matl material, ref XmbNode modelXmb, ref XmbNode lodXmb,
                                   Dictionary <string, RTexture> textureByName)
 {
     // TODO: There's probably a cleaner way of doing this.
     foreach (FileNode fileNode in Parent.Nodes)
     {
         if (fileNode is NuhlpbNode node)
         {
             hlpbNode = node;
         }
         else if (fileNode is NutexNode nutexNode)
         {
             var texture = (RTexture)nutexNode.GetRenderableNode();
             textureByName[nutexNode.TexName.ToLower()] = texture;
         }
         else if (fileNode.Text.Equals(model.MeshString))
         {
             meshNode = (NumsbhNode)fileNode;
         }
         else if (fileNode.Text.Equals(model.SkeletonFileName))
         {
             skeleton = (RSkeleton)((SkelNode)fileNode).GetRenderableNode();
         }
         else if (fileNode.Text.Equals(model.MaterialFileNames[0].MaterialFileName))
         {
             material = ((MatlNode)fileNode).Material;
         }
         else if (fileNode.Text.Equals("model.xmb"))
         {
             modelXmb = (XmbNode)fileNode;
         }
         else if (fileNode.Text.Equals("lod.xmb"))
         {
             lodXmb = (XmbNode)fileNode;
         }
     }
 }