Example #1
0
        internal ResDict <T> LoadDictValues <T>(long dictionaryOffset, long valueOffset)
            where T : IResData, new()
        {
            if (dictionaryOffset == 0)
            {
                return(new ResDict <T>());
            }

            using (TemporarySeek(dictionaryOffset, SeekOrigin.Begin))
            {
                ResDict <T> dict = new ResDict <T>();
                ((IResData)dict).Load(this);

                //Load data via list next to dictionary
                var keys   = dict.Keys.ToList();
                var values = LoadList <T>(dict.Count, (uint)valueOffset);

                dict.Clear();
                for (int i = 0; i < keys.Count; i++)
                {
                    dict.Add(keys[i], values[i]);
                }
                return(dict);
            }
        }
Example #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Texture"/> class.
        /// </summary>
        public Texture()
        {
            CompSelR = GX2CompSel.ChannelR;
            CompSelG = GX2CompSel.ChannelG;
            CompSelB = GX2CompSel.ChannelB;
            CompSelA = GX2CompSel.ChannelA;

            Name        = "";
            Path        = "";
            Width       = 0;
            Height      = 0;
            Depth       = 1;
            Swizzle     = 0;
            Alignment   = 0x1000;
            ArrayLength = 1;
            Pitch       = 32;
            TileMode    = GX2TileMode.Mode2dTiledThin1;
            AAMode      = GX2AAMode.Mode1X;
            Dim         = GX2SurfaceDim.Dim2D;
            Format      = GX2SurfaceFormat.T_BC1_SRGB;

            Data       = new byte[0];
            MipData    = new byte[0];
            MipOffsets = new uint[13];
            Regs       = new uint[5];

            UserData = new ResDict <UserData>();
        }
Example #3
0
        private void AddNodeGroup <T>(ResDict <T> SubSections, BCRESGroupNode Folder)
            where T : CtrObject, new()
        {
            if (SubSections == null || SubSections.Count == 0)
            {
                return;
            }

            Nodes.Add(Folder);

            foreach (CtrObject section in SubSections.Values)
            {
                switch (Folder.Type)
                {
                case BCRESGroupType.Models:
                    var CMDLWrapper = new CMDLWrapper((Model)section, this);
                    Folder.AddNode(CMDLWrapper);
                    RenderedBcres.Models.Add(CMDLWrapper);
                    break;

                case BCRESGroupType.Textures:
                    Folder.AddNode(new TXOBWrapper((Texture)section, this));
                    PluginRuntime.bcresTexContainers.Add(Folder);
                    break;
                }
            }
        }
Example #4
0
        public TextureFolder(BFRES bfres, ResFile resFile, ResDict <TextureShared> resDict, ExternalFile externalTextureFile)
        {
            if (externalTextureFile != null)
            {
                var bntxFile = externalTextureFile.LoadedFileData as BntxFile;
                Tag = new BntxWrapper(bntxFile);
            }

            List <TextureAsset> assetList = new List <TextureAsset>();

            foreach (TextureShared tex in resDict.Values)
            {
                var node = new BfresNodeBase(tex.Name);
                node.Icon = "/Images/Texture.png";
                AddChild(node);

                if (tex is BfresLibrary.WiiU.Texture)
                {
                    FtexTexture ftex = new FtexTexture(resFile, (BfresLibrary.WiiU.Texture)tex);
                    bfres.Textures.Add(ftex);
                    node.Tag = ftex;
                    assetList.Add(ftex.TextureAsset);
                }
                else
                {
                    var         texture     = (BfresLibrary.Switch.SwitchTexture)tex;
                    BntxTexture bntxTexture = new BntxTexture(texture.BntxFile, texture.Texture);
                    bfres.Textures.Add(bntxTexture);
                    node.Tag = bntxTexture;
                }
            }
        }
        public SceneAnimFolder(BFRES bfres, ResFile resFile, ResDict <SceneAnim> resDict)
        {
            foreach (SceneAnim anim in resDict.Values)
            {
                var node = new BfresNodeBase(anim.Name);
                AddChild(node);

                foreach (CameraAnim camAnim in anim.CameraAnims.Values)
                {
                    var camnode = new BfresNodeBase(camAnim.Name);
                    camnode.Tag = new BfresCameraAnim(camAnim);
                    node.AddChild(camnode);
                }
                foreach (LightAnim lightAnim in anim.LightAnims.Values)
                {
                    var camnode = new BfresNodeBase(lightAnim.Name);
                    node.AddChild(camnode);
                }
                foreach (FogAnim fogAnim in anim.FogAnims.Values)
                {
                    var camnode = new BfresNodeBase(fogAnim.Name);
                    node.AddChild(camnode);
                }
            }
        }
        internal void SaveDict(ResDict dict, long ShiftPos = 0)
        {
            long NewPos = Position;

            if (ShiftPos != 0)
            {
                NewPos = ShiftPos;
            }

            if (dict?.Count == 0 && ShiftPos == 0)
            {
                Write(0L);
                return;
            }
            if (TryGetItemEntry(dict, ItemEntryType.Dict, out ItemEntry entry))
            {
                entry.Offsets.Add((uint)NewPos);
            }
            else
            {
                _savedItems.Add(new ItemEntry(dict, ItemEntryType.Dict, (uint)NewPos));
            }

            if (ShiftPos == 0)
            {
                Write(UInt32.MaxValue);
                Write(0);
            }
        }
 public EmbeddedFolder(BFRES bfres, ResFile resFile, ResDict <ExternalFile> resDict)
 {
     foreach (var file in resDict)
     {
         var node = new BfresNodeBase(file.Key);
         node.Tag = new BfresExternalFile(file.Value, file.Key);
         AddChild(node);
     }
 }
