qzdoom/src/hwrenderer/data/hw_vertexbuilder.h

70 lines
1.6 KiB
C
Raw Normal View History

#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();