Wed, 17 Feb 2021 16:49:35 +0200
stuff
/* * LDForge: LDraw parts authoring CAD * Copyright (C) 2020 Teemu Piippo * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "axesprogram.h" const char vertexShaderSource[] = R"( #version 330 core layout (location = 0) in vec3 in_position; layout (location = 1) in vec3 in_color; uniform mat4 view; uniform mat4 projection; uniform mat4 model; smooth out vec3 ex_color; void main() { gl_Position = projection * view * model * vec4(in_position, 1.0); ex_color = in_color; } )"; const char fragmentShaderSource[] = R"( #version 330 core out vec4 color; smooth in vec3 ex_color; void main(void) { color = vec4(ex_color, 1); } )"; namespace { struct AxesVertex { glm::vec3 position; glm::vec3 color; }; } static const AxesVertex data[] = { AxesVertex{{10000, 0, 0}, {1, 0, 0}}, AxesVertex{{0, 0, 0}, {1, 0, 0}}, AxesVertex{{-10000, 0, 0}, {0.5, 0, 0}}, AxesVertex{{0, 0, 0}, {0.5, 0, 0}}, AxesVertex{{0, 10000, 0}, {0, 1, 0}}, AxesVertex{{0, 0, 0}, {0, 1, 0}}, AxesVertex{{0, -10000, 0}, {0, 0.5, 0}}, AxesVertex{{0, 0, 0}, {0, 0.5, 0}}, AxesVertex{{0, 0, 10000}, {0, 0, 1}}, AxesVertex{{0, 0, 0}, {0, 0, 1}}, AxesVertex{{0, 0, -10000}, {0, 0, 0.5}}, AxesVertex{{0, 0, 0}, {0, 0, 0.5}}, }; constexpr std::size_t vertexSize = sizeof data[0]; AxesProgram::AxesProgram(QObject* parent) : AbstractShaderProgram{{{GL_LINES, ::vertexSize}}, parent} {} const char* AxesProgram::vertexShaderSource() const { return ::vertexShaderSource; } const char* AxesProgram::fragmentShaderSource() const { return ::fragmentShaderSource; } const void* AxesProgram::vertexData() const { return ::data; } void AxesProgram::setupVertexArrays() { for (int i : {0, 1}) { this->program->enableAttributeArray(i); } this->program->setAttributeBuffer(0, GL_FLOAT, offsetof(AxesVertex, position), 3, ::vertexSize); this->program->setAttributeBuffer(1, GL_FLOAT, offsetof(AxesVertex, color), 3, ::vertexSize); this->upload(&this->arrays[0], ::data, countof(data)); }