#include "openglwindow.h"

#include <QCoreApplication>
#include <QOpenGLContext>
#include <QOpenGLPaintDevice>
#include <QPainter>
#include <qopenglext.h>


OpenGLWindow::OpenGLWindow(QWindow * parent): QWindow(parent), m_context(nullptr), m_device(nullptr) {
	setFlags(flags() | Qt::FramelessWindowHint);
	setSurfaceType(QWindow::OpenGLSurface);
	QSurfaceFormat format = QSurfaceFormat::defaultFormat();
//	qDebug() << format;
#ifdef QT_OPENGL_ES_2
	format.setRenderableType(QSurfaceFormat::OpenGLES);
#else
	if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) {
		format.setVersion(2, 0);
		format.setProfile(QSurfaceFormat::NoProfile);
	}
#endif
	format.setDepthBufferSize(24);
	format.setSamples(8);
	//	format.setStencilBufferSize(8);
	setFormat(format);
	QSurfaceFormat::setDefaultFormat(format);
}


OpenGLWindow::~OpenGLWindow() {
	delete m_device;
}


void OpenGLWindow::render(QPainter * painter) {}


void OpenGLWindow::initialize() {}


void OpenGLWindow::render() {
	//	if (!m_device) m_device = new QOpenGLPaintDevice;
	//	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
	//	m_device->setSize(size() * devicePixelRatio());
	//	m_device->setDevicePixelRatio(devicePixelRatio());
	//	QPainter painter(m_device);
	//	render(&painter);
}


void OpenGLWindow::renderLater() {
	requestUpdate();
}


bool OpenGLWindow::event(QEvent * event) {
	switch (event->type()) {
	case QEvent::UpdateRequest: renderNow(); return true;
	default: return QWindow::event(event);
	}
}


void OpenGLWindow::exposeEvent(QExposeEvent * event) {
	if (isExposed()) renderNow();
}


void OpenGLWindow::renderNow() {
	if (!isExposed()) return;
	bool needsInitialize = false;
	if (!m_context) {
		m_context = new QOpenGLContext(this);
		m_context->setFormat(requestedFormat());
		m_context->create();
		needsInitialize = true;
	}
	m_context->makeCurrent(this);
	if (needsInitialize) {
		initializeOpenGLFunctions();
		initialize();
	}
	render();
	m_context->swapBuffers(this);
}
