From b4d24e8f2cb4838acc0b827f007e7faa609039ba Mon Sep 17 00:00:00 2001 From: ladevieq Date: Wed, 24 Dec 2025 15:35:21 +0100 Subject: Use build.bat for building Everything is included in main.cpp Do not rely on vcpkg anymore --- src/vec3.cpp | 50 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) (limited to 'src/vec3.cpp') diff --git a/src/vec3.cpp b/src/vec3.cpp index 73dec98..3167bc2 100644 --- a/src/vec3.cpp +++ b/src/vec3.cpp @@ -1,5 +1,5 @@ -#include #include +#include #include #include "utils.hpp" @@ -47,22 +47,51 @@ vec3& vec3::operator/=(float numerator) { return *this; } -float vec3::operator[](const int axis) { - if (axis > 2) { + +template +float vec3::get() const { + if constexpr (axis > 2) { return std::numeric_limits::infinity(); } - return v[axis]; + return arr[axis]; + // return static_cast(_mm_extract_ps(v, 3 - axis)); +} + +template +void vec3::set(float val) { + if constexpr (axis > 2) { + assert(false); + } + + arr[axis] = val; + // return static_cast(_mm_extract_ps(v, axis)); +} + +template float vec3::get<0>(void) const; +template float vec3::get<1>(void) const; +template float vec3::get<2>(void) const; + +template void vec3::set<0>(float); +template void vec3::set<1>(float); +template void vec3::set<2>(float); + +float vec3::operator[](int axis) const { + if (axis > 2) { + assert(false); + } + + return arr[axis]; } float vec3::length() const { __m128 t = _mm_dp_ps(v, v, 0b11110001); - return std::sqrt(t[0]); + return static_cast(std::sqrt(_mm_extract_ps(t, 0))); } -float vec3::length_sq() const { return (_mm_dp_ps(v, v, 0b11110001))[0]; } +float vec3::length_sq() const { return static_cast(_mm_extract_ps(_mm_dp_ps(v, v, 0b11110001), 0)); } -float vec3::dot(const vec3& vec) const { return (_mm_dp_ps(v, vec.v, 0b11110001))[0]; } +float vec3::dot(const vec3& vec) const { return static_cast(_mm_extract_ps(_mm_dp_ps(v, vec.v, 0b11110001), 0)); } vec3 vec3::cross(const vec3& vec) const { __m128 tmp0 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(3, 0, 2, 1)); @@ -90,11 +119,14 @@ vec3& vec3::normalize() { bool vec3::near_zero() const { // __m128 e = _mm_set1_ps(EPSILON); // _mm_cmplt_ps(_mm_andnot_ps(_mm_set1_ps(-0.0f), v), e); - return (fabs(v[0]) < EPSILON) && (fabs(v[1]) < EPSILON) && (fabs(v[2]) < EPSILON); + float v0 = fabs(static_cast(_mm_extract_ps(v, 0))); + float v1 = fabs(static_cast(_mm_extract_ps(v, 1))); + float v2 = fabs(static_cast(_mm_extract_ps(v, 2))); + return (v0 < EPSILON) && (v1 < EPSILON) && (v2 < EPSILON); } void vec3::print() const { - printf("%f %f %f\n", v[0], v[1], v[2]); + printf("%f %f %f\n", get<0>(), get<1>(), get<2>()); } vec3 vec3::random() { return { randd(), randd(), randd() }; } -- cgit v1.3