Example #8
0
        public void LoadKeyShapes(IList <KeyShape> KeyShapes, ResDict keys)
        {
            keyShapeListView.Items.Clear();

            foreach (var keyShape in keys)
            {
                keyShapeListView.Items.Add($"{keyShape}");
            }
        }
        public BoneVisibilityAnimFolder(BFRES bfres, ResFile resFile, ResDict <VisibilityAnim> resDict)
        {
            foreach (VisibilityAnim anim in resDict.Values)
            {
                var node = new BfresNodeBase(anim.Name);
                AddChild(node);

                var fsha = new BfresVisibilityAnim(anim, resFile.Name);
                node.Tag = fsha;
                bfres.VisibilityAnimations.Add(fsha);
            }
        }
        public ShapeAnimFolder(BFRES bfres, ResFile resFile, ResDict <ShapeAnim> resDict)
        {
            foreach (ShapeAnim anim in resDict.Values)
            {
                var node = new BfresNodeBase(anim.Name);
                AddChild(node);

                var fsha = new BfresShapeAnim(anim, resFile.Name);
                node.Tag = fsha;
                bfres.ShapeAnimations.Add(fsha);
            }
        }
Example #11
0
        public TexturePatternAnimFolder(BFRES bfres, ResFile resFile, ResDict <MaterialAnim> resDict)
        {
            foreach (MaterialAnim anim in resDict.Values)
            {
                var node = new BfresNodeBase(anim.Name);
                AddChild(node);

                var fsha = new BfresMaterialAnim(anim, resFile.Name);
                node.Tag = fsha;
                bfres.MaterialAnimations.Add(fsha);
            }
        }
Example #12
0
        public ShaderParamAnimFolder(BFRES bfres, ResFile resFile, ResDict <MaterialAnim> resDict)
        {
            foreach (MaterialAnim anim in resDict.Values)
            {
                var node = new BfresNodeBase(anim.Name);
                AddChild(node);

                var fmaa = new BfresMaterialAnim(anim, resFile.Name);
                node.Tag = fmaa;
                bfres.MaterialAnimations.Add(fmaa);
            }
        }
        public void LoadUserData(ResDict <UserData> UserDataList)
        {
            listViewCustom1.Items.Clear();

            IsWiiU = true;

            userData = UserDataList;

            foreach (var item in userData.Values)
            {
                LoadUserData(item);
            }
        }
Example #14
0
        public SkeletalAnimFolder(BFRES bfres, ResFile resFile, ResDict <SkeletalAnim> resDict)
        {
            foreach (SkeletalAnim anim in resDict.Values)
            {
                var node = new BfresNodeBase(anim.Name);
                node.Icon = "/Images/SkeletonAnimation.png";
                AddChild(node);

                var fska = new BfresSkeletalAnim(resFile, anim, resFile.Name);
                node.Tag = fska;
                bfres.SkeletalAnimations.Add(fska);
            }
        }
Example #15
0
        private static void WriteSamplers(XmlDocument doc, List <Sampler> samplers, ResDict samplerDictionary, string Name, XmlNode node)
        {
            XmlNode rootNode = doc.CreateElement(Name);

            foreach (var sampler in samplers)
            {
                XmlNode childNode = doc.CreateElement("sampler");
                AddAttribute(doc, "name", samplerDictionary.GetKey(sampler.Index), childNode);
                AddAttribute(doc, "alt", sampler.AltAnnotation, childNode);
                AddAttribute(doc, "index", sampler.Index.ToString(), childNode);
                rootNode.AppendChild(childNode);
            }
            node.AppendChild(rootNode);
        }
Example #16
0
        public void AddToBones(ResDict <Bone> bones, Matrix4 parentBoneMatrix, short parentBoneIndex = -1)
        {
            bones.Add(BoneName, new Bone
            {
                Name          = BoneName,
                Position      = Vector4.Transform(new Vector4(Position.ToSkeletonScale(), 1), parentBoneMatrix.Inverted()).Xyz.ToVec3F(),
                Rotation      = new Syroot.Maths.Vector4F(0, 0, 0, 0),
                Scale         = Syroot.Maths.Vector3F.One,
                ParentIndex   = parentBoneIndex,
                FlagsRotation = BoneFlagsRotation.EulerXYZ
            });

            Cob?.AddToBones(bones, Matrix4.CreateTranslation(Position.ToSkeletonScale()), (short)(bones.Count - 1));
        }
