diff --git a/android/filament-utils-android/src/main/cpp/Manipulator.cpp b/android/filament-utils-android/src/main/cpp/Manipulator.cpp
index 22d471def2..84ac111e75 100644
--- a/android/filament-utils-android/src/main/cpp/Manipulator.cpp
+++ b/android/filament-utils-android/src/main/cpp/Manipulator.cpp
@@ -125,6 +125,11 @@ extern "C" JNIEXPORT void Java_com_google_android_filament_utils_Manipulator_nBu
builder->groundPlane(a, b, c, d);
}
+extern "C" JNIEXPORT void Java_com_google_android_filament_utils_Manipulator_nBuilderPanning(JNIEnv*, jclass, jlong nativeBuilder, jboolean enabled) {
+ Builder* builder = (Builder*) nativeBuilder;
+ builder->panning(enabled);
+}
+
extern "C" JNIEXPORT long Java_com_google_android_filament_utils_Manipulator_nBuilderBuild(JNIEnv*, jclass, jlong nativeBuilder, jint mode) {
Builder* builder = (Builder*) nativeBuilder;
return (jlong) builder->build((Mode) mode);
diff --git a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Manipulator.java b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Manipulator.java
index 2c0ab85a14..548a6e6f8c 100644
--- a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Manipulator.java
+++ b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Manipulator.java
@@ -274,6 +274,17 @@ public class Manipulator {
return this;
}
+ /**
+ * Sets whether panning is enabled in the manipulator.
+ *
+ * @return this Builder object for chaining calls
+ */
+ @NonNull
+ public Builder panning(Boolean enabled) {
+ nBuilderPanning(mNativeBuilder, enabled);
+ return this;
+ }
+
/**
* Creates and returns the Manipulator object.
*
@@ -483,6 +494,7 @@ public class Manipulator {
private static native void nBuilderFlightPanSpeed(long nativeBuilder, float x, float y);
private static native void nBuilderFlightMoveDamping(long nativeBuilder, float damping);
private static native void nBuilderGroundPlane(long nativeBuilder, float a, float b, float c, float d);
+ private static native void nBuilderPanning(long nativeBuilder, Boolean enabled);
private static native long nBuilderBuild(long nativeBuilder, int mode);
private static native void nDestroyManipulator(long nativeManip);
diff --git a/libs/camutils/include/camutils/Manipulator.h b/libs/camutils/include/camutils/Manipulator.h
index 2cc8a4da03..5ea49eaf5a 100644
--- a/libs/camutils/include/camutils/Manipulator.h
+++ b/libs/camutils/include/camutils/Manipulator.h
@@ -109,6 +109,7 @@ public:
vec4 groundPlane;
RayCallback raycastCallback;
void* raycastUserdata;
+ bool panning = true;
};
struct Builder {
@@ -143,6 +144,8 @@ public:
Builder& groundPlane(FLOAT a, FLOAT b, FLOAT c, FLOAT d); //! Plane equation used as a raycast fallback
Builder& raycastCallback(RayCallback cb, void* userdata); //! Raycast function for accurate grab-and-pan
+ Builder& panning(bool enabled); //! Sets whether panning is enabled
+
/**
* Creates a new camera manipulator, either ORBIT, MAP, or FREE_FLIGHT.
*
diff --git a/libs/camutils/src/Manipulator.cpp b/libs/camutils/src/Manipulator.cpp
index d44528cd50..897d75c6d1 100644
--- a/libs/camutils/src/Manipulator.cpp
+++ b/libs/camutils/src/Manipulator.cpp
@@ -144,6 +144,14 @@ Manipulator::Builder& Manipulator::Builder::raycastCallback(RayCal
return *this;
}
+
+
+template typename
+Manipulator::Builder& Manipulator::Builder::panning(bool enabled) {
+ details.panning = enabled;
+ return *this;
+}
+
template
Manipulator* Manipulator::Builder::build(Mode mode) {
switch (mode) {
diff --git a/libs/camutils/src/OrbitManipulator.h b/libs/camutils/src/OrbitManipulator.h
index 54e325cc3b..f89b7ada03 100644
--- a/libs/camutils/src/OrbitManipulator.h
+++ b/libs/camutils/src/OrbitManipulator.h
@@ -69,7 +69,7 @@ public:
}
void grabBegin(int x, int y, bool strafe) override {
- mGrabState = strafe ? PANNING : ORBITING;
+ mGrabState = strafe && Base::mProps.panning ? PANNING : ORBITING;
mGrabPivot = mPivot;
mGrabEye = Base::mEye;
mGrabTarget = Base::mTarget;