Redid it, works

This commit is contained in:
PatrickvL 2017-02-08 20:58:51 +01:00
parent 84be4bb04f
commit 843400b54f
1 changed files with 105 additions and 125 deletions

View File

@ -505,7 +505,8 @@ bool XTL::VertexPatcher::PatchStream(VertexPatchDesc *pPatchDesc,
for (uint32 uiVertex = 0; uiVertex < pPatchDesc->dwVertexCount; uiVertex++) for (uint32 uiVertex = 0; uiVertex < pPatchDesc->dwVertexCount; uiVertex++)
{ {
DWORD dwPosOrig = 0; DWORD dwPosOrig = 0;
DWORD dwPosNew = 0; uint08 *pOrigVertex = &pOrigData[uiVertex * uiStride];
uint08 *pNewDataPos = &pNewData[uiVertex * pStreamPatch->ConvertedStride];
for (UINT uiType = 0; uiType < pStreamPatch->NbrTypes; uiType++) for (UINT uiType = 0; uiType < pStreamPatch->NbrTypes; uiType++)
{ {
switch (pStreamPatch->pTypes[uiType]) switch (pStreamPatch->pTypes[uiType])
@ -514,117 +515,91 @@ bool XTL::VertexPatcher::PatchStream(VertexPatchDesc *pPatchDesc,
{ {
DWORD dwPacked = ((DWORD *)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]; DWORD dwPacked = ((DWORD *)&pOrigData[uiVertex * uiStride + dwPosOrig])[0];
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)(dwPacked & 0x7ff)) / 1023.0f; ((FLOAT *)pNewDataPos)[0] = ((FLOAT)(dwPacked & 0x7ff)) / 1023.0f;
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[1] = ((FLOAT)((dwPacked >> 11) & 0x7ff)) / 1023.0f; ((FLOAT *)pNewDataPos)[1] = ((FLOAT)((dwPacked >> 11) & 0x7ff)) / 1023.0f;
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[2] = ((FLOAT)((dwPacked >> 22) & 0x3ff)) / 511.0f; ((FLOAT *)pNewDataPos)[2] = ((FLOAT)((dwPacked >> 22) & 0x3ff)) / 511.0f;
dwPosOrig += sizeof(DWORD); dwPosOrig += sizeof(DWORD);
dwPosNew += 3 * sizeof(FLOAT);
}
break; break;
}
case X_D3DVSDT_SHORT1: // 0x15: case X_D3DVSDT_SHORT1: // 0x15:
// Make it a SHORT2 // Make it a SHORT2
(*((SHORT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew + 0 * sizeof(SHORT)])) = *(SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig]; ((SHORT *)pNewDataPos)[0] = *(SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig];
(*((SHORT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew + 1 * sizeof(SHORT)])) = 0x00; ((SHORT *)pNewDataPos)[1] = 0x00;
dwPosOrig += 1 * sizeof(SHORT); dwPosOrig += 1 * sizeof(SHORT);
dwPosNew += 2 * sizeof(SHORT);
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; break;
case X_D3DVSDT_SHORT3: // 0x35: case X_D3DVSDT_SHORT3: // 0x35:
memcpy(&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew], memcpy(pNewDataPos,
&pOrigData[uiVertex * uiStride + dwPosOrig], &pOrigData[uiVertex * uiStride + dwPosOrig],
3 * sizeof(SHORT)); 3 * sizeof(SHORT));
// Make it a SHORT4 and set the last short to 1 // Make it a SHORT4 and set the last short to 1
(*((SHORT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew + 3 * sizeof(SHORT)])) = 0x01; //(*((SHORT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew + 3 * sizeof(SHORT)])) = 0x01;
((SHORT *)pNewDataPos)[3] = 0x01;
dwPosOrig += 3 * sizeof(SHORT); dwPosOrig += 3 * sizeof(SHORT);
dwPosNew += 4 * sizeof(SHORT);
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; break;
case X_D3DVSDT_PBYTE1: // 0x14: case X_D3DVSDT_PBYTE1: // 0x14:
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 255.0f; ((FLOAT *)pNewDataPos)[0] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 255.0f;
dwPosOrig += 1 * sizeof(BYTE); dwPosOrig += 1 * sizeof(BYTE);
dwPosNew += 1 * sizeof(FLOAT);
break; break;
case X_D3DVSDT_PBYTE2: // 0x24: case X_D3DVSDT_PBYTE2: // 0x24:
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 255.0f; ((FLOAT *)pNewDataPos)[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 *)pNewDataPos)[1] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]) / 255.0f;
dwPosOrig += 2 * sizeof(BYTE); dwPosOrig += 2 * sizeof(BYTE);
dwPosNew += 2 * sizeof(FLOAT);
break; break;
case X_D3DVSDT_PBYTE3: // 0x34: case X_D3DVSDT_PBYTE3: // 0x34:
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 255.0f; ((FLOAT *)pNewDataPos)[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 *)pNewDataPos)[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 *)pNewDataPos)[2] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[2]) / 255.0f;
dwPosOrig += 3 * sizeof(BYTE); dwPosOrig += 3 * sizeof(BYTE);
dwPosNew += 3 * sizeof(FLOAT);
break; break;
case X_D3DVSDT_PBYTE4: // 0x44: case X_D3DVSDT_PBYTE4: // 0x44:
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 255.0f; ((FLOAT *)pNewDataPos)[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 *)pNewDataPos)[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 *)pNewDataPos)[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; ((FLOAT *)pNewDataPos)[3] = ((FLOAT)((BYTE*)&pOrigData[uiVertex * uiStride + dwPosOrig])[3]) / 255.0f;
dwPosOrig += 4 * sizeof(BYTE); dwPosOrig += 4 * sizeof(BYTE);
dwPosNew += 4 * sizeof(FLOAT);
break; break;
case X_D3DVSDT_NORMSHORT1: // 0x11: case X_D3DVSDT_NORMSHORT1: // 0x11:
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 32767.0f; ((FLOAT *)pNewDataPos)[0] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 32767.0f;
dwPosOrig += 1 * sizeof(SHORT); dwPosOrig += 1 * sizeof(SHORT);
dwPosNew += 1 * sizeof(FLOAT);
break; break;
case X_D3DVSDT_NORMSHORT2: // 0x21: case X_D3DVSDT_NORMSHORT2: // 0x21:
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 32767.0f; ((FLOAT *)pNewDataPos)[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 *)pNewDataPos)[1] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]) / 32767.0f;
dwPosOrig += 2 * sizeof(SHORT); dwPosOrig += 2 * sizeof(SHORT);
dwPosNew += 2 * sizeof(FLOAT);
break; break;
case X_D3DVSDT_NORMSHORT3: // 0x31: case X_D3DVSDT_NORMSHORT3: // 0x31:
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 32767.0f; ((FLOAT *)pNewDataPos)[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 *)pNewDataPos)[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 *)pNewDataPos)[2] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[2]) / 32767.0f;
dwPosOrig += 3 * sizeof(SHORT); dwPosOrig += 3 * sizeof(SHORT);
dwPosNew += 3 * sizeof(FLOAT);
break; break;
case X_D3DVSDT_NORMSHORT4: // 0x41: case X_D3DVSDT_NORMSHORT4: // 0x41:
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]) / 32767.0f; ((FLOAT *)pNewDataPos)[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 *)pNewDataPos)[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 *)pNewDataPos)[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; ((FLOAT *)pNewDataPos)[3] = ((FLOAT)((SHORT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[3]) / 32767.0f;
dwPosOrig += 4 * sizeof(SHORT); dwPosOrig += 4 * sizeof(SHORT);
dwPosNew += 4 * sizeof(FLOAT);
break; break;
case X_D3DVSDT_FLOAT2H: // 0x72: case X_D3DVSDT_FLOAT2H: // 0x72:
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[0] = ((FLOAT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0]; ((FLOAT *)pNewDataPos)[0] = ((FLOAT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[0];
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[1] = ((FLOAT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1]; ((FLOAT *)pNewDataPos)[1] = ((FLOAT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[1];
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[2] = 0.0f; ((FLOAT *)pNewDataPos)[2] = 0.0f;
((FLOAT *)&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew])[3] = ((FLOAT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[2]; ((FLOAT *)pNewDataPos)[3] = ((FLOAT*)&pOrigData[uiVertex * uiStride + dwPosOrig])[2];
break; break;
/*TODO /*TODO
@ -635,18 +610,23 @@ bool XTL::VertexPatcher::PatchStream(VertexPatchDesc *pPatchDesc,
*/ */
default: default:
// Generic 'conversion' - just make a copy : // Generic 'conversion' - just make a copy :
memcpy(&pNewData[uiVertex * pStreamPatch->ConvertedStride + dwPosNew], memcpy(pNewDataPos,
&pOrigData[uiVertex * uiStride + dwPosOrig], &pOrigData[uiVertex * uiStride + dwPosOrig],
pStreamPatch->pSizes[uiType]); pStreamPatch->pSizes[uiType]);
dwPosOrig += pStreamPatch->pSizes[uiType]; dwPosOrig += pStreamPatch->pSizes[uiType];
dwPosNew += pStreamPatch->pSizes[uiType];
break; break;
} } // switch
// Increment the new pointer :
pNewDataPos += pStreamPatch->pSizes[uiType];
} }
} }
if(!pPatchDesc->pVertexStreamZeroData) if(!pPatchDesc->pVertexStreamZeroData)
{ {
//if(pNewVertexBuffer != nullptr) // Dxbx addition
pNewVertexBuffer->Unlock(); pNewVertexBuffer->Unlock();
//if (pOrigVertexBuffer != nullptr) // Dxbx addition
pOrigVertexBuffer->Unlock(); pOrigVertexBuffer->Unlock();
if(FAILED(g_pD3DDevice8->SetStreamSource(uiStream, pNewVertexBuffer, pStreamPatch->ConvertedStride))) if(FAILED(g_pD3DDevice8->SetStreamSource(uiStream, pNewVertexBuffer, pStreamPatch->ConvertedStride)))