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); } }
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); }
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(); } }