private void InitializeShaderOptionList(BFRES.MaterialData mat) { foreach (var op in mat.shaderassign.options) { dataGridView3.Rows.Add(op.Key, op.Value); } }
private void RenderTexture(BFRES.Mesh m = null, BRTI tex = null, FTEX ftex = null) { Texture = tex; FTEXTexture = ftex; mesh = m; mat = mesh.material; foreach (BFRES.MatTexture te in mat.textures) { if (tex != null) { if (te.Name == tex.Text) { Mattex = te; comboBox1.SelectedIndex = te.wrapModeS; comboBox2.SelectedIndex = te.wrapModeT; } } if (ftex != null) { if (te.Name == ftex.Text) { Mattex = te; comboBox1.SelectedIndex = te.wrapModeS; comboBox2.SelectedIndex = te.wrapModeT; } } } }
public void LoadMaterial(BFRES.Mesh p) { listView1.Items.Clear(); dataGridView3.Rows.Clear(); dataGridView4.Rows.Clear(); textureImageList.ColorDepth = ColorDepth.Depth32Bit; textureImageList.ImageSize = new Size(64, 64); poly = p; mat = p.material; FillForm(); textBox1.Text = mat.Name; ShaderArchivelabel1.Text = $"Shader Archive {mat.shaderassign.ShaderArchive}"; ShaderMdllabel2.Text = $"Shader Model {mat.shaderassign.ShaderModel}"; paramColorList.ImageSize = new Size(10, 10); listView1.SmallImageList = paramColorList; listView1.FullRowSelect = true; TextureRefListView.SmallImageList = textureImageList; TextureRefListView.FullRowSelect = true; }
private void InitializeRenderInfoList(BFRES.MaterialData mat) { foreach (var rnd in mat.renderinfo) { string value = ""; if (rnd.Type == RenderInfoType.Int32) { foreach (int item in rnd.Value_Ints) { value += $" {item}"; } dataGridView4.Rows.Add(rnd.Name, value, "Int"); } if (rnd.Type == RenderInfoType.Single) { foreach (float item in rnd.Value_Floats) { value += $" {item}"; } dataGridView4.Rows.Add(rnd.Name, value, "Float"); } if (rnd.Type == RenderInfoType.String) { foreach (string item in rnd.Value_Strings) { value += $" {item}"; } dataGridView4.Rows.Add(rnd.Name, value, "String"); } } }
public static byte[] WriteShaderParams(this BFRES.MaterialData m) { using (var mem = new MemoryStream()) using (Syroot.BinaryData.BinaryDataWriter writer = new Syroot.BinaryData.BinaryDataWriter(mem)) { writer.ByteOrder = Syroot.BinaryData.ByteOrder.LittleEndian; foreach (var prm in m.matparam.Values) { switch (prm.Type) { case Syroot.NintenTools.Bfres.ShaderParamType.Float: writer.Write(prm.Value_float); break; case Syroot.NintenTools.Bfres.ShaderParamType.Float2: writer.Write(prm.Value_float2.X); writer.Write(prm.Value_float2.Y); break; case Syroot.NintenTools.Bfres.ShaderParamType.Float3: writer.Write(prm.Value_float3.X); writer.Write(prm.Value_float3.Y); writer.Write(prm.Value_float3.Z); break; case Syroot.NintenTools.Bfres.ShaderParamType.Float4: writer.Write(prm.Value_float4.X); writer.Write(prm.Value_float4.Y); writer.Write(prm.Value_float4.Z); writer.Write(prm.Value_float4.W); break; case Syroot.NintenTools.Bfres.ShaderParamType.TexSrt: writer.Write(prm.Value_TexSrt.Mode); writer.Write(prm.Value_TexSrt.scale.X); writer.Write(prm.Value_TexSrt.scale.Y); writer.Write(prm.Value_TexSrt.rotate); writer.Write(prm.Value_TexSrt.translate.X); writer.Write(prm.Value_TexSrt.translate.Y); break; case Syroot.NintenTools.Bfres.ShaderParamType.Float4x4: foreach (float f in prm.Value_float4x4) { writer.Write(f); } break; case Syroot.NintenTools.Bfres.ShaderParamType.UInt: writer.Write(prm.Value_UInt); break; default: writer.Write(prm.UnkownTypeData); break; } } return(mem.ToArray()); } }
private void InitializeTextureListView(BFRES.MaterialData mat) { // Shaders weren't initialized. if (OpenTkSharedResources.SetupStatus != OpenTkSharedResources.SharedResourceStatus.Initialized) { return; } int curTex = 0; TextureRefListView.Items.Clear(); textureImageList.Images.Clear(); foreach (var texure in mat.textures) { TextureRefListView.Items.Add(texure.Name); } if (BFRES.IsSwitchBFRES == true) { foreach (BNTX bntx in Runtime.bntxList) { foreach (ListViewItem texure in TextureRefListView.Items) { if (bntx.glTexByName.ContainsKey(texure.Text)) { Bitmap bitmap = TextureToBitmap.RenderBitmapUseExistingContext((SFGraphics.GLObjects.Textures.Texture2D)bntx.glTexByName[texure.Text], 64, 64); textureImageList.Images.Add(texure.Text, bitmap); texure.ImageIndex = curTex++; var dummy = textureImageList.Handle; bitmap.Dispose(); } } } } else { foreach (FTEXContainer ftexC in Runtime.ftexContainerList) { foreach (ListViewItem texure in TextureRefListView.Items) { if (ftexC.glTexByName.ContainsKey(texure.Text)) { Bitmap bitmap = TextureToBitmap.RenderBitmapUseExistingContext((SFGraphics.GLObjects.Textures.Texture2D)ftexC.glTexByName[texure.Text], 64, 64); textureImageList.Images.Add(texure.Text, bitmap); texure.ImageIndex = curTex++; var dummy = textureImageList.Handle; bitmap.Dispose(); } } } } }
public void FillForm() { BFRES.MaterialData material = mat; InitializeTextureListView(material); InitializeParamListView(material); InitializeShaderOptionList(material); InitializeRenderInfoList(material); }
public BFRES_MaterialEditor(BFRES.Mesh p) { InitializeComponent(); this.poly = p; Console.WriteLine("Material Editor"); Console.WriteLine(p.Text); mat = p.material; textBox1.Text = mat.Name; }
public static void SetSwitchMaterial(this BFRES.MaterialData mat, Material m) { //Now use that to setup the new values mat.IsVisable = (int)m.Flags; mat.Name = m.Name; int CurTex = 0; foreach (TextureRef texture in m.TextureRefs) { BFRES.MatTexture tex = new BFRES.MatTexture(); texture.Name = texture.Name; mat.textures.Add(tex); tex.BorderColorType = m.Samplers[CurTex].BorderColorType; tex.CompareFunc = m.Samplers[CurTex].CompareFunc; tex.FilterMode = m.Samplers[CurTex].FilterMode; tex.LODBias = m.Samplers[CurTex].LODBias; tex.MaxAnisotropic = m.Samplers[CurTex].MaxAnisotropic; tex.magFilter = (int)m.Samplers[CurTex].MaxLOD; tex.minFilter = (int)m.Samplers[CurTex].MinLOD; tex.wrapModeS = (int)m.Samplers[CurTex].WrapModeU; tex.wrapModeT = (int)m.Samplers[CurTex].WrapModeV; tex.wrapModeW = (int)m.Samplers[CurTex].WrapModeW; tex.SamplerName = m.SamplerDict.GetKey(CurTex); CurTex++; } foreach (RenderInfo renderinfo in m.RenderInfos) { BFRES.RenderInfoData rnd = new BFRES.RenderInfoData(); rnd.Name = renderinfo.Name; if (renderinfo.Type == RenderInfoType.Int32) { rnd.Value_Ints = renderinfo.GetValueInt32s(); } if (renderinfo.Type == RenderInfoType.Single) { rnd.Value_Floats = renderinfo.GetValueSingles(); } if (renderinfo.Type == RenderInfoType.String) { rnd.Value_Strings = renderinfo.GetValueStrings(); } } }
private void InitializeRenderInfoList(BFRES.MaterialData mat) { foreach (var rnd in mat.renderinfo) { if (rnd.Type == RenderInfoType.Int32) { dataGridView4.Rows.Add(rnd.Name, rnd.Value_Int.ToString(), "Int"); } if (rnd.Type == RenderInfoType.Single) { dataGridView4.Rows.Add(rnd.Name, rnd.Value_Float.ToString(), "Float"); } if (rnd.Type == RenderInfoType.String) { dataGridView4.Rows.Add(rnd.Name, rnd.Value_String.ToString(), "String"); } } }
private void RenderTexture(BFRES.Mesh m, Texture texture, string texName) { this.texture = texture; mesh = m; mat = mesh.material; foreach (BFRES.MatTexture te in mat.textures) { if (this.texture != null) { if (te.Name == texName) { mattex = te; comboBox1.SelectedIndex = te.wrapModeS; comboBox2.SelectedIndex = te.wrapModeT; } } } }
private void InitializeParamListView(BFRES.MaterialData mat) { int curParam = 0; foreach (var prm in mat.matparam) { string displayValue = ""; // listBox2.Items.Add(prm); var item = new ListViewItem(prm.Key); Color setColor = Color.White; if (prm.Value.Type == ShaderParamType.Float) { displayValue = mat.matparam[prm.Key].Value_float.ToString(); } if (prm.Value.Type == ShaderParamType.Float2) { displayValue = mat.matparam[prm.Key].Value_float2.ToString(); } if (prm.Value.Type == ShaderParamType.Float3) { displayValue = mat.matparam[prm.Key].Value_float3.ToString(); bool isColor = prm.Key.Contains("Color") || prm.Key.Contains("color"); if (isColor) { Vector3 col = mat.matparam[prm.Key].Value_float3; float someIntX = col.X; float someIntY = col.Y; float someIntZ = col.Z; someIntX = (float)Math.Pow(someIntX, 2.2f); someIntY = (float)Math.Pow(someIntY, 2.2f); someIntZ = (float)Math.Pow(someIntZ, 2.2f); if (someIntX <= 1 && someIntY <= 1 && someIntZ <= 1) { setColor = Color.FromArgb( 255, (int)Math.Ceiling(someIntX * 255.0f), (int)Math.Ceiling(someIntY * 255.0f), (int)Math.Ceiling(someIntZ * 255.0f) ); } } } if (prm.Value.Type == ShaderParamType.Float4) { displayValue = mat.matparam[prm.Key].Value_float4.ToString(); bool isColor = prm.Key.Contains("Color") || prm.Key.Contains("color") || prm.Key.Contains("konst0"); if (isColor) { Vector4 col = mat.matparam[prm.Key].Value_float4; float someIntX = col.X; float someIntY = col.Y; float someIntZ = col.Z; someIntX = (float)Math.Pow(someIntX, 2.2f); someIntY = (float)Math.Pow(someIntY, 2.2f); someIntZ = (float)Math.Pow(someIntZ, 2.2f); System.Diagnostics.Debug.WriteLine($"{prm.Key} R {someIntX} G {someIntY} B {someIntZ}"); if (someIntX <= 1 && someIntY <= 1 && someIntZ <= 1) { setColor = Color.FromArgb( 255, (int)Math.Ceiling(someIntX * 255.0f), (int)Math.Ceiling(someIntY * 255.0f), (int)Math.Ceiling(someIntZ * 255.0f) ); } } } item.UseItemStyleForSubItems = false; item.SubItems.Add(displayValue); item.SubItems.Add(""); item.SubItems[2].BackColor = setColor; listView1.View = View.Details; listView1.Items.Add(item); curParam++; } }
private static void BFRES_DrawUVTriangleAndGrid(Vector2 v1, Vector2 v2, Vector2 v3, int divisionsX, int divisionsY, Color uvColor, float lineWidth, Color gridColor, BFRES.MaterialData mat) { // No shaders GL.UseProgram(0); float bounds = 1; Vector2 scaleUv = new Vector2(1, 1); Vector2 transUv = new Vector2(0, 0); if (Runtime.uvChannel == Runtime.UVChannel.Channel2) { if (mat.matparam.ContainsKey("gsys_bake_st0")) { scaleUv = mat.matparam["gsys_bake_st0"].Value_float4.Xy; transUv = mat.matparam["gsys_bake_st0"].Value_float4.Zw; } } SetupUvRendering(lineWidth); BFRES_DrawUvTriangle(v1, v2, v3, uvColor, scaleUv, transUv); // Draw Grid GL.Color3(gridColor); DrawHorizontalGrid(divisionsX, bounds, scaleUv); DrawVerticalGrid(divisionsY, bounds, scaleUv); }
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 LoadMaterial(BFRES.Mesh p) { listView1.Items.Clear(); dataGridView3.Rows.Clear(); dataGridView4.Rows.Clear(); tabTextureMaps.Controls.Clear(); TexPanelHeight = 31; poly = p; Console.WriteLine("Material Editor"); Console.WriteLine(p.Text); mat = p.material; textBox1.Text = mat.Name; ShaderArchivelabel1.Text += $" {mat.shaderassign.ShaderArchive}"; ShaderMdllabel2.Text += $" {mat.shaderassign.ShaderModel}"; int CurParam = 0; foreach (var prm in mat.matparam) { string DisplayValue = ""; // listBox2.Items.Add(prm); var item = new ListViewItem(prm.Key); Color SetColor = Color.White; if (prm.Value.Type == ShaderParamType.Float) { DisplayValue = mat.matparam[prm.Key].Value_float.ToString(); } if (prm.Value.Type == ShaderParamType.Float2) { DisplayValue = mat.matparam[prm.Key].Value_float2.ToString(); } if (prm.Value.Type == ShaderParamType.Float3) { DisplayValue = mat.matparam[prm.Key].Value_float3.ToString(); bool IsColor = prm.Key.Contains("Color") || prm.Key.Contains("color"); if (IsColor) { int someIntX = (int)Math.Ceiling(mat.matparam[prm.Key].Value_float3.X * 255); int someIntY = (int)Math.Ceiling(mat.matparam[prm.Key].Value_float3.Y * 255); int someIntZ = (int)Math.Ceiling(mat.matparam[prm.Key].Value_float3.Z * 255); if (someIntX <= 255 && someIntY <= 255 && someIntZ <= 255) { Console.WriteLine($"{prm.Key} R {someIntX} G {someIntY} B {someIntZ}"); SetColor = Color.FromArgb( 255, someIntX, someIntY, someIntZ ); } } } if (prm.Value.Type == ShaderParamType.Float4) { DisplayValue = mat.matparam[prm.Key].Value_float4.ToString(); bool IsColor = prm.Key.Contains("Color") || prm.Key.Contains("color") || prm.Key.Contains("konst0"); if (IsColor) { Vector4 col = mat.matparam[prm.Key].Value_float4; int someIntX = (int)Math.Ceiling(col.X); int someIntY = (int)Math.Ceiling(col.Y); int someIntZ = (int)Math.Ceiling(col.Z); if (mat.shaderassign.ShaderArchive == "uking_mat") //BOTW uses gamma correction { someIntX = MathHelper.Clamp((int)((255.0 * System.Math.Pow(255.0, 1.0 / mat.matparam[prm.Key].Value_float4.X)) + 0.5), 255, 0); someIntY = MathHelper.Clamp((int)((255.0 * System.Math.Pow(255.0, 1.0 / mat.matparam[prm.Key].Value_float4.Y)) + 0.5), 255, 0); someIntZ = MathHelper.Clamp((int)((255.0 * System.Math.Pow(255.0, 1.0 / mat.matparam[prm.Key].Value_float4.Z)) + 0.5), 255, 0); } if (someIntX <= 255 && someIntY <= 255 && someIntZ <= 255) { Console.WriteLine($"{prm.Key} R {someIntX} G {someIntY} B {someIntZ}"); SetColor = Color.FromArgb( 255, someIntX, someIntY, someIntZ ); } } } item.UseItemStyleForSubItems = false; item.SubItems.Add(DisplayValue); item.SubItems.Add(""); item.SubItems[2].BackColor = SetColor; listView1.View = View.Details; listView1.Items.Add(item); CurParam++; } il.ImageSize = new Size(10, 10); listView1.SmallImageList = il; listView1.FullRowSelect = true; foreach (var rnd in mat.renderinfo) { if (rnd.Type == RenderInfoType.Int32) { dataGridView4.Rows.Add(rnd.Name, rnd.Value_Int.ToString(), "Int"); } if (rnd.Type == RenderInfoType.Single) { dataGridView4.Rows.Add(rnd.Name, rnd.Value_Float.ToString(), "Float"); } if (rnd.Type == RenderInfoType.String) { dataGridView4.Rows.Add(rnd.Name, rnd.Value_String.ToString(), "String"); } } foreach (var op in mat.shaderassign.options) { dataGridView3.Rows.Add(op.Key, op.Value); } Panel[] arr = new Panel[mat.textures.Count]; Button[] Btnarr = new Button[mat.textures.Count]; picboxArray = new PictureBox[mat.textures.Count]; if (BFRES.IsSwitchBFRES == true) { foreach (BRTI tex in BNTX.textures) { foreach (var texure in mat.textures) { if (tex.Text == texure.Name) { Bitmap bmp = textureRGBA(tex.texture, tex.display); SetTexturePanel(bmp, texure); } } } } else { foreach (var texure in mat.textures) { if (BFRES.FTEXtextures.ContainsKey(texure.Name)) { Bitmap bmp = FTEXRGBA(BFRES.FTEXtextures[texure.Name].texture, BFRES.FTEXtextures[texure.Name].texture.display); SetTexturePanel(bmp, texure); } } } }