这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
f99e80d
OpenXR - SDK submodule added
lvonasek Mar 10, 2024
1b786a0
Merge branch 'master' into platform-openxr-quest
lvonasek Mar 10, 2024
8f3cc16
Merge branch 'master' into platform-openxr-quest
lvonasek Mar 10, 2024
ddaf521
OpenXR - XrActivity initialization added
lvonasek Mar 12, 2024
948c853
OpenXR - XR code added
lvonasek Mar 12, 2024
0b06b66
OpenXR - XR initialization added
lvonasek Mar 13, 2024
fb0273c
OpenXR - Remove GLES3 dependency, start migrating to C
lvonasek Mar 13, 2024
bd4bf8e
OpenXR - Finish migrating to C
lvonasek Mar 14, 2024
9dd03b7
Merge branch 'master' into platform-openxr-quest
lvonasek Mar 15, 2024
ec4c235
OpenXR - Backport SBS feature
lvonasek Mar 15, 2024
6474d32
OpenXR - Validate XrRenderer works
lvonasek Mar 16, 2024
adc4e5d
OpenXR - XR warnings/issues fixed
lvonasek Mar 21, 2024
28ba732
OpenXR - Kickoff of new approach
lvonasek Mar 22, 2024
e5d8115
Merge branch 'master' into platform-openxr-quest
lvonasek Mar 22, 2024
adad96e
OpenXR - Compile fix
lvonasek Mar 22, 2024
a51577e
OpenXR - Access to HMD/controllers status
lvonasek Mar 24, 2024
c39d19b
OpenXR - Access to render params
lvonasek Mar 24, 2024
6ad30b7
Merge branch 'master' into platform-openxr-quest
lvonasek Apr 5, 2024
e4ea777
OpenXR - Split supported and enabled states
lvonasek Apr 5, 2024
043901e
OpenXR - App flow fixes
lvonasek Apr 5, 2024
0e61e8c
OpenXR - Ugly render test
lvonasek Apr 5, 2024
1efb844
OpenXR - GLUtility added
lvonasek Apr 6, 2024
9103816
OpenXR - CPU based render flow
lvonasek Apr 6, 2024
7d37023
OpenXR - Controllers support
lvonasek Apr 6, 2024
2792a50
OpenXR - Use SurfaceTexture for rendering
lvonasek Apr 8, 2024
7546a8d
Merge branch 'master' into platform-openxr-quest
lvonasek Apr 9, 2024
5f7113a
OpenXR - Controller mapping fixed
lvonasek Apr 9, 2024
fcdafc1
OpenXR - Virtual keyboard support
lvonasek Apr 9, 2024
bc5cc79
OpenXR - Virtual keyboard better
lvonasek Apr 10, 2024
8aa961c
Merge branch 'master' into platform-openxr-quest
lvonasek Apr 10, 2024
6bf0bd5
OpenXR - UX fixes
lvonasek Apr 11, 2024
3369c02
OpenXR - Code formatting
lvonasek Apr 18, 2024
5952229
Merge branch 'master' into platform-openxr-quest
lvonasek Apr 19, 2024
02da61b
OpenXR - Call proper teardown before killing the app
lvonasek Apr 19, 2024
9079aba
Merge branch 'master' into platform-openxr-quest
lvonasek Apr 25, 2024
016af89
OpenXR - XrKeyboard in progress
lvonasek Apr 25, 2024
850325c
OpenXR - Get rid of reference InputConnection
lvonasek Apr 25, 2024
b6df8e6
OpenXR - Add TODOs
lvonasek Apr 25, 2024
a8e44a6
OpenXR - Simplify XrKeyboard
lvonasek Apr 26, 2024
65fe86e
OpenXR - XrKeyboard cleanup
lvonasek Apr 26, 2024
c47ce2b
Merge branch 'master' into platform-openxr-quest
lvonasek Jun 13, 2024
80d3a08
OpenXR - Fix for HorizonOS V66
lvonasek Jun 13, 2024
665e48f
OpenXR - Compile fix
lvonasek Jun 13, 2024
e9c5339
Merge branch 'master' into platform-openxr-quest
lvonasek Jun 19, 2024
d20cce2
OpenXR - Simplify text input
lvonasek Jun 19, 2024
41bf295
OpenXR - Update SDK
lvonasek Jun 19, 2024
e3d4150
OpenXR - Code review
lvonasek Jun 20, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,6 @@
[submodule "app/src/main/cpp/bzip2"]
path = app/src/main/cpp/bzip2
url = https://gitlab.com/bzip2/bzip2
[submodule "app/src/main/cpp/OpenXR-SDK"]
path = app/src/main/cpp/OpenXR-SDK
url = https://github.com/KhronosGroup/OpenXR-SDK.git
18 changes: 18 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

