From ff2c784d4c4100f0301628e8a52a6910d776d067 Mon Sep 17 00:00:00 2001 From: vimene Date: Mon, 11 Dec 2023 12:37:19 +0100 Subject: renamed tri{_deriv,}_vertex.{h,cpp} to tri{_deriv,}.{h,cpp} --- src/o3d/tri.cpp | 16 +++ src/o3d/tri.h | 22 +++ src/o3d/tri_deriv.cpp | 321 +++++++++++++++++++++++++++++++++++++++++++ src/o3d/tri_deriv.h | 24 ++++ src/o3d/tri_deriv_vertex.cpp | 321 ------------------------------------------- src/o3d/tri_deriv_vertex.h | 24 ---- src/o3d/tri_vertex.cpp | 16 --- src/o3d/tri_vertex.h | 22 --- 8 files changed, 383 insertions(+), 383 deletions(-) create mode 100644 src/o3d/tri.cpp create mode 100644 src/o3d/tri.h create mode 100644 src/o3d/tri_deriv.cpp create mode 100644 src/o3d/tri_deriv.h delete mode 100644 src/o3d/tri_deriv_vertex.cpp delete mode 100644 src/o3d/tri_deriv_vertex.h delete mode 100644 src/o3d/tri_vertex.cpp delete mode 100644 src/o3d/tri_vertex.h diff --git a/src/o3d/tri.cpp b/src/o3d/tri.cpp new file mode 100644 index 0000000..08f5e7e --- /dev/null +++ b/src/o3d/tri.cpp @@ -0,0 +1,16 @@ +#include "o3d/tri_vertex.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" + +using namespace engine::o3d; + +TriangleVertex4::TriangleVertex4(Vertex4 vertex1, Vertex4 vertex2, Vertex4 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}}; +} diff --git a/src/o3d/tri.h b/src/o3d/tri.h new file mode 100644 index 0000000..715f649 --- /dev/null +++ b/src/o3d/tri.h @@ -0,0 +1,22 @@ +#ifndef O3D_TRI_VERTEX_H +#define O3D_TRI_VERTEX_H + +#include +#include "o3d/vertex.h" +#include "o3d/tri_deriv_vertex.h" + +namespace engine::o3d { + +class TriangleVertex4 { + public: + Vertex4 vertex1; + Vertex4 vertex2; + Vertex4 vertex3; + + TriangleVertex4(Vertex4 vertex1, Vertex4 vertex2, Vertex4 vertex3); + TriangleDerivedVertex4 to_derived() const; +}; + +} + +#endif // O3D_TRI_VERTEX_H diff --git a/src/o3d/tri_deriv.cpp b/src/o3d/tri_deriv.cpp new file mode 100644 index 0000000..3605b51 --- /dev/null +++ b/src/o3d/tri_deriv.cpp @@ -0,0 +1,321 @@ +#include "o3d/tri_deriv_vertex.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) + : 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) { + switch (n) { + case 0: + tris.push_back(t); + break; + case P1_OUT: + case P2_OUT: + case P3_OUT: + case P2_OUT | P3_OUT: + case P1_OUT | P3_OUT: + case P1_OUT | P2_OUT: + { + DerivedVertex4* q1; + DerivedVertex4* q2; + DerivedVertex4* q3; + switch (n) { + case P1_OUT: + case P2_OUT | P3_OUT: + q1 = &t.derived_vertex1; + q2 = &t.derived_vertex2; + q3 = &t.derived_vertex3; + break; + case P2_OUT: + case P1_OUT | P3_OUT: + q1 = &t.derived_vertex2; + q2 = &t.derived_vertex1; + q3 = &t.derived_vertex3; + break; + case P3_OUT: + case P1_OUT | P2_OUT: + q1 = &t.derived_vertex3; + q2 = &t.derived_vertex2; + 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{ + { + x, + q2->point.y + fac2 * dq2.y, + fac2_b * q1->point.z + (1.f - fac2_b) * q2->point.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{ + { + x, + q3->point.y + fac3 * dq3.y, + fac3_b * q1->point.z + (1.f - fac3_b) * q3->point.z, + r3w + }, + fac3_b * q1->b0 + (1.f - fac3_b) * q3->b0, + fac3_b * q1->b1 + (1.f - fac3_b) * q3->b1 + }; + switch (n) { + case P1_OUT: + tris.push_back({r3, *q2, *q3}); + tris.push_back({r3, r2, *q2}); + break; + case P2_OUT: + tris.push_back({r2, *q3, *q2}); + tris.push_back({r2, r3, *q3}); + break; + case P3_OUT: + tris.push_back({r2, *q3, *q2}); + tris.push_back({r2, r3, *q3}); + break; + case P2_OUT | P3_OUT: + tris.push_back({*q1, r2, r3}); + break; + case P1_OUT | P3_OUT: + tris.push_back({*q1, r3, r2}); + break; + case P1_OUT | P2_OUT: + tris.push_back({*q1, r3, r2}); + break; + } + } + break; + case P1_OUT | P2_OUT | P3_OUT: + break; + } +} + +static void _perspective_crop_y(std::vector& tris, TriangleDerivedVertex4 t, int n, float y) { + switch (n) { + case 0: + tris.push_back(t); + break; + case P1_OUT: + case P2_OUT: + case P3_OUT: + case P2_OUT | P3_OUT: + case P1_OUT | P3_OUT: + case P1_OUT | P2_OUT: + { + DerivedVertex4* q1; + DerivedVertex4* q2; + DerivedVertex4* q3; + switch (n) { + case P1_OUT: + case P2_OUT | P3_OUT: + q1 = &t.derived_vertex1; + q2 = &t.derived_vertex2; + q3 = &t.derived_vertex3; + break; + case P2_OUT: + case P1_OUT | P3_OUT: + q1 = &t.derived_vertex2; + q2 = &t.derived_vertex1; + q3 = &t.derived_vertex3; + break; + case P3_OUT: + case P1_OUT | P2_OUT: + q1 = &t.derived_vertex3; + q2 = &t.derived_vertex2; + 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{ + { + q2->point.x + fac2 * dq2.x, + y, + fac2_b * q1->point.z + (1.f - fac2_b) * q2->point.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{ + { + q3->point.x + fac3 * dq3.x, + y, + fac3_b * q1->point.z + (1.f - fac3_b) * q3->point.z, + r3w + }, + fac3_b * q1->b0 + (1.f - fac3_b) * q3->b0, + fac3_b * q1->b1 + (1.f - fac3_b) * q3->b1 + }; + switch (n) { + case P1_OUT: + tris.push_back({r3, *q2, *q3}); + tris.push_back({r3, r2, *q2}); + break; + case P2_OUT: + tris.push_back({r2, *q3, *q2}); + tris.push_back({r2, r3, *q3}); + break; + case P3_OUT: + tris.push_back({r2, *q3, *q2}); + tris.push_back({r2, r3, *q3}); + break; + case P2_OUT | P3_OUT: + tris.push_back({*q1, r2, r3}); + break; + case P1_OUT | P3_OUT: + tris.push_back({*q1, r3, r2}); + break; + case P1_OUT | P2_OUT: + tris.push_back({*q1, r3, r2}); + break; + } + } + break; + case P1_OUT | P2_OUT | P3_OUT: + break; + } +} + +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); + 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); + 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); + 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); + } + } + return tris_final; +} + +static void _crop_z(std::vector& tris, TriangleDerivedVertex4 t, int n, float z) { + switch (n) { + case 0: + tris.push_back(t); + break; + case P1_OUT: + case P2_OUT: + case P3_OUT: + case P2_OUT | P3_OUT: + case P1_OUT | P3_OUT: + case P1_OUT | P2_OUT: + { + DerivedVertex4* q1; + DerivedVertex4* q2; + DerivedVertex4* q3; + switch (n) { + case P1_OUT: + case P2_OUT | P3_OUT: + q1 = &t.derived_vertex1; + q2 = &t.derived_vertex2; + q3 = &t.derived_vertex3; + break; + case P2_OUT: + case P1_OUT | P3_OUT: + q1 = &t.derived_vertex2; + q2 = &t.derived_vertex1; + q3 = &t.derived_vertex3; + break; + case P3_OUT: + case P1_OUT | P2_OUT: + q1 = &t.derived_vertex3; + q2 = &t.derived_vertex2; + q3 = &t.derived_vertex1; + break; + } + engine::math::Vector4 dq2 = q1->point - q2->point; + float fac2 = (z - q2->point.z) / dq2.z; + DerivedVertex4 r2{ + { + q2->point.x + fac2 * dq2.x, + q2->point.y + fac2 * dq2.y, + z, + q2->point.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{ + { + q3->point.x + fac3 * dq3.x, + q3->point.y + fac3 * dq3.y, + z, + q3->point.w + fac3 * dq3.w + }, + fac3 * q1->b0 + (1.f - fac3) * q3->b0, + fac3 * q1->b1 + (1.f - fac3) * q3->b1 + }; + switch (n) { + case P1_OUT: + tris.push_back({r3, *q2, *q3}); + tris.push_back({r3, r2, *q2}); + break; + case P2_OUT: + tris.push_back({r2, *q3, *q2}); + tris.push_back({r2, r3, *q3}); + break; + case P3_OUT: + tris.push_back({r2, *q3, *q2}); + tris.push_back({r2, r3, *q3}); + break; + case P2_OUT | P3_OUT: + tris.push_back({*q1, r2, r3}); + break; + case P1_OUT | P3_OUT: + tris.push_back({*q1, r3, r2}); + break; + case P1_OUT | P2_OUT: + tris.push_back({*q1, r3, r2}); + break; + } + } + break; + case P1_OUT | P2_OUT | P3_OUT: + break; + } +} + +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; + 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); + return tris2; +} +#undef P1_OUT +#undef P2_OUT +#undef P3_OUT + +TriangleDerivedVertex4 TriangleDerivedVertex4::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 new file mode 100644 index 0000000..41ed4dc --- /dev/null +++ b/src/o3d/tri_deriv.h @@ -0,0 +1,24 @@ +#ifndef O3D_TRI_DERIV_VERTEX_H +#define O3D_TRI_DERIV_VERTEX_H + +#include +#include "o3d/vertex.h" +#include "o3d/deriv_vertex.h" + +namespace engine::o3d { + +class TriangleDerivedVertex4 { + public: + DerivedVertex4 derived_vertex1; + DerivedVertex4 derived_vertex2; + DerivedVertex4 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; +}; + +} + +#endif // O3D_TRI_DERIV_VERTEX_H diff --git a/src/o3d/tri_deriv_vertex.cpp b/src/o3d/tri_deriv_vertex.cpp deleted file mode 100644 index 3605b51..0000000 --- a/src/o3d/tri_deriv_vertex.cpp +++ /dev/null @@ -1,321 +0,0 @@ -#include "o3d/tri_deriv_vertex.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) - : 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) { - switch (n) { - case 0: - tris.push_back(t); - break; - case P1_OUT: - case P2_OUT: - case P3_OUT: - case P2_OUT | P3_OUT: - case P1_OUT | P3_OUT: - case P1_OUT | P2_OUT: - { - DerivedVertex4* q1; - DerivedVertex4* q2; - DerivedVertex4* q3; - switch (n) { - case P1_OUT: - case P2_OUT | P3_OUT: - q1 = &t.derived_vertex1; - q2 = &t.derived_vertex2; - q3 = &t.derived_vertex3; - break; - case P2_OUT: - case P1_OUT | P3_OUT: - q1 = &t.derived_vertex2; - q2 = &t.derived_vertex1; - q3 = &t.derived_vertex3; - break; - case P3_OUT: - case P1_OUT | P2_OUT: - q1 = &t.derived_vertex3; - q2 = &t.derived_vertex2; - 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{ - { - x, - q2->point.y + fac2 * dq2.y, - fac2_b * q1->point.z + (1.f - fac2_b) * q2->point.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{ - { - x, - q3->point.y + fac3 * dq3.y, - fac3_b * q1->point.z + (1.f - fac3_b) * q3->point.z, - r3w - }, - fac3_b * q1->b0 + (1.f - fac3_b) * q3->b0, - fac3_b * q1->b1 + (1.f - fac3_b) * q3->b1 - }; - switch (n) { - case P1_OUT: - tris.push_back({r3, *q2, *q3}); - tris.push_back({r3, r2, *q2}); - break; - case P2_OUT: - tris.push_back({r2, *q3, *q2}); - tris.push_back({r2, r3, *q3}); - break; - case P3_OUT: - tris.push_back({r2, *q3, *q2}); - tris.push_back({r2, r3, *q3}); - break; - case P2_OUT | P3_OUT: - tris.push_back({*q1, r2, r3}); - break; - case P1_OUT | P3_OUT: - tris.push_back({*q1, r3, r2}); - break; - case P1_OUT | P2_OUT: - tris.push_back({*q1, r3, r2}); - break; - } - } - break; - case P1_OUT | P2_OUT | P3_OUT: - break; - } -} - -static void _perspective_crop_y(std::vector& tris, TriangleDerivedVertex4 t, int n, float y) { - switch (n) { - case 0: - tris.push_back(t); - break; - case P1_OUT: - case P2_OUT: - case P3_OUT: - case P2_OUT | P3_OUT: - case P1_OUT | P3_OUT: - case P1_OUT | P2_OUT: - { - DerivedVertex4* q1; - DerivedVertex4* q2; - DerivedVertex4* q3; - switch (n) { - case P1_OUT: - case P2_OUT | P3_OUT: - q1 = &t.derived_vertex1; - q2 = &t.derived_vertex2; - q3 = &t.derived_vertex3; - break; - case P2_OUT: - case P1_OUT | P3_OUT: - q1 = &t.derived_vertex2; - q2 = &t.derived_vertex1; - q3 = &t.derived_vertex3; - break; - case P3_OUT: - case P1_OUT | P2_OUT: - q1 = &t.derived_vertex3; - q2 = &t.derived_vertex2; - 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{ - { - q2->point.x + fac2 * dq2.x, - y, - fac2_b * q1->point.z + (1.f - fac2_b) * q2->point.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{ - { - q3->point.x + fac3 * dq3.x, - y, - fac3_b * q1->point.z + (1.f - fac3_b) * q3->point.z, - r3w - }, - fac3_b * q1->b0 + (1.f - fac3_b) * q3->b0, - fac3_b * q1->b1 + (1.f - fac3_b) * q3->b1 - }; - switch (n) { - case P1_OUT: - tris.push_back({r3, *q2, *q3}); - tris.push_back({r3, r2, *q2}); - break; - case P2_OUT: - tris.push_back({r2, *q3, *q2}); - tris.push_back({r2, r3, *q3}); - break; - case P3_OUT: - tris.push_back({r2, *q3, *q2}); - tris.push_back({r2, r3, *q3}); - break; - case P2_OUT | P3_OUT: - tris.push_back({*q1, r2, r3}); - break; - case P1_OUT | P3_OUT: - tris.push_back({*q1, r3, r2}); - break; - case P1_OUT | P2_OUT: - tris.push_back({*q1, r3, r2}); - break; - } - } - break; - case P1_OUT | P2_OUT | P3_OUT: - break; - } -} - -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); - 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); - 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); - 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); - } - } - return tris_final; -} - -static void _crop_z(std::vector& tris, TriangleDerivedVertex4 t, int n, float z) { - switch (n) { - case 0: - tris.push_back(t); - break; - case P1_OUT: - case P2_OUT: - case P3_OUT: - case P2_OUT | P3_OUT: - case P1_OUT | P3_OUT: - case P1_OUT | P2_OUT: - { - DerivedVertex4* q1; - DerivedVertex4* q2; - DerivedVertex4* q3; - switch (n) { - case P1_OUT: - case P2_OUT | P3_OUT: - q1 = &t.derived_vertex1; - q2 = &t.derived_vertex2; - q3 = &t.derived_vertex3; - break; - case P2_OUT: - case P1_OUT | P3_OUT: - q1 = &t.derived_vertex2; - q2 = &t.derived_vertex1; - q3 = &t.derived_vertex3; - break; - case P3_OUT: - case P1_OUT | P2_OUT: - q1 = &t.derived_vertex3; - q2 = &t.derived_vertex2; - q3 = &t.derived_vertex1; - break; - } - engine::math::Vector4 dq2 = q1->point - q2->point; - float fac2 = (z - q2->point.z) / dq2.z; - DerivedVertex4 r2{ - { - q2->point.x + fac2 * dq2.x, - q2->point.y + fac2 * dq2.y, - z, - q2->point.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{ - { - q3->point.x + fac3 * dq3.x, - q3->point.y + fac3 * dq3.y, - z, - q3->point.w + fac3 * dq3.w - }, - fac3 * q1->b0 + (1.f - fac3) * q3->b0, - fac3 * q1->b1 + (1.f - fac3) * q3->b1 - }; - switch (n) { - case P1_OUT: - tris.push_back({r3, *q2, *q3}); - tris.push_back({r3, r2, *q2}); - break; - case P2_OUT: - tris.push_back({r2, *q3, *q2}); - tris.push_back({r2, r3, *q3}); - break; - case P3_OUT: - tris.push_back({r2, *q3, *q2}); - tris.push_back({r2, r3, *q3}); - break; - case P2_OUT | P3_OUT: - tris.push_back({*q1, r2, r3}); - break; - case P1_OUT | P3_OUT: - tris.push_back({*q1, r3, r2}); - break; - case P1_OUT | P2_OUT: - tris.push_back({*q1, r3, r2}); - break; - } - } - break; - case P1_OUT | P2_OUT | P3_OUT: - break; - } -} - -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; - 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); - return tris2; -} -#undef P1_OUT -#undef P2_OUT -#undef P3_OUT - -TriangleDerivedVertex4 TriangleDerivedVertex4::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_vertex.h b/src/o3d/tri_deriv_vertex.h deleted file mode 100644 index 41ed4dc..0000000 --- a/src/o3d/tri_deriv_vertex.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef O3D_TRI_DERIV_VERTEX_H -#define O3D_TRI_DERIV_VERTEX_H - -#include -#include "o3d/vertex.h" -#include "o3d/deriv_vertex.h" - -namespace engine::o3d { - -class TriangleDerivedVertex4 { - public: - DerivedVertex4 derived_vertex1; - DerivedVertex4 derived_vertex2; - DerivedVertex4 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; -}; - -} - -#endif // O3D_TRI_DERIV_VERTEX_H diff --git a/src/o3d/tri_vertex.cpp b/src/o3d/tri_vertex.cpp deleted file mode 100644 index 08f5e7e..0000000 --- a/src/o3d/tri_vertex.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "o3d/tri_vertex.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" - -using namespace engine::o3d; - -TriangleVertex4::TriangleVertex4(Vertex4 vertex1, Vertex4 vertex2, Vertex4 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}}; -} diff --git a/src/o3d/tri_vertex.h b/src/o3d/tri_vertex.h deleted file mode 100644 index 715f649..0000000 --- a/src/o3d/tri_vertex.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef O3D_TRI_VERTEX_H -#define O3D_TRI_VERTEX_H - -#include -#include "o3d/vertex.h" -#include "o3d/tri_deriv_vertex.h" - -namespace engine::o3d { - -class TriangleVertex4 { - public: - Vertex4 vertex1; - Vertex4 vertex2; - Vertex4 vertex3; - - TriangleVertex4(Vertex4 vertex1, Vertex4 vertex2, Vertex4 vertex3); - TriangleDerivedVertex4 to_derived() const; -}; - -} - -#endif // O3D_TRI_VERTEX_H -- cgit v1.2.3