Exemplo n.º 1
0
        public static void WriteRenderInfo(this FMAT m, Material mat)
        {
            if (mat.RenderInfos == null)
            {
                mat.RenderInfos = new List <RenderInfo>();
            }

            mat.RenderInfos.Clear();
            foreach (BfresRenderInfo rnd in m.renderinfo)
            {
                RenderInfo r = new RenderInfo();
                r.Name = rnd.Name;
                switch (rnd.Type)
                {
                case RenderInfoType.Int32: r.SetValue(rnd.ValueInt); break;

                case RenderInfoType.Single: r.SetValue(rnd.ValueFloat); break;

                case RenderInfoType.String: r.SetValue(rnd.ValueString); break;
                }
                mat.RenderInfos.Add(r);
            }
        }
Exemplo n.º 2
0
        public static Material CreateSwitchMaterial(this BFRES.MaterialData mat)
        {
            Material m = new Material();

            m.Flags            = (MaterialFlags)mat.IsVisable;
            m.Name             = mat.Name;
            m.TextureRefs      = new List <TextureRef>();
            m.RenderInfos      = new List <RenderInfo>();
            m.Samplers         = new List <Sampler>();
            m.VolatileFlags    = new byte[0];
            m.UserDatas        = new List <UserData>();
            m.ShaderParams     = new List <ShaderParam>();
            m.SamplerDict      = new ResDict();
            m.RenderInfoDict   = new ResDict();
            m.ShaderParamDict  = new ResDict();
            m.UserDataDict     = new ResDict();
            m.VolatileFlags    = new byte[0];
            m.TextureSlotArray = new long[mat.textures.Count];
            m.SamplerSlotArray = new long[mat.textures.Count];
            m.ShaderParamData  = WriteShaderParams(mat);

            int CurTex = 0;

            foreach (BFRES.MatTexture tex in mat.textures)
            {
                TextureRef texture = new TextureRef();
                texture.Name = tex.Name;
                m.TextureRefs.Add(texture);

                Sampler samp = new Sampler();
                samp.BorderColorType = tex.BorderColorType;
                samp.CompareFunc     = tex.CompareFunc;
                samp.FilterMode      = tex.FilterMode;
                samp.LODBias         = tex.LODBias;
                samp.MaxAnisotropic  = tex.MaxAnisotropic;
                samp.MaxLOD          = tex.magFilter;
                samp.MinLOD          = tex.minFilter;
                samp.WrapModeU       = (TexClamp)tex.wrapModeS;
                samp.WrapModeV       = (TexClamp)tex.wrapModeT;
                samp.WrapModeW       = (TexClamp)tex.wrapModeW;

                m.Samplers.Add(samp);

                m.SamplerDict.Add(tex.SamplerName);

                m.TextureSlotArray[CurTex] = -1;
                m.SamplerSlotArray[CurTex] = -1;

                CurTex++;
            }

            int CurParam = 0;

            foreach (var prm in mat.matparam)
            {
                ShaderParam shaderParam = new ShaderParam();
                shaderParam.Name          = prm.Key;
                shaderParam.Type          = (ShaderParamType)prm.Value.Type;
                shaderParam.DependIndex   = (ushort)CurParam;
                shaderParam.DependedIndex = (ushort)CurParam;
                shaderParam.DataOffset    = (ushort)prm.Value.DataOffset;
                CurParam++;
            }
            foreach (BFRES.RenderInfoData rnd in mat.renderinfo)
            {
                RenderInfo renderInfo = new RenderInfo();
                renderInfo.Name = rnd.Name;

                if (rnd.Type == Syroot.NintenTools.Bfres.RenderInfoType.Int32)
                {
                    renderInfo.SetValue(rnd.Value_Ints);
                }
                if (rnd.Type == Syroot.NintenTools.Bfres.RenderInfoType.Single)
                {
                    renderInfo.SetValue(rnd.Value_Floats);
                }
                if (rnd.Type == Syroot.NintenTools.Bfres.RenderInfoType.String)
                {
                    renderInfo.SetValue(rnd.Value_Strings);
                }

                m.RenderInfos.Add(renderInfo);
            }

            ShaderAssign shaderAssign = new ShaderAssign();

            shaderAssign.ShaderArchiveName = mat.shaderassign.ShaderArchive;
            shaderAssign.ShadingModelName  = mat.shaderassign.ShaderModel;

            shaderAssign.ShaderOptionDict  = new ResDict();
            shaderAssign.AttribAssignDict  = new ResDict();
            shaderAssign.SamplerAssignDict = new ResDict();
            shaderAssign.ShaderOptions     = new List <string>();
            shaderAssign.AttribAssigns     = new List <string>();
            shaderAssign.SamplerAssigns    = new List <string>();

            foreach (var op in mat.shaderassign.options)
            {
                shaderAssign.ShaderOptionDict.Add(op.Key);
                shaderAssign.ShaderOptions.Add(op.Value);
            }
            foreach (var att in mat.shaderassign.attributes)
            {
                shaderAssign.AttribAssignDict.Add(att.Key);
                shaderAssign.AttribAssigns.Add(att.Value);
            }
            foreach (var smp in mat.shaderassign.samplers)
            {
                shaderAssign.SamplerAssignDict.Add(smp.Key);
                shaderAssign.SamplerAssigns.Add(smp.Value);
            }

            m.ShaderAssign = shaderAssign;

            return(m);
        }
