diff --git a/vis/include/cgl/render.hpp b/vis/include/cgl/render.hpp index 12daa26..cd35e24 100644 --- a/vis/include/cgl/render.hpp +++ b/vis/include/cgl/render.hpp @@ -78,7 +78,7 @@ namespace cgl { set_source(src); if (!compile()) - throw shader_error(get_info_log()); + throw shader_error(get_info_log()); } static shader file(const std::string &name) { @@ -188,7 +188,7 @@ namespace cgl { attach(sh); if (!link()) - throw shader_error(get_info_log()); + throw shader_error(get_info_log()); detach(sh); } diff --git a/vis/include/util.hpp b/vis/include/util.hpp index 17d30ab..e4a1807 100644 --- a/vis/include/util.hpp +++ b/vis/include/util.hpp @@ -15,6 +15,7 @@ public: explicit gl_error(const char *string) : domain_error(string) {} }; +template class shader_error : public gl_error { public: explicit shader_error(const std::string &arg) : gl_error(arg) {} @@ -106,7 +107,7 @@ GLuint utilCompileFiles(const GLenum type, const std::vector &files if (getShaderCompileStatus(shader)) return shader; - throw shader_error(getShaderInfoLog(shader)); + throw shader_error(getShaderInfoLog(shader)); } GLuint utilLinkProgram(const std::vector &shaders) { diff --git a/vis/shaders/test/direct.glsl b/vis/shaders/test/direct.glsl deleted file mode 100644 index 5fbc428..0000000 --- a/vis/shaders/test/direct.glsl +++ /dev/null @@ -1,16 +0,0 @@ -#version 430 - -layout(std140, binding=0) uniform globals { - mat4 proj; - float time; -}; - -layout(location=0) in vec4 pos; - -out gl_PerVertex{ - vec4 gl_Position; -}; - -void main() { - gl_Position = proj * pos; -} diff --git a/vis/shaders/test/white.glsl b/vis/shaders/test/white.glsl deleted file mode 100644 index 24449f9..0000000 --- a/vis/shaders/test/white.glsl +++ /dev/null @@ -1,15 +0,0 @@ -#version 430 - -layout(std140, binding=0) uniform globals { - mat4 proj; - float time; -}; - -out vec4 diffuse; - -void main() { - vec3 hue = vec3(time) + vec3(0, 2, 4) * 3.1415 / 6.0; - vec3 rgb = cos(hue) * 0.3 + vec3(0.7); - - diffuse = vec4(rgb, 1); -} diff --git a/vis/src/main.cpp b/vis/src/main.cpp index 55c0c5f..f8486a7 100644 --- a/vis/src/main.cpp +++ b/vis/src/main.cpp @@ -30,34 +30,27 @@ struct Matrices { template struct BufferMesh { - GLenum mode; - std::shared_ptr vao; - std::shared_ptr>> ibo; - std::shared_ptr> vbo; + GLenum mode{}; + cgl::vertexarray vao{}; + cgl::buffer> ibo{}; + cgl::buffer vbo{}; - BufferMesh() = delete; + BufferMesh(GLenum mode) : mode(mode), vao(), ibo(), vbo() {} BufferMesh(BufferMesh &) = delete; BufferMesh(BufferMesh &&) = delete; - explicit BufferMesh( - GLenum mode, - std::shared_ptr vao, - std::shared_ptr>> ibo, - std::shared_ptr> vbo - ) : mode(mode), vao(vao), ibo(ibo), vbo(vbo) {} - void draw_deferred() { - vao->bound([&]() { - glDrawArrays(GL_POINTS, 0, ibo->count() * N); + vao.bound([&]() { + glDrawArrays(GL_POINTS, 0, ibo.count() * N); }); } void draw_direct() { - vao->bound([&]() { - ibo->bound(GL_ELEMENT_ARRAY_BUFFER, [&]() { - glDrawElements(mode, ibo->count() * N, GL_UNSIGNED_INT, nullptr); + vao.bound([&]() { + ibo.bound(GL_ELEMENT_ARRAY_BUFFER, [&]() { + glDrawElements(mode, ibo.count() * N, GL_UNSIGNED_INT, nullptr); }); }); } @@ -159,13 +152,8 @@ void run(GLFWwindow *window) { auto group = tc::group::F4(); auto wire_data = merge(poly_parts<2>(group)); - BufferMesh<2, float> wires( - GL_LINES, - std::make_shared(), - std::make_shared>(wire_data.prims()), - std::make_shared>() - ); -// DirectMesh<2> wires(GL_LINES, wire_data); + auto wires = BufferMesh<2, float>(GL_LINES); + wires.ibo.put(wire_data.prims); const auto slice_dark = glm::vec3(.5, .3, .7); const auto slice_light = glm::vec3(.9, .9, .95); @@ -173,18 +161,29 @@ void run(GLFWwindow *window) { const auto slice_parts = poly_parts<4>(group); auto slice_data = merge(slice_parts); - auto slice_colors = std::vector(slice_data.size()); + auto slice_colors = std::vector(slice_data.size()); for (int i = 0, k = 0; i < slice_parts.size(); ++i) { auto fac = factor(i, slice_parts.size()); glm::vec3 color = glm::mix(slice_dark, slice_light, fac); for (int j = 0; j < slice_parts[i].size(); ++j, ++k) { - slice_colors[k] = glm::vec4(color, 1); + slice_colors[k] = color; } } - cgl::buffer slice_colors_buf(slice_colors); -// DeferredMesh<4> slices(slice_data, slice_colors_buf); + BufferMesh<4, glm::vec3> slices(GL_POINTS); + slices.ibo.put(slice_data.prims); + slices.vbo.put(slice_colors); + slices.vao.bound([&]() { + slices.ibo.bound(GL_ARRAY_BUFFER, [&]() { + glEnableVertexAttribArray(0); + glVertexAttribIPointer(0, 4, GL_UNSIGNED_INT, 0, nullptr); + slices.vbo.bound(GL_ARRAY_BUFFER, [&]() { + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, nullptr); + }); + }); + }); auto vbo = cgl::buffer(points(group)); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, vbo); @@ -207,12 +206,12 @@ void run(GLFWwindow *window) { glProgramUniform3f(sh.solid, 2, 0.3, 0.3, 0.3); proj_pipe.bound([&]() { - wires.draw(); + wires.draw_direct(); }); -// slice_pipe.bound([&]() { -// slices.draw(); -// }); + slice_pipe.bound([&]() { + slices.draw_deferred(); + }); glfwSwapInterval(2); glfwSwapBuffers(window);