Add partner subsectors to surface list for each subsector
This commit is contained in:
parent
10a8c85c1f
commit
e1ec7b2d85
5 changed files with 54 additions and 14 deletions
|
|
@ -172,9 +172,9 @@ struct LightmapTile
|
|||
height = textureSize;
|
||||
}
|
||||
|
||||
Transform.TranslateWorldToLocal.X = uvMin.X * SampleDimension;
|
||||
Transform.TranslateWorldToLocal.Y = uvMin.Y * SampleDimension;
|
||||
Transform.TranslateWorldToLocal.Z = uvMin.Z * SampleDimension;
|
||||
Transform.TranslateWorldToLocal.X = uvMin.X * SampleDimension + 0.1f;
|
||||
Transform.TranslateWorldToLocal.Y = uvMin.Y * SampleDimension + 0.1f;
|
||||
Transform.TranslateWorldToLocal.Z = uvMin.Z * SampleDimension + 0.1f;
|
||||
|
||||
Transform.ProjLocalToU = tCoords[0];
|
||||
Transform.ProjLocalToV = tCoords[1];
|
||||
|
|
|
|||
|
|
@ -50,6 +50,14 @@ public:
|
|||
m_Box[BOXBOTTOM] = m_Box[BOXLEFT] = FLT_MAX;
|
||||
}
|
||||
|
||||
void extend(double size)
|
||||
{
|
||||
m_Box[BOXTOP] += size;
|
||||
m_Box[BOXLEFT] -= size;
|
||||
m_Box[BOXRIGHT] += size;
|
||||
m_Box[BOXBOTTOM] -= size;
|
||||
}
|
||||
|
||||
// Returns a bounding box that encloses both bounding boxes
|
||||
FBoundingBox operator | (const FBoundingBox &box2) const
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1711,7 +1711,7 @@ struct subsector_t
|
|||
uint32_t numlines;
|
||||
uint16_t flags;
|
||||
short mapsection;
|
||||
FBoundingBox bbox; // [DVR] For alternative space culling in orthographic projection with no fog of war
|
||||
FBoundingBox bbox;
|
||||
|
||||
// subsector related GL data
|
||||
int validcount;
|
||||
|
|
|
|||
|
|
@ -3568,13 +3568,7 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position)
|
|||
P_Recalculate3DFloors(&sec);
|
||||
}
|
||||
|
||||
InitLevelMesh(map);
|
||||
|
||||
UpdateVBOLightmap(*screen->RenderState(), Level->sectors);
|
||||
|
||||
Level->aabbTree = new DoomLevelAABBTree(Level);
|
||||
|
||||
// [DVR] Populate subsector->bbox for alternative space culling in orthographic projection with no fog of war
|
||||
// Calculate subsector->bbox
|
||||
subsector_t* sub = &Level->subsectors[0];
|
||||
seg_t* seg;
|
||||
for (unsigned int kk = 0; kk < Level->subsectors.Size(); kk++)
|
||||
|
|
@ -3582,9 +3576,9 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position)
|
|||
sub[kk].bbox.ClearBox();
|
||||
unsigned int count = sub[kk].numlines;
|
||||
seg = sub[kk].firstline;
|
||||
while(count--)
|
||||
while (count--)
|
||||
{
|
||||
if((seg->v1 != nullptr) && (seg->v2 != nullptr))
|
||||
if ((seg->v1 != nullptr) && (seg->v2 != nullptr))
|
||||
{
|
||||
sub[kk].bbox.AddToBox(seg->v1->fPos());
|
||||
sub[kk].bbox.AddToBox(seg->v2->fPos());
|
||||
|
|
@ -3593,5 +3587,11 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position)
|
|||
}
|
||||
}
|
||||
|
||||
InitLevelMesh(map);
|
||||
|
||||
UpdateVBOLightmap(*screen->RenderState(), Level->sectors);
|
||||
|
||||
Level->aabbTree = new DoomLevelAABBTree(Level);
|
||||
|
||||
LevelMeshUpdater = Level->levelMesh; // Start tracking level changes
|
||||
}
|
||||
|
|
|
|||
|
|
@ -503,15 +503,47 @@ void DoomLevelMesh::BuildSideVisibilityLists(FLevelLocals& doomMap)
|
|||
|
||||
void DoomLevelMesh::BuildSubsectorVisibilityLists(FLevelLocals& doomMap)
|
||||
{
|
||||
TArray<subsector_t*> stack;
|
||||
VisibleSubsectors.resize(doomMap.subsectors.size());
|
||||
for (size_t i = 0, count = VisibleSubsectors.size(); i < count; i++)
|
||||
{
|
||||
subsector_t* sub = &doomMap.subsectors[i];
|
||||
FBoundingBox bbox = sub->bbox;
|
||||
bbox.extend(32.0);
|
||||
|
||||
validcount++;
|
||||
|
||||
// Always bake the subsector
|
||||
VisibleSubsectors[i].Push(i);
|
||||
sub->validcount = validcount;
|
||||
stack.Push(sub);
|
||||
|
||||
// To do: use sub->firstline to find neighbouring subsectors we want included in a tile bake
|
||||
// Add neighbouring subsectors that touches the bounding box
|
||||
while (stack.size() != 0)
|
||||
{
|
||||
sub = stack.Last();
|
||||
stack.Pop();
|
||||
|
||||
auto lines = sub->firstline;
|
||||
uint32_t count = sub->numlines;
|
||||
for (uint32_t j = 0; j < count; j++)
|
||||
{
|
||||
seg_t* partner = lines[j].PartnerSeg;
|
||||
if (partner && partner->Subsector)
|
||||
{
|
||||
subsector_t* partnersub = partner->Subsector;
|
||||
if (partnersub->validcount != validcount)
|
||||
{
|
||||
partnersub->validcount = validcount;
|
||||
if (partnersub->bbox.CheckOverlap(bbox))
|
||||
{
|
||||
stack.Push(partnersub);
|
||||
VisibleSubsectors[i].Push(partnersub->Index());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue