77 lines
3 KiB
C++
77 lines
3 KiB
C++
/*
|
|
** Command & Conquer Renegade(tm)
|
|
** Copyright 2025 Electronic Arts Inc.
|
|
**
|
|
** This program is free software: you can redistribute it and/or modify
|
|
** it under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation, either version 3 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** This program is distributed in the hope that it will be useful,
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
** GNU General Public License for more details.
|
|
**
|
|
** You should have received a copy of the GNU General Public License
|
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "dx8fvf.h"
|
|
#include "wwstring.h"
|
|
#include <D3dx8core.h>
|
|
|
|
static unsigned Get_FVF_Vertex_Size(unsigned FVF)
|
|
{
|
|
return D3DXGetFVFVertexSize(FVF);
|
|
}
|
|
|
|
FVFInfoClass::FVFInfoClass(unsigned FVF_)
|
|
:
|
|
FVF(FVF_),
|
|
fvf_size(Get_FVF_Vertex_Size(FVF))
|
|
{
|
|
location_offset=0;
|
|
blend_offset=location_offset;
|
|
|
|
if ((FVF&D3DFVF_XYZ)==D3DFVF_XYZ) blend_offset+=3*sizeof(float);
|
|
normal_offset=blend_offset;
|
|
|
|
if ( ((FVF&D3DFVF_XYZB4)==D3DFVF_XYZB4) &&
|
|
((FVF&D3DFVF_LASTBETA_UBYTE4)==D3DFVF_LASTBETA_UBYTE4) ) normal_offset+=3*sizeof(float)+sizeof(DWORD);
|
|
diffuse_offset=normal_offset;
|
|
|
|
if ((FVF&D3DFVF_NORMAL)==D3DFVF_NORMAL) diffuse_offset+=3*sizeof(float);
|
|
specular_offset=diffuse_offset;
|
|
|
|
if ((FVF&D3DFVF_DIFFUSE)==D3DFVF_DIFFUSE) specular_offset+=sizeof(DWORD);
|
|
texcoord_offset[0]=specular_offset;
|
|
|
|
if ((FVF&D3DFVF_SPECULAR)==D3DFVF_SPECULAR) texcoord_offset[0]+=sizeof(DWORD);
|
|
|
|
for (unsigned int i=1; i<D3DDP_MAXTEXCOORD; i++)
|
|
{
|
|
texcoord_offset[i]=texcoord_offset[i-1];
|
|
|
|
if ((int(FVF)&D3DFVF_TEXCOORDSIZE1(i-1))==D3DFVF_TEXCOORDSIZE1(i-1)) texcoord_offset[i]+=sizeof(float);
|
|
else if ((int(FVF)&D3DFVF_TEXCOORDSIZE2(i-1))==D3DFVF_TEXCOORDSIZE2(i-1)) texcoord_offset[i]+=2*sizeof(float);
|
|
else if ((int(FVF)&D3DFVF_TEXCOORDSIZE3(i-1))==D3DFVF_TEXCOORDSIZE3(i-1)) texcoord_offset[i]+=3*sizeof(float);
|
|
else if ((int(FVF)&D3DFVF_TEXCOORDSIZE4(i-1))==D3DFVF_TEXCOORDSIZE4(i-1)) texcoord_offset[i]+=4*sizeof(float);
|
|
}
|
|
}
|
|
|
|
void FVFInfoClass::Get_FVF_Name(StringClass& fvfname) const
|
|
{
|
|
switch (Get_FVF()) {
|
|
case DX8_FVF_XYZ: fvfname="D3DFVF_XYZ"; break;
|
|
case DX8_FVF_XYZN: fvfname="D3DFVF_XYZ|D3DFVF_NORMAL"; break;
|
|
case DX8_FVF_XYZNUV1: fvfname="D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1"; break;
|
|
case DX8_FVF_XYZNUV2: fvfname="D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX2"; break;
|
|
case DX8_FVF_XYZNDUV1: fvfname="D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1|D3DFVF_DIFFUSE"; break;
|
|
case DX8_FVF_XYZNDUV2: fvfname="D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX2|D3DFVF_DIFFUSE"; break;
|
|
case DX8_FVF_XYZDUV1: fvfname="D3DFVF_XYZ|D3DFVF_TEX1|D3DFVF_DIFFUSE"; break;
|
|
case DX8_FVF_XYZDUV2: fvfname="D3DFVF_XYZ|D3DFVF_TEX2|D3DFVF_DIFFUSE"; break;
|
|
case DX8_FVF_XYZUV1: fvfname="D3DFVF_XYZ|D3DFVF_TEX1"; break;
|
|
case DX8_FVF_XYZUV2: fvfname="D3DFVF_XYZ|D3DFVF_TEX2"; break;
|
|
default: fvfname="Unknown!";
|
|
}
|
|
}
|