public static string GetBufferLayoutStringFromStruct(SoulsFormats.FLVER2.BufferLayout bufferLayout)
        {
            var sb = new StringBuilder();

            foreach (var member in bufferLayout)
            {
                sb.AppendLine($"    {member.Type} {member.Semantic}{(member.Index > 0 ? $"[{member.Index}]" : "")}");
            }
            return(sb.ToString());
        }
        public static SoulsFormats.FLVER2.BufferLayout getLayout(string MTDName, bool isStatic)
        {
            if (MTD_INFO_LIST == null)
            {
                loadMTDInfoList();
            }

            JObject MTD_INFO           = getMTDInfo(MTDName);
            JArray  MTD_LAYOUT_MEMBERS = (JArray)MTD_INFO["LayoutMembers"];

            SoulsFormats.FLVER2.BufferLayout BL = new SoulsFormats.FLVER2.BufferLayout();
            for (int i = 0; i < MTD_LAYOUT_MEMBERS.Count; i++)
            {
                MBT mbt = (MBT)uint.Parse(MTD_LAYOUT_MEMBERS[i]["Type"].ToString());
                MBS mbs = (MBS)uint.Parse(MTD_LAYOUT_MEMBERS[i]["Semantic"].ToString());
                if (isStatic && mbs == MBS.BoneWeights)
                {
                    continue;
                }
                BL.Add(new SoulsFormats.FLVER.LayoutMember(mbt, mbs));
            }

            return(BL);
        }
        public void ChooseGamePreset(FlverGamePreset preset)
        {
            //Layout
            BufferLayout = new SoulsFormats.FLVER2.BufferLayout();

            void Member(MBT t, MBS s, int i = 0)
            {
                var newMemb = new SoulsFormats.FLVER.LayoutMember(t, s, i);

                BufferLayout.Add(newMemb);
            }

            //Texture Channel Setup

            FBXMaterialChannelMap.Clear();

            void Tex(string fbxChannel, string ingameChannel)
            {
                FBXMaterialChannelMap.Add(fbxChannel, ingameChannel);
            }

            //Hardcoded texture channels

            MTDHardcodedTextureChannels.Clear();

            void HardcodeTex(string ingameChannel, string hardcodedValue)
            {
                MTDHardcodedTextureChannels.Add(ingameChannel, hardcodedValue);
            }

            switch (preset)
            {
            case FlverGamePreset.DS1Static:
                Member(MBT.Float3, MBS.Position);
                Member(MBT.Byte4B, MBS.BoneIndices);
                Member(MBT.Byte4C, MBS.Normal);
                Member(MBT.Byte4C, MBS.Tangent);
                Member(MBT.Byte4C, MBS.VertexColor);
                Member(MBT.UV, MBS.UV);

                Tex("Texture", "g_Diffuse");
                Tex("Specular", "g_Specular");
                Tex("NormalMap", "g_Bumpmap");

                HardcodeTex("g_DetailBumpmap", "");

                FlverVersion = 0x2000C;
                TpfEncoding  = 2;
                TpfFlag2     = 3;

                NormalWValue = 0;
                UVScaleX     = 1;
                UVScaleY     = 1;
                PlaceholderMaterialShaderName = "P_Metal[DSB]";
                UseDirectBoneIndices          = false;
                Unk0x5CValue = 0;
                Unk0x68Value = 0;

                FakeTextureDirectory = "";

                break;

            case FlverGamePreset.DS1Skinned:
                Member(MBT.Float3, MBS.Position);
                Member(MBT.Byte4B, MBS.BoneIndices);
                Member(MBT.Short4toFloat4A, MBS.BoneWeights);
                Member(MBT.Byte4C, MBS.Normal);
                Member(MBT.Byte4C, MBS.Tangent);
                Member(MBT.Byte4C, MBS.VertexColor);
                Member(MBT.UV, MBS.UV);

                Tex("Texture", "g_Diffuse");
                Tex("Specular", "g_Specular");
                Tex("NormalMap", "g_Bumpmap");

                HardcodeTex("g_DetailBumpmap", "");

                FlverVersion = 0x2000C;
                TpfEncoding  = 2;
                TpfFlag2     = 3;

                NormalWValue = 0;
                UVScaleX     = 1;
                UVScaleY     = 1;
                PlaceholderMaterialShaderName = "P_Metal[DSB]";
                UseDirectBoneIndices          = false;
                Unk0x5CValue = 0;
                Unk0x68Value = 0;

                FakeTextureDirectory = "";

                break;

            case FlverGamePreset.DS2Static:
                Member(MBT.Float3, MBS.Position);
                Member(MBT.Byte4B, MBS.Normal);
                Member(MBT.Byte4B, MBS.Tangent);
                Member(MBT.Byte4B, MBS.BoneIndices);
                Member(MBT.Byte4C, MBS.BoneWeights);
                Member(MBT.Byte4C, MBS.VertexColor, 0);
                Member(MBT.Byte4C, MBS.VertexColor, 1);
                Member(MBT.UV, MBS.UV);

                Tex("Texture", "g_DiffuseTexture");
                Tex("Specular", "g_SpecularTexture");
                Tex("NormalMap", "g_BumpmapTexture");

                HardcodeTex("g_BreakBumpmapTexture", @"N:\FRPG2\data\Model\parts\Common\tex\WP_damage_metal_n.tga");

                FlverVersion = 0x20010;
                TpfEncoding  = 2;
                TpfFlag2     = 3;

                NormalWValue = -1;
                UVScaleX     = 1;
                UVScaleY     = 1;
                PlaceholderMaterialShaderName = "W[Ibl][DSB]";
                UseDirectBoneIndices          = false;
                Unk0x5CValue = 1;
                Unk0x68Value = 1;

                FakeTextureDirectory = @"N:\FBX2FLVER\CustomTextures\";

                break;

            case FlverGamePreset.DS2Skinned:
                Member(MBT.Float3, MBS.Position);
                Member(MBT.Byte4B, MBS.Normal);
                Member(MBT.Byte4B, MBS.Tangent);
                Member(MBT.Byte4B, MBS.BoneIndices);
                Member(MBT.Byte4C, MBS.BoneWeights);
                Member(MBT.Byte4C, MBS.VertexColor, 0);
                Member(MBT.Byte4C, MBS.VertexColor, 1);
                Member(MBT.Byte4C, MBS.VertexColor, 2);
                Member(MBT.UV, MBS.UV);

                Tex("Texture", "g_DiffuseTexture");
                Tex("Specular", "g_SpecularTexture");
                Tex("NormalMap", "g_BumpmapTexture");

                HardcodeTex("g_BreakBumpmapTexture", @"N:\FRPG2\data\Model\parts\Common\tex\WP_damage_metal_n.tga");

                FlverVersion = 0x20010;
                TpfEncoding  = 2;
                TpfFlag2     = 3;

                NormalWValue = -1;
                UVScaleX     = 1;
                UVScaleY     = 1;
                PlaceholderMaterialShaderName = "W[Ibl][DSB]";
                UseDirectBoneIndices          = false;
                Unk0x5CValue = 1;
                Unk0x68Value = 0;

                FakeTextureDirectory = @"N:\FBX2FLVER\CustomTextures\";

                break;

            case FlverGamePreset.DS3Static:
                Member(MBT.Float3, MBS.Position);
                Member(MBT.Byte4B, MBS.Normal);
                Member(MBT.Byte4B, MBS.Tangent);
                Member(MBT.Byte4B, MBS.Tangent, 1);
                Member(MBT.Byte4B, MBS.BoneIndices);
                Member(MBT.Byte4C, MBS.BoneWeights);
                Member(MBT.Byte4C, MBS.VertexColor, 1);
                Member(MBT.UVPair, MBS.UV);


                Tex("Texture", "g_DiffuseTexture");
                //Tex("Specular", "g_SpecularTexture");
                //Tex("Reflection", "g_ShininessTexture");
                Tex("Specular", "g_ShininessTexture");
                Tex("NormalMap", "g_BumpmapTexture");

                HardcodeTex("g_DamagedNormalTexture", @"N:\SPRJ\data\Other\SysTex\SYSTEX_DummyDamagedNormal.tif");

                FlverVersion = 0x20014;
                TpfEncoding  = 1;
                TpfFlag2     = 3;

                NormalWValue = -1;
                UVScaleX     = 1;
                UVScaleY     = 1;
                PlaceholderMaterialShaderName = "P_WP[ARSN]";
                UseDirectBoneIndices          = true;
                Unk0x5CValue = 0;
                Unk0x68Value = 4;

                FakeTextureDirectory = "";

                break;

            case FlverGamePreset.DS3Skinned:
                Member(MBT.Float3, MBS.Position);
                Member(MBT.Byte4B, MBS.Normal);
                Member(MBT.Byte4B, MBS.Tangent);
                Member(MBT.Byte4B, MBS.Tangent, 1);
                Member(MBT.Byte4B, MBS.BoneIndices);
                Member(MBT.Byte4C, MBS.BoneWeights);
                Member(MBT.UVPair, MBS.UV);
                Member(MBT.Byte4C, MBS.UV, 1);

                Tex("Texture", "SAT_Equip_snp_Texture2D_5_AlbedoMap_0");
                //Tex("Specular", "g_SpecularTexture");
                Tex("Specular", "SAT_Equip_snp_Texture2D_3_ReflectanceMap_0");
                Tex("NormalMap", "SAT_Equip_snp_Texture2D_4_NormalMap_0");

                HardcodeTex("SAT_Equip_snp_Texture2D_1_BlendMask", @"N:\FDP\data\Other\SysTex\SYSTEX_DummyBurn_m.tif");
                HardcodeTex("SAT_Equip_snp_Texture2D_0_EmissiveMap_0", @"N:\FDP\data\Other\SysTex\SYSTEX_DummyBurn_em.tif");
                HardcodeTex("SAT_Equip_snp_Texture2D_2_DamageNormal", @"N:\FDP\data\Other\SysTex\SYSTEX_DummyDamagedNormal.tif");

                FlverVersion = 0x20014;
                TpfEncoding  = 1;
                TpfFlag2     = 3;

                NormalWValue = -1;
                UVScaleX     = 1;
                UVScaleY     = 1;
                PlaceholderMaterialShaderName = "P_BD[ARSN]";
                UseDirectBoneIndices          = true;
                Unk0x5CValue = 0;
                Unk0x68Value = 4;

                FakeTextureDirectory = "";

                break;

            default:
                throw new NotImplementedException();
            }
        }