#ifndef STATIC_MESH_HPP
#define STATIC_MESH_HPP
#include "Cache.hpp"
#include "Constants.hpp"
#include "Mesh.hpp"
#include <unordered_map>
#include <vector>
namespace wren {
class StaticMesh : public Mesh {
public:
static StaticMesh *createStaticMesh() { return new StaticMesh(); }
static bool createOrRetrieveFromCache(StaticMesh **mesh, const cache::Key key);
static StaticMesh *createUnitBox(bool outline);
static StaticMesh *createUnitCone(int subdivision, bool hasSide, bool hasBottom);
static StaticMesh *createUnitCylinder(int subdivision, bool hasSide, bool hasTop, bool hasBottom, bool outline);
static StaticMesh *createUnitElevationGrid(int dimensionX, int dimensionY, const float *heightData, float thickness,
bool outline);
static StaticMesh *createUnitRectangle(bool outline);
static StaticMesh *createUnitIcosphere(int subdivision, bool outline);
static StaticMesh *createUnitUVSphere(int subdivision, bool outline);
static StaticMesh *createCapsule(int subdivision, float radius, float height, bool hasSide, bool hasTop, bool hasBottom,
bool outline);
static StaticMesh *createQuad();
static StaticMesh *createLineSet(int coordCount, const float *coordData, const float *colorData);
static StaticMesh *createPointSet(int coordCount, const float *coordData, const float *colorData);
static StaticMesh *createTriangleMesh(int coordCount, int indexCount, const float *coordData, const float *normalData,
const float *texCoordData, const float *unwrappedTexCoordData,
const unsigned int *indexData, bool outline);
static size_t cachedItemCount();
static void printCacheContents();
void setCachePersistency(bool persistent);
bool isCachePersistent() const { return mIsCachePersistent; }
const std::vector<glm::vec4> &shadowCoords() const override { return mCacheData->mShadowCoords; }
const std::vector<Mesh::Edge> &edges() const override { return mCacheData->mEdges; }
const std::vector<Mesh::Triangle> &triangles() const override { return mCacheData->mTriangles; }
const Mesh::Triangle &triangle(size_t index) const override { return mCacheData->mTriangles[index]; }
void readData(float *coordData, float *normalData, float *texCoordData, unsigned int *indexData);
int vertexCount() const;
int indexCount() const;
void bind() override;
void release() override;
void render(unsigned int drawingMode) override;
void bindShadowVolume() override;
void releaseShadowVolume() override;
size_t sortingId() const override;
primitive::Aabb recomputeAabb(const glm::vec3 &scale = gVec3Ones) override;
primitive::Sphere recomputeBoundingSphere(const glm::vec3 &scale = gVec3Ones) override;
void computeBoundingVolumes();
bool supportShadows() const override { return mCacheData->mSupportShadows; }
protected:
StaticMesh();
virtual ~StaticMesh() {}
private:
void computeTrianglesAndEdges();
void prepareGl() override;
void cleanupGl() override;
static std::unordered_map<cache::Key, cache::MeshData> cCache;
bool mIsCachePersistent;
cache::Key mCacheKey;
cache::MeshData *mCacheData;
};
}
#endif