From 1782ec9348922ecff435e9f1571456756266a97a Mon Sep 17 00:00:00 2001 From: Relintai Date: Sat, 13 Jan 2024 14:38:30 +0100 Subject: [PATCH] Added more helper methods to Mesh. --- sfw/render_core/mesh.cpp | 68 ++++++++++++++++++++++++++++++++++++++++ sfw/render_core/mesh.h | 20 +++++++++--- 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/sfw/render_core/mesh.cpp b/sfw/render_core/mesh.cpp index 0f25ac2..f93bd29 100644 --- a/sfw/render_core/mesh.cpp +++ b/sfw/render_core/mesh.cpp @@ -8,17 +8,34 @@ void Mesh::add_vertex2(float x, float y) { vertices.push_back(x); vertices.push_back(y); } +void Mesh::add_vertex2(const Vector2 &v) { + vertices.push_back(v.x); + vertices.push_back(v.y); +} + void Mesh::add_vertex3(float x, float y, float z) { vertices.push_back(x); vertices.push_back(y); vertices.push_back(z); } +void Mesh::add_vertex3(const Vector3 &v) { + vertices.push_back(v.x); + vertices.push_back(v.y); + vertices.push_back(v.z); +} void Mesh::add_normal(float x, float y, float z) { normals.push_back(x); normals.push_back(y); normals.push_back(z); } + +void Mesh::add_normal(const Vector3 &n) { + normals.push_back(n.x); + normals.push_back(n.y); + normals.push_back(n.z); +} + void Mesh::add_color(float r, float g, float b, float a) { colors.push_back(r); colors.push_back(g); @@ -36,6 +53,10 @@ void Mesh::add_uv(float u, float v) { uvs.push_back(u); uvs.push_back(v); } +void Mesh::add_uv(const Vector2 &uv) { + uvs.push_back(uv.x); + uvs.push_back(uv.y); +} void Mesh::add_index(uint32_t index) { indices.push_back(index); @@ -66,6 +87,49 @@ void Mesh::flip_faces() { } } +void Mesh::fill_colors(const Color &p_color) { + while (colors.size() % 4 != 0) { + colors.push_back(0); + } + + int needed_color_count = get_vertex_count() * 4; + + if (colors.size() > needed_color_count) { + colors.resize(needed_color_count); + return; + } + + while (colors.size() < needed_color_count) { + colors.push_back(p_color.r); + colors.push_back(p_color.g); + colors.push_back(p_color.b); + colors.push_back(p_color.a); + } +} + +void Mesh::fill_colors_random() { + while (colors.size() % 4 != 0) { + colors.push_back(0); + } + + int needed_color_count = get_vertex_count() * 4; + + if (colors.size() > needed_color_count) { + colors.resize(needed_color_count); + return; + } + + RandomPCG r; + r.randomize(); + + while (colors.size() < needed_color_count) { + colors.push_back(r.randf()); + colors.push_back(r.randf()); + colors.push_back(r.randf()); + colors.push_back(1); + } +} + void Mesh::update_aabb() { aabb = AABB(); @@ -233,6 +297,10 @@ void Mesh::render() { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } +int Mesh::get_vertex_count() const { + return vertices.size() / vertex_dimesions; +} + Mesh::Mesh() { VBO = 0; IBO = 0; diff --git a/sfw/render_core/mesh.h b/sfw/render_core/mesh.h index 335c91c..eb469db 100644 --- a/sfw/render_core/mesh.h +++ b/sfw/render_core/mesh.h @@ -2,10 +2,10 @@ #define MESH_H //--STRIP -#include "core/vector.h" -#include "core/int_types.h" -#include "core/color.h" #include "core/aabb.h" +#include "core/color.h" +#include "core/int_types.h" +#include "core/vector.h" #include "object/resource.h" @@ -16,19 +16,29 @@ class Mesh : public Resource { SFW_OBJECT(Mesh, Resource); public: + //TODO remove the float based api + void add_vertex2(float x, float y); + void add_vertex2(const Vector2 &v); + void add_vertex3(float x, float y, float z); + void add_vertex3(const Vector3 &v); void add_normal(float x, float y, float z); + void add_normal(const Vector3 &n); + void add_color(float r = 1, float g = 1, float b = 1, float a = 1); - void add_color(const Color &p_color); + void add_color(const Color &p_color); void add_uv(float u, float v); + void add_uv(const Vector2 &uv); void add_index(uint32_t index); void add_triangle(uint32_t i1, uint32_t i2, uint32_t i3); void flip_faces(); + void fill_colors(const Color &p_color); + void fill_colors_random(); void update_aabb(); @@ -38,6 +48,8 @@ public: void destroy(); void render(); + int get_vertex_count() const; + Mesh(); Mesh(int vert_dim); virtual ~Mesh();