Compare commits

...

4 commits

Author SHA1 Message Date
7e4041e50f Merge branch 'dev', version 2.1.0
All checks were successful
Run UnitTest / build-and-run-UnitTest (push) Successful in 5s
2024-05-06 11:32:57 +09:00
30a24e72a1 Update Changelog, version to 2.1.0
Version minor bump due to new feature SC_SACD_Scale_Mat4.
2024-05-06 11:31:59 +09:00
e0bd54742d Add Scale Mat4 creation function
Also added some relevant UnitTests.
2024-05-06 11:30:33 +09:00
a0b41ba274 Minor refactoring
Instead of passing ptr + size to a span, pass a 1-size array that is
automatically coerced into a span (when calling Get_Box_MinMax(...)).
2024-05-06 11:24:11 +09:00
5 changed files with 64 additions and 13 deletions

View file

@ -6,7 +6,7 @@ set(SC_3D_CollisionDetectionHelpers_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/src/sc_
add_library(SC_3D_CollisionDetectionHelpers ${SC_3D_CollisionDetectionHelpers_SOURCES})
set_target_properties(SC_3D_CollisionDetectionHelpers PROPERTIES VERSION 2.0.2 SOVERSION 2)
set_target_properties(SC_3D_CollisionDetectionHelpers PROPERTIES VERSION 2.1.0 SOVERSION 2)
target_compile_features(SC_3D_CollisionDetectionHelpers PUBLIC cxx_std_20)
if(NOT DEFINED CMAKE_BUILD_TYPE OR "${CMAKE_BUILD_TYPE}" STREQUAL "")

View file

@ -1,11 +1,13 @@
# Changelog
## Upcoming Changes
## Version 2.1.0
Refactoring of internally used function(s).
This library now requires a compiler that supports C++20.
Add SC_SACD_Scale_Mat4(...) fn.
## Version 2.0.2
Fix SC_SACD_Translate_Mat4(...). It was missing a "1" in the first element of

View file

@ -350,25 +350,25 @@ int SC_SACD_Sphere_Box_Collision(const SC_SACD_Sphere *sphere,
// First check plane where normal = box_pos - sphere_pos.
SC_SACD_Vec3 sphere_pos{sphere->x, sphere->y, sphere->z};
SC_SACD_Vec3 sphere_box_normal =
SC_SACD_Vec3{box->x, box->y, box->z} - sphere_pos;
if (sphere_box_normal.x < 0.0001F && sphere_box_normal.x > -0.0001F &&
sphere_box_normal.y < 0.0001F && sphere_box_normal.y > -0.0001F &&
sphere_box_normal.z < 0.0001F && sphere_box_normal.z > -0.0001F) {
std::array<SC_SACD_Vec3, 1> sphere_box_normal = {
SC_SACD_Vec3{box->x, box->y, box->z} - sphere_pos};
if (sphere_box_normal[0].x < 0.0001F && sphere_box_normal[0].x > -0.0001F &&
sphere_box_normal[0].y < 0.0001F && sphere_box_normal[0].y > -0.0001F &&
sphere_box_normal[0].z < 0.0001F && sphere_box_normal[0].z > -0.0001F) {
// Sphere center is box center.
return 1;
}
sphere_box_normal =
sphere_box_normal /
std::sqrt(SC_SACD_Dot_Product(sphere_box_normal, sphere_box_normal));
sphere_box_normal[0] =
sphere_box_normal[0] / std::sqrt(SC_SACD_Dot_Product(
sphere_box_normal[0], sphere_box_normal[0]));
std::vector<SC_SACD_MinMax> box_minmaxes =
SC_SACD_Get_Box_MinMax(box, {&sphere_box_normal, 1});
SC_SACD_Get_Box_MinMax(box, sphere_box_normal);
float projected_0 = SC_SACD_Dot_Product(
sphere_box_normal, sphere_pos + sphere_box_normal * sphere->radius);
sphere_box_normal[0], sphere_pos + sphere_box_normal[0] * sphere->radius);
float projected_1 = SC_SACD_Dot_Product(
sphere_box_normal, sphere_pos - sphere_box_normal * sphere->radius);
sphere_box_normal[0], sphere_pos - sphere_box_normal[0] * sphere->radius);
if (projected_0 < projected_1) {
if (box_minmaxes[0].max < projected_0 ||
box_minmaxes[0].min > projected_1) {
@ -546,6 +546,11 @@ SC_SACD_Mat4 SC_SACD_Translate_Mat4(float x, float y, float z) {
0.0F, 0.0F, 1.0F, z, 0.0F, 0.0F, 0.0F, 1.0F};
}
SC_SACD_Mat4 SC_SACD_Scale_Mat4(float x, float y, float z) {
return SC_SACD_Mat4{x, 0.0F, 0.0F, 0.0F, 0.0F, y, 0.0F, 0.0F,
0.0F, 0.0F, z, 0.0F, 0.0F, 0.0F, 0.0F, 1.0F};
}
SC_SACD_Vec3 SC_SACD_Closest_Point_Dir_Normalized(const SC_SACD_Vec3 *pos,
const SC_SACD_Vec3 *dir,
const SC_SACD_Vec3 *point) {

View file

@ -119,6 +119,8 @@ SC_SACD_EXPORT SC_SACD_Mat4 SC_SACD_Rotation_Mat4_ZAxis(float z_radians);
SC_SACD_EXPORT SC_SACD_Mat4 SC_SACD_Translate_Mat4(float x, float y, float z);
SC_SACD_EXPORT SC_SACD_Mat4 SC_SACD_Scale_Mat4(float x, float y, float z);
/// This variant of Closest_Point expects "dir" to be a unit vector.
SC_SACD_EXPORT SC_SACD_Vec3 SC_SACD_Closest_Point_Dir_Normalized(
const SC_SACD_Vec3 *pos, const SC_SACD_Vec3 *dir,

View file

@ -591,6 +591,48 @@ int main() {
CHECK_FALSE(SC_SACD_Generic_Box_Collision(&a, &b));
}
// Box with Scale Mat4.
{
SC_SACD_Generic_Box a = SC_SACD_Generic_Box_Default();
SC_SACD_Generic_Box b = SC_SACD_Generic_Box_Default();
a.x = 1.1F;
b.x = -1.1F;
CHECK_FALSE(SC_SACD_Generic_Box_Collision(&a, &b));
a.transform = SC_SACD_Scale_Mat4(2.0F, 1.0F, 1.0F);
CHECK_TRUE(SC_SACD_Generic_Box_Collision(&a, &b));
a.transform = SC_SACD_Scale_Mat4(-2.0F, 1.0F, 1.0F);
CHECK_TRUE(SC_SACD_Generic_Box_Collision(&a, &b));
a.x = 0.0F;
b.x = 0.0F;
a.y = 1.1F;
b.y = -1.1F;
a.transform = SC_SACD_Mat4_Identity();
CHECK_FALSE(SC_SACD_Generic_Box_Collision(&a, &b));
a.transform = SC_SACD_Scale_Mat4(1.0F, 2.0F, 1.0F);
CHECK_TRUE(SC_SACD_Generic_Box_Collision(&a, &b));
a.transform = SC_SACD_Scale_Mat4(1.0F, -2.0F, 1.0F);
CHECK_TRUE(SC_SACD_Generic_Box_Collision(&a, &b));
a.y = 0.0F;
b.y = 0.0F;
a.z = 1.1F;
b.z = -1.1F;
a.transform = SC_SACD_Mat4_Identity();
CHECK_FALSE(SC_SACD_Generic_Box_Collision(&a, &b));
a.transform = SC_SACD_Scale_Mat4(1.0F, 1.0F, 2.0F);
CHECK_TRUE(SC_SACD_Generic_Box_Collision(&a, &b));
a.transform = SC_SACD_Scale_Mat4(1.0F, 1.0F, -2.0F);
CHECK_TRUE(SC_SACD_Generic_Box_Collision(&a, &b));
}
std::cout << "Checks checked: " << checks_checked << '\n'
<< "Checks passed: " << checks_passed << '\n';