#ifndef _H_INSTANCEDRAW_H #define _H_INSTANCEDRAW_H #include #include #include #include #define MAX_INSTANCES 1000 #define MAX_TEXTURES 31 class Texture; class TextureArray; struct InstanceData { glm::mat4 modelMatrix; glm::vec2 originalSize; int tileIndex = 0; int textureIndex = 0; int tilesPerRow = 0; int startID = 0; }; class BaseInstanceDraw { public: virtual ~BaseInstanceDraw() {} virtual void setup() = 0; virtual void updateInstanceData(const std::vector&) = 0; virtual void draw() = 0; protected: unsigned VAO, VBO, EBO, instanceVBO; Texture* texture = nullptr; InstanceData instanceData[MAX_INSTANCES]; size_t numOfInstances = 0; unsigned indices[6] = { 0, 1, 2, 3, 2, 0 }; }; class TileTextureInstance : public BaseInstanceDraw { public: TileTextureInstance(const char* texturePath); TileTextureInstance(const std::vector texturePaths); void updateInstanceData(const std::vector&) override; void draw() override; const TextureArray* getTextureArray() { return textures; } const Texture* getTexture() { return texture; } private: void setup() override; TextureArray* textures = nullptr; float vertices[20] = { // vertex -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, // bottom left 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // bottom right 0.5f, 0.5f, 0.0f, 1.0f, 1.0f, // top right -0.5f, 0.5f, 0.0f, 0.0f, 1.0f // top left }; }; #endif // _H_INSTANCEDRAW_H