Improve load times significantly for layout files.

Shaders are now compiled only once and load statically instead of being per material.
This commit is contained in:
KillzXGaming 2019-10-20 19:30:58 -04:00
parent 0da677980f
commit a8016a2868
12 changed files with 204 additions and 196 deletions

View file

@ -22,7 +22,7 @@ namespace LayoutBXLYT
public void LoadShaders() public void LoadShaders()
{ {
program = CompileShaders(); Compile();
} }
public void Enable() public void Enable()

View file

@ -73,14 +73,9 @@ namespace LayoutBXLYT
}; };
var mat = pic1Pane.Material as BFLYT.Material; var mat = pic1Pane.Material as BFLYT.Material;
if (mat.Shader == null)
{
mat.Shader = new BflytShader(mat);
mat.Shader.Compile();
}
mat.Shader.Enable(); ShaderLoader.CafeShader.Enable();
((BflytShader)mat.Shader).SetMaterials(pic1Pane,Textures); BflytShader.SetMaterials(ShaderLoader.CafeShader, mat, pane, Textures);
if (pic1Pane.TexCoords.Length > 0) if (pic1Pane.TexCoords.Length > 0)
{ {
@ -94,7 +89,7 @@ namespace LayoutBXLYT
DrawRectangle(pane, gameWindow, pane.Rectangle, TexCoords, Colors, false, effectiveAlpha, isSelected); DrawRectangle(pane, gameWindow, pane.Rectangle, TexCoords, Colors, false, effectiveAlpha, isSelected);
mat.Shader.Disable(); ShaderLoader.CafeShader.Disable();
} }
else if (pane is BCLYT.PIC1) else if (pane is BCLYT.PIC1)
{ {
@ -108,14 +103,9 @@ namespace LayoutBXLYT
}; };
var mat = pic1Pane.Material as BCLYT.Material; var mat = pic1Pane.Material as BCLYT.Material;
if (mat.Shader == null)
{
mat.Shader = new BclytShader(mat);
mat.Shader.Compile();
}
mat.Shader.Enable(); ShaderLoader.CtrShader.Enable();
((BclytShader)mat.Shader).SetMaterials(pane,Textures); BclytShader.SetMaterials(ShaderLoader.CtrShader, (BCLYT.Material)mat, pane, Textures);
if (pic1Pane.TexCoords.Length > 0) if (pic1Pane.TexCoords.Length > 0)
{ {
@ -129,7 +119,7 @@ namespace LayoutBXLYT
DrawRectangle(pane, gameWindow, pane.Rectangle, TexCoords, Colors, false, effectiveAlpha, isSelected); DrawRectangle(pane, gameWindow, pane.Rectangle, TexCoords, Colors, false, effectiveAlpha, isSelected);
mat.Shader.Disable(); ShaderLoader.CtrShader.Disable();
} }
else if (pane is BRLYT.PIC1) else if (pane is BRLYT.PIC1)
{ {
@ -143,14 +133,9 @@ namespace LayoutBXLYT
}; };
var mat = pic1Pane.Material as BRLYT.Material; var mat = pic1Pane.Material as BRLYT.Material;
if (mat.Shader == null)
{
mat.Shader = new BrlytShader(mat);
mat.Shader.Compile();
}
mat.Shader.Enable(); ShaderLoader.RevShader.Enable();
((BrlytShader)mat.Shader).SetMaterials(pane, Textures); BrlytShader.SetMaterials(ShaderLoader.RevShader, (BRLYT.Material)mat, pane, Textures);
if (pic1Pane.TexCoords.Length > 0) if (pic1Pane.TexCoords.Length > 0)
{ {
@ -164,7 +149,7 @@ namespace LayoutBXLYT
DrawRectangle(pane, gameWindow, pane.Rectangle, TexCoords, Colors, false, effectiveAlpha, isSelected); DrawRectangle(pane, gameWindow, pane.Rectangle, TexCoords, Colors, false, effectiveAlpha, isSelected);
mat.Shader.Disable(); ShaderLoader.RevShader.Disable();
} }
GL.Disable(EnableCap.Texture2D); GL.Disable(EnableCap.Texture2D);
@ -270,19 +255,16 @@ namespace LayoutBXLYT
BindFontBitmap(pane, fontBitmap); BindFontBitmap(pane, fontBitmap);
var mat = textBox.Material as BFLYT.Material; var mat = textBox.Material as BFLYT.Material;
if (mat.Shader == null)
{
mat.Shader = new BflytShader(mat);
mat.Shader.Compile();
}
mat.Shader.Enable(); BxlytShader shader = ShaderLoader.CafeShader;
((BflytShader)mat.Shader).SetMaterials(pane, Textures);
ShaderLoader.CafeShader.Enable();
BflytShader.SetMaterials(ShaderLoader.CafeShader, mat, pane, Textures);
GL.ActiveTexture(TextureUnit.Texture0 + 1); GL.ActiveTexture(TextureUnit.Texture0 + 1);
mat.Shader.SetInt($"numTextureMaps", 1); shader.SetInt($"numTextureMaps", 1);
mat.Shader.SetInt($"textures0", 1); shader.SetInt($"textures0", 1);
mat.Shader.SetInt($"hasTexture0", 1); shader.SetInt($"hasTexture0", 1);
GL.BindTexture(TextureTarget.Texture2D, textBox.RenderableFont.TexID); GL.BindTexture(TextureTarget.Texture2D, textBox.RenderableFont.TexID);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleR, ConvertChannel(STChannelType.Red)); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleR, ConvertChannel(STChannelType.Red));
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleG, ConvertChannel(STChannelType.Green)); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleG, ConvertChannel(STChannelType.Green));
@ -309,7 +291,7 @@ namespace LayoutBXLYT
DrawRectangle(pane, gameWindow, pane.Rectangle, texCoords, Colors, false, effectiveAlpha, isSelected); DrawRectangle(pane, gameWindow, pane.Rectangle, texCoords, Colors, false, effectiveAlpha, isSelected);
// mat.Shader.Disable(); ShaderLoader.CafeShader.Disable();
GL.Disable(EnableCap.Texture2D); GL.Disable(EnableCap.Texture2D);
GL.BindTexture(TextureTarget.Texture2D, 0); GL.BindTexture(TextureTarget.Texture2D, 0);
@ -422,6 +404,14 @@ namespace LayoutBXLYT
if (!Runtime.LayoutEditor.DisplayWindowPane) if (!Runtime.LayoutEditor.DisplayWindowPane)
return; return;
BxlytShader shader = null;
if (pane is BFLYT.PAN1)
shader = ShaderLoader.CafeShader;
if (pane is BCLYT.PAN1)
shader = ShaderLoader.CtrShader;
if (pane is BRLYT.PAN1)
shader = ShaderLoader.RevShader;
var window = (IWindowPane)pane; var window = (IWindowPane)pane;
float dX = DrawnVertexX(pane.Width, pane.originX); float dX = DrawnVertexX(pane.Width, pane.originX);
@ -531,7 +521,8 @@ namespace LayoutBXLYT
var windowFrame = window.WindowFrames[0]; var windowFrame = window.WindowFrames[0];
SetupShaders(pane, windowFrame.Material, Textures); SetupShaders(pane, windowFrame.Material, Textures);
windowFrame.Material.Shader.SetInt("flipTexture", (int)window.WindowFrames[0].TextureFlip);
shader.SetInt("flipTexture", (int)window.WindowFrames[0].TextureFlip);
hasTextures = windowFrame.Material.TextureMaps?.Length > 0; hasTextures = windowFrame.Material.TextureMaps?.Length > 0;
@ -734,7 +725,7 @@ namespace LayoutBXLYT
{ {
SetupShaders(pane, matTL, Textures); SetupShaders(pane, matTL, Textures);
matTL.Shader.SetInt("flipTexture", (int)window.WindowFrames[0].TextureFlip); shader.SetInt("flipTexture", (int)window.WindowFrames[0].TextureFlip);
float pieceWidth = pane.Width - frameRight; float pieceWidth = pane.Width - frameRight;
float pieceHeight = frameTop; float pieceHeight = frameTop;
@ -753,7 +744,7 @@ namespace LayoutBXLYT
{ {
SetupShaders(pane, matTR, Textures); SetupShaders(pane, matTR, Textures);
matTR.Shader.SetInt("flipTexture", (int)window.WindowFrames[1].TextureFlip); shader.SetInt("flipTexture", (int)window.WindowFrames[1].TextureFlip);
float pieceWidth = frameRight; float pieceWidth = frameRight;
float pieceHeight = pane.Height - frameBottom; float pieceHeight = pane.Height - frameBottom;
@ -772,7 +763,7 @@ namespace LayoutBXLYT
{ {
SetupShaders(pane, matBL, Textures); SetupShaders(pane, matBL, Textures);
matBL.Shader.SetInt("flipTexture", (int)window.WindowFrames[2].TextureFlip); shader.SetInt("flipTexture", (int)window.WindowFrames[2].TextureFlip);
float pieceWidth = frameLeft; float pieceWidth = frameLeft;
float pieceHeight = pane.Height - frameTop; float pieceHeight = pane.Height - frameTop;
@ -791,7 +782,7 @@ namespace LayoutBXLYT
{ {
SetupShaders(pane, matBR, Textures); SetupShaders(pane, matBR, Textures);
matBR.Shader.SetInt("flipTexture", (int)window.WindowFrames[3].TextureFlip); shader.SetInt("flipTexture", (int)window.WindowFrames[3].TextureFlip);
float pieceWidth = pane.Width - frameLeft; float pieceWidth = pane.Width - frameLeft;
float pieceHeight = frameBottom; float pieceHeight = frameBottom;
@ -835,7 +826,7 @@ namespace LayoutBXLYT
if (matTL.TextureMaps.Length > 0) if (matTL.TextureMaps.Length > 0)
{ {
SetupShaders(pane, matTL, Textures); SetupShaders(pane, matTL, Textures);
matTL.Shader.SetInt("flipTexture", (int)window.WindowFrames[0].TextureFlip); shader.SetInt("flipTexture", (int)window.WindowFrames[0].TextureFlip);
texCoords = new Vector2[] texCoords = new Vector2[]
{ {
@ -851,7 +842,7 @@ namespace LayoutBXLYT
if (matTR.TextureMaps.Length > 0) if (matTR.TextureMaps.Length > 0)
{ {
SetupShaders(pane, matTR, Textures); SetupShaders(pane, matTR, Textures);
matTR.Shader.SetInt("flipTexture", (int)window.WindowFrames[1].TextureFlip); shader.SetInt("flipTexture", (int)window.WindowFrames[1].TextureFlip);
texCoords = new Vector2[] texCoords = new Vector2[]
{ {
@ -867,7 +858,7 @@ namespace LayoutBXLYT
if (matBL.TextureMaps.Length > 0) if (matBL.TextureMaps.Length > 0)
{ {
SetupShaders(pane, matBL, Textures); SetupShaders(pane, matBL, Textures);
matBL.Shader.SetInt("flipTexture", (int)window.WindowFrames[2].TextureFlip); shader.SetInt("flipTexture", (int)window.WindowFrames[2].TextureFlip);
texCoords = new Vector2[] texCoords = new Vector2[]
{ {
@ -883,7 +874,7 @@ namespace LayoutBXLYT
if (matBR.TextureMaps.Length > 0) if (matBR.TextureMaps.Length > 0)
{ {
SetupShaders(pane, matBR, Textures); SetupShaders(pane, matBR, Textures);
matBR.Shader.SetInt("flipTexture", (int)window.WindowFrames[3].TextureFlip); shader.SetInt("flipTexture", (int)window.WindowFrames[3].TextureFlip);
texCoords = new Vector2[] texCoords = new Vector2[]
{ {
@ -899,7 +890,7 @@ namespace LayoutBXLYT
if (matT.TextureMaps.Length > 0) if (matT.TextureMaps.Length > 0)
{ {
SetupShaders(pane, matT, Textures); SetupShaders(pane, matT, Textures);
matT.Shader.SetInt("flipTexture", (int)window.WindowFrames[4].TextureFlip); shader.SetInt("flipTexture", (int)window.WindowFrames[4].TextureFlip);
texCoords = new Vector2[] texCoords = new Vector2[]
{ {
@ -915,7 +906,7 @@ namespace LayoutBXLYT
if (matB.TextureMaps.Length > 0) if (matB.TextureMaps.Length > 0)
{ {
SetupShaders(pane, matB, Textures); SetupShaders(pane, matB, Textures);
matB.Shader.SetInt("flipTexture", (int)window.WindowFrames[5].TextureFlip); shader.SetInt("flipTexture", (int)window.WindowFrames[5].TextureFlip);
texCoords = new Vector2[] texCoords = new Vector2[]
{ {
@ -931,7 +922,7 @@ namespace LayoutBXLYT
if (matL.TextureMaps.Length > 0) if (matL.TextureMaps.Length > 0)
{ {
SetupShaders(pane, matL, Textures); SetupShaders(pane, matL, Textures);
matL.Shader.SetInt("flipTexture", (int)window.WindowFrames[6].TextureFlip); shader.SetInt("flipTexture", (int)window.WindowFrames[6].TextureFlip);
texCoords = new Vector2[] texCoords = new Vector2[]
{ {
@ -947,7 +938,7 @@ namespace LayoutBXLYT
if (matR.TextureMaps.Length > 0) if (matR.TextureMaps.Length > 0)
{ {
SetupShaders(pane, matR, Textures); SetupShaders(pane, matR, Textures);
matR.Shader.SetInt("flipTexture", (int)window.WindowFrames[7].TextureFlip); shader.SetInt("flipTexture", (int)window.WindowFrames[7].TextureFlip);
texCoords = new Vector2[] texCoords = new Vector2[]
{ {
@ -1082,32 +1073,21 @@ namespace LayoutBXLYT
private static void SetupShaders(BasePane pane, BxlytMaterial mat, Dictionary<string, STGenericTexture> textures) private static void SetupShaders(BasePane pane, BxlytMaterial mat, Dictionary<string, STGenericTexture> textures)
{ {
if (mat.Shader == null)
{
if (mat is Cafe.BFLYT.Material)
{
mat.Shader = new BflytShader((Cafe.BFLYT.Material)mat);
mat.Shader.Compile();
}
else if (mat is BRLYT.Material)
{
mat.Shader = new BrlytShader((BRLYT.Material)mat);
mat.Shader.Compile();
}
else if (mat is BCLYT.Material)
{
mat.Shader = new BclytShader((BCLYT.Material)mat);
mat.Shader.Compile();
}
}
mat.Shader.Enable();
if (mat is Cafe.BFLYT.Material) if (mat is Cafe.BFLYT.Material)
((BflytShader)mat.Shader).SetMaterials(pane, textures); {
ShaderLoader.CafeShader.Enable();
BflytShader.SetMaterials(ShaderLoader.CafeShader, (Cafe.BFLYT.Material)mat, pane, textures);
}
else if (mat is BRLYT.Material) else if (mat is BRLYT.Material)
((BrlytShader)mat.Shader).SetMaterials(pane, textures); {
ShaderLoader.RevShader.Enable();
BrlytShader.SetMaterials(ShaderLoader.RevShader, (BRLYT.Material)mat, pane, textures);
}
else if (mat is BCLYT.Material) else if (mat is BCLYT.Material)
((BclytShader)mat.Shader).SetMaterials(pane, textures); {
ShaderLoader.CtrShader.Enable();
BclytShader.SetMaterials(ShaderLoader.CtrShader, (BCLYT.Material)mat, pane, textures);
}
} }
private static void RenderWindowContent(BasePane pane, uint sizeX, uint sizeY, BxlytWindowContent content, private static void RenderWindowContent(BasePane pane, uint sizeX, uint sizeY, BxlytWindowContent content,

View file

@ -1631,12 +1631,14 @@ namespace LayoutBXLYT.Cafe
if (ExternalLayout == null) if (ExternalLayout == null)
return; return;
var textureList = ExternalLayout.GetTextures(); ExternalLayout.header.TextureManager = layoutFile.TextureManager;
foreach (var tex in textureList)
if (!textures.ContainsKey(tex.Key))
textures.Add(tex.Key, tex.Value);
textureList.Clear(); /* var textureList = ExternalLayout.GetTextures();
foreach (var tex in textureList)
if (!textures.ContainsKey(tex.Key))
textures.Add(tex.Key, tex.Value);
textureList.Clear();*/
} }
} }

View file

@ -12,11 +12,7 @@ namespace LayoutBXLYT
{ {
public class BflytShader : BxlytShader public class BflytShader : BxlytShader
{ {
public BFLYT.Material material; public BflytShader() : base() {
public BflytShader(BFLYT.Material mat) : base()
{
material = mat;
LoadShaders(); LoadShaders();
} }
@ -45,10 +41,10 @@ namespace LayoutBXLYT
SetInt($"texCoords0Source", 0); SetInt($"texCoords0Source", 0);
} }
public void SetMaterials(BasePane pane, Dictionary<string, STGenericTexture> textures) public static void SetMaterials(BxlytShader shader, BFLYT.Material material, BasePane pane, Dictionary<string, STGenericTexture> textures)
{ {
var rotationMatrix = pane.GetRotationMatrix(); var rotationMatrix = pane.GetRotationMatrix();
SetMatrix("rotationMatrix", ref rotationMatrix); shader.SetMatrix("rotationMatrix", ref rotationMatrix);
STColor8 WhiteColor = material.WhiteColor; STColor8 WhiteColor = material.WhiteColor;
STColor8 BlackColor = material.BlackColor; STColor8 BlackColor = material.BlackColor;
@ -76,29 +72,29 @@ namespace LayoutBXLYT
} }
} }
SetColor("whiteColor", WhiteColor.Color); shader.SetColor("whiteColor", WhiteColor.Color);
SetColor("blackColor", BlackColor.Color); shader.SetColor("blackColor", BlackColor.Color);
SetInt("debugShading", (int)Runtime.LayoutEditor.Shading); shader.SetInt("debugShading", (int)Runtime.LayoutEditor.Shading);
SetInt("numTextureMaps", material.TextureMaps.Length); shader.SetInt("numTextureMaps", material.TextureMaps.Length);
SetVec2("uvScale0", new Vector2(1, 1)); shader.SetVec2("uvScale0", new Vector2(1, 1));
SetFloat("uvRotate0", 0); shader.SetFloat("uvRotate0", 0);
SetVec2("uvTranslate0", new Vector2(0, 0)); shader.SetVec2("uvTranslate0", new Vector2(0, 0));
SetInt("flipTexture", 0); shader.SetInt("flipTexture", 0);
SetInt("numTevStages", material.TevStages.Length); shader.SetInt("numTevStages", material.TevStages.Length);
SetBool("ThresholdingAlphaInterpolation", material.ThresholdingAlphaInterpolation); shader.SetBool("ThresholdingAlphaInterpolation", material.ThresholdingAlphaInterpolation);
SetVec4("IndirectMat0", new Vector4(1, 1, 0, 0)); shader.SetVec4("IndirectMat0", new Vector4(1, 1, 0, 0));
SetVec4("IndirectMat1", new Vector4(1, 1, 0, 0)); shader.SetVec4("IndirectMat1", new Vector4(1, 1, 0, 0));
SetInt("tevTexMode", 0); shader.SetInt("tevTexMode", 0);
SetInt($"texCoords0GenType", 0); shader.SetInt($"texCoords0GenType", 0);
SetInt($"texCoords0Source", 0); shader.SetInt($"texCoords0Source", 0);
SetInt("hasTexture0", 0); shader.SetInt("hasTexture0", 0);
SetInt("hasTexture1", 0); shader.SetInt("hasTexture1", 0);
SetInt("hasTexture2", 0); shader.SetInt("hasTexture2", 0);
SetInt("textures0", 0); shader.SetInt("textures0", 0);
SetInt("textures1", 0); shader.SetInt("textures1", 0);
SetInt("textures2", 0); shader.SetInt("textures2", 0);
BindTextureUniforms(); BindTextureUniforms(shader, material);
if (material.TextureMaps.Length > 0 || Runtime.LayoutEditor.Shading == Runtime.LayoutEditor.DebugShading.UVTestPattern) if (material.TextureMaps.Length > 0 || Runtime.LayoutEditor.Shading == Runtime.LayoutEditor.DebugShading.UVTestPattern)
GL.Enable(EnableCap.Texture2D); GL.Enable(EnableCap.Texture2D);
@ -114,10 +110,10 @@ namespace LayoutBXLYT
if (textures.ContainsKey(TexName)) if (textures.ContainsKey(TexName))
{ {
GL.ActiveTexture(TextureUnit.Texture0 + id); GL.ActiveTexture(TextureUnit.Texture0 + id);
SetInt($"textures{i}", id); shader.SetInt($"textures{i}", id);
bool isBinded = BxlytToGL.BindGLTexture(material.TextureMaps[i], textures[TexName]); bool isBinded = BxlytToGL.BindGLTexture(material.TextureMaps[i], textures[TexName]);
if (isBinded) if (isBinded)
SetInt($"hasTexture{i}", 1); shader.SetInt($"hasTexture{i}", 1);
id++; id++;
} }
@ -125,14 +121,14 @@ namespace LayoutBXLYT
for (int i = 0; i < material.TexCoords?.Length; i++) for (int i = 0; i < material.TexCoords?.Length; i++)
{ {
SetInt($"texCoords{i}GenType", (int)material.TexCoords[i].GenType); shader.SetInt($"texCoords{i}GenType", (int)material.TexCoords[i].GenType);
SetInt($"texCoords{i}Source", (int)material.TexCoords[i].Source); shader.SetInt($"texCoords{i}Source", (int)material.TexCoords[i].Source);
} }
for (int i = 0; i < material.TevStages?.Length; i++) for (int i = 0; i < material.TevStages?.Length; i++)
{ {
SetInt($"tevStage{i}RGB", (int)material.TevStages[i].ColorMode); shader.SetInt($"tevStage{i}RGB", (int)material.TevStages[i].ColorMode);
SetInt($"tevStage{i}A", (int)material.TevStages[i].AlphaMode); shader.SetInt($"tevStage{i}A", (int)material.TevStages[i].AlphaMode);
} }
if (material.TextureTransforms.Length > 0) if (material.TextureTransforms.Length > 0)
@ -154,9 +150,9 @@ namespace LayoutBXLYT
} }
} }
SetVec2("uvScale0", new Vector2(scale.X, scale.Y)); shader.SetVec2("uvScale0", new Vector2(scale.X, scale.Y));
SetFloat("uvRotate0", rotate); shader.SetFloat("uvRotate0", rotate);
SetVec2("uvTranslate0", new Vector2(translate.X, translate.Y)); shader.SetVec2("uvTranslate0", new Vector2(translate.X, translate.Y));
} }
@ -202,11 +198,11 @@ namespace LayoutBXLYT
} }
} }
private void BindTextureUniforms() private static void BindTextureUniforms(BxlytShader shader, BxlytMaterial material)
{ {
//Do uv test pattern //Do uv test pattern
GL.ActiveTexture(TextureUnit.Texture10); GL.ActiveTexture(TextureUnit.Texture10);
GL.Uniform1(GL.GetUniformLocation(program, "uvTestPattern"), 10); GL.Uniform1(GL.GetUniformLocation(shader.program, "uvTestPattern"), 10);
GL.BindTexture(TextureTarget.Texture2D, RenderTools.uvTestPattern.RenderableTex.TexID); GL.BindTexture(TextureTarget.Texture2D, RenderTools.uvTestPattern.RenderableTex.TexID);
if (material.TextureMaps.Length > 0) if (material.TextureMaps.Length > 0)

View file

@ -892,9 +892,6 @@ namespace LayoutBXLYT
public STColor8 TevColor { get; set; } public STColor8 TevColor { get; set; }
public STColor8[] TevConstantColors { get; set; } public STColor8[] TevConstantColors { get; set; }
public List<TextureRef> TextureMaps { get; set; }
public List<TextureTransform> TextureTransforms { get; set; }
private uint flags; private uint flags;
private BCLYT.Header ParentLayout; private BCLYT.Header ParentLayout;
@ -908,17 +905,14 @@ namespace LayoutBXLYT
public Material() public Material()
{ {
TextureMaps = new List<TextureRef>(); TextureMaps = new TextureRef[0];
TextureTransforms = new List<TextureTransform>(); TextureTransforms = new TextureTransform[0];
} }
public Material(FileReader reader, Header header) : base() public Material(FileReader reader, Header header) : base()
{ {
ParentLayout = header; ParentLayout = header;
TextureMaps = new List<TextureRef>();
TextureTransforms = new List<TextureTransform>();
Name = reader.ReadString(20, true); Name = reader.ReadString(20, true);
TevColor = reader.ReadColor8RGBA(); TevColor = reader.ReadColor8RGBA();
TevConstantColors = reader.ReadColor8sRGBA(6); TevConstantColors = reader.ReadColor8sRGBA(6);
@ -929,11 +923,14 @@ namespace LayoutBXLYT
uint texCoordGens = (flags >> 4) & 3; uint texCoordGens = (flags >> 4) & 3;
uint tevStages = (flags >> 6) & 7; uint tevStages = (flags >> 6) & 7;
TextureMaps = new TextureRef[texCount];
TextureTransforms = new TextureTransform[mtxCount];
for (int i = 0; i < texCount; i++) for (int i = 0; i < texCount; i++)
TextureMaps.Add(new TextureRef(reader, header)); TextureMaps[i] = new TextureRef(reader, header);
for (int i = 0; i < mtxCount; i++) for (int i = 0; i < mtxCount; i++)
TextureTransforms.Add(new TextureTransform(reader)); TextureTransforms[i] = new TextureTransform(reader);
} }
public void Write(FileWriter writer, Header header) public void Write(FileWriter writer, Header header)
@ -943,20 +940,16 @@ namespace LayoutBXLYT
writer.Write(TevConstantColors); writer.Write(TevConstantColors);
writer.Write(flags); writer.Write(flags);
for (int i = 0; i < TextureMaps.Count; i++) for (int i = 0; i < TextureMaps.Length; i++)
TextureMaps[i].Write(writer); ((TextureRef)TextureMaps[i]).Write(writer);
for (int i = 0; i < TextureTransforms.Count; i++) for (int i = 0; i < TextureTransforms.Length; i++)
TextureTransforms[i].Write(writer); ((TextureTransform)TextureTransforms[i]).Write(writer);
} }
} }
public class TextureTransform public class TextureTransform : BxlytTextureTransform
{ {
public Vector2F Translate;
public float Rotate;
public Vector2F Scale;
public TextureTransform() { } public TextureTransform() { }
public TextureTransform(FileReader reader) public TextureTransform(FileReader reader)

View file

@ -11,11 +11,8 @@ namespace LayoutBXLYT
{ {
public class BclytShader : BxlytShader public class BclytShader : BxlytShader
{ {
public BCLYT.Material material; public BclytShader() : base()
public BclytShader(BCLYT.Material mat) : base()
{ {
material = mat;
LoadShaders(); LoadShaders();
} }
@ -42,59 +39,59 @@ namespace LayoutBXLYT
SetInt($"texCoords0Source", 0); SetInt($"texCoords0Source", 0);
} }
public void SetMaterials(BasePane pane, Dictionary<string, STGenericTexture> textures) public static void SetMaterials(BxlytShader shader, BCLYT.Material material, BasePane pane, Dictionary<string, STGenericTexture> textures)
{ {
Matrix4 rotationX = Matrix4.CreateRotationX(MathHelper.DegreesToRadians(pane.Rotate.X)); Matrix4 rotationX = Matrix4.CreateRotationX(MathHelper.DegreesToRadians(pane.Rotate.X));
Matrix4 rotationY = Matrix4.CreateRotationY(MathHelper.DegreesToRadians(pane.Rotate.Y)); Matrix4 rotationY = Matrix4.CreateRotationY(MathHelper.DegreesToRadians(pane.Rotate.Y));
Matrix4 rotationZ = Matrix4.CreateRotationZ(MathHelper.DegreesToRadians(pane.Rotate.Z)); Matrix4 rotationZ = Matrix4.CreateRotationZ(MathHelper.DegreesToRadians(pane.Rotate.Z));
var rotationMatrix = rotationX * rotationY * rotationZ; var rotationMatrix = rotationX * rotationY * rotationZ;
SetMatrix("rotationMatrix", ref rotationMatrix); shader.SetMatrix("rotationMatrix", ref rotationMatrix);
SetColor("whiteColor", material.TevConstantColors[0].Color); shader.SetColor("whiteColor", material.TevConstantColors[0].Color);
SetColor("blackColor", material.TevColor.Color); shader.SetColor("blackColor", material.TevColor.Color);
SetInt("debugShading", (int)Runtime.LayoutEditor.Shading); shader.SetInt("debugShading", (int)Runtime.LayoutEditor.Shading);
SetInt("numTextureMaps", material.TextureMaps.Count); shader.SetInt("numTextureMaps", material.TextureMaps.Length);
SetVec2("uvScale0", new Vector2(1, 1)); shader.SetVec2("uvScale0", new Vector2(1, 1));
SetFloat("uvRotate0", 0); shader.SetFloat("uvRotate0", 0);
SetVec2("uvTranslate0", new Vector2(0, 0)); shader.SetVec2("uvTranslate0", new Vector2(0, 0));
SetInt("flipTexture", 0); shader.SetInt("flipTexture", 0);
SetBool("ThresholdingAlphaInterpolation", material.ThresholdingAlphaInterpolation); shader.SetBool("ThresholdingAlphaInterpolation", material.ThresholdingAlphaInterpolation);
SetInt($"texCoords0GenType", 0); shader.SetInt($"texCoords0GenType", 0);
SetInt($"texCoords0Source", 0); shader.SetInt($"texCoords0Source", 0);
BindTextureUniforms(); BindTextureUniforms(shader, material);
string textureMap0 = ""; string textureMap0 = "";
if (material.TextureMaps.Count > 0) if (material.TextureMaps.Length > 0)
textureMap0 = material.GetTexture(0); textureMap0 = material.GetTexture(0);
if (textures.ContainsKey(textureMap0)) if (textures.ContainsKey(textureMap0))
{ {
GL.ActiveTexture(TextureUnit.Texture0); GL.ActiveTexture(TextureUnit.Texture0);
SetInt("textures0", 0); shader.SetInt("textures0", 0);
bool isBinded = BxlytToGL.BindGLTexture(material.TextureMaps[0], textures[textureMap0]); bool isBinded = BxlytToGL.BindGLTexture(material.TextureMaps[0], textures[textureMap0]);
if (isBinded) if (isBinded)
SetInt("hasTexture0", 1); shader.SetInt("hasTexture0", 1);
} }
if (material.TextureTransforms.Count > 0) if (material.TextureTransforms.Length > 0)
{ {
var transform = material.TextureTransforms[0]; var transform = material.TextureTransforms[0];
SetVec2("uvScale0", new Vector2(transform.Scale.X, transform.Scale.Y)); shader.SetVec2("uvScale0", new Vector2(transform.Scale.X, transform.Scale.Y));
SetFloat("uvRotate0", transform.Rotate); shader.SetFloat("uvRotate0", transform.Rotate);
SetVec2("uvTranslate0", new Vector2(transform.Translate.X, transform.Translate.Y)); shader.SetVec2("uvTranslate0", new Vector2(transform.Translate.X, transform.Translate.Y));
} }
} }
private void BindTextureUniforms() private static void BindTextureUniforms(BxlytShader shader, BxlytMaterial material)
{ {
//Do uv test pattern //Do uv test pattern
GL.ActiveTexture(TextureUnit.Texture10); GL.ActiveTexture(TextureUnit.Texture10);
GL.Uniform1(GL.GetUniformLocation(program, "uvTestPattern"), 10); GL.Uniform1(GL.GetUniformLocation(shader.program, "uvTestPattern"), 10);
GL.BindTexture(TextureTarget.Texture2D, RenderTools.uvTestPattern.RenderableTex.TexID); GL.BindTexture(TextureTarget.Texture2D, RenderTools.uvTestPattern.RenderableTex.TexID);
if (material.TextureMaps.Count > 0) if (material.TextureMaps.Length > 0)
{ {
var tex = material.TextureMaps[0]; var tex = material.TextureMaps[0];
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, BxlytToGL.ConvertTextureWrap(tex.WrapModeU)); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, BxlytToGL.ConvertTextureWrap(tex.WrapModeU));

View file

@ -2065,9 +2065,6 @@ namespace LayoutBXLYT
[DisplayName("Thresholding Alpha Interpolation"), CategoryAttribute("Alpha")] [DisplayName("Thresholding Alpha Interpolation"), CategoryAttribute("Alpha")]
public virtual bool ThresholdingAlphaInterpolation { get; set; } public virtual bool ThresholdingAlphaInterpolation { get; set; }
[Browsable(false)]
public virtual BxlytShader Shader { get; set; }
[DisplayName("Texture Maps"), CategoryAttribute("Texture")] [DisplayName("Texture Maps"), CategoryAttribute("Texture")]
public BxlytTextureRef[] TextureMaps { get; set; } public BxlytTextureRef[] TextureMaps { get; set; }

View file

@ -11,11 +11,8 @@ namespace LayoutBXLYT
{ {
public class BrlytShader : BxlytShader public class BrlytShader : BxlytShader
{ {
public BRLYT.Material material; public BrlytShader() : base()
public BrlytShader(BRLYT.Material mat) : base()
{ {
material = mat;
LoadShaders(); LoadShaders();
} }
@ -44,7 +41,7 @@ namespace LayoutBXLYT
SetInt($"texCoords0Source", 0); SetInt($"texCoords0Source", 0);
} }
public void SetMaterials(BasePane pane, Dictionary<string, STGenericTexture> textures) public static void SetMaterials(BxlytShader shader, BRLYT.Material material, BasePane pane, Dictionary<string, STGenericTexture> textures)
{ {
var paneRotate = pane.Rotate; var paneRotate = pane.Rotate;
if (pane.animController.PaneSRT?.Count > 0) if (pane.animController.PaneSRT?.Count > 0)
@ -68,7 +65,7 @@ namespace LayoutBXLYT
Matrix4 rotationZ = Matrix4.CreateRotationZ(MathHelper.DegreesToRadians(paneRotate.Z)); Matrix4 rotationZ = Matrix4.CreateRotationZ(MathHelper.DegreesToRadians(paneRotate.Z));
var rotationMatrix = rotationX * rotationY * rotationZ; var rotationMatrix = rotationX * rotationY * rotationZ;
SetMatrix("rotationMatrix", ref rotationMatrix); shader.SetMatrix("rotationMatrix", ref rotationMatrix);
var WhiteColor = material.WhiteColor; var WhiteColor = material.WhiteColor;
var BlackColor = material.BlackColor; var BlackColor = material.BlackColor;
@ -96,23 +93,23 @@ namespace LayoutBXLYT
} }
} }
SetColor("whiteColor", Color.FromArgb(255, WhiteColor.R, WhiteColor.G, WhiteColor.B)); shader.SetColor("whiteColor", Color.FromArgb(255, WhiteColor.R, WhiteColor.G, WhiteColor.B));
SetColor("blackColor", BlackColor.Color); shader.SetColor("blackColor", BlackColor.Color);
SetInt("debugShading", (int)Runtime.LayoutEditor.Shading); shader.SetInt("debugShading", (int)Runtime.LayoutEditor.Shading);
SetInt("numTextureMaps", material.TextureMaps.Length); shader.SetInt("numTextureMaps", material.TextureMaps.Length);
SetVec2("uvScale0", new Vector2(1, 1)); shader.SetVec2("uvScale0", new Vector2(1, 1));
SetFloat("uvRotate0", 0); shader.SetFloat("uvRotate0", 0);
SetVec2("uvTranslate0", new Vector2(0, 0)); shader.SetVec2("uvTranslate0", new Vector2(0, 0));
SetInt("flipTexture", 0); shader.SetInt("flipTexture", 0);
SetInt("numTevStages", 0); shader.SetInt("numTevStages", 0);
SetBool("ThresholdingAlphaInterpolation", material.ThresholdingAlphaInterpolation); shader.SetBool("ThresholdingAlphaInterpolation", material.ThresholdingAlphaInterpolation);
SetVec4("IndirectMat0", new Vector4(1, 1, 0, 0)); shader.SetVec4("IndirectMat0", new Vector4(1, 1, 0, 0));
SetVec4("IndirectMat1", new Vector4(1, 1, 0, 0)); shader.SetVec4("IndirectMat1", new Vector4(1, 1, 0, 0));
SetInt("tevTexMode", 0); shader.SetInt("tevTexMode", 0);
SetInt($"texCoords0GenType", 0); shader.SetInt($"texCoords0GenType", 0);
SetInt($"texCoords0Source", 0); shader.SetInt($"texCoords0Source", 0);
BindTextureUniforms(); BindTextureUniforms(shader, material);
int id = 1; int id = 1;
for (int i = 0; i < material.TextureMaps.Length; i++) for (int i = 0; i < material.TextureMaps.Length; i++)
@ -125,10 +122,10 @@ namespace LayoutBXLYT
if (textures.ContainsKey(TexName)) if (textures.ContainsKey(TexName))
{ {
GL.ActiveTexture(TextureUnit.Texture0 + id); GL.ActiveTexture(TextureUnit.Texture0 + id);
SetInt($"textures{i}", id); shader.SetInt($"textures{i}", id);
bool isBinded = BxlytToGL.BindGLTexture(material.TextureMaps[i], textures[TexName]); bool isBinded = BxlytToGL.BindGLTexture(material.TextureMaps[i], textures[TexName]);
if (isBinded) if (isBinded)
SetInt($"hasTexture{i}", 1); shader.SetInt($"hasTexture{i}", 1);
id++; id++;
} }
@ -153,9 +150,9 @@ namespace LayoutBXLYT
} }
} }
SetVec2("uvScale0", new Vector2(scale.X, scale.Y)); shader.SetVec2("uvScale0", new Vector2(scale.X, scale.Y));
SetFloat("uvRotate0", rotate); shader.SetFloat("uvRotate0", rotate);
SetVec2("uvTranslate0", new Vector2(translate.X, translate.Y)); shader.SetVec2("uvTranslate0", new Vector2(translate.X, translate.Y));
} }
GL.Enable(EnableCap.Blend); GL.Enable(EnableCap.Blend);
@ -167,11 +164,11 @@ namespace LayoutBXLYT
GL.LogicOp(LogicOp.Noop); GL.LogicOp(LogicOp.Noop);
} }
private void BindTextureUniforms() private static void BindTextureUniforms(BxlytShader shader, BxlytMaterial material)
{ {
//Do uv test pattern //Do uv test pattern
GL.ActiveTexture(TextureUnit.Texture10); GL.ActiveTexture(TextureUnit.Texture10);
GL.Uniform1(GL.GetUniformLocation(program, "uvTestPattern"), 10); GL.Uniform1(GL.GetUniformLocation(shader.program, "uvTestPattern"), 10);
GL.BindTexture(TextureTarget.Texture2D, RenderTools.uvTestPattern.RenderableTex.TexID); GL.BindTexture(TextureTarget.Texture2D, RenderTools.uvTestPattern.RenderableTex.TexID);
if (material.TextureMaps.Length > 0) if (material.TextureMaps.Length > 0)

View file

@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LayoutBXLYT
{
public class ShaderLoader
{
private static BflytShader cafeShader;
private static BrlytShader revShader;
private static BclytShader ctrShader;
public static BflytShader CafeShader
{
get
{
if (cafeShader == null)
cafeShader = new BflytShader();
return cafeShader;
}
}
public static BrlytShader RevShader
{
get
{
if (revShader == null)
revShader = new BrlytShader();
return revShader;
}
}
public static BclytShader CtrShader
{
get
{
if (ctrShader == null)
ctrShader = new BclytShader();
return ctrShader;
}
}
}
}

View file

@ -312,6 +312,7 @@
<Compile Include="FileFormats\Layout\CAFE\Materials\TexCoordGen.cs" /> <Compile Include="FileFormats\Layout\CAFE\Materials\TexCoordGen.cs" />
<Compile Include="FileFormats\Layout\CAFE\Materials\TextureRef.cs" /> <Compile Include="FileFormats\Layout\CAFE\Materials\TextureRef.cs" />
<Compile Include="FileFormats\Layout\CAFE\Materials\TextureTransform.cs" /> <Compile Include="FileFormats\Layout\CAFE\Materials\TextureTransform.cs" />
<Compile Include="FileFormats\Layout\ShaderLoader.cs" />
<Compile Include="FileFormats\Layout\CTR\BCLYT.cs" /> <Compile Include="FileFormats\Layout\CTR\BCLYT.cs" />
<Compile Include="FileFormats\Layout\CAFE\FLYT.cs" /> <Compile Include="FileFormats\Layout\CAFE\FLYT.cs" />
<Compile Include="FileFormats\Layout\CTR\BclytShader.cs" /> <Compile Include="FileFormats\Layout\CTR\BclytShader.cs" />

View file

@ -89,6 +89,7 @@ namespace LayoutBXLYT
displayGridToolStripMenuItem.Checked = Runtime.LayoutEditor.DisplayGrid; displayGridToolStripMenuItem.Checked = Runtime.LayoutEditor.DisplayGrid;
displayTextPanesToolStripMenuItem.Checked = Runtime.LayoutEditor.DisplayTextPane; displayTextPanesToolStripMenuItem.Checked = Runtime.LayoutEditor.DisplayTextPane;
transformChildrenToolStripMenuItem.Checked = Runtime.LayoutEditor.TransformChidlren; transformChildrenToolStripMenuItem.Checked = Runtime.LayoutEditor.TransformChidlren;
viewPartsAsNullPanesToolStripMenuItem.Checked = Runtime.LayoutEditor.PartsAsNullPanes;
ObjectSelected += OnObjectSelected; ObjectSelected += OnObjectSelected;
ObjectChanged += OnObjectChanged; ObjectChanged += OnObjectChanged;

View file

@ -1385,6 +1385,7 @@
<Folder Include="FileFormats\Compression\" /> <Folder Include="FileFormats\Compression\" />
<Folder Include="FileFormats\DAE\COLLADA\" /> <Folder Include="FileFormats\DAE\COLLADA\" />
<Folder Include="FileFormats\DAE\Custom\" /> <Folder Include="FileFormats\DAE\Custom\" />
<Folder Include="Rendering\Shaders\" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="Resources\boneWeightGradient.png" /> <None Include="Resources\boneWeightGradient.png" />