Example #17
0
        public void AddToBones(ResDict <Bone> bones, Matrix4 parentBoneMatrix, short parentBoneIndex = -1)
        {
            bone.Name        = BoneName;
            bone.Position    = Vector4.Transform(new Vector4(Position.ToSkeletonScale(), 1), parentBoneMatrix.Inverted()).Xyz.ToVec3F();
            bone.ParentIndex = parentBoneIndex;

            bones.Add(BoneName, bone);

            parentBoneIndex = (short)(bones.Count - 1);

            foreach (var child in Children)
            {
                child.AddToBones(bones, bone.CalculateRelativeMatrix() * parentBoneMatrix, parentBoneIndex);
            }
        }
Example #18
0
        internal ResDict LoadDict()
        {
            long offset = ReadInt64();

            if (offset == 0)
            {
                return(new ResDict());
            }

            using (TemporarySeek(offset, SeekOrigin.Begin))
            {
                ResDict dict = new ResDict();
                ((IResData)dict).Load(this);
                return(dict);
            }
        }
        public ModelFolder(BFRES bfres, ResFile resFile, ResDict <Model> resDict)
        {
            foreach (Model model in resDict.Values)
            {
                var node = new BfresNodeBase(model.Name);
                node.Icon = "/Images/Model.png";
                AddChild(node);

                var fmdl = new FMDL(node, bfres, model);
                node.Tag = fmdl;
                bfres.Models.Add(fmdl);

                node.AddChild(new BfresNodeBase("Meshes"));
                node.AddChild(new MaterialFolder("Materials"));
                node.AddChild(new BfresNodeBase("Skeleton"));

                foreach (FSHP mesh in fmdl.Meshes)
                {
                    var meshNode = new BfresNodeBase(mesh.Name)
                    {
                        Tag  = mesh,
                        Icon = "/Images/Mesh.png"
                    };
                    mesh.ParentNode   = meshNode;
                    mesh.MeshSelected = (o, s) => {
                        meshNode.IsSelected = (bool)o;
                    };
                    node.Children[0].AddChild(meshNode);
                }

                foreach (FMAT mat in fmdl.Materials)
                {
                    var matNode = new BfresNodeBase(mat.Name)
                    {
                        Tag  = mat,
                        Icon = ((FMAT)mat).Icon,
                    };
                    mat.ParentNode = matNode;
                    node.Children[1].AddChild(matNode);
                }
                foreach (var bone in ((FSKL)fmdl.Skeleton).CreateBoneHierarchy())
                {
                    node.Children[2].AddChild(bone);
                }
            }
        }
Example #20
0
        internal ResDict <T> LoadDict <T>()
            where T : IResData, new()
        {
            uint offset = ReadOffset();

            if (offset == 0)
            {
                return(new ResDict <T>());
            }

            using (TemporarySeek(offset, SeekOrigin.Begin))
            {
                ResDict <T> dict = new ResDict <T>();
                ((IResData)dict).Load(this);
                return(dict);
            }
        }
 internal void SaveDict <T>(ResDict <T> dict)
     where T : IResData, new()
 {
     if (dict?.Count == 0)
     {
         Write(0);
         return;
     }
     if (TryGetItemEntry(dict, ItemEntryType.Dict, out ItemEntry entry))
     {
         entry.Offsets.Add((uint)Position);
     }
     else
     {
         _savedItems.Add(new ItemEntry(dict, ItemEntryType.Dict, (uint)Position));
     }
     Write(UInt32.MaxValue);
 }
Example #22
0
        public void AddToBones(ResDict <Bone> bones, Matrix4 parentBoneMatrix, short parentBoneIndex = -1)
        {
            int cobCount = bones.Keys.Count(x => x.StartsWith(ModelName));

            string modelName = ModelName;

            if (cobCount > 0)
            {
                modelName = ModelName + cobCount + 1;
            }

            bones.Add(modelName, new Bone
            {
                Name          = modelName,
                Position      = Vector4.Transform(new Vector4(Position.ToSkeletonScale(), 1), parentBoneMatrix.Inverted()).Xyz.ToVec3F(),
                Rotation      = new Syroot.Maths.Vector4F(0, 0, 0, 1),
                Scale         = Syroot.Maths.Vector3F.One,
                ParentIndex   = parentBoneIndex,
                FlagsRotation = BoneFlagsRotation.EulerXYZ
            });
        }
