Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
godot
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
community
godot
Commits
53564233
Commit
53564233
authored
Mar 15, 2018
by
Bastiaan Olij
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
A few fixes on the ARVR Server
parent
506c4926
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
73 additions
and
4 deletions
+73
-4
arvr_server.cpp
servers/arvr_server.cpp
+50
-0
arvr_server.h
servers/arvr_server.h
+17
-0
visual_server_viewport.cpp
servers/visual/visual_server_viewport.cpp
+6
-4
No files found.
servers/arvr_server.cpp
View file @
53564233
...
...
@@ -44,6 +44,7 @@ void ARVRServer::_bind_methods() {
ClassDB
::
bind_method
(
D_METHOD
(
"set_world_scale"
),
&
ARVRServer
::
set_world_scale
);
ClassDB
::
bind_method
(
D_METHOD
(
"get_reference_frame"
),
&
ARVRServer
::
get_reference_frame
);
ClassDB
::
bind_method
(
D_METHOD
(
"center_on_hmd"
,
"rotation_mode"
,
"keep_height"
),
&
ARVRServer
::
center_on_hmd
);
ClassDB
::
bind_method
(
D_METHOD
(
"get_hmd_transform"
),
&
ARVRServer
::
get_hmd_transform
);
ADD_PROPERTY
(
PropertyInfo
(
Variant
::
REAL
,
"world_scale"
),
"set_world_scale"
,
"get_world_scale"
);
...
...
@@ -54,8 +55,13 @@ void ARVRServer::_bind_methods() {
ClassDB
::
bind_method
(
D_METHOD
(
"get_tracker_count"
),
&
ARVRServer
::
get_tracker_count
);
ClassDB
::
bind_method
(
D_METHOD
(
"get_tracker"
,
"idx"
),
&
ARVRServer
::
get_tracker
);
ClassDB
::
bind_method
(
D_METHOD
(
"get_primary_interface"
),
&
ARVRServer
::
get_primary_interface
);
ClassDB
::
bind_method
(
D_METHOD
(
"set_primary_interface"
,
"interface"
),
&
ARVRServer
::
set_primary_interface
);
ClassDB
::
bind_method
(
D_METHOD
(
"get_last_process_usec"
),
&
ARVRServer
::
get_last_process_usec
);
ClassDB
::
bind_method
(
D_METHOD
(
"get_last_commit_usec"
),
&
ARVRServer
::
get_last_commit_usec
);
ClassDB
::
bind_method
(
D_METHOD
(
"get_last_frame_usec"
),
&
ARVRServer
::
get_last_frame_usec
);
BIND_ENUM_CONSTANT
(
TRACKER_CONTROLLER
);
BIND_ENUM_CONSTANT
(
TRACKER_BASESTATION
);
BIND_ENUM_CONSTANT
(
TRACKER_ANCHOR
);
...
...
@@ -132,6 +138,14 @@ void ARVRServer::center_on_hmd(RotationMode p_rotation_mode, bool p_keep_height)
};
};
Transform
ARVRServer
::
get_hmd_transform
()
{
Transform
hmd_transform
;
if
(
primary_interface
!=
NULL
)
{
hmd_transform
=
primary_interface
->
get_transform_for_eye
(
ARVRInterface
::
EYE_MONO
,
hmd_transform
);
};
return
hmd_transform
;
};
void
ARVRServer
::
add_interface
(
const
Ref
<
ARVRInterface
>
&
p_interface
)
{
ERR_FAIL_COND
(
p_interface
.
is_null
());
...
...
@@ -314,6 +328,42 @@ void ARVRServer::clear_primary_interface_if(const Ref<ARVRInterface> &p_primary_
};
};
uint64_t
ARVRServer
::
get_last_process_usec
()
{
return
last_process_usec
;
};
uint64_t
ARVRServer
::
get_last_commit_usec
()
{
return
last_commit_usec
;
};
uint64_t
ARVRServer
::
get_last_frame_usec
()
{
return
last_frame_usec
;
};
void
ARVRServer
::
_process
()
{
/* called from visual_server_viewport.draw_viewports right before we start drawing our viewports */
/* mark for our frame timing */
last_process_usec
=
OS
::
get_singleton
()
->
get_ticks_usec
();
/* process all active interfaces */
for
(
int
i
=
0
;
i
<
interfaces
.
size
();
i
++
)
{
if
(
!
interfaces
[
i
].
is_valid
())
{
// ignore, not a valid reference
}
else
if
(
interfaces
[
i
]
->
is_initialized
())
{
interfaces
[
i
]
->
process
();
};
};
};
void
ARVRServer
::
_mark_commit
()
{
/* time this */
last_commit_usec
=
OS
::
get_singleton
()
->
get_ticks_usec
();
/* now store our difference as we may overwrite last_process_usec before this is accessed */
last_frame_usec
=
last_commit_usec
-
last_process_usec
;
};
ARVRServer
::
ARVRServer
()
{
singleton
=
this
;
world_scale
=
1.0
;
...
...
servers/arvr_server.h
View file @
53564233
...
...
@@ -31,6 +31,7 @@
#ifndef ARVR_SERVER_H
#define ARVR_SERVER_H
#include "os/os.h"
#include "os/thread_safe.h"
#include "reference.h"
#include "rid.h"
...
...
@@ -84,6 +85,10 @@ private:
Transform
world_origin
;
/* our world origin point, maps a location in our virtual world to the origin point in our real world tracking volume */
Transform
reference_frame
;
/* our reference frame */
uint64_t
last_process_usec
;
/* for frame timing, usec when we did our processing */
uint64_t
last_commit_usec
;
/* for frame timing, usec when we finished committing both eyes */
uint64_t
last_frame_usec
;
/* time it took between process and commiting, we should probably average this over the last x frames */
protected
:
static
ARVRServer
*
singleton
;
...
...
@@ -134,6 +139,11 @@ public:
void
center_on_hmd
(
RotationMode
p_rotation_mode
,
bool
p_keep_height
);
/*
get_hmd_transform gets our hmd transform (centered between eyes) with most up to date tracking, relative to the origin
*/
Transform
get_hmd_transform
();
/*
Interfaces are objects that 'glue' Godot to an AR or VR SDK such as the Oculus SDK, OpenVR, OpenHMD, etc.
*/
void
add_interface
(
const
Ref
<
ARVRInterface
>
&
p_interface
);
...
...
@@ -163,6 +173,13 @@ public:
ARVRPositionalTracker
*
get_tracker
(
int
p_index
)
const
;
ARVRPositionalTracker
*
find_by_type_and_id
(
TrackerType
p_tracker_type
,
int
p_tracker_id
)
const
;
uint64_t
get_last_process_usec
();
uint64_t
get_last_commit_usec
();
uint64_t
get_last_frame_usec
();
void
_process
();
void
_mark_commit
();
ARVRServer
();
~
ARVRServer
();
};
...
...
servers/visual/visual_server_viewport.cpp
View file @
53564233
...
...
@@ -239,10 +239,9 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport, ARVRInterface::E
void
VisualServerViewport
::
draw_viewports
()
{
// get our arvr interface in case we need it
Ref
<
ARVRInterface
>
arvr_interface
=
ARVRServer
::
get_singleton
()
->
get_primary_interface
();
if
(
arvr_interface
.
is_valid
())
{
// update our positioning information as late as possible...
arvr_interface
->
process
();
}
// process all our active interfaces
ARVRServer
::
get_singleton
()
->
_process
();
clear_color
=
GLOBAL_GET
(
"rendering/environment/default_clear_color"
);
...
...
@@ -286,6 +285,9 @@ void VisualServerViewport::draw_viewports() {
_draw_viewport
(
vp
,
ARVRInterface
::
EYE_RIGHT
);
arvr_interface
->
commit_for_eye
(
ARVRInterface
::
EYE_RIGHT
,
vp
->
render_target
,
vp
->
viewport_to_screen_rect
);
}
// and for our frame timing, mark when we've finished commiting our eyes
ARVRServer
::
get_singleton
()
->
_mark_commit
();
}
else
{
VSG
::
rasterizer
->
set_current_render_target
(
vp
->
render_target
);
...
...
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