Skip to content

Commit

Permalink
Fix ProcessVertices()
Browse files Browse the repository at this point in the history
  • Loading branch information
elishacloud committed Aug 8, 2024
1 parent 244e065 commit 5689674
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 16 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 7084
#define BUILD_NUMBER 7085
25 changes: 25 additions & 0 deletions Libraries/d3dx9.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ 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 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 @@ -48,6 +49,7 @@ PFN_D3DXLoadSurfaceFromMemory p_D3DXLoadSurfaceFromMemory = nullptr;
PFN_D3DXLoadSurfaceFromSurface p_D3DXLoadSurfaceFromSurface = nullptr;
PFN_D3DXSaveSurfaceToFileInMemory p_D3DXSaveSurfaceToFileInMemory = nullptr;
PFN_D3DXSaveTextureToFileInMemory p_D3DXSaveTextureToFileInMemory = nullptr;
PFN_D3DXDeclaratorFromFVF p_D3DXDeclaratorFromFVF = nullptr;
PFN_D3DXCompileShaderFromFileA p_D3DXCompileShaderFromFileA = nullptr;
PFN_D3DXCompileShaderFromFileW p_D3DXCompileShaderFromFileW = nullptr;
PFN_D3DXAssembleShader p_D3DXAssembleShader = nullptr;
Expand Down Expand Up @@ -86,6 +88,7 @@ void LoadD3dx9()
p_D3DXLoadSurfaceFromSurface = reinterpret_cast<PFN_D3DXLoadSurfaceFromSurface>(MemoryGetProcAddress(d3dx9Module, "D3DXLoadSurfaceFromSurface"));
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_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 @@ -226,6 +229,28 @@ HRESULT WINAPI D3DXSaveTextureToFileInMemory(LPD3DXBUFFER* ppDestBuf, D3DXIMAGE_
return hr;
}

HRESULT WINAPI D3DXDeclaratorFromFVF(DWORD FVF, D3DVERTEXELEMENT9 pDeclarator[MAX_FVF_DECL_SIZE])
{
Logging::LogDebug() << __FUNCTION__;

LoadD3dx9();

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

HRESULT hr = p_D3DXDeclaratorFromFVF(FVF, pDeclarator);

if (FAILED(hr))
{
Logging::Log() << __FUNCTION__ << " Error: Failed to convert FVF!";
}

return hr;
}

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
3 changes: 3 additions & 0 deletions Libraries/d3dx9.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ struct D3DXVECTOR2
D3DXVECTOR2(float x_, float y_) : x(x_), y(y_) {}
};

#define MAX_FVF_DECL_SIZE MAXD3DDECLLENGTH + 1

