mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-01-21 16:40:54 +00:00
69 lines
1.6 KiB
C++
69 lines
1.6 KiB
C++
|
|
#include "tarray.h"
|
|
struct vertex_t;
|
|
|
|
struct FQualifiedVertex
|
|
{
|
|
vertex_t *vertex; // index into vertex array
|
|
int qualifier; // some index to prevent vertices in different groups from being merged together.
|
|
};
|
|
|
|
template<> struct THashTraits<FQualifiedVertex>
|
|
{
|
|
hash_t Hash(const FQualifiedVertex &key)
|
|
{
|
|
return (int)(((intptr_t)key.vertex) >> 4) ^ (key.qualifier << 16);
|
|
}
|
|
int Compare(const FQualifiedVertex &left, const FQualifiedVertex &right) { return left.vertex != right.vertex || left.qualifier != right.qualifier; }
|
|
};
|
|
|
|
//=============================================================================
|
|
//
|
|
// One sector's vertex data.
|
|
//
|
|
//=============================================================================
|
|
|
|
struct VertexContainer
|
|
{
|
|
TArray<FQualifiedVertex> vertices;
|
|
TMap<FQualifiedVertex, uint32_t> vertexmap;
|
|
bool perSubsector = false;
|
|
|
|
TArray<uint32_t> indices;
|
|
|
|
uint32_t AddVertex(FQualifiedVertex *vert)
|
|
{
|
|
auto check = vertexmap.CheckKey(*vert);
|
|
if (check != nullptr) return *check;
|
|
auto index = vertices.Push(*vert);
|
|
vertexmap[*vert] = index;
|
|
return index;
|
|
}
|
|
|
|
uint32_t AddVertex(vertex_t *vert, int qualifier)
|
|
{
|
|
FQualifiedVertex vertx = { vert, qualifier};
|
|
return AddVertex(&vertx);
|
|
}
|
|
|
|
uint32_t AddIndexForVertex(FQualifiedVertex *vert)
|
|
{
|
|
return indices.Push(AddVertex(vert));
|
|
}
|
|
|
|
uint32_t AddIndexForVertex(vertex_t *vert, int qualifier)
|
|
{
|
|
return indices.Push(AddVertex(vert, qualifier));
|
|
}
|
|
|
|
uint32_t AddIndex(uint32_t indx)
|
|
{
|
|
return indices.Push(indx);
|
|
}
|
|
};
|
|
|
|
using VertexContainers = TArray<VertexContainer>;
|
|
|
|
VertexContainers BuildVertices();
|
|
|
|
|