Files
FC1/CryCommon/VertexFormats.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

467 lines
14 KiB
C

//////////////////////////////////////////////////////////////////////
//
// Crytek CryENGINE Source code
//
// File:VertexFormats.h -
//
// History:
// -Feb 23,2001:Created by Marco Corbetta
//
//////////////////////////////////////////////////////////////////////
#ifndef VERTEXFORMATS_H
#define VERTEXFORMATS_H
#if _MSC_VER > 1000
# pragma once
#endif
// If you change this you also have to change gBufOffsTable in CRendElement.cpp
enum eVertexFormat
{
VERTEX_FORMAT_P3F=1, // shadow volumes (12 bytes)
VERTEX_FORMAT_P3F_COL4UB=2, // usually terrain (16 bytes)
VERTEX_FORMAT_P3F_TEX2F=3, // everything else (20 bytes)
VERTEX_FORMAT_P3F_COL4UB_TEX2F=4, // usually plants (24 bytes)
VERTEX_FORMAT_TRP3F_COL4UB_TEX2F=5, // fonts (28 bytes)
VERTEX_FORMAT_P3F_COL4UB_COL4UB=6, // terrain with detail layers (20 bytes)
VERTEX_FORMAT_P3F_N=7, // (24 bytes)
VERTEX_FORMAT_P3F_N_COL4UB=8, // (28 bytes)
VERTEX_FORMAT_P3F_N_TEX2F=9, // (32 bytes)
VERTEX_FORMAT_P3F_N_COL4UB_TEX2F=10, // (36 bytes)
VERTEX_FORMAT_P3F_N_COL4UB_COL4UB=11, // terrain with detail layers (32 bytes)
VERTEX_FORMAT_P3F_COL4UB_COL4UB_TEX2F=12, // usually plants (28 bytes)
VERTEX_FORMAT_P3F_N_COL4UB_COL4UB_TEX2F=13, // usually plants (40 bytes)
VERTEX_FORMAT_T3F_B3F_N3F=14, // tangent space (36 bytes)
VERTEX_FORMAT_TEX2F=15, // light maps TC (8 bytes)
VERTEX_FORMAT_P3F_COL4UB_TEX2F_TEX2F=16, // used for multitextured drawing
VERTEX_FORMAT_NUMS=17, // number of vertex formats
};
_inline int VertFormatForComponents(bool bNeedCol, bool bNeedSecCol, bool bNeedNormals, bool bHasTC)
{
int RequestedVertFormat;
if (!bNeedCol && !bHasTC && !bNeedNormals)
RequestedVertFormat = VERTEX_FORMAT_P3F;
else
if (!bNeedCol && !bHasTC && bNeedNormals)
RequestedVertFormat = VERTEX_FORMAT_P3F_N;
else
if (bNeedCol && bNeedSecCol && bNeedNormals && !bHasTC)
RequestedVertFormat = VERTEX_FORMAT_P3F_N_COL4UB_COL4UB;
else
if (bNeedCol && bNeedSecCol && bNeedNormals && bHasTC)
RequestedVertFormat = VERTEX_FORMAT_P3F_N_COL4UB_COL4UB_TEX2F;
else
if (bNeedCol && bNeedSecCol && !bNeedNormals && bHasTC)
RequestedVertFormat = VERTEX_FORMAT_P3F_COL4UB_COL4UB_TEX2F;
else
if (bNeedCol && bNeedSecCol && !bHasTC)
RequestedVertFormat = VERTEX_FORMAT_P3F_COL4UB_COL4UB;
else
if (bNeedCol && !bHasTC && !bNeedNormals)
RequestedVertFormat = VERTEX_FORMAT_P3F_COL4UB;
else
if (bNeedCol && !bHasTC && bNeedNormals)
RequestedVertFormat = VERTEX_FORMAT_P3F_N_COL4UB;
else
if (!bNeedCol && bHasTC && !bNeedNormals)
RequestedVertFormat = VERTEX_FORMAT_P3F_TEX2F;
else
if (bNeedCol && bHasTC && !bNeedNormals)
RequestedVertFormat = VERTEX_FORMAT_P3F_COL4UB_TEX2F;
else
if (!bNeedCol && bHasTC && bNeedNormals)
RequestedVertFormat = VERTEX_FORMAT_P3F_N_TEX2F;
else
RequestedVertFormat = VERTEX_FORMAT_P3F_N_COL4UB_TEX2F;
return RequestedVertFormat;
}
struct SBufInfoTable
{
int OffsTC;
int OffsColor;
int OffsSecColor;
int OffsNormal;
};
struct struct_VERTEX_FORMAT_P3F // 12 bytes
{
Vec3 xyz;
};
struct struct_VERTEX_FORMAT_P3F_COL4UB
{
Vec3 xyz;
UCol color;
};
struct struct_VERTEX_FORMAT_P3F_N // 24 bytes
{
Vec3 xyz;
Vec3 normal;
};
struct struct_VERTEX_FORMAT_TEX2F // 8 bytes
{
float st[2];
};
struct struct_VERTEX_FORMAT_P3F_N_COL4UB
{
Vec3 xyz;
Vec3 normal;
UCol color;
};
struct struct_VERTEX_FORMAT_P3F_TEX2F
{
Vec3 xyz;
float st[2];
};
struct struct_VERTEX_FORMAT_P3F_N_TEX2F
{
Vec3 xyz;
Vec3 normal;
float st[2];
};
struct struct_VERTEX_FORMAT_P3F_COL4UB_TEX2F
{
Vec3 xyz;
UCol color;
float st[2];
};
struct struct_VERTEX_FORMAT_P3F_COL4UB_COL4UB_TEX2F
{
Vec3 xyz;
UCol color;
UCol seccolor;
float st[2];
};
struct struct_VERTEX_FORMAT_P3F_N_COL4UB_COL4UB_TEX2F
{
Vec3 xyz;
Vec3 normal;
UCol color;
UCol seccolor;
float st[2];
};
struct struct_VERTEX_FORMAT_P3F_COL4UB_TEX2F_TEX2F
{
Vec3 xyz;
UCol color;
float st0[2];
float st1[2];
};
struct struct_VERTEX_FORMAT_P3F_N_COL4UB_TEX2F
{
Vec3 xyz;
Vec3 normal;
UCol color;
float st[2];
bool operator == (struct_VERTEX_FORMAT_P3F_N_COL4UB_TEX2F & other);
};
struct struct_VERTEX_FORMAT_TRP3F_COL4UB_TEX2F
{
float x,y,z,rhw;
UCol color;
float st[2];
};
struct struct_VERTEX_FORMAT_P3F_COL4UB_COL4UB
{
Vec3 xyz;
UCol color;
UCol seccolor;
};
struct struct_VERTEX_FORMAT_P3F_N_COL4UB_COL4UB
{
Vec3 xyz;
Vec3 normal;
UCol color;
UCol seccolor;
};
struct SPipTangents
{
Vec3 m_Tangent;
Vec3 m_Binormal;
Vec3 m_TNormal;
};
_inline void *CreateVertexBuffer(int nFormat, int nVerts)
{
switch(nFormat)
{
case VERTEX_FORMAT_P3F:
return new struct_VERTEX_FORMAT_P3F[nVerts];
case VERTEX_FORMAT_P3F_N:
return new struct_VERTEX_FORMAT_P3F_N[nVerts];
case VERTEX_FORMAT_P3F_COL4UB_TEX2F:
return new struct_VERTEX_FORMAT_P3F_COL4UB_TEX2F[nVerts];
case VERTEX_FORMAT_P3F_COL4UB_COL4UB_TEX2F:
return new struct_VERTEX_FORMAT_P3F_COL4UB_COL4UB_TEX2F[nVerts];
case VERTEX_FORMAT_P3F_N_COL4UB_COL4UB_TEX2F:
return new struct_VERTEX_FORMAT_P3F_N_COL4UB_COL4UB_TEX2F[nVerts];
case VERTEX_FORMAT_P3F_COL4UB_TEX2F_TEX2F:
return new struct_VERTEX_FORMAT_P3F_COL4UB_TEX2F_TEX2F[nVerts];
case VERTEX_FORMAT_P3F_N_COL4UB_TEX2F:
return new struct_VERTEX_FORMAT_P3F_N_COL4UB_TEX2F[nVerts];
case VERTEX_FORMAT_P3F_TEX2F:
return new struct_VERTEX_FORMAT_P3F_TEX2F[nVerts];
case VERTEX_FORMAT_P3F_N_TEX2F:
return new struct_VERTEX_FORMAT_P3F_N_TEX2F[nVerts];
case VERTEX_FORMAT_P3F_COL4UB:
return new struct_VERTEX_FORMAT_P3F_COL4UB[nVerts];
case VERTEX_FORMAT_P3F_COL4UB_COL4UB:
return new struct_VERTEX_FORMAT_P3F_COL4UB_COL4UB[nVerts];
case VERTEX_FORMAT_P3F_N_COL4UB_COL4UB:
return new struct_VERTEX_FORMAT_P3F_N_COL4UB_COL4UB[nVerts];
case VERTEX_FORMAT_P3F_N_COL4UB:
return new struct_VERTEX_FORMAT_P3F_N_COL4UB[nVerts];
case VERTEX_FORMAT_TRP3F_COL4UB_TEX2F:
return new struct_VERTEX_FORMAT_TRP3F_COL4UB_TEX2F[nVerts];
case VERTEX_FORMAT_TEX2F:
return new struct_VERTEX_FORMAT_TEX2F[nVerts];
default:
assert(0);
}
return NULL;
}
#ifdef WIN64
// we don't care about truncation of the struct member offset, because
// it's a very small integer (even fits into a signed byte)
#pragma warning(push)
#pragma warning(disable:4311)
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////
// Vertex Sizes
const int m_VertexSize[]=
{
0,
sizeof(struct_VERTEX_FORMAT_P3F),
sizeof(struct_VERTEX_FORMAT_P3F_COL4UB),
sizeof(struct_VERTEX_FORMAT_P3F_TEX2F),
sizeof(struct_VERTEX_FORMAT_P3F_COL4UB_TEX2F),
sizeof(struct_VERTEX_FORMAT_TRP3F_COL4UB_TEX2F),
sizeof(struct_VERTEX_FORMAT_P3F_COL4UB_COL4UB),
sizeof(struct_VERTEX_FORMAT_P3F_N),
sizeof(struct_VERTEX_FORMAT_P3F_N_COL4UB),
sizeof(struct_VERTEX_FORMAT_P3F_N_TEX2F),
sizeof(struct_VERTEX_FORMAT_P3F_N_COL4UB_TEX2F),
sizeof(struct_VERTEX_FORMAT_P3F_N_COL4UB_COL4UB),
sizeof(struct_VERTEX_FORMAT_P3F_COL4UB_COL4UB_TEX2F),
sizeof(struct_VERTEX_FORMAT_P3F_N_COL4UB_COL4UB_TEX2F),
sizeof(SPipTangents),
sizeof(struct_VERTEX_FORMAT_TEX2F),
sizeof(struct_VERTEX_FORMAT_P3F_COL4UB_TEX2F_TEX2F),
};
// this is the table of offsets of UVs relative to the start of the structure
// -1 means there's no UVs in this format
// This is required by Animation and must be kept in tact with the vertex format enumeration
const int g_VertFormatUVOffsets[] =
{
-1, // no UVs in this format - invalid format
-1, // VERTEX_FORMAT_P3F=1, // shadow volumes (12 bytes)
-1, // VERTEX_FORMAT_P3F_COL4UB=2, // usually terrain (16 bytes)
(int)&(((struct_VERTEX_FORMAT_P3F_TEX2F*)0)->st[0]), // VERTEX_FORMAT_P3F_TEX2F=3, // everything else (20 bytes)
(int)&(((struct_VERTEX_FORMAT_P3F_COL4UB_TEX2F*)0)->st[0]), // VERTEX_FORMAT_P3F_COL4UB_TEX2F=4, // usually plants (24 bytes)
(int)&(((struct_VERTEX_FORMAT_TRP3F_COL4UB_TEX2F*)0)->st[0]),// VERTEX_FORMAT_TRP3F_COL4UB_TEX2F=5, // fonts (28 bytes)
-1, // VERTEX_FORMAT_P3F_COL4UB_COL4UB=1,
-1, // VERTEX_FORMAT_P3F_N=1,
-1, // VERTEX_FORMAT_P3F_N_COL4UB=1,
(int)&(((struct_VERTEX_FORMAT_P3F_N_TEX2F*)0)->st[0]), // VERTEX_FORMAT_P3F_N_TEX2F=3, // everything else (20 bytes)
(int)&(((struct_VERTEX_FORMAT_P3F_N_COL4UB_TEX2F*)0)->st[0]) // VERTEX_FORMAT_P3F_N_COL4UB_TEX2F=4, // usually plants (24 bytes)
-1, // VERTEX_FORMAT_P3F_N_COL4UB_COL4UB=1,
(int)&(((struct_VERTEX_FORMAT_P3F_COL4UB_COL4UB_TEX2F*)0)->st[0]), // VERTEX_FORMAT_P3F_COL4UB_COL4UB_TEX2F=4, // usually plants (24 bytes)
(int)&(((struct_VERTEX_FORMAT_P3F_N_COL4UB_COL4UB_TEX2F*)0)->st[0]), // VERTEX_FORMAT_P3F_N_COL4UB_COL4UB_TEX2F=4, // usually plants (24 bytes)
};
// this is the table of offsets of colors relative to the start of the structure
// -1 means there's no colors in this format
// This is required by Animation and must be kept in tact with the vertex format enumeration
const int g_VertFormatRGBAOffsets[] =
{
-1, // invalid format
-1,
(int)&(((struct_VERTEX_FORMAT_P3F_COL4UB*)0)->color.dcolor),
-1,
(int)&(((struct_VERTEX_FORMAT_P3F_COL4UB_TEX2F*)0)->color.dcolor),
(int)&(((struct_VERTEX_FORMAT_TRP3F_COL4UB_TEX2F*)0)->color.dcolor),
(int)&(((struct_VERTEX_FORMAT_P3F_COL4UB_COL4UB*)0)->color.dcolor),
-1,
(int)&(((struct_VERTEX_FORMAT_P3F_N_COL4UB*)0)->color.dcolor),
-1,
(int)&(((struct_VERTEX_FORMAT_P3F_N_COL4UB_TEX2F*)0)->color.dcolor),
(int)&(((struct_VERTEX_FORMAT_P3F_N_COL4UB_COL4UB*)0)->color.dcolor),
(int)&(((struct_VERTEX_FORMAT_P3F_COL4UB_COL4UB_TEX2F*)0)->color.dcolor),
(int)&(((struct_VERTEX_FORMAT_P3F_N_COL4UB_COL4UB_TEX2F*)0)->color.dcolor),
};
// this is the table of offsets of normals relative to the start of the structure
// -1 means there's no colors in this format
// This is required by Animation and must be kept in tact with the vertex format enumeration
const int g_VertFormatNormalOffsets[] =
{
-1, // invalid format
-1, // VERTEX_FORMAT_P3F=1
-1, // VERTEX_FORMAT_P3F_COL4UB=2,
-1, // VERTEX_FORMAT_P3F_TEX2F=3,
-1, // VERTEX_FORMAT_P3F_COL4UB_TEX2F=4,
-1, // VERTEX_FORMAT_TRP3F_COL4UB_TEX2F=5,
-1, // VERTEX_FORMAT_P3F_COL4UB_COL4UB,
(int)&(((struct_VERTEX_FORMAT_P3F_N*)0)->normal), // VERTEX_FORMAT_P3F_N=1,
(int)&(((struct_VERTEX_FORMAT_P3F_N_COL4UB*)0)->normal), // VERTEX_FORMAT_P3F_N_COL4UB=1,
(int)&(((struct_VERTEX_FORMAT_P3F_N_TEX2F*)0)->normal), // VERTEX_FORMAT_P3F_N_TEX2F=3, // everything else (20 bytes)
(int)&(((struct_VERTEX_FORMAT_P3F_N_COL4UB_TEX2F*)0)->normal), // VERTEX_FORMAT_P3F_N_COL4UB_TEX2F=4, // usually plants (24 bytes)
(int)&(((struct_VERTEX_FORMAT_P3F_N_COL4UB_COL4UB*)0)->normal),
-1,
(int)&(((struct_VERTEX_FORMAT_P3F_N_COL4UB_COL4UB_TEX2F*)0)->normal),
};
static struct SBufInfoTable gBufInfoTable[] =
{
{
0
},
{ //VERTEX_FORMAT_P3F
#define OOFS(x) (int)&(((struct_VERTEX_FORMAT_P3F *)0)->x)
0
#undef OOFS
},
{ //VERTEX_FORMAT_P3F_COL4UB
#define OOFS(x) (int)&(((struct_VERTEX_FORMAT_P3F_COL4UB *)0)->x)
0,
OOFS(color.dcolor),
#undef OOFS
},
{ //VERTEX_FORMAT_P3F_TEX2F
#define OOFS(x) (int)&(((struct_VERTEX_FORMAT_P3F_TEX2F *)0)->x)
OOFS(st[0])
#undef OOFS
},
{ //VERTEX_FORMAT_P3F_COL4UB_TEX2F
#define OOFS(x) (int)&(((struct_VERTEX_FORMAT_P3F_COL4UB_TEX2F *)0)->x)
OOFS(st[0]),
OOFS(color.dcolor)
#undef OOFS
},
{ //VERTEX_FORMAT_TRP3F_COL4UB_TEX2F
#define OOFS(x) (int)&(((struct_VERTEX_FORMAT_TRP3F_COL4UB_TEX2F *)0)->x)
OOFS(st[0]),
OOFS(color.dcolor),
#undef OOFS
},
{ //VERTEX_FORMAT_P3F_COL4UB_COL4UB
#define OOFS(x) (int)&(((struct_VERTEX_FORMAT_P3F_COL4UB_COL4UB *)0)->x)
0,
OOFS(color.dcolor),
OOFS(seccolor.dcolor),
#undef OOFS
},
{ //VERTEX_FORMAT_P3F_N
#define OOFS(x) (int)&(((struct_VERTEX_FORMAT_P3F_N *)0)->x)
0,
0,
0,
OOFS(normal.x),
#undef OOFS
},
{ //VERTEX_FORMAT_P3F_N_COL4UB
#define OOFS(x) (int)&(((struct_VERTEX_FORMAT_P3F_N_COL4UB *)0)->x)
0,
OOFS(color.dcolor),
0,
OOFS(normal.x),
#undef OOFS
},
{ //VERTEX_FORMAT_P3F_N_TEX2F
#define OOFS(x) (int)&(((struct_VERTEX_FORMAT_P3F_N_TEX2F *)0)->x)
OOFS(st[0]),
0,
0,
OOFS(normal.x),
#undef OOFS
},
{ //VERTEX_FORMAT_P3F_N_COL4UB_TEX2F
#define OOFS(x) (int)&(((struct_VERTEX_FORMAT_P3F_N_COL4UB_TEX2F *)0)->x)
OOFS(st[0]),
OOFS(color.dcolor),
0,
OOFS(normal.x),
#undef OOFS
},
{ //VERTEX_FORMAT_P3F_N_COL4UB_COL4UB
#define OOFS(x) (int)&(((struct_VERTEX_FORMAT_P3F_N_COL4UB_COL4UB *)0)->x)
0,
OOFS(color.dcolor),
OOFS(seccolor.dcolor),
OOFS(normal.x),
#undef OOFS
},
{ //VERTEX_FORMAT_P3F_COL4UB_COL4UB_TEX2F
#define OOFS(x) (int)&(((struct_VERTEX_FORMAT_P3F_COL4UB_COL4UB_TEX2F *)0)->x)
OOFS(st[0]),
OOFS(color.dcolor),
OOFS(seccolor.dcolor),
0,
#undef OOFS
},
{ //VERTEX_FORMAT_P3F_N_COL4UB_COL4UB_TEX2F
#define OOFS(x) (int)&(((struct_VERTEX_FORMAT_P3F_N_COL4UB_COL4UB_TEX2F *)0)->x)
OOFS(st[0]),
OOFS(color.dcolor),
OOFS(seccolor.dcolor),
OOFS(normal.x),
#undef OOFS
},
};
#ifdef WIN64
#pragma warning(pop)
#endif
_inline void GetVertBufComps(SVertBufComps *Comps, int Format)
{
memset(Comps, 0, sizeof(SVertBufComps));
if (gBufInfoTable[Format].OffsTC)
Comps->m_bHasTC = true;
if (gBufInfoTable[Format].OffsColor)
Comps->m_bHasColors = true;
if (gBufInfoTable[Format].OffsSecColor)
Comps->m_bHasSecColors = true;
if (gBufInfoTable[Format].OffsNormal)
Comps->m_bHasNormals = true;
}
#endif