From a2fe9f745cd23739ec0a915ba4599f172981b441 Mon Sep 17 00:00:00 2001 From: Tibor Hencz <39774620+mentholyspirit@users.noreply.github.com> Date: Thu, 27 Jun 2024 03:05:14 +0300 Subject: [PATCH] Add ability to disable panning in the OrbitManipulator (#7928) --- .../src/main/cpp/Manipulator.cpp | 5 +++++ .../google/android/filament/utils/Manipulator.java | 12 ++++++++++++ libs/camutils/include/camutils/Manipulator.h | 3 +++ libs/camutils/src/Manipulator.cpp | 8 ++++++++ libs/camutils/src/OrbitManipulator.h | 2 +- 5 files changed, 29 insertions(+), 1 deletion(-) 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;