Example #1
0
        private void ReadShaderParams(Material mat, Mesh poly)
        {
            using (Syroot.BinaryData.BinaryDataReader reader = new Syroot.BinaryData.BinaryDataReader(new MemoryStream(mat.ShaderParamData)))
            {
                reader.ByteOrder = Syroot.BinaryData.ByteOrder.LittleEndian;
                foreach (Syroot.NintenTools.NSW.Bfres.ShaderParam param in mat.ShaderParams)
                {
                    ShaderParam prm = new ShaderParam();

                    prm.Type = (Syroot.NintenTools.Bfres.ShaderParamType)param.Type;
                    prm.Name = param.Name;

                    switch (param.Type)
                    {
                    case ShaderParamType.Float:
                        reader.Seek(param.DataOffset, SeekOrigin.Begin);
                        prm.Value_float = reader.ReadSingle();
                        break;

                    case ShaderParamType.Float2:
                        reader.Seek(param.DataOffset, SeekOrigin.Begin);
                        prm.Value_float2 = new Vector2(
                            reader.ReadSingle(),
                            reader.ReadSingle());
                        break;

                    case ShaderParamType.Float3:
                        reader.Seek(param.DataOffset, SeekOrigin.Begin);
                        prm.Value_float3 = new Vector3(
                            reader.ReadSingle(),
                            reader.ReadSingle(),
                            reader.ReadSingle()); break;

                    case ShaderParamType.Float4:
                        reader.Seek(param.DataOffset, SeekOrigin.Begin);
                        prm.Value_float4 = new Vector4(
                            reader.ReadSingle(),
                            reader.ReadSingle(),
                            reader.ReadSingle(),
                            reader.ReadSingle()); break;

                    case ShaderParamType.TexSrt:
                        reader.Seek(param.DataOffset, SeekOrigin.Begin);
                        ShaderParam.TextureSRT texSRT = new ShaderParam.TextureSRT();
                        texSRT.Mode      = reader.ReadSingle(); //Scale mode, Maya, max ect
                        texSRT.scale     = new Vector2(reader.ReadSingle(), reader.ReadSingle());
                        texSRT.rotate    = reader.ReadSingle();
                        texSRT.translate = new Vector2(reader.ReadSingle(), reader.ReadSingle());
                        prm.Value_TexSrt = texSRT;
                        break;

                    case ShaderParamType.UInt:
                        prm.Value_UInt = reader.ReadUInt32();
                        break;

                    case ShaderParamType.Bool:
                        prm.Value_Bool = reader.ReadBoolean();
                        break;

                    case ShaderParamType.Float4x4:
                        prm.Value_float4x4 = reader.ReadSingles(16);
                        break;
                    }
                    poly.material.matparam.Add(param.Name, prm);
                }
                reader.Close();
            }
        }