Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2024-06-01 21:32:27 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2024-06-01 21:32:27 +1000
commit41bad6c97c60918af640e8d4c558316edd1bd9c7 (patch)
treec6d3ef152e17c06947a4003af7ffe7ef5827a638
parenta88b1e4ce07ad7aceb01babc232c43630fea85d2 (diff)
fix MaterialDatabase::radiantLight null deref when material/matmod ID does not exist
-rw-r--r--source/game/StarLiquidsDatabase.hpp12
-rw-r--r--source/game/StarMaterialDatabase.hpp8
-rw-r--r--source/game/StarWorldClient.cpp6
3 files changed, 11 insertions, 15 deletions
diff --git a/source/game/StarLiquidsDatabase.hpp b/source/game/StarLiquidsDatabase.hpp
index 707be70..fa319c0 100644
--- a/source/game/StarLiquidsDatabase.hpp
+++ b/source/game/StarLiquidsDatabase.hpp
@@ -89,14 +89,12 @@ inline LiquidSettingsConstPtr LiquidsDatabase::liquidSettings(LiquidId liquidId)
}
inline Vec3F LiquidsDatabase::radiantLight(LiquidLevel level) const {
- if (level.liquid >= m_settings.size())
- return Vec3F();
+ if (level.liquid < m_settings.size()) {
+ if (auto const& settings = m_settings[level.liquid])
+ return settings->radiantLightLevel * level.level;
+ }
- auto const& settings = m_settings[level.liquid];
- if (!settings)
- return Vec3F();
-
- return settings->radiantLightLevel * level.level;
+ return Vec3F();
}
}
diff --git a/source/game/StarMaterialDatabase.hpp b/source/game/StarMaterialDatabase.hpp
index 8e4f350..b890e30 100644
--- a/source/game/StarMaterialDatabase.hpp
+++ b/source/game/StarMaterialDatabase.hpp
@@ -239,13 +239,13 @@ inline Vec3F MaterialDatabase::radiantLight(MaterialId materialId, ModId modId)
Vec3F radiantLight;
if (materialId < m_materials.size()) {
auto const& mat = m_materials[materialId];
- if (mat->materialRenderProfile)
+ if (mat && mat->materialRenderProfile)
radiantLight += mat->materialRenderProfile->radiantLight;
}
if (modId < m_mods.size()) {
- auto const& mat = m_mods[modId];
- if (mat->modRenderProfile)
- radiantLight += mat->modRenderProfile->radiantLight;
+ auto const& mod = m_mods[modId];
+ if (mod && mod->modRenderProfile)
+ radiantLight += mod->modRenderProfile->radiantLight;
}
return radiantLight;
}
diff --git a/source/game/StarWorldClient.cpp b/source/game/StarWorldClient.cpp
index 91f1d39..ef5daa2 100644
--- a/source/game/StarWorldClient.cpp
+++ b/source/game/StarWorldClient.cpp
@@ -1631,6 +1631,7 @@ RpcPromise<InteractAction> WorldClient::interact(InteractRequest const& request)
}
void WorldClient::lightingTileGather() {
+ int64_t start = Time::monotonicMicroseconds();
Vec3F environmentLight = m_sky->environmentLight().toRgbF();
float undergroundLevel = m_worldTemplate->undergroundLevel();
auto liquidsDatabase = Root::singleton().liquidsDatabase();
@@ -1638,7 +1639,6 @@ void WorldClient::lightingTileGather() {
// Each column in tileEvalColumns is guaranteed to be no larger than the sector size.
- size_t lights = 0;
m_tileArray->tileEvalColumns(m_lightingCalculator.calculationRegion(), [&](Vec2I const& pos, ClientTile const* column, size_t ySize) {
size_t baseIndex = m_lightingCalculator.baseIndexFor(pos);
for (size_t y = 0; y < ySize; ++y) {
@@ -1655,12 +1655,10 @@ void WorldClient::lightingTileGather() {
if (tile.backgroundLightTransparent && pos[1] + y > undergroundLevel)
light += environmentLight;
}
- if (light.max() > 0.0f)
- ++lights;
m_lightingCalculator.setCellIndex(baseIndex + y, light, !tile.foregroundLightTransparent);
}
});
- LogMap::set("client_render_world_async_light_tiles", toString(lights));
+ LogMap::set("client_render_world_async_light_gather", strf(u8"{:05d}\u00b5s", Time::monotonicMicroseconds() - start));
}
void WorldClient::lightingCalc() {