Поделиться через


Миграция кода из библиотеки математики XNA

В этом обзоре описываются изменения, необходимые для переноса существующего кода с помощью библиотеки математики XNA в библиотеку DirectXMath.

Изменения заголовка

Библиотека DirectXMath использует новый набор заголовков.

Замените заголовок xnamath.hDirectXMath.hи добавьте DirectXPackedVector.h для типов GPU, упакованных.

Ограничивающие типы из примера столкновения пакета SDK DirectX в xnacollision.h теперь являются частью библиотеки DirectXMath в DirectXCollision.h. Они были изменены для использования классов C++ вместо API в стиле C.

Изменения констант

XNAMATH_VERSION (200, 201, 202, 203, 204 и т. д.) заменены на DIRECXTMATH_VERSION (300, 301, 302, 303 и т. д.).

Заметка

DirectXMath 3.00 и 3.02 поставляется с предварительными версиями пакета SDK для Windows. DirectXMath 3.03 находится в окончательной версии пакета SDK для Windows 8.

Пространства имен

Библиотека DirectXMath использует пространства имен C++ для упорядочивания типов. XNA Math использовал только глобальное пространство имен. Типы DirectXMath, распространенные с XNA Math, находятся в пространстве имен DirectX или DirectX::P ackedVector.

В исходных файлах C++ простое решение заключается в добавлении using инструкций.

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

using namespace DirectX; 
using namespace DirectX::PackedVector;

Для заголовков рекомендуется добавлять инструкции using не рекомендуется. Вместо этого добавьте полные пространства имен.

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

Частичные нагрузки

Для различных функций, которые загружают менее 4 элементов XMVECTOR, библиотека математики XNA оставила дополнительные элементы неопределенными. DirectXMath всегда заполняет эти дополнительные элементы 0.

Удаление определенных типов Xbox 360

Следующие типы библиотек, функции и константы XNA недоступны в 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 не рекомендуется. Вместо этого используйте XMVECTORI32 или XMVECTORU32.

Следующие функции и типы устарели, так как они являются только Xbox 360: XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDEC4, XMLoadXDec4, XMStoreXDec4, XMXDEC4.

встроенные ARM-NEON

Объявление константы вектора с этим кодом будет компилироваться для XNA Math для SSE и NO-ВСТРОЕННЫХ ФУНКЦИЙ, но завершится сбоем для DirectXMath с помощью ARM-NEON.

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

Как правило, этот метод инициализации XMVECTORне рекомендуется. Однако если требуется векторная константа, класс XMVECTORF32 поддерживает этот стиль инициализации и возвращает автоматически тип XMVECTOR, чтобы использовать XMVECTORF32 в большинстве этих же контекстов. Для всех операций записи в класс XMVECTORF32 требуется явно ссылаться на элемент XMVECTOR .v.

Переставлять

Библиотека математики XNA имела следующую форму для общего векторного пермюта:

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

Для DirectXMath XMVectorPermuteControl был устранен и XM_PERMUTE_0X .. XM_PERMUTE_1Z константы были переопределены, чтобы быть простыми индексами 0-7. Ниже приведена новая подпись для XMVectorPermute:

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

Вместо слова элемента управления эта функция напрямую принимает 4 индекса в качестве параметров, что также делает его аналогом функции XMVectorSwizzle с помощью новой XM_SWIZZLE_X .. XM_SWIZZLE_W константы, определенные как простые индексы 0-3.

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

Заметка

Для константных значений существует гораздо более эффективный способ реализации пермута. Вместо использования формы функции XMVectorPermuteиспользуйте форму шаблона:

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

Формы шаблонов

Как правило, использование формы шаблона для формы функции следующих функций гораздо эффективнее и позволяет библиотеке выполнять оптимизацию платформы с помощью специализации шаблона.

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>

Устранены функции

Устраненная функция Замена
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

Руководство по программированию DirectXMath