Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
VR-demos
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nomad-lab
VR-demos
Commits
36ad6ac9
Commit
36ad6ac9
authored
May 15, 2018
by
Ruben Jesus Garcia Hernandez
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Early multiuser support for HTC Vive.
World status is saved in server.
parent
7cb30078
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
178 additions
and
40 deletions
+178
-40
OpenVR/TimestepData/hellovr_opengl_main.cpp
OpenVR/TimestepData/hellovr_opengl_main.cpp
+107
-28
proxy/Makefile
proxy/Makefile
+1
-1
proxy/proxy.cpp
proxy/proxy.cpp
+70
-11
No files found.
OpenVR/TimestepData/hellovr_opengl_main.cpp
View file @
36ad6ac9
...
...
@@ -257,6 +257,8 @@ private: // OpenGL bookkeeping
int
currentset
;
void
IncrementTimestep
();
void
DecrementTimestep
();
float
elapsedtime
;
static
const
float
videospeed
;
int
currentiso
;
...
...
@@ -353,6 +355,13 @@ private: // OpenGL bookkeeping
std
::
thread
*
tcpconn
;
void
connectTCP
();
int
sock
;
void
Send
(
char
c
,
int32_t
value
);
void
Send
(
char
c
,
bool
value
);
void
SendConfigFile
();
void
SendTimestep
();
void
SendIso
();
void
SendShowAtoms
();
};
const
float
CMainApplication
::
videospeed
=
0.01
f
;
...
...
@@ -453,6 +462,7 @@ void CMainApplication::connectTCP()
struct
sockaddr_in
serv_addr
;
struct
hostent
*
he
;
if
(
(
he
=
gethostbyname
(
server
)
)
==
nullptr
)
{
eprintf
(
"Connect to server, could not get host name %s
\n
"
,
server
);
return
;
/* error */
}
memset
((
char
*
)
&
serv_addr
,
0
,
sizeof
(
serv_addr
));
...
...
@@ -461,6 +471,7 @@ void CMainApplication::connectTCP()
serv_addr
.
sin_port
=
htons
(
port
);
sock
=
socket
(
AF_INET
,
SOCK_STREAM
,
IPPROTO_TCP
);
if
(
connect
(
sock
,
(
struct
sockaddr
*
)
&
serv_addr
,
sizeof
(
serv_addr
)))
{
eprintf
(
"Connect to server, could not get connection %s
\n
"
,
server
);
return
;
/* error */
}
//read state
...
...
@@ -473,32 +484,42 @@ void CMainApplication::connectTCP()
char
what
;
while
(
true
)
{
n
=
recv
(
sock
,
&
what
,
sizeof
(
what
),
0
);
if
(
n
<
1
)
if
(
n
<
1
)
{
eprintf
(
"closed socket
\n
"
);
return
;
}
switch
(
what
)
{
case
't'
:
n
=
recv
(
sock
,
(
char
*
)
&
tmp
,
sizeof
(
tmp
),
0
);
if
(
n
<
sizeof
(
tmp
))
if
(
n
<
sizeof
(
tmp
))
{
eprintf
(
"short read at socket
\n
"
);
return
;
}
currentset
=
ntohl
(
tmp
)
%
TIMESTEPS
;
break
;
case
'i'
:
n
=
recv
(
sock
,
(
char
*
)
&
tmp
,
sizeof
(
tmp
),
0
);
if
(
n
<
sizeof
(
tmp
))
if
(
n
<
sizeof
(
tmp
))
{
eprintf
(
"short read at socket
\n
"
);
return
;
}
currentiso
=
ntohl
(
tmp
)
%
(
ISOS
+
1
);
break
;
case
's'
:
char
s
;
n
=
recv
(
sock
,
&
s
,
sizeof
(
s
),
0
);
if
(
n
<
sizeof
(
s
))
if
(
n
<
sizeof
(
s
))
{
eprintf
(
"short read at socket
\n
"
);
return
;
}
showAtoms
=
(
bool
)
s
;
break
;
case
'n'
:
n
=
recv
(
sock
,
(
char
*
)
&
tmp
,
sizeof
(
tmp
),
0
);
if
(
n
<
sizeof
(
tmp
))
if
(
n
<
sizeof
(
tmp
))
{
eprintf
(
"short read at socket
\n
"
);
return
;
}
//load config file
if
(
currentConfig
!=
ntohl
(
tmp
)
%
myargc
)
{
currentConfig
=
ntohl
(
tmp
)
%
myargc
;
...
...
@@ -980,6 +1001,76 @@ void CMainApplication::Shutdown()
SDL_Quit
();
}
void
CMainApplication
::
Send
(
char
c
,
int32_t
value
)
{
if
(
sock
>=
0
)
{
int32_t
tmp
;
tmp
=
htonl
(
value
);
int
n
;
n
=
send
(
sock
,
&
c
,
sizeof
(
c
),
0
);
if
(
n
<
sizeof
(
c
))
{
closesocket
(
sock
);
sock
=-
1
;
}
n
=
send
(
sock
,
(
char
*
)
&
tmp
,
sizeof
(
tmp
),
0
);
if
(
n
<
sizeof
(
tmp
))
{
closesocket
(
sock
);
sock
=-
1
;
}
}
}
void
CMainApplication
::
Send
(
char
c
,
bool
value
)
{
if
(
sock
>=
0
)
{
int
n
;
n
=
send
(
sock
,
&
c
,
sizeof
(
c
),
0
);
if
(
n
<
sizeof
(
c
))
{
closesocket
(
sock
);
sock
=-
1
;
}
n
=
send
(
sock
,
(
char
*
)
&
value
,
1
,
0
);
if
(
n
<
1
)
{
closesocket
(
sock
);
sock
=-
1
;
}
}
}
void
CMainApplication
::
SendConfigFile
()
{
Send
(
'n'
,
currentConfig
);
}
void
CMainApplication
::
SendTimestep
()
{
Send
(
't'
,
currentset
);
}
void
CMainApplication
::
SendIso
()
{
Send
(
'i'
,
currentiso
);
}
void
CMainApplication
::
SendShowAtoms
()
{
Send
(
's'
,
showAtoms
);
}
void
CMainApplication
::
IncrementTimestep
()
{
currentset
++
;
if
(
currentset
>=
TIMESTEPS
)
currentset
=
0
;
SendTimestep
();
}
void
CMainApplication
::
DecrementTimestep
()
{
currentset
--
;
if
(
currentset
<
0
)
currentset
=
TIMESTEPS
-
1
;
SendTimestep
();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
...
...
@@ -1012,19 +1103,16 @@ bool CMainApplication::HandleInput()
}
//rgh: add keyboard navigation here
if
(
sdlEvent
.
key
.
keysym
.
sym
==
SDLK_1
)
{
currentset
++
;
if
(
currentset
>=
TIMESTEPS
)
currentset
=
0
;
IncrementTimestep
();
}
if
(
sdlEvent
.
key
.
keysym
.
sym
==
SDLK_2
)
{
currentset
--
;
if
(
currentset
<
0
)
currentset
=
TIMESTEPS
-
1
;
DecrementTimestep
();
}
if
(
sdlEvent
.
key
.
keysym
.
sym
==
SDLK_0
)
{
currentiso
++
;
if
(
currentiso
>
ISOS
)
currentiso
=
0
;
SendIso
();
}
if
(
sdlEvent
.
key
.
keysym
.
sym
==
SDLK_a
)
{
Matrix4
tmp
=
m_mat4HMDPose
;
...
...
@@ -1089,22 +1177,7 @@ bool CMainApplication::HandleInput()
currentConfig
++
;
if
(
currentConfig
>=
myargc
)
currentConfig
=
1
;
if
(
sock
>=
0
)
{
char
w
=
'c'
;
int32_t
tmp
;
tmp
=
htonl
(
currentConfig
);
int
n
;
n
=
send
(
sock
,
&
w
,
sizeof
(
w
),
0
);
if
(
n
<
sizeof
(
w
))
{
closesocket
(
sock
);
sock
=-
1
;
}
n
=
send
(
sock
,
(
char
*
)
&
tmp
,
sizeof
(
tmp
),
0
);
if
(
n
<
sizeof
(
tmp
))
{
closesocket
(
sock
);
sock
=-
1
;
}
}
SendConfigFile
();
CleanScene
();
LoadConfigFile
(
myargv
[
currentConfig
]);
SetupScene
();
...
...
@@ -1113,6 +1186,7 @@ bool CMainApplication::HandleInput()
currentConfig
--
;
if
(
currentConfig
<=
0
)
currentConfig
=
myargc
-
1
;
SendConfigFile
();
CleanScene
();
LoadConfigFile
(
myargv
[
currentConfig
]);
SetupScene
();
...
...
@@ -1131,8 +1205,10 @@ bool CMainApplication::HandleInput()
*/
if
(
firstdevice
==
unDevice
)
savetodisk
=
!
savetodisk
;
else
else
{
showAtoms
=
!
showAtoms
;
SendShowAtoms
();
}
}
else
if
(
buttonPressed
[
1
][
unDevice
]
&&
0
==
(
state
.
ulButtonTouched
&
vr
::
ButtonMaskFromId
(
vr
::
k_EButton_ApplicationMenu
))
&&
...
...
@@ -1161,10 +1237,12 @@ bool CMainApplication::HandleInput()
currentset
=
TIMESTEPS
-
1
;
else
if
(
currentset
>
TIMESTEPS
-
1
)
currentset
=
0
;
SendTimestep
();
}
else
{
currentiso
++
;
if
(
currentiso
>
ISOS
)
currentiso
=
0
;
SendIso
();
}
}
else
if
(
buttonPressed
[
0
][
unDevice
]
&&
(
(
state
.
ulButtonTouched
&
vr
::
ButtonMaskFromId
(
vr
::
k_EButton_Grip
))
==
0
&&
...
...
@@ -1197,6 +1275,7 @@ bool CMainApplication::HandleInput()
currentset
++
;
if
(
currentset
>=
TIMESTEPS
)
currentset
=
0
;
SendTimestep
();
}
}
}
...
...
proxy/Makefile
View file @
36ad6ac9
proxy
:
proxy.cpp Makefile
g++
-g
proxy.cpp
-o
proxy
g++
-
std
=
c++11
-
g
proxy.cpp
-o
proxy
clean
:
rm
-f
proxy.o proxy
proxy/proxy.cpp
View file @
36ad6ac9
...
...
@@ -74,7 +74,7 @@ bool initNewSocket (unsigned int secret)
tmp
=
htonl
(
state
.
iso
);
memcpy
(
buffer
+
6
,
&
tmp
,
sizeof
(
state
.
iso
));
buffer
[
10
]
=
's'
;
buffer
[
11
]
=
(
char
)
true
;
buffer
[
11
]
=
(
char
)
state
.
showatoms
;
buffer
[
12
]
=
'n'
;
tmp
=
htonl
(
state
.
ncfg
);
memcpy
(
buffer
+
13
,
&
tmp
,
sizeof
(
state
.
iso
));
...
...
@@ -110,6 +110,20 @@ bool initNewSocket (unsigned int secret)
return
true
;
}
int
myrecv
(
int
sock
,
char
*
buffer
,
int
len
,
int
flags
)
{
int
n
=
len
;
char
*
mybuff
=
buffer
;
int
r
;
do
{
r
=
recv
(
sock
,
mybuff
,
n
,
flags
);
if
(
r
<
0
)
return
r
;
mybuff
+=
r
;
n
-=
r
;
}
while
(
n
>
0
);
return
len
;
}
int
main
(
int
argc
,
char
*
argv
[])
{
unsigned
int
secret
;
...
...
@@ -205,45 +219,90 @@ for (;;) {
for
(
unsigned
i
=
1
;
i
<
sockfds
.
size
();
i
++
)
if
(
FD_ISSET
(
sockfds
[
i
],
&
read_fd_set
))
{
n
=
recv
(
sockfds
[
i
],
buffer
,
255
,
0
);
n
=
myrecv
(
sockfds
[
i
],
buffer
,
1
,
0
);
fprintf
(
stderr
,
"received %d bytes from socket %d
\n
"
,
n
,
i
);
if
(
n
<
0
)
{
//disconnected
printf
(
"client closed socket
\n
"
);
sockfds
[
i
]
=-
1
;
continue
;
}
buffer
[
n
]
=
0
;
if
(
n
<
0
)
error
(
"ERROR reading from socket"
);
if
(
n
==
0
)
error
(
"client closed socket, exiting"
);
if
(
n
==
0
)
{
printf
(
"client closed socket
\n
"
);
sockfds
[
i
]
=-
1
;
continue
;
}
printf
(
"Here is the message: %s
\n
"
,
buffer
);
printf
(
"Here is the message: '%s'
\n
"
,
buffer
);
//update state
if
(
buffer
[
0
]
==
't'
)
{
n
=
myrecv
(
sockfds
[
i
],
buffer
+
1
,
4
,
0
);
if
(
n
<
0
)
{
//disconnected
sockfds
[
i
]
=-
1
;
continue
;
}
int32_t
time
;
memcpy
(
&
time
,
buffer
+
1
,
sizeof
(
int32_t
));
time
=
ntohl
(
time
);
state
.
timestep
=
time
;
printf
(
"Timestep: %d
\n
"
,
time
);
}
else
if
(
buffer
[
0
]
==
'i'
)
{
n
=
myrecv
(
sockfds
[
i
],
buffer
+
1
,
4
,
0
);
if
(
n
<
0
)
{
//disconnected
sockfds
[
i
]
=-
1
;
continue
;
}
int32_t
iso
;
memcpy
(
&
iso
,
buffer
+
1
,
sizeof
(
int32_t
));
iso
=
ntohl
(
iso
);
state
.
timestep
=
iso
;
state
.
iso
=
iso
;
printf
(
"Iso: %d
\n
"
,
iso
);
}
else
if
(
buffer
[
0
]
==
'n'
)
{
n
=
myrecv
(
sockfds
[
i
],
buffer
+
1
,
4
,
0
);
if
(
n
<
0
)
{
//disconnected
sockfds
[
i
]
=-
1
;
continue
;
}
int32_t
ncfg
;
memcpy
(
&
ncfg
,
buffer
+
1
,
sizeof
(
int32_t
));
ncfg
=
ntohl
(
ncfg
);
state
.
timestep
=
ncfg
;
state
.
ncfg
=
ncfg
;
printf
(
"ncfg: %d
\n
"
,
ncfg
);
}
else
if
(
buffer
[
0
]
==
's'
)
{
n
=
myrecv
(
sockfds
[
i
],
buffer
+
1
,
1
,
0
);
if
(
n
<
0
)
{
//disconnected
sockfds
[
i
]
=-
1
;
continue
;
}
state
.
showatoms
=
buffer
[
1
]
!=
0
;
printf
(
"showatoms: %d
\n
"
,
state
.
showatoms
);
}
else
{
fprintf
(
stderr
,
"Unknown state request
%c
\n
"
,
buffer
[
0
]);
fprintf
(
stderr
,
"Unknown state request
'%c'
\n
"
,
buffer
[
0
]);
error
(
"unknown state"
);
}
for
(
unsigned
j
=
1
;
j
<
sockfds
.
size
();
j
++
)
{
n
=
send
(
sockfds
[
j
],
buffer
,
n
,
0
);
if
(
n
<
0
)
error
(
"ERROR writing to socket"
);
if
(
sockfds
[
j
]
>=
0
)
{
if
(
buffer
[
0
]
==
's'
)
n
=
2
;
else
n
=
5
;
n
=
send
(
sockfds
[
j
],
buffer
,
n
,
0
);
if
(
n
<
0
)
{
fprintf
(
stderr
,
"ERROR writing to socket, closing
\n
"
);
sockfds
[
j
]
=-
1
;
}
}
}
}
//unblockingly see if new connections were made and add to sockfds
if
(
FD_ISSET
(
sockfds
[
0
],
&
read_fd_set
))
{
if
(
initNewSocket
(
secret
));
if
(
initNewSocket
(
secret
))
{
printf
(
"Connected to new client
\n
"
);
FD_SET
(
sockfds
.
back
(),
&
active_fd_set
);
}
}
}
#ifdef WIN32
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment