149 lines
6.8 KiB
C#
149 lines
6.8 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.IO;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using OpenTK;
|
|||
|
using OpenTK.Graphics.OpenGL;
|
|||
|
using GL_EditorFramework.GL_Core;
|
|||
|
using GL_EditorFramework.Interfaces;
|
|||
|
using GL_EditorFramework.EditorDrawables;
|
|||
|
using Switch_Toolbox.Library.IO;
|
|||
|
|
|||
|
namespace Switch_Toolbox.Library.Rendering
|
|||
|
{
|
|||
|
public class DrawableSkybox : AbstractGlDrawable
|
|||
|
{
|
|||
|
ShaderProgram defaultShaderProgram;
|
|||
|
|
|||
|
public override void Prepare(GL_ControlModern control)
|
|||
|
{
|
|||
|
string pathFrag = System.IO.Path.Combine(Runtime.ExecutableDir, "Shader", "HDRSkyBox") + "\\HDRSkyBox.frag";
|
|||
|
string pathVert = System.IO.Path.Combine(Runtime.ExecutableDir, "Shader", "HDRSkyBox") + "\\HDRSkyBox.vert";
|
|||
|
|
|||
|
var defaultFrag = new FragmentShader(File.ReadAllText(pathFrag));
|
|||
|
var defaultVert = new VertexShader(File.ReadAllText(pathVert));
|
|||
|
|
|||
|
defaultShaderProgram = new ShaderProgram(defaultFrag, defaultVert);
|
|||
|
}
|
|||
|
public override void Prepare(GL_ControlLegacy control)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
public override void Draw(GL_ControlLegacy control, Pass pass)
|
|||
|
{
|
|||
|
if (!Runtime.OpenTKInitialized || pass == Pass.TRANSPARENT)
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
SFGraphics.GLObjects.Textures.TextureCubeMap specularPbr;
|
|||
|
public override void Draw(GL_ControlModern control, Pass pass)
|
|||
|
{
|
|||
|
if (!Runtime.OpenTKInitialized || pass == Pass.TRANSPARENT)
|
|||
|
return;
|
|||
|
|
|||
|
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);
|
|||
|
|
|||
|
|
|||
|
control.CurrentShader = defaultShaderProgram;
|
|||
|
// enable seamless cubemap sampling for lower mip levels in the pre-filter map.
|
|||
|
GL.Enable(EnableCap.TextureCubeMapSeamless);
|
|||
|
|
|||
|
Matrix4 proj = Matrix4.Identity;
|
|||
|
Matrix4 rot = Matrix4.CreateFromQuaternion(control.mtxCam.ExtractRotation());
|
|||
|
|
|||
|
GL.UniformMatrix4(defaultShaderProgram["projection"], false, ref proj);
|
|||
|
GL.UniformMatrix4(defaultShaderProgram["rotView"], false, ref rot);
|
|||
|
|
|||
|
//Load Cubemap
|
|||
|
if (RenderTools.diffusePbr != null)
|
|||
|
{
|
|||
|
GL.ActiveTexture(TextureUnit.Texture0);
|
|||
|
RenderTools.diffusePbr.Bind();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
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);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|