#include #include namespace psemek::gfx { namespace detail { void check_vertex_size(std::size_t vertex_size, std::size_t stride) { if (vertex_size != stride) throw std::runtime_error(util::to_string("Vertex size (", vertex_size, ") not equal to sum of attribute sizes (", stride, ")")); } void check_instance_size(std::size_t instance_size, std::size_t stride) { if (instance_size != stride) throw std::runtime_error(util::to_string("Instance size (", instance_size, ") not equal to sum of instanced attribute sizes (", stride, ")")); } } mesh mesh::null() { return mesh(0); } mesh::mesh() { gl::GenVertexArrays(1, &array_); gl::GenBuffers(1, &buffer_); } mesh::mesh(mesh && other) { array_ = other.array_; buffer_ = other.buffer_; count_ = other.count_; stride_ = other.stride_; primitive_type_ = other.primitive_type_; other.array_ = 0; other.buffer_ = 0; other.count_ = 0; other.stride_ = 0; } mesh & mesh::operator =(mesh && other) { if (this == &other) return *this; if (array_) { gl::DeleteVertexArrays(1, &array_); gl::DeleteBuffers(1, &buffer_); } array_ = other.array_; buffer_ = other.buffer_; count_ = other.count_; stride_ = other.stride_; primitive_type_ = other.primitive_type_; other.array_ = 0; other.buffer_ = 0; other.count_ = 0; other.stride_ = 0; return *this; } mesh::~mesh() { gl::DeleteVertexArrays(1, &array_); gl::DeleteBuffers(1, &buffer_); } mesh::mesh(int) { array_ = 0; buffer_ = 0; } indexed_mesh indexed_mesh::null() { return indexed_mesh(0); } indexed_mesh::indexed_mesh() { gl::GenVertexArrays(1, &array_); gl::GenBuffers(1, &buffer_); gl::GenBuffers(1, &index_buffer_); } indexed_mesh::indexed_mesh(indexed_mesh && other) { array_ = other.array_; buffer_ = other.buffer_; index_buffer_ = other.index_buffer_; count_ = other.count_; index_type_ = other.index_type_; stride_ = other.stride_; primitive_type_ = other.primitive_type_; other.array_ = 0; other.buffer_ = 0; other.index_buffer_ = 0; other.count_ = 0; other.index_type_ = 0; other.stride_ = 0; } indexed_mesh & indexed_mesh::operator =(indexed_mesh && other) { if (this == &other) return *this; if (array_) { gl::DeleteVertexArrays(1, &array_); gl::DeleteBuffers(1, &buffer_); gl::DeleteBuffers(1, &index_buffer_); } array_ = other.array_; buffer_ = other.buffer_; index_buffer_ = other.index_buffer_; count_ = other.count_; index_type_ = other.index_type_; stride_ = other.stride_; primitive_type_ = other.primitive_type_; other.array_ = 0; other.buffer_ = 0; other.index_buffer_ = 0; other.count_ = 0; other.index_type_ = 0; other.stride_ = 0; return *this; } indexed_mesh::~indexed_mesh() { gl::DeleteVertexArrays(1, &array_); gl::DeleteBuffers(1, &buffer_); gl::DeleteBuffers(1, &index_buffer_); } indexed_mesh::indexed_mesh(int) { array_ = 0; buffer_ = 0; index_buffer_ = 0; } instanced_mesh instanced_mesh::null() { return instanced_mesh(0); } instanced_mesh::instanced_mesh() { gl::GenVertexArrays(1, &array_); gl::GenBuffers(1, &buffer_); gl::GenBuffers(1, &instance_buffer_); } instanced_mesh::instanced_mesh(instanced_mesh && other) { array_ = other.array_; buffer_ = other.buffer_; instance_buffer_ = other.instance_buffer_; count_ = other.count_; instance_count_ = other.instance_count_; stride_ = other.stride_; instance_stride_ = other.instance_stride_; primitive_type_ = other.primitive_type_; other.array_ = 0; other.buffer_ = 0; other.instance_buffer_ = 0; other.count_ = 0; other.instance_count_ = 0; other.stride_ = 0; other.instance_stride_ = 0; } instanced_mesh & instanced_mesh::operator = (instanced_mesh && other) { if (this == &other) return *this; gl::DeleteVertexArrays(1, &array_); gl::DeleteBuffers(1, &buffer_); gl::DeleteBuffers(1, &instance_buffer_); array_ = other.array_; buffer_ = other.buffer_; instance_buffer_ = other.instance_buffer_; count_ = other.count_; instance_count_ = other.instance_count_; stride_ = other.stride_; instance_stride_ = other.instance_stride_; primitive_type_ = other.primitive_type_; other.array_ = 0; other.buffer_ = 0; other.instance_buffer_ = 0; other.count_ = 0; other.instance_count_ = 0; other.stride_ = 0; other.instance_stride_ = 0; return *this; } instanced_mesh::~instanced_mesh() { gl::DeleteVertexArrays(1, &array_); gl::DeleteBuffers(1, &buffer_); gl::DeleteBuffers(1, &instance_buffer_); } instanced_mesh::instanced_mesh(int) { array_ = 0; buffer_ = 0; instance_buffer_ = 0; } instanced_indexed_mesh instanced_indexed_mesh::null() { return instanced_indexed_mesh(0); } instanced_indexed_mesh::instanced_indexed_mesh() { gl::GenVertexArrays(1, &array_); gl::GenBuffers(1, &buffer_); gl::GenBuffers(1, &index_buffer_); gl::GenBuffers(1, &instance_buffer_); } instanced_indexed_mesh::instanced_indexed_mesh(instanced_indexed_mesh && other) { array_ = other.array_; buffer_ = other.buffer_; instance_buffer_ = other.instance_buffer_; count_ = other.count_; instance_count_ = other.instance_count_; stride_ = other.stride_; instance_stride_ = other.instance_stride_; primitive_type_ = other.primitive_type_; other.array_ = 0; other.buffer_ = 0; other.instance_buffer_ = 0; other.count_ = 0; other.instance_count_ = 0; other.stride_ = 0; other.instance_stride_ = 0; } instanced_indexed_mesh & instanced_indexed_mesh::operator = (instanced_indexed_mesh && other) { if (this == &other) return *this; gl::DeleteVertexArrays(1, &array_); gl::DeleteBuffers(1, &buffer_); gl::DeleteBuffers(1, &index_buffer_); gl::DeleteBuffers(1, &instance_buffer_); array_ = other.array_; buffer_ = other.buffer_; instance_buffer_ = other.instance_buffer_; count_ = other.count_; instance_count_ = other.instance_count_; stride_ = other.stride_; instance_stride_ = other.instance_stride_; primitive_type_ = other.primitive_type_; other.array_ = 0; other.buffer_ = 0; other.instance_buffer_ = 0; other.count_ = 0; other.instance_count_ = 0; other.stride_ = 0; other.instance_stride_ = 0; return *this; } instanced_indexed_mesh::~instanced_indexed_mesh() { gl::DeleteVertexArrays(1, &array_); gl::DeleteBuffers(1, &buffer_); gl::DeleteBuffers(1, &index_buffer_); gl::DeleteBuffers(1, &instance_buffer_); } instanced_indexed_mesh::instanced_indexed_mesh(int) { array_ = 0; buffer_ = 0; index_buffer_ = 0; instance_buffer_ = 0; } }