Example #23
0
        public void AddToBones(ResDict <Bone> bones, Matrix4 parentBoneMatrix, short parentBoneIndex = -1)
        {
            bones.Add(Name, new Bone
            {
                Name          = Name,
                Position      = Vector4.Transform(new Vector4(0, 0, 0, 1), parentBoneMatrix.Inverted()).Xyz.ToVec3F(),
                Rotation      = new Syroot.Maths.Vector4F(0, 0, 0, 1),
                Scale         = Syroot.Maths.Vector3F.One,
                ParentIndex   = parentBoneIndex,
                FlagsRotation = BoneFlagsRotation.EulerXYZ
            });

            parentBoneIndex = (short)(bones.Count - 1);

            foreach (WorldMapPoint point in RoutePoints)
            {
                point.AddToBones(bones, parentBoneMatrix, parentBoneIndex);

                parentBoneMatrix = Matrix4.CreateTranslation(point.Position.ToSkeletonScale());
                parentBoneIndex++;
            }
        }
        public static ResDict <UserData> Convert(Dictionary <string, object> userData)
        {
            ResDict <UserData> userDataDict = new ResDict <UserData>();

            foreach (var param in userData)
            {
                UserData usd = new UserData();

                string       type     = param.Key.Split('|')[0];
                string       name     = param.Key.Split('|')[1];
                UserDataType dataType = (UserDataType)Enum.Parse(typeof(UserDataType), type);

                if (dataType == UserDataType.Single)
                {
                    usd = SetUserData(name, ((JArray)param.Value).ToObject <float[]>());
                }
                if (dataType == UserDataType.Int32)
                {
                    usd = SetUserData(name, ((JArray)param.Value).ToObject <int[]>());
                }
                if (dataType == UserDataType.Byte)
                {
                    usd = SetUserData(name, ((JArray)param.Value).ToObject <byte[]>());
                }
                if (dataType == UserDataType.String)
                {
                    usd = SetUserData(name, ((JArray)param.Value).ToObject <string[]>());
                }
                if (dataType == UserDataType.WString)
                {
                    usd = SetUserData(name, ((JArray)param.Value).ToObject <string[]>(), true);
                }

                userDataDict.Add(usd.Name, usd);
            }
            return(userDataDict);
        }
Example #25
0
 public BoneIter(ResDict <Bone> bones)
 {
     this.bones = bones;
 }
Example #26
0
        public static void Render(ResDict <UserData> userDataDict)
        {
            if (ImGui.Button("Add"))
            {
                var userData = new UserData();
                userData.Name = " ";
                Selected.Add(userData);

                dialogOpen = true;
                ImGui.OpenPopup("##user_data_dialog");
                if (ActiveDialog.LoadDialog(userData, dialogOpen))
                {
                    userDataDict.Add(userData.Name, userData);
                }
            }

            var diabledTextColor = ImGui.GetStyle().Colors[(int)ImGuiCol.TextDisabled];

            if (Selected.Count == 0)
            {
                ImGui.PushStyleColor(ImGuiCol.Text, diabledTextColor);
            }

            ImGui.SameLine();
            if (ImGui.Button("Remove") && Selected.Count > 0)
            {
                foreach (var usd in Selected)
                {
                    userDataDict.Remove(usd);
                }
            }
            ImGui.SameLine();
            if (ImGui.Button("Edit") && Selected.Count > 0)
            {
                dialogOpen = true;
                ImGui.OpenPopup("##user_data_dialog");
            }

            if (Selected.Count == 0)
            {
                ImGui.PopStyleColor();
            }

            if (Selected.Count > 0 && dialogOpen)
            {
                ActiveDialog.LoadDialog(Selected.FirstOrDefault(), dialogOpen);
            }

            RenderHeader();

            if (ImGui.BeginChild("USER_DATA_LIST"))
            {
                int index = 0;
                foreach (var userData in userDataDict.Values)
                {
                    bool isSelected = Selected.Contains(userData);

                    ImGui.Columns(2);
                    if (ImGui.Selectable(userData.Name, isSelected))
                    {
                        Selected.Clear();
                        Selected.Add(userData);
                    }
                    ImGui.NextColumn();
                    ImGui.Text(GetDataString(userData, ","));
                    ImGui.NextColumn();

                    if (isSelected && ImGui.IsMouseDoubleClicked(0))
                    {
                        dialogOpen = true;
                        ImGui.OpenPopup("##user_data_dialog");
                    }
                    index++;

                    ImGui.Columns(1);
                }
            }
            ImGui.EndChild();
        }
Example #27
0
        private static void WriteUniformBlocks(XmlDocument doc, List <UniformBlock> uniformBlocks, ResDict uniformBlockeDictionary, string Name, XmlNode node)
        {
            XmlNode rootNode = doc.CreateElement(Name);

            foreach (var block in uniformBlocks)
            {
                XmlNode childNode = doc.CreateElement("uniform_block");
                AddAttribute(doc, "name", uniformBlockeDictionary.GetKey(block.Index), childNode);
                AddAttribute(doc, "size", block.Size.ToString(), childNode);
                AddAttribute(doc, "type", block.Type.ToString(), childNode);
                rootNode.AppendChild(childNode);

                int ind = 0;
                foreach (var uniform in block.Uniforms)
                {
                    XmlNode uniformsNode = doc.CreateElement("uniform");
                    if (ind < block.UniformDict.Count && ind >= 0)
                    {
                        AddAttribute(doc, "name", block.UniformDict.GetKey(ind), uniformsNode);
                    }
                    AddAttribute(doc, "index", uniform.Index.ToString(), uniformsNode);
                    AddAttribute(doc, "block_index", uniform.BlockIndex.ToString(), uniformsNode);
                    AddAttribute(doc, "offset", uniform.Offset.ToString(), uniformsNode);

                    if (ind < (block.UniformDict.Count - 1) && ind >= 0)
                    {
                        uint nextOffset    = block.Uniforms[ind + 1].Offset;
                        uint currentOffset = block.Uniforms[ind].Offset;

                        uint Size = nextOffset - currentOffset;

                        AddAttribute(doc, "size", Size.ToString(), uniformsNode);
                    }
                    if (ind == (block.UniformDict.Count - 1))
                    {
                        AddAttribute(doc, "size", (block.Size - uniform.Offset).ToString(), uniformsNode);
                    }

                    childNode.AppendChild(uniformsNode);

                    ind++;
                }
            }
            node.AppendChild(rootNode);
        }
