This commit is contained in:
24
deps/glutils/include/glutils/glutils.hpp
vendored
24
deps/glutils/include/glutils/glutils.hpp
vendored
@@ -89,7 +89,7 @@ struct GLObject: public Base {
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr operator const GLuint&() const noexcept {
|
constexpr operator GLuint const&() const noexcept {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,7 +135,7 @@ struct FrameBuffer {
|
|||||||
return fbo.id;
|
return fbo.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr operator const GLuint&() const noexcept {
|
constexpr operator GLuint const&() const noexcept {
|
||||||
return fbo.id;
|
return fbo.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,14 +158,14 @@ struct FrameBuffer {
|
|||||||
|
|
||||||
class FrameBufferBind {
|
class FrameBufferBind {
|
||||||
private:
|
private:
|
||||||
static const FrameBuffer *s_activeFb;
|
static FrameBuffer const *s_activeFb;
|
||||||
const FrameBuffer *m_restoreFb = nullptr;
|
FrameBuffer const *m_restoreFb = nullptr;
|
||||||
public:
|
public:
|
||||||
explicit FrameBufferBind(const FrameBuffer &fb) noexcept;
|
explicit FrameBufferBind(FrameBuffer const &fb) noexcept;
|
||||||
~FrameBufferBind() noexcept;
|
~FrameBufferBind() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
void bind(const FrameBuffer &fb) noexcept;
|
void bind(FrameBuffer const &fb) noexcept;
|
||||||
|
|
||||||
struct ShaderVarSet {
|
struct ShaderVarSet {
|
||||||
GLsizei len{};
|
GLsizei len{};
|
||||||
@@ -201,9 +201,9 @@ void setupShaderParams(
|
|||||||
|
|
||||||
void setupShaderParams(GLProgram const &shader, ox::Vector<ShaderVarSet> const &vars) noexcept;
|
void setupShaderParams(GLProgram const &shader, ox::Vector<ShaderVarSet> const &vars) noexcept;
|
||||||
|
|
||||||
glutils::GLVertexArray generateVertexArrayObject() noexcept;
|
GLVertexArray generateVertexArrayObject() noexcept;
|
||||||
|
|
||||||
glutils::GLBuffer generateBuffer() noexcept;
|
GLBuffer generateBuffer() noexcept;
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
FrameBuffer generateFrameBuffer(int width, int height) noexcept;
|
FrameBuffer generateFrameBuffer(int width, int height) noexcept;
|
||||||
@@ -218,10 +218,10 @@ void resizeInitFrameBuffer(FrameBuffer &fb, int width, int height) noexcept;
|
|||||||
void resizeInitFrameBuffer(FrameBuffer &fb, ox::Size const &sz) noexcept;
|
void resizeInitFrameBuffer(FrameBuffer &fb, ox::Size const &sz) noexcept;
|
||||||
|
|
||||||
struct BufferSet {
|
struct BufferSet {
|
||||||
glutils::GLVertexArray vao;
|
GLVertexArray vao;
|
||||||
glutils::GLBuffer vbo;
|
GLBuffer vbo;
|
||||||
glutils::GLBuffer ebo;
|
GLBuffer ebo;
|
||||||
glutils::GLTexture tex;
|
GLTexture tex;
|
||||||
ox::Vector<float> vertices;
|
ox::Vector<float> vertices;
|
||||||
ox::Vector<GLuint> elements;
|
ox::Vector<GLuint> elements;
|
||||||
};
|
};
|
||||||
|
47
deps/glutils/src/glutils.cpp
vendored
47
deps/glutils/src/glutils.cpp
vendored
@@ -46,9 +46,9 @@ template struct GLObject<deleteVertexArray>;
|
|||||||
template struct GLObject<deleteProgram>;
|
template struct GLObject<deleteProgram>;
|
||||||
template struct GLObject<deleteShader>;
|
template struct GLObject<deleteShader>;
|
||||||
|
|
||||||
const FrameBuffer *FrameBufferBind::s_activeFb = nullptr;
|
FrameBuffer const *FrameBufferBind::s_activeFb = nullptr;
|
||||||
|
|
||||||
FrameBufferBind::FrameBufferBind(const FrameBuffer &fb) noexcept: m_restoreFb(s_activeFb) {
|
FrameBufferBind::FrameBufferBind(FrameBuffer const &fb) noexcept: m_restoreFb(s_activeFb) {
|
||||||
s_activeFb = &fb;
|
s_activeFb = &fb;
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, fb);
|
glBindFramebuffer(GL_FRAMEBUFFER, fb);
|
||||||
glViewport(0, 0, fb.width, fb.height);
|
glViewport(0, 0, fb.width, fb.height);
|
||||||
@@ -64,15 +64,15 @@ FrameBufferBind::~FrameBufferBind() noexcept {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void bind(const FrameBuffer &fb) noexcept {
|
void bind(FrameBuffer const &fb) noexcept {
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, fb);
|
glBindFramebuffer(GL_FRAMEBUFFER, fb);
|
||||||
glViewport(0, 0, fb.width, fb.height);
|
glViewport(0, 0, fb.width, fb.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static ox::Result<GLShader> buildShader(
|
static ox::Result<GLShader> buildShader(
|
||||||
GLuint shaderType,
|
GLuint const shaderType,
|
||||||
const GLchar *src,
|
GLchar const *src,
|
||||||
ox::StringViewCR shaderName) noexcept {
|
ox::StringViewCR shaderName) noexcept {
|
||||||
GLShader shader(glCreateShader(shaderType));
|
GLShader shader(glCreateShader(shaderType));
|
||||||
glShaderSource(shader, 1, &src, nullptr);
|
glShaderSource(shader, 1, &src, nullptr);
|
||||||
@@ -162,16 +162,30 @@ FrameBuffer generateFrameBuffer(int width, int height) noexcept {
|
|||||||
// color texture
|
// color texture
|
||||||
glGenTextures(1, &fb.color.id);
|
glGenTextures(1, &fb.color.id);
|
||||||
glBindTexture(GL_TEXTURE_2D, fb.color);
|
glBindTexture(GL_TEXTURE_2D, fb.color);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
|
glTexImage2D(
|
||||||
|
GL_TEXTURE_2D,
|
||||||
|
0,
|
||||||
|
GL_RGB,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
0,
|
||||||
|
GL_RGB,
|
||||||
|
GL_UNSIGNED_BYTE,
|
||||||
|
nullptr);
|
||||||
glGenerateMipmap(GL_TEXTURE_2D);
|
glGenerateMipmap(GL_TEXTURE_2D);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fb.color, 0);
|
glFramebufferTexture2D(
|
||||||
|
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fb.color, 0);
|
||||||
// depth texture
|
// depth texture
|
||||||
glGenRenderbuffers(1, &fb.depth.id);
|
glGenRenderbuffers(1, &fb.depth.id);
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, fb.depth);
|
glBindRenderbuffer(GL_RENDERBUFFER, fb.depth);
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
|
||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fb.depth);
|
glFramebufferRenderbuffer(
|
||||||
|
GL_FRAMEBUFFER,
|
||||||
|
GL_DEPTH_STENCIL_ATTACHMENT,
|
||||||
|
GL_RENDERBUFFER,
|
||||||
|
fb.depth);
|
||||||
// verify FBO
|
// verify FBO
|
||||||
oxAssert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE, "Frame Buffer is incomplete");
|
oxAssert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE, "Frame Buffer is incomplete");
|
||||||
// restore primary FB
|
// restore primary FB
|
||||||
@@ -189,7 +203,16 @@ void resizeFrameBuffer(FrameBuffer &fb, int width, int height) noexcept {
|
|||||||
glBindFramebuffer(GL_FRAMEBUFFER, fb);
|
glBindFramebuffer(GL_FRAMEBUFFER, fb);
|
||||||
// color texture
|
// color texture
|
||||||
glBindTexture(GL_TEXTURE_2D, fb.color);
|
glBindTexture(GL_TEXTURE_2D, fb.color);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
|
glTexImage2D(
|
||||||
|
GL_TEXTURE_2D,
|
||||||
|
0,
|
||||||
|
GL_RGB,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
0,
|
||||||
|
GL_RGB,
|
||||||
|
GL_UNSIGNED_BYTE,
|
||||||
|
nullptr);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
// depth texture
|
// depth texture
|
||||||
@@ -201,7 +224,7 @@ void resizeFrameBuffer(FrameBuffer &fb, int width, int height) noexcept {
|
|||||||
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void resizeInitFrameBuffer(FrameBuffer &fb, int width, int height) noexcept {
|
void resizeInitFrameBuffer(FrameBuffer &fb, int const width, int const height) noexcept {
|
||||||
if (!fb) {
|
if (!fb) {
|
||||||
fb = generateFrameBuffer(width, height);
|
fb = generateFrameBuffer(width, height);
|
||||||
return;
|
return;
|
||||||
@@ -214,13 +237,13 @@ void resizeInitFrameBuffer(FrameBuffer &fb, ox::Size const&sz) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void sendVbo(BufferSet const &bs) noexcept {
|
void sendVbo(BufferSet const &bs) noexcept {
|
||||||
const auto bufferSize = static_cast<GLsizeiptr>(sizeof(decltype(bs.vertices)::value_type) * bs.vertices.size());
|
auto const bufferSize = static_cast<GLsizeiptr>(sizeof(decltype(bs.vertices)::value_type) * bs.vertices.size());
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, bs.vbo);
|
glBindBuffer(GL_ARRAY_BUFFER, bs.vbo);
|
||||||
glBufferData(GL_ARRAY_BUFFER, bufferSize, bs.vertices.data(), GL_DYNAMIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, bufferSize, bs.vertices.data(), GL_DYNAMIC_DRAW);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendEbo(BufferSet const &bs) noexcept {
|
void sendEbo(BufferSet const &bs) noexcept {
|
||||||
const auto bufferSize = static_cast<GLsizeiptr>(sizeof(decltype(bs.elements)::value_type) * bs.elements.size());
|
auto const bufferSize = static_cast<GLsizeiptr>(sizeof(decltype(bs.elements)::value_type) * bs.elements.size());
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bs.ebo);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bs.ebo);
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufferSize, bs.elements.data(), GL_STATIC_DRAW);
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, bufferSize, bs.elements.data(), GL_STATIC_DRAW);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user