<uses-feature android:name="android.hardware.vr.headtracking" android:required="false" />
<uses-feature android:name="com.oculus.feature.PASSTHROUGH" android:required="false" />
<uses-feature android:name="oculus.software.overlay_keyboard" android:required="false" />

<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
Expand Down Expand Up @@ -35,6 +39,20 @@
</intent-filter>
<meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" />
</activity>
<activity
android:name=".XrActivity"
android:configChanges="density|orientation|screenSize|keyboard|keyboardHidden|uiMode"
android:exported="true"
android:launchMode="singleTask"
android:resizeableActivity="false"
android:screenOrientation="landscape"
android:process=":vr_process">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="com.oculus.intent.category.VR" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:theme="@style/Theme.AppCompat.DayNight"
android:excludeFromRecents="true"
Expand Down
13 changes: 13 additions & 0 deletions app/src/main/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,16 @@ set(CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_OLD})
foreach(project xorgproto fontenc md pixman tirpc xshmfence Xdmcp Xau Xfont2 xkbcomp xserver)
include(recipes/${project}.cmake)
endforeach()

if(${ANDROID_ABI} MATCHES "arm64-v8a")
add_subdirectory(OpenXR-SDK)
add_library(XRio SHARED
"xrio/android.c"
"xrio/engine.c"
"xrio/framebuffer.c"
"xrio/input.c"
"xrio/math.c"
"xrio/renderer.c")
target_link_options(XRio PRIVATE "-Wl,--as-needed" "-Wl,--no-undefined" "-fvisibility=hidden")
target_link_libraries(XRio "-Wl,--whole-archive" "-Wl,--no-whole-archive" android log EGL GLESv2 openxr_loader)
endif()
1 change: 1 addition & 0 deletions app/src/main/cpp/OpenXR-SDK
Submodule OpenXR-SDK added at f90488
195 changes: 195 additions & 0 deletions app/src/main/cpp/xrio/android.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
#include <string.h>

#include "engine.h"
#include "input.h"
#include "math.h"
#include "renderer.h"

struct XrEngine xr_engine;
struct XrInput xr_input;
struct XrRenderer xr_renderer;
bool xr_initialized = false;
int xr_params[6] = {};

#if defined(_DEBUG)
#include <GLES2/gl2.h>
void GLCheckErrors(const char* file, int line) {
for (int i = 0; i < 10; i++) {
const GLenum error = glGetError();
if (error == GL_NO_ERROR) {
break;
}
ALOGE("OpenGL error on line %s:%d %d", file, line, error);
}
}

void OXRCheckErrors(XrResult result, const char* file, int line) {
if (XR_FAILED(result)) {
char errorBuffer[XR_MAX_RESULT_STRING_SIZE];
xrResultToString(xr_engine->Instance, result, errorBuffer);
ALOGE("OpenXR error on line %s:%d %s", file, line, errorBuffer);
}
}
#endif

