Files
FC1/CryAnimation/RenderUtils.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

118 lines
3.3 KiB
C++

#include "stdafx.h"
//#include "CryAnimation.h"
#include "CVars.h"
#include "RenderUtils.h"
// copies the vertex info to the videomemory, given the source (vertices and UVs),
// target format and pointer to the videobuffer
void CopyPosUVsToVideomemory (
const Vec3* pSrcPos, // Source UVs, in its own indexation (needs to unreference with the pVertMap)
const CryUV* pDstUV, // UVs, in the destimation indexation (no need to unreference)
unsigned numVerts, // number of Target vertices
const unsigned *pVertMap, // vertex map from Target to Source vertex indices
Vec3* pDstPos, // destination vertex buffer (always has vertices as the first element)
int nDstVertexFormat // the vertex format of the pDstPos vertex buffer
)
{
DEFINE_PROFILER_FUNCTION();
if (nDstVertexFormat == VERTEX_FORMAT_P3F_TEX2F && pDstUV)
{
// should be the primary vertex format for characters
#if 0//DO_ASM
// OPTIMIZATION NOTE: the assembly version runs ~7-10% faster in release mode
_asm
{
mov ESI, pVertMap
mov EDI, pDstPos
mov ECX, numVerts
mov EDX, pDstUV
// start copying
copy_loop:
// pDst[0..2] = pSrc[pVertMap][0..2]
mov EBX, pSrcPos
mov EAX, [ESI] // EAX = pVertMap[sn]
add EAX, EAX
add EAX, EAX // EAX = pVertMap[sn]*4
add EBX, EAX
add EAX, EAX // EBX = EAX*3
add EBX, EAX // EBX = &pSrcPos[pVertMap[sn]] = pVertMap[sn]*12
// [EDI][0..2] = [EBX][0..2]
mov EAX, [EBX]
mov [EDI], EAX
mov EAX, [EBX+4]
mov [EDI+4], EAX
mov EAX, [EBX+8]
mov [EDI+8], EAX
mov EAX, [EDX]
mov [EDI+12], EAX
mov EAX, [EDX+4]
mov [EDI+16], EAX
// pDst[3..4] = pDstUV[0..2]
add ESI, 4
add EDI, 20
add EDX, 8
loop copy_loop
}
#else
struct_VERTEX_FORMAT_P3F_TEX2F *pDst = (struct_VERTEX_FORMAT_P3F_TEX2F*)pDstPos;
for (unsigned sn = 0; sn < numVerts; ++sn, ++pDst)
{
unsigned i = pVertMap[sn];
pDst->xyz = pSrcPos[i];
*(CryUV*)(&pDst->st[0]) = *(pDstUV++);
}
#endif
}
else
{
unsigned nStride = m_VertexSize[nDstVertexFormat];
for(unsigned sn = 0;sn < numVerts; ++sn, ((byte*&)pDstPos) += nStride)
{
unsigned i = pVertMap[sn];
*pDstPos = pSrcPos[i];
}
}
}
// copies the vertex info to the videomemory, given the source (vertices and UVs),
// target format and pointer to the videobuffer
void CopyPosUVsToVideomemory (
const Vec3* pSrcPos, // Source UVs, in its own indexation (needs to unreference with the pVertMap)
const CryUV* pDstUV, // UVs, in the destimation indexation (no need to unreference)
unsigned numVerts, // number of Target vertices
Vec3* pDstPos, // destination vertex buffer (always has vertices as the first element)
int nDstVertexFormat // the vertex format of the pDstPos vertex buffer
)
{
if (nDstVertexFormat == VERTEX_FORMAT_P3F_TEX2F && pDstUV)
{
// should be the primary vertex format for characters
struct_VERTEX_FORMAT_P3F_TEX2F *pDst = (struct_VERTEX_FORMAT_P3F_TEX2F*)pDstPos;
for (unsigned sn = 0; sn < numVerts; ++sn, ++pDst)
{
pDst->xyz = *(pSrcPos++);
*(CryUV*)(&pDst->st[0]) = *(pDstUV++);
}
}
else
{
unsigned nStride = m_VertexSize[nDstVertexFormat];
for(unsigned sn = 0;sn < numVerts; ++sn, ((byte*&)pDstPos) += nStride)
{
*pDstPos = *(pSrcPos++);
}
}
}
IShader* GetShaderFrontCull()
{
return g_GetIRenderer()->EF_LoadShader("FrontCull", eSH_World, EF_SYSTEM);
}