197 lines
9.2 KiB
C#
197 lines
9.2 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 Smash_Forge.Rendering;
|
|||
|
|
|||
|
namespace Switch_Toolbox.Library
|
|||
|
{
|
|||
|
public class RenderTools
|
|||
|
{
|
|||
|
public static Texture2D defaultTex;
|
|||
|
public static TextureCubeMap diffusePbr;
|
|||
|
public static TextureCubeMap specularPbr;
|
|||
|
public static Texture2D uvTestPattern;
|
|||
|
|
|||
|
public static void LoadTextures()
|
|||
|
{
|
|||
|
defaultTex = new Texture2D();
|
|||
|
defaultTex.LoadImageData(Properties.Resources.DefaultTexture);
|
|||
|
uvTestPattern = new Texture2D();
|
|||
|
uvTestPattern.LoadImageData(Properties.Resources.UVPattern);
|
|||
|
|
|||
|
// DDS specularSdr = new DDS(Properties.Resources.specularSDR);
|
|||
|
// specularPbr = NUT.CreateTextureCubeMap(specularSdr.ToNutTexture());
|
|||
|
|
|||
|
// DDS diffuseSdr = new DDS(Properties.Resources.diffuseSDR);
|
|||
|
// diffusePbr = CreateTextureCubeMap(bntx.textureData.texture);
|
|||
|
|
|||
|
// Don't use mipmaps.
|
|||
|
// diffusePbr.MinFilter = TextureMinFilter.Linear;
|
|||
|
// diffusePbr.MagFilter = TextureMagFilter.Linear;
|
|||
|
}
|
|||
|
|
|||
|
public static void DrawSkyBox(Matrix4 RotationMatrix)
|
|||
|
{
|
|||
|
GL.Enable(EnableCap.DepthTest);
|
|||
|
GL.DepthFunc(DepthFunction.Lequal);
|
|||
|
|
|||
|
GL.Enable(EnableCap.CullFace);
|
|||
|
GL.CullFace(CullFaceMode.Front);
|
|||
|
|
|||
|
GL.Enable(EnableCap.LineSmooth);
|
|||
|
|
|||
|
GL.Enable(EnableCap.StencilTest);
|
|||
|
GL.StencilOp(StencilOp.Keep, StencilOp.Keep, StencilOp.Replace);
|
|||
|
|
|||
|
|
|||
|
SFGraphics.GLObjects.Shaders.Shader shader = OpenTKSharedResources.shaders["HDRSkyBox"];
|
|||
|
shader.UseProgram();
|
|||
|
// enable seamless cubemap sampling for lower mip levels in the pre-filter map.
|
|||
|
GL.Enable(EnableCap.TextureCubeMapSeamless);
|
|||
|
|
|||
|
Matrix4 proj = Matrix4.Identity;
|
|||
|
shader.SetMatrix4x4("projection", ref proj);
|
|||
|
Matrix4 rot = RotationMatrix;
|
|||
|
shader.SetMatrix4x4("rotView", ref rot);
|
|||
|
|
|||
|
// shader.SetTexture("environmentMap", diffusePbr, 16);
|
|||
|
|
|||
|
DrawCube();
|
|||
|
}
|
|||
|
|
|||
|
public static void DrawCube()
|
|||
|
{
|
|||
|
int cubeVBO = 0;
|
|||
|
|
|||
|
if (cubeVBO == 0)
|
|||
|
{
|
|||
|
float[] vertices = {
|
|||
|
// back face
|
|||
|
-1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, // bottom-left
|
|||
|
1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, // top-right
|
|||
|
1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, // bottom-right
|
|||
|
1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, // top-right
|
|||
|
-1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, // bottom-left
|
|||
|
-1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, // top-left
|
|||
|
// front face
|
|||
|
-1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom-left
|
|||
|
1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, // bottom-right
|
|||
|
1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, // top-right
|
|||
|
1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, // top-right
|
|||
|
-1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, // top-left
|
|||
|
-1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom-left
|
|||
|
// left face
|
|||
|
-1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, // top-right
|
|||
|
-1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // top-left
|
|||
|
-1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, // bottom-left
|
|||
|
-1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, // bottom-left
|
|||
|
-1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // bottom-right
|
|||
|
-1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, // top-right
|
|||
|
// right face
|
|||
|
1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, // top-left
|
|||
|
1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, // bottom-right
|
|||
|
1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // top-right
|
|||
|
1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, // bottom-right
|
|||
|
1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, // top-left
|
|||
|
1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // bottom-left
|
|||
|
// bottom face
|
|||
|
-1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, // top-right
|
|||
|
1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, // top-left
|
|||
|
1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, // bottom-left
|
|||
|
1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, // bottom-left
|
|||
|
-1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, // bottom-right
|
|||
|
-1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, // top-right
|
|||
|
// top face
|
|||
|
-1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, // top-left
|
|||
|
1.0f, 1.0f , 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // bottom-right
|
|||
|
1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, // top-right
|
|||
|
1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // bottom-right
|
|||
|
-1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, // top-left
|
|||
|
-1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f // bottom-left
|
|||
|
};
|
|||
|
|
|||
|
GL.GenVertexArrays(1, out cubeVBO);
|
|||
|
GL.GenBuffers(1, out cubeVBO);
|
|||
|
GL.BindBuffer(BufferTarget.ArrayBuffer, cubeVBO);
|
|||
|
GL.BufferData(BufferTarget.ArrayBuffer, 4 * vertices.Length, vertices, BufferUsageHint.StaticDraw);
|
|||
|
GL.BindVertexArray(cubeVBO);
|
|||
|
GL.EnableVertexAttribArray(0);
|
|||
|
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 8 * sizeof(float), (IntPtr)0);
|
|||
|
GL.EnableVertexAttribArray(1);
|
|||
|
GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, false, 8 * sizeof(float), (IntPtr)(3 * sizeof(float)));
|
|||
|
GL.EnableVertexAttribArray(2);
|
|||
|
GL.VertexAttribPointer(2, 2, VertexAttribPointerType.Float, false, 8 * sizeof(float), (IntPtr)(6 * sizeof(float)));
|
|||
|
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
|
|||
|
GL.BindVertexArray(0);
|
|||
|
|
|||
|
}
|
|||
|
GL.BindVertexArray(cubeVBO);
|
|||
|
GL.DrawArrays(PrimitiveType.Triangles, 0, 36);
|
|||
|
GL.BindVertexArray(0);
|
|||
|
}
|
|||
|
|
|||
|
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();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|