Migration de code à partir de la bibliothèque mathématique XNA
Cette vue d’ensemble décrit les modifications requises pour migrer du code existant à l’aide de la bibliothèque mathématique XNA vers la bibliothèque DirectXMath.
Modifications de l’en-tête
La bibliothèque DirectXMath utilise un nouvel ensemble d’en-têtes.
Remplacez l’en-tête xnamath.h
par DirectXMath.h
, puis ajoutez DirectXPackedVector.h
pour les types GPU packés.
Les types englobants de l’exemple Collision du Kit de développement logiciel (SDK) DirectX dans xnacollision.h
font désormais partie de la bibliothèque DirectXMath dans DirectXCollision.h
. Celles-ci ont été modifiées pour utiliser des classes C++ plutôt qu’une API de style C.
Modifications constantes
XNAMATH_VERSION (200, 201, 202, 203, 204, etc.) a été remplacé par DIRECXTMATH_VERSION (300, 301, 302, 303, etc.).
Note
DirectXMath 3.00 et 3.02 fourni avec des versions préliminaires du Kit de développement logiciel (SDK) Windows. DirectXMath 3.03 se trouve dans la version finale du Kit de développement logiciel (SDK) Windows 8.
Espaces de noms
La bibliothèque DirectXMath utilise des espaces de noms C++ pour organiser les types. XNA Math n’a utilisé que l’espace de noms global. Les types DirectXMath courants avec XNA Math se trouvent dans l’espace de noms DirectX ou DirectX ::P ackedVector .
Dans les fichiers sources C++, une solution simple consiste à ajouter des instructions using
.
#include "DirectXMath.h"
#include "DirectXPackedVector.h"
using namespace DirectX;
using namespace DirectX::PackedVector;
Pour les en-têtes, il n’est pas considéré comme recommandé d’ajouter des instructions using. Au lieu de cela, ajoutez des espaces de noms complets.
struct mystruct
{
DirectX::XMFLOAT3 position;
DirectX::PackedVector::HALF packedValue;
};
Chargements partiels
Pour différentes fonctions qui chargent moins de 4 éléments d’un XMVECTOR, la bibliothèque mathématique XNA a laissé les éléments supplémentaires non définis. DirectXMath remplira toujours ces éléments supplémentaires avec 0.
Suppression de types spécifiques Xbox 360
Les types de bibliothèques mathématiques XNA suivants, les fonctions et les constantes ne sont pas disponibles dans 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 est déconseillé. Utilisez XMVECTORI32 ou XMVECTORU32 à la place.
Les fonctions et types suivants sont déconseillés, car ils sont Xbox 360 uniquement : XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDEC4, XMLoadXDec4, XMStoreXDec4, XMStoreXDec4, XMXDEC4.
intrinsèques ARM-NEON
La déclaration d’une constante vectorielle avec ce code est compilée pour XNA Math pour SSE et NO-INTRINSICS, mais échoue pour DirectXMath à l’aide d’ARM-NEON.
XMVECTOR v = { 1.f, 2.f, 3.f, 4.f }
En général, nous vous déconseillons cette méthode d’initialisation d’une XMVECTOR. Toutefois, si vous souhaitez une constante vectorielle, la classe XMVECTORF32 prend en charge ce style d’initialisation et retourne automatiquement le type XMVECTOR afin de pouvoir utiliser XMVECTORF32 dans la plupart des mêmes contextes. Toutes les opérations d’écriture dans une classe XMVECTORF32 nécessitent de référencer explicitement le membre .v XMVECTOR.
Permuter
La bibliothèque mathématique XNA avait la forme suivante pour la permute de vecteur général :
XMVECTOR XMVectorPermuteControl(UINT ElementIndex0, UINT ElementIndex1, UINT ElementIndex2, UINT ElementIndex3);
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Control);
Pour DirectXMath, XMVectorPermuteControl a été éliminé et le XM_PERMUTE_0X .. XM_PERMUTE_1Z constantes ont été redéfinies pour être des indices simples de 0 à 7. Voici la nouvelle signature pour XMVectorPermute :
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW);
Au lieu d’un mot de contrôle, cette fonction prend directement les 4 index en tant que paramètres, ce qui le rend également analogue à la fonction XMVectorSwizzle à l’aide du nouveau XM_SWIZZLE_X .. XM_SWIZZLE_W constantes définies comme des index de 0 à 3 simples.
XMVECTOR XMVectorSwizzle(FXMVECTOR V, uint32_t E0, uint32_t E1, uint32_t E2, uint32_t E3);
Note
Pour les valeurs constantes, il existe un moyen beaucoup plus efficace d’implémenter la permute. Au lieu d’utiliser la forme de fonction de XMVectorPermute, utilisez le modèle formulaire :
template<uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW>
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2)</code></pre></td>
Formulaires de modèle
En général, l’utilisation d’un formulaire de modèle sur une forme de fonction des fonctions suivantes est beaucoup plus efficace et permet à la bibliothèque d’effectuer des optimisations spécifiques à la plateforme via la spécialisation du modèle.
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>
Fonctions supprimées
Fonction éliminée | Remplacement |
---|---|
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 |