Select Git revision
Text_Module.cpp
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()));
}
}
}