Skip to content

Commit

Permalink
controller reader: support consumption of series of controller events (
Browse files Browse the repository at this point in the history
…#1928)

* controller reader: support consumption of series of controller events
recycle controller events properly

* Fix crash in Daydream mode

* Support multiple keys in the onControllerEvent callback
  • Loading branch information
liaxim committed Sep 18, 2018
1 parent cac085c commit 6b94940
Show file tree
Hide file tree
Showing 8 changed files with 132 additions and 219 deletions.
Original file line number Diff line number Diff line change
@@ -1,42 +1,53 @@
package org.gearvrf;

import android.graphics.PointF;

import com.google.vr.sdk.controller.Controller;
import com.google.vr.sdk.controller.Controller.ConnectionStates;
import com.google.vr.sdk.controller.ControllerManager;
import com.google.vr.sdk.controller.Orientation;

import org.gearvrf.io.GVRGearCursorController;
import org.joml.Math;
import org.joml.Quaternionf;
import org.joml.Vector3f;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.ArrayList;

class DayDreamControllerReader extends GVRGearCursorController.ControllerReaderStubs {

private ControllerManager mControllerManager;
private Controller mController;
private int mConnectionState = ConnectionStates.DISCONNECTED;
private FloatBuffer readbackBuffer = null;
private GVRApplication mApplication;
private final DaydreamViewManager mViewManager;
private final float OCULUS_SCALE = 256.0f;

DayDreamControllerReader(GVRApplication application) {
DayDreamControllerReader(final DaydreamViewManager viewManager) {
mViewManager = viewManager;

EventListener listener = new EventListener();
mControllerManager = new ControllerManager(application.getActivity(), listener);
mControllerManager = new ControllerManager(mViewManager.getApplication().getActivity(), listener);
mController = mControllerManager.getController();
mController.setEventListener(listener);
mControllerManager.start();
mApplication = application;

bufferInit();
}

@Override
public boolean isTouched(int index){
return mController.isTouching;
public void getEvents(int controllerID, ArrayList<GVRGearCursorController.ControllerEvent> controllerEvents) {
final GVRGearCursorController.ControllerEvent event = GVRGearCursorController.ControllerEvent.obtain();

event.handedness = readbackBuffer.get(0);
event.pointF.set(mController.touch.x * OCULUS_SCALE, mController.touch.y * OCULUS_SCALE);

event.touched = mController.isTouching;
event.rotation.set(mController.orientation.x, mController.orientation.y, mController.orientation.z, mController.orientation.w);
event.rotation.rotateLocalY(-(float)Math.toRadians(45.0)); // this makes it to look same as other backends
event.position.set(mController.position[0], mController.position[1], mController.position[2]);
event.position.add(0.341f, -0.486f, -0.383f); // this makes it to look same as other backends
event.key = getKey();

controllerEvents.add(event);
}

@Override
Expand All @@ -48,27 +59,12 @@ public void bufferInit(){
ByteBuffer readbackBufferB = ByteBuffer.allocateDirect(4);
readbackBufferB.order(ByteOrder.nativeOrder());
readbackBuffer = readbackBufferB.asFloatBuffer();
GVRViewManager gvrViewManager = mApplication.getViewManager();
DaydreamViewManager viewManager = (DaydreamViewManager)gvrViewManager;
setNativeBuffer(viewManager.getNativeRenderer(), readbackBufferB);
updateHandedness(viewManager.getNativeRenderer());
}

@Override
public void updateRotation(Quaternionf quat,int index) {
Orientation orientation = mController.orientation;
quat.set(orientation.x, orientation.y, orientation.z,orientation.w);
quat.rotateLocalY(-(float)Math.toRadians(45.0)); // this makes it to look same as other backends
setNativeBuffer(mViewManager.getNativeRenderer(), readbackBufferB);
updateHandedness(mViewManager.getNativeRenderer());
}

@Override
public void updatePosition(Vector3f vec,int index) {
vec.set(mController.position[0], mController.position[1], mController.position[2]);
vec.add(0.341f, -0.486f, -0.383f); // this makes it to look same as other backends
}

@Override
public int getKey(int index) {
private int getKey() {
if(mController.appButtonState)
return GVRGearCursorController.CONTROLLER_KEYS.BUTTON_A.getNumVal();
if(mController.clickButtonState)
Expand All @@ -83,18 +79,6 @@ public int getKey(int index) {
return 0;
}

@Override
public float getHandedness() {
if(readbackBuffer == null)
bufferInit();
return readbackBuffer.get(0);
}

@Override
public void updateTouchpad(PointF pt,int index) {
pt.set(mController.touch.x * OCULUS_SCALE, mController.touch.y * OCULUS_SCALE);
}

@Override
protected void finalize() throws Throwable {
try {
Expand All @@ -121,6 +105,7 @@ public void onUpdate() {
mController.update();
}
}

public static native void setNativeBuffer(long nativeRenderer, ByteBuffer buffer);
public static native void updateHandedness(long nativeRenderer);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public void run() {

// Prevent screen from dimming/locking.
application.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mControllerReader = new DayDreamControllerReader(application);
mControllerReader = new DayDreamControllerReader(this);

}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
package org.gearvrf;

import android.graphics.PointF;

import org.gearvrf.io.GVRGearCursorController;
import org.joml.Quaternionf;
import org.joml.Vector3f;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.ArrayList;

class OvrControllerReader extends GVRGearCursorController.ControllerReaderStubs {
final class OvrControllerReader extends GVRGearCursorController.ControllerReaderStubs {

private FloatBuffer readbackBuffer;
private final long mPtr;
Expand All @@ -24,43 +21,28 @@ class OvrControllerReader extends GVRGearCursorController.ControllerReaderStubs
}

@Override
public boolean isConnected(int id) {
return readbackBuffer.get(INDEX_CONNECTED) == 1.0f;
}
public void getEvents(int controllerID, ArrayList<GVRGearCursorController.ControllerEvent> controllerEvents) {
final GVRGearCursorController.ControllerEvent event = GVRGearCursorController.ControllerEvent.obtain();

@Override
public boolean isTouched(int id) {
return readbackBuffer.get(INDEX_TOUCHED) == 1.0f;
}
event.handedness = readbackBuffer.get(INDEX_HANDEDNESS);
event.pointF.set(readbackBuffer.get(INDEX_TOUCHPAD), readbackBuffer.get(INDEX_TOUCHPAD + 1));

@Override
public void updateRotation(Quaternionf quat, int id) {
quat.set(readbackBuffer.get(INDEX_ROTATION + 1),
event.touched = readbackBuffer.get(INDEX_TOUCHED) == 1.0f;
event.rotation.set(readbackBuffer.get(INDEX_ROTATION + 1),
readbackBuffer.get(INDEX_ROTATION + 2),
readbackBuffer.get(INDEX_ROTATION + 3),
readbackBuffer.get(INDEX_ROTATION));
}

@Override
public void updatePosition(Vector3f vec, int id) {
vec.set(readbackBuffer.get(INDEX_POSITION),
event.position.set(readbackBuffer.get(INDEX_POSITION),
readbackBuffer.get(INDEX_POSITION + 1),
readbackBuffer.get(INDEX_POSITION + 2));
}

@Override
public int getKey(int id) {
return (int) readbackBuffer.get(INDEX_BUTTON);
}
event.key = (int) readbackBuffer.get(INDEX_BUTTON);

@Override
public float getHandedness() {
return readbackBuffer.get(INDEX_HANDEDNESS);
controllerEvents.add(event);
}

@Override
public void updateTouchpad(PointF pt, int id) {
pt.set(readbackBuffer.get(INDEX_TOUCHPAD), readbackBuffer.get(INDEX_TOUCHPAD + 1));
public boolean isConnected(int id) {
return readbackBuffer.get(INDEX_CONNECTED) == 1.0f;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ public void onTouchEvent(MotionEvent event) {
}

@Override
public void onControllerEvent(GVRGearCursorController.CONTROLLER_KEYS key, Vector3f position, Quaternionf orientation, PointF touchpadPoint, boolean touched, Vector3f angularAcceleration,
public void onControllerEvent(GVRGearCursorController.CONTROLLER_KEYS[] keys, Vector3f position, Quaternionf orientation, PointF touchpadPoint, boolean touched, Vector3f angularAcceleration,
Vector3f angularVelocity) {
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -465,9 +465,6 @@ public void run() {
}
});

if (null != mControllerReader) {
mControllerReader.updatePosData();
}
getInputManager().updateGearControllers();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,15 +51,15 @@ public interface IActivityEvents extends IEvents {
* Invoked every frame with the latest controller position and orientation; the parameters
* should be copied if they need to be used after the callback returns.
*
* @param key one of CONTROLLER_KEYS
* @param keys one or more CONTROLLER_KEYS
* @param position X, Y, Z position of the controller
* @param orientation orientation of the controller as a quaternion
* @param touchpadPoint X, Y position on the touchpad
* @param touched true if pad is touched
* @param angularAcceleration angularAcceleration of the controller
* @param angularVelocity angularVelocity of the controller
*/
void onControllerEvent(GVRGearCursorController.CONTROLLER_KEYS key, Vector3f position, Quaternionf orientation, PointF touchpadPoint, boolean touched, Vector3f angularAcceleration,
void onControllerEvent(GVRGearCursorController.CONTROLLER_KEYS[] keys, Vector3f position, Quaternionf orientation, PointF touchpadPoint, boolean touched, Vector3f angularAcceleration,
Vector3f angularVelocity);

void dispatchTouchEvent(MotionEvent event);
Expand Down
Loading

0 comments on commit 6b94940

Please sign in to comment.