diff --git a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/ModelViewer.kt b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/ModelViewer.kt index 4422250a09..b89d16c9d1 100644 --- a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/ModelViewer.kt +++ b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/ModelViewer.kt @@ -242,6 +242,7 @@ class ModelViewer(val engine: Engine) : android.view.View.OnTouchListener { while (popRenderables()) { scene.addEntities(readyRenderables.take(count).toIntArray()) } + scene.addEntities(asset.lightEntities) } private fun addDetachListener(view: android.view.View) { diff --git a/android/gltfio-android/src/main/cpp/FilamentAsset.cpp b/android/gltfio-android/src/main/cpp/FilamentAsset.cpp index 2c3009b631..06a0ddb7f6 100644 --- a/android/gltfio-android/src/main/cpp/FilamentAsset.cpp +++ b/android/gltfio-android/src/main/cpp/FilamentAsset.cpp @@ -65,6 +65,24 @@ Java_com_google_android_filament_gltfio_FilamentAsset_nGetEntities(JNIEnv* env, env->ReleaseIntArrayElements(result, (jint*) entities, 0); } +extern "C" JNIEXPORT jint JNICALL +Java_com_google_android_filament_gltfio_FilamentAsset_nGetLightEntityCount(JNIEnv*, jclass, + jlong nativeAsset) { + FilamentAsset* asset = (FilamentAsset*) nativeAsset; + return asset->getLightEntityCount(); +} + +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_gltfio_FilamentAsset_nGetLightEntities(JNIEnv* env, jclass, + jlong nativeAsset, jintArray result) { + FilamentAsset* asset = (FilamentAsset*) nativeAsset; + jsize available = env->GetArrayLength(result); + Entity* entities = (Entity*) env->GetIntArrayElements(result, nullptr); + std::copy_n(asset->getLightEntities(), + std::min(available, (jsize) asset->getLightEntityCount()), entities); + env->ReleaseIntArrayElements(result, (jint*) entities, 0); +} + extern "C" JNIEXPORT jint JNICALL Java_com_google_android_filament_gltfio_FilamentAsset_nGetMaterialInstanceCount(JNIEnv*, jclass, jlong nativeAsset) { diff --git a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/FilamentAsset.java b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/FilamentAsset.java index b80ca6c47a..6f4eaaff0c 100644 --- a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/FilamentAsset.java +++ b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/FilamentAsset.java @@ -95,7 +95,7 @@ public class FilamentAsset { * Gets the list of entities, one for each glTF node. * *

All of these have a transform component. Some of the returned entities may also have a - * renderable component.

+ * renderable or light component.

*/ public @NonNull @Entity int[] getEntities() { int[] result = new int[nGetEntityCount(mNativeObject)]; @@ -103,6 +103,15 @@ public class FilamentAsset { return result; } + /** + * Gets only the entities that have light components. + */ + public @NonNull @Entity int[] getLightEntities() { + int[] result = new int[nGetLightEntityCount(mNativeObject)]; + nGetLightEntities(mNativeObject, result); + return result; + } + public @NonNull MaterialInstance[] getMaterialInstances() { final int count = nGetMaterialInstanceCount(mNativeObject); MaterialInstance[] result = new MaterialInstance[count]; @@ -174,6 +183,9 @@ public class FilamentAsset { private static native int nGetEntityCount(long nativeAsset); private static native void nGetEntities(long nativeAsset, int[] result); + private static native int nGetLightEntityCount(long nativeAsset); + private static native void nGetLightEntities(long nativeAsset, int[] result); + private static native int nGetMaterialInstanceCount(long nativeAsset); private static native void nGetMaterialInstances(long nativeAsset, long[] nativeResults); diff --git a/web/filament-js/filament.d.ts b/web/filament-js/filament.d.ts index 90b49d8524..032d0085b7 100644 --- a/web/filament-js/filament.d.ts +++ b/web/filament-js/filament.d.ts @@ -457,6 +457,7 @@ export class gltfio$FilamentAsset { public loadResources(onDone: () => void|null, onFetched: (s: string) => void|null, basePath: string|null, asyncInterval: number|null): void; public getEntities(): EntityVector; + public getLightEntities(): EntityVector; public getRoot(): Entity; public popRenderable(): Entity; public getMaterialInstances(): MaterialInstance[]; diff --git a/web/filament-js/jsbindings.cpp b/web/filament-js/jsbindings.cpp index 6c11aadb60..232da9aa17 100644 --- a/web/filament-js/jsbindings.cpp +++ b/web/filament-js/jsbindings.cpp @@ -1457,6 +1457,11 @@ class_("gltfio$FilamentAsset") return std::vector(ptr, ptr + self->getEntityCount()); }), allow_raw_pointers()) + .function("getLightEntities", EMBIND_LAMBDA(std::vector, (FilamentAsset* self), { + const utils::Entity* ptr = self->getLightEntities(); + return std::vector(ptr, ptr + self->getLightEntityCount()); + }), allow_raw_pointers()) + .function("getRoot", &FilamentAsset::getRoot) .function("popRenderable", &FilamentAsset::popRenderable)