Skip to content

Commit

Permalink
Add some basic ProcessVertices() support
Browse files Browse the repository at this point in the history
  • Loading branch information
elishacloud committed Aug 16, 2024
1 parent 09e5d70 commit bc565e6
Show file tree
Hide file tree
Showing 6 changed files with 363 additions and 18 deletions.
2 changes: 1 addition & 1 deletion Dllmain/BuildNo.rc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
#define BUILD_NUMBER 7093
#define BUILD_NUMBER 7094
38 changes: 38 additions & 0 deletions Libraries/d3dx9.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,11 @@ typedef HRESULT(WINAPI* PFN_D3DXLoadSurfaceFromMemory)(LPDIRECT3DSURFACE9 pDestS
typedef HRESULT(WINAPI* PFN_D3DXLoadSurfaceFromSurface)(LPDIRECT3DSURFACE9 pDestSurface, const PALETTEENTRY* pDestPalette, const RECT* pDestRect, LPDIRECT3DSURFACE9 pSrcSurface, const PALETTEENTRY* pSrcPalette, const RECT* pSrcRect, DWORD Filter, D3DCOLOR ColorKey);
typedef HRESULT(WINAPI* PFN_D3DXSaveSurfaceToFileInMemory)(LPD3DXBUFFER* ppDestBuf, D3DXIMAGE_FILEFORMAT DestFormat, LPDIRECT3DSURFACE9 pSrcSurface, const PALETTEENTRY* pSrcPalette, const RECT* SrcRect);
typedef HRESULT(WINAPI* PFN_D3DXSaveTextureToFileInMemory)(LPD3DXBUFFER* ppDestBuf, D3DXIMAGE_FILEFORMAT DestFormat, LPDIRECT3DBASETEXTURE9 pSrcTexture, const PALETTEENTRY* pSrcPalette);

typedef HRESULT(WINAPI* PFN_D3DXDeclaratorFromFVF)(DWORD FVF, D3DVERTEXELEMENT9 pDeclarator[MAX_FVF_DECL_SIZE]);
typedef D3DXMATRIX*(WINAPI* PFN_D3DXMatrixMultiply)(_Inout_ D3DXMATRIX* pOut, _In_ const D3DXMATRIX* pM1, _In_ const D3DXMATRIX* pM2);
typedef D3DXVECTOR3*(WINAPI* PFN_D3DXVec3TransformCoord)(_Inout_ D3DXVECTOR3* pOut, _In_ const D3DXVECTOR3* pV, _In_ const D3DXMATRIX* pM);

typedef HRESULT(WINAPI* PFN_D3DXCompileShaderFromFileA)(LPCSTR pSrcFile, const D3DXMACRO* pDefines, LPD3DXINCLUDE pInclude, LPCSTR pFunctionName, LPCSTR pProfile, DWORD Flags, LPD3DXBUFFER* ppShader, LPD3DXBUFFER* ppErrorMsgs, LPD3DXCONSTANTTABLE* ppConstantTable);
typedef HRESULT(WINAPI* PFN_D3DXCompileShaderFromFileW)(LPCWSTR pSrcFile, const D3DXMACRO* pDefines, LPD3DXINCLUDE pInclude, LPCSTR pFunctionName, LPCSTR pProfile, DWORD Flags, LPD3DXBUFFER* ppShader, LPD3DXBUFFER* ppErrorMsgs, LPD3DXCONSTANTTABLE* ppConstantTable);
typedef HRESULT(WINAPI* PFN_D3DXAssembleShader)(LPCSTR pSrcData, UINT SrcDataLen, const D3DXMACRO* pDefines, LPD3DXINCLUDE pInclude, DWORD Flags, LPD3DXBUFFER* ppShader, LPD3DXBUFFER* ppErrorMsgs);
Expand All @@ -50,6 +54,8 @@ PFN_D3DXLoadSurfaceFromSurface p_D3DXLoadSurfaceFromSurface = nullptr;
PFN_D3DXSaveSurfaceToFileInMemory p_D3DXSaveSurfaceToFileInMemory = nullptr;
PFN_D3DXSaveTextureToFileInMemory p_D3DXSaveTextureToFileInMemory = nullptr;
PFN_D3DXDeclaratorFromFVF p_D3DXDeclaratorFromFVF = nullptr;
PFN_D3DXMatrixMultiply p_D3DXMatrixMultiply = nullptr;
PFN_D3DXVec3TransformCoord p_D3DXVec3TransformCoord = nullptr;
PFN_D3DXCompileShaderFromFileA p_D3DXCompileShaderFromFileA = nullptr;
PFN_D3DXCompileShaderFromFileW p_D3DXCompileShaderFromFileW = nullptr;
PFN_D3DXAssembleShader p_D3DXAssembleShader = nullptr;
Expand Down Expand Up @@ -89,6 +95,8 @@ void LoadD3dx9()
p_D3DXSaveSurfaceToFileInMemory = reinterpret_cast<PFN_D3DXSaveSurfaceToFileInMemory>(MemoryGetProcAddress(d3dx9Module, "D3DXSaveSurfaceToFileInMemory"));
p_D3DXSaveTextureToFileInMemory = reinterpret_cast<PFN_D3DXSaveTextureToFileInMemory>(MemoryGetProcAddress(d3dx9Module, "D3DXSaveTextureToFileInMemory"));
p_D3DXDeclaratorFromFVF = reinterpret_cast<PFN_D3DXDeclaratorFromFVF>(MemoryGetProcAddress(d3dx9Module, "D3DXDeclaratorFromFVF"));
p_D3DXMatrixMultiply = reinterpret_cast<PFN_D3DXMatrixMultiply>(MemoryGetProcAddress(d3dx9Module, "D3DXMatrixMultiply"));
p_D3DXVec3TransformCoord = reinterpret_cast<PFN_D3DXVec3TransformCoord>(MemoryGetProcAddress(d3dx9Module, "D3DXVec3TransformCoord"));
p_D3DXCompileShaderFromFileA = reinterpret_cast<PFN_D3DXCompileShaderFromFileA>(MemoryGetProcAddress(d3dx9Module, "D3DXCompileShaderFromFileA"));
p_D3DXCompileShaderFromFileW = reinterpret_cast<PFN_D3DXCompileShaderFromFileW>(MemoryGetProcAddress(d3dx9Module, "D3DXCompileShaderFromFileW"));
p_D3DXAssembleShader = reinterpret_cast<PFN_D3DXAssembleShader>(MemoryGetProcAddress(d3dx9Module, "D3DXAssembleShader"));
Expand Down Expand Up @@ -251,6 +259,36 @@ HRESULT WINAPI D3DXDeclaratorFromFVF(DWORD FVF, D3DVERTEXELEMENT9 pDeclarator[MA
return hr;
}

D3DXMATRIX* WINAPI D3DXMatrixMultiply(_Inout_ D3DXMATRIX* pOut, _In_ const D3DXMATRIX* pM1, _In_ const D3DXMATRIX* pM2)
{
Logging::LogDebug() << __FUNCTION__;

LoadD3dx9();

if (!p_D3DXMatrixMultiply)
{
LOG_ONCE(__FUNCTION__ << " Error: Could not find ProcAddress!");
return nullptr;
}

return p_D3DXMatrixMultiply(pOut, pM1, pM2);
}

D3DXVECTOR3* WINAPI D3DXVec3TransformCoord(_Inout_ D3DXVECTOR3* pOut, _In_ const D3DXVECTOR3* pV, _In_ const D3DXMATRIX* pM)
{
Logging::LogDebug() << __FUNCTION__;

LoadD3dx9();

if (!p_D3DXVec3TransformCoord)
{
LOG_ONCE(__FUNCTION__ << " Error: Could not find ProcAddress!");
return nullptr;
}

return p_D3DXVec3TransformCoord(pOut, pV, pM);
}

HRESULT WINAPI D3DXCompileShaderFromFileA(LPCSTR pSrcFile, const D3DXMACRO* pDefines, LPD3DXINCLUDE pInclude, LPCSTR pFunctionName, LPCSTR pProfile, DWORD Flags, LPD3DXBUFFER* ppShader, LPD3DXBUFFER* ppErrorMsgs, LPD3DXCONSTANTTABLE* ppConstantTable)
{
Logging::LogDebug() << __FUNCTION__;
Expand Down
12 changes: 12 additions & 0 deletions Libraries/d3dx9.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,12 @@ typedef ID3DInclude* LPD3DINCLUDE;
#define D3D_DISASM_ENABLE_INSTRUCTION_CYCLE 0x00000008
#define D3D_DISASM_DISABLE_DEBUG_INFO 0x00000010

typedef struct D3DXVECTOR3 {
FLOAT x;
FLOAT y;
FLOAT z;
} D3DXVECTOR3, * LPD3DXVECTOR3;

typedef enum D3DXIMAGE_FILEFORMAT {
D3DXIFF_BMP = 0,
D3DXIFF_JPG = 1,
Expand Down Expand Up @@ -119,6 +125,8 @@ typedef HRESULT(WINAPI* LPD3DXFILL3D)(D3DXVECTOR4* pOut, const D3DXVECTOR2* pTex

using D3DXMACRO = D3D_SHADER_MACRO;

using D3DXMATRIX = D3DMATRIX;

using ID3DXBuffer = ID3DBlob;
using LPD3DXBUFFER = ID3DXBuffer*;

Expand All @@ -130,7 +138,11 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(LPDIRECT3DSURFACE9 pDestSurface, const
HRESULT WINAPI D3DXLoadSurfaceFromSurface(LPDIRECT3DSURFACE9 pDestSurface, const PALETTEENTRY* pDestPalette, const RECT* pDestRect, LPDIRECT3DSURFACE9 pSrcSurface, const PALETTEENTRY* pSrcPalette, const RECT* pSrcRect, DWORD Filter, D3DCOLOR ColorKey);
HRESULT WINAPI D3DXSaveSurfaceToFileInMemory(LPD3DXBUFFER* ppDestBuf, D3DXIMAGE_FILEFORMAT DestFormat, LPDIRECT3DSURFACE9 pSrcSurface, const PALETTEENTRY* pSrcPalette, const RECT* SrcRect);
HRESULT WINAPI D3DXSaveTextureToFileInMemory(LPD3DXBUFFER* ppDestBuf, D3DXIMAGE_FILEFORMAT DestFormat, LPDIRECT3DBASETEXTURE9 pSrcTexture, const PALETTEENTRY* pSrcPalette);

HRESULT WINAPI D3DXDeclaratorFromFVF(DWORD FVF, D3DVERTEXELEMENT9 pDeclarator[MAX_FVF_DECL_SIZE]);
D3DXMATRIX* WINAPI D3DXMatrixMultiply(_Inout_ D3DXMATRIX* pOut, _In_ const D3DXMATRIX* pM1, _In_ const D3DXMATRIX* pM2);
D3DXVECTOR3* WINAPI D3DXVec3TransformCoord(_Inout_ D3DXVECTOR3* pOut, _In_ const D3DXVECTOR3* pV, _In_ const D3DXMATRIX* pM);

HRESULT WINAPI D3DXCompileShaderFromFileA(LPCSTR pSrcFile, const D3DXMACRO* pDefines, LPD3DXINCLUDE pInclude, LPCSTR pFunctionName, LPCSTR pProfile, DWORD Flags, LPD3DXBUFFER* ppShader, LPD3DXBUFFER* ppErrorMsgs, LPD3DXCONSTANTTABLE* ppConstantTable);
HRESULT WINAPI D3DXCompileShaderFromFileW(LPCWSTR pSrcFile, const D3DXMACRO* pDefines, LPD3DXINCLUDE pInclude, LPCSTR pFunctionName, LPCSTR pProfile, DWORD Flags, LPD3DXBUFFER* ppShader, LPD3DXBUFFER* ppErrorMsgs, LPD3DXCONSTANTTABLE* ppConstantTable);
HRESULT WINAPI D3DXAssembleShader(LPCSTR pSrcData, UINT SrcDataLen, const D3DXMACRO* pDefines, LPD3DXINCLUDE pInclude, DWORD Flags, LPD3DXBUFFER* ppShader, LPD3DXBUFFER* ppErrorMsgs);
Expand Down
175 changes: 175 additions & 0 deletions ddraw/IDirect3DTypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,181 @@ bool CheckRenderStateType(D3DRENDERSTATETYPE dwRenderStateType)
}
}

void ConvertVertex(BYTE* pDestVertex, DWORD DestFVF, const BYTE* pSrcVertex, DWORD SrcFVF)
{
DWORD SrcOffset = 0;
DWORD DestOffset = 0;

// Copy Position XYZ
*(D3DXVECTOR3*)pDestVertex = *(D3DXVECTOR3*)pSrcVertex;
DestOffset += 3 * sizeof(float);

// Update source offset for Position
SrcOffset += 3 * sizeof(float);

// Copy Position data (XYZW, XYZRHW, etc.)
switch (DestFVF & D3DFVF_POSITION_MASK_9)
{
case D3DFVF_XYZW:
case D3DFVF_XYZRHW:
if ((DestFVF & D3DFVF_POSITION_MASK_9) == (SrcFVF & D3DFVF_POSITION_MASK_9))
{
*(float*)(pDestVertex + DestOffset) = *(float*)(pSrcVertex + SrcOffset);
}
DestOffset += sizeof(float);
break;
case D3DFVF_XYZB1:
case D3DFVF_XYZB2:
case D3DFVF_XYZB3:
case D3DFVF_XYZB4:
case D3DFVF_XYZB5:
{
// Get number of blending weights
DWORD SrcNumBlending =
(SrcFVF & D3DFVF_POSITION_MASK_9) == D3DFVF_XYZB1 ? 1 :
(SrcFVF & D3DFVF_POSITION_MASK_9) == D3DFVF_XYZB2 ? 2 :
(SrcFVF & D3DFVF_POSITION_MASK_9) == D3DFVF_XYZB3 ? 3 :
(SrcFVF & D3DFVF_POSITION_MASK_9) == D3DFVF_XYZB4 ? 4 :
(SrcFVF & D3DFVF_POSITION_MASK_9) == D3DFVF_XYZB5 ? 5 : 0;
DWORD DestNumBlending =
(DestFVF & D3DFVF_POSITION_MASK_9) == D3DFVF_XYZB1 ? 1 :
(DestFVF & D3DFVF_POSITION_MASK_9) == D3DFVF_XYZB2 ? 2 :
(DestFVF & D3DFVF_POSITION_MASK_9) == D3DFVF_XYZB3 ? 3 :
(DestFVF & D3DFVF_POSITION_MASK_9) == D3DFVF_XYZB4 ? 4 :
(DestFVF & D3DFVF_POSITION_MASK_9) == D3DFVF_XYZB5 ? 5 : 0;
// Copy matching blending weights
for (UINT x = 0; x < min(SrcNumBlending, DestNumBlending); x++)
{
*(float*)(pDestVertex + DestOffset + x * sizeof(float)) = *(float*)(pSrcVertex + SrcOffset + x * sizeof(float));
}
DestOffset += DestNumBlending * sizeof(float);
break;
}
}

// Update source offset for Position data
switch (SrcFVF & D3DFVF_POSITION_MASK_9)
{
case D3DFVF_XYZW:
case D3DFVF_XYZRHW:
case D3DFVF_XYZB1:
SrcOffset += sizeof(float);
break;
case D3DFVF_XYZB2:
SrcOffset += 2 * sizeof(float);
break;
case D3DFVF_XYZB3:
SrcOffset += 3 * sizeof(float);
break;
case D3DFVF_XYZB4:
SrcOffset += 4 * sizeof(float);
break;
case D3DFVF_XYZB5:
SrcOffset += 5 * sizeof(float);
break;
}

// Normal
if (DestFVF & D3DFVF_NORMAL)
{
if (SrcFVF & D3DFVF_NORMAL)
{
*(D3DXVECTOR3*)(pDestVertex + DestOffset) = *(D3DXVECTOR3*)(pSrcVertex + SrcOffset);
SrcOffset += 3 * sizeof(float);
}
DestOffset += 3 * sizeof(float);
}
else if (SrcFVF & D3DFVF_NORMAL)
{
SrcOffset += 3 * sizeof(float);
}

// Point Size
if (DestFVF & D3DFVF_PSIZE)
{
if (SrcFVF & D3DFVF_PSIZE)
{
*(float*)(pDestVertex + DestOffset) = *(float*)(pSrcVertex + SrcOffset);
SrcOffset += sizeof(float);
}
DestOffset += sizeof(float);
}
else if (SrcFVF & D3DFVF_PSIZE)
{
SrcOffset += sizeof(float);
}

// Diffuse color
if (DestFVF & D3DFVF_DIFFUSE)
{
if (SrcFVF & D3DFVF_DIFFUSE)
{
*(DWORD*)(pDestVertex + DestOffset) = *(DWORD*)(pSrcVertex + SrcOffset);
SrcOffset += sizeof(DWORD);
}
DestOffset += sizeof(DWORD);
}
else if (SrcFVF & D3DFVF_DIFFUSE)
{
SrcOffset += sizeof(DWORD);
}

// Specular color
if (DestFVF & D3DFVF_SPECULAR)
{
if (SrcFVF & D3DFVF_SPECULAR)
{
*(DWORD*)(pDestVertex + DestOffset) = *(DWORD*)(pSrcVertex + SrcOffset);
SrcOffset += sizeof(DWORD);
}
DestOffset += sizeof(DWORD);
}
else if (SrcFVF & D3DFVF_SPECULAR)
{
SrcOffset += sizeof(DWORD);
}

// Texture coordinates
int SrcNumTexCoords = (SrcFVF & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT;
int DestNumTexCoords = (DestFVF & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT;
int y = 0;
for (int x = 0; x < DestNumTexCoords; x++)
{
// Get number of destination texture coordinates
int DestCord = (DestFVF & (D3DFVF_TEXCOORDSIZE1(x) | D3DFVF_TEXCOORDSIZE2(x) | D3DFVF_TEXCOORDSIZE3(x) | D3DFVF_TEXCOORDSIZE4(x)));
int DestSize =
DestCord == D3DFVF_TEXCOORDSIZE1(x) ? 1 :
DestCord == D3DFVF_TEXCOORDSIZE2(x) ? 2 :
DestCord == D3DFVF_TEXCOORDSIZE3(x) ? 3 :
DestCord == D3DFVF_TEXCOORDSIZE4(x) ? 4 : 0;
// Find matching source texture coordinates
while (y < SrcNumTexCoords)
{
int SrcCord = (SrcFVF & (D3DFVF_TEXCOORDSIZE1(y) | D3DFVF_TEXCOORDSIZE2(y) | D3DFVF_TEXCOORDSIZE3(y) | D3DFVF_TEXCOORDSIZE4(y)));
int SrcSize =
SrcCord == D3DFVF_TEXCOORDSIZE1(y) ? 1 :
SrcCord == D3DFVF_TEXCOORDSIZE2(y) ? 2 :
SrcCord == D3DFVF_TEXCOORDSIZE3(y) ? 3 :
SrcCord == D3DFVF_TEXCOORDSIZE4(y) ? 4 : 0;
// Copy matching texture coordinates
if (SrcSize && DestSize == SrcSize)
{
for (int i = 0; i < SrcSize; i++)
{
*(float*)(pDestVertex + DestOffset + i * sizeof(float)) = *(float*)(pSrcVertex + SrcOffset + i * sizeof(float));
}
SrcOffset += SrcSize * sizeof(float);
y++;
break;
}
SrcOffset += SrcSize * sizeof(float);
y++;
}
// Increase destination offset
DestOffset += DestSize * sizeof(float);
}
}

DWORD ConvertVertexTypeToFVF(D3DVERTEXTYPE d3dVertexType)
{
switch (d3dVertexType)
Expand Down
1 change: 1 addition & 0 deletions ddraw/IDirect3DTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ void ConvertVertices(D3DLVERTEX* lFVF, D3DLVERTEX9* lFVF9, DWORD NumVertices);
void ConvertVertices(D3DLVERTEX9* lFVF9, D3DLVERTEX* lFVF, DWORD NumVertices);
bool CheckTextureStageStateType(D3DTEXTURESTAGESTATETYPE dwState);
bool CheckRenderStateType(D3DRENDERSTATETYPE dwRenderStateType);
void ConvertVertex(BYTE* pDestVertex, DWORD DestFVF, const BYTE* pSrcVertex, DWORD SrcFVF);
DWORD ConvertVertexTypeToFVF(D3DVERTEXTYPE d3dVertexType);
UINT GetVertexStride(DWORD dwVertexTypeDesc);
UINT GetNumberOfPrimitives(D3DPRIMITIVETYPE dptPrimitiveType, DWORD dwVertexCount);
Loading

0 comments on commit bc565e6

Please sign in to comment.