private static void ReadTextures(NUD.Material mat, XmlNode matNode)
        {
            if (matNode.Name.Equals("texture"))
            {
                NUD.Mat_Texture tex = new NUD.Mat_Texture();
                mat.textures.Add(tex);

                foreach (XmlAttribute a in matNode.Attributes)
                {
                    switch (a.Name)
                    {
                    case "hash": int f = 0; if (int.TryParse(a.Value, NumberStyles.HexNumber, null, out f))
                        {
                            tex.hash = f;
                        }
                        ; break;

                    case "wrapmodeS": int.TryParse(a.Value, out tex.WrapModeS); break;

                    case "wrapmodeT": int.TryParse(a.Value, out tex.WrapModeT); break;

                    case "minfilter": int.TryParse(a.Value, out tex.minFilter); break;

                    case "magfilter": int.TryParse(a.Value, out tex.magFilter); break;

                    case "mipdetail": int.TryParse(a.Value, out tex.mipDetail); break;
                    }
                }
            }
        }
示例#2
0
        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            int index = 0;

            if (listView1.SelectedItems.Count > 0)
            {
                index = listView1.Items.IndexOf(listView1.SelectedItems[0]);
                tableLayoutPanel2.Enabled = true;
            }
            else
            {
                tableLayoutPanel2.Enabled = false;
            }
            if (index >= material[current].textures.Count)
            {
                MessageBox.Show("Texture doesn't exist");
                return;
            }
            NUD.Mat_Texture tex = material[current].textures[index];
            textBox10.Text = tex.hash.ToString("X");

            comboBox9.SelectedItem  = mapmode[tex.MapMode];
            comboBox10.SelectedItem = wrapmode[tex.WrapMode1];
            comboBox8.SelectedItem  = wrapmode[tex.WrapMode2];
            comboBox11.SelectedItem = minfilter[tex.minFilter];
            comboBox12.SelectedItem = magfilter[tex.magFilter];
            comboBox13.SelectedItem = mip[tex.mipDetail];
            RenderTexture();
        }
示例#3
0
        private void makeMetalToolStripMenuItem_Click(object sender, EventArgs e)
        {
            NUD nud = ((NUD)treeView1.SelectedNode.Tag);

            foreach (NUD.Mesh m in nud.mesh)
            {
                foreach (NUD.Polygon p in m.Nodes)
                {
                    foreach (NUD.Material mat in p.materials)
                    {
                        float hash = -1f;
                        if (mat.entries.ContainsKey("NU_materialHash"))
                        {
                            hash = mat.entries["NU_materialHash"][0];
                        }

                        mat.anims.Clear();
                        mat.entries.Clear();

                        mat.flags = 0x9601106B;

                        //textures preserve normal map somehow...

                        int difcol = (int)((long)mat.textures[0].hash & 0xFFFFFF00) | (0xF0);
                        mat.textures.Clear();
                        mat.displayTexId = -1;

                        NUD.Mat_Texture dif = NUD.Polygon.makeDefault();
                        dif.hash = difcol;
                        NUD.Mat_Texture cub = NUD.Polygon.makeDefault();
                        cub.hash = 0x10102000;
                        NUD.Mat_Texture nrm = NUD.Polygon.makeDefault();
                        NUD.Mat_Texture rim = NUD.Polygon.makeDefault();
                        rim.hash = 0x10080000;

                        mat.textures.Add(dif); mat.textures.Add(cub); mat.textures.Add(nrm); mat.textures.Add(rim);

                        // properties
                        mat.entries.Add("NU_colorSamplerUV", new float[] { 1, 1, 0, 0 });
                        mat.entries.Add("NU_fresnelColor", new float[] { 0.6f, 0.6f, 0.6f, 1 });
                        mat.entries.Add("NU_blinkColor", new float[] { 0f, 0f, 0f, 0 });
                        mat.entries.Add("NU_reflectionColor", new float[] { 3f, 3f, 3f, 1 });
                        mat.entries.Add("NU_aoMinGain", new float[] { 0.3f, 0.3f, 0.3f, 1 });
                        mat.entries.Add("NU_lightMapColorOffset", new float[] { 0f, 0f, 0f, 0 });
                        mat.entries.Add("NU_fresnelParams", new float[] { 3.7f, 0f, 0f, 1 });
                        mat.entries.Add("NU_alphaBlendParams", new float[] { 0f, 0f, 0f, 0 });
                        mat.entries.Add("NU_materialHash", new float[] { hash, 0f, 0f, 0 });
                    }
                }
            }
        }
