voxspatium/src/planet/PlanetFace.h

79 lines
1.7 KiB
C++

#ifndef __PLANETFACE_H__
#define __PLANETFACE_H__
#include "util/Common.h"
#include "planet/Chunk.h"
#include "Shader.h"
#include "Camera.h"
#define ASYNC_NUM_CHUNKS_PER_FRAME 8
enum Face {
FACE_BOTTOM, FACE_TOP,
FACE_LEFT, FACE_RIGHT,
FACE_FRONT, FACE_BACK
};
class Planet;
class PlanetFace;
// PlanetFace Chunk Manager
class ChunkManager
{
public:
ChunkManager(PlanetFace* face, GLuint chunkCount);
~ChunkManager();
void update(Camera* camera, GLfloat dtime);
Chunk* getChunk(int x, int y, int z);
void render(Camera* camera, Shader* shader);
private:
void updateUnload();
void updateLoad();
void updateGenerate();
void updateRebuild();
void updateFlags();
void updateVisibility(Camera* camera);
void updateRender(Camera* camera);
std::vector<Chunk*> m_chunks;
std::vector<Chunk*> m_chunksVisible;
// Queues
std::vector<Chunk*> m_chunkUnloadQueue;
std::vector<Chunk*> m_chunkLoadQueue;
std::vector<Chunk*> m_chunkGenerateQueue;
std::vector<Chunk*> m_chunkRebuildQueue;
std::vector<Chunk*> m_chunkRenderQueue;
std::vector<Chunk*> m_chunkFlagsQueue;
PlanetFace* m_face;
int m_chunksLoaded = 0;
bool m_forceVisibilityUpdate;
};
class PlanetFace
{
public:
PlanetFace(Planet* planet, const unsigned int face = Face::FACE_BOTTOM);
~PlanetFace();
void tick(Camera* camera, GLfloat dtime);
void draw(Camera* camera, Shader* shader);
inline Planet* getPlanet() const { return m_planet; }
inline const glm::vec3 getPosition() const { return m_planet->getPosition() + m_pos; }
private:
Planet* m_planet;
unsigned int m_face;
glm::vec3 m_normal;
glm::vec3 m_pos;
ChunkManager* m_chunks;
};
#endif // __PLANETFACE_H__