mirror of
https://github.com/godotengine/godot.git
synced 2026-01-05 06:11:29 +03:00
Adding base classes and structures for ARVR support
Added ArVrScriptInterface Added ARVRCamera, ARVRController and ARVROrigin helper objects
This commit is contained in:
@@ -33,7 +33,7 @@
|
||||
#include "visual_server_global.h"
|
||||
#include "visual_server_scene.h"
|
||||
|
||||
void VisualServerViewport::_draw_viewport(Viewport *p_viewport) {
|
||||
void VisualServerViewport::_draw_viewport(Viewport *p_viewport, ARVRInterface::Eyes p_eye) {
|
||||
|
||||
/* Camera should always be BEFORE any other 3D */
|
||||
|
||||
@@ -90,8 +90,13 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport) {
|
||||
}
|
||||
|
||||
if (!scenario_draw_canvas_bg && can_draw_3d) {
|
||||
Ref<ARVRInterface> arvr_interface = ARVRServer::get_singleton()->get_primary_interface();
|
||||
|
||||
VSG::scene->render_camera(p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas);
|
||||
if (p_viewport->use_arvr && arvr_interface.is_valid()) {
|
||||
VSG::scene->render_camera(arvr_interface, p_eye, p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas);
|
||||
} else {
|
||||
VSG::scene->render_camera(p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas);
|
||||
}
|
||||
}
|
||||
|
||||
if (!p_viewport->hide_canvas) {
|
||||
@@ -260,15 +265,19 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport) {
|
||||
}
|
||||
|
||||
void VisualServerViewport::draw_viewports() {
|
||||
|
||||
//sort viewports
|
||||
|
||||
//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();
|
||||
}
|
||||
|
||||
clear_color = GLOBAL_GET("rendering/environment/default_clear_color");
|
||||
|
||||
//sort viewports
|
||||
active_viewports.sort_custom<ViewportSort>();
|
||||
|
||||
//draw viewports
|
||||
for (int i = 0; i < active_viewports.size(); i++) {
|
||||
|
||||
Viewport *vp = active_viewports[i];
|
||||
@@ -286,25 +295,47 @@ void VisualServerViewport::draw_viewports() {
|
||||
|
||||
VSG::storage->render_target_clear_used(vp->render_target);
|
||||
|
||||
VSG::rasterizer->set_current_render_target(vp->render_target);
|
||||
if (vp->use_arvr && arvr_interface.is_valid()) {
|
||||
// override our size, make sure it matches our required size
|
||||
Size2 size = arvr_interface->get_recommended_render_targetsize();
|
||||
VSG::storage->render_target_set_size(vp->render_target, size.x, size.y);
|
||||
|
||||
VSG::scene_render->set_debug_draw_mode(vp->debug_draw);
|
||||
VSG::storage->render_info_begin_capture();
|
||||
// render mono or left eye first
|
||||
ARVRInterface::Eyes leftOrMono = arvr_interface->is_stereo() ? ARVRInterface::EYE_LEFT : ARVRInterface::EYE_MONO;
|
||||
VSG::rasterizer->set_current_render_target(vp->render_target);
|
||||
_draw_viewport(vp, leftOrMono);
|
||||
arvr_interface->commit_for_eye(leftOrMono, vp->render_target, vp->viewport_to_screen_rect);
|
||||
|
||||
_draw_viewport(vp);
|
||||
// render right eye
|
||||
if (leftOrMono == ARVRInterface::EYE_LEFT) {
|
||||
// commit for eye may have changed the render target
|
||||
VSG::rasterizer->set_current_render_target(vp->render_target);
|
||||
|
||||
VSG::storage->render_info_end_capture();
|
||||
vp->render_info[VS::VIEWPORT_RENDER_INFO_OBJECTS_IN_FRAME] = VSG::storage->get_captured_render_info(VS::INFO_OBJECTS_IN_FRAME);
|
||||
vp->render_info[VS::VIEWPORT_RENDER_INFO_VERTICES_IN_FRAME] = VSG::storage->get_captured_render_info(VS::INFO_VERTICES_IN_FRAME);
|
||||
vp->render_info[VS::VIEWPORT_RENDER_INFO_MATERIAL_CHANGES_IN_FRAME] = VSG::storage->get_captured_render_info(VS::INFO_MATERIAL_CHANGES_IN_FRAME);
|
||||
vp->render_info[VS::VIEWPORT_RENDER_INFO_SHADER_CHANGES_IN_FRAME] = VSG::storage->get_captured_render_info(VS::INFO_SHADER_CHANGES_IN_FRAME);
|
||||
vp->render_info[VS::VIEWPORT_RENDER_INFO_SURFACE_CHANGES_IN_FRAME] = VSG::storage->get_captured_render_info(VS::INFO_SURFACE_CHANGES_IN_FRAME);
|
||||
vp->render_info[VS::VIEWPORT_RENDER_INFO_DRAW_CALLS_IN_FRAME] = VSG::storage->get_captured_render_info(VS::INFO_DRAW_CALLS_IN_FRAME);
|
||||
_draw_viewport(vp, ARVRInterface::EYE_RIGHT);
|
||||
arvr_interface->commit_for_eye(ARVRInterface::EYE_RIGHT, vp->render_target, vp->viewport_to_screen_rect);
|
||||
}
|
||||
} else {
|
||||
VSG::rasterizer->set_current_render_target(vp->render_target);
|
||||
|
||||
if (vp->viewport_to_screen_rect != Rect2()) {
|
||||
//copy to screen if set as such
|
||||
VSG::rasterizer->set_current_render_target(RID());
|
||||
VSG::rasterizer->blit_render_target_to_screen(vp->render_target, vp->viewport_to_screen_rect, vp->viewport_to_screen);
|
||||
VSG::scene_render->set_debug_draw_mode(vp->debug_draw);
|
||||
VSG::storage->render_info_begin_capture();
|
||||
|
||||
// render standard mono camera
|
||||
_draw_viewport(vp);
|
||||
|
||||
VSG::storage->render_info_end_capture();
|
||||
vp->render_info[VS::VIEWPORT_RENDER_INFO_OBJECTS_IN_FRAME] = VSG::storage->get_captured_render_info(VS::INFO_OBJECTS_IN_FRAME);
|
||||
vp->render_info[VS::VIEWPORT_RENDER_INFO_VERTICES_IN_FRAME] = VSG::storage->get_captured_render_info(VS::INFO_VERTICES_IN_FRAME);
|
||||
vp->render_info[VS::VIEWPORT_RENDER_INFO_MATERIAL_CHANGES_IN_FRAME] = VSG::storage->get_captured_render_info(VS::INFO_MATERIAL_CHANGES_IN_FRAME);
|
||||
vp->render_info[VS::VIEWPORT_RENDER_INFO_SHADER_CHANGES_IN_FRAME] = VSG::storage->get_captured_render_info(VS::INFO_SHADER_CHANGES_IN_FRAME);
|
||||
vp->render_info[VS::VIEWPORT_RENDER_INFO_SURFACE_CHANGES_IN_FRAME] = VSG::storage->get_captured_render_info(VS::INFO_SURFACE_CHANGES_IN_FRAME);
|
||||
vp->render_info[VS::VIEWPORT_RENDER_INFO_DRAW_CALLS_IN_FRAME] = VSG::storage->get_captured_render_info(VS::INFO_DRAW_CALLS_IN_FRAME);
|
||||
|
||||
if (vp->viewport_to_screen_rect != Rect2()) {
|
||||
//copy to screen if set as such
|
||||
VSG::rasterizer->set_current_render_target(RID());
|
||||
VSG::rasterizer->blit_render_target_to_screen(vp->render_target, vp->viewport_to_screen_rect, vp->viewport_to_screen);
|
||||
}
|
||||
}
|
||||
|
||||
if (vp->update_mode == VS::VIEWPORT_UPDATE_ONCE) {
|
||||
@@ -329,6 +360,13 @@ RID VisualServerViewport::viewport_create() {
|
||||
return rid;
|
||||
}
|
||||
|
||||
void VisualServerViewport::viewport_set_use_arvr(RID p_viewport, bool p_use_arvr) {
|
||||
Viewport *viewport = viewport_owner.getornull(p_viewport);
|
||||
ERR_FAIL_COND(!viewport);
|
||||
|
||||
viewport->use_arvr = p_use_arvr;
|
||||
}
|
||||
|
||||
void VisualServerViewport::viewport_set_size(RID p_viewport, int p_width, int p_height) {
|
||||
|
||||
ERR_FAIL_COND(p_width < 0 && p_height < 0);
|
||||
|
||||
Reference in New Issue
Block a user