Example #28
0
        private static void WriteAttributes(XmlDocument doc, List <BfshaLibrary.Attribute> attributes, ResDict attributeDictionary, string Name, XmlNode node)
        {
            XmlNode rootNode = doc.CreateElement(Name);

            foreach (var attribute in attributes)
            {
                XmlNode childNode = doc.CreateElement("attribute");
                AddAttribute(doc, "name", attributeDictionary.GetKey(attribute.Index), childNode);
                AddAttribute(doc, "location", attribute.Location.ToString(), childNode);
                AddAttribute(doc, "index", attribute.Index.ToString(), childNode);
                rootNode.AppendChild(childNode);
            }
            node.AppendChild(rootNode);
        }
Example #29
0
        public WorldMapScene(SarcData sarc, string sarcName)
        {
            multiSelect = true;

            #region read files
            this.sarc     = sarc;
            this.sarcName = sarcName;

            bfresEntry = sarc.Files.First(x => x.Key.EndsWith(".bfres"));

            pointEntry = sarc.Files.First(x => x.Key.StartsWith("pointW"));

            routeEntry = sarc.Files.First(x => x.Key.StartsWith("routeW"));

            bfres = new ResFile(new MemoryStream(bfresEntry.Value));
            bones = bfres.Models[0].Skeleton.Bones;

            pointCsv = Encoding.GetEncoding("shift-jis").GetString(sarc.Files.First(file => file.Key.StartsWith("pointW")).Value).
                       Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None).Reverse().Skip(1).Select(row =>
            {
                int pos = 0;
                List <string> fields = new List <string>();

                while (pos < row.Length)
                {
                    string value;

                    // Special handling for quoted field
                    if (row[pos] == '"')
                    {
                        // Skip initial quote
                        pos++;

                        // Parse quoted value
                        int start = pos;
                        while (pos < row.Length)
                        {
                            // Test for quote character
                            if (row[pos] == '"')
                            {
                                // Found one
                                pos++;

                                // If two quotes together, keep one
                                // Otherwise, indicates end of value
                                if (pos >= row.Length || row[pos] != '"')
                                {
                                    pos--;
                                    break;
                                }
                            }
                            pos++;
                        }
                        value = row.Substring(start, pos - start);
                        value = value.Replace("\"\"", "\"");
                    }
                    else
                    {
                        // Parse unquoted value
                        int start = pos;
                        while (pos < row.Length && row[pos] != ',')
                        {
                            pos++;
                        }
                        value = row.Substring(start, pos - start);
                    }

                    // Add field to list
                    fields.Add(value);

                    // Eat up to and including next comma
                    while (pos < row.Length && row[pos] != ',')
                    {
                        pos++;
                    }
                    if (pos < row.Length)
                    {
                        pos++;
                    }
                }

                return(fields.ToArray());
            }).Reverse().ToArray().ToDictionary(x => x[1]);

            routeCsv = Encoding.GetEncoding("shift-jis").GetString(sarc.Files.First(file => file.Key.StartsWith("routeW")).Value).
                       Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None).Reverse().Skip(1).Select(row =>
            {
                int pos = 0;
                List <string> fields = new List <string>();

                while (pos < row.Length)
                {
                    string value;

                    // Special handling for quoted field
                    if (row[pos] == '"')
                    {
                        // Skip initial quote
                        pos++;

                        // Parse quoted value
                        int start = pos;
                        while (pos < row.Length)
                        {
                            // Test for quote character
                            if (row[pos] == '"')
                            {
                                // Found one
                                pos++;

                                // If two quotes together, keep one
                                // Otherwise, indicates end of value
                                if (pos >= row.Length || row[pos] != '"')
                                {
                                    pos--;
                                    break;
                                }
                            }
                            pos++;
                        }
                        value = row.Substring(start, pos - start);
                        value = value.Replace("\"\"", "\"");
                    }
                    else
                    {
                        // Parse unquoted value
                        int start = pos;
                        while (pos < row.Length && row[pos] != ',')
                        {
                            pos++;
                        }
                        value = row.Substring(start, pos - start);
                    }

                    // Add field to list
                    fields.Add(value);

                    // Eat up to and including next comma
                    while (pos < row.Length && row[pos] != ',')
                    {
                        pos++;
                    }
                    if (pos < row.Length)
                    {
                        pos++;
                    }
                }

                return(fields.ToArray());
            }).Reverse().ToArray().ToDictionary(x => x[0]);


            //SaveFileDialog sfd = new SaveFileDialog()
            //{
            //    FileName = sarcName
            //};

            //if (sfd.ShowDialog() == DialogResult.OK)
            //{
            //    var stream = new MemoryStream();
            //    bfres.Save(stream, true);

            //    sarc.Files[bfresEntry.Key] = stream.ToArray();

            //    Yaz0.Compress(new FileStream(sfd.FileName, FileMode.OpenOrCreate), SARC.PackN(sarc));
            //}

            #endregion

            #region read map from bones
            Matrix4 rootMatrix = bones[0].CalculateRelativeMatrix();

            var boneIter = new BoneIter(bones);

            boneIter.MoveNext(); //first bone is the root, we don't need to read it

            while (boneIter.MoveNext())
            {
                var bone = boneIter.Current;

                if (bone.ParentIndex == -1) //there is more than one root (should never happen)
                {
                    break;
                }

                if (bone.Name.StartsWith("R")) //indicates a Route
                {
                    Routes.Add(new WorldMapRoute(boneIter, rootMatrix, pointCsv));
                    continue;
                }

                if (bone.ParentIndex != 0)
                {
                    throw new Exception(bone.Name + " is in an unexpected Layer, proceeding might currupt the file");
                }

                Vector4 pos = new Vector4(
                    bone.Position.X / 100,
                    bone.Position.Y / 100,
                    bone.Position.Z / 100,
                    1
                    );

                if (bone.Name == "course")
                {
                    Matrix4 courseBoneMatrix = boneIter.Current.CalculateRelativeMatrix() * rootMatrix;

                    short courseBoneIndex = (short)boneIter.CurrentBoneIndex;
                    while (boneIter.PeekNext()?.ParentIndex == courseBoneIndex)
                    {
                        boneIter.MoveNext();
                        if (pointCsv.ContainsKey(boneIter.Current.Name))
                        {
                            WorldMapObjects.Add(new WorldMapPoint(boneIter, courseBoneMatrix, pointCsv[boneIter.Current.Name]));
                        }
                        else
                        {
                            WorldMapObjects.Add(new UnknownWorldMapBone(boneIter, rootMatrix));
                        }
                    }
                }
                else if (pointCsv.ContainsKey(bone.Name))
                {
                    WorldMapObjects.Add(new WorldMapPoint(boneIter, rootMatrix, pointCsv[bone.Name]));
                }
                else if (bone.Name.StartsWith("cob"))
                {
                    WorldMapObjects.Add(new WorldMapCob(boneIter, rootMatrix));
                }
                else
                {
                    WorldMapObjects.Add(new UnknownWorldMapBone(boneIter, rootMatrix));
                }
            }
            #endregion

            foreach (var route in Routes)
            {
                TryGetPoint(route.Name.Substring(1, 4), out WorldMapPoint start);
                TryGetPoint(route.Name.Substring(5, 4), out WorldMapPoint end);

                route.Start = start;
                route.End   = end;
            }

            //ModelObjectReplace();

            StaticObjects.Add(new StaticModel(bfresEntry.Key, bfres));
            StaticObjects.Add(new ConnectionDrawer(this));

            SelectionChanged += WorldMapScene_SelectionChanged;
        }
        internal override void ConvertToSwitchMaterial(Material material)
        {
            //Convert all render info

            if (material.ShaderAssign.ShadingModelName == "turbo_uber_xlu" || material.Name.Contains("CausticsArea"))
            {
                material.Visible = false;
                return;
            }

            Console.WriteLine("Converting material " + material.Name);

            for (int i = 0; i < 5; i++)
            {
                RemoveRenderInfo(material, $"gsys_model_fx{i}");
            }

            material.SetRenderInfo("gsys_bake_normal_map", "default");
            material.SetRenderInfo("gsys_bake_emission_map", "default");
            material.SetRenderInfo("gsys_render_state_display_face", GetCullState(material.RenderState));
            material.SetRenderInfo("gsys_render_state_mode", GetRenderState(material.RenderState));
            material.SetRenderInfo("gsys_depth_test_enable", RenderInfoBoolString(
                                       material.RenderState.DepthControl.DepthTestEnabled));
            material.SetRenderInfo("gsys_depth_test_func", CompareFunction[
                                       material.RenderState.DepthControl.DepthFunc]);
            material.SetRenderInfo("gsys_depth_test_write", RenderInfoBoolString(
                                       material.RenderState.DepthControl.DepthWriteEnabled));
            material.SetRenderInfo("gsys_alpha_test_enable", RenderInfoBoolString(
                                       material.RenderState.AlphaControl.AlphaTestEnabled));
            material.SetRenderInfo("gsys_alpha_test_func", CompareFunction[
                                       material.RenderState.AlphaControl.AlphaFunc]);
            material.SetRenderInfo("gsys_alpha_test_value",
                                   material.RenderState.AlphaRefValue);
            material.SetRenderInfo("gsys_render_state_blend_mode", GetBlendMode(material.RenderState));

            material.SetRenderInfo("gsys_color_blend_rgb_op", BlendCombine[
                                       material.RenderState.BlendControl.ColorCombine]);
            material.SetRenderInfo("gsys_color_blend_rgb_src_func", BlendFunction[
                                       material.RenderState.BlendControl.ColorSourceBlend]);
            material.SetRenderInfo("gsys_color_blend_rgb_dst_func", BlendFunction[
                                       material.RenderState.BlendControl.ColorDestinationBlend]);

            material.SetRenderInfo("gsys_color_blend_alpha_op", BlendCombine[
                                       material.RenderState.BlendControl.AlphaCombine]);
            material.SetRenderInfo("gsys_color_blend_alpha_src_func", BlendFunction[
                                       material.RenderState.BlendControl.AlphaSourceBlend]);
            material.SetRenderInfo("gsys_color_blend_alpha_dst_func", BlendFunction[
                                       material.RenderState.BlendControl.AlphaDestinationBlend]);

            material.SetRenderInfo("gsys_color_blend_const_color", new float[4] {
                0, 0, 0, 0
            });

            material.SetShaderParameter("gsys_alpha_test_ref_value",
                                        ShaderParamType.Float, material.RenderState.AlphaRefValue);
            material.SetShaderParameter("gsys_xlu_zprepass_alpha",
                                        ShaderParamType.Float4, new float[4] {
                1, 1, 1, 1
            });
            material.SetShaderParameter("screen_fake_scale_begin_ratio",
                                        ShaderParamType.Float, 0.25f);
            material.SetShaderParameter("screen_fake_scale_factor",
                                        ShaderParamType.Float3, new float[3] {
                0, 0, 0
            });

            if (!material.ShaderParams.ContainsKey("d_shadow_bake_l_cancel_rate"))
            {
                material.SetShaderParameter("d_shadow_bake_l_cancel_rate",
                                            ShaderParamType.Float, 0.25f);
            }

            if (!material.ShaderParams.ContainsKey("decal_trail_intensity"))
            {
                material.SetShaderParameter("decal_trail_intensity",
                                            ShaderParamType.Float, 1);
            }

            if (!material.ShaderParams.ContainsKey("indirect_magB"))
            {
                material.SetShaderParameter("indirect_magB",
                                            ShaderParamType.Float2, new float[2] {
                    1, 1
                });
            }

            if (!material.ShaderParams.ContainsKey("decal_trail_color"))
            {
                material.SetShaderParameter("decal_trail_color",
                                            ShaderParamType.Float2, new float[3] {
                    1, 1, 1
                });
            }

            material.ShaderParams.RemoveKey("effect_normal_offset");
            material.ShaderParams.RemoveKey("gsys_model_fx_ratio");
            material.ShaderParams.RemoveKey("gsys_specular_roughness");
            material.ShaderParams.RemoveKey("zprepass_shadow_rate");

            //Adjust shader params
            //Here we'll make a new shader param list in the same switch order
            List <ShaderParam> param = new List <ShaderParam>();

            param.Add(material.ShaderParams["edge_light_rim_i"]);
            param.Add(material.ShaderParams["d_shadow_bake_l_cancel_rate"]);
            param.Add(material.ShaderParams["gsys_i_color_ratio0"]);
            param.Add(material.ShaderParams["gsys_edge_ratio0"]);
            param.Add(material.ShaderParams["gsys_edge_width0"]);
            param.Add(material.ShaderParams["bloom_intensity"]);
            param.Add(material.ShaderParams["gsys_outline_width"]);
            param.Add(material.ShaderParams["gsys_alpha_threshold"]);
            param.Add(material.ShaderParams["game_edge_pow"]);
            param.Add(material.ShaderParams["edge_alpha_scale"]);
            param.Add(material.ShaderParams["post_multi_texture"]);
            param.Add(material.ShaderParams["edge_alpha_width"]);
            param.Add(material.ShaderParams["edge_alpha_pow"]);
            param.Add(material.ShaderParams["transparency"]);
            param.Add(material.ShaderParams["alphat_out_start"]);
            param.Add(material.ShaderParams["alphat_out_end"]);
            param.Add(material.ShaderParams["gsys_area_env_index_diffuse"]);
            param.Add(material.ShaderParams["shadow_density"]);
            param.Add(material.ShaderParams["ao_density"]);
            param.Add(material.ShaderParams["transmit_intensity"]);
            param.Add(material.ShaderParams["edge_light_vc_intensity"]);
            param.Add(material.ShaderParams["specular_aniso_power"]);
            param.Add(material.ShaderParams["transmit_shadow_intensity"]);
            param.Add(material.ShaderParams["edge_light_intensity"]);
            param.Add(material.ShaderParams["light_pre_pass_intensity"]);
            param.Add(material.ShaderParams["gsys_bake_opacity"]);
            param.Add(material.ShaderParams["shiny_specular_intensity"]);
            param.Add(material.ShaderParams["specular_intensity"]);
            param.Add(material.ShaderParams["specular_roughness"]);
            param.Add(material.ShaderParams["specular_fresnel_i"]);
            param.Add(material.ShaderParams["specular_fresnel_s"]);
            param.Add(material.ShaderParams["specular_fresnel_m"]);
            param.Add(material.ShaderParams["shiny_specular_sharpness"]);
            param.Add(material.ShaderParams["emission_intensity"]);
            param.Add(material.ShaderParams["soft_edge_dist_inv"]);
            param.Add(material.ShaderParams["silhoutte_depth"]);
            param.Add(material.ShaderParams["refraction_intensity"]);
            param.Add(material.ShaderParams["normal_map_weight"]);
            param.Add(material.ShaderParams["shiny_specular_fresnel"]);
            param.Add(material.ShaderParams["silhoutte_depth_contrast"]);
            param.Add(material.ShaderParams["fresnel_look_depend_factor"]);
            param.Add(material.ShaderParams["mii_hair_specular_intensity"]);
            param.Add(material.ShaderParams["decal_trail_intensity"]);
            param.Add(material.ShaderParams["screen_fake_scale_begin_ratio"]);
            param.Add(material.ShaderParams["fog_emission_intensity"]);
            param.Add(material.ShaderParams["fog_emission_effect"]);
            param.Add(material.ShaderParams["fog_edge_power"]);
            param.Add(material.ShaderParams["fog_edge_width"]);
            param.Add(material.ShaderParams["gsys_alpha_test_ref_value"]);
            param.Add(material.ShaderParams["edge_light_sharpness"]);
            param.Add(material.ShaderParams["indirect_mag"]);
            param.Add(material.ShaderParams["indirect_magB"]);
            param.Add(material.ShaderParams["silhoutte_depth_color"]);
            param.Add(material.ShaderParams["gsys_mii_skin_color"]);
            param.Add(material.ShaderParams["gsys_mii_favorite_color"]);
            param.Add(material.ShaderParams["gsys_point_light_color"]);
            param.Add(material.ShaderParams["gsys_edge_color0"]);
            param.Add(material.ShaderParams["transmit_color"]);
            param.Add(material.ShaderParams["gsys_i_color0"]);
            param.Add(material.ShaderParams["gsys_i_color0_b"]);
            param.Add(material.ShaderParams["gsys_bake_light_scale"]);
            param.Add(material.ShaderParams["gsys_bake_light_scale1"]);
            param.Add(material.ShaderParams["gsys_bake_light_scale2"]);
            param.Add(material.ShaderParams["albedo_tex_color"]);
            param.Add(material.ShaderParams["decal_trail_color"]);
            param.Add(material.ShaderParams["fog_emission_color"]);
            param.Add(material.ShaderParams["screen_fake_scale_factor"]);
            param.Add(material.ShaderParams["edge_light_color"]);
            param.Add(material.ShaderParams["shiny_specular_color"]);
            param.Add(material.ShaderParams["specular_color"]);
            param.Add(material.ShaderParams["emission_color"]);
            param.Add(material.ShaderParams["gsys_depth_silhoutte_color"]);
            param.Add(material.ShaderParams["gsys_outline_color"]);
            param.Add(material.ShaderParams["gsys_area_env_data0"]);
            param.Add(material.ShaderParams["gsys_area_env_data1"]);
            param.Add(material.ShaderParams["gsys_bake_st0"]);
            param.Add(material.ShaderParams["gsys_bake_st1"]);
            param.Add(material.ShaderParams["multi_tex_reg0"]);
            param.Add(material.ShaderParams["multi_tex_reg1"]);
            param.Add(material.ShaderParams["multi_tex_param0"]);
            param.Add(material.ShaderParams["fog_edge_color"]);
            param.Add(material.ShaderParams["gsys_xlu_zprepass_alpha"]);
            param.Add(material.ShaderParams["multi_tex_reg2"]);
            param.Add(material.ShaderParams["gsys_sssss_color"]);
            param.Add(material.ShaderParams["tex_mtx1"]);
            param.Add(material.ShaderParams["tex_mtx2"]);
            param.Add(material.ShaderParams["tex_mtx0"]);

            material.ShaderParams.Clear();
            foreach (var prm in param)
            {
                material.ShaderParams.Add(prm.Name, prm);
            }

            //Adjust shader options

            //gsys_alpha_test_enable
            //gsys_alpha_test_func
            //enable_screen_fake_scale

            var shaderAssign = material.ShaderAssign;

            shaderAssign.ShaderOptions.RemoveKey("enable_effect_normal_offset");
            shaderAssign.ShaderOptions.RemoveKey("bake_calc_type");

            ResDict <ResString> shaderOptions = new ResDict <ResString>();

            var keys    = shaderAssign.ShaderOptions.Keys.ToList();
            var values  = shaderAssign.ShaderOptions.Values.ToList();
            int opIndex = 0;

            for (int i = 0; i < keys.Count + 3; i++)
            {
                if (i == 0)
                {
                    shaderOptions.Add("gsys_alpha_test_enable",
                                      material.RenderState.AlphaControl.AlphaTestEnabled ? "0" : "0");
                }
                else if (i == 1)
                {
                    shaderOptions.Add("gsys_alpha_test_func", GetShaderOptionAlphaTestFunc(
                                          CompareFunction[material.RenderState.AlphaControl.AlphaFunc]));
                }
                else if (i == 100)
                {
                    shaderOptions.Add("enable_screen_fake_scale", "0");
                }
                else
                {
                    shaderOptions.Add(keys[opIndex], values[opIndex]);
                    opIndex++;
                }
            }
            shaderAssign.ShaderOptions = shaderOptions;
        }