From c087eb682578a9516c8d61a99e4dba7cca37df2c Mon Sep 17 00:00:00 2001
From: Philip Rideout
Date: Thu, 28 May 2020 01:44:23 -0700
Subject: [PATCH] gltfio: Add Java / JavaScript bindings for lights.
---
.../android/filament/utils/ModelViewer.kt | 1 +
.../src/main/cpp/FilamentAsset.cpp | 18 ++++++++++++++++++
.../android/filament/gltfio/FilamentAsset.java | 14 +++++++++++++-
web/filament-js/filament.d.ts | 1 +
web/filament-js/jsbindings.cpp | 5 +++++
5 files changed, 38 insertions(+), 1 deletion(-)
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)