Skip to content
Snippets Groups Projects
Select Git revision
  • bd4dfe88c0cfc97fb55785e7e98f758cf8ab016b
  • main default protected
  • NewGraphicSystem
  • LayeredRendering
4 results

Text_Module.cpp

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    Sprite_Module.cpp 3.36 KiB
    #include "Sprite_Module.hpp"
    
    #include <engine/graphics/back/cameras/Camera.hpp>
    #include <engine/utility/array_generator.hpp>
    
    namespace megu {
        Sprite_Module::Sprite_Module()
        : _vbo(this->_vao, Sprite::Layout(), Sprite::Vertices(), EditMode::STATIC) {
            Source vert_source("assets/shaders/Sprite.vert", Source::Categorie::VERTEX);
            this->_program << vert_source;
    
            Source frag_source("assets/shaders/Sprite.frag", Source::Categorie::FRAGMENT);
            this->_program << frag_source;
    
            this->_program.link();
            vert_source.release();
            frag_source.release();
        }
    
        void Sprite_Module::draw(const ref_set<Sprite> & sprites, const Camera & camera, const Window &) const {
            this->_vao.bind();
            this->_program.use();
    
            this->_program.setUniform("uProj", camera.projection());
            this->_program.setUniform("uView", camera.view());
    
            std::vector<std::reference_wrapper<const Texture>> textures;
    
            std::vector<glm::mat4> uModels;
            std::vector<glm::vec4> uFrames;
            std::vector<glm::vec2> uSizes;
            std::vector<GLint> uTextures;
    
            static auto uSampler = array_generator::Generate<GLint, 0, 32>();
            this->_program.setUniform("uSampler", uSampler);         
        
            for(auto & image : sprites) {
                std::vector<std::reference_wrapper<const Texture>>::iterator it = std::find(textures.begin(), textures.end(), image.get().texture());
                if(it != textures.end()) {
                    uModels.push_back(image.get().transformation().model());
                    uFrames.push_back(image.get().frame());
                    uSizes.push_back({it->get().width(), it->get().height()});
                    
                    uTextures.push_back(static_cast<GLint>(it - textures.begin()));
                }
                else {
                    if(textures.size() >= 8 || uModels.size() >= 124) {
                        this->_program.setUniform("uModel", uModels);
                        this->_program.setUniform("uTextures", uTextures);
                        this->_program.setUniform("uFrames", uFrames);
                        this->_program.setUniform("uSizes", uSizes);
                        
                        glDrawArraysInstanced(Quads::Primitive(), 0, static_cast<GLsizei>(this->_vbo.size()), static_cast<GLsizei>(uModels.size()));
    
                        textures.clear();
                        uModels.clear();
                        uTextures.clear();
                        uSizes.clear();
                    }
                    
                    textures.push_back(image.get().texture());  
                    image.get().texture().bind(static_cast<GLint>(textures.size()-1));
                    uTextures.push_back(static_cast<GLint>(textures.size()-1)); 
                    
                    uModels.push_back(image.get().transformation().model());
                    uFrames.push_back(image.get().frame());
                    uSizes.push_back({image.get().texture().width(), image.get().texture().height()});
                }
            }
    
            if(!textures.empty()) {
                this->_program.setUniform("uModel", uModels);
                this->_program.setUniform("uTextures", uTextures);
                this->_program.setUniform("uFrames", uFrames);
                this->_program.setUniform("uSizes", uSizes);
    
                glDrawArraysInstanced(Sprite::Primitive(), 0, static_cast<GLsizei>(this->_vbo.size()), static_cast<GLsizei>(uModels.size())); 
            }
        }
    }