Codemigration aus der XNA Math Library
In dieser Übersicht werden die Änderungen beschrieben, die erforderlich sind, um vorhandenen Code mithilfe der XNA Math-Bibliothek zur DirectXMath-Bibliothek zu migrieren.
Headeränderungen
Die DirectXMath-Bibliothek verwendet einen neuen Satz von Headern.
Ersetzen Sie den xnamath.h
Header durch DirectXMath.h
, und fügen Sie für die GPU-gepackten Typen hinzuDirectXPackedVector.h
.
Die Begrenzungstypen aus dem DirectX SDK-Kollisionsbeispiel in xnacollision.h
sind jetzt Teil der DirectXMath-Bibliothek in DirectXCollision.h
. Diese wurden so geändert, dass sie C++-Klassen anstelle einer API im C-Stil verwenden.
Konstante Änderungen
XNAMATH_VERSION (200, 201, 202, 203, 204 usw.) wurde durch DIRECXTMATH_VERSION (300, 301, 302, 303 usw.) ersetzt.
Hinweis
DirectXMath 3.00 und 3.02 wurden mit vorläufigen Versionen des Windows SDK ausgeliefert. DirectXMath 3.03 ist in der endgültigen Version des Windows 8 SDK enthalten.
Namespaces
Die DirectXMath-Bibliothek verwendet C++-Namespaces, um die Typen zu organisieren. XNA Math hat nur den globalen Namespace verwendet. Die DirectXMath-Typen, die XNA Math gemeinsam haben, befinden sich im DirectX - oder DirectX::P ackedVector-Namespace .
In C++-Quelldateien besteht eine einfache Lösung darin, Anweisungen hinzuzufügen using
.
#include "DirectXMath.h"
#include "DirectXPackedVector.h"
using namespace DirectX;
using namespace DirectX::PackedVector;
Für Header gilt es nicht als bewährte Methode, using-Anweisungen hinzuzufügen. Fügen Sie stattdessen vollqualifizierte Namespaces hinzu.
struct mystruct
{
DirectX::XMFLOAT3 position;
DirectX::PackedVector::HALF packedValue;
};
Teilweise Ladevorgänge
Für verschiedene Funktionen, die weniger als 4 Elemente eines XMVECTOR laden, ließ die XNA Math-Bibliothek die zusätzlichen Elemente nicht definiert. DirectXMath füllt diese zusätzlichen Elemente immer mit 0 aus.
Entfernung von Xbox 360 spezifischen Typen
Die folgenden XNA Math-Bibliothekstypen, -Funktionen und -Konstanten sind in DirectXMath nicht verfügbar.
- 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 ist veraltet. Verwenden Sie stattdessen XMVECTORI32 oder XMVECTORU32 .
Die folgenden Funktionen und Typen sind veraltet, da sie nur Xbox 360 sind: XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDEC4, XMLoadXDec4, XMLoadXDec4, XMStoreXDec4, XMXDEC4.
ARM-NEON Intrinsiken
Das Deklarieren einer Vektorkonstante mit diesem Code wird für XNA Math for SSE und NO-INTRINSICS kompiliert, schlägt jedoch für DirectXMath mit ARM-NEON fehl.
XMVECTOR v = { 1.f, 2.f, 3.f, 4.f }
Im Allgemeinen wird diese Methode zur Initialisierung eines XMVECTOR nicht empfohlen. Wenn Sie jedoch eine Vektorkonstante benötigen, unterstützt die XMVECTORF32-Klasse diese Art der Initialisierung und gibt den XMVECTOR-Typ automatisch zurück, sodass Sie XMVECTORF32 in den meisten der gleichen Kontexte verwenden können. Alle Schreibvorgänge in eine XMVECTORF32-Klasse erfordern explizit den Verweis auf das XMVECTOR-Element .v.
Permute
Die XNA Math-Bibliothek hatte die folgende Form für die allgemeine Vektorpermute:
XMVECTOR XMVectorPermuteControl(UINT ElementIndex0, UINT ElementIndex1, UINT ElementIndex2, UINT ElementIndex3);
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Control);
Für DirectXMath wurde XMVectorPermuteControl entfernt und die XM_PERMUTE_0X .. XM_PERMUTE_1Z Konstanten wurden in einfache 0-7-Indizes neu definiert. Hier ist die neue Signatur für XMVectorPermute:
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW);
Anstelle eines Steuerworts verwendet diese Funktion direkt die 4 Indizes als Parameter, wodurch sie auch analog zur XMVectorSwizzle-Funktion mit dem neuen XM_SWIZZLE_X . XM_SWIZZLE_W Konstanten, die als einfache 0-3-Indizes definiert sind.
XMVECTOR XMVectorSwizzle(FXMVECTOR V, uint32_t E0, uint32_t E1, uint32_t E2, uint32_t E3);
Hinweis
Für konstante Werte gibt es eine viel effizientere Möglichkeit, permute zu implementieren. Anstatt das Funktionsformular von XMVectorPermute zu verwenden, verwenden Sie das Vorlagenformular :
template<uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW>
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2)</code></pre></td>
Vorlagenformulare
Im Allgemeinen ist die Verwendung eines Vorlagenformulars über eine Funktionsform der folgenden Funktionen viel effizienter und ermöglicht es der Bibliothek, plattformspezifische Optimierungen durch Vorlagenspezialisierung durchzuführen.
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>
Entfernte Funktionen
Entfernte Funktion | Ersetzung |
---|---|
XMStoreFloat3x3NC | XMStoreFloat3x3x3 |
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 |