voxspatium/src/planet/PlanetFace.h

128 lines
2.9 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"
2023-02-23 19:33:50 +00:00
#define RESOLUTION 17
enum Face
{
2022-02-25 16:39:45 +00:00
FACE_FRONT,
FACE_LEFT,
FACE_BACK,
FACE_RIGHT,
FACE_TOP,
FACE_BOTTOM,
};
2022-02-25 16:39:45 +00:00
enum Quadrant
{
TOP_LEFT, TOP_RIGHT,
BOTTOM_RIGHT, BOTTOM_LEFT
};
2022-02-25 16:39:45 +00:00
const unsigned int MAX_SPLITS_PER_UPDATE = 2;
#define MIRROR(s) (((s) + 2) % 4)
#define ADJACENT(s, q) ((4 + (q) - (s)) % 4 <= 1)
#define REFLECT(s, q) ((s) % 2 ? ((q) % 2 ? (q) - 1 : (q) + 1) : 3 - (q))
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:
2022-10-01 09:00:55 +00:00
PlanetFaceNode(PlanetFace* face, PlanetFaceNode* parent, glm::vec3 position, const unsigned int index);
~PlanetFaceNode();
2018-06-06 18:11:17 +00:00
void tick(Camera* camera, GLfloat dtime);
void draw(Camera* camera, Shader* shader);
bool isLeaf();
inline PlanetFace* getPlanetFace() const { return m_planetFace; }
2018-06-06 18:11:17 +00:00
2022-10-01 09:00:55 +00:00
glm::vec3 getAbsolutePosition();
2022-02-25 16:39:45 +00:00
inline PlanetFaceNode* getNeighborAt(Direction dir) const { return m_neighbors[dir]; }
inline PlanetFaceNode* getChildAt(Quadrant quad) const { return m_children[quad]; }
void setNeighbor(const unsigned int side, PlanetFaceNode *neighbor);
unsigned int mirrorSide(const unsigned int side) const;
const PlanetFaceNode* getEqualOrHigherNeighbor(const unsigned int side) const;
unsigned int getNeighborDetailDifference(const unsigned int side) const;
2018-06-06 18:11:17 +00:00
private:
void generate();
bool subdivide();
bool merge();
void dispose();
2022-02-25 16:39:45 +00:00
void findNeighbor(const unsigned int side);
void getNeighbor(const unsigned int side);
void updateNeighborDetailDifferences(const unsigned int side);
unsigned int mirrorQuadrant(const unsigned int side, const unsigned int quadrant) const;
PlanetFace* m_planetFace;
PlanetFaceNode* m_parent;
PlanetFaceNode* m_children[4];
2022-02-25 16:39:45 +00:00
PlanetFaceNode* m_neighbors[4];
unsigned int neighborDetailDifferences[4];
unsigned int m_index;
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_center;
glm::vec3 m_left;
glm::vec3 m_forward;
2022-10-01 09:00:55 +00:00
float m_radius;
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; }
inline PlanetFaceNode* getLODRoot() { return m_lod; }
2022-02-25 16:39:45 +00:00
inline unsigned int getFace() const { return m_face; }
void connect(const unsigned int side, PlanetFace* face);
bool hasSplitsLeft();
private:
Planet* m_planet;
unsigned int m_face;
2022-02-25 16:39:45 +00:00
unsigned int m_splits;
2018-06-05 11:40:39 +00:00
glm::vec3 m_normal;
PlanetFaceNode* m_lod;
};
#endif // __PLANETFACE_H__