JNIEXPORT void JNICALL Java_com_termux_x11_XrActivity_init(JNIEnv *env, jobject obj) {

// Do not allow second initialization
if (xr_initialized) {
return;
}

// Set platform flags
memset(&xr_engine, 0, sizeof(xr_engine));
xr_engine.PlatformFlag[PLATFORM_CONTROLLER_QUEST] = true;
xr_engine.PlatformFlag[PLATFORM_EXTENSION_PASSTHROUGH] = true;
xr_engine.PlatformFlag[PLATFORM_EXTENSION_PERFORMANCE] = true;

// Get Java VM
JavaVM* vm;
(*env)->GetJavaVM(env, &vm);

// Init XR
xrJava java;
java.vm = vm;
java.activity = (*env)->NewGlobalRef(env, obj);
XrEngineInit(&xr_engine, &java, "termux-x11", 1);
XrEngineEnter(&xr_engine);
XrInputInit(&xr_engine, &xr_input);
XrRendererInit(&xr_engine, &xr_renderer);
XrRendererGetResolution(&xr_engine, &xr_renderer, &xr_params[4], &xr_params[5]);
xr_initialized = true;
ALOGV("Init called");
}

JNIEXPORT void JNICALL Java_com_termux_x11_XrActivity_teardown(JNIEnv *env, jobject obj) {
if (!xr_initialized) {
return;
}

XrRendererDestroy(&xr_engine, &xr_renderer);
XrEngineLeave(&xr_engine);
XrEngineDestroy(&xr_engine);

memset(&xr_engine, 0, sizeof(xr_engine));
memset(&xr_input, 0, sizeof(xr_input));
memset(&xr_renderer, 0, sizeof(xr_renderer));
xr_initialized = false;
}

JNIEXPORT jboolean JNICALL Java_com_termux_x11_XrActivity_beginFrame(JNIEnv *env, jobject obj) {
if (XrRendererInitFrame(&xr_engine, &xr_renderer)) {

// Set renderer
int mode = xr_params[1] ? RENDER_MODE_MONO_6DOF : RENDER_MODE_MONO_SCREEN;
xr_renderer.ConfigFloat[CONFIG_CANVAS_DISTANCE] = xr_params[0];
xr_renderer.ConfigInt[CONFIG_PASSTHROUGH] = xr_params[2];
xr_renderer.ConfigInt[CONFIG_MODE] = mode;
xr_renderer.ConfigInt[CONFIG_SBS] = xr_params[3];

// Recenter if mode switched
static bool last_immersive = false;
if (last_immersive != xr_params[1]) {
XrRendererRecenter(&xr_engine, &xr_renderer);
last_immersive = xr_params[1];
}

// Update controllers state
XrInputUpdate(&xr_engine, &xr_input);

// Lock framebuffer
XrRendererBeginFrame(&xr_renderer, 0);

return true;
}
return false;
}

JNIEXPORT void JNICALL Java_com_termux_x11_XrActivity_finishFrame(JNIEnv *env, jobject obj) {
XrRendererEndFrame(&xr_renderer);
XrRendererFinishFrame(&xr_engine, &xr_renderer);
}

