Redid it, works
This commit is contained in:
parent
84be4bb04f
commit
843400b54f
|
@ -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)))
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue