2021-03-15 22:46:03 +00:00
|
|
|
#pragma once
|
|
|
|
#include "build.h"
|
|
|
|
|
2021-03-24 17:42:00 +00:00
|
|
|
class FSerializer;
|
|
|
|
|
2021-03-25 08:06:01 +00:00
|
|
|
void render_drawrooms(spritetype* playersprite, const vec3_t& position, int sectnum, binangle angle, fixedhoriz horizon, lookangle rollang);
|
2021-03-20 22:01:16 +00:00
|
|
|
|
2021-03-21 13:48:35 +00:00
|
|
|
struct PortalDesc
|
|
|
|
{
|
|
|
|
int type;
|
|
|
|
int dx, dy, dz;
|
|
|
|
TArray<int> targets;
|
|
|
|
};
|
|
|
|
|
2021-03-24 17:42:00 +00:00
|
|
|
FSerializer& Serialize(FSerializer& arc, const char* key, PortalDesc& obj, PortalDesc* defval);
|
|
|
|
|
|
|
|
|
2021-03-21 13:48:35 +00:00
|
|
|
extern TArray<PortalDesc> allPortals;
|
|
|
|
|
|
|
|
inline void portalClear()
|
|
|
|
{
|
|
|
|
allPortals.Clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
inline int portalAdd(int type, int target, int dx = 0, int dy = 0, int dz = 0)
|
|
|
|
{
|
|
|
|
auto& pt = allPortals[allPortals.Reserve(1)];
|
|
|
|
pt.type = type;
|
2021-03-25 20:21:48 +00:00
|
|
|
if (target >= 0) pt.targets.Push(target);
|
2021-03-21 13:48:35 +00:00
|
|
|
pt.dx = dx;
|
|
|
|
pt.dy = dy;
|
|
|
|
pt.dz = dz;
|
|
|
|
return allPortals.Size() - 1;
|
|
|
|
}
|
|
|
|
|
2021-03-24 17:42:00 +00:00
|
|
|
// merges portals in adjoining sectors.
|
2021-03-21 13:48:35 +00:00
|
|
|
inline void mergePortals()
|
|
|
|
{
|
2021-03-24 17:42:00 +00:00
|
|
|
//Printf("Have %d portals\n", allPortals.Size());
|
2021-03-21 13:48:35 +00:00
|
|
|
bool didsomething = true;
|
|
|
|
while (didsomething)
|
|
|
|
{
|
|
|
|
didsomething = false;
|
|
|
|
for (unsigned i = 0; i < allPortals.Size(); i++)
|
|
|
|
{
|
|
|
|
auto& pt1 = allPortals[i];
|
|
|
|
if (pt1.type == PORTAL_SECTOR_CEILING || pt1.type == PORTAL_SECTOR_FLOOR)
|
|
|
|
{
|
|
|
|
for (unsigned j = i + 1; j < allPortals.Size(); j++)
|
|
|
|
{
|
|
|
|
auto& pt2 = allPortals[j];
|
|
|
|
if (pt1.type != pt2.type || pt1.dx != pt2.dx || pt1.dy != pt2.dy || pt1.dz != pt2.dz) continue;
|
2021-03-24 22:11:06 +00:00
|
|
|
for (unsigned s = 0; s < pt1.targets.Size() && pt2.targets.Size(); s++)
|
2021-03-21 13:48:35 +00:00
|
|
|
{
|
|
|
|
for (unsigned t = 0; t < pt2.targets.Size(); t++)
|
|
|
|
{
|
|
|
|
if (findwallbetweensectors(pt1.targets[s], pt2.targets[t]) >= 0)
|
|
|
|
{
|
|
|
|
pt1.targets.Append(pt2.targets);
|
|
|
|
pt2.targets.Reset();
|
|
|
|
pt2.type = -1;
|
|
|
|
for (int n = 0; n < numsectors; n++)
|
|
|
|
{
|
2021-03-24 17:42:00 +00:00
|
|
|
//Printf("Merged %d and %d\n", i, j);
|
2021-03-21 13:48:35 +00:00
|
|
|
if (sector[n].portalnum == j) sector[n].portalnum = i;
|
|
|
|
}
|
2021-03-24 22:11:06 +00:00
|
|
|
didsomething = true;
|
|
|
|
break;
|
2021-03-21 13:48:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|