#ifndef MESH_H #define MESH_H #include "vector.h" #include "util.h" #include "material.h" #include "animatable.h" #include "meshData.h" #include #include namespace vb01{ class Node; class Shader; class Texture; class Skeleton; class Mesh{ public: Mesh(MeshData); ~Mesh(); void construct(); virtual void update(); void render(); void setMaterial(Material *mat){this->material = mat;} inline void setNode(Node *node){this->node = node;} inline void setCastShadow(bool castShadow){this->castShadow = castShadow;} inline void setReflect(bool r){this->reflect = r;} inline void setReflective(bool r){this->reflective = r;} inline void setWireframe(bool w){this->wireframe = w;} inline void setSkeleton(Skeleton *sk){this->skeleton = sk;} inline Node* getNode(){return node;} inline Material* getMaterial(){return material;} inline bool isReflective(){return reflective;} inline bool isCastShadow(){return castShadow;} inline Skeleton* getSkeleton(){return skeleton;} inline Texture* getPrefilterMap(){return prefilterMap;} inline Texture* getIrradianceMap(){return irradianceMap;} inline Texture* getPostfilterMap(){return postfilterMap;} inline Texture* getBrdfIntegrationMap(){return brdfIntegrationMap;} inline MeshData getMeshBase(){return meshBase;} private: void initMesh(); void initFramebuffer(u32&, u32&, int); void updateSkeleton(Shader*); void updatePrefilterMap(Vector3, glm::mat4&, glm::vec3[6]); void updateIrradianceMap(Vector3, glm::mat4&, glm::vec3[6]); void updatePostfilterMap(glm::mat4&, glm::vec3[6]); void updateBrdfLut(); void updateReflection(Vector3); void updateShapeKeys(Shader*); inline glm::vec3 getUpVec(glm::vec3 dir){return (fabs(dir.y) == 1 ? glm::vec3(0, 0, -1) : glm::vec3(0, 1, 0));} int irradianceMapSize = 32, preFilterMapSize = 512, environmentMapSize = 128, brdfMapSize = 512; u32 numSamples = 1024; float irradianceSampleDelta = 0.5; Texture *prefilterMap = nullptr, *irradianceMap = nullptr, *postfilterMap = nullptr, *brdfIntegrationMap = nullptr; Shader *environmentShader = nullptr, *irradianceShader = nullptr, *brdfIntegrationShader = nullptr; u32 preFilterFramebuffer, preFilterRenderbuffer, irrandianceFramebuffer, irradianceRenderbuffer, postFilterFramebuffer, postFilterRenderbuffer, brdfFramebuffer, brdfRenderbuffer; Material *material = nullptr; Node *node = nullptr; std::vector meshes; Skeleton *skeleton = nullptr; protected: Mesh(){} MeshData meshBase; bool castShadow = false, reflect = false, reflective = false, wireframe = false; u32 VAO, VBO, EBO; }; } #endif