示例#4
0
        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            int index = 0;

            if (listView1.SelectedItems.Count > 0)
            {
                index = listView1.Items.IndexOf(listView1.SelectedItems[0]);
            }
            NUD.Mat_Texture tex = material[current].textures[index];
            textBox10.Text = tex.hash.ToString("X");

            comboBox9.SelectedItem  = mapmode[tex.MapMode];
            comboBox10.SelectedItem = wrapmode[tex.WrapMode1];
            comboBox8.SelectedItem  = wrapmode[tex.WrapMode2];
            comboBox11.SelectedItem = minfilter[tex.minFilter];
            comboBox12.SelectedItem = magfilter[tex.magFilter];
            comboBox13.SelectedItem = mip[tex.mipDetail];
            RenderTexture();
        }
示例#5
0
        private void importMaterialAsXML(NUD n, string filename)
        {
            XmlDocument doc = new XmlDocument();

            doc.Load(filename);

            XmlNode main = doc.ChildNodes[0];

            List <NUD.Material> materials = new List <NUD.Material>();
            List <int>          ids       = new List <int>();

            // validate at every step
            foreach (XmlNode meshnode in main.ChildNodes)
            {
                if (meshnode.Name.Equals("mesh"))
                {
                    foreach (XmlNode polynode in meshnode.ChildNodes)
                    {
                        if (polynode.Name.Equals("polygon"))
                        {
                            ids.Add(polynode.ChildNodes.Count);

                            foreach (XmlNode matnode in polynode.ChildNodes)
                            {
                                if (matnode.Name.Equals("material"))
                                {
                                    // being creating the material
                                    NUD.Material mat = new NUD.Material();
                                    materials.Add(mat);
                                    foreach (XmlAttribute a in matnode.Attributes)
                                    {
                                        switch (a.Name)
                                        {
                                        case "flags": uint f = 0; if (uint.TryParse(a.Value, NumberStyles.HexNumber, null, out f))
                                            {
                                                mat.flags = f;
                                            }
                                            ; break;

                                        case "srcFactor": int.TryParse(a.Value, out mat.srcFactor); break;

                                        case "dstFactor": int.TryParse(a.Value, out mat.dstFactor); break;

                                        case "REF0": int.TryParse(a.Value, out mat.ref0); break;

                                        case "REF1": int.TryParse(a.Value, out mat.ref1); break;

                                        case "cullmode": int cm = 0; if (int.TryParse(a.Value, NumberStyles.HexNumber, null, out cm))
                                            {
                                                mat.cullMode = cm;
                                            }
                                            ; break;

                                        case "zbuffoff": int.TryParse(a.Value, out mat.zBufferOffset); break;
                                        }
                                    }

                                    foreach (XmlNode mnode in matnode.ChildNodes)
                                    {
                                        //textures
                                        if (mnode.Name.Equals("texture"))
                                        {
                                            NUD.Mat_Texture tex = new NUD.Mat_Texture();
                                            mat.textures.Add(tex);
                                            foreach (XmlAttribute a in mnode.Attributes)
                                            {
                                                switch (a.Name)
                                                {
                                                case "hash": int f = 0; if (int.TryParse(a.Value, NumberStyles.HexNumber, null, out f))
                                                    {
                                                        tex.hash = f;
                                                    }
                                                    ; break;

                                                case "wrapmodeS": int.TryParse(a.Value, out tex.WrapMode1); break;

                                                case "wrapmodeT": int.TryParse(a.Value, out tex.WrapMode2); break;

                                                case "minfilter": int.TryParse(a.Value, out tex.minFilter); break;

                                                case "magfilter": int.TryParse(a.Value, out tex.magFilter); break;

                                                case "mipdetail": int.TryParse(a.Value, out tex.mipDetail); break;
                                                }
                                            }
                                        }
                                        // parameters
                                        if (mnode.Name.Equals("param"))
                                        {
                                            string name = "";
                                            foreach (XmlAttribute a in mnode.Attributes)
                                            {
                                                switch (a.Name)
                                                {
                                                case "name": name = a.Value; break;
                                                }
                                            }
                                            string[]     values = mnode.InnerText.Split(' ');
                                            List <float> v      = new List <float>();
                                            float        f      = 0;
                                            foreach (string s in values)
                                            {
                                                if (float.TryParse(s, out f))
                                                {
                                                    v.Add(f);
                                                }
                                            }
                                            mat.entries.Add(name, v.ToArray());
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            int pid = 0;
            int mid = 0;

            foreach (NUD.Mesh m in n.mesh)
            {
                foreach (NUD.Polygon p in m.Nodes)
                {
                    p.materials.Clear();
                    for (int i = 0; i < ids[pid]; i++)
                    {
                        p.materials.Add(materials[mid++]);
                    }
                    pid++;
                }
            }
        }
示例#6
0
        public void Apply(NUD nud)
        {
            Matrix4 rot      = Matrix4.CreateRotationX(0.5f * (float)Math.PI);
            float   sc       = 1f;
            bool    hasScale = float.TryParse(scaleTB.Text, out sc);

            bool checkedUVRange = false;
            bool fixUV          = false;

            bool warning = false;

            foreach (NUD.Mesh mesh in nud.meshes)
            {
                if (BoneTypes[(string)comboBox2.SelectedItem] == BoneTypes["No Bones"])
                {
                    mesh.boneflag = 0;
                }

                foreach (NUD.Polygon poly in mesh.Nodes)
                {
                    if (BoneTypes[(string)comboBox2.SelectedItem] == BoneTypes["No Bones"])
                    {
                        poly.polflag = 0;
                    }

                    if (smoothCB.Checked)
                    {
                        poly.SmoothNormals();
                    }

                    // we only want to calculate new tangents/bitangents for imports
                    // vanilla models have special tangents/bitangents for mirrored normal maps
                    NUD.computeTangentBitangent(poly);

                    poly.vertSize = ((poly.vertSize == 0x6 ? 0 : BoneTypes[(string)comboBox2.SelectedItem])) | (VertTypes[(string)comboBox1.SelectedItem]);

                    if (!warning && poly.vertSize == 0x27)
                    {
                        MessageBox.Show("Using \"" + (string)comboBox2.SelectedItem + "\" and \"" + (string)comboBox1.SelectedItem + "\" can make shadows not appear in-game",
                                        "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        warning = true;
                    }

                    if (stagematCB.Checked)
                    {
                        // change to stage material
                        NUD.Mat_Texture tex = poly.materials[0].textures[0];
                        poly.materials[0].textures.Clear();
                        poly.materials.Clear();

                        NUD.Material m = new NUD.Material();
                        poly.materials.Add(m);
                        m.flags    = 0xA2011001;
                        m.RefAlpha = 128;
                        m.cullMode = 1029;

                        m.textures.Clear();
                        m.textures.Add(tex);

                        m.entries.Add("NU_colorSamplerUV", new float[] { 1, 1, 0, 0 });
                        m.entries.Add("NU_diffuseColor", new float[] { 1, 1, 1, 0.5f });
                        m.entries.Add("NU_materialHash", new float[] { BitConverter.ToSingle(new byte[] { 0x12, 0xEE, 0x2A, 0x1B }, 0), 0, 0, 0 });
                    }

                    //if (checkBox1.Checked || checkBox4.Checked || vertcolorCB.Checked || sc != 1f)
                    foreach (NUD.Vertex v in poly.vertices)
                    {
                        if (!checkedUVRange && v.uv.Count > 0 && (Math.Abs(v.uv[0].X) > 4 || Math.Abs(v.uv[0].Y) > 4))
                        {
                            checkedUVRange = true;

                            DialogResult dialogResult = MessageBox.Show("Some UVs are detected to be out of accurate range.\nFix them now?", "Potential UV Problem", MessageBoxButtons.YesNo);
                            if (dialogResult == DialogResult.Yes)
                            {
                                fixUV = true;
                            }
                        }

                        if (fixUV)
                        {
                            for (int h = 0; h < v.uv.Count; h++)
                            {
                                v.uv[h] = new Vector2(v.uv[h].X - (int)v.uv[h].X, v.uv[h].Y - (int)v.uv[h].Y);
                            }
                        }


                        if (flipUVCB.Checked)
                        {
                            for (int i = 0; i < v.uv.Count; i++)
                            {
                                v.uv[i] = new Vector2(v.uv[i].X, 1 - v.uv[i].Y);
                            }
                        }

                        if (vertColorDivCB.Checked)
                        //v.col = v.col / 2;
                        {
                            for (int i = 0; i < 3; i++)
                            {
                                v.col[i] = v.col[i] / 2;
                            }
                        }

                        if (vertcolorCB.Checked)
                        {
                            v.col = new Vector4(0x7F, 0x7F, 0x7F, 0x7F);
                        }

                        if (checkBox4.Checked)
                        {
                            v.pos = Vector3.Transform(v.pos, rot);
                            v.nrm = Vector3.Transform(v.nrm, rot);
                        }
                        if (sc != 1f)
                        {
                            v.pos = Vector3.Multiply(v.pos, sc);
                        }
                    }
                }
            }

            //if (VertTypes[(string)comboBox1.SelectedItem] == 3 || VertTypes[(string)comboBox1.SelectedItem] == 7)


            if (checkBox2.Checked)
            {
                foreach (NUD.Mesh mesh in nud.meshes)
                {
                    if (mesh.Text.Length > 5)
                    {
                        mesh.Text = mesh.Text.Substring(5, mesh.Text.Length - 5);
                    }
                }
            }

            nud.PreRender();
        }
示例#7
0
        public static void importMaterialAsXML(NUD n, string filename)
        {
            int polyCount = 0;

            foreach (NUD.Mesh m in n.meshes)
            {
                foreach (NUD.Polygon p in m.Nodes)
                {
                    polyCount++;
                }
            }

            XmlDocument doc = new XmlDocument();

            doc.Load(filename);

            XmlNode main = doc.ChildNodes[0];

            Debug.WriteLine(main.Attributes.GetNamedItem("polycount").Value);


            List <NUD.Material> materials = new List <NUD.Material>();
            List <int>          ids       = new List <int>();

            // validate at every step
            foreach (XmlNode meshnode in main.ChildNodes)
            {
                if (meshnode.Name.Equals("mesh"))
                {
                    foreach (XmlNode polynode in meshnode.ChildNodes)
                    {
                        if (polynode.Name.Equals("polygon"))
                        {
                            ids.Add(polynode.ChildNodes.Count);

                            if (ids.Count > polyCount)
                            {
                                int countDif = ids.Count - polyCount;
                                MessageBox.Show(String.Format("Expected {0} polygons but found {1} in the XML file. The last {2} polygon(s) will be ignored.",
                                                              polyCount, ids.Count, countDif));
                            }

                            foreach (XmlNode matnode in polynode.ChildNodes)
                            {
                                if (matnode.Name.Equals("material"))
                                {
                                    // being creating the material
                                    NUD.Material mat = new NUD.Material();
                                    materials.Add(mat);
                                    foreach (XmlAttribute a in matnode.Attributes)
                                    {
                                        switch (a.Name)
                                        {
                                        case "flags": uint f = 0; if (uint.TryParse(a.Value, NumberStyles.HexNumber, null, out f))
                                            {
                                                mat.flags = f;
                                            }
                                            ; break;

                                        case "srcFactor": int.TryParse(a.Value, out mat.srcFactor); break;

                                        case "dstFactor": int.TryParse(a.Value, out mat.dstFactor); break;

                                        case "AlphaFunc": int.TryParse(a.Value, out mat.AlphaFunc); break;

                                        case "AlphaTest": int.TryParse(a.Value, out mat.AlphaTest); break;

                                        case "RefAlpha": int.TryParse(a.Value, out mat.RefAlpha); break;

                                        case "cullmode": int cm = 0; if (int.TryParse(a.Value, NumberStyles.HexNumber, null, out cm))
                                            {
                                                mat.cullMode = cm;
                                            }
                                            ; break;

                                        case "zbuffoff": int.TryParse(a.Value, out mat.zBufferOffset); break;
                                        }
                                    }

                                    foreach (XmlNode mnode in matnode.ChildNodes)
                                    {
                                        //textures
                                        if (mnode.Name.Equals("texture"))
                                        {
                                            NUD.Mat_Texture tex = new NUD.Mat_Texture();
                                            mat.textures.Add(tex);
                                            foreach (XmlAttribute a in mnode.Attributes)
                                            {
                                                switch (a.Name)
                                                {
                                                case "hash": int f = 0; if (int.TryParse(a.Value, NumberStyles.HexNumber, null, out f))
                                                    {
                                                        tex.hash = f;
                                                    }
                                                    ; break;

                                                case "wrapmodeS": int.TryParse(a.Value, out tex.WrapMode1); break;

                                                case "wrapmodeT": int.TryParse(a.Value, out tex.WrapMode2); break;

                                                case "minfilter": int.TryParse(a.Value, out tex.minFilter); break;

                                                case "magfilter": int.TryParse(a.Value, out tex.magFilter); break;

                                                case "mipdetail": int.TryParse(a.Value, out tex.mipDetail); break;
                                                }
                                            }
                                        }
                                        // parameters
                                        if (mnode.Name.Equals("param"))
                                        {
                                            string name = "";
                                            foreach (XmlAttribute a in mnode.Attributes)
                                            {
                                                switch (a.Name)
                                                {
                                                case "name": name = a.Value; break;
                                                }
                                            }
                                            string[]     values = mnode.InnerText.Split(' ');
                                            List <float> v      = new List <float>();
                                            float        f      = 0;

                                            foreach (string stringValue in values)
                                            {
                                                if (v.Count < 4)
                                                {
                                                    if (name == "NU_materialHash")
                                                    {
                                                        int hash;
                                                        if (int.TryParse(stringValue, NumberStyles.HexNumber, null, out hash))
                                                        {
                                                            f = BitConverter.ToSingle(BitConverter.GetBytes(hash), 0);
                                                            v.Add(f);
                                                        }
                                                    }
                                                    else if (float.TryParse(stringValue, out f))
                                                    {
                                                        v.Add(f);
                                                    }
                                                    else
                                                    {
                                                        v.Add(0.0f);
                                                    }
                                                }
                                            }

                                            // array should always have 4 values
                                            if (v.Count != 4)
                                            {
                                                Debug.WriteLine(v.Count);
                                                throw new ParamArrayLengthException(polynode.ChildNodes.Count, name);
                                            }

                                            try
                                            {
                                                mat.entries.Add(name, v.ToArray());
                                            }
                                            catch (System.ArgumentException)
                                            {
                                                MessageBox.Show(String.Format("Polygon{0} contains more than 1 instance of {1}. \n"
                                                                              + "Only the first instance of {1} will be added.", polynode.ChildNodes.Count.ToString(), name));
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            int pid = 0;
            int mid = 0;

            foreach (NUD.Mesh m in n.meshes)
            {
                foreach (NUD.Polygon p in m.Nodes)
                {
                    p.materials.Clear();
                    for (int i = 0; i < ids[pid]; i++)
                    {
                        p.materials.Add(materials[mid++]);
                    }
                    pid++;
                }
            }
        }
        public void Apply(NUD nud)
        {
            nud.GenerateBoundingBoxes();
            Matrix4 rot      = Matrix4.CreateRotationX(0.5f * (float)Math.PI);
            float   sc       = 1f;
            bool    hasScale = float.TryParse(scaleTB.Text, out sc);

            bool checkedMeshName = false;
            bool fixMeshName     = false;

            bool warning = false;

            foreach (NUD.Mesh mesh in nud.Nodes)
            {
                if (BoneTypes[(string)comboBox2.SelectedItem] == BoneTypes["No Bones"])
                {
                    mesh.boneflag = 0;
                }

                if (!checkedMeshName)
                {
                    checkedMeshName = true;
                    if (mesh.Text.Length > 5)
                    {
                        string sub = mesh.Text.Substring(0, 5);
                        int    a   = 0;
                        if (sub.StartsWith("_") && sub.EndsWith("_") && int.TryParse(sub.Substring(1, 3), out a))
                        {
                            fixMeshName = DialogResult.Yes == MessageBox.Show("Detected mesh names that start with \"_###_\". Would you like to fix this?\nIt is recommended that you select \"Yes\".", "Mesh Name Fix", MessageBoxButtons.YesNo);
                        }
                    }
                }
                if (fixMeshName)
                {
                    if (mesh.Text.Length > 5)
                    {
                        mesh.Text = mesh.Text.Substring(5, mesh.Text.Length - 5);
                    }
                }

                foreach (NUD.Polygon poly in mesh.Nodes)
                {
                    if (BoneTypes[(string)comboBox2.SelectedItem] == BoneTypes["No Bones"])
                    {
                        poly.polflag = 0;
                    }

                    //Smooth normals
                    if (smoothCB.Checked)
                    {
                        poly.SmoothNormals();
                    }

                    // we only want to calculate new tangents/bitangents for imports
                    // vanilla models have special tangents/bitangents for mirrored normal maps
                    NUD.computeTangentBitangent(poly);

                    poly.vertSize = ((poly.vertSize == 0x6 ? 0 : BoneTypes[(string)comboBox2.SelectedItem])) | (VertTypes[(string)comboBox1.SelectedItem]);

                    if (!warning && poly.vertSize == 0x27)
                    {
                        MessageBox.Show("Using \"" + (string)comboBox2.SelectedItem + "\" and \"" + (string)comboBox1.SelectedItem + "\" can make shadows not appear in-game.",
                                        "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        warning = true;
                    }

                    //Use stage material
                    if (stagematCB.Checked)
                    {
                        NUD.Mat_Texture tex = poly.materials[0].textures[0];
                        poly.materials[0].textures.Clear();
                        poly.materials.Clear();

                        NUD.Material m = new NUD.Material();
                        poly.materials.Add(m);
                        m.Flags    = 0xA2001001;
                        m.RefAlpha = 128;
                        m.cullMode = 1029;

                        m.textures.Clear();
                        m.textures.Add(tex);

                        m.entries.Add("NU_colorSamplerUV", new float[] { 1, 1, 0, 0 });
                        m.entries.Add("NU_diffuseColor", new float[] { 1, 1, 1, 0.5f });
                        m.entries.Add("NU_materialHash", new float[] { BitConverter.ToSingle(new byte[] { 0x12, 0xEE, 0x2A, 0x1B }, 0), 0, 0, 0 });
                    }

                    foreach (NUD.Vertex v in poly.vertices)
                    {
                        //Scroll UVs V by -1
                        if (checkBox2.Checked)
                        {
                            for (int i = 0; i < v.uv.Count; i++)
                            {
                                v.uv[i] = new Vector2(v.uv[i].X, v.uv[i].Y + 1);
                            }
                        }

                        //Flip UVs
                        if (flipUVCB.Checked)
                        {
                            for (int i = 0; i < v.uv.Count; i++)
                            {
                                v.uv[i] = new Vector2(v.uv[i].X, 1 - v.uv[i].Y);
                            }
                        }

                        //Halve vertex colors
                        if (vertColorDivCB.Checked)
                        {
                            for (int i = 0; i < 3; i++)
                            {
                                v.col[i] = v.col[i] / 2;
                            }
                        }

                        //Ignore vertex colors
                        if (vertcolorCB.Checked)
                        {
                            v.col = new Vector4(0x7F, 0x7F, 0x7F, 0xFF);
                        }

                        //Rotate 90 degrees
                        if (checkBox4.Checked)
                        {
                            v.pos = Vector3.TransformPosition(v.pos, rot);
                            v.nrm = Vector3.TransformNormal(v.nrm, rot);
                        }

                        //Scale
                        if (sc != 1f)
                        {
                            v.pos = Vector3.Multiply(v.pos, sc);
                        }
                    }
                }
            }

            //if (VertTypes[(string)comboBox1.SelectedItem] == 3 || VertTypes[(string)comboBox1.SelectedItem] == 7)

            nud.PreRender();
        }