/*
    QGL Buffer
    Ivan Pelipenko peri4ko@yandex.ru

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser 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 Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef GLBUFFER_H
#define GLBUFFER_H

#include "gltypes.h"


class QGLENGINE_CORE_EXPORT Buffer {
	friend class ObjectBase;

public:
	Buffer(GLenum target, GLenum usage = GL_DYNAMIC_DRAW);
	~Buffer();

	void init(QOpenGLExtraFunctions * f);
	void destroy(QOpenGLExtraFunctions * f);
	void reinit();

	void bind(QOpenGLExtraFunctions * f);
	void release(QOpenGLExtraFunctions * f);
	void * map(QOpenGLExtraFunctions * f, GLbitfield mode, int size = -1);
	void unmap(QOpenGLExtraFunctions * f);

	// returns true if size changed
	bool resize(QOpenGLExtraFunctions * f, int new_size);
	void load(QOpenGLExtraFunctions * f, const void * data, int size, int offset = 0);

	GLuint ID() const { return buffer_; }
	GLenum usage() const { return usage_; }
	GLenum target() const { return target_; }
	void setTarget(GLenum t) { target_ = t; }
	bool isInit() const { return buffer_ != 0; }

private:
	GLenum target_, usage_;
	GLuint buffer_;
	int prev_size;
};


#endif // GLBUFFER_H
