/*
	QGL Framebuffer effect basic
    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 glframebuffereffectbase_H
#define glframebuffereffectbase_H

#include "gltypes.h"
#include "parameteredobject.h"

#include <QElapsedTimer>


class QGLENGINE_CORE_EXPORT FramebufferEffectBase: public ParameteredObject {
	friend class FramebufferMipmap;
	friend class Renderer;

public:
	FramebufferEffectBase();
	virtual ~FramebufferEffectBase();

	virtual QString name() const = 0;

	void setEnabled(bool on) { enabled_ = on; }
	bool isEnabled() const { return enabled_; }

	virtual void draw() = 0;

protected:
	void resize(int width, int height, bool force = false);
	void reinit();

	virtual int maxPlanesUsed() const { return 1; }
	virtual void reloadShaders() {}

	void bindDeferredBuffer(int role, int channel);
	void bindDepthBuffer(int channel);
	void bindPreviousOutput(int channel);
	void setOutputPlane(int channel);
	void drawScreen(QOpenGLShaderProgram * prog);
	void drawInternal();
	void reloadShadersInternal();
	QVector<int> getFreePlanes(int count);
	int previousOutputPlane() const;
	static void deleteShader(QOpenGLShaderProgram *& s);

private:
	bool enabled_  = true;
	bool is_loaded = false;
	Renderer * r   = nullptr;
	GLint wid, hei;
};

#endif
