From 26ceaebac61e143f327a7db2cc34e3bafce90506 Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Thu, 4 Sep 2025 11:10:16 -0700 Subject: [PATCH] add RenderManager::getInstanceCount() FIXES=[442916683] --- .../filament-android/src/main/cpp/RenderableManager.cpp | 7 +++++++ .../com/google/android/filament/RenderableManager.java | 9 +++++++++ filament/include/filament/RenderableManager.h | 7 +++++++ filament/src/RenderableManager.cpp | 4 ++++ filament/src/components/RenderableManager.cpp | 9 +++++++++ filament/src/components/RenderableManager.h | 1 + web/filament-js/jsbindings.cpp | 1 + 7 files changed, 38 insertions(+) diff --git a/android/filament-android/src/main/cpp/RenderableManager.cpp b/android/filament-android/src/main/cpp/RenderableManager.cpp index d9b56e02fb..99e3e93a75 100644 --- a/android/filament-android/src/main/cpp/RenderableManager.cpp +++ b/android/filament-android/src/main/cpp/RenderableManager.cpp @@ -450,6 +450,13 @@ Java_com_google_android_filament_RenderableManager_nGetPrimitiveCount(JNIEnv*, j return (jint) rm->getPrimitiveCount((RenderableManager::Instance) i); } +extern "C" JNIEXPORT jint JNICALL +Java_com_google_android_filament_RenderableManager_nGetInstanceCount(JNIEnv*, jclass, + jlong nativeRenderableManager, jint i) { + RenderableManager *rm = (RenderableManager *) nativeRenderableManager; + return (jint) rm->getInstanceCount((RenderableManager::Instance) i); +} + extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_RenderableManager_nSetMaterialInstanceAt(JNIEnv*, jclass, jlong nativeRenderableManager, jint i, jint primitiveIndex, jlong nativeMaterialInstance) { diff --git a/android/filament-android/src/main/java/com/google/android/filament/RenderableManager.java b/android/filament-android/src/main/java/com/google/android/filament/RenderableManager.java index 81053197c5..6a29cc6fa3 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/RenderableManager.java +++ b/android/filament-android/src/main/java/com/google/android/filament/RenderableManager.java @@ -851,6 +851,14 @@ public class RenderableManager { return nGetPrimitiveCount(mNativeObject, i); } + /** + * Gets the immutable number of instances in the given renderable. + */ + @IntRange(from = 0) + public int getInstanceCount(@EntityInstance int i) { + return nGetInstanceCount(mNativeObject, i); + } + /** * Changes the material instance binding for the given primitive. * @@ -1018,6 +1026,7 @@ public class RenderableManager { private static native boolean nIsShadowReceiver(long nativeRenderableManager, int i); private static native void nGetAxisAlignedBoundingBox(long nativeRenderableManager, int i, float[] center, float[] halfExtent); private static native int nGetPrimitiveCount(long nativeRenderableManager, int i); + private static native int nGetInstanceCount(long nativeRenderableManager, int i); private static native void nSetMaterialInstanceAt(long nativeRenderableManager, int i, int primitiveIndex, long nativeMaterialInstance); private static native void nClearMaterialInstanceAt(long nativeRenderableManager, int i, int primitiveIndex); private static native long nGetMaterialInstanceAt(long nativeRenderableManager, int i, int primitiveIndex); diff --git a/filament/include/filament/RenderableManager.h b/filament/include/filament/RenderableManager.h index b0cc14baa8..18a32d6151 100644 --- a/filament/include/filament/RenderableManager.h +++ b/filament/include/filament/RenderableManager.h @@ -783,6 +783,13 @@ public: */ size_t getPrimitiveCount(Instance instance) const noexcept; + /** + * Returns the number of instances for this renderable. + * @param instance Instance of the component obtained from getInstance(). + * @return The number of instances. + */ + size_t getInstanceCount(Instance instance) const noexcept; + /** * Changes the material instance binding for the given primitive. * diff --git a/filament/src/RenderableManager.cpp b/filament/src/RenderableManager.cpp index 8a8f10f6d6..dbfbc549bb 100644 --- a/filament/src/RenderableManager.cpp +++ b/filament/src/RenderableManager.cpp @@ -108,6 +108,10 @@ size_t RenderableManager::getPrimitiveCount(Instance const instance) const noexc return downcast(this)->getPrimitiveCount(instance, 0); } +size_t RenderableManager::getInstanceCount(Instance instance) const noexcept { + return downcast(this)->getInstanceCount(instance); +} + void RenderableManager::setMaterialInstanceAt(Instance const instance, size_t const primitiveIndex, MaterialInstance const* materialInstance) { downcast(this)->setMaterialInstanceAt(instance, 0, primitiveIndex, downcast(materialInstance)); diff --git a/filament/src/components/RenderableManager.cpp b/filament/src/components/RenderableManager.cpp index aa23103ed3..1d416dd1ab 100644 --- a/filament/src/components/RenderableManager.cpp +++ b/filament/src/components/RenderableManager.cpp @@ -1006,4 +1006,13 @@ size_t FRenderableManager::getPrimitiveCount(Instance const instance, uint8_t co return getRenderPrimitives(instance, level).size(); } + +size_t FRenderableManager::getInstanceCount(Instance const instance) const noexcept { + if (instance) { + InstancesInfo const& info = mManager[instance].instances; + return info.count; + } + return 0; +} + } // namespace filament diff --git a/filament/src/components/RenderableManager.h b/filament/src/components/RenderableManager.h index 3ea94dd3af..b60bad78df 100644 --- a/filament/src/components/RenderableManager.h +++ b/filament/src/components/RenderableManager.h @@ -199,6 +199,7 @@ public: size_t getLevelCount(Instance) const noexcept { return 1u; } size_t getPrimitiveCount(Instance instance, uint8_t level) const noexcept; + size_t getInstanceCount(Instance instance) const noexcept; void setMaterialInstanceAt(Instance instance, uint8_t level, size_t primitiveIndex, FMaterialInstance const* materialInstance); void clearMaterialInstanceAt(Instance instance, uint8_t level, size_t primitiveIndex); diff --git a/web/filament-js/jsbindings.cpp b/web/filament-js/jsbindings.cpp index fe9f292458..8a382780ab 100644 --- a/web/filament-js/jsbindings.cpp +++ b/web/filament-js/jsbindings.cpp @@ -1100,6 +1100,7 @@ class_("RenderableManager") .function("getAxisAlignedBoundingBox", &RenderableManager::getAxisAlignedBoundingBox) .function("getPrimitiveCount", &RenderableManager::getPrimitiveCount) + .function("getInstanceCount", &RenderableManager::getInstanceCount) .function("setMaterialInstanceAt", &RenderableManager::setMaterialInstanceAt, allow_raw_pointers()) .function("clearMaterialInstanceAt", &RenderableManager::clearMaterialInstanceAt)