Refactor to use Color class and Triangle structure for better clarity in drawing functions

This commit is contained in:
Saikari
2026-02-20 03:01:34 +03:00
parent b8323d3bc0
commit 66debb46fa

View File

@@ -3,11 +3,11 @@
#include <iostream> #include <iostream>
#include <vector> #include <vector>
#include <cmath> #include <cmath>
#include "omath/linear_algebra/vector3.hpp" #include <omath/omath.hpp>
#include "omath/linear_algebra/triangle.hpp"
using omath::Vector3; using omath::Vector3;
using omath::Triangle; using omath::Triangle;
using omath::Color;
static const char* vertexShaderSource = R"( static const char* vertexShaderSource = R"(
#version 330 core #version 330 core
@@ -59,7 +59,7 @@ GLuint compileShader(GLenum type, const char* src) {
return shader; return shader;
} }
void drawChar(char c, float x, float y, float scale, const Vector3<float>& color, std::vector<float>& lines) { void drawChar(char c, float x, float y, float scale, const Color& color, std::vector<float>& lines) {
float w = 0.5f * scale; float w = 0.5f * scale;
float h = 1.0f * scale; float h = 1.0f * scale;
@@ -90,7 +90,7 @@ void drawChar(char c, float x, float y, float scale, const Vector3<float>& color
} }
} }
void drawText(const std::string& text, float x, float y, float scale, const Vector3<float>& color, std::vector<float>& lines) { void drawText(const std::string& text, float x, float y, float scale, const Color& color, std::vector<float>& lines) {
float cursor = x; float cursor = x;
for (char c : text) { for (char c : text) {
drawChar(c, cursor, y, scale, color, lines); drawChar(c, cursor, y, scale, color, lines);
@@ -151,7 +151,10 @@ GLuint createShaderProgram() {
return shaderProgram; return shaderProgram;
} }
void generatePointCloud(std::vector<float>& pointCloud, const Vector3<float>& A, const Vector3<float>& B, const Vector3<float>& C) { void generatePointCloud(std::vector<float>& pointCloud, const Triangle<Vector3<float>>& triangle) {
const auto& A = triangle.m_vertex1;
const auto& B = triangle.m_vertex2;
const auto& C = triangle.m_vertex3;
// Iterating over barycentric coordinates (u, v, w) from 0.0 to 1.0 // Iterating over barycentric coordinates (u, v, w) from 0.0 to 1.0
for (float u = 0.0f; u <= 1.0f; u += 0.015f) { for (float u = 0.0f; u <= 1.0f; u += 0.015f) {
for (float v = 0.0f; v <= 1.0f - u; v += 0.015f) { for (float v = 0.0f; v <= 1.0f - u; v += 0.015f) {
@@ -197,7 +200,11 @@ void setupBuffers(GLuint& VAO_cloud, GLuint& VBO_cloud, const std::vector<float>
glEnableVertexAttribArray(3); glEnableVertexAttribArray(3);
} }
void updateDynamicData(std::vector<float>& dynData, float u, float v, float w, const Vector3<float>& P, const Vector3<float>& A, const Vector3<float>& B, const Vector3<float>& C) { void updateDynamicData(std::vector<float>& dynData, float u, float v, float w, const Vector3<float>& P, const Triangle<Vector3<float>>& triangle) {
const auto& A = triangle.m_vertex1;
const auto& B = triangle.m_vertex2;
const auto& C = triangle.m_vertex3;
float sizeA = 10.0f + u * 30.0f; float sizeA = 10.0f + u * 30.0f;
float sizeB = 10.0f + v * 30.0f; float sizeB = 10.0f + v * 30.0f;
float sizeC = 10.0f + w * 30.0f; float sizeC = 10.0f + w * 30.0f;
@@ -233,9 +240,9 @@ void updateDynamicData(std::vector<float>& dynData, float u, float v, float w, c
float distB = 0.13f; float distB = 0.13f;
float distC = 0.13f; float distC = 0.13f;
drawText(bufA, A.x - 0.05f, A.y + distA, 0.1f, Vector3<float>(1,0,0), dynData); drawText(bufA, A.x - 0.05f, A.y + distA, 0.1f, Color(1,0,0,1), dynData);
drawText(bufB, B.x - 0.15f - distB, B.y - 0.05f - distB, 0.1f, Vector3<float>(0,1,0), dynData); drawText(bufB, B.x - 0.15f - distB, B.y - 0.05f - distB, 0.1f, Color(0,1,0,1), dynData);
drawText(bufC, C.x + 0.05f + distC, C.y - 0.05f - distC, 0.1f, Vector3<float>(0,0,1), dynData); drawText(bufC, C.x + 0.05f + distC, C.y - 0.05f - distC, 0.1f, Color(0,0,1,1), dynData);
} }
int main() { int main() {
@@ -246,12 +253,14 @@ int main() {
// Triangle vertices as shown in the picture (Red, Green, Blue) // Triangle vertices as shown in the picture (Red, Green, Blue)
// Scaled down slightly to leave room for text // Scaled down slightly to leave room for text
Vector3<float> A(0.0f, 0.6f, 0.0f); // Red dot (top) Triangle<Vector3<float>> triangle(
Vector3<float> B(-0.6f, -0.6f, 0.0f); // Green dot (bottom left) Vector3<float>(0.0f, 0.6f, 0.0f), // Red dot (top)
Vector3<float> C(0.6f, -0.6f, 0.0f); // Blue dot (bottom right) Vector3<float>(-0.6f, -0.6f, 0.0f), // Green dot (bottom left)
Vector3<float>(0.6f, -0.6f, 0.0f) // Blue dot (bottom right)
);
std::vector<float> pointCloud; std::vector<float> pointCloud;
generatePointCloud(pointCloud, A, B, C); generatePointCloud(pointCloud, triangle);
GLuint VAO_cloud, VBO_cloud, VAO_dyn, VBO_dyn; GLuint VAO_cloud, VBO_cloud, VAO_dyn, VBO_dyn;
setupBuffers(VAO_cloud, VBO_cloud, pointCloud, VAO_dyn, VBO_dyn); setupBuffers(VAO_cloud, VBO_cloud, pointCloud, VAO_dyn, VBO_dyn);
@@ -293,10 +302,10 @@ int main() {
v -= diff / 2.0f; v -= diff / 2.0f;
} }
Vector3<float> P = A * u + B * v + C * w; Vector3<float> P = triangle.m_vertex1 * u + triangle.m_vertex2 * v + triangle.m_vertex3 * w;
std::vector<float> dynData; std::vector<float> dynData;
updateDynamicData(dynData, u, v, w, P, A, B, C); updateDynamicData(dynData, u, v, w, P, triangle);
glBindVertexArray(VAO_dyn); glBindVertexArray(VAO_dyn);
glBindBuffer(GL_ARRAY_BUFFER, VBO_dyn); glBindBuffer(GL_ARRAY_BUFFER, VBO_dyn);