From 856a6567a155afe84e2d14aabe343b6de447ae82 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Sun, 23 May 2021 07:04:50 +0200 Subject: [PATCH] LightManager: cone angles API (#3979) --- .../src/main/cpp/LightManager.cpp | 14 ++++++++++++++ .../google/android/filament/LightManager.java | 10 ++++++++++ filament/include/filament/LightManager.h | 16 ++++++++++++++++ filament/src/components/LightManager.cpp | 12 ++++++++++++ filament/src/components/LightManager.h | 2 ++ 5 files changed, 54 insertions(+) diff --git a/android/filament-android/src/main/cpp/LightManager.cpp b/android/filament-android/src/main/cpp/LightManager.cpp index 8cc37f69d7..72bf5dfa4e 100644 --- a/android/filament-android/src/main/cpp/LightManager.cpp +++ b/android/filament-android/src/main/cpp/LightManager.cpp @@ -379,3 +379,17 @@ Java_com_google_android_filament_LightManager_nIsShadowCaster(JNIEnv*, jclass, LightManager *lm = (LightManager *) nativeLightManager; return (jboolean)lm->isShadowCaster((LightManager::Instance) i); } + +extern "C" JNIEXPORT jfloat JNICALL +Java_com_google_android_filament_LightManager_nGetOuterConeAngle(JNIEnv*, jclass, + jlong nativeLightManager, jint i) { + LightManager *lm = (LightManager *) nativeLightManager; + return (jfloat)lm->getSpotLightOuterCone((LightManager::Instance) i); +} + +extern "C" JNIEXPORT jfloat JNICALL +Java_com_google_android_filament_LightManager_nGetInnerConeAngle(JNIEnv*, jclass, + jlong nativeLightManager, jint i) { + LightManager *lm = (LightManager *) nativeLightManager; + return (jfloat)lm->getSpotLightInnerCone((LightManager::Instance) i); +} diff --git a/android/filament-android/src/main/java/com/google/android/filament/LightManager.java b/android/filament-android/src/main/java/com/google/android/filament/LightManager.java index ea537cf2e7..02fff3614b 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/LightManager.java +++ b/android/filament-android/src/main/java/com/google/android/filament/LightManager.java @@ -1065,6 +1065,14 @@ public class LightManager { return nIsShadowCaster(mNativeObject, i); } + public float getOuterConeAngle(@EntityInstance int i) { + return nGetOuterConeAngle(mNativeObject, i); + } + + public float getInnerConeAngle(@EntityInstance int i) { + return nGetInnerConeAngle(mNativeObject, i); + } + public long getNativeObject() { return mNativeObject; } @@ -1118,4 +1126,6 @@ public class LightManager { private static native float nGetSunHaloFalloff(long nativeLightManager, int i); private static native void nSetShadowCaster(long nativeLightManager, int i, boolean shadowCaster); private static native boolean nIsShadowCaster(long nativeLightManager, int i); + private static native float nGetOuterConeAngle(long nativeLightManager, int i); + private static native float nGetInnerConeAngle(long nativeLightManager, int i); } diff --git a/filament/include/filament/LightManager.h b/filament/include/filament/LightManager.h index dd5127267f..64d3211885 100644 --- a/filament/include/filament/LightManager.h +++ b/filament/include/filament/LightManager.h @@ -787,8 +787,24 @@ public: */ void setSpotLightCone(Instance i, float inner, float outer) noexcept; + /** + * returns the outer cone angle in *radians* between inner and pi/2. + * @param i Instance of the component obtained from getInstance(). + * @return the outer cone angle of this light. + */ float getSpotLightOuterCone(Instance i) const noexcept; + /** + * returns the inner cone angle in *radians* between 0 and pi/2. + * + * The value is recomputed from the initial values, thus is not precisely + * the same as the one passed to setSpotLightCone() or Builder.spotLightCone(). + * + * @param i Instance of the component obtained from getInstance(). + * @return the inner cone angle of this light. + */ + float getSpotLightInnerCone(Instance i) const noexcept; + /** * Dynamically updates the angular radius of a Type.SUN light * diff --git a/filament/src/components/LightManager.cpp b/filament/src/components/LightManager.cpp index e96f8eeead..612ad51a7b 100644 --- a/filament/src/components/LightManager.cpp +++ b/filament/src/components/LightManager.cpp @@ -370,6 +370,14 @@ void FLightManager::setShadowCaster(Instance i, bool shadowCaster) noexcept { } } +float FLightManager::getSpotLightInnerCone(Instance i) const noexcept { + const auto& spotParams = getSpotParams(i); + float cosOuter = std::cos(spotParams.outerClamped); + float scale = spotParams.scaleOffset.x; + float inner = std::acos((1.0f / spotParams.scaleOffset.x) + cosOuter); + return inner; +} + // ------------------------------------------------------------------------------------------------ // ShadowCascades utility methods // ------------------------------------------------------------------------------------------------ @@ -482,6 +490,10 @@ float LightManager::getSpotLightOuterCone(Instance i) const noexcept { return upcast(this)->getSpotParams(i).outerClamped; } +float LightManager::getSpotLightInnerCone(Instance i) const noexcept { + return upcast(this)->getSpotLightInnerCone(i); +} + void LightManager::setSunAngularRadius(Instance i, float angularRadius) noexcept { upcast(this)->setSunAngularRadius(i, angularRadius); } diff --git a/filament/src/components/LightManager.h b/filament/src/components/LightManager.h index c262cd4ce3..fda5064d91 100644 --- a/filament/src/components/LightManager.h +++ b/filament/src/components/LightManager.h @@ -191,6 +191,8 @@ public: return mManager[i].spotParams; } + float getSpotLightInnerCone(Instance i) const noexcept; + float getCosOuterSquared(Instance i) const noexcept { return getSpotParams(i).cosOuterSquared; }