mirror of
https://github.com/bjornbytes/lovr.git
synced 2024-07-08 23:23:38 +00:00
ac58a1aeba
Add entrypoints, headset backend code, fill in the Activity, and add various special cases to account for the asynchronous render loop, lack of sRGB support, and OpenGL state resets.
171 lines
4.8 KiB
Java
171 lines
4.8 KiB
Java
package org.lovr.app;
|
|
|
|
import android.os.Bundle;
|
|
|
|
import com.picovr.vractivity.Eye;
|
|
import com.picovr.vractivity.HmdState;
|
|
import com.picovr.vractivity.RenderInterface;
|
|
import com.picovr.vractivity.VRActivity;
|
|
import com.picovr.cvclient.ButtonNum;
|
|
import com.picovr.cvclient.CVController;
|
|
import com.picovr.cvclient.CVControllerListener;
|
|
import com.picovr.cvclient.CVControllerManager;
|
|
import com.picovr.picovrlib.cvcontrollerclient.ControllerClient;
|
|
import com.psmart.vrlib.PicovrSDK;
|
|
|
|
public class Activity extends VRActivity implements RenderInterface, CVControllerListener {
|
|
CVControllerManager controllerManager;
|
|
boolean controllersActive;
|
|
|
|
// Activity
|
|
|
|
public void onCreate(Bundle bundle) {
|
|
super.onCreate(bundle);
|
|
|
|
if (ControllerClient.isControllerServiceExisted(this)) {
|
|
controllerManager = new CVControllerManager(this);
|
|
controllerManager.setListener(this);
|
|
}
|
|
|
|
lovrPicoOnCreate(getPackageCodePath());
|
|
}
|
|
|
|
public void onPause() {
|
|
super.onPause();
|
|
if (controllerManager != null) {
|
|
controllerManager.unbindService();
|
|
}
|
|
}
|
|
|
|
public void onResume() {
|
|
super.onResume();
|
|
PicovrSDK.SetEyeBufferSize(1920, 1920);
|
|
if (controllerManager != null) {
|
|
controllerManager.bindService();
|
|
}
|
|
}
|
|
|
|
// RenderInterface
|
|
|
|
public void initGL(int width, int height) {
|
|
lovrPicoSetDisplayDimensions(width, height);
|
|
}
|
|
|
|
public void onFrameBegin(HmdState state) {
|
|
if (controllersActive) {
|
|
for (int i = 0; i < 2; i++) {
|
|
CVController controller = (i == 0) ?
|
|
controllerManager.getMainController() :
|
|
controllerManager.getSubController();
|
|
|
|
if (controller == null || controller.getConnectState() == 0) {
|
|
lovrPicoUpdateControllerPose(i, false, 0, 0, 0, 0, 0, 0, 0);
|
|
continue;
|
|
}
|
|
|
|
float p[] = controller.getPosition();
|
|
float q[] = controller.getOrientation();
|
|
lovrPicoUpdateControllerPose(i, true, p[0], p[1], p[2], q[0], q[1], q[2], q[3]);
|
|
|
|
int thumbstick[] = controller.getTouchPad();
|
|
float trigger = (float) controller.getTriggerNum() / 255.f;
|
|
float thumbstickX = ((float) thumbstick[1] - 128.f) / (thumbstick[1] > 128 ? 127.f : 128.f);
|
|
float thumbstickY = ((float) thumbstick[0] - 128.f) / (thumbstick[0] > 128 ? 127.f : 128.f);
|
|
|
|
int buttons = 0;
|
|
ButtonNum gripButton = (i == 0) ? ButtonNum.buttonRG : ButtonNum.buttonLG; // Yes I know
|
|
buttons |= trigger >= .9f ? (1 << 0) : 0;
|
|
buttons |= controller.getButtonState(ButtonNum.click) ? (1 << 1) : 0;
|
|
buttons |= controller.getButtonState(gripButton) ? (1 << 2) : 0;
|
|
buttons |= controller.getButtonState(ButtonNum.app) ? (1 << 3) : 0;
|
|
buttons |= controller.getButtonState(ButtonNum.buttonAX) ? (1 << 4) : 0;
|
|
buttons |= controller.getButtonState(ButtonNum.buttonBY) ? (1 << 5) : 0;
|
|
lovrPicoUpdateControllerInput(i, buttons, trigger, thumbstickX, thumbstickY);
|
|
}
|
|
}
|
|
|
|
float p[] = state.getPos();
|
|
float q[] = state.getOrientation();
|
|
float fov = state.getFov();
|
|
float ipd = state.getIpd();
|
|
lovrPicoOnFrame(p[0], p[1], p[2], q[0], q[1], q[2], q[3], fov, ipd);
|
|
}
|
|
|
|
public void onDrawEye(Eye eye) {
|
|
lovrPicoDrawEye(eye.getType());
|
|
}
|
|
|
|
public void onFrameEnd() {
|
|
//
|
|
}
|
|
|
|
public void onRenderPause() {
|
|
//
|
|
}
|
|
|
|
public void onRenderResume() {
|
|
//
|
|
}
|
|
|
|
public void onRendererShutdown() {
|
|
//
|
|
}
|
|
|
|
public void surfaceChangedCallBack(int width, int height) {
|
|
//
|
|
}
|
|
|
|
public void renderEventCallBack(int i) {
|
|
//
|
|
}
|
|
|
|
public void onTouchEvent() {
|
|
//
|
|
}
|
|
|
|
// CVControllerListener
|
|
|
|
public void onBindSuccess() {
|
|
//
|
|
}
|
|
|
|
public void onBindFail() {
|
|
controllersActive = false;
|
|
}
|
|
|
|
public void onThreadStart() {
|
|
controllersActive = true;
|
|
}
|
|
|
|
public void onConnectStateChanged(int serial, int state) {
|
|
//
|
|
}
|
|
|
|
public void onMainControllerChanged(int serial) {
|
|
//
|
|
}
|
|
|
|
public void onChannelChanged(int device, int channel) {
|
|
//
|
|
}
|
|
|
|
// Native
|
|
protected native void lovrPicoOnCreate(String apkPath);
|
|
protected native void lovrPicoSetDisplayDimensions(int width, int height);
|
|
protected native void lovrPicoUpdateControllerPose(int hand, boolean active, float x, float y, float z, float qx, float qy, float qz, float qw);
|
|
protected native void lovrPicoUpdateControllerInput(int hand, int buttons, float trigger, float thumbstickX, float thumbstickY);
|
|
protected native void lovrPicoOnFrame(float x, float y, float z, float qx, float qy, float qz, float qw, float fov, float ipd);
|
|
protected native void lovrPicoDrawEye(int eye);
|
|
|
|
public void vibrate(int hand, float strength, float duration) {
|
|
if (controllerManager != null) {
|
|
int ms = (int) (duration * 1000.f);
|
|
ControllerClient.vibrateCV2ControllerStrength(strength, ms, hand);
|
|
}
|
|
}
|
|
|
|
static {
|
|
System.loadLibrary("lovr");
|
|
}
|
|
}
|