r5sdk/r5dev/tier2/meshutils.cpp
Kawe Mazidjatari 1d04f837f8 Fix many high level compiler warnings
* Put initializer values inside brackets.
* Put logical AND conditions within parentheses.
* Put assignments within conditional statements within parentheses.
* Mark unused variables as such to suppress compiler warnings.
* Fix vftable shadow warnings caused by ConVar::CreateInternal (does not implement, only interface. Renamed to yield desired behavior).
* Fix 'never' initialized class members for 'CCVarIteratorInternal'.
* Return values in interface vftables that cannot be pure virtual.
2023-04-08 19:00:28 +02:00

141 lines
3.4 KiB
C++
Raw Blame History

//===== 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 V_CONSTEXPR(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)(baseVertex + i);
pIndices[1] = (unsigned short)(baseVertex + 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;
}
}