Copyright Matus Chochlik. Distributed under the Boost Software License, Version 1.0. See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt
#include "resources.hpp"
#include "main.hpp"
void volume_domain::init(example& e) {
auto& [gl, GL] = e.video().gl_api();
gl.delete_vertex_arrays.later_by(e, _tetrahedrons);
gl.gen_vertex_arrays() >> _tetrahedrons;
gl.bind_vertex_array(_tetrahedrons);
const auto corner_data = GL.int_.array(
0, 0, 0,
1, 0, 0,
0, 1, 0,
1, 1, 0,
0, 0, 1,
1, 0, 1,
0, 1, 1,
1, 1, 1);
gl.delete_buffers.later_by(e, _corners);
gl.gen_buffers() >> _corners;
gl.bind_buffer(GL.array_buffer, _corners);
gl.buffer_data(GL.array_buffer,
view(corner_data), GL.static_draw);
gl.vertex_attrib_ipointer(corner_loc(), 3, GL.int_);
gl.enable_vertex_attrib_array(corner_loc());
const unsigned A = 0, B = 1, C = 2, D = 3, E = 4, F = 5, G = 6, H = 7,
X = 255;
const auto index_data = GL.unsigned_int_.array(
A, B, D, H,
B, A, F, H,
E, A, G, H,
E, F, A, H,
A, C, G, H,
C, A, D, H
);
gl.delete_buffers.later_by(e, _indices);
gl.gen_buffers() >> _indices;
gl.bind_buffer(GL.element_array_buffer, _indices);
gl.buffer_data(GL.element_array_buffer,
view(index_data), GL.static_draw);
gl.delete_buffers.later_by(e, _field);
gl.gen_buffers() >> _field;
gl.bind_buffer(GL.shader_storage_buffer, _field);
gl.bind_buffer_base(GL.shader_storage_buffer, field_binding(), _field);
gl.buffer_storage(GL.shader_storage_buffer, vertex_count() * 32);
gl.delete_buffers.later_by(e, _metaballs);
gl.gen_buffers() >> _metaballs;
gl.bind_buffer(GL.shader_storage_buffer, _metaballs);
gl.bind_buffer_base(
GL.shader_storage_buffer, metaballs_binding(), _metaballs);
gl.buffer_storage(GL.shader_storage_buffer, 2048);
gl.clear_buffer_sub_data(
const auto config_data = GL.unsigned_int_.array(
X, X, X, X, X, X, X, X,
A, C, B, X, D, D, D, X,
B, D, A, X, C, C, C, X,
B, B, A, A, C, D, C, D,
A, D, C, X, B, B, B, X,
A, A, C, C, B, D, B, D,
A, A, D, D, C, B, C, B,
A, A, A, X, B, D, C, X,
C, D, B, X, A, A, A, X,
C, C, B, B, A, D, A, D,
B, D, B, D, C, C, A, A,
B, B, B, X, C, D, A, X,
C, D, C, D, A, A, B, B,
C, C, C, X, A, D, B, X,
D, D, D, X, A, B, C, X,
X, X, X, X, X, X, X, X);
gl.delete_buffers.later_by(e, _configs);
gl.gen_buffers() >> _configs;
gl.bind_buffer(GL.shader_storage_buffer, _configs);
gl.bind_buffer_base(GL.shader_storage_buffer, configs_binding(), _configs);
gl.buffer_data(GL.shader_storage_buffer,
view(config_data), GL.static_draw);
}
void volume_domain::compute(example& e) {
auto& gl = e.video().gl_api();
const auto groups = plane_count() / 4;
gl.dispatch_compute(groups, groups, groups);
}
void volume_domain::draw(example& e) {
auto& [gl, GL] = e.video().gl_api();
gl.draw_elements_instanced(
GL.lines_adjacency, 4 * 6, GL.unsigned_int_, nullptr, cube_count());
}
void metaball_program::init(example& e) {
auto& gl = e.video().gl_api();
gl.delete_program.later_by(e, _prog);
gl.create_program() >> _prog;
const auto prog_src{
gl.build_program(_prog, prog_src.unpack(e.ctx()));
gl.use_program(_prog);
}
void metaball_program::bind_metaballs(
example& e,
auto& gl = e.video().gl_api();
gl.get_shader_storage_block_index(_prog, "MetaballBlock") >> blk_idx;
gl.shader_storage_block_binding(_prog, blk_idx, binding);
}
void metaball_program::prepare_frame(example&) {}
void metaball_program::use(example& e) {
e.video().gl_api().use_program(_prog);
}
void field_program::init(example& e) {
auto& gl = e.video().gl_api();
gl.delete_program.later_by(e, _prog);
gl.create_program() >> _prog;
const auto prog_src{
gl.build_program(_prog, prog_src.unpack(e.ctx()));
gl.use_program(_prog);
gl.get_uniform_location(_prog, "PlaneCount") >> _plane_count_loc;
}
auto& gl = e.video().gl_api();
gl.get_shader_storage_block_index(_prog, "FieldBlock") >> blk_idx;
gl.shader_storage_block_binding(_prog, blk_idx, binding);
}
void field_program::bind_metaballs(
example& e,
auto& gl = e.video().gl_api();
gl.get_shader_storage_block_index(_prog, "MetaballBlock") >> blk_idx;
gl.shader_storage_block_binding(_prog, blk_idx, binding);
}
e.video().gl_api().set_uniform(_prog, _plane_count_loc, count);
}
void field_program::prepare_frame(example&) {}
void field_program::use(example& e) {
e.video().gl_api().use_program(_prog);
}
void surface_program::init(example& e) {
auto& gl = e.video().gl_api();
gl.delete_program.later_by(e, _prog);
gl.create_program() >> _prog;
const auto prog_src{
gl.build_program(_prog, prog_src.unpack(e.ctx()));
gl.use_program(_prog);
gl.get_uniform_location(_prog, "CameraMatrix") >> _camera_mat_loc;
gl.get_uniform_location(_prog, "PerspectiveMatrix") >> _perspective_mat_loc;
gl.get_uniform_location(_prog, "PlaneCount") >> _plane_count_loc;
gl.get_uniform_location(_prog, "DivCount") >> _div_count_loc;
}
void surface_program::prepare_frame(example& e) {
e.video().gl_api().set_uniform(
_prog, _camera_mat_loc, e.camera().transform_matrix());
e.video().gl_api().set_uniform(
_prog,
_perspective_mat_loc,
e.camera().perspective_matrix(e.video().surface_aspect()));
}
auto& gl = e.video().gl_api();
gl.get_shader_storage_block_index(_prog, "FieldBlock") >> blk_idx;
gl.shader_storage_block_binding(_prog, blk_idx, binding);
}
void surface_program::bind_configs(
example& e,
auto& gl = e.video().gl_api();
gl.get_shader_storage_block_index(_prog, "ConfigsBlock") >> blk_idx;
gl.shader_storage_block_binding(_prog, blk_idx, binding);
}
void surface_program::set_plane_count(
example& e,
e.video().gl_api().set_uniform(_prog, _plane_count_loc, count);
}
e.video().gl_api().set_uniform(_prog, _div_count_loc, count);
}
void surface_program::bind_corner_location(
example& e,
e.video().gl_api().bind_attrib_location(_prog, loc, "Corner");
}
void surface_program::use(example& e) {
e.video().gl_api().use_program(_prog);
}
}