#pragma once #include #include #include "log.h" #include "renderer_gl/opengl_capabilities.h" namespace pp::legacy::gl_mesh { inline void gen_opengl_buffers(std::uint32_t count, std::uint32_t* ids) noexcept { glGenBuffers(static_cast(count), reinterpret_cast(ids)); } inline void delete_opengl_buffers(std::uint32_t count, const std::uint32_t* ids) noexcept { glDeleteBuffers(static_cast(count), reinterpret_cast(ids)); } inline void bind_opengl_buffer(std::uint32_t target, std::uint32_t buffer) noexcept { glBindBuffer(static_cast(target), static_cast(buffer)); } inline void set_opengl_buffer_data( std::uint32_t target, std::intptr_t byte_count, const void* data, std::uint32_t usage) noexcept { glBufferData( static_cast(target), static_cast(byte_count), data, static_cast(usage)); } inline void gen_opengl_vertex_arrays(std::uint32_t count, std::uint32_t* ids) noexcept { glGenVertexArrays(static_cast(count), reinterpret_cast(ids)); } inline void delete_opengl_vertex_arrays(std::uint32_t count, const std::uint32_t* ids) noexcept { glDeleteVertexArrays(static_cast(count), reinterpret_cast(ids)); } inline void bind_opengl_vertex_array(std::uint32_t vertex_array) noexcept { glBindVertexArray(static_cast(vertex_array)); } inline void enable_opengl_vertex_attrib_array(std::uint32_t index) noexcept { glEnableVertexAttribArray(static_cast(index)); } inline void set_opengl_vertex_attrib_pointer( std::uint32_t index, std::int32_t component_count, std::uint32_t component_type, std::uint8_t normalized, std::int32_t stride, const void* offset) noexcept { glVertexAttribPointer( static_cast(index), static_cast(component_count), static_cast(component_type), static_cast(normalized), static_cast(stride), offset); } inline void draw_opengl_elements( std::uint32_t mode, std::int32_t count, std::uint32_t index_type, const void* index_offset) noexcept { glDrawElements( static_cast(mode), static_cast(count), static_cast(index_type), index_offset); } inline void draw_opengl_arrays(std::uint32_t mode, std::int32_t first, std::int32_t count) noexcept { glDrawArrays(static_cast(mode), static_cast(first), static_cast(count)); } inline pp::renderer::gl::OpenGlMeshCreateDispatch mesh_create_dispatch() noexcept { return pp::renderer::gl::OpenGlMeshCreateDispatch { .gen_buffers = gen_opengl_buffers, .bind_buffer = bind_opengl_buffer, .buffer_data = set_opengl_buffer_data, .gen_vertex_arrays = gen_opengl_vertex_arrays, .bind_vertex_array = bind_opengl_vertex_array, .enable_vertex_attrib_array = enable_opengl_vertex_attrib_array, .vertex_attrib_pointer = set_opengl_vertex_attrib_pointer, }; } inline pp::renderer::gl::OpenGlBufferUploadDispatch buffer_upload_dispatch() noexcept { return pp::renderer::gl::OpenGlBufferUploadDispatch { .bind_buffer = bind_opengl_buffer, .buffer_data = set_opengl_buffer_data, }; } inline pp::renderer::gl::OpenGlMeshDrawDispatch mesh_draw_dispatch() noexcept { return pp::renderer::gl::OpenGlMeshDrawDispatch { .bind_vertex_array = bind_opengl_vertex_array, .draw_elements = draw_opengl_elements, .draw_arrays = draw_opengl_arrays, }; } inline pp::renderer::gl::OpenGlMeshDeleteDispatch mesh_delete_dispatch() noexcept { return pp::renderer::gl::OpenGlMeshDeleteDispatch { .delete_buffers = delete_opengl_buffers, .delete_vertex_arrays = delete_opengl_vertex_arrays, }; } inline pp::renderer::gl::OpenGlMeshObjects create_mesh_objects( pp::renderer::gl::OpenGlMeshUpload upload, const char* context) { const auto mesh = pp::renderer::gl::create_opengl_mesh_objects(upload, mesh_create_dispatch()); if (!mesh.ok()) { LOG("%s failed because: %s", context, mesh.status().message); return {}; } return mesh.value(); } inline bool upload_buffer_data(pp::renderer::gl::OpenGlBufferUpload upload, const char* context) { const auto status = pp::renderer::gl::upload_opengl_buffer_data(upload, buffer_upload_dispatch()); if (!status.ok()) { LOG("%s failed because: %s", context, status.message); return false; } return true; } inline bool draw_mesh(pp::renderer::gl::OpenGlMeshDraw draw, const char* context) { const auto status = pp::renderer::gl::draw_opengl_mesh(draw, mesh_draw_dispatch()); if (!status.ok()) { LOG("%s failed because: %s", context, status.message); return false; } return true; } inline bool delete_mesh_objects( std::array buffers, std::array vertex_arrays, const char* context) { const auto status = pp::renderer::gl::delete_opengl_mesh_objects( pp::renderer::gl::OpenGlMeshDelete { .buffers = buffers, .vertex_arrays = vertex_arrays, }, mesh_delete_dispatch()); if (!status.ok()) { LOG("%s failed because: %s", context, status.message); return false; } return true; } } // namespace pp::legacy::gl_mesh