/*
    QGL RendererBase
    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 RENDERER_BASE_H
#define RENDERER_BASE_H

#include "glbuffer.h"
#include "glcubemaparray.h"
#include "glshaders_types.h"
#include "gltexturearray.h"
#include "measurer.h"


class QGLENGINE_CORE_EXPORT RendererBase {
public:
	RendererBase(QGLView * view_);
	~RendererBase();

protected:
	void initTextureArrays();
	void initUniformBuffer(QOpenGLShaderProgram * prog, Buffer * buffer, int bind_point, const char * blockName);
	void setUniformHalo(QOpenGLShaderProgram * prog, const char * type, QColor color, float fill);
	void setUniformMaps(QOpenGLShaderProgram * prog);
	void setUniformCamera(QOpenGLShaderProgram * prog, Camera * cam, bool matrices = true, QSize viewport = QSize());
	void setUniformViewCorners(QOpenGLShaderProgram * prog, Camera * cam, QSize viewport = QSize());
	void fillSelectionsBuffer(QVector<uchar> & buffer, const ObjectBaseList & ol);
	void fillSelectionsBuffer(QVector<uchar> & buffer, bool yes, int size);
	void reloadMaterials(Scene & scene);
	void reloadLightsParameters(const QMap<int, QList<Light *>> & lights);
	void reloadLightsPositions(Camera * cam);
	void markReloadTextures();
	void markReloadMaterials();
	void setMapsSize(QSize sz);
	void initQuad(Mesh * mesh, QMatrix4x4 mat = QMatrix4x4());
	void renderQuad(QOpenGLShaderProgram * prog, Mesh * mesh, Camera * cam = 0, bool uniforms = true);
	void initCoeffTextures();
	void createCoeffTexture(GLuint & id, const void * data, int size, int channels = 1);
	void createNoiseTexture(GLuint & id);

	QGLView * view;
	TextureManager * textures_manager;
	QVector<QGLEngineShaders::Object> cur_objects_;
	QVector<QGLEngineShaders::QGLMaterial> cur_materials_;
	QVector<QGLEngineShaders::QGLLightParameter> cur_lights_params_;
	QVector<QGLEngineShaders::QGLLightPosition> cur_lights_pos_;
	Buffer buffer_materials;
	Buffer buffer_lights, buffer_lights_pos;
	Texture2DArray textures_empty, textures_maps, shadow_maps_cone, depth_maps_cone;
	CubeMapArray shadow_maps_omni, depth_maps_omni;
	QSize maps_size;
	uint maps_hash;
	GLuint tex_coeff[3];
	QMap<int, int> lights_start;
	QList<Light *> current_lights;
	int noise_size = 256;
};

#endif // RENDERER_BASE_H
