/
ArtemNech
/
simpleOpenGL
Обзор
Документация
Войти
/
ArtemNech
/
simpleOpenGL
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
backend/ogl_sys/drawing-sets/CLayerConnectionsLine.cpp
125 строк
3 KB
Artem Nechitaylenko
Старый телевизор добавлен
21 май 2026, 08:11
21 май 2026, 08:11
e78c117
Код
Авторство
О чём код?
// // Created by artem on 14.04.26. // #include "shaderprogram.h" #include "CLayerConnectionsLine.h" #include "../CGlTransformator.h" #include "../../CBacking.h" #include <QDebug> CLayerConnectionsLine::CLayerConnectionsLine(float Z) : COglLayer(Z) {} CLayerConnectionsLine::~CLayerConnectionsLine() = default; bool CLayerConnectionsLine::init() { m_vao->bind(); m_vbo->bind(); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (void*)nullptr); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (void*)(3 * sizeof(float))); m_vao->unbind(); m_vbo->unbind(); init_shaders(); return compile_shaders(); } void CLayerConnectionsLine::init_shaders() { m_vertex_shader = R"( #version 330 core layout(location = 0) in vec3 a_position; layout(location = 1) in vec4 a_color; out vec4 v_color; uniform mat4 u_view_projection; void main() { v_color = a_color; gl_Position = u_view_projection * vec4(a_position, 1.0); } )"; m_frag_shader = R"( #version 330 core in vec4 v_color; out vec4 FragColor; void main() { FragColor = v_color; if (FragColor.a < 0.01) { discard; } } )"; } bool CLayerConnectionsLine::compile_shaders() { if (!m_shaderProgram->compile(m_vertex_shader, m_frag_shader)) { qDebug() << "Fragment shader compilation in 'CMeasureGrid' failed: ", m_shaderProgram->errors(); m_enabled = false; return false; } return true; } void CLayerConnectionsLine::render(CBacking *backing, const glm::mat4 & projection, const glm::mat4 & view) { if (!backing) return; m_backing = backing; auto base_projection = projection * view; m_shaderProgram->bind(); m_shaderProgram->setUniform("u_view_projection", base_projection); m_batches.clear(); m_vertices.clear(); for (auto &connection : m_backing->getVisibleConnections() ) { auto *lConnect = const_cast<elem::IConnectingLine*>(connection); for (auto &line : lConnect->line()) { CGlTransformator::drawLine(this, line, connection->color()); } } if (m_backing->diagram()) { if (m_backing->diagram()->isTemporaryLine()) { ngraph::NColor color(156,248,127,255); auto lines = m_backing->diagram()->getTemporaryLine(); for (auto &item : lines) CGlTransformator::drawLine(this, item, color); } } if (m_vertices.empty()) { return; } m_vao->bind(); m_vbo->bind(); m_vbo->data(m_vertices.data(), m_vertices.size() * sizeof(vertex_t), BufferUsage::Static); glDrawArrays(GL_LINES, 0, (GLsizei)m_vertices.size() ); }