mirror of
https://github.com/allemangD/toddcox-visualize.git
synced 2025-11-10 12:02:47 -05:00
WIP: introduce Slice alias
This commit is contained in:
@@ -48,7 +48,10 @@ namespace vis {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename Str_>
|
||||||
struct VBOs {
|
struct VBOs {
|
||||||
|
using Str = Str_;
|
||||||
|
|
||||||
struct Uniform {
|
struct Uniform {
|
||||||
Eigen::Matrix4f linear;
|
Eigen::Matrix4f linear;
|
||||||
Eigen::Vector4f translation;
|
Eigen::Vector4f translation;
|
||||||
@@ -58,15 +61,16 @@ namespace vis {
|
|||||||
unsigned int count, instanceCount, first, baseInstance;
|
unsigned int count, instanceCount, first, baseInstance;
|
||||||
};
|
};
|
||||||
|
|
||||||
cgl::Buffer<Structure<5, 4, 4>::Vertex> vertices;
|
cgl::Buffer<typename Str::Vertex> vertices;
|
||||||
cgl::Buffer<Structure<5, 4, 4>::Color> colors;
|
cgl::Buffer<typename Str::Color> colors;
|
||||||
cgl::Buffer<Structure<5, 4, 4>::Cell> indices;
|
cgl::Buffer<typename Str::Cell> indices;
|
||||||
cgl::Buffer<Uniform> uniform;
|
cgl::Buffer<Uniform> uniform;
|
||||||
cgl::Buffer<Command> commands;
|
cgl::Buffer<Command> commands;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename Str>
|
||||||
void upload_structure(entt::registry ®istry) {
|
void upload_structure(entt::registry ®istry) {
|
||||||
auto view = registry.view<Structure<5, 4, 4>, VBOs>();
|
auto view = registry.view<Str, VBOs<Str>>();
|
||||||
|
|
||||||
for (auto [entity, structure, vbos]: view.each()) {
|
for (auto [entity, structure, vbos]: view.each()) {
|
||||||
auto vertices = structure.points.verts.colwise();
|
auto vertices = structure.points.verts.colwise();
|
||||||
@@ -77,12 +81,13 @@ namespace vis {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename Str>
|
||||||
void upload_uniforms(entt::registry ®istry) {
|
void upload_uniforms(entt::registry ®istry) {
|
||||||
auto view = registry.view<Structure<5, 4, 4>, VBOs>();
|
auto view = registry.view<Str, VBOs<Str>>();
|
||||||
|
|
||||||
for (auto [entity, structure, vbos]: view.each()) {
|
for (auto [entity, structure, vbos]: view.each()) {
|
||||||
auto colors = structure.colors;
|
auto colors = structure.colors;
|
||||||
VBOs::Uniform uniform{
|
typename VBOs<Str>::Uniform uniform{
|
||||||
structure.transform.linear(),
|
structure.transform.linear(),
|
||||||
structure.transform.translation(),
|
structure.transform.translation(),
|
||||||
};
|
};
|
||||||
@@ -92,13 +97,14 @@ namespace vis {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename Str>
|
||||||
void upload_commands(entt::registry ®istry) {
|
void upload_commands(entt::registry ®istry) {
|
||||||
auto view = registry.view<Structure<5, 4, 4>, VBOs>();
|
auto view = registry.view<Str, VBOs<Str>>();
|
||||||
|
|
||||||
for (auto [entity, structure, vbos]: view.each()) {
|
for (auto [entity, structure, vbos]: view.each()) {
|
||||||
const auto &tilings = structure.hull.tilings;
|
const auto &tilings = structure.hull.tilings;
|
||||||
|
|
||||||
std::vector<VBOs::Command> commands;
|
std::vector<typename VBOs<Str>::Command> commands;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < tilings.size(); ++i) {
|
for (unsigned int i = 0; i < tilings.size(); ++i) {
|
||||||
if (structure.enabled[i]) {
|
if (structure.enabled[i]) {
|
||||||
@@ -111,7 +117,10 @@ namespace vis {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename Str_>
|
||||||
struct SliceRenderer {
|
struct SliceRenderer {
|
||||||
|
using Str = Str_;
|
||||||
|
|
||||||
cgl::pgm::vert defer = cgl::pgm::vert(shaders::deferred_vs_glsl);
|
cgl::pgm::vert defer = cgl::pgm::vert(shaders::deferred_vs_glsl);
|
||||||
cgl::pgm::geom slice = cgl::pgm::geom(shaders::slice_gm_glsl);
|
cgl::pgm::geom slice = cgl::pgm::geom(shaders::slice_gm_glsl);
|
||||||
cgl::pgm::frag solid = cgl::pgm::frag(shaders::solid_fs_glsl);
|
cgl::pgm::frag solid = cgl::pgm::frag(shaders::solid_fs_glsl);
|
||||||
@@ -132,11 +141,9 @@ namespace vis {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void operator()(entt::registry ®) {
|
void operator()(entt::registry ®) {
|
||||||
auto view = reg.view<VBOs>();
|
auto view = reg.view<VBOs<Str>>();
|
||||||
|
|
||||||
for (auto [entity, vbos]: view.each()) {
|
for (auto [entity, vbos]: view.each()) {
|
||||||
const size_t N = 4;
|
|
||||||
|
|
||||||
glBindProgramPipeline(pipe);
|
glBindProgramPipeline(pipe);
|
||||||
|
|
||||||
glBindBufferBase(GL_UNIFORM_BUFFER, 2, vbos.uniform);
|
glBindBufferBase(GL_UNIFORM_BUFFER, 2, vbos.uniform);
|
||||||
|
|||||||
@@ -145,7 +145,8 @@ int run(GLFWwindow* window, ImGuiContext* ctx) {
|
|||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
vis::SliceRenderer renderer;
|
using Slice = vis::Structure<5, 4, 4>;
|
||||||
|
vis::SliceRenderer<Slice> renderer;
|
||||||
|
|
||||||
State state{};
|
State state{};
|
||||||
glfwSetWindowUserPointer(window, &state);
|
glfwSetWindowUserPointer(window, &state);
|
||||||
@@ -153,8 +154,6 @@ int run(GLFWwindow* window, ImGuiContext* ctx) {
|
|||||||
auto ®istry = state.registry;
|
auto ®istry = state.registry;
|
||||||
state.dimension = 4;
|
state.dimension = 4;
|
||||||
|
|
||||||
using Slice = vis::Structure<5, 4, 4>;
|
|
||||||
|
|
||||||
auto entity = registry.create();
|
auto entity = registry.create();
|
||||||
{
|
{
|
||||||
// todo move symbol and root to structure
|
// todo move symbol and root to structure
|
||||||
@@ -165,12 +164,12 @@ int run(GLFWwindow* window, ImGuiContext* ctx) {
|
|||||||
Hull<4> hull(group);
|
Hull<4> hull(group);
|
||||||
|
|
||||||
auto &structure = registry.emplace<Slice>(entity, std::move(points), std::move(hull));
|
auto &structure = registry.emplace<Slice>(entity, std::move(points), std::move(hull));
|
||||||
registry.emplace<vis::VBOs>(entity);
|
registry.emplace<vis::VBOs<Slice>>(entity);
|
||||||
|
|
||||||
structure.enabled[0] = false; // disable {0,1,2} cells
|
structure.enabled[0] = false; // disable {0,1,2} cells
|
||||||
}
|
}
|
||||||
|
|
||||||
vis::upload_structure(registry);
|
vis::upload_structure<Slice>(registry);
|
||||||
|
|
||||||
auto ubo = cgl::Buffer<Matrices>();
|
auto ubo = cgl::Buffer<Matrices>();
|
||||||
glBindBufferBase(GL_UNIFORM_BUFFER, 1, ubo);
|
glBindBufferBase(GL_UNIFORM_BUFFER, 1, ubo);
|
||||||
@@ -229,8 +228,8 @@ int run(GLFWwindow* window, ImGuiContext* ctx) {
|
|||||||
tform.translation().w() = std::sin(state.time * 1.4) * 1.0;
|
tform.translation().w() = std::sin(state.time * 1.4) * 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
vis::upload_commands(registry);
|
vis::upload_commands<Slice>(registry);
|
||||||
vis::upload_uniforms(registry);
|
vis::upload_uniforms<Slice>(registry);
|
||||||
|
|
||||||
renderer(registry);
|
renderer(registry);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user