Add kinda hacky fbo and rbo
This commit is contained in:
parent
ffa2b06ff2
commit
fe31a9568f
62
include/graphics/fbo.hpp
Normal file
62
include/graphics/fbo.hpp
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/**
|
||||||
|
This file is a part of our_dick
|
||||||
|
Copyright (C) 2020 rexy712
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OUR_DICK_GRAPHICS_FBO_HPP
|
||||||
|
#define OUR_DICK_GRAPHICS_FBO_HPP
|
||||||
|
|
||||||
|
#include "gl_include.hpp"
|
||||||
|
#include "gl_buffers.hpp"
|
||||||
|
#include "texture.hpp"
|
||||||
|
#include "rbo.hpp"
|
||||||
|
|
||||||
|
namespace gfx{
|
||||||
|
|
||||||
|
class fbo
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
GLuint m_buffer;
|
||||||
|
frame_buffer_iface m_draw;
|
||||||
|
frame_buffer_iface m_read;
|
||||||
|
|
||||||
|
public:
|
||||||
|
fbo();
|
||||||
|
fbo(const fbo&) = delete;
|
||||||
|
fbo(fbo&& f);
|
||||||
|
~fbo();
|
||||||
|
|
||||||
|
fbo& operator=(const fbo&) = delete;
|
||||||
|
fbo& operator=(fbo&& f);
|
||||||
|
|
||||||
|
GLuint raw()const;
|
||||||
|
|
||||||
|
bool detach(GLenum point);
|
||||||
|
bool attach(const texture& tex, GLenum point);
|
||||||
|
bool attach(const rbo& r, GLenum point);
|
||||||
|
|
||||||
|
bool bind(gl_frame_buffer& b)const;
|
||||||
|
bool bind_lock(gl_frame_buffer& b)const;
|
||||||
|
void bind_unlock(gl_frame_buffer& b)const;
|
||||||
|
void unbind()const;
|
||||||
|
|
||||||
|
gl_frame_buffer* get_bound_buffer()const;
|
||||||
|
GLenum get_bound_id()const;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -24,6 +24,7 @@
|
|||||||
namespace gfx{
|
namespace gfx{
|
||||||
|
|
||||||
class gl_buffer;
|
class gl_buffer;
|
||||||
|
class gl_frame_buffer;
|
||||||
|
|
||||||
//handle interfacing with the gl_buffer objects. Used as intermediary so that multiple classes have the ability to
|
//handle interfacing with the gl_buffer objects. Used as intermediary so that multiple classes have the ability to
|
||||||
//access gl_buffers easily
|
//access gl_buffers easily
|
||||||
@ -55,17 +56,38 @@ namespace gfx{
|
|||||||
//get access to opengl target buffer
|
//get access to opengl target buffer
|
||||||
gl_buffer* get_bound_buffer()const;
|
gl_buffer* get_bound_buffer()const;
|
||||||
};
|
};
|
||||||
|
class frame_buffer_iface : protected buffer_iface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
frame_buffer_iface() = default;
|
||||||
|
frame_buffer_iface(const frame_buffer_iface&) = default;
|
||||||
|
frame_buffer_iface(frame_buffer_iface&&) = default;
|
||||||
|
~frame_buffer_iface() = default;
|
||||||
|
|
||||||
|
frame_buffer_iface& operator=(const frame_buffer_iface&) = default;
|
||||||
|
frame_buffer_iface& operator=(frame_buffer_iface&&) = default;
|
||||||
|
|
||||||
|
bool bind(gl_frame_buffer& b)const;
|
||||||
|
bool bind_lock(gl_frame_buffer& b)const;
|
||||||
|
|
||||||
|
using buffer_iface::unlock;
|
||||||
|
using buffer_iface::unbind;
|
||||||
|
using buffer_iface::is_locked;
|
||||||
|
using buffer_iface::get_bound_id;
|
||||||
|
|
||||||
|
gl_frame_buffer* get_bound_buffer()const;
|
||||||
|
};
|
||||||
|
|
||||||
//Manage active opengl buffers and targets
|
//Manage active opengl buffers and targets
|
||||||
class gl_buffer
|
class gl_buffer
|
||||||
{
|
{
|
||||||
friend class buffer; //access to constructor/destructor
|
friend class buffer; //access to constructor/destructor
|
||||||
friend class buffer_iface; //access to bind
|
friend class buffer_iface; //access to bind
|
||||||
private:
|
protected:
|
||||||
const buffer_iface* bound = nullptr; //vbo bound to this buffer
|
const buffer_iface* bound = nullptr; //vbo bound to this buffer
|
||||||
const GLenum m_buffer; //target this object represents
|
const GLenum m_buffer; //target this object represents
|
||||||
bool m_lock = false; //if the target disallows ownership changes
|
bool m_lock = false; //if the target disallows ownership changes
|
||||||
private:
|
protected:
|
||||||
gl_buffer(GLenum buf);
|
gl_buffer(GLenum buf);
|
||||||
~gl_buffer() = default;
|
~gl_buffer() = default;
|
||||||
void bind(const buffer_iface* newbind);
|
void bind(const buffer_iface* newbind);
|
||||||
@ -75,6 +97,16 @@ namespace gfx{
|
|||||||
//return id of the target this represents
|
//return id of the target this represents
|
||||||
GLenum get_buffer_id()const;
|
GLenum get_buffer_id()const;
|
||||||
};
|
};
|
||||||
|
class gl_frame_buffer : protected gl_buffer
|
||||||
|
{
|
||||||
|
friend class framebuffer;
|
||||||
|
friend class frame_buffer_iface;
|
||||||
|
protected:
|
||||||
|
using gl_buffer::gl_buffer;
|
||||||
|
~gl_frame_buffer() = default;
|
||||||
|
public:
|
||||||
|
using gl_buffer::get_buffer_id;
|
||||||
|
};
|
||||||
|
|
||||||
class buffer //glorified namespace for added access control
|
class buffer //glorified namespace for added access control
|
||||||
{
|
{
|
||||||
@ -99,6 +131,16 @@ namespace gfx{
|
|||||||
buffer() = default;
|
buffer() = default;
|
||||||
~buffer() = default;
|
~buffer() = default;
|
||||||
};
|
};
|
||||||
|
class framebuffer
|
||||||
|
{
|
||||||
|
//list of all the standard opengl framebuffer targets
|
||||||
|
public:
|
||||||
|
static inline gl_frame_buffer draw{GL_DRAW_FRAMEBUFFER};
|
||||||
|
static inline gl_frame_buffer read{GL_READ_FRAMEBUFFER};
|
||||||
|
private:
|
||||||
|
framebuffer() = default;
|
||||||
|
~framebuffer() = default;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
58
include/graphics/rbo.hpp
Normal file
58
include/graphics/rbo.hpp
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/**
|
||||||
|
This file is a part of our_dick
|
||||||
|
Copyright (C) 2020 rexy712
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OUR_DICK_GRAPHICS_RBO_HPP
|
||||||
|
#define OUR_DICK_GRAPHICS_RBO_HPP
|
||||||
|
|
||||||
|
#include "gl_include.hpp"
|
||||||
|
|
||||||
|
namespace gfx{
|
||||||
|
|
||||||
|
class rbo
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
GLuint m_buffer;
|
||||||
|
GLenum m_format;
|
||||||
|
GLsizei m_width;
|
||||||
|
GLsizei m_height;
|
||||||
|
|
||||||
|
public:
|
||||||
|
rbo(GLsizei width, GLsizei height, GLenum format, GLsizei samples = 0);
|
||||||
|
rbo(const rbo& r) = delete;
|
||||||
|
rbo(rbo&& r);
|
||||||
|
~rbo();
|
||||||
|
|
||||||
|
rbo& operator=(const rbo& r) = delete;
|
||||||
|
rbo& operator=(rbo&& r);
|
||||||
|
|
||||||
|
GLuint raw()const;
|
||||||
|
|
||||||
|
void bind()const;
|
||||||
|
void unbind()const;
|
||||||
|
|
||||||
|
void resize(GLsizei w, GLsizei h);
|
||||||
|
void reformat(GLenum format);
|
||||||
|
|
||||||
|
GLsizei get_width()const;
|
||||||
|
GLsizei get_height()const;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -68,6 +68,8 @@ namespace gfx{
|
|||||||
texture& operator=(const texture&) = delete;
|
texture& operator=(const texture&) = delete;
|
||||||
texture& operator=(texture&&);
|
texture& operator=(texture&&);
|
||||||
|
|
||||||
|
GLuint raw()const;
|
||||||
|
|
||||||
//overwrite the current image data with 'i'
|
//overwrite the current image data with 'i'
|
||||||
bool set_image(const image& i);
|
bool set_image(const image& i);
|
||||||
|
|
||||||
|
|||||||
@ -43,6 +43,8 @@ namespace gfx{
|
|||||||
vao& operator=(const vao&) = delete;
|
vao& operator=(const vao&) = delete;
|
||||||
vao& operator=(vao&&);
|
vao& operator=(vao&&);
|
||||||
|
|
||||||
|
GLuint raw()const;
|
||||||
|
|
||||||
//Get access to a generic vertex attribute within this vao
|
//Get access to a generic vertex attribute within this vao
|
||||||
vertex_attribute get_attribute(int index);
|
vertex_attribute get_attribute(int index);
|
||||||
|
|
||||||
|
|||||||
@ -80,6 +80,8 @@ namespace gfx{
|
|||||||
//change capacity of buffer
|
//change capacity of buffer
|
||||||
void resize(size_t newcap);
|
void resize(size_t newcap);
|
||||||
|
|
||||||
|
GLuint raw()const;
|
||||||
|
|
||||||
//glMapBuffer to given target with map style 'm'
|
//glMapBuffer to given target with map style 'm'
|
||||||
scoped_vbo_map<void> map(gl_buffer& target, maptype m)const;
|
scoped_vbo_map<void> map(gl_buffer& target, maptype m)const;
|
||||||
|
|
||||||
|
|||||||
115
src/graphics/fbo.cpp
Normal file
115
src/graphics/fbo.cpp
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
/**
|
||||||
|
This file is a part of our_dick
|
||||||
|
Copyright (C) 2020 rexy712
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "graphics/fbo.hpp"
|
||||||
|
#include <utility> //swap, exchange
|
||||||
|
|
||||||
|
namespace gfx{
|
||||||
|
|
||||||
|
fbo::fbo(){
|
||||||
|
glGenFramebuffers(1, &m_buffer);
|
||||||
|
}
|
||||||
|
fbo::fbo(fbo&& f):
|
||||||
|
m_buffer(std::exchange(f.m_buffer, 0)){}
|
||||||
|
fbo::~fbo(){
|
||||||
|
if(m_buffer)
|
||||||
|
glDeleteFramebuffers(1, &m_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
fbo& fbo::operator=(fbo&& f){
|
||||||
|
std::swap(m_buffer, f.m_buffer);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint fbo::raw()const{
|
||||||
|
return m_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool fbo::detach(GLenum point){
|
||||||
|
if(!bind(framebuffer::draw))
|
||||||
|
return false;
|
||||||
|
glFramebufferRenderbuffer(m_draw.get_bound_id(), point, GL_RENDERBUFFER, 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool fbo::attach(const texture& tex, GLenum point){
|
||||||
|
if(!bind(framebuffer::draw))
|
||||||
|
return false;
|
||||||
|
glFramebufferTexture2D(m_draw.get_bound_id(), point, GL_TEXTURE_2D, tex.raw(), 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool fbo::attach(const rbo& r, GLenum point){
|
||||||
|
if(!bind(framebuffer::draw))
|
||||||
|
return false;
|
||||||
|
glFramebufferRenderbuffer(m_draw.get_bound_id(), point, GL_RENDERBUFFER, r.raw());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool fbo::bind(gl_frame_buffer& b)const{
|
||||||
|
if(GL_DRAW_FRAMEBUFFER == b.get_buffer_id()){
|
||||||
|
if(!m_draw.bind(b))
|
||||||
|
return false;
|
||||||
|
}else{
|
||||||
|
if(!m_read.bind(b))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
glBindFramebuffer(b.get_buffer_id(), m_buffer);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool fbo::bind_lock(gl_frame_buffer& b)const{
|
||||||
|
if(GL_DRAW_FRAMEBUFFER == b.get_buffer_id()){
|
||||||
|
if(!m_draw.bind_lock(b))
|
||||||
|
return false;
|
||||||
|
}else{
|
||||||
|
if(!m_read.bind_lock(b))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
glBindFramebuffer(b.get_buffer_id(), m_buffer);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void fbo::bind_unlock(gl_frame_buffer& b)const{
|
||||||
|
if(GL_DRAW_FRAMEBUFFER == b.get_buffer_id()){
|
||||||
|
m_draw.unlock();
|
||||||
|
}else{
|
||||||
|
m_read.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void fbo::unbind()const{
|
||||||
|
if(m_draw.get_bound_buffer() && m_read.get_bound_buffer()){
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
m_draw.unbind();
|
||||||
|
m_read.unbind();
|
||||||
|
}else if(m_draw.get_bound_buffer()){
|
||||||
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||||
|
m_draw.unbind();
|
||||||
|
}else if(m_read.get_bound_buffer()){
|
||||||
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
|
||||||
|
m_read.unbind();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GLenum fbo::get_bound_id()const{
|
||||||
|
if(m_read.get_bound_buffer() && m_draw.get_bound_buffer())
|
||||||
|
return GL_FRAMEBUFFER;
|
||||||
|
if(m_read.get_bound_buffer())
|
||||||
|
return m_read.get_bound_id();
|
||||||
|
if(m_draw.get_bound_buffer())
|
||||||
|
return m_draw.get_bound_id();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -95,6 +95,18 @@ namespace gfx{
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool frame_buffer_iface::bind(gl_frame_buffer& b)const{
|
||||||
|
return buffer_iface::bind(b);
|
||||||
|
}
|
||||||
|
bool frame_buffer_iface::bind_lock(gl_frame_buffer& b)const{
|
||||||
|
return buffer_iface::bind_lock(b);
|
||||||
|
}
|
||||||
|
gl_frame_buffer* frame_buffer_iface::get_bound_buffer()const{
|
||||||
|
return static_cast<gl_frame_buffer*>(buffer_iface::get_bound_buffer());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
gl_buffer::gl_buffer(GLenum buf):
|
gl_buffer::gl_buffer(GLenum buf):
|
||||||
m_buffer(buf){}
|
m_buffer(buf){}
|
||||||
void gl_buffer::bind(const buffer_iface* newbind){
|
void gl_buffer::bind(const buffer_iface* newbind){
|
||||||
|
|||||||
77
src/graphics/rbo.cpp
Normal file
77
src/graphics/rbo.cpp
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
/**
|
||||||
|
This file is a part of our_dick
|
||||||
|
Copyright (C) 2020 rexy712
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "graphics/rbo.hpp"
|
||||||
|
#include <utility> //swap, exchange
|
||||||
|
|
||||||
|
namespace gfx{
|
||||||
|
|
||||||
|
rbo::rbo(GLsizei width, GLsizei height, GLenum format, GLsizei samples):
|
||||||
|
m_format(format),
|
||||||
|
m_width(width),
|
||||||
|
m_height(height)
|
||||||
|
{
|
||||||
|
glGenRenderbuffers(1, &m_buffer);
|
||||||
|
bind();
|
||||||
|
glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, m_format, m_width, m_height);
|
||||||
|
unbind();
|
||||||
|
}
|
||||||
|
rbo::rbo(rbo&& r):
|
||||||
|
m_buffer(std::exchange(r.m_buffer, 0)),
|
||||||
|
m_format(r.m_format),
|
||||||
|
m_width(r.m_width),
|
||||||
|
m_height(r.m_height){}
|
||||||
|
rbo::~rbo(){
|
||||||
|
if(m_buffer)
|
||||||
|
glDeleteRenderbuffers(1, &m_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
rbo& rbo::operator=(rbo&& r){
|
||||||
|
std::swap(m_buffer, r.m_buffer);
|
||||||
|
m_format = r.m_format;
|
||||||
|
m_width = r.m_width;
|
||||||
|
m_height = r.m_height;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint rbo::raw()const{
|
||||||
|
return m_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rbo::bind()const{
|
||||||
|
glBindRenderbuffer(GL_RENDERBUFFER, m_buffer);
|
||||||
|
}
|
||||||
|
void rbo::unbind()const{
|
||||||
|
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void rbo::resize(GLsizei w, GLsizei h){
|
||||||
|
*this = rbo(w, h, m_format);
|
||||||
|
}
|
||||||
|
void rbo::reformat(GLenum format){
|
||||||
|
*this = rbo(m_width, m_height, format);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLsizei rbo::get_width()const{
|
||||||
|
return m_width;
|
||||||
|
}
|
||||||
|
GLsizei rbo::get_height()const{
|
||||||
|
return m_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -40,6 +40,9 @@ namespace gfx{
|
|||||||
std::swap(m_tex_id, t.m_tex_id);
|
std::swap(m_tex_id, t.m_tex_id);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
GLuint texture::raw()const{
|
||||||
|
return m_tex_id;
|
||||||
|
}
|
||||||
|
|
||||||
bool texture::set_image(const image& i){
|
bool texture::set_image(const image& i){
|
||||||
if(!i)
|
if(!i)
|
||||||
|
|||||||
@ -228,6 +228,10 @@ namespace gfx{
|
|||||||
std::swap(m_buffer, v.m_buffer);
|
std::swap(m_buffer, v.m_buffer);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
GLuint vao::raw()const{
|
||||||
|
return m_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
vertex_attribute vao::get_attribute(int index){
|
vertex_attribute vao::get_attribute(int index){
|
||||||
return vertex_attribute(m_buffer, index);
|
return vertex_attribute(m_buffer, index);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -100,6 +100,9 @@ namespace gfx{
|
|||||||
copy_buffer(tmp, *this);
|
copy_buffer(tmp, *this);
|
||||||
*this = std::move(tmp);
|
*this = std::move(tmp);
|
||||||
}
|
}
|
||||||
|
GLuint vbo::raw()const{
|
||||||
|
return m_buffer;
|
||||||
|
}
|
||||||
scoped_vbo_map<void> vbo::map(gl_buffer& target, maptype m)const{
|
scoped_vbo_map<void> vbo::map(gl_buffer& target, maptype m)const{
|
||||||
return scoped_vbo_map<void>(*this, target, m);
|
return scoped_vbo_map<void>(*this, target, m);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user