Migrasi Kode dari Pustaka Matematika XNA
Gambaran umum ini menjelaskan perubahan yang diperlukan untuk memigrasikan kode yang ada menggunakan pustaka Matematika XNA ke pustaka DirectXMath.
Perubahan Header
Pustaka DirectXMath menggunakan sekumpulan header baru.
xnamath.h
Ganti header dengan DirectXMath.h
, dan tambahkan DirectXPackedVector.h
untuk jenis paket GPU.
Jenis pembatas dari sampel Tabrakan DirectX SDK sekarang xnacollision.h
menjadi bagian dari pustaka DirectXMath di DirectXCollision.h
. Ini telah dimodifikasi untuk menggunakan kelas C++ daripada API gaya C.
Perubahan Konstanta
XNAMATH_VERSION (200, 201, 202, 203, 204, dan sebagainya) telah diganti dengan DIRECXTMATH_VERSION (300, 301, 302, 303, dan sebagainya).
Catatan
DirectXMath 3.00 dan 3.02 dikirim dengan versi awal Windows SDK. DirectXMath 3.03 berada dalam versi akhir SDK Windows 8.
Namaspace
Pustaka DirectXMath menggunakan namespace C++ untuk mengatur jenis. Matematika XNA hanya menggunakan namespace global. Jenis DirectXMath yang sama dengan Matematika XNA ada di namespace DirectX atau DirectX::P ackedVector .
Dalam file sumber C++, solusi sederhananya adalah menambahkan using
pernyataan.
#include "DirectXMath.h"
#include "DirectXPackedVector.h"
using namespace DirectX;
using namespace DirectX::PackedVector;
Untuk header, tidak dianggap sebagai praktik terbaik untuk menambahkan menggunakan pernyataan. Sebagai gantinya, tambahkan namespace yang sepenuhnya memenuhi syarat.
struct mystruct
{
DirectX::XMFLOAT3 position;
DirectX::PackedVector::HALF packedValue;
};
Beban Parsial
Untuk berbagai fungsi yang memuat kurang dari 4 elemen XMVECTOR, pustaka Matematika XNA membiarkan elemen tambahan tidak terdefinisi. DirectXMath akan selalu mengisi elemen tambahan ini dengan 0.
Penghapusan Tipe Spesifik Xbox 360
Jenis, fungsi, dan konstanta pustaka Matematika XNA berikut ini tidak tersedia di 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 tidak digunakan lagi. Gunakan XMVECTORI32 atau XMVECTORU32 sebagai gantinya.
Fungsi dan jenis berikut tidak digunakan lagi karena hanya Xbox 360: XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDEC4, XMLoadXDec4, XMStoreXDec4, XMXDEC4.
Intrinsik ARM-NEON
Mendeklarasikan konstanta vektor dengan kode ini akan dikompilasi untuk Matematika XNA untuk SSE dan NO-INTRINSICS, tetapi akan gagal untuk DirectXMath menggunakan ARM-NEON.
XMVECTOR v = { 1.f, 2.f, 3.f, 4.f }
Secara umum, kami tidak merekomendasikan metode inisialisasi XMVECTOR ini. Namun, jika Anda menginginkan konstanta vektor, kelas XMVECTORF32 mendukung gaya inisialisasi ini dan mengembalikan jenis XMVECTOR secara otomatis sehingga Anda dapat menggunakan XMVECTORF32 dalam sebagian besar konteks yang sama. Setiap operasi tulis ke kelas XMVECTORF32 memerlukan referensi eksplisit anggota .v XMVECTOR .
Permute
Pustaka Matematika XNA memiliki formulir berikut untuk permutus vektor umum:
XMVECTOR XMVectorPermuteControl(UINT ElementIndex0, UINT ElementIndex1, UINT ElementIndex2, UINT ElementIndex3);
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Control);
Untuk DirectXMath, XMVectorPermuteControl telah dihilangkan dan XM_PERMUTE_0X .. XM_PERMUTE_1Z konstanta telah ditentukan ulang menjadi indeks 0-7 sederhana. Berikut adalah tanda tangan baru untuk XMVectorPermute:
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW);
Alih-alih kata kontrol, fungsi ini secara langsung mengambil 4 indeks sebagai parameter, yang juga membuatnya dianalogikan dengan fungsi XMVectorSwizzle menggunakan XM_SWIZZLE_X baru . XM_SWIZZLE_W konstanta yang didefinisikan sebagai indeks 0-3 sederhana.
XMVECTOR XMVectorSwizzle(FXMVECTOR V, uint32_t E0, uint32_t E1, uint32_t E2, uint32_t E3);
Catatan
Untuk nilai konstanta, ada cara yang jauh lebih efisien untuk menerapkan permute. Alih-alih menggunakan bentuk fungsi XMVectorPermute, gunakan formulir templat :
template<uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW>
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2)</code></pre></td>
Formulir Templat
Secara umum, menggunakan formulir templat melalui bentuk fungsi dari fungsi berikut jauh lebih efisien dan memungkinkan pustaka untuk melakukan pengoptimalan khusus platform melalui spesialisasi templat.
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>
Fungsi yang Dihilangkan
Fungsi Yang Dihilangkan | Pengganti |
---|---|
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 |