voxspatium/src/planet/PlanetFace.h

88 lines
1.7 KiB
C
Raw Normal View History

#ifndef __PLANETFACE_H__
#define __PLANETFACE_H__
#include "util/Common.h"
#include "planet/Planet.h"
#include "Shader.h"
2018-06-05 11:40:39 +00:00
#include "Camera.h"
#define RESOLUTION 128
enum Face
{
FACE_BOTTOM, FACE_TOP,
FACE_LEFT, FACE_RIGHT,
FACE_FRONT, FACE_BACK
};
struct Vertex
{
glm::vec3 position;
glm::vec3 normal;
glm::vec2 uv;
};
class Planet;
2018-06-06 18:11:17 +00:00
class PlanetFace;
class PlanetFaceNode
2018-06-06 18:11:17 +00:00
{
public:
PlanetFaceNode(Planet* planet, PlanetFace* face, glm::vec3 position, const unsigned int level);
~PlanetFaceNode();
2018-06-06 18:11:17 +00:00
void tick(Camera* camera, GLfloat dtime);
void draw(Camera* camera, Shader* shader);
void generate();
void subdivide();
void merge();
void dispose();
bool isLeaf();
inline Planet* getPlanet() const { return m_planet; }
inline PlanetFace* getPlanetFace() const { return m_planetFace; }
2018-06-06 18:11:17 +00:00
inline glm::vec3 getAbsolutePosition() const { return m_planet->getPosition() + m_pos; }
2018-06-06 18:11:17 +00:00
private:
Planet* m_planet;
PlanetFace* m_planetFace;
PlanetFaceNode* m_parent;
PlanetFaceNode* m_children[4];
unsigned int m_level;
bool m_dirty;
bool m_generated;
bool m_leaf;
GLuint m_ebo, m_vao, m_vbo;
int m_indices;
glm::vec3 m_pos;
glm::vec3 m_left;
glm::vec3 m_forward;
2018-06-06 18:11:17 +00:00
};
class PlanetFace
{
public:
PlanetFace(Planet* planet, const unsigned int face = Face::FACE_BOTTOM);
~PlanetFace();
2018-06-05 11:40:39 +00:00
2018-06-06 18:11:17 +00:00
void tick(Camera* camera, GLfloat dtime);
void draw(Camera* camera, Shader* shader);
inline Planet* getPlanet() const { return m_planet; }
inline const glm::vec3 getNormal() const { return m_normal; }
private:
Planet* m_planet;
unsigned int m_face;
2018-06-05 11:40:39 +00:00
glm::vec3 m_normal;
PlanetFaceNode* m_planetFace;
};
#endif // __PLANETFACE_H__