Partilhar via


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

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

Alterações de cabeçalho

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

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

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

Mudanças 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 fornecido com versões preliminares do SDK do Windows. O DirectXMath 3.03 está na versão final do SDK do Windows 8.

Espaços para nomes

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

Em arquivos de código-fonte 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 prática recomendada adicionar instruções usadas. 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 vetor XM, a biblioteca XNA Math deixou os elementos adicionais indefinidos. O DirectXMath sempre preencherá esses elementos adicionais com 0.

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

Os seguintes tipos, funções e constantes de biblioteca XNA Math 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

__vetor4i foi preterido. Em vez disso, use XMVECTORI32 ou XMVECTORU32.

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

ARM-NEON Intrínsecos

Declarar uma constante vetorial com este código será compilado para XNA Math para SSE e NO-INTRINSICS, mas falhará para 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 oferece suporte a esse estilo de inicialização e retorna o tipo de XMVECTOR automaticamente para que você possa usáXMVECTORF32 na maioria dos mesmos contextos. Qualquer operação de gravação em uma classe XMVECTORF32 requer referência explícita ao membro .v XMVECTOR.

Permutar

A biblioteca XNA Math tinha a seguinte forma para permuta vetorial 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. Aqui está 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, esta função toma diretamente os 4 índices como parâmetros, o que também a torna análoga à funçãoXMVectorSwizzle usando o novo XM_SWIZZLE_X .. XM_SWIZZLE_W constantes definidas como índices simples de 0-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 o permute. Em vez de usar a forma de função de XMVectorPermute, use o modelo formulário:

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, usar um formulário de modelo sobre um formulário de função das seguintes funções é muito mais eficiente e permite que a biblioteca faça otimizações específicas da plataforma por meio da especialização do 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