Exemplo n.º 3
0
        public void LoadDialog(RenderInfo renderInfo, bool dialogOpen, EventHandler onDialogClosed)
        {
            if (ImGui.BeginPopupModal("##render_info_dialog", ref dialogOpen))
            {
                if (!canParse)
                {
                    ImGui.TextColored(new System.Numerics.Vector4(1, 0, 0, 1), $"Failed to parse type {renderInfo.Type}!");
                }

                ImGuiHelper.InputFromText("Name", renderInfo, "Name", 200);

                if (ValuePresets.Count > 0 && renderInfo.Type == RenderInfoType.String)
                {
                    string value = renderInfo.GetValueStrings()[0];
                    if (ImGui.BeginCombo("Presets", ""))
                    {
                        foreach (var val in ValuePresets)
                        {
                            bool isSelected = val == value;
                            if (ImGui.Selectable(val, isSelected))
                            {
                                renderInfo.SetValue(new string[1] {
                                    val
                                });
                            }

                            if (isSelected)
                            {
                                ImGui.SetItemDefaultFocus();
                            }
                        }
                        ImGui.EndCombo();
                    }
                }

                ImGuiHelper.ComboFromEnum <RenderInfoType>("Type", renderInfo, "Type");

                var windowSize = ImGui.GetWindowSize();
                var buffer     = Encoding.UTF8.GetBytes(GetDataString(renderInfo));

                if (ImGui.InputText("Values", buffer, (uint)0x2048, ImGuiInputTextFlags.Multiline))
                {
                    canParse = true;

                    var      text   = Encoding.UTF8.GetString(buffer);
                    string[] values = text.Split('\n');

                    try
                    {
                        if (renderInfo.Type == RenderInfoType.Int32)
                        {
                            int[] data = new int[text.Length];
                            for (int i = 0; i < values.Length; i++)
                            {
                                data[i] = int.Parse(values[i]);
                            }
                            renderInfo.SetValue(data);
                        }
                        else if (renderInfo.Type == RenderInfoType.Single)
                        {
                            float[] data = new float[text.Length];
                            for (int i = 0; i < values.Length; i++)
                            {
                                data[i] = float.Parse(values[i]);
                            }
                            renderInfo.SetValue(data);
                        }
                        else
                        {
                            string[] data = new string[text.Length];
                            for (int i = 0; i < values.Length; i++)
                            {
                                data[i] = values[i];
                            }
                            renderInfo.SetValue(data);
                        }
                    }
                    catch
                    {
                        canParse = false;
                    }
                }

                ImGui.SetCursorPos(new System.Numerics.Vector2(windowSize.X - 110, windowSize.Y - 28));
                if (ImGui.Button("Cancel"))
                {
                    Revert(renderInfo);
                    dialogOpen = false;
                    ImGui.CloseCurrentPopup();
                }
                ImGui.SameLine();
                if (ImGui.Button("Ok"))
                {
                    if (canParse)
                    {
                        onDialogClosed?.Invoke(this, EventArgs.Empty);
                        dialogOpen = false;
                        ImGui.CloseCurrentPopup();
                    }
                }
                ImGui.EndPopup();
            }
        }