diff options
author | vimene <vincent.menegaux@gmail.com> | 2023-12-11 12:42:46 +0100 |
---|---|---|
committer | vimene <vincent.menegaux@gmail.com> | 2023-12-11 12:42:46 +0100 |
commit | 6b765a85cf81bf4b7162e4c9280dd4054581c611 (patch) | |
tree | 4156dff7c632e6511fe18daebeea506744ad1ff7 /src/o3d/tri_deriv.cpp | |
parent | ff2c784d4c4100f0301628e8a52a6910d776d067 (diff) | |
download | engine-6b765a85cf81bf4b7162e4c9280dd4054581c611.tar.gz |
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
Diffstat (limited to 'src/o3d/tri_deriv.cpp')
-rw-r--r-- | src/o3d/tri_deriv.cpp | 138 |
1 files changed, 69 insertions, 69 deletions
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 <vector> #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<TriangleDerivedVertex4>& tris, TriangleDerivedVertex4 t, int n, float x) { +static void _perspective_crop_x(std::vector<TriangleDerived>& 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<TriangleDerivedVertex4>& 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<TriangleDerivedVertex4>& 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<TriangleDerivedVertex4>& tris, Trian } } -static void _perspective_crop_y(std::vector<TriangleDerivedVertex4>& tris, TriangleDerivedVertex4 t, int n, float y) { +static void _perspective_crop_y(std::vector<TriangleDerived>& 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<TriangleDerivedVertex4>& 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<TriangleDerivedVertex4>& 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<TriangleDerivedVertex4>& tris, Trian } } -std::vector<TriangleDerivedVertex4> TriangleDerivedVertex4::perspective_crop_xy_out(float x1, float x2, float y1, float y2) const { - std::vector<TriangleDerivedVertex4> tris_final; - std::vector<TriangleDerivedVertex4> 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> TriangleDerived::perspective_crop_xy_out(float x1, float x2, float y1, float y2) const { + std::vector<TriangleDerived> tris_final; + std::vector<TriangleDerived> 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<TriangleDerivedVertex4> 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<TriangleDerived> 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<TriangleDerivedVertex4> 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<TriangleDerived> 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<TriangleDerivedVertex4>& tris, TriangleDerivedVertex4 t, int n, float z) { +static void _crop_z(std::vector<TriangleDerived>& 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<TriangleDerivedVertex4>& 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<TriangleDerivedVertex4>& 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<TriangleDerivedVertex4>& tris, TriangleDerivedVe } } -std::vector<TriangleDerivedVertex4> TriangleDerivedVertex4::crop_z_out(float z1, float z2) const { - std::vector<TriangleDerivedVertex4> 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<TriangleDerivedVertex4> tris2; +std::vector<TriangleDerived> TriangleDerived::crop_z_out(float z1, float z2) const { + std::vector<TriangleDerived> 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<TriangleDerived> 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()}; } |