From 52b4d515086660a83fb76a74150eb47c0c17c48c Mon Sep 17 00:00:00 2001
From: Agent X <44549182+AgentXLP@users.noreply.github.com>
Date: Sun, 16 Jun 2024 10:45:55 -0400
Subject: [PATCH] Add collision_find_surface_on_ray_precision
---
autogen/lua_definitions/functions.lua | 12 +++++++
docs/lua/functions-5.md | 26 +++++++++++++++
docs/lua/functions.md | 1 +
src/engine/surface_collision.c | 6 +---
src/engine/surface_collision.h | 2 +-
src/game/bettercamera.inc.h | 6 ++--
src/game/camera.c | 4 +--
src/pc/lua/smlua_functions_autogen.c | 40 +++++++++++++++++++++---
src/pc/lua/utils/smlua_collision_utils.c | 10 +++++-
src/pc/lua/utils/smlua_collision_utils.h | 3 +-
10 files changed, 92 insertions(+), 18 deletions(-)
diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua
index 4ef93ef0..3c943c19 100644
--- a/autogen/lua_definitions/functions.lua
+++ b/autogen/lua_definitions/functions.lua
@@ -7621,6 +7621,18 @@ function collision_find_surface_on_ray(startX, startY, startZ, dirX, dirY, dirZ)
-- ...
end
+--- @param startX number
+--- @param startY number
+--- @param startZ number
+--- @param dirX number
+--- @param dirY number
+--- @param dirZ number
+--- @param precision number
+--- @return RayIntersectionInfo
+function collision_find_surface_on_ray_precision(startX, startY, startZ, dirX, dirY, dirZ, precision)
+ -- ...
+end
+
--- @return WallCollisionData
function collision_get_temp_wall_collision_data()
-- ...
diff --git a/docs/lua/functions-5.md b/docs/lua/functions-5.md
index e6009984..35689f0b 100644
--- a/docs/lua/functions-5.md
+++ b/docs/lua/functions-5.md
@@ -475,6 +475,32 @@
+## [collision_find_surface_on_ray_precision](#collision_find_surface_on_ray_precision)
+
+### Lua Example
+`local RayIntersectionInfoValue = collision_find_surface_on_ray_precision(startX, startY, startZ, dirX, dirY, dirZ, precision)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| startX | `number` |
+| startY | `number` |
+| startZ | `number` |
+| dirX | `number` |
+| dirY | `number` |
+| dirZ | `number` |
+| precision | `number` |
+
+### Returns
+[RayIntersectionInfo](structs.md#RayIntersectionInfo)
+
+### C Prototype
+`struct RayIntersectionInfo* collision_find_surface_on_ray_precision(f32 startX, f32 startY, f32 startZ, f32 dirX, f32 dirY, f32 dirZ, f32 precision);`
+
+[:arrow_up_small:](#)
+
+
+
## [collision_get_temp_wall_collision_data](#collision_get_temp_wall_collision_data)
### Lua Example
diff --git a/docs/lua/functions.md b/docs/lua/functions.md
index c05e5e00..d45d8514 100644
--- a/docs/lua/functions.md
+++ b/docs/lua/functions.md
@@ -1596,6 +1596,7 @@
- [collision_find_ceil](functions-5.md#collision_find_ceil)
- [collision_find_floor](functions-5.md#collision_find_floor)
- [collision_find_surface_on_ray](functions-5.md#collision_find_surface_on_ray)
+ - [collision_find_surface_on_ray_precision](functions-5.md#collision_find_surface_on_ray_precision)
- [collision_get_temp_wall_collision_data](functions-5.md#collision_get_temp_wall_collision_data)
- [get_water_surface_pseudo_floor](functions-5.md#get_water_surface_pseudo_floor)
- [smlua_collision_util_get](functions-5.md#smlua_collision_util_get)
diff --git a/src/engine/surface_collision.c b/src/engine/surface_collision.c
index 464da2c9..4276594f 100644
--- a/src/engine/surface_collision.c
+++ b/src/engine/surface_collision.c
@@ -1190,8 +1190,7 @@ void find_surface_on_ray_cell(s16 cellX, s16 cellZ, Vec3f orig, Vec3f normalized
}
}
-void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Vec3f hit_pos)
-{
+void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Vec3f hit_pos, f32 precision) {
f32 max_length;
s16 cellZ, cellX;
f32 fCellZ, fCellX;
@@ -1223,9 +1222,6 @@ void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Ve
return;
}
- // increase collision checking precision (normally 1)
- f32 precision = 3;
-
// Get cells we cross using DDA
if (absx(dir[0]) >= absx(dir[2]))
step = precision * absx(dir[0]) / CELL_SIZE;
diff --git a/src/engine/surface_collision.h b/src/engine/surface_collision.h
index 4f58f659..cbf4353f 100644
--- a/src/engine/surface_collision.h
+++ b/src/engine/surface_collision.h
@@ -52,6 +52,6 @@ f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor);
f32 find_water_level(f32 x, f32 z);
f32 find_poison_gas_level(f32 x, f32 z);
void debug_surface_list_info(f32 xPos, f32 zPos);
-void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Vec3f hit_pos);
+void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Vec3f hit_pos, f32 precision);
#endif // SURFACE_COLLISION_H
diff --git a/src/game/bettercamera.inc.h b/src/game/bettercamera.inc.h
index 2bddce8f..ebe47088 100644
--- a/src/game/bettercamera.inc.h
+++ b/src/game/bettercamera.inc.h
@@ -553,7 +553,7 @@ static void newcam_collision(void) {
offset[1],
offset[2] * 1.2f,
};
- find_surface_on_ray(newcam_pos_target, move, &surf, hitpos);
+ find_surface_on_ray(newcam_pos_target, move, &surf, hitpos, 3.0f);
vec3f_copy(offset, hitpos);
vec3f_sub(offset, newcam_pos_target);
if (surf) {
@@ -576,7 +576,7 @@ static void newcam_collision(void) {
struct Surface* surf;
Vec3f hitpos;
- find_surface_on_ray(camorig, camray, &surf, hitpos);
+ find_surface_on_ray(camorig, camray, &surf, hitpos, 3.0f);
if (surf == NULL) {
allhit = false;
@@ -594,7 +594,7 @@ static void newcam_collision(void) {
struct Surface *surf = NULL;
Vec3f hitpos;
- find_surface_on_ray(newcam_lookat, camdir, &surf, hitpos);
+ find_surface_on_ray(newcam_lookat, camdir, &surf, hitpos, 3.0f);
if (surf) {
// offset the hit pos by the hit normal
diff --git a/src/game/camera.c b/src/game/camera.c
index b8727b77..7f56a068 100644
--- a/src/game/camera.c
+++ b/src/game/camera.c
@@ -12181,7 +12181,7 @@ static u8 rom_hack_cam_can_see_mario(Vec3f desiredPos) {
camdir[2] = target[2] - desiredPos[2];
Vec3f hitpos;
- find_surface_on_ray(desiredPos, camdir, &surf, hitpos);
+ find_surface_on_ray(desiredPos, camdir, &surf, hitpos, 3.0f);
if (surf == NULL) {
return true;
}
@@ -12200,7 +12200,7 @@ void rom_hack_cam_walk(Vec3f pos, Vec3f dir, f32 dist) {
struct Surface* surf = NULL;
Vec3f hitpos;
- find_surface_on_ray(pos, movement, &surf, hitpos);
+ find_surface_on_ray(pos, movement, &surf, hitpos, 3.0f);
if (surf == NULL) {
pos[0] += movement[0];
diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c
index f6ebb08d..70027eb5 100644
--- a/src/pc/lua/smlua_functions_autogen.c
+++ b/src/pc/lua/smlua_functions_autogen.c
@@ -20528,7 +20528,7 @@ int smlua_func_mod_storage_save_number(lua_State* L) {
const char* key = smlua_to_string(L, 1);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "mod_storage_save_number"); return 0; }
- double value = smlua_to_number(L, 2);
+ f32 value = smlua_to_number(L, 2);
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "mod_storage_save_number"); return 0; }
lua_pushboolean(L, mod_storage_save_number(key, value));
@@ -28410,6 +28410,35 @@ int smlua_func_collision_find_surface_on_ray(lua_State* L) {
return 1;
}
+int smlua_func_collision_find_surface_on_ray_precision(lua_State* L) {
+ if (L == NULL) { return 0; }
+
+ int top = lua_gettop(L);
+ if (top != 7) {
+ LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "collision_find_surface_on_ray_precision", 7, top);
+ return 0;
+ }
+
+ f32 startX = smlua_to_number(L, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "collision_find_surface_on_ray_precision"); return 0; }
+ f32 startY = smlua_to_number(L, 2);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "collision_find_surface_on_ray_precision"); return 0; }
+ f32 startZ = smlua_to_number(L, 3);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "collision_find_surface_on_ray_precision"); return 0; }
+ f32 dirX = smlua_to_number(L, 4);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 4, "collision_find_surface_on_ray_precision"); return 0; }
+ f32 dirY = smlua_to_number(L, 5);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 5, "collision_find_surface_on_ray_precision"); return 0; }
+ f32 dirZ = smlua_to_number(L, 6);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 6, "collision_find_surface_on_ray_precision"); return 0; }
+ f32 precision = smlua_to_number(L, 7);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 7, "collision_find_surface_on_ray_precision"); return 0; }
+
+ smlua_push_object(L, LOT_RAYINTERSECTIONINFO, collision_find_surface_on_ray_precision(startX, startY, startZ, dirX, dirY, dirZ, precision));
+
+ return 1;
+}
+
int smlua_func_collision_get_temp_wall_collision_data(UNUSED lua_State* L) {
if (L == NULL) { return 0; }
@@ -32449,8 +32478,8 @@ int smlua_func_find_surface_on_ray(lua_State* L) {
if (L == NULL) { return 0; }
int top = lua_gettop(L);
- if (top != 4) {
- LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "find_surface_on_ray", 4, top);
+ if (top != 5) {
+ LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "find_surface_on_ray", 5, top);
return 0;
}
@@ -32474,8 +32503,10 @@ int smlua_func_find_surface_on_ray(lua_State* L) {
hit_pos[1] = smlua_get_number_field(4, "y");
hit_pos[2] = smlua_get_number_field(4, "z");
if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 4, "find_surface_on_ray"); return 0; }
+ f32 precision = smlua_to_number(L, 5);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 5, "find_surface_on_ray"); return 0; }
- find_surface_on_ray(orig, dir, hit_surface, hit_pos);
+ find_surface_on_ray(orig, dir, hit_surface, hit_pos, precision);
smlua_push_number_field(1, "x", orig[0]);
smlua_push_number_field(1, "y", orig[1]);
@@ -34160,6 +34191,7 @@ void smlua_bind_functions_autogen(void) {
smlua_bind_function(L, "collision_find_ceil", smlua_func_collision_find_ceil);
smlua_bind_function(L, "collision_find_floor", smlua_func_collision_find_floor);
smlua_bind_function(L, "collision_find_surface_on_ray", smlua_func_collision_find_surface_on_ray);
+ smlua_bind_function(L, "collision_find_surface_on_ray_precision", smlua_func_collision_find_surface_on_ray_precision);
smlua_bind_function(L, "collision_get_temp_wall_collision_data", smlua_func_collision_get_temp_wall_collision_data);
smlua_bind_function(L, "get_water_surface_pseudo_floor", smlua_func_get_water_surface_pseudo_floor);
smlua_bind_function(L, "smlua_collision_util_get", smlua_func_smlua_collision_util_get);
diff --git a/src/pc/lua/utils/smlua_collision_utils.c b/src/pc/lua/utils/smlua_collision_utils.c
index 824be2a8..63ddaabd 100644
--- a/src/pc/lua/utils/smlua_collision_utils.c
+++ b/src/pc/lua/utils/smlua_collision_utils.c
@@ -161,7 +161,15 @@ struct RayIntersectionInfo* collision_find_surface_on_ray(f32 startX, f32 startY
static struct RayIntersectionInfo info = { 0 };
Vec3f orig = { startX, startY, startZ };
Vec3f dir = { dirX, dirY, dirZ };
- find_surface_on_ray(orig, dir, &info.surface, info.hitPos);
+ find_surface_on_ray(orig, dir, &info.surface, info.hitPos, 3.0f);
+ return &info;
+}
+
+struct RayIntersectionInfo* collision_find_surface_on_ray_precision(f32 startX, f32 startY, f32 startZ, f32 dirX, f32 dirY, f32 dirZ, f32 precision) {
+ static struct RayIntersectionInfo info = { 0 };
+ Vec3f orig = { startX, startY, startZ };
+ Vec3f dir = { dirX, dirY, dirZ };
+ find_surface_on_ray(orig, dir, &info.surface, info.hitPos, precision);
return &info;
}
diff --git a/src/pc/lua/utils/smlua_collision_utils.h b/src/pc/lua/utils/smlua_collision_utils.h
index 432c7548..fdd2b73f 100644
--- a/src/pc/lua/utils/smlua_collision_utils.h
+++ b/src/pc/lua/utils/smlua_collision_utils.h
@@ -115,9 +115,8 @@ struct GlobalObjectCollisionData {
extern struct GlobalObjectCollisionData gGlobalObjectCollisionData;
struct RayIntersectionInfo* collision_find_surface_on_ray(f32 startX, f32 startY, f32 startZ, f32 dirX, f32 dirY, f32 dirZ);
-
+struct RayIntersectionInfo* collision_find_surface_on_ray_precision(f32 startX, f32 startY, f32 startZ, f32 dirX, f32 dirY, f32 dirZ, f32 precision);
struct Surface* collision_find_floor(f32 x, f32 y, f32 z);
-
struct Surface* collision_find_ceil(f32 x, f32 y, f32 z);
struct Surface* get_water_surface_pseudo_floor(void);