diff --git a/include/light/entities.hh b/include/light/entities.hh index 6dd3c632..4142cdde 100644 --- a/include/light/entities.hh +++ b/include/light/entities.hh @@ -73,6 +73,7 @@ public: settings::setting_scalar light; settings::setting_scalar atten; settings::setting_enum formula; + settings::setting_scalar cone; // Q2 settings::setting_scalar spotangle; settings::setting_scalar spotangle2; settings::setting_numeric style; diff --git a/light/entities.cc b/light/entities.cc index e90de54b..41df128c 100644 --- a/light/entities.cc +++ b/light/entities.cc @@ -80,7 +80,8 @@ light_t::light_t() : formula{this, "delay", LF_LINEAR, {{"linear", LF_LINEAR}, {"inverse", LF_INVERSE}, {"inverse2", LF_INVERSE2}, {"infinite", LF_INFINITE}, {"localmin", LF_LOCALMIN}, {"inverse2a", LF_INVERSE2A}}}, - spotangle{this, {"angle", "cone"}, 40.0}, + cone{this, {"cone"}, 10.f}, + spotangle{this, "angle", 40.0}, spotangle2{this, "softangle", 0.0}, style{this, "style", 0, 0, INVALID_LIGHTSTYLE - 1}, anglescale{this, {"anglesense", "anglescale"}, -1.0}, @@ -106,7 +107,7 @@ light_t::light_t() : suntexture{this, "suntexture", ""}, nostaticlight{this, "nostaticlight", false}, surflight_group{this, "surflight_group", 0}, - surface_minlight_scale{this, "surface_minlight_scale", 64}, + surface_minlight_scale{this, "surface_minlight_scale", 64.f}, light_channel_mask{this, "light_channel_mask", CHANNEL_MASK_DEFAULT}, shadow_channel_mask{this, "shadow_channel_mask", CHANNEL_MASK_DEFAULT}, nonudge{this, "nonudge", false} @@ -246,17 +247,33 @@ static void SetupSpotlights(const settings::worldspawn_keys &cfg) entity->spotlight = true; } if (entity->spotlight) { - const vec_t angle = (entity->spotangle.value() > 0) ? entity->spotangle.value() : 40; - entity->spotfalloff = -cos(angle / 2 * Q_PI / 180); + + vec_t base_angle; + + if (entity->cone.isChanged()) { + base_angle = entity->cone.value() * 2.f; + + if (!base_angle) { + base_angle = 10.f; + } + } else { + base_angle = entity->spotangle.value(); + + if (!base_angle) { + base_angle = 40.f; + } + } + + entity->spotfalloff = -cos(base_angle / 2 * Q_PI / 180); vec_t angle2 = entity->spotangle2.value(); - if (angle2 <= 0 || angle2 > angle) - angle2 = angle; + if (angle2 <= 0 || angle2 > base_angle) + angle2 = base_angle; entity->spotfalloff2 = -cos(angle2 / 2 * Q_PI / 180); // mxd. Apply autofalloff? if (targetdist > 0.0f && entity->falloff.value() == 0 && cfg.spotlightautofalloff.value()) { - const vec_t coneradius = targetdist * tan(angle / 2 * Q_PI / 180); + const vec_t coneradius = targetdist * tan(base_angle / 2 * Q_PI / 180); entity->falloff.setValue(targetdist + coneradius, settings::source::MAP); } } @@ -308,7 +325,7 @@ static void CheckEntityFields(const mbsp_t *bsp, const settings::worldspawn_keys if (!entity->surface_minlight_scale.isChanged()) { if (bsp->loadversion->game->id != GAME_QUAKE_II) { // TODO: also use 1.0 for Q2? - entity->surface_minlight_scale.setValue(1.0, settings::source::DEFAULT); + entity->surface_minlight_scale.setValue(64.f, settings::source::DEFAULT); } } } diff --git a/light/ltface.cc b/light/ltface.cc index fcca12c1..0371903f 100644 --- a/light/ltface.cc +++ b/light/ltface.cc @@ -3016,7 +3016,7 @@ void DirectLightFace(const mbsp_t *bsp, lightsurf_t &lightsurf, const settings:: if (auto value = IsSurfaceLitFace(bsp, face)) { auto *entity = std::get<3>(value.value()); - const float surface_minlight_scale = entity ? entity->surface_minlight_scale.value() : 64.0f; + const float surface_minlight_scale = entity ? entity->surface_minlight_scale.value() : 64.f; minlight = std::get<0>(value.value()) * surface_minlight_scale; minlight_color = std::get<2>(value.value()); LightFace_Min(bsp, face, minlight_color, minlight, &lightsurf, lightmaps, std::get<1>(value.value()));