mirror of
https://github.com/allemangD/toddcox-visualize.git
synced 2025-11-10 12:02:47 -05:00
binding test
This commit is contained in:
@@ -12,3 +12,8 @@ add_executable(vis src/main.cpp)
|
|||||||
target_include_directories(vis PRIVATE include)
|
target_include_directories(vis PRIVATE include)
|
||||||
target_link_libraries(vis PRIVATE tc glad glm glfw)
|
target_link_libraries(vis PRIVATE tc glad glm glfw)
|
||||||
add_dependencies(vis shaders)
|
add_dependencies(vis shaders)
|
||||||
|
|
||||||
|
add_executable(test src/test.cpp)
|
||||||
|
target_include_directories(test PRIVATE include)
|
||||||
|
target_link_libraries(test PRIVATE tc glad glm glfw)
|
||||||
|
add_dependencies(test shaders)
|
||||||
|
|||||||
@@ -46,6 +46,12 @@ namespace cgl {
|
|||||||
void put(const std::vector<T> &data, GLenum usage = GL_STATIC_DRAW) {
|
void put(const std::vector<T> &data, GLenum usage = GL_STATIC_DRAW) {
|
||||||
glNamedBufferData(id, sizeof(T) * data.size(), &data[0], usage);
|
glNamedBufferData(id, sizeof(T) * data.size(), &data[0], usage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bound(GLenum target, const std::function<void()> &action) const {
|
||||||
|
glBindBuffer(target, id);
|
||||||
|
action();
|
||||||
|
glBindBuffer(target, 0);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<GLenum mode>
|
template<GLenum mode>
|
||||||
@@ -248,8 +254,23 @@ namespace cgl {
|
|||||||
glUseProgramStages(id, GL_COMPUTE_SHADER_BIT, pgm);
|
glUseProgramStages(id, GL_COMPUTE_SHADER_BIT, pgm);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bound(const std::function<void()> &action) const {
|
||||||
|
glBindProgramPipeline(id);
|
||||||
|
action();
|
||||||
|
glBindProgramPipeline(0);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace sh {
|
||||||
|
using vert = shader<GL_VERTEX_SHADER>;
|
||||||
|
using tcs = shader<GL_TESS_CONTROL_SHADER>;
|
||||||
|
using tes = shader<GL_TESS_EVALUATION_SHADER>;
|
||||||
|
using geom = shader<GL_GEOMETRY_SHADER>;
|
||||||
|
using frag = shader<GL_FRAGMENT_SHADER>;
|
||||||
|
using comp = shader<GL_COMPUTE_SHADER>;
|
||||||
|
}
|
||||||
|
|
||||||
namespace pgm {
|
namespace pgm {
|
||||||
using vert = shaderprogram<GL_VERTEX_SHADER>;
|
using vert = shaderprogram<GL_VERTEX_SHADER>;
|
||||||
using tcs = shaderprogram<GL_TESS_CONTROL_SHADER>;
|
using tcs = shaderprogram<GL_TESS_CONTROL_SHADER>;
|
||||||
@@ -258,4 +279,34 @@ namespace cgl {
|
|||||||
using frag = shaderprogram<GL_FRAGMENT_SHADER>;
|
using frag = shaderprogram<GL_FRAGMENT_SHADER>;
|
||||||
using comp = shaderprogram<GL_COMPUTE_SHADER>;
|
using comp = shaderprogram<GL_COMPUTE_SHADER>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class vertexarray {
|
||||||
|
GLuint id{};
|
||||||
|
|
||||||
|
public:
|
||||||
|
vertexarray() {
|
||||||
|
glCreateVertexArrays(1, &id);
|
||||||
|
}
|
||||||
|
|
||||||
|
vertexarray(vertexarray &) = delete;
|
||||||
|
|
||||||
|
vertexarray(vertexarray &&o) noexcept {
|
||||||
|
id = std::exchange(o.id, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
~vertexarray() {
|
||||||
|
glDeleteVertexArrays(1, &id);
|
||||||
|
id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
operator GLuint() const {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void bound(const std::function<void()> &action) const {
|
||||||
|
glBindVertexArray(id);
|
||||||
|
action();
|
||||||
|
glBindVertexArray(0);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
16
vis/shaders/test/direct.glsl
Normal file
16
vis/shaders/test/direct.glsl
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#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;
|
||||||
|
}
|
||||||
15
vis/shaders/test/white.glsl
Normal file
15
vis/shaders/test/white.glsl
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#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);
|
||||||
|
}
|
||||||
107
vis/src/test.cpp
Normal file
107
vis/src/test.cpp
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
#include <glad/glad.h>
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
#include <cmath>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <glm/gtc/type_ptr.hpp>
|
||||||
|
|
||||||
|
#include <tc/groups.hpp>
|
||||||
|
|
||||||
|
#include "util.hpp"
|
||||||
|
#include "mirror.hpp"
|
||||||
|
#include "geometry.hpp"
|
||||||
|
|
||||||
|
#include <cgl/render.hpp>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
extern "C" {
|
||||||
|
__attribute__((unused)) __declspec(dllexport) int NvOptimusEnablement = 0x00000001;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct globals {
|
||||||
|
glm::mat4 proj = glm::identity<glm::mat4>();
|
||||||
|
float time = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
void run(GLFWwindow *window) {
|
||||||
|
auto direct = cgl::pgm::vert::file("shaders/test/direct.glsl");
|
||||||
|
auto white = cgl::pgm::frag::file("shaders/test/white.glsl");
|
||||||
|
|
||||||
|
auto pipe = cgl::pipeline();
|
||||||
|
pipe.stage(direct).stage(white);
|
||||||
|
|
||||||
|
auto vbo = cgl::buffer<float>({
|
||||||
|
-0.5, +0.866, 0, 1,
|
||||||
|
-0.5, -0.866, 0, 1,
|
||||||
|
+1.0, +0.000, 0, 1,
|
||||||
|
});
|
||||||
|
|
||||||
|
auto global_ubo = cgl::buffer<globals>();
|
||||||
|
glBindBufferBase(GL_UNIFORM_BUFFER, 0, global_ubo);
|
||||||
|
|
||||||
|
auto vao = cgl::vertexarray();
|
||||||
|
vao.bound([&]() {
|
||||||
|
vbo.bound(GL_ARRAY_BUFFER, [&]() {
|
||||||
|
glEnableVertexAttribArray(0);
|
||||||
|
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, nullptr);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
while (!glfwWindowShouldClose(window)) {
|
||||||
|
int width, height;
|
||||||
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
|
glViewport(0, 0, width, height);
|
||||||
|
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
auto aspect = (float) width / (float) height;
|
||||||
|
globals data;
|
||||||
|
data.time = (float) glfwGetTime();
|
||||||
|
data.proj = glm::ortho(-aspect, aspect, -1.0f, 1.0f);
|
||||||
|
global_ubo.put(data);
|
||||||
|
|
||||||
|
pipe.bound([&]() {
|
||||||
|
vao.bound([&]() {
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
glfwSwapBuffers(window);
|
||||||
|
|
||||||
|
glfwPollEvents();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
//region init window
|
||||||
|
if (!glfwInit()) {
|
||||||
|
std::cerr << "Failed to initialize GLFW" << std::endl;
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto window = glfwCreateWindow(
|
||||||
|
1920, 1080,
|
||||||
|
"Coset Visualization",
|
||||||
|
nullptr, nullptr);
|
||||||
|
|
||||||
|
if (!window) {
|
||||||
|
std::cerr << "Failed to create window" << std::endl;
|
||||||
|
glfwTerminate();
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwMakeContextCurrent(window);
|
||||||
|
gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
|
||||||
|
glfwSwapInterval(1);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
glfwSwapBuffers(window);
|
||||||
|
//endregion
|
||||||
|
|
||||||
|
std::cout << utilInfo();
|
||||||
|
|
||||||
|
run(window);
|
||||||
|
|
||||||
|
glfwTerminate();
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user