Update the dynamic submesh with poly lines
This commit is contained in:
parent
65929d021f
commit
2b7394cbb1
3 changed files with 44 additions and 5 deletions
|
|
@ -995,6 +995,7 @@ void D_Display ()
|
|||
screen->FrameTimeNS = I_nsTime();
|
||||
TexAnim.UpdateAnimations(screen->FrameTime);
|
||||
R_UpdateSky(screen->FrameTime);
|
||||
if (level.levelMesh) level.levelMesh->BeginFrame(level);
|
||||
screen->BeginFrame();
|
||||
twod->ClearClipRect();
|
||||
if ((gamestate == GS_LEVEL || gamestate == GS_TITLELEVEL) && gametic != 0)
|
||||
|
|
|
|||
|
|
@ -146,11 +146,20 @@ void DoomLevelSubmesh::CreateStatic(FLevelLocals& doomMap)
|
|||
|
||||
for (unsigned int i = 0; i < doomMap.sides.Size(); i++)
|
||||
{
|
||||
CreateSideSurfaces(doomMap, &doomMap.sides[i]);
|
||||
bool isPolyLine = !!(doomMap.sides[i].Flags & WALLF_POLYOBJ);
|
||||
if (!isPolyLine)
|
||||
CreateSideSurfaces(doomMap, &doomMap.sides[i]);
|
||||
}
|
||||
|
||||
CreateSubsectorSurfaces(doomMap);
|
||||
|
||||
CreateIndexes();
|
||||
SetupLightmapUvs(doomMap);
|
||||
UpdateCollision();
|
||||
}
|
||||
|
||||
void DoomLevelSubmesh::CreateIndexes()
|
||||
{
|
||||
for (size_t i = 0; i < Surfaces.Size(); i++)
|
||||
{
|
||||
DoomLevelMeshSurface& s = Surfaces[i];
|
||||
|
|
@ -200,15 +209,34 @@ void DoomLevelSubmesh::CreateStatic(FLevelLocals& doomMap)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
SetupLightmapUvs(doomMap);
|
||||
|
||||
UpdateCollision();
|
||||
}
|
||||
|
||||
void DoomLevelSubmesh::CreateDynamic(FLevelLocals& doomMap)
|
||||
{
|
||||
LightmapSampleDistance = doomMap.LightmapSampleDistance;
|
||||
BuildSectorGroups(doomMap);
|
||||
}
|
||||
|
||||
void DoomLevelSubmesh::UpdateDynamic(FLevelLocals& doomMap)
|
||||
{
|
||||
Surfaces.Clear();
|
||||
MeshVertices.Clear();
|
||||
MeshVertexUVs.Clear();
|
||||
MeshElements.Clear();
|
||||
MeshUVIndex.Clear();
|
||||
MeshSurfaceIndexes.Clear();
|
||||
LightmapUvs.Clear();
|
||||
|
||||
for (unsigned int i = 0; i < doomMap.lines.Size(); i++)
|
||||
{
|
||||
bool isPolyLine = doomMap.lines[i].sidedef[0] && (doomMap.lines[i].sidedef[0]->Flags & WALLF_POLYOBJ);
|
||||
if (isPolyLine)
|
||||
CreateSideSurfaces(doomMap, doomMap.lines[i].sidedef[0]);
|
||||
}
|
||||
|
||||
CreateIndexes();
|
||||
SetupLightmapUvs(doomMap);
|
||||
UpdateCollision();
|
||||
}
|
||||
|
||||
DoomLevelMesh::DoomLevelMesh(FLevelLocals &doomMap)
|
||||
|
|
@ -223,6 +251,11 @@ DoomLevelMesh::DoomLevelMesh(FLevelLocals &doomMap)
|
|||
static_cast<DoomLevelSubmesh*>(DynamicMesh.get())->CreateDynamic(doomMap);
|
||||
}
|
||||
|
||||
void DoomLevelMesh::BeginFrame(FLevelLocals& doomMap)
|
||||
{
|
||||
static_cast<DoomLevelSubmesh*>(DynamicMesh.get())->UpdateDynamic(doomMap);
|
||||
}
|
||||
|
||||
void DoomLevelSubmesh::BuildSectorGroups(const FLevelLocals& doomMap)
|
||||
{
|
||||
int groupIndex = 0;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ class DoomLevelSubmesh : public LevelSubmesh
|
|||
public:
|
||||
void CreateStatic(FLevelLocals& doomMap);
|
||||
void CreateDynamic(FLevelLocals& doomMap);
|
||||
void UpdateDynamic(FLevelLocals& doomMap);
|
||||
|
||||
LevelMeshSurface* GetSurface(int index) override { return &Surfaces[index]; }
|
||||
unsigned int GetSurfaceIndex(const LevelMeshSurface* surface) const override { return (unsigned int)(ptrdiff_t)(static_cast<const DoomLevelMeshSurface*>(surface) - Surfaces.Data()); }
|
||||
|
|
@ -59,6 +60,8 @@ private:
|
|||
|
||||
void SetupLightmapUvs(FLevelLocals& doomMap);
|
||||
|
||||
void CreateIndexes();
|
||||
|
||||
static bool IsTopSideSky(sector_t* frontsector, sector_t* backsector, side_t* side);
|
||||
static bool IsTopSideVisible(side_t* side);
|
||||
static bool IsBottomSideVisible(side_t* side);
|
||||
|
|
@ -116,6 +119,8 @@ class DoomLevelMesh : public LevelMesh
|
|||
{
|
||||
public:
|
||||
DoomLevelMesh(FLevelLocals &doomMap);
|
||||
|
||||
void BeginFrame(FLevelLocals& doomMap);
|
||||
|
||||
bool TraceSky(const FVector3& start, FVector3 direction, float dist)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue