From 03813735fda2a09f3d57e63b96f8085878c868f2 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Sun, 18 Apr 2004 22:22:57 +0000 Subject: [PATCH] _Begin/_End etc work --- Cxbx.opt | Bin 64000 -> 58880 bytes Include/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.h | 2 + Source/Win32/CxbxKrnl/EmuD3D8.cpp | 70 +++++---- Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp | 36 +---- .../Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp | 135 ++++++------------ Source/Win32/CxbxKrnl/EmuXapi.cpp | 3 + .../CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl | 33 +++++ .../CxbxKrnl/HLEDataBase/D3D8.1.0.5849.inl | 90 +++++++++++- 8 files changed, 212 insertions(+), 157 deletions(-) diff --git a/Cxbx.opt b/Cxbx.opt index f8047411aeda26359052ccc3b9175b8aede7beb1..f8585a622c0d97f315e6d75fe86d59bb374e68fe 100644 GIT binary patch delta 783 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 XCT4&cU diff --git a/Include/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.h b/Include/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.h index 9834353ff..565b676de 100644 --- a/Include/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.h +++ b/Include/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.h @@ -124,10 +124,12 @@ class VertexPatcher // inline vertex buffer emulation extern DWORD *g_pIVBVertexBuffer; extern X_D3DPRIMITIVETYPE g_IVBPrimitiveType; +extern DWORD g_IVBFVF; extern struct _D3DIVB { XTL::D3DXVECTOR3 Position; // Position + FLOAT Rhw; // Rhw XTL::DWORD dwSpecular; // Specular XTL::DWORD dwDiffuse; // Diffuse XTL::D3DXVECTOR3 Normal; // Normal diff --git a/Source/Win32/CxbxKrnl/EmuD3D8.cpp b/Source/Win32/CxbxKrnl/EmuD3D8.cpp index 7f7ca7fa5..5000f545c 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8.cpp @@ -1628,6 +1628,17 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_CopyRects GetCurrentThreadId(), pSourceSurface, pSourceRectsArray, cRects, pDestinationSurface, pDestPointsArray); + pSourceSurface->EmuSurface8->UnlockRect(); + + /* + static int kthx = 0; + char fileName[255]; + + sprintf(fileName, "C:\\Aaron\\Textures\\SourceSurface-%d.bmp", kthx++); + + D3DXSaveSurfaceToFile(fileName, D3DXIFF_BMP, pSourceSurface->EmuSurface8, NULL, NULL); + //*/ + HRESULT hRet = g_pD3DDevice8->CopyRects ( pSourceSurface->EmuSurface8, @@ -3137,31 +3148,10 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_Begin // allocate a max of 32 entries g_IVBTable = (struct XTL::_D3DIVB*)CxbxMalloc(sizeof(XTL::_D3DIVB)*32); g_IVBTblOffs = 0; + g_IVBFVF = 0; // default values - for(int v=0;v<32;v++) - { - g_IVBTable[v].Position.x = 0; - g_IVBTable[v].Position.y = 0; - g_IVBTable[v].Position.z = 0; - g_IVBTable[v].Normal.x = 0; - g_IVBTable[v].Normal.y = 0; - g_IVBTable[v].Normal.z = 0; - g_IVBTable[v].dwDiffuse = 0x00000000; - g_IVBTable[v].dwSpecular = 0x00000000; - g_IVBTable[v].TexCoord1.x = 0; - g_IVBTable[v].TexCoord1.y = 0; - g_IVBTable[v].TexCoord2.x = 0; - g_IVBTable[v].TexCoord2.y = 0; - g_IVBTable[v].TexCoord3.x = 0; - g_IVBTable[v].TexCoord3.y = 0; - g_IVBTable[v].TexCoord4.x = 0; - g_IVBTable[v].TexCoord4.y = 0; - } - - DWORD dwShader = -1; - - g_pD3DDevice8->GetVertexShader(&dwShader); + ZeroMemory(g_IVBTable, sizeof(XTL::_D3DIVB)*32); g_pIVBVertexBuffer = (DWORD*)CxbxMalloc(sizeof(struct XTL::_D3DIVB)*32); @@ -3198,6 +3188,9 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetVertexData2f return EmuIDirect3DDevice8_SetVertexData4f(Register, a, b, 0.0f, 1.0f); } +static inline DWORD FtoDW(FLOAT f) { return *((DWORD*)&f); } +static inline FLOAT DWtoF(DWORD f) { return *((FLOAT*)&f); } + // ****************************************************************** // * func: EmuIDirect3DDevice8_SetVertexData4f // ****************************************************************** @@ -3226,7 +3219,22 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetVertexData4f switch(Register) { - case 9: + case 3: // D3DVSDE_DIFFUSE + { + int o = g_IVBTblOffs; + + DWORD ca = FtoDW(d) << 24; + DWORD cr = FtoDW(a) << 16; + DWORD cg = FtoDW(b) << 8; + DWORD cb = FtoDW(c) << 0; + + g_IVBTable[o].dwDiffuse = ca | cr | cg | cb; + + g_IVBFVF |= D3DFVF_DIFFUSE; + } + break; + + case 9: // D3DVSDE_TEXCOORD0 { int o = g_IVBTblOffs; @@ -3238,6 +3246,11 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetVertexData4f g_IVBTable[o].TexCoord1.x = a; g_IVBTable[o].TexCoord1.y = b; + + if( (g_IVBFVF & D3DFVF_TEXCOUNT_MASK) < D3DFVF_TEX1) + { + g_IVBFVF |= D3DFVF_TEX1; + } } break; @@ -3245,8 +3258,8 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetVertexData4f { int o = g_IVBTblOffs; -// a = (a/320.0f) - 1.0f; -// b = (b/240.0f) - 1.0f; + a = (a/320.0f) - 1.0f; + b = (b/240.0f) - 1.0f; g_IVBTable[o].Position.x = a; g_IVBTable[o].Position.y = b; @@ -3254,6 +3267,8 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetVertexData4f g_IVBTblOffs++; + g_IVBFVF |= D3DFVF_XYZ; + EmuFlushIVB(); } break; @@ -3267,9 +3282,6 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetVertexData4f return hRet; } -static inline DWORD FtoDW(FLOAT f) { return *((DWORD*)&f); } -static inline FLOAT DWtoF(DWORD f) { return *((FLOAT*)&f); } - // ****************************************************************** // * func: EmuIDirect3DDevice8_SetVertexDataColor // ****************************************************************** diff --git a/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp b/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp index c115c48ba..3e4ad33e3 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8/PushBuffer.cpp @@ -385,38 +385,12 @@ void XTL::EmuExecutePushBuffer { #endif - if(!g_bPBSkipPusher) + if(!g_bPBSkipPusher && IsValidCurrentShader()) { - if(IsValidCurrentShader()) - { - //g_pD3DDevice8->SetVertexShader(D3DFVF_XYZ | D3DFVF_TEX0); - - /* these don't help the turok lighting problems :[ - g_pD3DDevice8->SetRenderState(D3DRS_LIGHTING, FALSE); - g_pD3DDevice8->SetRenderState(D3DRS_FOGENABLE, FALSE); - g_pD3DDevice8->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_NONE); - g_pD3DDevice8->SetRenderState(D3DRS_SPECULARENABLE, FALSE); - g_pD3DDevice8->SetRenderState(D3DRS_ZVISIBLE, FALSE); - g_pD3DDevice8->SetRenderState(D3DRS_RANGEFOGENABLE, FALSE); - g_pD3DDevice8->SetRenderState(D3DRS_AMBIENT, RGB(255,125,125)); - g_pD3DDevice8->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_COLOR1); - - D3DMATERIAL8 mtrl; - - ZeroMemory( &mtrl, sizeof(D3DMATERIAL8) ); - - mtrl.Diffuse.r = mtrl.Ambient.r = mtrl.Specular.r = 1.0f; - mtrl.Diffuse.g = mtrl.Ambient.g = mtrl.Specular.r = 0.0f; - mtrl.Diffuse.b = mtrl.Ambient.b = mtrl.Specular.r = 0.0f; - mtrl.Diffuse.a = mtrl.Ambient.a = mtrl.Specular.r = 1.0f; - - g_pD3DDevice8->SetMaterial(&mtrl); - //*/ - g_pD3DDevice8->DrawIndexedPrimitive - ( - PCPrimitiveType, 0, /*dwCount*2*/8*1024*1024, 0, PrimitiveCount - ); - } + g_pD3DDevice8->DrawIndexedPrimitive + ( + PCPrimitiveType, 0, /*dwCount*2*/8*1024*1024, 0, PrimitiveCount + ); } #ifdef _DEBUG_TRACK_PB diff --git a/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp b/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp index 54776e016..38722c23f 100644 --- a/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp +++ b/Source/Win32/CxbxKrnl/EmuD3D8/VertexBuffer.cpp @@ -49,6 +49,7 @@ XTL::DWORD *XTL::g_pIVBVertexBuffer = 0; XTL::X_D3DPRIMITIVETYPE XTL::g_IVBPrimitiveType = XTL::X_D3DPT_INVALID; UINT XTL::g_IVBTblOffs = 0; struct XTL::_D3DIVB *XTL::g_IVBTable = 0; +extern DWORD XTL::g_IVBFVF = 0; static unsigned int crctab[256]; @@ -937,146 +938,90 @@ bool XTL::VertexPatcher::Restore() VOID XTL::EmuFlushIVB() { - if((g_IVBPrimitiveType == X_D3DPT_QUADSTRIP) && (g_IVBTblOffs == 4)) + if((g_IVBPrimitiveType == X_D3DPT_QUADLIST) && (g_IVBTblOffs == 4)) { - DWORD dwShader = -1; - DWORD *pdwVB = g_pIVBVertexBuffer; + XTL::EmuUpdateDeferredStates(); - g_pD3DDevice8->GetVertexShader(&dwShader); + DWORD *pdwVB = (DWORD*)g_IVBTable; UINT uiStride = 0; for(int v=0;v<4;v++) { - DWORD dwPos = dwShader & D3DFVF_POSITION_MASK; + DWORD dwPos = g_IVBFVF & D3DFVF_POSITION_MASK; - if(dwPos == D3DFVF_XYZRHW) + if(dwPos == D3DFVF_XYZ) { *(FLOAT*)pdwVB++ = g_IVBTable[v].Position.x; *(FLOAT*)pdwVB++ = g_IVBTable[v].Position.y; *(FLOAT*)pdwVB++ = g_IVBTable[v].Position.z; - uiStride += (sizeof(FLOAT)*3); + if(v == 0) + { + uiStride += (sizeof(FLOAT)*3); + } DbgPrintf("IVB Position := {%f, %f, %f}\n", g_IVBTable[v].Position.x, g_IVBTable[v].Position.y, g_IVBTable[v].Position.z); } else { - EmuCleanup("Unsupported Position Mask (FVF := 0x%.08X)", dwShader); + EmuCleanup("Unsupported Position Mask (FVF := 0x%.08X)", g_IVBFVF); } - if(dwShader & D3DFVF_NORMAL) - { - *(FLOAT*)pdwVB++ = g_IVBTable[v].Normal.x; - *(FLOAT*)pdwVB++ = g_IVBTable[v].Normal.y; - *(FLOAT*)pdwVB++ = g_IVBTable[v].Normal.z; - - uiStride += sizeof(FLOAT)*3; - - DbgPrintf("IVB Normal := {%f, %f, %f}\n", g_IVBTable[v].Normal.x, g_IVBTable[v].Normal.y, g_IVBTable[v].Normal.z); - } - - if(dwShader & D3DFVF_DIFFUSE) + if(g_IVBFVF & D3DFVF_DIFFUSE) { *(DWORD*)pdwVB++ = g_IVBTable[v].dwDiffuse; + if(v == 0) + { + uiStride += sizeof(DWORD); + } + DbgPrintf("IVB Diffuse := 0x%.08X\n", g_IVBTable[v].dwDiffuse); } - if(dwShader & D3DFVF_SPECULAR) - { - *(DWORD*)pdwVB++ = g_IVBTable[v].dwSpecular; - - uiStride += sizeof(DWORD); - - DbgPrintf("IVB Specular := 0x%.08X\n", g_IVBTable[v].dwSpecular); - } - - DWORD dwTexN = (dwShader & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT; + DWORD dwTexN = (g_IVBFVF & D3DFVF_TEXCOUNT_MASK) >> D3DFVF_TEXCOUNT_SHIFT; if(dwTexN >= 1) { *(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord1.x; *(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord1.y; - uiStride += sizeof(FLOAT)*2; + if(v == 0) + { + uiStride += sizeof(FLOAT)*2; + } DbgPrintf("IVB TexCoord1 := {%f, %f}\n", g_IVBTable[v].TexCoord1.x, g_IVBTable[v].TexCoord1.y); } - - if(dwTexN >= 2) - { - *(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord2.x; - *(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord2.y; - - uiStride += sizeof(FLOAT)*2; - - DbgPrintf("IVB TexCoord2 := {%f, %f}\n", g_IVBTable[v].TexCoord2.x, g_IVBTable[v].TexCoord2.y); - } - - if(dwTexN >= 3) - { - *(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord3.x; - *(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord3.y; - - uiStride += sizeof(FLOAT)*2; - - DbgPrintf("IVB TexCoord3 := {%f, %f}\n", g_IVBTable[v].TexCoord3.x, g_IVBTable[v].TexCoord3.y); - } - - if(dwTexN >= 4) - { - *(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord4.x; - *(FLOAT*)pdwVB++ = g_IVBTable[v].TexCoord4.y; - - uiStride += sizeof(FLOAT)*2; - - DbgPrintf("IVB TexCoord4 := {%f, %f}\n", g_IVBTable[v].TexCoord4.x, g_IVBTable[v].TexCoord4.y); - } } - /* - static XTL::IDirect3DTexture8 *pTexture = 0; + g_pD3DDevice8->SetVertexShader(g_IVBFVF); + g_pD3DDevice8->SetPixelShader(NULL); - if(pTexture == 0) - { - g_pD3DDevice8->CreateTexture(512, 512, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &pTexture); + // patch buffer + UINT PrimitiveCount = EmuD3DVertex2PrimitiveCount(g_IVBPrimitiveType, 4); - IDirect3DSurface8 *pSurface = 0;; + VertexPatchDesc VPDesc; - pTexture->GetSurfaceLevel(0, &pSurface); + VPDesc.dwVertexCount = 4; + VPDesc.PrimitiveType = g_IVBPrimitiveType; + VPDesc.dwPrimitiveCount = PrimitiveCount; + VPDesc.dwOffset = 0; + VPDesc.pVertexStreamZeroData = g_IVBTable; + VPDesc.uiVertexStreamZeroStride = uiStride; + // TODO: Set the current shader and let the patcher handle it.. + VPDesc.hVertexShader = g_IVBFVF; - D3DXLoadSurfaceFromFileA(pSurface, NULL, NULL, "C:\\texture.bmp", NULL, D3DX_FILTER_NONE, 0, NULL); + VertexPatcher VertPatch; - pSurface->Release(); - } + bool bPatched = VertPatch.Apply(&VPDesc); - g_pD3DDevice8->SetTexture(0, pTexture); - //*/ + g_pD3DDevice8->DrawPrimitiveUP(D3DPT_TRIANGLELIST, VPDesc.dwPrimitiveCount, VPDesc.pVertexStreamZeroData, VPDesc.uiVertexStreamZeroStride); - /* - IDirect3DBaseTexture8 *pTexture = 0; - - g_pD3DDevice8->GetTexture(0, &pTexture); - - if(pTexture != NULL) - { - static int dwDumpTexture = 0; - - char szBuffer[255]; - - sprintf(szBuffer, "C:\\Aaron\\Textures\\Texture-Active%.03d.bmp", dwDumpTexture++); - - D3DXSaveTextureToFile(szBuffer, D3DXIFF_BMP, pTexture, NULL); - } - //*/ - - XTL::EmuUpdateDeferredStates(); - - g_pD3DDevice8->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, g_pIVBVertexBuffer, uiStride); - - g_pD3DDevice8->Present(0,0,0,0); + VertPatch.Restore(); + // ignore g_IVBTblOffs = 0; } diff --git a/Source/Win32/CxbxKrnl/EmuXapi.cpp b/Source/Win32/CxbxKrnl/EmuXapi.cpp index 13264735a..85bf25d98 100644 --- a/Source/Win32/CxbxKrnl/EmuXapi.cpp +++ b/Source/Win32/CxbxKrnl/EmuXapi.cpp @@ -726,6 +726,9 @@ BOOL WINAPI XTL::EmuSetThreadPriority if(bRet == FALSE) EmuWarning("SetThreadPriority Failed!"); + // HACK! + Sleep(10); + EmuSwapFS(); // XBox FS return bRet; diff --git a/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl b/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl index 4de0ceafa..ea2b38a5b 100644 --- a/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl +++ b/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl @@ -493,6 +493,29 @@ SOOVPA<12> IDirect3DDevice8_SetShaderConstantMode_1_0_4627 = } }; +// ****************************************************************** +// * IDirect3DDevice8_CopyRects +// ****************************************************************** +SOOVPA<8> IDirect3DDevice8_CopyRects_1_0_4627 = +{ + 0, // Large == 0 + 8, // Count == 8 + + -1, // XRef Not Saved + 0, // XRef Not Used + + { + { 0x1E, 0x57 }, + { 0x3E, 0xF6 }, + { 0x5E, 0x00 }, + { 0x7E, 0x01 }, + { 0x9E, 0x00 }, + { 0xBE, 0x0C }, + { 0xDE, 0xF7 }, + { 0xFE, 0x00 }, + } +}; + // ****************************************************************** // * IDirect3DDevice8_GetBackBuffer2 // ****************************************************************** @@ -3013,6 +3036,16 @@ OOVPATable D3D8_1_0_4627[] = "EmuIDirect3D8_KickOffAndWaitForIdle2" #endif }, + // IDirect3DDevice8::CopyRects + { + (OOVPA*)&IDirect3DDevice8_CopyRects_1_0_4627, + + XTL::EmuIDirect3DDevice8_CopyRects, + + #ifdef _DEBUG_TRACE + "EmuIDirect3DDevice8_CopyRects" + #endif + }, // IDirect3DDevice8::GetBackBuffer2 { (OOVPA*)&IDirect3DDevice8_GetBackBuffer2_1_0_4627, diff --git a/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.5849.inl b/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.5849.inl index 059570b63..cbdb75920 100644 --- a/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.5849.inl +++ b/Source/Win32/CxbxKrnl/HLEDataBase/D3D8.1.0.5849.inl @@ -237,6 +237,72 @@ SOOVPA<7> IDirect3DDevice8_SetPixelShader_1_0_5849 = } }; +// ****************************************************************** +// * IDirect3DDevice8_SetVertexData4f +// ****************************************************************** +SOOVPA<17> IDirect3DDevice8_SetVertexData4f_1_0_5849 = +{ + 0, // Large == 0 + 7, // Count == 7 + + -1, // XRef Not Saved + 0, // XRef Not Used + + { + { 0x0A, 0x46 }, + { 0x16, 0x08 }, + { 0x22, 0x09 }, + { 0x2E, 0x24 }, + { 0x3A, 0x24 }, + { 0x46, 0x8B }, + { 0x52, 0x14 }, + } +}; + +// ****************************************************************** +// * IDirect3DDevice8_SetVertexDataColor +// ****************************************************************** +SOOVPA<17> IDirect3DDevice8_SetVertexDataColor_1_0_5849 = +{ + 0, // Large == 0 + 7, // Count == 7 + + -1, // XRef Not Saved + 0, // XRef Not Used + + { + { 0x08, 0x06 }, + { 0x14, 0x8B }, + { 0x1C, 0x19 }, + { 0x26, 0xB6 }, + { 0x30, 0x00 }, + { 0x3A, 0xFF }, + { 0x44, 0x08 }, + } +}; + +// ****************************************************************** +// * IDirect3DDevice8_End +// ****************************************************************** +SOOVPA<17> IDirect3DDevice8_End_1_0_5849 = +{ + 0, // Large == 0 + 7, // Count == 7 + + -1, // XRef Not Saved + 0, // XRef Not Used + + { + { 0x07, 0x8B }, + { 0x13, 0xC7 }, + { 0x19, 0xC7 }, + { 0x22, 0x08 }, + { 0x2B, 0xE1 }, + { 0x34, 0x4E }, + { 0x40, 0xC3 }, + } +}; + // ****************************************************************** // * IDirect3DDevice8_SetRenderState_CullMode // ****************************************************************** @@ -646,9 +712,9 @@ OOVPATable D3D8_1_0_5849[] = "EmuIDirect3DDevice8_SetVertexData2f" #endif }, - // IDirect3DDevice8::SetVertexData4f (* unchanged since 4627 *) + // IDirect3DDevice8::SetVertexData4f { - (OOVPA*)&IDirect3DDevice8_SetVertexData4f_1_0_4627, + (OOVPA*)&IDirect3DDevice8_SetVertexData4f_1_0_5849, XTL::EmuIDirect3DDevice8_SetVertexData4f, @@ -656,6 +722,26 @@ OOVPATable D3D8_1_0_5849[] = "EmuIDirect3DDevice8_SetVertexData4f" #endif }, + // IDirect3DDevice8::SetVertexDataColor + { + (OOVPA*)&IDirect3DDevice8_SetVertexDataColor_1_0_5849, + + XTL::EmuIDirect3DDevice8_SetVertexDataColor, + + #ifdef _DEBUG_TRACE + "EmuIDirect3DDevice8_SetVertexDataColor" + #endif + }, + // IDirect3DDevice8::End + { + (OOVPA*)&IDirect3DDevice8_End_1_0_5849, + + XTL::EmuIDirect3DDevice8_End, + + #ifdef _DEBUG_TRACE + "EmuIDirect3DDevice8_End" + #endif + }, // IDirect3DDevice8::SetTextureState_TexCoordIndex (* unchanged since 4627 *) { (OOVPA*)&IDirect3DDevice8_SetTextureState_TexCoordIndex_1_0_4627,