308 lines
10 KiB
C#
308 lines
10 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using SFGraphics.GLObjects.Textures;
|
|||
|
using SFGraphics.GLObjects.Textures.TextureFormats;
|
|||
|
using OpenTK;
|
|||
|
using OpenTK.Graphics.OpenGL;
|
|||
|
using Switch_Toolbox.Library.IO;
|
|||
|
using GL_EditorFramework.GL_Core;
|
|||
|
|
|||
|
namespace Switch_Toolbox.Library
|
|||
|
{
|
|||
|
public class RenderTools
|
|||
|
{
|
|||
|
public static bool PbrSamplersLoaded
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return (diffusepbr != null &&
|
|||
|
specularpbr != null &&
|
|||
|
brdfpbr != null);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private static Texture2D defaulttex;
|
|||
|
public static Texture2D defaultTex
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (defaulttex == null)
|
|||
|
{
|
|||
|
defaulttex = new Texture2D();
|
|||
|
defaultTex.LoadImageData(Properties.Resources.DefaultTexture);
|
|||
|
}
|
|||
|
|
|||
|
return defaulttex;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
defaulttex = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private static TextureCubeMap diffusepbr;
|
|||
|
public static TextureCubeMap diffusePbr
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (diffusepbr == null)
|
|||
|
{
|
|||
|
DDS diffuseSdr = new DDS(Properties.Resources.diffuseSDR);
|
|||
|
diffusepbr = DDS.CreateGLCubeMap(diffuseSdr);
|
|||
|
}
|
|||
|
return diffusepbr;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
diffusepbr = value;
|
|||
|
}
|
|||
|
}
|
|||
|
private static TextureCubeMap specularpbr;
|
|||
|
public static TextureCubeMap specularPbr
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (specularpbr == null)
|
|||
|
{
|
|||
|
DDS specularSdr = new DDS(Properties.Resources.specularSDR);
|
|||
|
specularpbr = DDS.CreateGLCubeMap(specularSdr);
|
|||
|
}
|
|||
|
return specularpbr;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
specularpbr = value;
|
|||
|
}
|
|||
|
}
|
|||
|
public static Texture2D uvtestPattern;
|
|||
|
public static Texture2D uvTestPattern
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (uvtestPattern == null)
|
|||
|
{
|
|||
|
uvtestPattern = new Texture2D();
|
|||
|
uvtestPattern.LoadImageData(Properties.Resources.UVPattern);
|
|||
|
uvtestPattern.TextureWrapR = TextureWrapMode.Repeat;
|
|||
|
uvtestPattern.TextureWrapS = TextureWrapMode.Repeat;
|
|||
|
uvtestPattern.TextureWrapT = TextureWrapMode.Repeat;
|
|||
|
}
|
|||
|
return uvtestPattern;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
uvtestPattern = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private static Texture2D boneWeightGradient;
|
|||
|
public static Texture2D BoneWeightGradient
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (boneWeightGradient == null)
|
|||
|
{
|
|||
|
boneWeightGradient = new Texture2D();
|
|||
|
boneWeightGradient.LoadImageData(Properties.Resources.boneWeightGradient);
|
|||
|
boneWeightGradient.TextureWrapR = TextureWrapMode.Repeat;
|
|||
|
boneWeightGradient.TextureWrapS = TextureWrapMode.Repeat;
|
|||
|
boneWeightGradient.TextureWrapT = TextureWrapMode.Repeat;
|
|||
|
}
|
|||
|
return boneWeightGradient;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
boneWeightGradient = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private static Texture2D boneWeightGradient2;
|
|||
|
public static Texture2D BoneWeightGradient2
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (boneWeightGradient2 == null)
|
|||
|
{
|
|||
|
boneWeightGradient2 = new Texture2D();
|
|||
|
boneWeightGradient2.LoadImageData(Properties.Resources.boneWeightGradient2);
|
|||
|
boneWeightGradient2.TextureWrapR = TextureWrapMode.Repeat;
|
|||
|
boneWeightGradient2.TextureWrapS = TextureWrapMode.Repeat;
|
|||
|
boneWeightGradient2.TextureWrapT = TextureWrapMode.Repeat;
|
|||
|
}
|
|||
|
return boneWeightGradient2;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
boneWeightGradient = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private static Texture2D brdfpbr;
|
|||
|
public static Texture2D brdfPbr
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (brdfpbr == null)
|
|||
|
{
|
|||
|
DDS brdf = new DDS(Properties.Resources.brsf);
|
|||
|
var tex = DDS.GetArrayFaces(brdf, 1);
|
|||
|
|
|||
|
brdfpbr = new Texture2D();
|
|||
|
brdfpbr.LoadImageData((int)brdf.header.width, (int)brdf.header.height, tex[0].mipmaps[0],
|
|||
|
new TextureFormatUncompressed(PixelInternalFormat.Rgba, PixelFormat.Rgba, PixelType.UnsignedByte));
|
|||
|
|
|||
|
// Don't use mipmaps.
|
|||
|
diffusePbr.MinFilter = TextureMinFilter.Linear;
|
|||
|
diffusePbr.MagFilter = TextureMagFilter.Linear;
|
|||
|
}
|
|||
|
return brdfpbr;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
brdfpbr = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public static void DisposeTextures()
|
|||
|
{
|
|||
|
defaultTex = null;
|
|||
|
uvTestPattern = null;
|
|||
|
brdfPbr = null;
|
|||
|
diffusePbr = null;
|
|||
|
specularPbr = null;
|
|||
|
}
|
|||
|
|
|||
|
public static void DrawSkyBox(Matrix4 RotationMatrix)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public static void DrawScreenQuad()
|
|||
|
{
|
|||
|
var vert = new VertexShader(
|
|||
|
@"#version 330
|
|||
|
|
|||
|
in vec3 position;
|
|||
|
out vec2 texCoord;
|
|||
|
|
|||
|
void main()
|
|||
|
{
|
|||
|
texCoord.x = (position.x + 1.0) * 0.5;
|
|||
|
texCoord.y = (position.y + 1.0) * 0.5;
|
|||
|
gl_Position = vec4(position, 1);
|
|||
|
}
|
|||
|
");
|
|||
|
var frag = new FragmentShader(
|
|||
|
@"#version 330 in vec2 texCoord;
|
|||
|
|
|||
|
uniform vec3 topColor;
|
|||
|
uniform vec3 bottomColor;
|
|||
|
|
|||
|
out vec4 FragColor;
|
|||
|
|
|||
|
void main()
|
|||
|
{
|
|||
|
FragColor = vec4(1);
|
|||
|
FragColor.rgb = mix(bottomColor, topColor, texCoord.y);
|
|||
|
}");
|
|||
|
|
|||
|
ShaderProgram shader = new ShaderProgram(frag, vert);
|
|||
|
|
|||
|
GL.MatrixMode(MatrixMode.Modelview);
|
|||
|
GL.LoadIdentity();
|
|||
|
GL.MatrixMode(MatrixMode.Projection);
|
|||
|
GL.LoadIdentity();
|
|||
|
|
|||
|
|
|||
|
shader.SetVector3("topColor", new Vector3(0, 1, 0));
|
|||
|
shader.SetVector3("bottomColor", new Vector3(0, 1, 0));
|
|||
|
|
|||
|
DrawScreenTriangle(shader);
|
|||
|
}
|
|||
|
|
|||
|
private static void DrawScreenTriangle(ShaderProgram shader)
|
|||
|
{
|
|||
|
float[] vertices =
|
|||
|
{
|
|||
|
-1f, -1f, 0.0f,
|
|||
|
3f, -1f, 0.0f,
|
|||
|
-1f, 3f, 0.0f
|
|||
|
};
|
|||
|
|
|||
|
int vao;
|
|||
|
GL.GenVertexArrays(1, out vao);
|
|||
|
GL.BindVertexArray(vao);
|
|||
|
|
|||
|
int vbo;
|
|||
|
GL.GenBuffers(1, out vbo);
|
|||
|
GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
|
|||
|
GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(sizeof(float) * vertices.Length), vertices, BufferUsageHint.StaticDraw);
|
|||
|
|
|||
|
GL.VertexAttribPointer(shader.GetAttribute("position"), 3, VertexAttribPointerType.Float, false, sizeof(float) * 3, 0);
|
|||
|
GL.EnableVertexAttribArray(0);
|
|||
|
|
|||
|
GL.DrawArrays(PrimitiveType.Triangles, 0, 3);
|
|||
|
}
|
|||
|
|
|||
|
public static void DrawCube(Vector3 center, float size)
|
|||
|
{
|
|||
|
DrawRectangularPrism(center, size, size, size, false);
|
|||
|
}
|
|||
|
|
|||
|
public static void DrawRectangularPrism(Vector3 center, float sizeX, float sizeY, float sizeZ, bool useWireFrame = false)
|
|||
|
{
|
|||
|
PrimitiveType primitiveType = PrimitiveType.Quads;
|
|||
|
if (useWireFrame)
|
|||
|
{
|
|||
|
GL.LineWidth(2);
|
|||
|
primitiveType = PrimitiveType.LineLoop;
|
|||
|
}
|
|||
|
|
|||
|
GL.Begin(primitiveType);
|
|||
|
GL.Vertex3(center.X + sizeX, center.Y + sizeY, center.Z - sizeZ);
|
|||
|
GL.Vertex3(center.X - sizeX, center.Y + sizeY, center.Z - sizeZ);
|
|||
|
GL.Vertex3(center.X - sizeX, center.Y + sizeY, center.Z + sizeZ);
|
|||
|
GL.Vertex3(center.X + sizeX, center.Y + sizeY, center.Z + sizeZ);
|
|||
|
GL.End();
|
|||
|
|
|||
|
GL.Begin(primitiveType);
|
|||
|
GL.Vertex3(center.X + sizeX, center.Y - sizeY, center.Z + sizeZ);
|
|||
|
GL.Vertex3(center.X - sizeX, center.Y - sizeY, center.Z + sizeZ);
|
|||
|
GL.Vertex3(center.X - sizeX, center.Y - sizeY, center.Z - sizeZ);
|
|||
|
GL.Vertex3(center.X + sizeX, center.Y - sizeY, center.Z - sizeZ);
|
|||
|
GL.End();
|
|||
|
|
|||
|
GL.Begin(primitiveType);
|
|||
|
GL.Vertex3(center.X + sizeX, center.Y + sizeY, center.Z + sizeZ);
|
|||
|
GL.Vertex3(center.X - sizeX, center.Y + sizeY, center.Z + sizeZ);
|
|||
|
GL.Vertex3(center.X - sizeX, center.Y - sizeY, center.Z + sizeZ);
|
|||
|
GL.Vertex3(center.X + sizeX, center.Y - sizeY, center.Z + sizeZ);
|
|||
|
GL.End();
|
|||
|
|
|||
|
GL.Begin(primitiveType);
|
|||
|
GL.Vertex3(center.X + sizeX, center.Y - sizeY, center.Z - sizeZ);
|
|||
|
GL.Vertex3(center.X - sizeX, center.Y - sizeY, center.Z - sizeZ);
|
|||
|
GL.Vertex3(center.X - sizeX, center.Y + sizeY, center.Z - sizeZ);
|
|||
|
GL.Vertex3(center.X + sizeX, center.Y + sizeY, center.Z - sizeZ);
|
|||
|
GL.End();
|
|||
|
|
|||
|
GL.Begin(primitiveType);
|
|||
|
GL.Vertex3(center.X - sizeX, center.Y + sizeY, center.Z + sizeZ);
|
|||
|
GL.Vertex3(center.X - sizeX, center.Y + sizeY, center.Z - sizeZ);
|
|||
|
GL.Vertex3(center.X - sizeX, center.Y - sizeY, center.Z - sizeZ);
|
|||
|
GL.Vertex3(center.X - sizeX, center.Y - sizeY, center.Z + sizeZ);
|
|||
|
GL.End();
|
|||
|
|
|||
|
GL.Begin(primitiveType);
|
|||
|
GL.Vertex3(center.X + sizeX, center.Y + sizeY, center.Z - sizeZ);
|
|||
|
GL.Vertex3(center.X + sizeX, center.Y + sizeY, center.Z + sizeZ);
|
|||
|
GL.Vertex3(center.X + sizeX, center.Y - sizeY, center.Z + sizeZ);
|
|||
|
GL.Vertex3(center.X + sizeX, center.Y - sizeY, center.Z - sizeZ);
|
|||
|
GL.End();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|