16#include "RenderingParameters.h"
17#include"../WindowAbstract.h"
25 this->portNumber = portNumber;
33 virtualExtrinsics.resize(viewNum);
34 virtualIntrasics.resize(viewNum);
37 staticPosition.resize(staticPoses);
38 staticQuaternion.resize(staticPoses);
40 for (
int i = 0; i < viewNum; i++) {
43 virtualExtrinsics[i].position = glm::vec3(0, 0, 0);
44 virtualExtrinsics[i].rotation = glm::vec3(0, 0, 0);
45 projectionType = InputProvider::ProjectionType::PROJECTION_PERSPECTIVE;
47 virtualIntrasics[i] = intra;
48 std::get<InputProvider::PerspectiveIntrinsics>(virtualIntrasics[i]).principle = glm::vec2(ext.width, ext.height) / 2.0f;
49 std::get<InputProvider::PerspectiveIntrinsics>(virtualIntrasics[i]).focals = glm::vec2(ext.width, ext.width) / 2.0f;
50 virtualIntrasics.push_back(intra);
61 serverIsActive =
false;
68 for (
int i = 0; i < virtualExtrinsics.size(); i++) {
69 virtualExtrinsics[i].position = translation;
70 virtualExtrinsics[i].rotation = rotation;
76 virtualExtrinsics[view].position = translation;
77 virtualExtrinsics[view].rotation = rotation;
79 auto tl = std::tan(fov[0]);
80 auto tr = std::tan(fov[1]);
81 auto tt = std::tan(fov[2]);
82 auto tb = std::tan(fov[3]);
90 if (
projectionType == InputProvider::ProjectionType::PROJECTION_PERSPECTIVE) {
91 std::get<InputProvider::PerspectiveIntrinsics>(virtualIntrasics[view]).focals.x =
virtualViewDef[view].x / tw;
92 std::get<InputProvider::PerspectiveIntrinsics>(virtualIntrasics[view]).focals.y =
virtualViewDef[view].y / th;
95 std::get<InputProvider::PerspectiveIntrinsics>(virtualIntrasics[view]).principle.x = x0 *
virtualViewDef[view].x;
96 std::get<InputProvider::PerspectiveIntrinsics>(virtualIntrasics[view]).principle.y = (1 - y0) *
virtualViewDef[view].y;
99 throw std::runtime_error(
"Unsupported projection type for virtual parameter");
108 glm::vec3 averagePos = { 0,0,0 };
109 for (
int i = 0; i < virtualExtrinsics.size(); i++) {
110 averagePos += virtualExtrinsics[i].position;
112 averagePos /= virtualExtrinsics.size();
114 if (virtualMode == VirtualMode::Static1) {
115#ifdef HVT_UDP_CONTROL
118 pose.position = staticPosition[0] + (virtualExtrinsics[view].position - averagePos );
119 pose.rotation = quatToEuler(staticQuaternion[0]);
120#ifdef HVT_UDP_CONTROL
125 else if (virtualMode == VirtualMode::Static2) {
126#ifdef HVT_UDP_CONTROL
129 pose.position = staticPosition[1] + (virtualExtrinsics[view].position - averagePos );
130 pose.rotation = quatToEuler(staticQuaternion[1]);
131#ifdef HVT_UDP_CONTROL
136 assert(virtualExtrinsics.size() > view);
137 pose = virtualExtrinsics[view];
144 assert(virtualIntrasics.size() > view);
145 return virtualIntrasics[view];
150#ifdef HVT_UDP_CONTROL
153 startingPosition = startPos;
154 startingRotation = startRot;
155#ifdef HVT_UDP_CONTROL
156 startPosMut.unlock();
162#ifdef HVT_UDP_CONTROL
165 const glm::vec3 res = glm::vec3(startingPosition);
166#ifdef HVT_UDP_CONTROL
167 startPosMut.unlock();
174#ifdef HVT_UDP_CONTROL
177 const glm::vec3 res = glm::vec3(startingRotation);
178#ifdef HVT_UDP_CONTROL
179 startPosMut.unlock();
184#ifdef HVT_UDP_CONTROL
185void RenderingParameters::setupUDPServer()
189 struct sockaddr_in client, server;
197 int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
199 printf(
"WSAStartup failed with error: %d\n", iResult);
200 throw std::runtime_error(
"WSAStartup");
205 if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
208 auto dw = GetLastError();
209 LPSTR messageBuffer =
nullptr;
213 size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
214 NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
217 std::string message(messageBuffer, size);
219 throw std::runtime_error(
"socket error" + message);
221 LocalFree(messageBuffer);
225 tcperror(
"socket()");
226 throw std::runtime_error(
"socket error");
230 server.sin_family = AF_INET;
231 server.sin_port = htons(portNumber);
232 server.sin_addr.s_addr = INADDR_ANY;
234 if (bind(s, (
struct sockaddr*)&server,
sizeof(server)) < 0)
238 throw std::runtime_error(
"bind error");
241 throw std::runtime_error(
"bind error");
248 if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (
char*) &tv,
sizeof(tv)) < 0) {
253 namelen =
sizeof(server);
254 if (getsockname(s, (
struct sockaddr*)&server, &namelen) < 0)
258 throw std::runtime_error(
"error sockName");
260 tcperror(
"getsockname()");
261 throw std::runtime_error(
"error sockName");
266 PRINT(
"Port assigned is %d\n", ntohs(server.sin_port));
268 serverThread = std::thread([
this] { this->mainLoop(); });
271void RenderingParameters::mainLoop()
273 while (serverIsActive) {
274 client_address_size =
sizeof(client);
276 if (recvfrom(s, (
char*)&udpMsg,
sizeof(UDPMessage), 0, (
struct sockaddr*)&client,
277 &client_address_size) < 0)
280 auto dw = GetLastError();
281 LPSTR messageBuffer =
nullptr;
284 size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
285 NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
287 std::string message(messageBuffer, size);
289 if (!message.empty() > 0) {
290 D(PRINT(
"On port %d message: %s", ntohs(server.sin_port), message.c_str());)
295 tcperror(
"recvfrom()");
301 assert(udpMsg.magic == magicNb);
303 PRINT(
"Requested mode: %f", udpMsg.mode);
304 PRINT(
"Received position: %f,%f,%f", udpMsg.viewTransx, udpMsg.viewTransy, udpMsg.viewTransz);
305 PRINT(
"Received rotation: %f,%f,%f,%f", udpMsg.viewRotx, udpMsg.viewRoty, udpMsg.viewRotz, udpMsg.viewRotw);
309 if (udpMsg.mode == 0) {
310 virtualMode = VirtualMode::Tracking;
312 else if (udpMsg.mode == 1) {
313 virtualMode = VirtualMode::Static1;
314 staticPosition[0] = { udpMsg.viewTransx, udpMsg.viewTransy, udpMsg.viewTransz };
315 staticQuaternion[0] = { udpMsg.viewRotx, udpMsg.viewRoty, udpMsg.viewRotz, udpMsg.viewRotw };
318 else if (udpMsg.mode == 2) {
319 virtualMode = VirtualMode::Static2;
320 staticPosition[1] = { udpMsg.viewTransx, udpMsg.viewTransy, udpMsg.viewTransz };
321 staticQuaternion[1] = { udpMsg.viewRotx, udpMsg.viewRoty, udpMsg.viewRotz, udpMsg.viewRotw };
324 PRINT(
"UDP MESSAGE: Invalid mode requested");
329 PRINT(
"Camera Activation %f", udpMsg.cameras);
334 const auto nbCam = actVector.size();
336 std::vector<bool> activations;
338 for (
int i = 0; i < nbCam; i++) {
339 bool cam = int(udpMsg.cameras / std::pow(10, nbCam - i - 1)) % 2;
340 activations.push_back(cam);
341 if (cam != actVector[i]) {
352 PRINT(
"Value for reset: %f", udpMsg.reset);
354 if (udpMsg.reset == 1) {
356 glm::vec3 startP = {udpMsg.initTransx,udpMsg.initTransy,udpMsg.initTransz};
357 glm::quat startQ = {udpMsg.initRotx,udpMsg.initRoty, udpMsg.initRotz,udpMsg.initRotw};
359 PRINT(
"Received reset position: %f,%f,%f", udpMsg.initTransx, udpMsg.initTransy, udpMsg.initTransz);
360 PRINT(
"Received reset rotation: %f,%f,%f,%f", udpMsg.initRotx, udpMsg.initRoty, udpMsg.initRotz, udpMsg.initRotw);
364 startingPosition = startP;
365 startingRotation = quatToEuler(startQ);
367 startPosMut.unlock();
Class that contains helper functions for Vulkan.
file that contains the VulkanWrapper class that manages the classes related to Vulkan code and ease t...
void setStartingPt(glm::vec3 startPos, glm::vec3 startRot)
const InputProvider::Extrinsics getVirtualExtrinsics(int view)
const glm::vec3 getStartingPosition()
const glm::vec3 getStartingRotation()
std::vector< glm::vec2 > virtualViewDef
void updateSpaceTransform(glm::vec3 translation, glm::vec3 rotation)
InputProvider::ProjectionType projectionType
void init(int view, WindowAbstract *window, VulkanWrapper *wraps)
const InputProvider::Intrinsics getVirtualIntrinsics(int view)
Class that manages the classes related to Vulkan code and act as a wrapper around them.
std::vector< bool > getCameraActivation()
void setCameraActivation(std::vector< bool > activation)
Abstraction of the way of the result is displayed (screen or HMD).
virtual void resetOrigin()=0
virtual vk::Extent2D getSwapchainExtent(int view)