Blob Blame Raw
#pragma once

#ifndef SHADINGCONTEXT_H
#define SHADINGCONTEXT_H

#include <memory>

// Glew include
#include <GL/glew.h>

// TnzCore includes
#include "traster.h"

// Qt includes
#include <QDateTime>
#include <QGLFramebufferObjectFormat>

#undef DVAPI
#undef DVVAR
#ifdef TNZSTDFX_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif

//=========================================================

//    Forward declarations

class QObject;
class QGLShaderProgram;
class QDateTime;

//=========================================================

class DVAPI ShadingContext
{
public:
	enum Support {
		OK,
		NO_PIXEL_BUFFER,
		NO_SHADERS
	};

public:
	ShadingContext();
	~ShadingContext();

	//! Returns the status of OpenGL shading support.
	static Support support();

	bool isValid() const;

	void makeCurrent();
	void doneCurrent();

	/*!
    Resizes the output buffer to the specified size. Requires that
    the contex is made current before invocation. In case lx or ly are 0,
    the context's output buffer is destroyed.
  */
	void resize(int lx, int ly,
				const QGLFramebufferObjectFormat &fmt = QGLFramebufferObjectFormat());

	QGLFramebufferObjectFormat format() const;
	TDimension size() const;

	//! Surrenders ownership of the supplied shader program to the shading context.
	void addShaderProgram(const QString &shaderName, QGLShaderProgram *program);
	void addShaderProgram(const QString &shaderName, QGLShaderProgram *program,
						  const QDateTime &lastModified);
	bool removeShaderProgram(const QString &shaderName);

	QGLShaderProgram *shaderProgram(const QString &shaderName) const;
	QDateTime lastModified(const QString &shaderName) const;

	std::pair<QGLShaderProgram *, QDateTime> shaderData(const QString &shaderName) const;

	GLuint loadTexture(const TRasterP &src, GLuint texUnit); //!< Loads a texture and binds it to the specified texture unit.
															 //!  \return  The OpenGL texture id of the loaded texture.      \param src  Loaded texture.  \param texUnit  Unit the texture will be bound to.
	void unloadTexture(GLuint texId);						 //!< Releases the specified texture id.

	//! Renders the active shader program to the specified raster.
	void draw(const TRasterP &dst);

	//! Performs transform feedback with the specified varying variables
	void transformFeedback(int varyingsCount, const GLsizeiptr *varyingSizes,
						   GLvoid **bufs);

private:
	struct Imp;
	std::unique_ptr<Imp> m_imp;

	// Not copyable
	ShadingContext(const ShadingContext &);
	ShadingContext &operator=(const ShadingContext &);
};

#endif // SHADINGCONTEXT_H