From 6b765a85cf81bf4b7162e4c9280dd4054581c611 Mon Sep 17 00:00:00 2001 From: vimene Date: Mon, 11 Dec 2023 12:42:46 +0100 Subject: improved mesh definition - In the context of mesh definition, splited indices into vertex index, normal index and vertex data index to be able to specify different normals and vertex data for different faces using the same vertex --- src/o3d/deriv_vertex.cpp | 6 +-- src/o3d/deriv_vertex.h | 8 +-- src/o3d/mesh.cpp | 28 +++++++--- src/o3d/mesh.h | 15 ++++-- src/o3d/tri.cpp | 10 ++-- src/o3d/tri.h | 21 ++++---- src/o3d/tri_deriv.cpp | 138 +++++++++++++++++++++++------------------------ src/o3d/tri_deriv.h | 22 ++++---- src/o3d/vertex.cpp | 9 +--- src/o3d/vertex.h | 16 ++---- 10 files changed, 141 insertions(+), 132 deletions(-) (limited to 'src/o3d') diff --git a/src/o3d/deriv_vertex.cpp b/src/o3d/deriv_vertex.cpp index dcb2bff..7123b1c 100644 --- a/src/o3d/deriv_vertex.cpp +++ b/src/o3d/deriv_vertex.cpp @@ -3,9 +3,9 @@ using namespace engine::o3d; -DerivedVertex4::DerivedVertex4(engine::math::Vector4 point, float b0, float b1) : point{point}, b0{b0}, b1{b1} { +DerivedVertex::DerivedVertex(engine::math::Vector4 vertex, float b0, float b1) : vertex{vertex}, b0{b0}, b1{b1} { } -DerivedVertex4 DerivedVertex4::div_by_w() const { - return {point.div_by_w(), b0, b1}; +DerivedVertex DerivedVertex::div_by_w() const { + return {vertex.div_by_w(), b0, b1}; } diff --git a/src/o3d/deriv_vertex.h b/src/o3d/deriv_vertex.h index 8945696..7524f9b 100644 --- a/src/o3d/deriv_vertex.h +++ b/src/o3d/deriv_vertex.h @@ -5,13 +5,13 @@ namespace engine::o3d { -class DerivedVertex4 { +class DerivedVertex { public: - engine::math::Vector4 point; + engine::math::Vector4 vertex; float b0, b1; - DerivedVertex4(engine::math::Vector4 point, float b0, float b1); - DerivedVertex4 div_by_w() const; + DerivedVertex(engine::math::Vector4 vertex, float b0, float b1); + DerivedVertex div_by_w() const; }; } diff --git a/src/o3d/mesh.cpp b/src/o3d/mesh.cpp index bf60cc8..2dba328 100644 --- a/src/o3d/mesh.cpp +++ b/src/o3d/mesh.cpp @@ -1,8 +1,8 @@ #include "o3d/mesh.h" #include #include +#include #include "math/vector.h" -#include "o3d/vertex.h" using namespace engine::o3d; @@ -32,16 +32,30 @@ using namespace engine::o3d; Mesh Mesh::plane() { return { { - { engine::math::Vector3(-1.f, 0.f, -1.f), {0.f, 0.f} }, - { engine::math::Vector3(+1.f, 0.f, -1.f), {1.f, 0.f} }, - { engine::math::Vector3(+1.f, 0.f, +1.f), {1.f, 1.f} }, - { engine::math::Vector3(-1.f, 0.f, +1.f), {0.f, 1.f} }, + {-1.f, 0.f, -1.f, 1.f}, + {+1.f, 0.f, -1.f, 1.f}, + {+1.f, 0.f, +1.f, 1.f}, + {-1.f, 0.f, +1.f, 1.f}, }, + { {0.f, 0.f, -1.f} }, { - { 0, 1, 2 }, { 2, 3, 0 }, + {0.f, 0.f}, + {1.f, 0.f}, + {1.f, 1.f}, + {0.f, 1.f}, + }, + { + {{ {{0, 0, 0}}, {{1, 0, 1}}, {{2, 0, 2}} }}, + {{ {{2, 0, 2}}, {{3, 0, 3}}, {{0, 0, 0}} }}, + {{ {{0, 0, 0}}, {{3, 0, 3}}, {{2, 0, 2}} }}, + {{ {{2, 0, 2}}, {{1, 0, 1}}, {{0, 0, 0}} }}, } }; } -Mesh::Mesh(std::vector pts, std::vector> faces) : pts{pts}, faces{faces} { +Mesh::Mesh(std::vector vertices, + std::vector normals, + std::vector vertices_data, + std::vector, 3>> indices) + : vertices{vertices}, normals{normals}, vertices_data{vertices_data}, indices{indices} { } diff --git a/src/o3d/mesh.h b/src/o3d/mesh.h index 34d1e09..4aad0e4 100644 --- a/src/o3d/mesh.h +++ b/src/o3d/mesh.h @@ -4,7 +4,9 @@ #include #include #include -#include "o3d/vertex.h" +#include +#include "math/vector.h" +#include "o3d/vertex_data.h" namespace engine::o3d { @@ -13,10 +15,15 @@ class Mesh { // static Mesh cube(); // this function should not be in this file static Mesh plane(); // this function should not be in this file - std::vector pts; - std::vector> faces; + std::vector vertices; + std::vector normals; + std::vector vertices_data; + std::vector, 3>> indices; - Mesh(std::vector pts, std::vector> faces); + Mesh(std::vector vertices, + std::vector normals, + std::vector vertices_data, + std::vector, 3>> indices); }; } diff --git a/src/o3d/tri.cpp b/src/o3d/tri.cpp index 08f5e7e..73410bf 100644 --- a/src/o3d/tri.cpp +++ b/src/o3d/tri.cpp @@ -1,16 +1,16 @@ -#include "o3d/tri_vertex.h" +#include "o3d/tri.h" #include #include "math/vector.h" #include "o3d/vertex_data.h" #include "o3d/deriv_vertex.h" #include "o3d/vertex.h" -#include "o3d/tri_deriv_vertex.h" +#include "o3d/tri_deriv.h" using namespace engine::o3d; -TriangleVertex4::TriangleVertex4(Vertex4 vertex1, Vertex4 vertex2, Vertex4 vertex3) : vertex1{vertex1}, vertex2{vertex2}, vertex3{vertex3} { +Triangle::Triangle(Vertex vertex1, Vertex vertex2, Vertex vertex3) : vertex1{vertex1}, vertex2{vertex2}, vertex3{vertex3} { } -TriangleDerivedVertex4 TriangleVertex4::to_derived() const { - return {{vertex1.point, 1.f, 0.f}, {vertex2.point, 0.f, 1.f}, {vertex3.point, 0.f, 0.f}}; +TriangleDerived Triangle::to_derived() const { + return {{vertex1.vertex, 1.f, 0.f}, {vertex2.vertex, 0.f, 1.f}, {vertex3.vertex, 0.f, 0.f}}; } diff --git a/src/o3d/tri.h b/src/o3d/tri.h index 715f649..7fa37fe 100644 --- a/src/o3d/tri.h +++ b/src/o3d/tri.h @@ -1,22 +1,23 @@ -#ifndef O3D_TRI_VERTEX_H -#define O3D_TRI_VERTEX_H +#ifndef O3D_TRI_H +#define O3D_TRI_H #include #include "o3d/vertex.h" -#include "o3d/tri_deriv_vertex.h" +#include "o3d/tri.h" +#include "o3d/tri_deriv.h" namespace engine::o3d { -class TriangleVertex4 { +class Triangle { public: - Vertex4 vertex1; - Vertex4 vertex2; - Vertex4 vertex3; + Vertex vertex1; + Vertex vertex2; + Vertex vertex3; - TriangleVertex4(Vertex4 vertex1, Vertex4 vertex2, Vertex4 vertex3); - TriangleDerivedVertex4 to_derived() const; + Triangle(Vertex vertex1, Vertex vertex2, Vertex vertex3); + TriangleDerived to_derived() const; }; } -#endif // O3D_TRI_VERTEX_H +#endif // O3D_TRI_H diff --git a/src/o3d/tri_deriv.cpp b/src/o3d/tri_deriv.cpp index 3605b51..81f60a0 100644 --- a/src/o3d/tri_deriv.cpp +++ b/src/o3d/tri_deriv.cpp @@ -1,18 +1,18 @@ -#include "o3d/tri_deriv_vertex.h" +#include "o3d/tri_deriv.h" #include #include "math/vector.h" #include "o3d/deriv_vertex.h" using namespace engine::o3d; -TriangleDerivedVertex4::TriangleDerivedVertex4(DerivedVertex4 derived_vertex1, DerivedVertex4 derived_vertex2, DerivedVertex4 derived_vertex3) +TriangleDerived::TriangleDerived(DerivedVertex derived_vertex1, DerivedVertex derived_vertex2, DerivedVertex derived_vertex3) : derived_vertex1{derived_vertex1}, derived_vertex2{derived_vertex2}, derived_vertex3{derived_vertex3} { } #define P1_OUT 1 #define P2_OUT 2 #define P3_OUT 4 -static void _perspective_crop_x(std::vector& tris, TriangleDerivedVertex4 t, int n, float x) { +static void _perspective_crop_x(std::vector& tris, TriangleDerived t, int n, float x) { switch (n) { case 0: tris.push_back(t); @@ -24,9 +24,9 @@ static void _perspective_crop_x(std::vector& tris, Trian case P1_OUT | P3_OUT: case P1_OUT | P2_OUT: { - DerivedVertex4* q1; - DerivedVertex4* q2; - DerivedVertex4* q3; + DerivedVertex* q1; + DerivedVertex* q2; + DerivedVertex* q3; switch (n) { case P1_OUT: case P2_OUT | P3_OUT: @@ -47,29 +47,29 @@ static void _perspective_crop_x(std::vector& tris, Trian q3 = &t.derived_vertex1; break; } - engine::math::Vector4 dq2 = q1->point - q2->point; - float fac2 = (x - q2->point.x) / dq2.x; - float r2w = 1.f / (fac2 / q1->point.w + (1.f - fac2) / q2->point.w); - float fac2_b = r2w * fac2 / q1->point.w; - DerivedVertex4 r2{ + engine::math::Vector4 dq2 = q1->vertex - q2->vertex; + float fac2 = (x - q2->vertex.x) / dq2.x; + float r2w = 1.f / (fac2 / q1->vertex.w + (1.f - fac2) / q2->vertex.w); + float fac2_b = r2w * fac2 / q1->vertex.w; + DerivedVertex r2{ { x, - q2->point.y + fac2 * dq2.y, - fac2_b * q1->point.z + (1.f - fac2_b) * q2->point.z, + q2->vertex.y + fac2 * dq2.y, + fac2_b * q1->vertex.z + (1.f - fac2_b) * q2->vertex.z, r2w }, fac2_b * q1->b0 + (1.f - fac2_b) * q2->b0, fac2_b * q1->b1 + (1.f - fac2_b) * q2->b1 }; - engine::math::Vector4 dq3 = q1->point - q3->point; - float fac3 = (x - q3->point.x) / dq3.x; - float r3w = 1.f / (fac3 / q1->point.w + (1.f - fac3) / q3->point.w); - float fac3_b = r3w * fac3 / q1->point.w; - DerivedVertex4 r3{ + engine::math::Vector4 dq3 = q1->vertex - q3->vertex; + float fac3 = (x - q3->vertex.x) / dq3.x; + float r3w = 1.f / (fac3 / q1->vertex.w + (1.f - fac3) / q3->vertex.w); + float fac3_b = r3w * fac3 / q1->vertex.w; + DerivedVertex r3{ { x, - q3->point.y + fac3 * dq3.y, - fac3_b * q1->point.z + (1.f - fac3_b) * q3->point.z, + q3->vertex.y + fac3 * dq3.y, + fac3_b * q1->vertex.z + (1.f - fac3_b) * q3->vertex.z, r3w }, fac3_b * q1->b0 + (1.f - fac3_b) * q3->b0, @@ -105,7 +105,7 @@ static void _perspective_crop_x(std::vector& tris, Trian } } -static void _perspective_crop_y(std::vector& tris, TriangleDerivedVertex4 t, int n, float y) { +static void _perspective_crop_y(std::vector& tris, TriangleDerived t, int n, float y) { switch (n) { case 0: tris.push_back(t); @@ -117,9 +117,9 @@ static void _perspective_crop_y(std::vector& tris, Trian case P1_OUT | P3_OUT: case P1_OUT | P2_OUT: { - DerivedVertex4* q1; - DerivedVertex4* q2; - DerivedVertex4* q3; + DerivedVertex* q1; + DerivedVertex* q2; + DerivedVertex* q3; switch (n) { case P1_OUT: case P2_OUT | P3_OUT: @@ -140,29 +140,29 @@ static void _perspective_crop_y(std::vector& tris, Trian q3 = &t.derived_vertex1; break; } - engine::math::Vector4 dq2 = q1->point - q2->point; - float fac2 = (y - q2->point.y) / dq2.y; - float r2w = 1.f / (fac2 / q1->point.w + (1.f - fac2) / q2->point.w); - float fac2_b = r2w * fac2 / q1->point.w; - DerivedVertex4 r2{ + engine::math::Vector4 dq2 = q1->vertex - q2->vertex; + float fac2 = (y - q2->vertex.y) / dq2.y; + float r2w = 1.f / (fac2 / q1->vertex.w + (1.f - fac2) / q2->vertex.w); + float fac2_b = r2w * fac2 / q1->vertex.w; + DerivedVertex r2{ { - q2->point.x + fac2 * dq2.x, + q2->vertex.x + fac2 * dq2.x, y, - fac2_b * q1->point.z + (1.f - fac2_b) * q2->point.z, + fac2_b * q1->vertex.z + (1.f - fac2_b) * q2->vertex.z, r2w }, fac2_b * q1->b0 + (1.f - fac2_b) * q2->b0, fac2_b * q1->b1 + (1.f - fac2_b) * q2->b1 }; - engine::math::Vector4 dq3 = q1->point - q3->point; - float fac3 = (y - q3->point.y) / dq3.y; - float r3w = 1.f / (fac3 / q1->point.w + (1.f - fac3) / q3->point.w); - float fac3_b = r3w * fac3 / q1->point.w; - DerivedVertex4 r3{ + engine::math::Vector4 dq3 = q1->vertex - q3->vertex; + float fac3 = (y - q3->vertex.y) / dq3.y; + float r3w = 1.f / (fac3 / q1->vertex.w + (1.f - fac3) / q3->vertex.w); + float fac3_b = r3w * fac3 / q1->vertex.w; + DerivedVertex r3{ { - q3->point.x + fac3 * dq3.x, + q3->vertex.x + fac3 * dq3.x, y, - fac3_b * q1->point.z + (1.f - fac3_b) * q3->point.z, + fac3_b * q1->vertex.z + (1.f - fac3_b) * q3->vertex.z, r3w }, fac3_b * q1->b0 + (1.f - fac3_b) * q3->b0, @@ -198,24 +198,24 @@ static void _perspective_crop_y(std::vector& tris, Trian } } -std::vector TriangleDerivedVertex4::perspective_crop_xy_out(float x1, float x2, float y1, float y2) const { - std::vector tris_final; - std::vector tris1; - _perspective_crop_x(tris1, *this, (derived_vertex1.point.x < x1) | ((derived_vertex2.point.x < x1) << 1) | ((derived_vertex3.point.x < x1) << 2), x1); +std::vector TriangleDerived::perspective_crop_xy_out(float x1, float x2, float y1, float y2) const { + std::vector tris_final; + std::vector tris1; + _perspective_crop_x(tris1, *this, (derived_vertex1.vertex.x < x1) | ((derived_vertex2.vertex.x < x1) << 1) | ((derived_vertex3.vertex.x < x1) << 2), x1); for (auto t1 : tris1) { - std::vector tris2; - _perspective_crop_x(tris2, t1, (t1.derived_vertex1.point.x > x2) | ((t1.derived_vertex2.point.x > x2) << 1) | ((t1.derived_vertex3.point.x > x2) << 2), x2); + std::vector tris2; + _perspective_crop_x(tris2, t1, (t1.derived_vertex1.vertex.x > x2) | ((t1.derived_vertex2.vertex.x > x2) << 1) | ((t1.derived_vertex3.vertex.x > x2) << 2), x2); for (auto t2 : tris2) { - std::vector tris3; - _perspective_crop_y(tris3, t2, (t2.derived_vertex1.point.y < y1) | ((t2.derived_vertex2.point.y < y1) << 1) | ((t2.derived_vertex3.point.y < y1) << 2), y1); + std::vector tris3; + _perspective_crop_y(tris3, t2, (t2.derived_vertex1.vertex.y < y1) | ((t2.derived_vertex2.vertex.y < y1) << 1) | ((t2.derived_vertex3.vertex.y < y1) << 2), y1); for (auto t3 : tris3) - _perspective_crop_y(tris_final, t3, (t3.derived_vertex1.point.y > y2) | ((t3.derived_vertex2.point.y > y2) << 1) | ((t3.derived_vertex3.point.y > y2) << 2), y2); + _perspective_crop_y(tris_final, t3, (t3.derived_vertex1.vertex.y > y2) | ((t3.derived_vertex2.vertex.y > y2) << 1) | ((t3.derived_vertex3.vertex.y > y2) << 2), y2); } } return tris_final; } -static void _crop_z(std::vector& tris, TriangleDerivedVertex4 t, int n, float z) { +static void _crop_z(std::vector& tris, TriangleDerived t, int n, float z) { switch (n) { case 0: tris.push_back(t); @@ -227,9 +227,9 @@ static void _crop_z(std::vector& tris, TriangleDerivedVe case P1_OUT | P3_OUT: case P1_OUT | P2_OUT: { - DerivedVertex4* q1; - DerivedVertex4* q2; - DerivedVertex4* q3; + DerivedVertex* q1; + DerivedVertex* q2; + DerivedVertex* q3; switch (n) { case P1_OUT: case P2_OUT | P3_OUT: @@ -250,26 +250,26 @@ static void _crop_z(std::vector& tris, TriangleDerivedVe q3 = &t.derived_vertex1; break; } - engine::math::Vector4 dq2 = q1->point - q2->point; - float fac2 = (z - q2->point.z) / dq2.z; - DerivedVertex4 r2{ + engine::math::Vector4 dq2 = q1->vertex - q2->vertex; + float fac2 = (z - q2->vertex.z) / dq2.z; + DerivedVertex r2{ { - q2->point.x + fac2 * dq2.x, - q2->point.y + fac2 * dq2.y, + q2->vertex.x + fac2 * dq2.x, + q2->vertex.y + fac2 * dq2.y, z, - q2->point.w + fac2 * dq2.w + q2->vertex.w + fac2 * dq2.w }, fac2 * q1->b0 + (1.f - fac2) * q2->b0, fac2 * q1->b1 + (1.f - fac2) * q2->b1 }; - engine::math::Vector4 dq3 = q1->point - q3->point; - float fac3 = (z - q3->point.z) / dq3.z; - DerivedVertex4 r3{ + engine::math::Vector4 dq3 = q1->vertex - q3->vertex; + float fac3 = (z - q3->vertex.z) / dq3.z; + DerivedVertex r3{ { - q3->point.x + fac3 * dq3.x, - q3->point.y + fac3 * dq3.y, + q3->vertex.x + fac3 * dq3.x, + q3->vertex.y + fac3 * dq3.y, z, - q3->point.w + fac3 * dq3.w + q3->vertex.w + fac3 * dq3.w }, fac3 * q1->b0 + (1.f - fac3) * q3->b0, fac3 * q1->b1 + (1.f - fac3) * q3->b1 @@ -304,18 +304,18 @@ static void _crop_z(std::vector& tris, TriangleDerivedVe } } -std::vector TriangleDerivedVertex4::crop_z_out(float z1, float z2) const { - std::vector tris; - _crop_z(tris, *this, (derived_vertex1.point.z < z1) | ((derived_vertex2.point.z < z1) << 1) | ((derived_vertex3.point.z < z1) << 2), z1); - std::vector tris2; +std::vector TriangleDerived::crop_z_out(float z1, float z2) const { + std::vector tris; + _crop_z(tris, *this, (derived_vertex1.vertex.z < z1) | ((derived_vertex2.vertex.z < z1) << 1) | ((derived_vertex3.vertex.z < z1) << 2), z1); + std::vector tris2; for (auto t : tris) - _crop_z(tris2, t, (t.derived_vertex1.point.z > z2) | ((t.derived_vertex2.point.z > z2) << 1) | ((t.derived_vertex3.point.z > z2) << 2), z2); + _crop_z(tris2, t, (t.derived_vertex1.vertex.z > z2) | ((t.derived_vertex2.vertex.z > z2) << 1) | ((t.derived_vertex3.vertex.z > z2) << 2), z2); return tris2; } #undef P1_OUT #undef P2_OUT #undef P3_OUT -TriangleDerivedVertex4 TriangleDerivedVertex4::div_by_w() const { +TriangleDerived TriangleDerived::div_by_w() const { return {derived_vertex1.div_by_w(), derived_vertex2.div_by_w(), derived_vertex3.div_by_w()}; } diff --git a/src/o3d/tri_deriv.h b/src/o3d/tri_deriv.h index 41ed4dc..201539b 100644 --- a/src/o3d/tri_deriv.h +++ b/src/o3d/tri_deriv.h @@ -1,5 +1,5 @@ -#ifndef O3D_TRI_DERIV_VERTEX_H -#define O3D_TRI_DERIV_VERTEX_H +#ifndef O3D_TRI_VERTEX_H +#define O3D_TRI_VERTEX_H #include #include "o3d/vertex.h" @@ -7,18 +7,18 @@ namespace engine::o3d { -class TriangleDerivedVertex4 { +class TriangleDerived { public: - DerivedVertex4 derived_vertex1; - DerivedVertex4 derived_vertex2; - DerivedVertex4 derived_vertex3; + DerivedVertex derived_vertex1; + DerivedVertex derived_vertex2; + DerivedVertex derived_vertex3; - TriangleDerivedVertex4(DerivedVertex4 derived_vertex1, DerivedVertex4 derived_vertex2, DerivedVertex4 derived_vertex3); - std::vector perspective_crop_xy_out(float x1, float x2, float y1, float y2) const; - std::vector crop_z_out(float z1, float z2) const; - TriangleDerivedVertex4 div_by_w() const; + TriangleDerived(DerivedVertex derived_vertex1, DerivedVertex derived_vertex2, DerivedVertex derived_vertex3); + std::vector perspective_crop_xy_out(float x1, float x2, float y1, float y2) const; + std::vector crop_z_out(float z1, float z2) const; + TriangleDerived div_by_w() const; }; } -#endif // O3D_TRI_DERIV_VERTEX_H +#endif // O3D_TRI_VERTEX_H diff --git a/src/o3d/vertex.cpp b/src/o3d/vertex.cpp index ec9c05f..5845e27 100644 --- a/src/o3d/vertex.cpp +++ b/src/o3d/vertex.cpp @@ -4,11 +4,6 @@ using namespace engine::o3d; -Vertex3::Vertex3(engine::math::Vector3 point, VertexData data) : point{point}, data{data} { -} - -Vertex4::Vertex4(engine::math::Vector4 point, VertexData data) : point{point}, data{data} { -} - -Vertex4::Vertex4(Vertex3 vertex) : point{vertex.point}, data{vertex.data} { +Vertex::Vertex(engine::math::Vector4 vertex, engine::math::Vector3 normal, VertexData data) + : vertex{vertex}, normal{normal}, data{data} { } diff --git a/src/o3d/vertex.h b/src/o3d/vertex.h index b0dd195..1247fc8 100644 --- a/src/o3d/vertex.h +++ b/src/o3d/vertex.h @@ -6,21 +6,13 @@ namespace engine::o3d { -class Vertex3 { +class Vertex { public: - engine::math::Vector3 point; + engine::math::Vector4 vertex; + engine::math::Vector3 normal; VertexData data; - Vertex3(engine::math::Vector3 point, VertexData data); -}; - -class Vertex4 { - public: - engine::math::Vector4 point; - VertexData data; - - Vertex4(engine::math::Vector4 point, VertexData data); - Vertex4(Vertex3 vertex); + Vertex(engine::math::Vector4 vertex, engine::math::Vector3 normal, VertexData data); }; } -- cgit v1.2.3