diff --git a/src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp b/src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp index 114feb6e3..92aea553b 100644 --- a/src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp +++ b/src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp @@ -502,152 +502,132 @@ bool XTL::VertexPatcher::PatchStream(VertexPatchDesc *pPatchDesc, } } - for(uint32 uiVertex = 0; uiVertex < pPatchDesc->dwVertexCount; uiVertex++) - { - DWORD dwPosOrig = 0; - DWORD dwPosNew = 0; - for(UINT uiType = 0; uiType < pStreamPatch->NbrTypes; uiType++) - { - switch(pStreamPatch->pTypes[uiType]) - { - case X_D3DVSDT_NORMPACKED3: // 0x16: - { - DWORD dwPacked = ((DWORD *)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]; + for (uint32 uiVertex = 0; uiVertex < pPatchDesc->dwVertexCount; uiVertex++) + { + DWORD dwPosOrig = 0; + uint08 *pOrigVertex = &pOrigData[uiVertex * uiStride]; + uint08 *pNewDataPos = &pNewData[uiVertex * pStreamPatch->ConvertedStride]; + for (UINT uiType = 0; uiType < pStreamPatch->NbrTypes; uiType++) + { + switch (pStreamPatch->pTypes[uiType]) + { + case X_D3DVSDT_NORMPACKED3: // 0x16: + { + DWORD dwPacked = ((DWORD *)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)(dwPacked & 0x7ff)) / 1023.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[1] = ((FLOAT)((dwPacked >> 11) & 0x7ff)) / 1023.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[2] = ((FLOAT)((dwPacked >> 22) & 0x3ff)) / 511.0f; + ((FLOAT *)pNewDataPos)[0] = ((FLOAT)(dwPacked & 0x7ff)) / 1023.0f; + ((FLOAT *)pNewDataPos)[1] = ((FLOAT)((dwPacked >> 11) & 0x7ff)) / 1023.0f; + ((FLOAT *)pNewDataPos)[2] = ((FLOAT)((dwPacked >> 22) & 0x3ff)) / 511.0f; - dwPosOrig += sizeof(DWORD); - dwPosNew += 3 * sizeof(FLOAT); - } - break; - case X_D3DVSDT_SHORT1: // 0x15: - // Make it a SHORT2 - (*((SHORT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew + 0 * sizeof(SHORT)])) = *(SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig]; - (*((SHORT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew + 1 * sizeof(SHORT)])) = 0x00; + dwPosOrig += sizeof(DWORD); + break; + } + case X_D3DVSDT_SHORT1: // 0x15: + // Make it a SHORT2 + ((SHORT *)pNewDataPos)[0] = *(SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig]; + ((SHORT *)pNewDataPos)[1] = 0x00; - dwPosOrig += 1 * sizeof(SHORT); - dwPosNew += 2 * sizeof(SHORT); + dwPosOrig += 1 * sizeof(SHORT); + break; + case X_D3DVSDT_SHORT3: // 0x35: + memcpy(pNewDataPos, + &pOrigData[uiVertex * uiStride + dwPosOrig], + 3 * sizeof(SHORT)); + // Make it a SHORT4 and set the last short to 1 + //(*((SHORT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew + 3 * sizeof(SHORT)])) = 0x01; + ((SHORT *)pNewDataPos)[3] = 0x01; - break; - case X_D3DVSDT_SHORT2: // 0x25: - memcpy(&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew], - &pOrigData[uiVertex * uiStride+dwPosOrig], - 2 * sizeof(SHORT)); - dwPosOrig += 2 * sizeof(SHORT); - dwPosNew += 2 * sizeof(SHORT); - break; - case X_D3DVSDT_SHORT3: // 0x35: - memcpy(&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew], - &pOrigData[uiVertex * uiStride + dwPosOrig], - 3 * sizeof(SHORT)); - // Make it a SHORT4 and set the last short to 1 - (*((SHORT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew + 3 * sizeof(SHORT)])) = 0x01; + dwPosOrig += 3 * sizeof(SHORT); + break; + case X_D3DVSDT_PBYTE1: // 0x14: + ((FLOAT *)pNewDataPos)[0] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 255.0f; - dwPosOrig += 3 * sizeof(SHORT); - dwPosNew += 4 * sizeof(SHORT); + dwPosOrig += 1 * sizeof(BYTE); - break; - case X_D3DVSDT_SHORT4: // 0x45: - memcpy(&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew], - &pOrigData[uiVertex * uiStride + dwPosOrig], - 4 * sizeof(SHORT)); - dwPosOrig += 4 * sizeof(SHORT); - dwPosNew += 4 * sizeof(SHORT); - break; - case X_D3DVSDT_PBYTE1: // 0x14: - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 255.0f; + break; + case X_D3DVSDT_PBYTE2: // 0x24: + ((FLOAT *)pNewDataPos)[0] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 255.0f; + ((FLOAT *)pNewDataPos)[1] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]) / 255.0f; - dwPosOrig += 1 * sizeof(BYTE); - dwPosNew += 1 * sizeof(FLOAT); + dwPosOrig += 2 * sizeof(BYTE); - break; - case X_D3DVSDT_PBYTE2: // 0x24: - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 255.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[1] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]) / 255.0f; + break; + case X_D3DVSDT_PBYTE3: // 0x34: + ((FLOAT *)pNewDataPos)[0] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 255.0f; + ((FLOAT *)pNewDataPos)[1] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]) / 255.0f; + ((FLOAT *)pNewDataPos)[2] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[2]) / 255.0f; - dwPosOrig += 2 * sizeof(BYTE); - dwPosNew += 2 * sizeof(FLOAT); + dwPosOrig += 3 * sizeof(BYTE); - break; - case X_D3DVSDT_PBYTE3: // 0x34: - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 255.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[1] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]) / 255.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[2] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[2]) / 255.0f; + break; + case X_D3DVSDT_PBYTE4: // 0x44: + ((FLOAT *)pNewDataPos)[0] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 255.0f; + ((FLOAT *)pNewDataPos)[1] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]) / 255.0f; + ((FLOAT *)pNewDataPos)[2] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[2]) / 255.0f; + ((FLOAT *)pNewDataPos)[3] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[3]) / 255.0f; - dwPosOrig += 3 * sizeof(BYTE); - dwPosNew += 3 * sizeof(FLOAT); + dwPosOrig += 4 * sizeof(BYTE); - break; - case X_D3DVSDT_PBYTE4: // 0x44: - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 255.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[1] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]) / 255.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[2] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[2]) / 255.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[3] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[3]) / 255.0f; + break; + case X_D3DVSDT_NORMSHORT1: // 0x11: + ((FLOAT *)pNewDataPos)[0] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 32767.0f; - dwPosOrig += 4 * sizeof(BYTE); - dwPosNew += 4 * sizeof(FLOAT); + dwPosOrig += 1 * sizeof(SHORT); + break; + case X_D3DVSDT_NORMSHORT2: // 0x21: + ((FLOAT *)pNewDataPos)[0] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 32767.0f; + ((FLOAT *)pNewDataPos)[1] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]) / 32767.0f; - break; - case X_D3DVSDT_NORMSHORT1: // 0x11: - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 32767.0f; + dwPosOrig += 2 * sizeof(SHORT); + break; + case X_D3DVSDT_NORMSHORT3: // 0x31: + ((FLOAT *)pNewDataPos)[0] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 32767.0f; + ((FLOAT *)pNewDataPos)[1] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]) / 32767.0f; + ((FLOAT *)pNewDataPos)[2] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[2]) / 32767.0f; - dwPosOrig += 1 * sizeof(SHORT); - dwPosNew += 1 * sizeof(FLOAT); - break; - case X_D3DVSDT_NORMSHORT2: // 0x21: - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 32767.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[1] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]) / 32767.0f; + dwPosOrig += 3 * sizeof(SHORT); + break; + case X_D3DVSDT_NORMSHORT4: // 0x41: + ((FLOAT *)pNewDataPos)[0] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 32767.0f; + ((FLOAT *)pNewDataPos)[1] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]) / 32767.0f; + ((FLOAT *)pNewDataPos)[2] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[2]) / 32767.0f; + ((FLOAT *)pNewDataPos)[3] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[3]) / 32767.0f; - dwPosOrig += 2 * sizeof(SHORT); - dwPosNew += 2 * sizeof(FLOAT); - break; - case X_D3DVSDT_NORMSHORT3: // 0x31: - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 32767.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[1] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]) / 32767.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[2] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[2]) / 32767.0f; + dwPosOrig += 4 * sizeof(SHORT); + break; + case X_D3DVSDT_FLOAT2H: // 0x72: + ((FLOAT *)pNewDataPos)[0] = ((FLOAT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]; + ((FLOAT *)pNewDataPos)[1] = ((FLOAT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]; + ((FLOAT *)pNewDataPos)[2] = 0.0f; + ((FLOAT *)pNewDataPos)[3] = ((FLOAT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[2]; + break; - dwPosOrig += 3 * sizeof(SHORT); - dwPosNew += 3 * sizeof(FLOAT); - break; - case X_D3DVSDT_NORMSHORT4: // 0x41: - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 32767.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[1] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]) / 32767.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[2] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[2]) / 32767.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[3] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[3]) / 32767.0f; - - dwPosOrig += 4 * sizeof(SHORT); - dwPosNew += 4 * sizeof(FLOAT); - break; - case X_D3DVSDT_FLOAT2H: // 0x72: - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[1] = ((FLOAT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[2] = 0.0f; - ((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[3] = ((FLOAT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[2]; + /*TODO + case X_D3DVSDT_NONE: // 0x02: + printf("D3DVSDT_NONE / xbox ext. nsp /"); + dwNewDataType = 0xFF; break; + */ + default: + // Generic 'conversion' - just make a copy : + memcpy(pNewDataPos, + &pOrigData[uiVertex * uiStride + dwPosOrig], + pStreamPatch->pSizes[uiType]); + dwPosOrig += pStreamPatch->pSizes[uiType]; + break; + } // switch - /*TODO - case X_D3DVSDT_NONE: // 0x02: - printf("D3DVSDT_NONE / xbox ext. nsp /"); - dwNewDataType = 0xFF; - break; - */ - default: - // Generic 'conversion' - just make a copy : - memcpy(&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew], - &pOrigData[uiVertex * uiStride + dwPosOrig], - pStreamPatch->pSizes[uiType]); - dwPosOrig += pStreamPatch->pSizes[uiType]; - dwPosNew += pStreamPatch->pSizes[uiType]; - break; - } - } - } + // Increment the new pointer : + pNewDataPos += pStreamPatch->pSizes[uiType]; + + } + } if(!pPatchDesc->pVertexStreamZeroData) { - pNewVertexBuffer->Unlock(); - pOrigVertexBuffer->Unlock(); + //if(pNewVertexBuffer != nullptr) // Dxbx addition + pNewVertexBuffer->Unlock(); + //if (pOrigVertexBuffer != nullptr) // Dxbx addition + pOrigVertexBuffer->Unlock(); if(FAILED(g_pD3DDevice8->SetStreamSource(uiStream, pNewVertexBuffer, pStreamPatch->ConvertedStride))) {