Use enum class for vm_magnitude_squared

This commit is contained in:
Kp 2022-05-24 02:32:58 +00:00
parent cf51ac4ee0
commit 62635ec285
5 changed files with 30 additions and 22 deletions

View file

@ -17,7 +17,7 @@ class vm_distance_squared;
class vm_distance;
class vm_magnitude;
class vm_distance_squared;
class vm_magnitude_squared;
enum class vm_magnitude_squared : uint64_t;
struct vms_angvec;
struct vms_matrix;
struct vms_quaternion;

View file

@ -132,6 +132,10 @@ public:
d2(f2)
{
}
constexpr vm_distance_squared(vm_magnitude_squared m) :
d2{static_cast<int64_t>(static_cast<uint64_t>(m))}
{
}
constexpr bool operator<(const vm_distance_squared &rhs) const
{
return d2 < rhs.d2;
@ -171,20 +175,21 @@ public:
}
};
class vm_magnitude_squared : public vm_distance_squared
{
public:
constexpr explicit vm_magnitude_squared(const uint64_t &f2) :
vm_distance_squared(static_cast<fix64>(f2))
{
}
};
constexpr vm_distance_squared vm_distance::operator*(const vm_distance &rhs) const
{
return vm_distance_squared{static_cast<fix64>(static_cast<fix>(*this)) * static_cast<fix64>(static_cast<fix>(rhs))};
}
constexpr bool operator<(const vm_magnitude_squared a, const fix &b)
{
return static_cast<uint64_t>(a) < b;
}
constexpr bool operator<(const vm_magnitude_squared a, const vm_distance_squared b)
{
return static_cast<uint64_t>(a) < static_cast<uint64_t>(b.operator fix64());
}
#define DEFINE_SERIAL_VMS_VECTOR_TO_MESSAGE() \
DEFINE_SERIAL_UDT_TO_MESSAGE(vms_vector, v, (v.x, v.y, v.z)); \
ASSERT_SERIAL_UDT_MESSAGE_SIZE(vms_vector, 12)

View file

@ -160,7 +160,6 @@ fix vm_vec_dot(const vms_vector &v0,const vms_vector &v1)
return vm_vec_dot3(v0.x, v0.y, v0.z, v1);
}
//returns magnitude of a vector
vm_magnitude_squared vm_vec_mag2(const vms_vector &v)
{
const int64_t x = v.x;
@ -172,7 +171,7 @@ vm_magnitude_squared vm_vec_mag2(const vms_vector &v)
vm_magnitude vm_vec_mag(const vms_vector &v)
{
quadint q;
q.q = vm_vec_mag2(v).d2;
q.q = static_cast<uint64_t>(vm_vec_mag2(v));
return vm_magnitude{quad_sqrt(q)};
}

View file

@ -417,10 +417,10 @@ static vm_distance_squared check_vector_to_sphere_1(vms_vector &intp,const vms_v
if (mag_d == 0) {
const auto int_dist = vm_vec_mag2(w);
intp = p0;
if (int_dist.d2 < sphere_rad)
if (int_dist < sphere_rad)
return int_dist;
const fix64 sphere_rad64 = sphere_rad;
if (int_dist < vm_distance_squared{sphere_rad64 * sphere_rad64})
if (int_dist < vm_magnitude_squared{static_cast<uint64_t>(sphere_rad64 * sphere_rad64)})
return int_dist;
return vm_distance_squared::minimum_value();
}

View file

@ -1105,16 +1105,20 @@ imobjptridx_t find_homing_object_complete(const vms_vector &curpos, const vmobjp
}
const fix64 HOMING_MAX_TRACKABLE_DIST = F1_0*250;
vm_distance_squared max_trackable_dist{HOMING_MAX_TRACKABLE_DIST * HOMING_MAX_TRACKABLE_DIST};
fix min_trackable_dot = HOMING_MIN_TRACKABLE_DOT;
const auto max_trackable_dist =
#if defined(DXX_BUILD_DESCENT_II)
if (tracker_id == weapon_id_type::OMEGA_ID)
{
max_trackable_dist = OMEGA_MAX_TRACKABLE_DIST * OMEGA_MAX_TRACKABLE_DIST;
min_trackable_dot = OMEGA_MIN_TRACKABLE_DOT;
}
(tracker_id == weapon_id_type::OMEGA_ID)
? vm_distance_squared{(OMEGA_MAX_TRACKABLE_DIST * OMEGA_MAX_TRACKABLE_DIST)}
:
#endif
vm_distance_squared{HOMING_MAX_TRACKABLE_DIST * HOMING_MAX_TRACKABLE_DIST};
const auto min_trackable_dot =
#if defined(DXX_BUILD_DESCENT_II)
(tracker_id == weapon_id_type::OMEGA_ID)
? OMEGA_MIN_TRACKABLE_DOT
:
#endif
HOMING_MIN_TRACKABLE_DOT;
imobjptridx_t best_objnum = object_none;
range_for (const auto &&curobjp, vmobjptridx)