Типы данных

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
cyber-z
Сообщения: 1
Зарегистрирован: 29 ноя 2017, 19:47

29 ноя 2017, 19:49

Доброго времени суток, форумчане! Имеется проблема: разбираю Oculus SDK а именно приложенные к нему примеры. Забегая наперед скажу, что в основном писал на C# и очень узконаправленные утилитки, поэтому и нуждаюсь в помощи в этой реализации на C++. В фрагменте кода, там где XMMatrixSet судя по всему идет оперирование с позицией Oculus Rift. Каким образом я могу сохранять эти значения в переменные типа double/float ?

Код: Выделить всё

#define STAGE4_ConfigureVR ovrEyeRenderDesc eyeRenderDesc[2];                                                                                               \
    eyeRenderDesc[0] = ovr_GetRenderDesc(session, ovrEye_Left, HMDInfo.DefaultEyeFov[0]);                                            \
    eyeRenderDesc[1] = ovr_GetRenderDesc(session, ovrEye_Right, HMDInfo.DefaultEyeFov[1]);                                           \
 
#define STAGE4_GetEyePoses ovrPosef EyeRenderPose[2];                                                                                                    \
    ovrPosef HmdToEyePose[2] = { eyeRenderDesc[0].HmdToEyePose, eyeRenderDesc[1].HmdToEyePose };                   \
    double           ftiming = ovr_GetPredictedDisplayTime(session, 0);                                                              \
    ovrTrackingState hmdState = ovr_GetTrackingState(session, ftiming, ovrTrue);                                                     \
    ovr_CalcEyePoses(hmdState.HeadPose.ThePose, HmdToEyePose, EyeRenderPose);
 
#define STAGE4_GetMatrices XMVECTOR eyeQuat = XMVectorSet(EyeRenderPose[eye].Orientation.x, EyeRenderPose[eye].Orientation.y,                                 \
    EyeRenderPose[eye].Orientation.z, EyeRenderPose[eye].Orientation.w);                                  \
    XMVECTOR eyePos = XMVectorSet(EyeRenderPose[eye].Position.x, EyeRenderPose[eye].Position.y, EyeRenderPose[eye].Position.z, 0);    \
    XMVECTOR CombinedPos = XMVectorAdd(mainCam.Pos, XMVector3Rotate(eyePos, mainCam.Rot));                                            \
    Camera finalCam(CombinedPos, (XMQuaternionMultiply(eyeQuat, mainCam.Rot)));                                                   \
    XMMATRIX view = finalCam.GetViewMatrix();                                                                                         \
    ovrMatrix4f p = ovrMatrix4f_Projection(eyeRenderDesc[eye].Fov, 0.2f, 1000.0f, ovrProjection_None);                                \
    XMMATRIX proj = XMMatrixSet(p.M[0][0], p.M[1][0], p.M[2][0], p.M[3][0], \
    p.M[0][1], p.M[1][1], p.M[2][1], p.M[3][1], \
    p.M[0][2], p.M[1][2], p.M[2][2], p.M[3][2], \
    p.M[0][3], p.M[1][3], p.M[2][3], p.M[3][3]);
P.S вопрос скорее к знанию синтаксиса C++, заранее благодарю за помощь
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

29 ноя 2017, 20:03

Очевидно что #define определяет макрос для тупой копипасты кода, в обход семантики С++. То есть вызов макроса

Код: Выделить всё

STAGE4_ConfigureVR;
после обработки препроцессором превращается в

Код: Выделить всё

ovrEyeRenderDesc eyeRenderDesc[2]; 
eyeRenderDesc[0] = ovr_GetRenderDesc(session, ovrEye_Left, HMDInfo.DefaultEyeFov[0]);
eyeRenderDesc[1] = ovr_GetRenderDesc(session, ovrEye_Right, HMDInfo.DefaultEyeFov[1]);           
Очевидно что этот код создает массив из двух структур ovrEyeRenderDesc, а потом каждой структуре присваиваются значения которые вернула функция ovr_GetRenderDesc().

Что там входит в структуру ovrEyeRenderDesc я не знаю.
2B OR NOT(2B) = FF
Ответить