Share via


Migração de código da biblioteca matemática XNA

Essa visão geral descreve as alterações necessárias para migrar o código existente usando a biblioteca matemática XNA para a biblioteca DirectXMath.

Alterações de cabeçalho

A biblioteca DirectXMath usa um novo conjunto de cabeçalhos.

Substitua o xnamath.h cabeçalho por DirectXMath.he adicione DirectXPackedVector.h para os tipos empacotados de GPU .

Os tipos delimitadora do exemplo de Colisão do SDK do DirectX no xnacollision.h agora fazem parte da biblioteca DirectXMath em DirectXCollision.h. Eles foram modificados para usar classes C++ em vez de uma API de estilo C.

Alterações constantes

XNAMATH_VERSION (200, 201, 202, 203, 204 e assim por diante) foi substituído por DIRECXTMATH_VERSION (300, 301, 302, 303 e assim por diante).

Observação

DirectXMath 3.00 e 3.02 fornecidos com versões preliminares do SDK do Windows. O DirectXMath 3.03 está na versão final do SDK do Windows 8.

Namespaces

A biblioteca DirectXMath usa namespaces C++ para organizar os tipos. A Matemática XNA usou apenas o namespace global. Os tipos DirectXMath em comum com o XNA Math estão no DirectX ou no namespace DirectX::P ackedVector .

Em arquivos de origem C++, uma solução simples é adicionar using instruções.

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

using namespace DirectX; 
using namespace DirectX::PackedVector;

Para cabeçalhos, não é considerada a melhor prática adicionar instruções using. Em vez disso, adicione namespaces totalmente qualificados.

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

Cargas parciais

Para várias funções que carregam menos de 4 elementos de um XMVECTOR, a biblioteca matemática XNA deixou os elementos adicionais indefinidos. DirectXMath sempre preencherá esses elementos adicionais com 0.

Remoção de tipos específicos do Xbox 360

Os seguintes tipos de biblioteca matemática XNA, funções e constantes não estão disponíveis no 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 foi preterido. Em vez disso , use XMVECTORI32 ou XMVECTORU32 .

As seguintes funções e tipos são preteridos, pois são somente Xbox 360: XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDEC4, XMLoadXDec4, XMStoreXDec4, XMXDEC4.

Intrínsecos ARM-NEON

Declarar uma constante de vetor com esse código será compilado para Matemática XNA para SSE e NO-INTRINSICS, mas falhará no DirectXMath usando ARM-NEON.

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

Em geral, não recomendamos esse método de inicialização de um XMVECTOR. No entanto, se você quiser uma constante de vetor, a classe XMVECTORF32 dá suporte a esse estilo de inicialização e retorna o tipo XMVECTOR automaticamente para que você possa usar XMVECTORF32 na maioria dos mesmos contextos. Todas as operações de gravação para uma classe XMVECTORF32 exigem referência explícita ao membro .v XMVECTOR .

Permutar

A biblioteca matemática XNA tinha o seguinte formulário para permute de vetor geral:

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

Para DirectXMath, XMVectorPermuteControl foi eliminado e o XM_PERMUTE_0X .. XM_PERMUTE_1Z constantes foram redefinidas para serem índices simples de 0 a 7. Esta é a nova assinatura para XMVectorPermute:

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

Em vez de uma palavra de controle, essa função usa diretamente os quatro índices como parâmetros, o que também a torna análoga à função XMVectorSwizzle usando o novo 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);

Observação

Para valores constantes, há uma maneira muito mais eficiente de implementar permute. Em vez de usar a forma de função de XMVectorPermute, use o formulário de modelo :

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

Formulários de modelo

Em geral, o uso de um formulário de modelo em uma forma de função das funções a seguir é muito mais eficiente e permite que a biblioteca faça otimizações específicas da plataforma por meio da especialização de modelo.

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>

Funções eliminadas

Função Eliminada Substituição
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

Guia de programação do DirectXMath