This commit is contained in:
46
deps/glutils/include/glutils/glutils.hpp
vendored
46
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{};
|
||||||
@@ -176,7 +176,7 @@ struct ProgramSource {
|
|||||||
ox::Vector<glutils::ShaderVarSet> const shaderParams;
|
ox::Vector<glutils::ShaderVarSet> const shaderParams;
|
||||||
GLsizei const rowLen = [this] {
|
GLsizei const rowLen = [this] {
|
||||||
GLsizei len{};
|
GLsizei len{};
|
||||||
for (auto const&v : shaderParams) {
|
for (auto const &v : shaderParams) {
|
||||||
len += v.len;
|
len += v.len;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
@@ -187,23 +187,23 @@ struct ProgramSource {
|
|||||||
ox::String const geomShader{};
|
ox::String const geomShader{};
|
||||||
};
|
};
|
||||||
|
|
||||||
ox::Result<GLProgram> buildShaderProgram(ProgramSource const&src) noexcept;
|
ox::Result<GLProgram> buildShaderProgram(ProgramSource const &src) noexcept;
|
||||||
|
|
||||||
ox::Result<GLProgram> buildShaderProgram(
|
ox::Result<GLProgram> buildShaderProgram(
|
||||||
ox::CStringView const&vert,
|
ox::CStringView const &vert,
|
||||||
ox::CStringView const&frag,
|
ox::CStringView const &frag,
|
||||||
ox::CStringView const&geo = "") noexcept;
|
ox::CStringView const &geo = "") noexcept;
|
||||||
|
|
||||||
void setupShaderParams(
|
void setupShaderParams(
|
||||||
GLProgram const&shader,
|
GLProgram const &shader,
|
||||||
ox::Vector<ShaderVarSet> const&vars,
|
ox::Vector<ShaderVarSet> const &vars,
|
||||||
GLsizei vertexRowLen) noexcept;
|
GLsizei vertexRowLen) noexcept;
|
||||||
|
|
||||||
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;
|
||||||
@@ -215,20 +215,20 @@ void resizeFrameBuffer(FrameBuffer &fb, int width, int height) noexcept;
|
|||||||
*/
|
*/
|
||||||
void resizeInitFrameBuffer(FrameBuffer &fb, int width, int height) noexcept;
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
void sendVbo(BufferSet const&bs) noexcept;
|
void sendVbo(BufferSet const &bs) noexcept;
|
||||||
|
|
||||||
void sendEbo(BufferSet const&bs) noexcept;
|
void sendEbo(BufferSet const &bs) noexcept;
|
||||||
|
|
||||||
void clearScreen() noexcept;
|
void clearScreen() noexcept;
|
||||||
|
|
||||||
|
71
deps/glutils/src/glutils.cpp
vendored
71
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);
|
||||||
@@ -88,7 +88,7 @@ static ox::Result<GLShader> buildShader(
|
|||||||
return shader;
|
return shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
ox::Result<GLProgram> buildShaderProgram(ProgramSource const&src) noexcept {
|
ox::Result<GLProgram> buildShaderProgram(ProgramSource const &src) noexcept {
|
||||||
OX_REQUIRE_M(program, buildShaderProgram(
|
OX_REQUIRE_M(program, buildShaderProgram(
|
||||||
src.vertShader,
|
src.vertShader,
|
||||||
src.fragShader,
|
src.fragShader,
|
||||||
@@ -98,11 +98,11 @@ ox::Result<GLProgram> buildShaderProgram(ProgramSource const&src) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void setupShaderParams(
|
void setupShaderParams(
|
||||||
GLProgram const&shader,
|
GLProgram const &shader,
|
||||||
ox::Vector<ShaderVarSet> const&vars,
|
ox::Vector<ShaderVarSet> const &vars,
|
||||||
GLsizei vertexRowLen) noexcept {
|
GLsizei vertexRowLen) noexcept {
|
||||||
// setup vars
|
// setup vars
|
||||||
for (size_t lenWritten = 0; auto const&v : vars) {
|
for (size_t lenWritten = 0; auto const &v : vars) {
|
||||||
auto const attr = static_cast<GLuint>(glGetAttribLocation(shader, v.name.c_str()));
|
auto const attr = static_cast<GLuint>(glGetAttribLocation(shader, v.name.c_str()));
|
||||||
glEnableVertexAttribArray(attr);
|
glEnableVertexAttribArray(attr);
|
||||||
glVertexAttribPointer(
|
glVertexAttribPointer(
|
||||||
@@ -113,19 +113,19 @@ void setupShaderParams(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setupShaderParams(GLProgram const&shader, ox::Vector<ShaderVarSet> const&vars) noexcept {
|
void setupShaderParams(GLProgram const &shader, ox::Vector<ShaderVarSet> const &vars) noexcept {
|
||||||
// get row len
|
// get row len
|
||||||
GLsizei vertexRowLen{};
|
GLsizei vertexRowLen{};
|
||||||
for (auto const&v : vars) {
|
for (auto const &v : vars) {
|
||||||
vertexRowLen += v.len;
|
vertexRowLen += v.len;
|
||||||
}
|
}
|
||||||
setupShaderParams(shader, vars, vertexRowLen);
|
setupShaderParams(shader, vars, vertexRowLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
ox::Result<GLProgram> buildShaderProgram(
|
ox::Result<GLProgram> buildShaderProgram(
|
||||||
ox::CStringView const&vert,
|
ox::CStringView const &vert,
|
||||||
ox::CStringView const&frag,
|
ox::CStringView const &frag,
|
||||||
ox::CStringView const&geo) noexcept {
|
ox::CStringView const &geo) noexcept {
|
||||||
GLProgram prgm(glCreateProgram());
|
GLProgram prgm(glCreateProgram());
|
||||||
OX_REQUIRE(vs, buildShader(GL_VERTEX_SHADER, vert.c_str(), "vshad"));
|
OX_REQUIRE(vs, buildShader(GL_VERTEX_SHADER, vert.c_str(), "vshad"));
|
||||||
glAttachShader(prgm, vs);
|
glAttachShader(prgm, vs);
|
||||||
@@ -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;
|
||||||
@@ -209,18 +232,18 @@ void resizeInitFrameBuffer(FrameBuffer &fb, int width, int height) noexcept {
|
|||||||
resizeFrameBuffer(fb, width, height);
|
resizeFrameBuffer(fb, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
void resizeInitFrameBuffer(FrameBuffer &fb, ox::Size const&sz) noexcept {
|
void resizeInitFrameBuffer(FrameBuffer &fb, ox::Size const &sz) noexcept {
|
||||||
resizeInitFrameBuffer(fb, sz.width, sz.height);
|
resizeInitFrameBuffer(fb, sz.width, sz.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
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