Partager via


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 XNA Math 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 packed GPU .

Les types englobants de l’exemple collision du 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.).

Notes

DirectXMath 3.00 et 3.02 fournis avec les versions préliminaires du SDK Windows. DirectXMath 3.03 est dans la version finale du SDK Windows 8.

Espaces de noms

La bibliothèque DirectXMath utilise des espaces de noms C++ pour organiser les types. XNA Math utilisait uniquement l’espace de noms global. Les types DirectXMath en commun 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 using des instructions.

#include "DirectXMath.h"
#include "DirectXPackedVector.h"

using namespace DirectX; 
using namespace DirectX::PackedVector;

Pour les en-têtes, il n’est pas recommandé d’ajouter des instructions using. Ajoutez plutôt des espaces de noms complets.

struct mystruct
{
   DirectX::XMFLOAT3 position;
   DirectX::PackedVector::HALF packedValue;
};

Charges partielles

Pour les 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, fonctions et constantes de bibliothèques mathématiques XNA suivants 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, 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 ne recommandons pas cette méthode d’initialisation d’un 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 que vous puissiez utiliser XMVECTORF32 dans la plupart des mêmes contextes. Toutes les opérations d’écriture dans une classe XMVECTORF32 nécessitent un référencement explicite du membre XMVECTOR .v.

Permuter

La bibliothèque mathématique XNA avait la forme suivante pour la permutation vectorielle générale :

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 de simples indices 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 la rend également analogue à la fonction XMVectorSwizzle à l’aide de la nouvelle XM_SWIZZLE_X .. XM_SWIZZLE_W constantes définies comme de simples index 0-3.

XMVECTOR XMVectorSwizzle(FXMVECTOR V, uint32_t E0, uint32_t E1, uint32_t E2, uint32_t E3);

Notes

Pour les valeurs constantes, il existe un moyen beaucoup plus efficace d’implémenter la permutation. Au lieu d’utiliser la forme de fonction de XMVectorPermute, utilisez le formulaire de modèle :

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 par le biais de 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

Guide de programmation DirectXMath