JNIEXPORT jfloatArray JNICALL Java_com_termux_x11_XrActivity_getAxes(JNIEnv *env, jobject obj) {
XrPosef lPose = XrInputGetPose(&xr_input, 0);
XrPosef rPose = XrInputGetPose(&xr_input, 1);
XrVector2f lThumbstick = XrInputGetJoystickState(&xr_input, 0);
XrVector2f rThumbstick = XrInputGetJoystickState(&xr_input, 1);
XrVector3f lPosition = xr_renderer.Projections[0].pose.position;
XrVector3f rPosition = xr_renderer.Projections[1].pose.position;
XrVector3f angles = xr_renderer.HmdOrientation;

int count = 0;
float data[32];
data[count++] = XrQuaternionfEulerAngles(lPose.orientation).x; //L_PITCH
data[count++] = XrQuaternionfEulerAngles(lPose.orientation).y; //L_YAW
data[count++] = XrQuaternionfEulerAngles(lPose.orientation).z; //L_ROLL
data[count++] = lThumbstick.x; //L_THUMBSTICK_X
data[count++] = lThumbstick.y; //L_THUMBSTICK_Y
data[count++] = lPose.position.x; //L_X
data[count++] = lPose.position.y; //L_Y
data[count++] = lPose.position.z; //L_Z
data[count++] = XrQuaternionfEulerAngles(rPose.orientation).x; //R_PITCH
data[count++] = XrQuaternionfEulerAngles(rPose.orientation).y; //R_YAW
data[count++] = XrQuaternionfEulerAngles(rPose.orientation).z; //R_ROLL
data[count++] = rThumbstick.x; //R_THUMBSTICK_X
data[count++] = rThumbstick.y; //R_THUMBSTICK_Y
data[count++] = rPose.position.x; //R_X
data[count++] = rPose.position.y; //R_Y
data[count++] = rPose.position.z; //R_Z
data[count++] = angles.x; //HMD_PITCH
data[count++] = angles.y; //HMD_YAW
data[count++] = angles.z; //HMD_ROLL
data[count++] = (lPosition.x + rPosition.x) * 0.5f; //HMD_X
data[count++] = (lPosition.y + rPosition.y) * 0.5f; //HMD_Y
data[count++] = (lPosition.z + rPosition.z) * 0.5f; //HMD_Z
data[count++] = XrVector3fDistance(lPosition, rPosition); //HMD_IPD

jfloat values[count];
memcpy(values, data, count * sizeof(float));
jfloatArray output = (*env)->NewFloatArray(env, count);
(*env)->SetFloatArrayRegion(env, output, (jsize)0, (jsize)count, values);
return output;
}

JNIEXPORT jbooleanArray JNICALL Java_com_termux_x11_XrActivity_getButtons(JNIEnv *env, jobject obj) {
uint32_t l = XrInputGetButtonState(&xr_input, 0);
uint32_t r = XrInputGetButtonState(&xr_input, 1);

int count = 0;
bool data[32];
data[count++] = l & (int)Grip; //L_GRIP
data[count++] = l & (int)Enter; //L_MENU
data[count++] = l & (int)LThumb; //L_THUMBSTICK_PRESS
data[count++] = l & (int)Left; //L_THUMBSTICK_LEFT
data[count++] = l & (int)Right; //L_THUMBSTICK_RIGHT
data[count++] = l & (int)Up; //L_THUMBSTICK_UP
data[count++] = l & (int)Down; //L_THUMBSTICK_DOWN
data[count++] = l & (int)Trigger; //L_TRIGGER
data[count++] = l & (int)X; //L_X
data[count++] = l & (int)Y; //L_Y
data[count++] = r & (int)A; //R_A
data[count++] = r & (int)B; //R_B
data[count++] = r & (int)Grip; //R_GRIP
data[count++] = r & (int)RThumb; //R_THUMBSTICK_PRESS
data[count++] = r & (int)Left; //R_THUMBSTICK_LEFT
data[count++] = r & (int)Right; //R_THUMBSTICK_RIGHT
data[count++] = r & (int)Up; //R_THUMBSTICK_UP
data[count++] = r & (int)Down; //R_THUMBSTICK_DOWN
data[count++] = r & (int)Trigger; //R_TRIGGER

jboolean values[count];
memcpy(values, data, count * sizeof(jboolean));
jbooleanArray output = (*env)->NewBooleanArray(env, count);
(*env)->SetBooleanArrayRegion(env, output, (jsize)0, (jsize)count, values);
return output;
}


JNIEXPORT jint JNICALL Java_com_termux_x11_XrActivity_getRenderParam(JNIEnv *env, jobject obj, jint param) {
return xr_params[param];
}

JNIEXPORT void JNICALL Java_com_termux_x11_XrActivity_setRenderParam(JNIEnv *env, jobject obj, jint param, jint value) {
xr_params[param] = value;
}
Loading