Kodmigrering från XNA Math Library
Den här översikten beskriver de ändringar som krävs för att migrera befintlig kod med hjälp av XNA Math-biblioteket till DirectXMath-biblioteket.
Sidhuvudändringar
DirectXMath-biblioteket använder en ny uppsättning rubriker.
Ersätt xnamath.h
-huvudet med DirectXMath.h
och lägg till DirectXPackedVector.h
för GPU-paketerade typer.
Avgränsningstyperna från DirectX SDK-kollisionsexemplet i xnacollision.h
är nu en del av DirectXMath-biblioteket i DirectXCollision.h
. Dessa har ändrats för att använda C++-klasser i stället för ett API i C-format.
Konstanta ändringar
XNAMATH_VERSION (200, 201, 202, 203, 204 och så vidare) har ersatts med DIRECXTMATH_VERSION (300, 301, 302, 303 och så vidare).
Not
DirectXMath 3.00 och 3.02 levereras med preliminära versioner av Windows SDK. DirectXMath 3.03 är i den slutliga versionen av Windows 8 SDK.
Namnområden
DirectXMath-biblioteket använder C++-namnområden för att organisera typerna. XNA Math använde endast det globala namnområdet. DirectXMath-typerna som är gemensamma med XNA Math finns i DirectX- eller DirectX::P ackedVector namnrymd.
I C++-källfiler är en enkel lösning att lägga till using
-instruktioner.
#include "DirectXMath.h"
#include "DirectXPackedVector.h"
using namespace DirectX;
using namespace DirectX::PackedVector;
För rubriker anses det inte vara bästa praxis att lägga till med hjälp av -instruktioner. Lägg i stället till fullständigt kvalificerade namnområden.
struct mystruct
{
DirectX::XMFLOAT3 position;
DirectX::PackedVector::HALF packedValue;
};
Partiella inläsningar
För olika funktioner som läser in mindre än 4 element i en XMVECTOR lämnade XNA Math-biblioteket de ytterligare elementen odefinierade. DirectXMath fyller alltid dessa ytterligare element med 0.
Borttagning av Xbox 360-specifika typer
Följande XNA Math-bibliotekstyper, funktioner och konstanter är inte tillgängliga i DirectXMath.
- HENDN3, XMHEND3, XMUHENDN3, XMUHEND3, XMDHENN3, XMDHEN3, XMUDHENN3, XMUDHEN3
- XMLoadHenDN3(), XMLoadHenD3(), XMLoadUHenDN3(), XMLoadUHenD3(), XMLoadDHenN3(), XMLoadDHen3(), XMLoadUDHenN3(), XMLoadUDHen3()
- XMStoreHenDN3(), XMStoreHenD3(), XMStoreUHenDN3(), XMStoreUHenD3(), XMStoreDHenN3(), XMStoreDHen3(), XMStoreUDHenN3(), XMStoreUDHen3()
- g_XMMaskHenD3, g_XMMaskDHen3, g_XMAddUHenD3, g_XMAddHenD3, g_XMAddDHen, g_XMMulHenD3, g_XMMulDHen3, g_XMXorHenD3, g_XMXorDHen3
- XMXICON4, XMXICO4, XMICON4, XMICO4, XMUICON4, XMUICO4
- XMLoadXIcoN4(), XMLoadXIco4(), XMLoadIcoN4(), XMLoadIco4(), XMLoadUIcoN4(), XMLoadUIco4()
- XMStoreXIcoN4(), XMStoreXIco4() , XMStoreIcoN4(), XMStoreIco4(), XMStoreUIcoN4(), XMStoreUIco4()
- g_XMMaskIco4, g_XMXorXIco4, g_XMXorIco4, g_XMAddXIco4, g_XMAddUIco4, g_XMAddIco4, g_XMMulIco4
__vector4i är inaktuell. Använd XMVECTORI32 eller XMVECTORU32 i stället.
Följande funktioner och typer är inaktuella eftersom de endast är Xbox 360: XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDEC4, XMLoadXDec4, XMStoreXDec4, XMXDEC4.
ARM-NEON intrinsics
Om du deklarerar en vektorkonstant med den här koden kompileras för XNA Math för SSE och NO-INTRINSICS, men misslyckas för DirectXMath med ARM-NEON.
XMVECTOR v = { 1.f, 2.f, 3.f, 4.f }
I allmänhet rekommenderar vi inte den här metoden för initiering av en XMVECTOR-. Men om du vill ha en vektorkonstant stöder klassen XMVECTORF32 den här typen av initiering och returnerar XMVECTOR typ automatiskt så att du kan använda XMVECTORF32 i de flesta av samma kontexter. Skrivåtgärder till en XMVECTORF32-klass kräver att du uttryckligen refererar till .v XMVECTOR- medlem.
Permutera
XNA Math-biblioteket hade följande formulär för allmän vektorpermut:
XMVECTOR XMVectorPermuteControl(UINT ElementIndex0, UINT ElementIndex1, UINT ElementIndex2, UINT ElementIndex3);
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Control);
För DirectXMath har XMVectorPermuteControl eliminerats och XM_PERMUTE_0X .. XM_PERMUTE_1Z konstanter har omdefinierats till enkla 0-7 index. Här är den nya signaturen för XMVectorPermute:
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW);
I stället för ett kontrollord tar den här funktionen direkt 4-indexen som parametrar, vilket också gör den analog med funktionen XMVectorSwizzle med hjälp av den nya XM_SWIZZLE_X .. XM_SWIZZLE_W konstanter som definierats som enkla 0–3-index.
XMVECTOR XMVectorSwizzle(FXMVECTOR V, uint32_t E0, uint32_t E1, uint32_t E2, uint32_t E3);
Not
För konstanta värden finns det ett mycket effektivare sätt att implementera permut. I stället för att använda funktionsformen XMVectorPermuteanvänder du mallen formuläret:
template<uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW>
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2)</code></pre></td>
Mallformulär
I allmänhet är det mycket effektivare att använda ett mallformulär i en funktionsform av följande funktioner och gör att biblioteket kan utföra plattformsspecifika optimeringar genom mallspecialisering.
template<uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW>
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2)
template<uint32_t SwizzleX, uint32_t SwizzleY, uint32_t SwizzleZ, uint32_t SwizzleW>
XMVECTOR XMVectorSwizzle(FXMVECTOR V)
template<uint32_t Elements>
XMVECTOR XMVectorShiftLeft(FXMVECTOR V1, FXMVECTOR V2)
template<uint32_t Elements>
XMVECTOR XMVectorRotateLeft(FXMVECTOR V)
template<uint32_t Elements>
XMVECTOR XMVectorRotateRight(FXMVECTOR V)
template<uint32_t VSLeftRotateElements, uint32_t Select0, uint32_t Select1, uint32_t Select2, uint32_t Select3>
XMVECTOR XMVectorInsert(FXMVECTOR VD, FXMVECTOR VS)</code></pre></td>
Borttagna funktioner
Eliminerad funktion | Ersättning |
---|---|
XMStoreFloat3x3NC | XMStoreFloat3x3 |
XMStoreFloat4NC | XMStoreFloat4 |
XMStoreFloat4x3NC | XMStoreFloat4x3 |
XMStoreFloat4x4NC | XMStoreFloat4x4 |
XMStoreInt4NC | XMStoreInt4 |
XMVector2InBoundsR | XMVector2InBounds? XM_CRMASK_CR6BOUNDS : 0 |
XMVector2TransformStreamNC | XMVector2TransformStream |
XMVector3InBoundsR | XMVector3InBounds? XM_CRMASK_CR6BOUNDS : 0 |
XMVector3TransformStreamNC | XMVector3TransformStream |
XMVector4InBoundsR | XMVector4InBounds ? XM_CRMASK_CR6BOUNDS : 0 |
XMVectorCosHEst | XMVectorCosH |
XMVectorExpEst | XMVectorExp |
XMVectorLogEst | XMVectorLog |
XMVectorPowEst | XMVectorPow |
XMVectorSinHEst | XMVectorSinH |
XMVectorTanHEst | XMVectorTanH |