src/gl/partrenderer.h

Thu, 27 Feb 2020 14:38:58 +0200

author
Teemu Piippo <teemu@hecknology.net>
date
Thu, 27 Feb 2020 14:38:58 +0200
changeset 60
0f221121849b
parent 58
b7841cd31fb7
child 61
4585d8d7a7ec
permissions
-rw-r--r--

fixed warning

#pragma once
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QQuaternion>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLBuffer>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
#include <glm/glm.hpp>
#include "main.h"
#include "gl/common.h"
#include "gl/compiler.h"
#include "gl/gridprogram.h"

class PartRenderer : public QOpenGLWidget, protected QOpenGLFunctions
{
	Q_OBJECT
public:
	PartRenderer(
		Model* model,
		DocumentManager* documents,
		const ldraw::ColorTable& colorTable,
		QWidget* parent = nullptr);
	~PartRenderer() override;
	void setRenderPreferences(const gl::RenderPreferences& newPreferences);
	static glm::vec3 viewport(const glm::vec3& point, float width, float height);
	static glm::vec3 antiviewport(const glm::vec3& point, float width, float height);
protected:
	ldraw::Id pick(const QPoint& where);
	void initializeGL() override;
	void resizeGL(int width, int height) override;
	void paintGL() override;
	void mouseMoveEvent(QMouseEvent* event) override;
	void wheelEvent(QWheelEvent* event) override;
	glm::vec3 viewport(const glm::vec3& point);
	Model* const model;
	DocumentManager* const documents;
	const ldraw::ColorTable& colorTable;
	gl::Compiler* const compiler;
	ldraw::Id highlighted = ldraw::NULL_ID;
	std::optional<glm::vec3> screenToModelCoordinates(const QPoint& point, const geom::Plane& plane);
	QPointF modelToScreenCoordinates(const glm::vec3& point);
	glm::vec3 unproject(const glm::vec3& win);
private:
	void setFragmentStyle(gl::FragmentStyle fragStyle);
	void renderAllArrays();
	void renderScene();
	void updateViewMatrix();
	void updateModelMatrix();
	void setupBackgroundColor();
	QPointF lastMousePosition;
	gl::RenderPreferences renderPreferences;
	glm::mat4 projectionMatrix;
	glm::mat4 viewMatrix;
	glm::vec4 viewportVector;
	glm::quat modelQuaternion;
	std::optional<GridProgram> gridProgram;
	static constexpr double MIN_ZOOM = 0.0;
	static constexpr double MAX_ZOOM = 3.0;
	double zoom = 1.0;
	bool initialized = false;
	void renderVao(const gl::ArrayClass arrayClass);
	void checkForGLErrors();
};

mercurial