Migração de código da Biblioteca de Matemática XNA
Essa visão geral descreve as alterações necessárias para migrar o código existente usando a biblioteca de Matemática XNA 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.h
e adicione DirectXPackedVector.h
para os tipos de 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
. Elas foram modificadas para usar classes C++ em vez de uma API no 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).
Nota
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. O XNA Math 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 instruções using
.
#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 usando. 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 de Matemática XNA 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 de biblioteca de 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 apenas Xbox 360: XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDEC4, XMLoadXDec4, XMStoreXDec4, XMXDEC4.
ARM-NEON Intrínsecos
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 oferecerá suporte a esse estilo de inicialização e retornará o tipo de XMVECTOR automaticamente para que você possa usar XMVECTORF32 na maioria dos mesmos contextos. Todas as operações de gravação em uma classe XMVECTORF32 exigem referenciar explicitamente o membro do XMVECTOR .v.
Permutar
A biblioteca de 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 4 índices como parâmetros, o que também a torna análoga à função XMVectorSwizzle usando a nova 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
Para valores constantes, há uma maneira muito mais eficiente de implementar o permute. Em vez de usar a forma de função 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 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 |
Tópicos relacionados
Guia de Programação DirectXMath