From ee2801626697a333b34fddfee0324d742277354a Mon Sep 17 00:00:00 2001 From: BMagnu <6238428+BMagnu@users.noreply.github.com> Date: Wed, 10 Dec 2025 12:38:21 +0900 Subject: [PATCH 1/5] Add flag to respect detailboxes in model collide checks --- code/model/model.h | 1 + code/model/modelcollide.cpp | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/code/model/model.h b/code/model/model.h index cd1c3562f8c..e88a1c67948 100644 --- a/code/model/model.h +++ b/code/model/model.h @@ -1316,6 +1316,7 @@ typedef struct mc_info { #define MC_CHECK_INVISIBLE_FACES (1<<8) // Check the invisible faces. #define MC_COLLIDE_ALL (1<<9) // Returns ALL hits via hit_points_all, including backfacing polies hits +#define MC_RESPECT_DETAIL_BOX_SPHERE (1<<10) //Skip a submodel if it is an invisible detailbox /* Checks to see if a vector from p0 to p0 collides with a model of diff --git a/code/model/modelcollide.cpp b/code/model/modelcollide.cpp index c6fe18afa20..49d079f8def 100644 --- a/code/model/modelcollide.cpp +++ b/code/model/modelcollide.cpp @@ -17,11 +17,11 @@ #include "math/fvi.h" #include "math/vecmat.h" #include "model/model.h" +#include "model/modelrender.h" #include "model/modelsinc.h" -#include "tracing/tracing.h" +#include "render/3d.h" #include "tracing/Monitor.h" - - +#include "tracing/tracing.h" #define TOL 1E-4 #define DIST_TOL 1.0 @@ -976,6 +976,11 @@ void mc_check_subobj( int mn ) if (sm->flags[Model::Submodel_flags::No_collisions]) return; // don't do collisions if (sm->flags[Model::Submodel_flags::Nocollide_this_only]) goto NoHit; // Don't collide for this model, but keep checking others + if (Mc->flags & MC_RESPECT_DETAIL_BOX_SPHERE) { + if (!model_render_check_detail_box(&Eye_position, Mc_pm, mn, MR_NORMAL)) + goto NoHit; //This submodel is a detail box that is not displayed, skip it + } + // Rotate the world check points into the current subobject's // frame of reference. // After this block, Mc_p0, Mc_p1, Mc_direction, and Mc_mag are correct From 5b57f4279e3fa87b740d9a706f958989ec36fb10 Mon Sep 17 00:00:00 2001 From: BMagnu <6238428+BMagnu@users.noreply.github.com> Date: Wed, 10 Dec 2025 12:39:14 +0900 Subject: [PATCH 2/5] Don't check detailboxes that are invisible for sunglare checks --- code/ship/shipfx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ship/shipfx.cpp b/code/ship/shipfx.cpp index ea3aac21d30..273aea31fba 100644 --- a/code/ship/shipfx.cpp +++ b/code/ship/shipfx.cpp @@ -834,7 +834,7 @@ bool shipfx_eye_in_shadow( vec3d *eye_pos, object * src_obj, int light_n ) mc.pos = &objp->pos; mc.p0 = &rp0; mc.p1 = &rp1; - mc.flags = MC_CHECK_MODEL; + mc.flags = MC_CHECK_MODEL & MC_RESPECT_DETAIL_BOX_SPHERE; if (model_collide(&mc)) { return true; From f43a1303b12a996b1fe7295949ad154a5de2d659 Mon Sep 17 00:00:00 2001 From: BMagnu <6238428+BMagnu@users.noreply.github.com> Date: Wed, 10 Dec 2025 13:22:12 +0900 Subject: [PATCH 3/5] Use local coords --- code/model/modelcollide.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/model/modelcollide.cpp b/code/model/modelcollide.cpp index 49d079f8def..1ebfeb93138 100644 --- a/code/model/modelcollide.cpp +++ b/code/model/modelcollide.cpp @@ -977,7 +977,10 @@ void mc_check_subobj( int mn ) if (sm->flags[Model::Submodel_flags::Nocollide_this_only]) goto NoHit; // Don't collide for this model, but keep checking others if (Mc->flags & MC_RESPECT_DETAIL_BOX_SPHERE) { - if (!model_render_check_detail_box(&Eye_position, Mc_pm, mn, MR_NORMAL)) + vec3d local; + vm_vec_sub(&local, &Eye_position, Mc->pos); + vm_vec_rotate(&local, &local, Mc->orient); + if (!model_render_check_detail_box(&local, Mc_pm, mn, MR_NORMAL)) goto NoHit; //This submodel is a detail box that is not displayed, skip it } From 2da312988662ade90d9bc3d9eb52d7bd97680424 Mon Sep 17 00:00:00 2001 From: BMagnu <6238428+BMagnu@users.noreply.github.com> Date: Wed, 10 Dec 2025 13:22:28 +0900 Subject: [PATCH 4/5] Actualyl also run the check for cockpits & show ship --- code/ship/shipfx.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/ship/shipfx.cpp b/code/ship/shipfx.cpp index 273aea31fba..5ba16c109ec 100644 --- a/code/ship/shipfx.cpp +++ b/code/ship/shipfx.cpp @@ -887,7 +887,7 @@ bool shipfx_eye_in_shadow( vec3d *eye_pos, object * src_obj, int light_n ) mc.pos = &pos; mc.p0 = &rp0; mc.p1 = &rp1; - mc.flags = MC_CHECK_MODEL; + mc.flags = MC_CHECK_MODEL & MC_RESPECT_DETAIL_BOX_SPHERE; int mc_result = model_collide(&mc); mc.pos = NULL; @@ -936,7 +936,7 @@ bool shipfx_eye_in_shadow( vec3d *eye_pos, object * src_obj, int light_n ) mc.pos = &Viewer_obj->pos; mc.p0 = &rp0; mc.p1 = &rp1; - mc.flags = MC_CHECK_MODEL; + mc.flags = MC_CHECK_MODEL & MC_RESPECT_DETAIL_BOX_SPHERE; if( model_collide(&mc) ) { if ( mc.t_poly ) { From 5f65afe01c2b364d6a93b9b52e91f9c1c01bfb61 Mon Sep 17 00:00:00 2001 From: Birk Magnussen <6238428+BMagnu@users.noreply.github.com> Date: Wed, 10 Dec 2025 22:49:36 +0900 Subject: [PATCH 5/5] Be less stupid --- code/ship/shipfx.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/ship/shipfx.cpp b/code/ship/shipfx.cpp index 5ba16c109ec..fb185c2312a 100644 --- a/code/ship/shipfx.cpp +++ b/code/ship/shipfx.cpp @@ -834,7 +834,7 @@ bool shipfx_eye_in_shadow( vec3d *eye_pos, object * src_obj, int light_n ) mc.pos = &objp->pos; mc.p0 = &rp0; mc.p1 = &rp1; - mc.flags = MC_CHECK_MODEL & MC_RESPECT_DETAIL_BOX_SPHERE; + mc.flags = MC_CHECK_MODEL | MC_RESPECT_DETAIL_BOX_SPHERE; if (model_collide(&mc)) { return true; @@ -887,7 +887,7 @@ bool shipfx_eye_in_shadow( vec3d *eye_pos, object * src_obj, int light_n ) mc.pos = &pos; mc.p0 = &rp0; mc.p1 = &rp1; - mc.flags = MC_CHECK_MODEL & MC_RESPECT_DETAIL_BOX_SPHERE; + mc.flags = MC_CHECK_MODEL | MC_RESPECT_DETAIL_BOX_SPHERE; int mc_result = model_collide(&mc); mc.pos = NULL; @@ -936,7 +936,7 @@ bool shipfx_eye_in_shadow( vec3d *eye_pos, object * src_obj, int light_n ) mc.pos = &Viewer_obj->pos; mc.p0 = &rp0; mc.p1 = &rp1; - mc.flags = MC_CHECK_MODEL & MC_RESPECT_DETAIL_BOX_SPHERE; + mc.flags = MC_CHECK_MODEL | MC_RESPECT_DETAIL_BOX_SPHERE; if( model_collide(&mc) ) { if ( mc.t_poly ) {