Condividi tramite


Migrazione del codice dalla libreria matematica XNA

Questa panoramica descrive le modifiche necessarie per eseguire la migrazione del codice esistente usando la libreria Matematica XNA alla libreria DirectXMath.

Modifiche all'intestazione

La libreria DirectXMath usa un nuovo set di intestazioni.

Sostituire l'intestazione xnamath.h con DirectXMath.he aggiungere DirectXPackedVector.h per i tipi compressi della GPU .

I tipi di associazione dell'esempio directX SDK Collision in xnacollision.h fanno ora parte della libreria DirectXMath in DirectXCollision.h. Questi sono stati modificati per usare classi C++ anziché un'API in stile C.

Modifiche costanti

XNAMATH_VERSION (200, 201, 202, 203, 204 e così via) è stata sostituita con DIRECXTMATH_VERSION (300, 301, 302, 303 e così via).

Nota

DirectXMath 3.00 e 3.02 fornito con versioni preliminari di Windows SDK. DirectXMath 3.03 è nella versione finale dell'SDK di Windows 8.

Spazi dei nomi

La libreria DirectXMath usa spazi dei nomi C++ per organizzare i tipi. XNA Math usa solo lo spazio dei nomi globale. I tipi DirectXMath in comune con XNA Math si trovano nello spazio dei nomi DirectX o DirectX::P ackedVector .

Nei file di origine C++ una soluzione semplice consiste nell'aggiungere using istruzioni.

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

using namespace DirectX; 
using namespace DirectX::PackedVector;

Per le intestazioni, non è considerata la procedura consigliata per aggiungere istruzioni using. Aggiungere invece spazi dei nomi completi.

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

Caricamenti parziali

Per varie funzioni che caricano meno di 4 elementi di un XMVECTOR, la libreria matematica XNA ha lasciato gli elementi aggiuntivi non definiti. DirectXMath riempirà sempre questi elementi aggiuntivi con 0.

Rimozione di tipi specifici di Xbox 360

I tipi di libreria, le funzioni e le costanti XNA seguenti non sono disponibili in 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 è deprecato. Usare invece XMVECTORI32 o XMVECTORU32 .

Le funzioni e i tipi seguenti sono deprecati perché sono solo Xbox 360: XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDec4, XMLoadXDec4, XMStoreXDec4, XMXDEC4.

Intrinseci ARM-NEON

La dichiarazione di una costante vettore con questo codice verrà compilata per XNA Math for SSE e NO-INTRINSICS, ma avrà esito negativo per DirectXMath usando ARM-NEON.

XMVECTOR v = { 1.f, 2.f, 3.f, 4.f }

In generale, non è consigliabile questo metodo di inizializzazione di un XMVECTOR. Tuttavia, se si vuole una costante vettore, la classe XMVECTORF32 supporta questo stile di inizializzazione e restituisce automaticamente il tipo XMVECTOR in modo da poter usare XMVECTORF32 nella maggior parte dei contesti. Tutte le operazioni di scrittura in una classe XMVECTORF32 richiedono un riferimento esplicito al membro XMVECTOR .

Permute

La libreria matematica XNA aveva il formato seguente per il vettore generale permute:

XMVECTOR XMVectorPermuteControl(UINT ElementIndex0, UINT ElementIndex1, UINT ElementIndex2, UINT ElementIndex3);
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Control);

Per DirectXMath, XMVectorPermuteControl è stato eliminato e il XM_PERMUTE_0X .. XM_PERMUTE_1Z costanti sono state ridefinite in modo che siano semplici da 0 a 7 indici. Ecco la nuova firma per XMVectorPermute:

XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW);

Invece di una parola di controllo, questa funzione accetta direttamente i 4 indici come parametri, che lo rende analogo anche alla funzione XMVectorSwizzle usando il nuovo XM_SWIZZLE_X .. XM_SWIZZLE_W costanti definite come indici semplici da 0 a 3.

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

Nota

Per i valori costanti, esiste un modo molto più efficiente per implementare la permute. Invece di usare la forma di funzione di XMVectorPermute, usare il modulo modello :

template<uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW>
    XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2)</code></pre></td>

Moduli modello

In generale, l'uso di un modulo modello su una forma di funzione delle funzioni seguenti è molto più efficiente e consente alla libreria di eseguire ottimizzazioni specifiche della piattaforma tramite la specializzazione dei modelli.

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>

Funzioni eliminate

Funzione eliminata Sostituzione
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

Guida alla programmazione DirectXMath