diff --git a/android/filament-android/src/main/cpp/LightManager.cpp b/android/filament-android/src/main/cpp/LightManager.cpp index af5c35adb7..4c8617f60b 100644 --- a/android/filament-android/src/main/cpp/LightManager.cpp +++ b/android/filament-android/src/main/cpp/LightManager.cpp @@ -22,48 +22,47 @@ using namespace filament; using namespace utils; extern "C" JNIEXPORT jboolean JNICALL -Java_com_google_android_filament_LightManager_nHasComponent(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nHasComponent(JNIEnv*, jclass, jlong nativeLightManager, jint entity) { LightManager *lm = (LightManager *) nativeLightManager; return (jboolean) lm->hasComponent((Entity &) entity); } extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_LightManager_nGetInstance(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nGetInstance(JNIEnv*, jclass, jlong nativeLightManager, jint entity) { LightManager *lm = (LightManager *) nativeLightManager; return lm->getInstance((Entity &) entity); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nDestroy(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nDestroy(JNIEnv*, jclass, jlong nativeLightManager, jint entity) { LightManager *lm = (LightManager *) nativeLightManager; lm->destroy((Entity &) entity); } extern "C" JNIEXPORT jlong JNICALL -Java_com_google_android_filament_LightManager_nCreateBuilder(JNIEnv *env, jclass type, - jint lightType) { +Java_com_google_android_filament_LightManager_nCreateBuilder(JNIEnv*, jclass, jint lightType) { return (jlong) new LightManager::Builder((LightManager::Type) lightType); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nDestroyBuilder(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nDestroyBuilder(JNIEnv*, jclass, jlong nativeBuilder) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; delete builder; } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nBuilderCastShadows(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nBuilderCastShadows(JNIEnv*, jclass, jlong nativeBuilder, jboolean enable) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; builder->castShadows(enable); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nBuilderShadowOptions(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nBuilderShadowOptions(JNIEnv*, jclass, jlong nativeBuilder, jint mapSize, jfloat constantBias, jfloat normalBias, jfloat shadowFar, jfloat shadowNearHint, jfloat shadowFarHint, jboolean stable) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; @@ -78,84 +77,84 @@ Java_com_google_android_filament_LightManager_nBuilderShadowOptions(JNIEnv *env, } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nBuilderCastLight(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nBuilderCastLight(JNIEnv*, jclass, jlong nativeBuilder, jboolean enabled) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; builder->castLight(enabled); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nBuilderPosition(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nBuilderPosition(JNIEnv*, jclass, jlong nativeBuilder, jfloat x, jfloat y, jfloat z) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; builder->position({x, y, z}); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nBuilderDirection(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nBuilderDirection(JNIEnv*, jclass, jlong nativeBuilder, jfloat x, jfloat y, jfloat z) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; builder->direction({x, y, z}); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nBuilderColor(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nBuilderColor(JNIEnv*, jclass, jlong nativeBuilder, jfloat linearR, jfloat linearG, jfloat linearB) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; builder->color({linearR, linearG, linearB}); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nBuilderIntensity__JF(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nBuilderIntensity__JF(JNIEnv*, jclass, jlong nativeBuilder, jfloat intensity) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; builder->intensity(intensity); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nBuilderIntensity__JFF(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nBuilderIntensity__JFF(JNIEnv*, jclass, jlong nativeBuilder, jfloat watts, jfloat efficiency) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; builder->intensity(watts, efficiency); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nBuilderFalloff(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nBuilderFalloff(JNIEnv*, jclass, jlong nativeBuilder, jfloat radius) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; builder->falloff(radius); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nBuilderSpotLightCone(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nBuilderSpotLightCone(JNIEnv*, jclass, jlong nativeBuilder, jfloat inner, jfloat outer) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; builder->spotLightCone(inner, outer); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nBuilderAngularRadius(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nBuilderAngularRadius(JNIEnv*, jclass, jlong nativeBuilder, jfloat angularRadius) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; builder->sunAngularRadius(angularRadius); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nBuilderHaloSize(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nBuilderHaloSize(JNIEnv*, jclass, jlong nativeBuilder, jfloat haloSize) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; builder->sunHaloSize(haloSize); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nBuilderHaloFalloff(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nBuilderHaloFalloff(JNIEnv*, jclass, jlong nativeBuilder, jfloat haloFalloff) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; builder->sunHaloFalloff(haloFalloff); } extern "C" JNIEXPORT jboolean JNICALL -Java_com_google_android_filament_LightManager_nBuilderBuild(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nBuilderBuild(JNIEnv*, jclass, jlong nativeBuilder, jlong nativeEngine, jint entity) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; Engine *engine = (Engine *) nativeEngine; @@ -170,133 +169,147 @@ Java_com_google_android_filament_LightManager_nGetType(JNIEnv* env, } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nSetPosition(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nSetPosition(JNIEnv*, jclass, jlong nativeLightManager, jint i, jfloat x, jfloat y, jfloat z) { LightManager *lm = (LightManager *) nativeLightManager; lm->setPosition((LightManager::Instance) i, {x, y, z}); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nGetPosition(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nGetPosition(JNIEnv* env, jclass, jlong nativeLightManager, jint i, jfloatArray out_) { LightManager *lm = (LightManager *) nativeLightManager; - jfloat *out = env->GetFloatArrayElements(out_, NULL); + jfloat *out = env->GetFloatArrayElements(out_, nullptr); *reinterpret_cast(out) = lm->getPosition((LightManager::Instance) i); env->ReleaseFloatArrayElements(out_, out, 0); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nSetDirection(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nSetDirection(JNIEnv*, jclass, jlong nativeLightManager, jint i, jfloat x, jfloat y, jfloat z) { LightManager *lm = (LightManager *) nativeLightManager; lm->setDirection((LightManager::Instance) i, {x, y, z}); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nGetDirection(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nGetDirection(JNIEnv *env, jclass, jlong nativeLightManager, jint i, jfloatArray out_) { LightManager *lm = (LightManager *) nativeLightManager; - jfloat *out = env->GetFloatArrayElements(out_, NULL); + jfloat *out = env->GetFloatArrayElements(out_, nullptr); *reinterpret_cast(out) = lm->getDirection((LightManager::Instance) i); env->ReleaseFloatArrayElements(out_, out, 0); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nSetColor(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nSetColor(JNIEnv*, jclass, jlong nativeLightManager, jint i, jfloat linearR, jfloat linearG, jfloat linearB) { LightManager *lm = (LightManager *) nativeLightManager; lm->setColor((LightManager::Instance) i, {linearR, linearG, linearB}); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nGetColor(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nGetColor(JNIEnv *env, jclass, jlong nativeLightManager, jint i, jfloatArray out_) { LightManager *lm = (LightManager *) nativeLightManager; - jfloat *out = env->GetFloatArrayElements(out_, NULL); + jfloat *out = env->GetFloatArrayElements(out_, nullptr); *reinterpret_cast(out) = lm->getColor((LightManager::Instance) i); env->ReleaseFloatArrayElements(out_, out, 0); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nSetIntensity__JIF(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nSetIntensity__JIF(JNIEnv*, jclass, jlong nativeLightManager, jint i, jfloat intensity) { LightManager *lm = (LightManager *) nativeLightManager; lm->setIntensity((LightManager::Instance) i, intensity); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nSetIntensity__JIFF(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nSetIntensity__JIFF(JNIEnv*, jclass, jlong nativeLightManager, jint i, jfloat watts, jfloat efficiency) { LightManager *lm = (LightManager *) nativeLightManager; lm->setIntensity((LightManager::Instance) i, watts, efficiency); } extern "C" JNIEXPORT jfloat JNICALL -Java_com_google_android_filament_LightManager_nGetIntensity(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nGetIntensity(JNIEnv*, jclass, jlong nativeLightManager, jint i) { LightManager *lm = (LightManager *) nativeLightManager; return lm->getIntensity((LightManager::Instance) i); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nSetFalloff(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nSetFalloff(JNIEnv*, jclass, jlong nativeLightManager, jint i, jfloat falloff) { LightManager *lm = (LightManager *) nativeLightManager; lm->setFalloff((LightManager::Instance) i, falloff); } extern "C" JNIEXPORT jfloat JNICALL -Java_com_google_android_filament_LightManager_nGetFalloff(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nGetFalloff(JNIEnv*, jclass, jlong nativeLightManager, jint i) { LightManager *lm = (LightManager *) nativeLightManager; return lm->getFalloff((LightManager::Instance) i); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nSetSpotLightCone(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nSetSpotLightCone(JNIEnv*, jclass, jlong nativeLightManager, jint i, jfloat inner, jfloat outer) { LightManager *lm = (LightManager *) nativeLightManager; lm->setSpotLightCone((LightManager::Instance) i, inner, outer); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nSetSunAngularRadius(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nSetSunAngularRadius(JNIEnv*, jclass, jlong nativeLightManager, jint i, jfloat angularRadius) { LightManager *lm = (LightManager *) nativeLightManager; lm->setSunAngularRadius((LightManager::Instance) i, angularRadius); } extern "C" JNIEXPORT jfloat JNICALL -Java_com_google_android_filament_LightManager_nGetSunAngularRadius(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nGetSunAngularRadius(JNIEnv*, jclass, jlong nativeLightManager, jint i) { LightManager *lm = (LightManager *) nativeLightManager; return lm->getSunAngularRadius((LightManager::Instance) i); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nSetSunHaloSize(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nSetSunHaloSize(JNIEnv*, jclass, jlong nativeLightManager, jint i, jfloat haloSize) { LightManager *lm = (LightManager *) nativeLightManager; lm->setSunHaloSize((LightManager::Instance) i, haloSize); } extern "C" JNIEXPORT jfloat JNICALL -Java_com_google_android_filament_LightManager_nGetHaloSize(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nGetHaloSize(JNIEnv*, jclass, jlong nativeLightManager, jint i) { LightManager *lm = (LightManager *) nativeLightManager; return lm->getSunHaloSize((LightManager::Instance) i); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_LightManager_nSetSunHaloFalloff(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nSetSunHaloFalloff(JNIEnv*, jclass, jlong nativeLightManager, jint i, jfloat haloFalloff) { LightManager *lm = (LightManager *) nativeLightManager; lm->setSunHaloFalloff((LightManager::Instance) i, haloFalloff); } extern "C" JNIEXPORT jfloat JNICALL -Java_com_google_android_filament_LightManager_nGetHaloFalloff(JNIEnv *env, jclass type, +Java_com_google_android_filament_LightManager_nGetHaloFalloff(JNIEnv*, jclass, jlong nativeLightManager, jint i) { LightManager *lm = (LightManager *) nativeLightManager; return lm->getSunHaloFalloff((LightManager::Instance) i); } + +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_LightManager_nSetShadowCaster(JNIEnv*, jclass, + jlong nativeLightManager, jint i, jfloat shadowCaster) { + LightManager *lm = (LightManager *) nativeLightManager; + lm->setShadowCaster((LightManager::Instance) i, shadowCaster); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_LightManager_nIsShadowCaster(JNIEnv*, jclass, + jlong nativeLightManager, jint i) { + LightManager *lm = (LightManager *) nativeLightManager; + return lm->isShadowCaster((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 32f1d4fe09..de0a196500 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 @@ -262,6 +262,14 @@ public class LightManager { return nGetSunHaloFalloff(mNativeObject, i); } + public void setShadowCaster(@EntityInstance int i, boolean shadowCaster) { + nSetShadowCaster(mNativeObject, i, shadowCaster); + } + + public boolean isShadowCaster(@EntityInstance int i) { + return nIsShadowCaster(mNativeObject, i); + } + private static native boolean nHasComponent(long nativeLightManager, int entity); private static native int nGetInstance(long nativeLightManager, int entity); private static native void nDestroy(long nativeLightManager, int entity); @@ -283,7 +291,6 @@ public class LightManager { private static native void nBuilderHaloSize(long nativeBuilder, float haloSize); private static native void nBuilderHaloFalloff(long nativeBuilder, float haloFalloff); - private static native int nGetType(long nativeLightManager, int i); private static native void nSetPosition(long nativeLightManager, int i, float x, float y, float z); private static native void nGetPosition(long nativeLightManager, int i, float[] out); @@ -303,4 +310,6 @@ public class LightManager { private static native float nGetSunHaloSize(long nativeLightManager, int i); private static native void nSetSunHaloFalloff(long nativeLightManager, int i, float haloFalloff); 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); } diff --git a/filament/include/filament/LightManager.h b/filament/include/filament/LightManager.h index 9d0529b741..9a52d35f12 100644 --- a/filament/include/filament/LightManager.h +++ b/filament/include/filament/LightManager.h @@ -262,6 +262,11 @@ public: */ Builder& castShadows(bool enable) noexcept; + /** + * Sets the shadow-map options for this light. + * + * @return This Builder, for chaining calls. + */ Builder& shadowOptions(const ShadowOptions& options) noexcept; /** @@ -674,6 +679,22 @@ public: * @param options A ShadowOption structure */ void setShadowOptions(Instance i, ShadowOptions const& options) noexcept; + + /** + * Whether this Light casts shadows (disabled by default) + * + * @param shadowCaster Enables or disables casting shadows from this Light. + * + * @warning + * - Only a Type.DIRECTIONAL or Type.SUN light can cast shadows + */ + void setShadowCaster(Instance i, bool shadowCaster) noexcept; + + /** + * returns whether this light casts shadows. + * @param i Instance of the component obtained from getInstance(). + */ + bool isShadowCaster(Instance i) const noexcept; }; } // namespace filament diff --git a/filament/src/components/LightManager.cpp b/filament/src/components/LightManager.cpp index a037f548e8..65e8b66258 100644 --- a/filament/src/components/LightManager.cpp +++ b/filament/src/components/LightManager.cpp @@ -276,7 +276,7 @@ void FLightManager::setFalloff(Instance i, float falloff) noexcept { if (i && !isDirectionalLight(i)) { float sqFalloff = falloff * falloff; SpotParams& spotParams = manager[i].spotParams; - manager[i].squaredFallOffInv = sqFalloff ? (1 / sqFalloff) : 0; + manager[i].squaredFallOffInv = sqFalloff > 0.0f ? (1 / sqFalloff) : 0; spotParams.radius = falloff; } } @@ -314,27 +314,32 @@ void FLightManager::setSpotLightCone(Instance i, float inner, float outer) noexc } void FLightManager::setSunAngularRadius(Instance i, float angularRadius) noexcept { - auto& manager = mManager; if (i && isSunLight(i)) { angularRadius = clamp(angularRadius, 0.25f, 20.0f); - manager[i].sunAngularRadius = angularRadius * float(M_PI / 180.0); + mManager[i].sunAngularRadius = angularRadius * float(M_PI / 180.0); } } void FLightManager::setSunHaloSize(Instance i, float haloSize) noexcept { - auto& manager = mManager; if (i && isSunLight(i)) { - manager[i].sunHaloSize = haloSize; + mManager[i].sunHaloSize = haloSize; } } void FLightManager::setSunHaloFalloff(Instance i, float haloFalloff) noexcept { - auto& manager = mManager; if (i && isSunLight(i)) { - manager[i].sunHaloFalloff = haloFalloff; + mManager[i].sunHaloFalloff = haloFalloff; } } +void FLightManager::setShadowCaster(Instance i, bool shadowCaster) noexcept { + if (i) { + LightType& lightType = mManager[i].lightType; + lightType.shadowCaster = shadowCaster; + } +} + + } // namespace details // ------------------------------------------------------------------------------------------------ @@ -437,4 +442,12 @@ void LightManager::setShadowOptions(Instance i, ShadowOptions const& options) no upcast(this)->setShadowOptions(i, options); } +bool LightManager::isShadowCaster(Instance i) const noexcept { + return upcast(this)->isShadowCaster(i); +} + +void LightManager::setShadowCaster(Instance i, bool castShadows) noexcept { + upcast(this)->setShadowCaster(i, castShadows); +} + } // namespace filament diff --git a/filament/src/components/LightManager.h b/filament/src/components/LightManager.h index c64decbf95..2bcfc7b742 100644 --- a/filament/src/components/LightManager.h +++ b/filament/src/components/LightManager.h @@ -87,6 +87,7 @@ public: UTILS_NOINLINE void setSpotLightCone(Instance i, float inner, float outer) noexcept; UTILS_NOINLINE void setIntensity(Instance i, float intensity) noexcept; UTILS_NOINLINE void setFalloff(Instance i, float radius) noexcept; + UTILS_NOINLINE void setShadowCaster(Instance i, bool shadowCaster) noexcept; UTILS_NOINLINE void setSunAngularRadius(Instance i, float angularRadius) noexcept; UTILS_NOINLINE void setSunHaloSize(Instance i, float haloSize) noexcept; UTILS_NOINLINE void setSunHaloFalloff(Instance i, float haloFalloff) noexcept; diff --git a/libs/gltfio/include/gltfio/SimpleViewer.h b/libs/gltfio/include/gltfio/SimpleViewer.h index 87b07cd77f..10001708da 100644 --- a/libs/gltfio/include/gltfio/SimpleViewer.h +++ b/libs/gltfio/include/gltfio/SimpleViewer.h @@ -151,6 +151,7 @@ private: filament::math::float3 mSunlightDirection = {0.6, -1.0, -0.8}; bool mEnableWireframe = false; bool mEnableSunlight = true; + bool mEnableShadows = true; bool mEnableDithering = true; bool mEnablePrepass = true; bool mEnableFxaa = true; @@ -391,6 +392,7 @@ void SimpleViewer::updateUserInterface() { ImGui::SliderFloat("Sun intensity", &mSunlightIntensity, 50000.0, 150000.0f); ImGuiExt::DirectionWidget("Sun direction", mSunlightDirection.v); ImGui::Checkbox("Enable sunlight", &mEnableSunlight); + ImGui::Checkbox("Enable shadows", &mEnableShadows); } if (mEnableSunlight) { @@ -399,6 +401,7 @@ void SimpleViewer::updateUserInterface() { lm.setIntensity(sun, mSunlightIntensity); lm.setDirection(sun, normalize(mSunlightDirection)); lm.setColor(sun, mSunlightColor); + lm.setShadowCaster(sun, mEnableShadows); } else { mScene->remove(mSunlight); }