light: add _lightgrid_hint point entity key for customizing lightgrid bounds

use it as a info_null key: "_lightgrid_hint" "1"
This commit is contained in:
Eric Wasylishen 2023-02-12 15:03:08 -07:00
parent 7b8e55f594
commit 48fe527955
5 changed files with 61 additions and 8 deletions

View File

@ -194,6 +194,17 @@ public:
constexpr value_type size() const { return maxs() - mins(); } constexpr value_type size() const { return maxs() - mins(); }
constexpr bool valid() const {
value_type our_size = size();
if (our_size[0] < static_cast<V>(0)
|| our_size[1] < static_cast<V>(0)
|| our_size[2] < static_cast<V>(0)) {
return false;
}
return true;
}
constexpr aabb grow(const value_type &size) const { return {mins() - size, maxs() + size}; } constexpr aabb grow(const value_type &size) const { return {mins() - size, maxs() + size}; }
constexpr value_type &operator[](const size_t &index) { return m_corners[index]; } constexpr value_type &operator[](const size_t &index) { return m_corners[index]; }

View File

@ -131,6 +131,7 @@ public:
void ResetLightEntities(); void ResetLightEntities();
std::string TargetnameForLightStyle(int style); std::string TargetnameForLightStyle(int style);
std::vector<std::unique_ptr<light_t>> &GetLights(); std::vector<std::unique_ptr<light_t>> &GetLights();
const std::vector<entdict_t> &GetEntdicts();
std::vector<sun_t> &GetSuns(); std::vector<sun_t> &GetSuns();
std::vector<entdict_t> &GetRadLights(); std::vector<entdict_t> &GetRadLights();

View File

@ -29,10 +29,10 @@
#include <common/bsputils.hh> #include <common/bsputils.hh>
#include <common/parallel.hh> #include <common/parallel.hh>
std::vector<std::unique_ptr<light_t>> all_lights; static std::vector<std::unique_ptr<light_t>> all_lights;
std::vector<sun_t> all_suns; static std::vector<sun_t> all_suns;
std::vector<entdict_t> entdicts; static std::vector<entdict_t> entdicts;
std::vector<entdict_t> radlights; static std::vector<entdict_t> radlights;
static std::vector<std::pair<std::string, int>> lightstyleForTargetname; static std::vector<std::pair<std::string, int>> lightstyleForTargetname;
static std::vector<std::unique_ptr<light_t>> surfacelight_templates; static std::vector<std::unique_ptr<light_t>> surfacelight_templates;
static std::ofstream surflights_dump_file; static std::ofstream surflights_dump_file;
@ -60,6 +60,11 @@ std::vector<std::unique_ptr<light_t>> &GetLights()
return all_lights; return all_lights;
} }
const std::vector<entdict_t> &GetEntdicts()
{
return entdicts;
}
std::vector<sun_t> &GetSuns() std::vector<sun_t> &GetSuns()
{ {
return all_suns; return all_suns;

View File

@ -51,6 +51,30 @@ static std::vector<uint8_t> StringToVector(const std::string &str)
return result; return result;
} }
static aabb3f LightGridBounds(const mbsp_t &bsp)
{
aabb3f result;
// see if `_lightgrid_hint` entities are in use
for (auto &entity : GetEntdicts()) {
if (entity.get_int("_lightgrid_hint")) {
qvec3d point{};
entity.get_vector("origin", point);
result += point;
}
}
if (result.valid()) {
auto size = result.size();
if (size[0] > 0 && size[1] > 0 && size[2] > 0) {
return result;
}
}
result = Model_BoundsOfFaces(bsp, bsp.dmodels[0]);
return result;
}
void LightGrid(bspdata_t *bspdata) void LightGrid(bspdata_t *bspdata)
{ {
if (!light_options.lightgrid.value()) if (!light_options.lightgrid.value())
@ -60,9 +84,9 @@ void LightGrid(bspdata_t *bspdata)
auto &bsp = std::get<mbsp_t>(bspdata->bsp); auto &bsp = std::get<mbsp_t>(bspdata->bsp);
auto faces_size = Model_BoundsOfFaces(bsp, bsp.dmodels[0]); const auto grid_bounds = LightGridBounds(bsp);
const qvec3f grid_maxs = faces_size.maxs(); const qvec3f grid_maxs = grid_bounds.maxs();
const qvec3f grid_mins = faces_size.mins(); const qvec3f grid_mins = grid_bounds.mins();
const qvec3f world_size = grid_maxs - grid_mins; const qvec3f world_size = grid_maxs - grid_mins;
// number of grid points on each axis // number of grid points on each axis

View File

@ -306,6 +306,18 @@ static void WriteLeafVolumes(const std::vector<portal_t *> &leakline, std::strin
WriteBspBrushMap(filename_suffix, volumes_to_write); WriteBspBrushMap(filename_suffix, volumes_to_write);
} }
/**
* Is this entity allowed to be in the void without causing a leak?
*/
static bool IsNofillEntity(const entdict_t &edict)
{
if (edict.get_int("_nofill"))
return true;
if (edict.get_int("_lightgrid_hint"))
return true;
return false;
}
/* /*
================== ==================
FindOccupiedLeafs FindOccupiedLeafs
@ -323,7 +335,7 @@ static void MarkOccupiedClusters(node_t *headnode)
continue; continue;
// skip nofill entities // skip nofill entities
if (entity.epairs.has("_nofill") && entity.epairs.get_int("_nofill")) { if (IsNofillEntity(entity.epairs)) {
continue; continue;
} }