mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
* Move render utils to dedicated file. * Implement more render/mesh utils. * Added structure for OverlayTriangle_t, OverlaySweptBox_t and OverlayCapsule_t. OverlayCapsule_t has been modified to accommodate the size in r5 (2 new vectors).
141 lines
3.4 KiB
C++
141 lines
3.4 KiB
C++
//===== Copyright <20> 2005-2005, Valve Corporation, All rights reserved. ======//
|
||
//
|
||
// Purpose: A set of utilities to render standard shapes
|
||
//
|
||
//===========================================================================//
|
||
|
||
#include "core/stdafx.h"
|
||
#include "tier2/meshutils.h"
|
||
|
||
// NOTE: This has to be the last file included!
|
||
//#include "tier0/memdbgon.h"
|
||
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// Helper methods to create various standard index buffer types
|
||
//-----------------------------------------------------------------------------
|
||
void GenerateSequentialIndexBuffer(unsigned short* pIndices, int nIndexCount, int nFirstVertex)
|
||
{
|
||
if (!pIndices)
|
||
return;
|
||
|
||
// Format the sequential buffer
|
||
for (int i = 0; i < nIndexCount; ++i)
|
||
{
|
||
pIndices[i] = (unsigned short)(i + nFirstVertex);
|
||
}
|
||
}
|
||
|
||
void GenerateQuadIndexBuffer(unsigned short* pIndices, int nIndexCount, int nFirstVertex)
|
||
{
|
||
if (!pIndices)
|
||
return;
|
||
|
||
// Format the quad buffer
|
||
int i;
|
||
int numQuads = nIndexCount / 6;
|
||
unsigned short baseVertex = (unsigned short)nFirstVertex;
|
||
|
||
if (((size_t)pIndices & 0x3) == 0)
|
||
{
|
||
// Fast version, requires aligned indices
|
||
int* pWrite = (int*)pIndices;
|
||
int nWrite = (baseVertex << 16) | baseVertex;
|
||
for (i = 0; i < numQuads; ++i)
|
||
{
|
||
// Have to deal with endian-ness
|
||
if (IsX360() || IsPS3())
|
||
{
|
||
// this avoids compiler write reodering and prevents the write-combined out-of-order penalty
|
||
// _WriteBarrier won't compile here, and volatile is ignored
|
||
// the compiler otherwise scrambles these writes
|
||
*pWrite++ = nWrite + 1;
|
||
*pWrite++ = nWrite + (2 << 16);
|
||
*pWrite++ = nWrite + (2 << 16) + 3;
|
||
}
|
||
else
|
||
{
|
||
pWrite[0] = nWrite + (1 << 16);
|
||
pWrite[1] = nWrite + 2;
|
||
pWrite[2] = nWrite + (3 << 16) + 2;
|
||
pWrite += 3;
|
||
}
|
||
nWrite += (4 << 16) | 4;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for (i = 0; i < numQuads; ++i)
|
||
{
|
||
pIndices[0] = baseVertex;
|
||
pIndices[1] = baseVertex + 1;
|
||
pIndices[2] = baseVertex + 2;
|
||
|
||
// Triangle 2
|
||
pIndices[3] = baseVertex;
|
||
pIndices[4] = baseVertex + 2;
|
||
pIndices[5] = baseVertex + 3;
|
||
|
||
baseVertex += 4;
|
||
pIndices += 6;
|
||
}
|
||
}
|
||
}
|
||
|
||
void GeneratePolygonIndexBuffer(unsigned short* pIndices, int nIndexCount, int nFirstVertex)
|
||
{
|
||
if (!pIndices)
|
||
return;
|
||
|
||
int i, baseVertex;
|
||
int numPolygons = nIndexCount / 3;
|
||
baseVertex = nFirstVertex;
|
||
for (i = 0; i < numPolygons; ++i)
|
||
{
|
||
// Triangle 1
|
||
pIndices[0] = (unsigned short)(nFirstVertex);
|
||
pIndices[1] = (unsigned short)(nFirstVertex + i + 1);
|
||
pIndices[2] = (unsigned short)(nFirstVertex + i + 2);
|
||
pIndices += 3;
|
||
}
|
||
}
|
||
|
||
|
||
void GenerateLineStripIndexBuffer(unsigned short* pIndices, int nIndexCount, int nFirstVertex)
|
||
{
|
||
if (!pIndices)
|
||
return;
|
||
|
||
int i, baseVertex;
|
||
int numLines = nIndexCount / 2;
|
||
baseVertex = nFirstVertex;
|
||
for (i = 0; i < numLines; ++i)
|
||
{
|
||
pIndices[0] = (unsigned short)(nFirstVertex + i);
|
||
pIndices[1] = (unsigned short)(nFirstVertex + i + 1);
|
||
pIndices += 2;
|
||
}
|
||
}
|
||
|
||
void GenerateLineLoopIndexBuffer(unsigned short* pIndices, int nIndexCount, int nFirstVertex)
|
||
{
|
||
if (!pIndices)
|
||
{
|
||
return;
|
||
}
|
||
|
||
int i, baseVertex;
|
||
int numLines = nIndexCount / 2;
|
||
baseVertex = nFirstVertex;
|
||
|
||
pIndices[0] = (unsigned short)(nFirstVertex + numLines - 1);
|
||
pIndices[1] = (unsigned short)(nFirstVertex);
|
||
pIndices += 2;
|
||
|
||
for (i = 1; i < numLines; ++i)
|
||
{
|
||
pIndices[0] = (unsigned short)(nFirstVertex + i - 1);
|
||
pIndices[1] = (unsigned short)(nFirstVertex + i);
|
||
pIndices += 2;
|
||
}
|
||
} |