Skip to content

Commit

Permalink
light: fix "mangle" on _sun 1 entities
Browse files Browse the repository at this point in the history
  • Loading branch information
ericwa committed Mar 30, 2024
1 parent 1b289d3 commit 992b6f0
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 7 deletions.
2 changes: 1 addition & 1 deletion light/entities.cc
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,7 @@ static void SetupSuns(const settings::worldspawn_keys &cfg)
entity->targetent->get_vector("origin", target_pos);
sunvec = target_pos - entity->origin.value();
} else if (qv::length2(entity->mangle.value()) > 0) {
sunvec = entity->mangle.value();
sunvec = qv::vec_from_mangle(entity->mangle.value());
} else { // Use { 0, 0, 0 } as sun target...
logging::print("WARNING: sun missing target, entity origin used.\n");
sunvec = -entity->origin.value();
Expand Down
91 changes: 91 additions & 0 deletions testmaps/q2_light_sun_mangle.map
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// Game: Quake 2
// Format: Quake2
// entity 0
{
"classname" "worldspawn"
"_tb_textures" "textures/e1u1"
"_bounce" "0"
// brush 0
{
( 480 1088 928 ) ( 480 1089 928 ) ( 480 1088 929 ) e1u1/twall2_1 0 32 0 1 1
( 704 1088 928 ) ( 704 1088 929 ) ( 705 1088 928 ) e1u1/twall2_1 0 32 0 1 1
( 704 1088 928 ) ( 705 1088 928 ) ( 704 1089 928 ) e1u1/twall2_1 0 0 0 1 1
( 944 1472 944 ) ( 944 1473 944 ) ( 945 1472 944 ) e1u1/twall2_1 0 0 0 1 1
( 944 1488 944 ) ( 945 1488 944 ) ( 944 1488 945 ) e1u1/twall2_1 0 32 0 1 1
( 1440 1472 944 ) ( 1440 1472 945 ) ( 1440 1473 944 ) e1u1/twall2_1 0 32 0 1 1
}
// brush 1
{
( 480 1088 1248 ) ( 480 1089 1248 ) ( 480 1088 1249 ) e1u1/sky1 0 96 0 1 1
( 704 1072 1248 ) ( 704 1072 1249 ) ( 705 1072 1248 ) e1u1/sky1 0 96 0 1 1
( 704 1088 1248 ) ( 705 1088 1248 ) ( 704 1089 1248 ) e1u1/sky1 0 0 0 1 1
( 944 1472 1264 ) ( 944 1473 1264 ) ( 945 1472 1264 ) e1u1/sky1 0 0 0 1 1
( 944 1488 1264 ) ( 945 1488 1264 ) ( 944 1488 1265 ) e1u1/sky1 0 96 0 1 1
( 1440 1472 1264 ) ( 1440 1472 1265 ) ( 1440 1473 1264 ) e1u1/sky1 0 96 0 1 1
}
// brush 2
{
( 480 1072 928 ) ( 480 1073 928 ) ( 480 1072 929 ) e1u1/sky1 0 0 0 1 1
( 704 1072 928 ) ( 704 1072 929 ) ( 705 1072 928 ) e1u1/sky1 0 0 0 1 1
( 704 1072 928 ) ( 705 1072 928 ) ( 704 1073 928 ) e1u1/sky1 0 0 0 1 1
( 944 1456 1248 ) ( 944 1457 1248 ) ( 945 1456 1248 ) e1u1/sky1 0 0 0 1 1
( 944 1088 944 ) ( 945 1088 944 ) ( 944 1088 945 ) e1u1/sky1 0 0 0 1 1
( 1456 1456 944 ) ( 1456 1456 945 ) ( 1456 1457 944 ) e1u1/sky1 0 0 0 1 1
}
// brush 3
{
( 480 1392 928 ) ( 480 1393 928 ) ( 480 1392 929 ) e1u1/sky1 0 0 0 1 1
( 832 1488 928 ) ( 832 1488 929 ) ( 833 1488 928 ) e1u1/sky1 0 0 0 1 1
( 832 1392 928 ) ( 833 1392 928 ) ( 832 1393 928 ) e1u1/sky1 0 0 0 1 1
( 1072 1776 1248 ) ( 1072 1777 1248 ) ( 1073 1776 1248 ) e1u1/sky1 0 0 0 1 1
( 1072 1504 944 ) ( 1073 1504 944 ) ( 1072 1504 945 ) e1u1/sky1 0 0 0 1 1
( 1440 1392 928 ) ( 1440 1392 929 ) ( 1440 1393 928 ) e1u1/sky1 0 0 0 1 1
}
// brush 4
{
( 1440 1088 1056 ) ( 1440 1089 1056 ) ( 1440 1088 1057 ) e1u1/sky1 0 0 0 1 1
( 1120 1088 1056 ) ( 1120 1088 1057 ) ( 1121 1088 1056 ) e1u1/sky1 0 0 0 1 1
( 1120 1088 928 ) ( 1121 1088 928 ) ( 1120 1089 928 ) e1u1/sky1 0 0 0 1 1
( 1360 1472 1248 ) ( 1360 1473 1248 ) ( 1361 1472 1248 ) e1u1/sky1 0 0 0 1 1
( 1360 1488 1072 ) ( 1361 1488 1072 ) ( 1360 1488 1073 ) e1u1/sky1 0 0 0 1 1
( 1456 1472 1072 ) ( 1456 1472 1073 ) ( 1456 1473 1072 ) e1u1/sky1 0 0 0 1 1
}
// brush 5
{
( 464 1088 1056 ) ( 464 1089 1056 ) ( 464 1088 1057 ) e1u1/sky1 0 0 0 1 1
( 144 1072 1056 ) ( 144 1072 1057 ) ( 145 1072 1056 ) e1u1/sky1 0 0 0 1 1
( 144 1088 928 ) ( 145 1088 928 ) ( 144 1089 928 ) e1u1/sky1 0 0 0 1 1
( 384 1472 1248 ) ( 384 1473 1248 ) ( 385 1472 1248 ) e1u1/sky1 0 0 0 1 1
( 384 1488 1072 ) ( 385 1488 1072 ) ( 384 1488 1073 ) e1u1/sky1 0 0 0 1 1
( 480 1472 1072 ) ( 480 1472 1073 ) ( 480 1473 1072 ) e1u1/sky1 0 0 0 1 1
}
// brush 6
{
( 1088 1216 1072 ) ( 1088 1217 1072 ) ( 1088 1216 1073 ) e1u1/twall2_1 0 0 0 1 1
( 1088 1216 1072 ) ( 1088 1216 1073 ) ( 1089 1216 1072 ) e1u1/twall2_1 0 0 0 1 1
( 1088 1216 944 ) ( 1089 1216 944 ) ( 1088 1217 944 ) e1u1/twall2_1 0 0 0 1 1
( 1152 1280 1088 ) ( 1152 1281 1088 ) ( 1153 1280 1088 ) e1u1/twall2_1 0 0 0 1 1
( 1152 1280 1088 ) ( 1153 1280 1088 ) ( 1152 1280 1089 ) e1u1/twall2_1 0 0 0 1 1
( 1152 1280 1088 ) ( 1152 1280 1089 ) ( 1152 1281 1088 ) e1u1/twall2_1 0 0 0 1 1
}
}
// entity 1
{
"classname" "info_player_start"
"origin" "1232 1160 968"
"angle" "90"
}
// entity 2
{
"classname" "light"
"origin" "1184 1216 1040"
"_sun" "1"
"_color" "1 0 0"
"mangle" "144.5 -28 0"
}
// entity 3
{
"classname" "info_null"
"origin" "1044 1316 948"
"targetname" "sundir"
}
18 changes: 12 additions & 6 deletions tests/test_ltface.cc
Original file line number Diff line number Diff line change
Expand Up @@ -716,14 +716,20 @@ TEST_CASE("q2_light_sunlight_default_mangle")

TEST_CASE("q2_light_sun")
{
auto [bsp, bspx] = QbspVisLight_Q2("q2_light_sun.map", {});
const std::vector<std::string> maps{"q2_light_sun.map", "q2_light_sun_mangle.map"};

INFO("sun entity shines at target");
const qvec3d shadow_pos{1084, 1284, 944};
CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {0, 0, 0}, shadow_pos);
for (const auto &map : maps) {
SUBCASE(map.c_str()) {
auto [bsp, bspx] = QbspVisLight_Q2(map, {});

CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {220, 0, 0}, shadow_pos + qvec3d{128, 0, 0});
CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {220, 0, 0}, shadow_pos + qvec3d{-128, 0, 0});
INFO("sun entity shines at target (q2_light_sun.map) or uses given mangle (q2_light_sun_mangle.map)");
const qvec3d shadow_pos{1084, 1284, 944};
CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {0, 0, 0}, shadow_pos);

CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {220, 0, 0}, shadow_pos + qvec3d{128, 0, 0});
CheckFaceLuxelAtPoint(&bsp, &bsp.dmodels[0], {220, 0, 0}, shadow_pos + qvec3d{-128, 0, 0});
}
}
}

TEST_CASE("q2_light_origin_brush_shadow")
Expand Down

0 comments on commit 992b6f0

Please sign in to comment.