From 58381ec76211698f682bcee0b6a17b816200592f Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 7 Dec 2023 12:48:48 +0100 Subject: [PATCH] Use a TArrayView for the lightmap arrays --- src/gamedata/r_defs.h | 4 ++-- src/maploader/maploader.cpp | 9 +++++---- src/rendering/hwrenderer/doom_levelmesh.cpp | 4 ++-- src/rendering/hwrenderer/hw_vertexbuilder.cpp | 2 +- src/rendering/hwrenderer/scene/hw_flats.cpp | 2 +- src/rendering/hwrenderer/scene/hw_walls.cpp | 10 +++++----- 6 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/gamedata/r_defs.h b/src/gamedata/r_defs.h index 0009c1662..5b3332259 100644 --- a/src/gamedata/r_defs.h +++ b/src/gamedata/r_defs.h @@ -1256,7 +1256,7 @@ struct side_t uint16_t Flags; int UDMFIndex; // needed to access custom UDMF fields which are stored in loading order. FLightNode * lighthead; // all dynamic lights that may affect this wall - DoomLevelMeshSurface** lightmap; // all mesh surfaces belonging to this sidedef. Used for lightmapping + TArrayView lightmap; // all mesh surfaces belonging to this sidedef. Used for lightmapping seg_t **segs; // all segs belonging to this sidedef in ascending order. Used for precise rendering int numsegs; int sidenum; @@ -1673,7 +1673,7 @@ struct subsector_t // 2: has one-sided walls FPortalCoverage portalcoverage[2]; - DoomLevelMeshSurface** lightmap[2]; // all mesh surfaces belonging to this subsector. Used for lightmapping + TArrayView lightmap[2]; // all mesh surfaces belonging to this subsector. Used for lightmapping }; diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 1dc5ec105..aa22333dc 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3006,15 +3006,16 @@ void MapLoader::InitLevelMesh(MapData* map) for (unsigned int i = 0; i < Level->sides.Size(); i++) { auto& side = Level->sides[i]; - side.lightmap = &Level->LMSurfaces[offset]; - offset += 4 + side.sector->e->XFloor.ffloors.Size(); + int count = 4 + side.sector->e->XFloor.ffloors.Size(); + side.lightmap = TArrayView(&Level->LMSurfaces[offset], count); + offset += count; } for (unsigned int i = 0; i < Level->subsectors.Size(); i++) { auto& subsector = Level->subsectors[i]; unsigned int count = 1 + subsector.sector->e->XFloor.ffloors.Size(); - subsector.lightmap[0] = &Level->LMSurfaces[offset]; - subsector.lightmap[1] = &Level->LMSurfaces[offset + count]; + subsector.lightmap[0] = TArrayView(&Level->LMSurfaces[offset], count); + subsector.lightmap[1] = TArrayView(&Level->LMSurfaces[offset + count], count); offset += count * 2; } diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index a73ff68cb..5ab386334 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -312,11 +312,11 @@ void DoomLevelSubmesh::UpdateDynamic(FLevelLocals& doomMap, int lightmapStartInd if (isPolyLine) { // Make sure we have a lightmap array on the polyobj sidedef - if (!side->lightmap) + if (side->lightmap.Size() == 0) { auto array = std::make_unique(4); memset(array.get(), 0, sizeof(DoomLevelMeshSurface*)); - side->lightmap = array.get(); + side->lightmap = TArrayView(array.get(), 4); PolyLMSurfaces.Push(std::move(array)); } diff --git a/src/rendering/hwrenderer/hw_vertexbuilder.cpp b/src/rendering/hwrenderer/hw_vertexbuilder.cpp index 8c14d7fb6..03f60219c 100644 --- a/src/rendering/hwrenderer/hw_vertexbuilder.cpp +++ b/src/rendering/hwrenderer/hw_vertexbuilder.cpp @@ -243,7 +243,7 @@ static int CreateIndexedSectorVerticesLM(FRenderState& renderstate, sector_t* se for(auto& sub : section.subsectors) { // vertices - DoomLevelMeshSurface* lightmap = sub->lightmap[h][lightmapIndex]; + DoomLevelMeshSurface* lightmap = sub->lightmap[h].Size() > lightmapIndex ? sub->lightmap[h][lightmapIndex] : nullptr; if (lightmap && lightmap->Type != ST_UNKNOWN) // lightmap may be missing if the subsector is degenerate triangle { float* luvs = lightmap->TexCoords; diff --git a/src/rendering/hwrenderer/scene/hw_flats.cpp b/src/rendering/hwrenderer/scene/hw_flats.cpp index 8e34de67c..a766fdc80 100644 --- a/src/rendering/hwrenderer/scene/hw_flats.cpp +++ b/src/rendering/hwrenderer/scene/hw_flats.cpp @@ -522,7 +522,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, FRenderState& state, sector_t * front unsigned int count = sector->e->XFloor.ffloors.Size() + 1; for (unsigned int j = 0; j < count; j++) { - if (auto lightmap = sector->subsectors[i]->lightmap[plane][j]) + if (auto lightmap = sector->subsectors[i]->lightmap[plane].Size() > j ? sector->subsectors[i]->lightmap[plane][j] : nullptr) { di->PushVisibleSurface(lightmap); } diff --git a/src/rendering/hwrenderer/scene/hw_walls.cpp b/src/rendering/hwrenderer/scene/hw_walls.cpp index b8efe0872..b6896577e 100644 --- a/src/rendering/hwrenderer/scene/hw_walls.cpp +++ b/src/rendering/hwrenderer/scene/hw_walls.cpp @@ -1164,7 +1164,7 @@ void HWWall::DoTexture(HWWallDispatcher *di, FRenderState& state, int _type,seg_ type = _type; - if (seg->sidedef->lightmap && type >= RENDERWALL_TOP && type <= RENDERWALL_BOTTOM) + if (seg->sidedef->lightmap.Size() >= 4 && type >= RENDERWALL_TOP && type <= RENDERWALL_BOTTOM) { lightmap = seg->sidedef->lightmap[type - RENDERWALL_TOP]; if (lightmap && di->di) @@ -1231,9 +1231,9 @@ void HWWall::DoMidTexture(HWWallDispatcher *di, FRenderState& state, seg_t * seg // if (texture) { - if (auto lightmapPtr = seg->sidedef->lightmap) + if (seg->sidedef->lightmap.Size() >= 4) { - lightmap = lightmapPtr[side_t::mid]; + lightmap = seg->sidedef->lightmap[side_t::mid]; if (lightmap && di->di) { di->di->PushVisibleSurface(lightmap); @@ -1571,9 +1571,9 @@ void HWWall::BuildFFBlock(HWWallDispatcher *di, FRenderState& state, seg_t * seg lightmap = nullptr; if (seg->sidedef == seg->linedef->sidedef[0]) - lightmap = seg->linedef->sidedef[1]->lightmap ? seg->linedef->sidedef[1]->lightmap[4 + roverIndex] : nullptr; + lightmap = seg->linedef->sidedef[1]->lightmap.Size() > 4 + roverIndex ? seg->linedef->sidedef[1]->lightmap[4 + roverIndex] : nullptr; else - lightmap = seg->linedef->sidedef[0]->lightmap ? seg->linedef->sidedef[0]->lightmap[4 + roverIndex] : nullptr; + lightmap = seg->linedef->sidedef[0]->lightmap.Size() > 4 + roverIndex ? seg->linedef->sidedef[0]->lightmap[4 + roverIndex] : nullptr; if (lightmap && di->di) {