// Define the D3DXFillTexture function prototype
typedef HRESULT(WINAPI* LPD3DXFILL3D)(D3DXVECTOR4* pOut, const D3DXVECTOR2* pTexCoord,
const D3DXVECTOR2* pTexelSize, LPVOID pData);
Expand All @@ -128,6 +130,7 @@ 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]);
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
45 changes: 30 additions & 15 deletions ddraw/IDirect3DVertexBufferX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ HRESULT m_IDirect3DVertexBufferX::ProcessVertices(DWORD dwVertexOp, DWORD dwDest
if (Config.Dd7to9)
{
// Always include the D3DVOP_TRANSFORM flag in the dwVertexOp parameter. If you do not, the method fails, returning DDERR_INVALIDPARAMS.
if (!lpSrcBuffer || !lpD3DDevice || !(dwFlags & D3DVOP_TRANSFORM))
if (!lpSrcBuffer || !(dwVertexOp & D3DVOP_TRANSFORM))
{
return DDERR_INVALIDPARAMS;
}
Expand All @@ -258,6 +258,14 @@ HRESULT m_IDirect3DVertexBufferX::ProcessVertices(DWORD dwVertexOp, DWORD dwDest
return DDERR_GENERIC;
}

// Get Direct3DDevice
m_IDirect3DDeviceX** lplpD3DDevice = ddrawParent->GetCurrentD3DDevice();
if (!lplpD3DDevice || !*lplpD3DDevice)
{
LOG_LIMIT(100, __FUNCTION__ << " Error: could not get Direct3DDevice!");
return DDERR_GENERIC;
}

// ToDo: Validate vertex buffer
m_IDirect3DVertexBufferX* pSrcVertexBufferX = nullptr;
lpSrcBuffer->QueryInterface(IID_GetInterfaceX, (LPVOID*)&pSrcVertexBufferX);
Expand All @@ -269,19 +277,24 @@ HRESULT m_IDirect3DVertexBufferX::ProcessVertices(DWORD dwVertexOp, DWORD dwDest
}

LPDIRECT3DVERTEXBUFFER9 d3d9SrcVertexBuffer = pSrcVertexBufferX->GetCurrentD9VertexBuffer();

if (!d3d9SrcVertexBuffer)
{
LOG_LIMIT(100, __FUNCTION__ << " Error: could not get d3d9 source vertex buffer!");
return DDERR_GENERIC;
}

DWORD FVF = pSrcVertexBufferX->GetFVF9();
D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE] = {};
if (FAILED(D3DXDeclaratorFromFVF(FVF, decl)))
{
LOG_LIMIT(100, __FUNCTION__ << " Error: could not create vertex declaration!");
return D3DERR_INVALIDVERTEXTYPE;
}

// Set fixed function vertex type
if (FAILED((*d3d9Device)->SetFVF(FVF)))
IDirect3DVertexDeclaration9* pVertexDecl = nullptr;
if (FAILED((*d3d9Device)->CreateVertexDeclaration(decl, &pVertexDecl)))
{
LOG_LIMIT(100, __FUNCTION__ << " Error: invalid FVF type: " << Logging::hex(FVF));
LOG_LIMIT(100, __FUNCTION__ << " Error: could not create vertex declaration!");
return D3DERR_INVALIDVERTEXTYPE;
}

Expand All @@ -290,20 +303,22 @@ HRESULT m_IDirect3DVertexBufferX::ProcessVertices(DWORD dwVertexOp, DWORD dwDest

// Handle dwFlags
DWORD rsClipping = 0, rsLighting = 0, rsExtents = 0;
(*d3d9Device)->GetRenderState(D3DRENDERSTATE_CLIPPING, &rsClipping);
(*d3d9Device)->GetRenderState(D3DRENDERSTATE_LIGHTING, &rsLighting);
(*d3d9Device)->GetRenderState(D3DRENDERSTATE_EXTENTS, &rsExtents);
(*d3d9Device)->SetRenderState(D3DRENDERSTATE_CLIPPING, (dwVertexOp & D3DVOP_CLIP));
(*d3d9Device)->SetRenderState(D3DRENDERSTATE_LIGHTING, (dwVertexOp & D3DVOP_LIGHT));
(*d3d9Device)->SetRenderState(D3DRENDERSTATE_EXTENTS, (dwVertexOp & D3DVOP_EXTENTS));
(*lplpD3DDevice)->GetRenderState(D3DRENDERSTATE_CLIPPING, &rsClipping);
(*lplpD3DDevice)->GetRenderState(D3DRENDERSTATE_LIGHTING, &rsLighting);
(*lplpD3DDevice)->GetRenderState(D3DRENDERSTATE_EXTENTS, &rsExtents);
(*lplpD3DDevice)->SetRenderState(D3DRENDERSTATE_CLIPPING, (dwVertexOp & D3DVOP_CLIP));
(*lplpD3DDevice)->SetRenderState(D3DRENDERSTATE_LIGHTING, (dwVertexOp & D3DVOP_LIGHT));
(*lplpD3DDevice)->SetRenderState(D3DRENDERSTATE_EXTENTS, (dwVertexOp & D3DVOP_EXTENTS));

// Process vertices
HRESULT hr = (*d3d9Device)->ProcessVertices(dwSrcIndex, dwDestIndex, dwCount, d3d9VertexBuffer, nullptr, dwFlags);
HRESULT hr = (*d3d9Device)->ProcessVertices(dwSrcIndex, dwDestIndex, dwCount, d3d9VertexBuffer, pVertexDecl, dwFlags);

// Reset render state
(*d3d9Device)->SetRenderState(D3DRENDERSTATE_CLIPPING, rsClipping);
(*d3d9Device)->SetRenderState(D3DRENDERSTATE_LIGHTING, rsLighting);
(*d3d9Device)->SetRenderState(D3DRENDERSTATE_EXTENTS, rsExtents);
(*lplpD3DDevice)->SetRenderState(D3DRENDERSTATE_CLIPPING, rsClipping);
(*lplpD3DDevice)->SetRenderState(D3DRENDERSTATE_LIGHTING, rsLighting);
(*lplpD3DDevice)->SetRenderState(D3DRENDERSTATE_EXTENTS, rsExtents);

pVertexDecl->Release();

if (FAILED(hr))
{
Expand Down

0 comments on commit 5689674

Please sign in to comment.