diff --git a/light/ltface.cc b/light/ltface.cc index 40184dc3..95b8a619 100644 --- a/light/ltface.cc +++ b/light/ltface.cc @@ -309,7 +309,7 @@ static bool Light_PointInAnySolid(const mbsp_t *bsp, const dmodelh2_t *self, con if (modelinfo->object_channel_mask.value() != self_modelinfo->object_channel_mask.value()) continue; - if (Light_PointInSolid(bsp, modelinfo->model, point)) { + if (Light_PointInSolid(bsp, modelinfo->model, point - modelinfo->offset)) { // Only mark occluded if the bmodel is fully opaque if (modelinfo->alpha.value() == 1.0f) return true; diff --git a/testmaps/q2_light_origin_brush_shadow.map b/testmaps/q2_light_origin_brush_shadow.map index f62501aa..0f02e409 100644 --- a/testmaps/q2_light_origin_brush_shadow.map +++ b/testmaps/q2_light_origin_brush_shadow.map @@ -60,6 +60,51 @@ ( -576 224 128 ) ( -575 224 128 ) ( -576 224 129 ) e1u1/sky1 0 16 0 1 1 ( -480 208 128 ) ( -480 208 129 ) ( -480 209 128 ) e1u1/sky1 16 16 0 1 1 } +// brush 6 +{ +( -4 -1 0 ) ( -4 0 0 ) ( -4 -1 1 ) e1u1/twall2_1 64 16 0 1 1 +( -1 -4 0 ) ( -1 -4 1 ) ( 0 -4 0 ) e1u1/twall2_1 64 16 0 1 1 +( -1 -1 0 ) ( 0 -1 0 ) ( -1 0 0 ) e1u1/twall2_1 64 16 0 1 1 +( 1 1 1 ) ( 1 2 1 ) ( 2 1 1 ) e1u1/twall2_1 64 16 0 1 1 +( 1 4 1 ) ( 2 4 1 ) ( 1 4 2 ) e1u1/twall2_1 64 16 0 1 1 +( 4 1 1 ) ( 4 1 2 ) ( 4 2 1 ) e1u1/twall2_1 64 16 0 1 1 +} +// brush 7 +{ +( -324 175 0 ) ( -324 176 0 ) ( -324 175 1 ) e1u1/twall2_1 -112 16 0 1 1 +( -321 172 0 ) ( -321 172 1 ) ( -320 172 0 ) e1u1/twall2_1 0 16 0 1 1 +( -321 175 0 ) ( -320 175 0 ) ( -321 176 0 ) e1u1/twall2_1 0 64 0 1 1 +( -319 177 1 ) ( -319 178 1 ) ( -318 177 1 ) e1u1/twall2_1 0 64 0 1 1 +( -319 180 1 ) ( -318 180 1 ) ( -319 180 2 ) e1u1/twall2_1 0 16 0 1 1 +( -316 177 1 ) ( -316 177 2 ) ( -316 178 1 ) e1u1/twall2_1 -112 16 0 1 1 +} +// brush 8 +{ +( -324 79 0 ) ( -324 80 0 ) ( -324 79 1 ) e1u1/twall2_1 -16 16 0 1 1 +( -321 76 0 ) ( -321 76 1 ) ( -320 76 0 ) e1u1/twall2_1 0 16 0 1 1 +( -321 79 0 ) ( -320 79 0 ) ( -321 80 0 ) e1u1/twall2_1 0 -32 0 1 1 +( -319 81 1 ) ( -319 82 1 ) ( -318 81 1 ) e1u1/twall2_1 0 -32 0 1 1 +( -319 84 1 ) ( -318 84 1 ) ( -319 84 2 ) e1u1/twall2_1 0 16 0 1 1 +( -316 81 1 ) ( -316 81 2 ) ( -316 82 1 ) e1u1/twall2_1 -16 16 0 1 1 +} +// brush 9 +{ +( -436 79 0 ) ( -436 80 0 ) ( -436 79 1 ) e1u1/twall2_1 -16 16 0 1 1 +( -433 76 0 ) ( -433 76 1 ) ( -432 76 0 ) e1u1/twall2_1 112 16 0 1 1 +( -433 79 0 ) ( -432 79 0 ) ( -433 80 0 ) e1u1/twall2_1 112 -32 0 1 1 +( -431 81 1 ) ( -431 82 1 ) ( -430 81 1 ) e1u1/twall2_1 112 -32 0 1 1 +( -431 84 1 ) ( -430 84 1 ) ( -431 84 2 ) e1u1/twall2_1 112 16 0 1 1 +( -428 81 1 ) ( -428 81 2 ) ( -428 82 1 ) e1u1/twall2_1 -16 16 0 1 1 +} +// brush 10 +{ +( -436 175 0 ) ( -436 176 0 ) ( -436 175 1 ) e1u1/twall2_1 -112 16 0 1 1 +( -433 172 0 ) ( -433 172 1 ) ( -432 172 0 ) e1u1/twall2_1 112 16 0 1 1 +( -433 175 0 ) ( -432 175 0 ) ( -433 176 0 ) e1u1/twall2_1 112 64 0 1 1 +( -431 177 1 ) ( -431 178 1 ) ( -430 177 1 ) e1u1/twall2_1 112 64 0 1 1 +( -431 180 1 ) ( -430 180 1 ) ( -431 180 2 ) e1u1/twall2_1 112 16 0 1 1 +( -428 177 1 ) ( -428 177 2 ) ( -428 178 1 ) e1u1/twall2_1 -112 16 0 1 1 +} } // entity 1 { diff --git a/tests/test_ltface.cc b/tests/test_ltface.cc index 26a115fe..7fc0ece2 100644 --- a/tests/test_ltface.cc +++ b/tests/test_ltface.cc @@ -595,13 +595,13 @@ TEST_CASE("q2_light_origin_brush_shadow") { auto [bsp, bspx] = QbspVisLight_Q2("q2_light_origin_brush_shadow.map", {}); - const qvec3d under_shadow_bmodel{-320, 176, 0}; - const qvec3d under_nonshadow_bmodel{-432, 176, 0}; + const qvec3d under_shadow_bmodel{-320, 176, 1}; + const qvec3d under_nonshadow_bmodel{-432, 176, 1}; const qvec3d under_nodraw_shadow_bmodel = under_shadow_bmodel - qvec3d(0, 96, 0); const qvec3d under_nodraw_nonshadow_bmodel = under_nonshadow_bmodel - qvec3d(0, 96, 0); - const qvec3d at_origin{0, 0, 0}; + const qvec3d at_origin{0, 0, 1}; INFO("ensure expected shadow"); CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {0, 0, 0}, under_shadow_bmodel);