terrain-gen/src/terrain.h

100 lines
2.1 KiB
C++

#ifndef TERRAIN_H
#define TERRAIN_H
#include <QOpenGLFunctions_4_5_Core>
#include <QOpenGLShaderProgram>
#include <QVector3D>
#include <QMatrix4x4>
#include <QObject>
#include <QTime>
#include <vector>
#include <memory>
#include "skybox.h"
#include "shadowmap.h"
#include "config.h"
#include "block.h"
#include "camera.h"
#include "light.h"
#include "shader.h"
#include "simplequad.h"
QT_FORWARD_DECLARE_CLASS(QOpenGLShaderProgram)
class Terrain: public QObject, protected QOpenGLFunctions_4_5_Core
{
Q_OBJECT
enum RenderedTexture {
Colors,
Normals,
Position,
MeshProperties,
Reflection,
Refraction,
WaterDepth,
Depth,
TextureCount
} RenderedTexture;
private:
int m_viewHeight;
int m_viewWidth;
bool m_showNormals;
bool m_skyAnimation;
QTime m_timeSinceStart;
int m_lastFrameTime;
QMatrix4x4 m_model;
static QMatrix4x4 m_reflection;
GLuint m_frameBuffers[2];
GLuint m_renderedTextures[Terrain::TextureCount];
Shader* m_landProgram;
Shader* m_waterProgram;
Shader* m_skyboxProgram;
Shader* m_normalProgram;
Shader* m_shadingProgram;
SkyBox m_skybox;
ShadowMap m_shadowMap;
Camera m_camera;
Light m_light;
SimpleQuad m_quad;
std::vector<std::shared_ptr<Block>> m_blocks;
void createHighmap();
void createMesh();
void createFrameBufferObject();
void deleteFrameBufferObject();
void createSimpleTextures(GLuint* texturesId, GLsizei nbTextures, GLsizei width, GLsizei height);
void createTerrain();
QOpenGLShaderProgram* getProgram(QString shaderName, bool useGeom);
void setAllUniformsForProgram(Shader* program, RenderPassType renderPass);
void defferedShadingPipeline(RenderPassType renderPass);
public:
Terrain();
~Terrain();
void initGl();
void render(GLuint defaultFrameBuffer);
void setUniforms(Shader* program, RenderPassType renderPass);
void setSkyAnimation(bool newState);
void setShowNormals(bool newState);
Light* light();
Camera* camera();
public slots:
void setViewPort(int width, int height);
};
#endif // TERRAIN_H