Migración de código desde la biblioteca matemática de XNA

En esta introducción se describen los cambios necesarios para migrar código existente mediante la biblioteca matemática XNA a la biblioteca DirectXMath.

Cambios de encabezado

La biblioteca DirectXMath usa un nuevo conjunto de encabezados.

Reemplace el xnamath.h encabezado por DirectXMath.hy agregue DirectXPackedVector.h para los tipos empaquetados de GPU .

Los tipos de límite del ejemplo colisión del SDK de DirectX en xnacollision.h ahora forman parte de la biblioteca DirectXMath en DirectXCollision.h. Se han modificado para usar clases de C++ en lugar de una API de estilo C.

Cambios constantes

XNAMATH_VERSION (200, 201, 202, 203, 204, etc.) se ha reemplazado por DIRECXTMATH_VERSION (300, 301, 302, 303, etc.).

Nota

DirectXMath 3.00 y 3.02 se incluyen con versiones preliminares de Windows SDK. DirectXMath 3.03 está en la versión final del SDK de Windows 8.

Espacios de nombres

La biblioteca DirectXMath usa espacios de nombres de C++ para organizar los tipos. XNA Math solo usó el espacio de nombres global. Los tipos de DirectXMath en común con XNA Math se encuentran en el espacio de nombres DirectX::P ackedVector.

En los archivos de código fuente de C++, una solución sencilla consiste en agregar instrucciones using .

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

using namespace DirectX; 
using namespace DirectX::PackedVector;

En el caso de los encabezados, no se considera un procedimiento recomendado para agregar instrucciones using. En su lugar, agregue espacios de nombres completos.

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

Cargas parciales

Para varias funciones que cargan menos de 4 elementos de un XMVECTOR, la biblioteca math de XNA dejó los elementos adicionales sin definir. DirectXMath siempre rellenará estos elementos adicionales con 0.

Eliminación de tipos específicos de Xbox 360

Los siguientes tipos de biblioteca matemáticas de XNA, funciones y constantes no están disponibles en DirectXMath.

  • HENDN3, XMHEND3, XMUHENDN3, XMUHEND3, XMDHENN3, XMDHEN3, XMUDHENN3, XMUDHEN3
  • XMLoadHenDN3(), XMLoadHenD3(), XMLoadUHenDN3(), XMLoadUHenD3(), XMLoadDHenN3(), XMLoadDHen3(), XMLoadUDHenN3(), XMLoadUDHenn3()
  • XMStoreHenDN3(), XMStoreHenD3(), XMStoreUHenDN3(), XMStoreUHenD3(), XMStoreDHenN3(), XMStoreDHen3(), XMStoreUDHenn3(), XMStoreUDHenn3()
  • 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á en desuso. Use XMVECTORI32 o XMVECTORU32 en su lugar.

Las siguientes funciones y tipos están en desuso, ya que solo son Xbox 360: XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDEC4, XMLoadXDec4, XMStoreXDec4, XMXDEC4.

Intrínsecos arm-NEON

Al declarar una constante vectorial con este código, se compilará XNA Math para SSE y NO-INTRINSICS, pero se producirá un error en DirectXMath mediante ARM-NEON.

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

En general, no se recomienda este método de inicialización de un XMVECTOR. Sin embargo, si desea una constante vectorial, la clase XMVECTORF32 admite este estilo de inicialización y devuelve el tipo XMVECTOR automáticamente para que pueda usar XMVECTORF32 en la mayoría de los mismos contextos. Las operaciones de escritura en una clase XMVECTORF32 requieren hacer referencia explícitamente al miembro .v XMVECTOR .

Activar

La biblioteca matemática de XNA tenía la siguiente forma para el movimiento vectorial general:

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

Para DirectXMath, XMVectorPermuteControl se ha eliminado y el XM_PERMUTE_0X .. XM_PERMUTE_1Z constantes se han redefinido para ser índices simples de 0 a 7. Esta es la nueva firma para XMVectorPermute:

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

En lugar de una palabra de control, esta función toma directamente los 4 índices como parámetros, lo que también hace que sea análogo a la función XMVectorSwizzle mediante el nuevo XM_SWIZZLE_X .. XM_SWIZZLE_W constantes definidas como índices simples de 0 a 3.

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

Nota

En el caso de los valores constantes, hay una manera mucho más eficaz de implementar la permute. En lugar de usar el formato de función de XMVectorPermute, use el formulario de plantilla :

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

Formularios de plantilla

En general, el uso de un formulario de plantilla sobre una forma de función de las funciones siguientes es mucho más eficaz y permite que la biblioteca realice optimizaciones específicas de la plataforma a través de la especialización de plantillas.

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>

Funciones eliminadas

Función eliminada Replacement
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

Guía de programación de DirectXMath