summaryrefslogtreecommitdiffstats
path: root/modules/mobile_vr/mobile_vr_interface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/mobile_vr/mobile_vr_interface.cpp')
-rw-r--r--modules/mobile_vr/mobile_vr_interface.cpp54
1 files changed, 51 insertions, 3 deletions
diff --git a/modules/mobile_vr/mobile_vr_interface.cpp b/modules/mobile_vr/mobile_vr_interface.cpp
index d23edcd1d1..f27281866a 100644
--- a/modules/mobile_vr/mobile_vr_interface.cpp
+++ b/modules/mobile_vr/mobile_vr_interface.cpp
@@ -250,6 +250,16 @@ void MobileVRInterface::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "oversample", PROPERTY_HINT_RANGE, "1.0,2.0,0.1"), "set_oversample", "get_oversample");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "k1", PROPERTY_HINT_RANGE, "0.1,10.0,0.0001"), "set_k1", "get_k1");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "k2", PROPERTY_HINT_RANGE, "0.1,10.0,0.0001"), "set_k2", "get_k2");
+
+ ClassDB::bind_method(D_METHOD("get_vrs_min_radius"), &MobileVRInterface::get_vrs_min_radius);
+ ClassDB::bind_method(D_METHOD("set_vrs_min_radius", "radius"), &MobileVRInterface::set_vrs_min_radius);
+
+ ClassDB::bind_method(D_METHOD("get_vrs_strength"), &MobileVRInterface::get_vrs_strength);
+ ClassDB::bind_method(D_METHOD("set_vrs_strength", "strength"), &MobileVRInterface::set_vrs_strength);
+
+ ADD_GROUP("Vulkan VRS", "vrs_");
+ ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "vrs_min_radius", PROPERTY_HINT_RANGE, "1.0,100.0,1.0"), "set_vrs_min_radius", "get_vrs_min_radius");
+ ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "vrs_strength", PROPERTY_HINT_RANGE, "0.1,10.0,0.1"), "set_vrs_strength", "get_vrs_strength");
}
void MobileVRInterface::set_eye_height(const double p_eye_height) {
@@ -316,6 +326,22 @@ double MobileVRInterface::get_k2() const {
return k2;
};
+float MobileVRInterface::get_vrs_min_radius() const {
+ return xr_vrs.get_vrs_min_radius();
+}
+
+void MobileVRInterface::set_vrs_min_radius(float p_vrs_min_radius) {
+ xr_vrs.set_vrs_min_radius(p_vrs_min_radius);
+}
+
+float MobileVRInterface::get_vrs_strength() const {
+ return xr_vrs.get_vrs_strength();
+}
+
+void MobileVRInterface::set_vrs_strength(float p_vrs_strength) {
+ xr_vrs.set_vrs_strength(p_vrs_strength);
+}
+
uint32_t MobileVRInterface::get_view_count() {
// needs stereo...
return 2;
@@ -489,11 +515,16 @@ Vector<BlitToScreen> MobileVRInterface::post_draw_viewport(RID p_render_target,
Vector<BlitToScreen> blit_to_screen;
- // We must have a valid render target
+ // We must have a valid render target.
ERR_FAIL_COND_V(!p_render_target.is_valid(), blit_to_screen);
- // Because we are rendering to our device we must use our main viewport!
- ERR_FAIL_COND_V(p_screen_rect == Rect2(), blit_to_screen);
+ // We will only output to screen if this is our main viewport.
+ if (p_screen_rect == Rect2()) {
+ // Warn the developer once, it's up to the developer to output to screen.
+ WARN_PRINT_ONCE("SubViewport used with MobileVRInterface, no output to screen");
+
+ return blit_to_screen;
+ }
Rect2 modified_screen_rect = Rect2(p_screen_rect.position + offset_rect.position * p_screen_rect.size, p_screen_rect.size * offset_rect.size);
@@ -542,6 +573,23 @@ void MobileVRInterface::process() {
};
};
+RID MobileVRInterface::get_vrs_texture() {
+ PackedVector2Array eye_foci;
+
+ Size2 target_size = get_render_target_size();
+ real_t aspect_ratio = target_size.x / target_size.y;
+ uint32_t view_count = get_view_count();
+
+ for (uint32_t v = 0; v < view_count; v++) {
+ Projection cm = get_projection_for_view(v, aspect_ratio, 0.1, 1000.0);
+ Vector3 center = cm.xform(Vector3(0.0, 0.0, 999.0));
+
+ eye_foci.push_back(Vector2(center.x, center.y));
+ }
+
+ return xr_vrs.make_vrs_texture(target_size, eye_foci);
+}
+
MobileVRInterface::MobileVRInterface() {}
MobileVRInterface::~MobileVRInterface() {