208 lines
7.3 KiB
C#
208 lines
7.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using Bfres.Structs;
|
|
using OpenTK;
|
|
using OpenTK.Graphics.OpenGL;
|
|
using GL_EditorFramework.GL_Core;
|
|
|
|
namespace FirstPlugin
|
|
{
|
|
public class AglShaderTurbo
|
|
{
|
|
public DisplayFace DisplayCullFace = DisplayFace.Front;
|
|
public RenderStateMode RenderMode = RenderStateMode.Opaque;
|
|
|
|
public enum DisplayFace
|
|
{
|
|
Front,
|
|
Back,
|
|
Both,
|
|
None,
|
|
}
|
|
|
|
public enum RenderStateMode
|
|
{
|
|
Opaque,
|
|
Mask,
|
|
Translucent,
|
|
Custom,
|
|
}
|
|
|
|
AlphaGLControl alphaControl;
|
|
DepthGLControl depthControl;
|
|
ColorGLControl colorControl;
|
|
|
|
|
|
public void LoadRenderInfo(BfresRenderInfo renderInfo)
|
|
{
|
|
alphaControl = new AlphaGLControl();
|
|
depthControl = new DepthGLControl();
|
|
colorControl = new ColorGLControl();
|
|
|
|
switch (renderInfo.Name)
|
|
{
|
|
case "gsys_alpha_test_enable":
|
|
alphaControl.EnableAlphaTest = ParseString(renderInfo.ValueString);
|
|
break;
|
|
case "gsys_alpha_test_func":
|
|
alphaControl.AlphaFunction = ParseAlphaFunction(renderInfo.ValueString);
|
|
break;
|
|
case "gsys_alpha_test_value":
|
|
if (renderInfo.ValueFloat != null)
|
|
alphaControl.AlphaTestRef = renderInfo.ValueFloat[0];
|
|
if (renderInfo.ValueString != null)
|
|
float.TryParse(renderInfo.ValueString[0], out alphaControl.AlphaTestRef);
|
|
break;
|
|
case "gsys_color_blend_alpha_dst_func":
|
|
break;
|
|
case "gsys_color_blend_alpha_op":
|
|
break;
|
|
case "gsys_color_blend_alpha_src_func":
|
|
break;
|
|
case "gsys_color_blend_const_color":
|
|
colorControl.BlendColorConst = ParseFloat4(renderInfo.ValueFloat);
|
|
break;
|
|
case "gsys_color_blend_rgb_dst_func":
|
|
break;
|
|
case "gsys_color_blend_rgb_op":
|
|
break;
|
|
case "gsys_color_blend_rgb_src_func":
|
|
break;
|
|
case "gsys_depth_test_enable":
|
|
depthControl.EnableTest = ParseString(renderInfo.ValueString);
|
|
break;
|
|
case "gsys_depth_test_func":
|
|
depthControl.DepthFunction = ParseDepthFunction(renderInfo.ValueString);
|
|
break;
|
|
case "gsys_depth_test_write":
|
|
depthControl.EnableWrite = ParseString(renderInfo.ValueString);
|
|
break;
|
|
case "gsys_render_state_display_face":
|
|
DisplayCullFace = ParseDisplayFace(renderInfo.ValueString);
|
|
break;
|
|
case "gsys_render_state_mode":
|
|
RenderMode = ParseRenderStateMode(renderInfo.ValueString);
|
|
break;
|
|
}
|
|
}
|
|
|
|
public void LoadRenderPass(FMAT mat, ShaderProgram shader)
|
|
{
|
|
alphaControl.LoadRenderPass();
|
|
// depthControl.LoadRenderPass();
|
|
// colorControl.LoadRenderPass();
|
|
|
|
GL.Enable(EnableCap.CullFace);
|
|
switch (DisplayCullFace)
|
|
{
|
|
case DisplayFace.Front:
|
|
GL.CullFace(CullFaceMode.Back);
|
|
break;
|
|
case DisplayFace.Back:
|
|
GL.CullFace(CullFaceMode.Front);
|
|
break;
|
|
case DisplayFace.None:
|
|
GL.CullFace(CullFaceMode.FrontAndBack);
|
|
break;
|
|
case DisplayFace.Both:
|
|
GL.Disable(EnableCap.CullFace);
|
|
break;
|
|
}
|
|
switch (RenderMode)
|
|
{
|
|
case RenderStateMode.Opaque:
|
|
mat.isTransparent = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
private static RenderStateMode ParseRenderStateMode(string[] Value)
|
|
{
|
|
if (Value == null || Value.Length <= 0) return RenderStateMode.Opaque;
|
|
|
|
switch (Value[0])
|
|
{
|
|
case "opaque": return RenderStateMode.Opaque;
|
|
case "translucent": return RenderStateMode.Translucent;
|
|
case "mask": return RenderStateMode.Mask;
|
|
case "custom": return RenderStateMode.Custom;
|
|
default:
|
|
throw new Exception("Unknown Render State Mode " + Value[0]);
|
|
}
|
|
}
|
|
|
|
private static DisplayFace ParseDisplayFace(string[] Value)
|
|
{
|
|
if (Value == null || Value.Length <= 0) return DisplayFace.Front;
|
|
|
|
switch (Value[0])
|
|
{
|
|
case "front": return DisplayFace.Front;
|
|
case "back": return DisplayFace.Back;
|
|
case "both": return DisplayFace.Both;
|
|
case "none": return DisplayFace.None;
|
|
default:
|
|
throw new Exception("Unknown Display Face " + Value[0]);
|
|
}
|
|
}
|
|
|
|
private static Vector4 ParseFloat4(float[] Values)
|
|
{
|
|
if (Values == null || Values.Length != 4) return new Vector4(1,1,1,1);
|
|
|
|
return new Vector4(Values[0], Values[1], Values[2], Values[3]);
|
|
}
|
|
|
|
private static DepthFunction ParseDepthFunction(string[] Value)
|
|
{
|
|
if (Value == null || Value.Length <= 0) return DepthFunction.Lequal;
|
|
|
|
switch (Value[0])
|
|
{
|
|
case "gequal": return DepthFunction.Gequal;
|
|
case "lequal": return DepthFunction.Lequal;
|
|
case "always": return DepthFunction.Always;
|
|
case "equal": return DepthFunction.Equal;
|
|
case "less": return DepthFunction.Less;
|
|
case "greater": return DepthFunction.Greater;
|
|
case "never": return DepthFunction.Never;
|
|
case "notequal": return DepthFunction.Notequal;
|
|
default:
|
|
throw new Exception("Unknown Depth Function " + Value[0]);
|
|
}
|
|
}
|
|
|
|
private static AlphaFunction ParseAlphaFunction(string[] Value)
|
|
{
|
|
if (Value == null || Value.Length <= 0) return AlphaFunction.Never;
|
|
|
|
switch (Value[0])
|
|
{
|
|
case "gequal": return AlphaFunction.Gequal;
|
|
case "lequal": return AlphaFunction.Lequal;
|
|
case "always": return AlphaFunction.Always;
|
|
case "equal": return AlphaFunction.Equal;
|
|
case "less": return AlphaFunction.Less;
|
|
case "greater": return AlphaFunction.Greater;
|
|
case "never": return AlphaFunction.Never;
|
|
case "notequal": return AlphaFunction.Notequal;
|
|
default:
|
|
throw new Exception("Unnown Alpha Function " + Value[0]);
|
|
}
|
|
}
|
|
|
|
private static bool ParseString(string[] Value)
|
|
{
|
|
if (Value == null || Value.Length <= 0) return false;
|
|
|
|
if (Value[0] == "true")
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
}
|
|
}
|