двоичный файл ‘-‘: ‘DirectX :: XMVECTOR’ не определяет этот оператор или преобразование (переход с xnamath на DirectXMath не так прост)

У меня есть код DirectX C ++, который использует xnamath.h, Я хотел перейти на «совершенно новый» DirectXMathИтак, я изменился:

#include <xnamath.h>

в

#include <DirectXMath.h>

Я также добавил DirectX пространство имен, например:

DirectX::XMFLOAT3 vector;

Я был готов к неприятностям, и вот они пришли!

Во время компиляции Я получил ошибку:

error C2676: binary '-' : 'DirectX::XMVECTOR' does not define this operator
or a conversion to a type acceptable to the predefined operator

Для линии, которая работала нормально для xnamth.h:

DirectX::XMVECTOR RayDir = CursorObjectSpace - RayOrigin;

Я действительно не знаю, как это исправить. Я не думаю что operator- больше не «поддерживается», но что может вызвать эту ошибку и как ее исправить?

Вот более сложный исходный код:

DirectX::XMVECTOR RayOrigin = DirectX::XMVectorSet(cPos.getX(), cPos.getY(), cPos.getZ(), 0.0f);
POINT mouse;
GetCursorPos(&mouse);

DirectX::XMVECTOR CursorScreenSpace = DirectX::XMVectorSet(mouse.x, mouse.y, 0.0f, 0.0f);

RECT windowRect;
GetWindowRect(*hwnd, &windowRect);
DirectX::XMVECTOR CursorObjectSpace = XMVector3Unproject( CursorScreenSpace, windowRect.left, windowRect.top, screenSize.getX(), screenSize.getY(), 0.0f, 1.0f, XMLoadFloat4x4(&activeCamera->getProjection()), XMLoadFloat4x4(&activeCamera->getView()), DirectX::XMMatrixIdentity());

DirectX::XMVECTOR RayDir = CursorObjectSpace - RayOrigin;

Я работаю на Windows 7 x64, цель проекта — отладка x32, и она работала нормально для xnamath.h до сих пор.


Рабочий решение было бы:

DirectX::XMVECTOR RayDir = DirectX::XMVectorSet( //write more, do less..
DirectX::XMVectorGetX(CursorObjectSpace) - DirectX::XMVectorGetX(RayOrigin),
DirectX::XMVectorGetY(CursorObjectSpace) - DirectX::XMVectorGetY(RayOrigin),
DirectX::XMVectorGetZ(CursorObjectSpace) - DirectX::XMVectorGetZ(RayOrigin),
DirectX::XMVectorGetW(CursorObjectSpace) - DirectX::XMVectorGetW(RayOrigin)
); //oh my God, I'm so creepy solution

Но это так жутко по сравнению с предыдущим, работает на xnamath:

    XMVECTOR RayDir = CursorObjectSpace - RayOrigin;

Я действительно не верю, что это единственный способ, и я не могу просто использовать operator- как выше.

У меня точно такая же проблема для operator/.

0

Решение

Microsoft обеспечивает перегрузки операторов в заголовке DirectXMathVector.inl, который включен в конец DirectXMath.h. Однако, чтобы иметь возможность его использовать, вы должны иметь «использование пространства имен DirectX» в области, в которой вы пытаетесь использовать оператор.

Например:

void CalculateRayDirection(const DirectX::XMVECTOR& rayOrigin, DirectX::XMVECTOR& rayDirection)
{
using namespace DirectX;

POINT mouse;
GetCursorPos(&mouse);
XMVECTOR CursorScreenSpace = XMVectorSet(mouse.x, mouse.y, 0.0f, 0.0f);

rayDirection = CursorObjectSpace - rayOrigin;
}
3

Другие решения

Операторы минус и деление для XMVector не перегружены, поскольку XMVector не является классом — это typedef для типа данных __m128, используемого для операций SSE.

При обновлении до DirectXMath Microsoft намеревалась ускорить векторные операции, сделав их «совместимыми с SSE». Они также предоставили функции XMVectorSubtract et al. чтобы позволить вам использовать SSE при выполнении арифметических операций.

Вы можете найти больше информации здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ee415656(v=vs.85).aspx

-1

По вопросам рекламы [email protected]