#include "Runtime/Graphics/Shaders/CEnergyBarShader.hpp" #include "Runtime/Graphics/CGraphics.hpp" #include "CEnergyBarShader.cpp.hshhead" namespace urde { using namespace hsh::pipeline; struct CEnergyBarShaderPipeline : pipeline, AdditiveAttachment<>, depth_compare, depth_write> { CEnergyBarShaderPipeline(hsh::vertex_buffer vbo, hsh::uniform_buffer uniBuf, hsh::texture2d tex) { this->position = uniBuf->m_matrix * hsh::float4(vbo->pos, 1.f); this->color_out[0] = uniBuf->m_color * tex.sample(vbo->uv); } }; void CEnergyBarShader::updateModelMatrix() { m_uniform.m_matrix = CGraphics::GetPerspectiveProjectionMatrix(true) * CGraphics::g_GXModelView.toMatrix4f(); } void CEnergyBarShader::draw(const zeus::CColor& color0, const std::vector& verts0, const zeus::CColor& color1, const std::vector& verts1, const zeus::CColor& color2, const std::vector& verts2, hsh::texture2d tex) { SCOPED_GRAPHICS_DEBUG_GROUP("CEnergyBarShader::draw", zeus::skMagenta); size_t totalVerts = verts0.size() + verts1.size() + verts2.size(); if (totalVerts == 0) { return; } if (totalVerts > m_maxVerts) { m_maxVerts = totalVerts; m_vbo = hsh::create_dynamic_vertex_buffer(m_maxVerts); for (size_t i = 0; i < m_uniBuf.size(); ++i) { if (!m_uniBuf[i]) { m_uniBuf[i] = hsh::create_dynamic_uniform_buffer(); } m_dataBind[i].hsh_bind(CEnergyBarShaderPipeline(m_vbo.get(), m_uniBuf[i].get(), tex)); } } size_t vertIter = 0; Vertex* verts = m_vbo.map(); if (!verts0.empty()) { std::memmove(verts, verts0.data(), sizeof(Vertex) * verts0.size()); vertIter += verts0.size(); } if (!verts1.empty()) { std::memmove(verts + vertIter, verts1.data(), sizeof(Vertex) * verts1.size()); vertIter += verts1.size(); } if (!verts2.empty()) { std::memmove(verts + vertIter, verts2.data(), sizeof(Vertex) * verts2.size()); } m_vbo.unmap(); vertIter = 0; if (!verts0.empty()) { m_uniform.m_color = color0; m_uniBuf[0].load(m_uniform); m_dataBind[0].draw_indexed(0, verts0.size()); vertIter += verts0.size(); } if (!verts1.empty()) { m_uniform.m_color = color1; m_uniBuf[1].load(m_uniform); m_dataBind[1].draw_indexed(vertIter, verts1.size()); vertIter += verts1.size(); } if (!verts2.empty()) { m_uniform.m_color = color2; m_uniBuf[2].load(m_uniform); m_dataBind[2].draw_indexed(vertIter, verts2.size()); } } } // namespace urde