diff --git a/android/gltfio-android/src/main/cpp/FilamentAsset.cpp b/android/gltfio-android/src/main/cpp/FilamentAsset.cpp index 598d9b4e42..f4c2fa20f1 100644 --- a/android/gltfio-android/src/main/cpp/FilamentAsset.cpp +++ b/android/gltfio-android/src/main/cpp/FilamentAsset.cpp @@ -201,6 +201,44 @@ Java_com_google_android_filament_gltfio_FilamentAsset_nGetExtras(JNIEnv* env, jc return val ? env->NewStringUTF(val) : nullptr; } +extern "C" JNIEXPORT jint JNICALL +Java_com_google_android_filament_gltfio_FilamentAsset_nGetSkinCount(JNIEnv* , jclass, + jlong nativeAsset) { + FilamentAsset* asset = (FilamentAsset*) nativeAsset; + return (jint) asset->getSkinCount(); +} + +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_gltfio_FilamentAsset_nGetSkinNames(JNIEnv* env, jclass, + jlong nativeAsset, jobjectArray result) { + FilamentAsset* asset = (FilamentAsset*) nativeAsset; + jsize available = env->GetArrayLength(result); + for (int i = 0; i < available; ++i) { + const char* name = asset->getSkinNameAt(i); + if (name) { + env->SetObjectArrayElement(result, (jsize) i, env->NewStringUTF(name)); + } + } +} + +extern "C" JNIEXPORT jint JNICALL +Java_com_google_android_filament_gltfio_FilamentAsset_nGetJointCountAt(JNIEnv* , jclass, + jlong nativeAsset, jint skinIndex) { + FilamentAsset* asset = (FilamentAsset*) nativeAsset; + return (jint) asset->getJointCountAt(skinIndex); +} + +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_gltfio_FilamentAsset_nGetJointsAt(JNIEnv* env, jclass, + jlong nativeAsset, jint skinIndex, jintArray result) { + FilamentAsset* asset = (FilamentAsset*) nativeAsset; + jsize available = env->GetArrayLength(result); + Entity* entities = (Entity*) env->GetIntArrayElements(result, nullptr); + std::copy_n(asset->getJointsAt(skinIndex), + std::min(available, (jsize) asset->getJointCountAt(skinIndex)), entities); + env->ReleaseIntArrayElements(result, (jint*) entities, 0); +} + extern "C" JNIEXPORT jlong JNICALL Java_com_google_android_filament_gltfio_FilamentAsset_nGetAnimator(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 1b705f8a6d..47c1c6bed8 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 @@ -216,6 +216,38 @@ public class FilamentAsset { return mAnimator; } + /** + * Gets the skin count of this asset. + */ + public int getSkinCount() { + return nGetSkinCount(getNativeObject()); + } + + /** + * Gets the skin name at skin index in this asset. + */ + public @NonNull String[] getSkinNames() { + String[] result = new String[getSkinCount()]; + nGetSkinNames(getNativeObject(), result); + return result; + } + + /** + * Gets the joint count at skin index in this asset. + */ + public int getJointCountAt(int skinIndex) { + return nGetJointCountAt(getNativeObject(), skinIndex); + } + + /** + * Gets joints at skin index in this asset. + */ + public @NonNull @Entity int[] getJointsAt(int skinIndex) { + int[] result = new int[getJointCountAt(skinIndex)]; + nGetJointsAt(getNativeObject(), skinIndex, result); + return result; + } + /** * Gets the names of all morph targets in the given entity. */ @@ -306,6 +338,10 @@ public class FilamentAsset { private static native String nGetExtras(long nativeAsset, int entity); private static native long nGetAnimator(long nativeAsset); private static native void nApplyMaterialVariant(long nativeAsset, int variantIndex); + private static native int nGetSkinCount(long nativeAsset); + private static native void nGetSkinNames(long nativeAsset, String[] result); + private static native int nGetJointCountAt(long nativeAsset, int skinIndex); + private static native void nGetJointsAt(long nativeAsset, int skinIndex, int[] result); private static native int nGetResourceUriCount(long nativeAsset); private static native void nGetResourceUris(long nativeAsset, String[] result); private static native void nReleaseSourceData(long nativeAsset);