From 0fe8035309388d044397380fb1615f286a1c865c Mon Sep 17 00:00:00 2001 From: Philip Rideout Date: Tue, 6 Aug 2019 09:30:21 -0700 Subject: [PATCH] gltfio: allow names to be queried. Fixes #1425. --- .../src/main/cpp/FilamentAsset.cpp | 10 ++++++++++ .../android/filament/gltfio/FilamentAsset.java | 5 +++++ libs/gltfio/include/gltfio/FilamentAsset.h | 3 +++ libs/gltfio/include/gltfio/SimpleViewer.h | 17 ++++------------- libs/gltfio/src/AssetLoader.cpp | 2 +- libs/gltfio/src/FFilamentAsset.h | 13 ++++++++++++- libs/gltfio/src/FilamentAsset.cpp | 4 ++++ samples/gltf_baker.cpp | 2 +- samples/gltf_viewer.cpp | 2 +- web/filament-js/filament.d.ts | 2 ++ web/filament-js/jsbindings.cpp | 11 +++++++++-- 11 files changed, 52 insertions(+), 19 deletions(-) diff --git a/android/gltfio-android/src/main/cpp/FilamentAsset.cpp b/android/gltfio-android/src/main/cpp/FilamentAsset.cpp index 3675439caf..e0007de8f0 100644 --- a/android/gltfio-android/src/main/cpp/FilamentAsset.cpp +++ b/android/gltfio-android/src/main/cpp/FilamentAsset.cpp @@ -61,3 +61,13 @@ Java_com_google_android_filament_gltfio_FilamentAsset_nGetBoundingBox(JNIEnv* en values[5] = extent.z; env->ReleaseFloatArrayElements(result, (jfloat*) values, 0); } + +extern "C" JNIEXPORT jstring JNICALL +Java_com_google_android_filament_gltfio_FilamentAsset_nGetName(JNIEnv* env, jclass, + jlong nativeAsset, jint entityId) { + uint32_t id = entityId; + Entity* entity = (Entity*) &id; + FilamentAsset* asset = (FilamentAsset*) nativeAsset; + const char* val = asset->getName(*entity); + return val ? env->NewStringUTF(val) : nullptr; +} 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 ddaae3bf5d..06f4d23e50 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 @@ -48,6 +48,10 @@ public class FilamentAsset { return new Box(box[0], box[1], box[2], box[3], box[4], box[5]); } + public String getName(@Entity int entity) { + return nGetName(getNativeObject(), entity); + } + void clearNativeObject() { mNativeObject = 0; } @@ -56,4 +60,5 @@ public class FilamentAsset { private static native int nGetEntityCount(long nativeAsset); private static native void nGetEntities(long nativeAsset, int[] result); private static native void nGetBoundingBox(long nativeAsset, float[] box); + private static native String nGetName(long nativeAsset, int entity); } diff --git a/libs/gltfio/include/gltfio/FilamentAsset.h b/libs/gltfio/include/gltfio/FilamentAsset.h index 559e442081..bf3215dca6 100644 --- a/libs/gltfio/include/gltfio/FilamentAsset.h +++ b/libs/gltfio/include/gltfio/FilamentAsset.h @@ -80,6 +80,9 @@ public: /** Gets the bounding box computed from the supplied min / max values in glTF accessors. */ filament::Aabb getBoundingBox() const noexcept; + /** Gets the NameComponentManager label for the given entity, if it exists. */ + const char* getName(utils::Entity) const noexcept; + /** * Lazily creates the animation engine or returns it from the cache. * The animator is owned by the asset and should not be manually deleted. diff --git a/libs/gltfio/include/gltfio/SimpleViewer.h b/libs/gltfio/include/gltfio/SimpleViewer.h index e475616813..87b07cd77f 100644 --- a/libs/gltfio/include/gltfio/SimpleViewer.h +++ b/libs/gltfio/include/gltfio/SimpleViewer.h @@ -34,7 +34,6 @@ #include #include -#include #include @@ -75,10 +74,9 @@ public: * passing it in. * * @param asset The asset to view. - * @param names Optional name manager used to add glTF mesh names to nodes. * @param scale Adds a transform to the root to fit the asset into a unit cube at the origin. */ - void setAsset(FilamentAsset* asset, utils::NameComponentManager* names, bool scale); + void setAsset(FilamentAsset* asset, bool scale); /** * Removes the current asset from the viewer. @@ -139,7 +137,6 @@ private: // Properties that can be changed from the application. FilamentAsset* mAsset = nullptr; - utils::NameComponentManager* mNames = nullptr; Animator* mAnimator = nullptr; filament::IndirectLight* mIndirectLight = nullptr; std::function mCustomUI; @@ -201,7 +198,6 @@ SimpleViewer::SimpleViewer(filament::Engine* engine, filament::Scene* scene, fil uint32_t flags, int sidebarWidth) : mEngine(engine), mScene(scene), mView(view), mSunlight(utils::EntityManager::get().create()), - mNames(new utils::NameComponentManager(utils::EntityManager::get())), mSidebarWidth(sidebarWidth), mFlags(flags) { using namespace filament; @@ -223,12 +219,11 @@ SimpleViewer::~SimpleViewer() { mEngine->destroy(mSunlight); } -void SimpleViewer::setAsset(FilamentAsset* asset, utils::NameComponentManager* names, bool scale) { +void SimpleViewer::setAsset(FilamentAsset* asset, bool scale) { using namespace filament::math; removeAsset(); mAsset = asset; mAnimator = asset->getAnimator(); - mNames = names; if (scale) { auto& tcm = mEngine->getTransformManager(); auto root = tcm.getInstance(mAsset->getRoot()); @@ -248,7 +243,6 @@ void SimpleViewer::removeAsset() { } mAsset = nullptr; mAnimator = nullptr; - mNames = nullptr; } void SimpleViewer::setIndirectLight(filament::IndirectLight* ibl) { @@ -327,11 +321,8 @@ void SimpleViewer::updateUserInterface() { auto rinstance = rm.getInstance(entity); intptr_t treeNodeId = 1 + entity.getId(); - const char* label = rinstance ? "Mesh" : "Node"; - auto nameInstance = mNames->getInstance(entity); - if (nameInstance) { - label = mNames->getName(nameInstance); - } + const char* name = mAsset->getName(entity); + const char* label = name ? name : (rinstance ? "Mesh" : "Node"); ImGuiTreeNodeFlags flags = rinstance ? 0 : ImGuiTreeNodeFlags_DefaultOpen; std::vector children(tm.getChildCount(tinstance)); diff --git a/libs/gltfio/src/AssetLoader.cpp b/libs/gltfio/src/AssetLoader.cpp index 9bff3dea84..c267486108 100644 --- a/libs/gltfio/src/AssetLoader.cpp +++ b/libs/gltfio/src/AssetLoader.cpp @@ -203,7 +203,7 @@ void FAssetLoader::createAsset(const cgltf_data* srcAsset) { } } - mResult = new FFilamentAsset(mEngine); + mResult = new FFilamentAsset(mEngine, mNameManager); mResult->mSourceAsset = srcAsset; mResult->acquireSourceAsset(); diff --git a/libs/gltfio/src/FFilamentAsset.h b/libs/gltfio/src/FFilamentAsset.h index 3bd96b25c2..928c905a1b 100644 --- a/libs/gltfio/src/FFilamentAsset.h +++ b/libs/gltfio/src/FFilamentAsset.h @@ -32,6 +32,7 @@ #include #include +#include #include @@ -55,7 +56,8 @@ struct Skin { }; struct FFilamentAsset : public FilamentAsset { - FFilamentAsset(filament::Engine* engine) : mEngine(engine) {} + FFilamentAsset(filament::Engine* engine, utils::NameComponentManager* names) : + mEngine(engine), mNameManager(names) {} ~FFilamentAsset() { releaseSourceData(); @@ -123,6 +125,14 @@ struct FFilamentAsset : public FilamentAsset { return mBoundingBox; } + const char* getName(utils::Entity entity) const noexcept { + if (mNameManager == nullptr) { + return nullptr; + } + auto nameInstance = mNameManager->getInstance(entity); + return nameInstance ? mNameManager->getName(nameInstance) : nullptr; + } + Animator* getAnimator() noexcept { if (!mAnimator) { mAnimator = new Animator(this); @@ -171,6 +181,7 @@ struct FFilamentAsset : public FilamentAsset { } filament::Engine* mEngine; + utils::NameComponentManager* mNameManager; std::vector mGlbData; std::vector mEntities; std::vector mMaterialInstances; diff --git a/libs/gltfio/src/FilamentAsset.cpp b/libs/gltfio/src/FilamentAsset.cpp index a4af04a8cb..9d3ea14085 100644 --- a/libs/gltfio/src/FilamentAsset.cpp +++ b/libs/gltfio/src/FilamentAsset.cpp @@ -67,6 +67,10 @@ filament::Aabb FilamentAsset::getBoundingBox() const noexcept { return upcast(this)->getBoundingBox(); } +const char* FilamentAsset::getName(utils::Entity entity) const noexcept { + return upcast(this)->getName(entity); +} + Animator* FilamentAsset::getAnimator() noexcept { return upcast(this)->getAnimator(); } diff --git a/samples/gltf_baker.cpp b/samples/gltf_baker.cpp index eb5a23f8ba..ab8740e5fd 100644 --- a/samples/gltf_baker.cpp +++ b/samples/gltf_baker.cpp @@ -329,7 +329,7 @@ static void updateViewerMesh(BakerApp& app) { app.viewerAsset->getAnimator(); // Remove old renderables and add new renderables to the scene. - app.viewer->setAsset(app.viewerAsset, app.names, !app.viewerActualSize); + app.viewer->setAsset(app.viewerAsset, !app.viewerActualSize); // Destory old Filament entities. app.loader->destroyAsset(previousViewerAsset); diff --git a/samples/gltf_viewer.cpp b/samples/gltf_viewer.cpp index 247ec9b3c6..704b20d3bd 100644 --- a/samples/gltf_viewer.cpp +++ b/samples/gltf_viewer.cpp @@ -205,7 +205,7 @@ int main(int argc, char** argv) { app.asset->releaseSourceData(); // Add the renderables to the scene. - app.viewer->setAsset(app.asset, app.names, !app.actualSize); + app.viewer->setAsset(app.asset, !app.actualSize); auto ibl = FilamentApp::get().getIBL(); if (ibl) { diff --git a/web/filament-js/filament.d.ts b/web/filament-js/filament.d.ts index c2276ec963..906129b28a 100644 --- a/web/filament-js/filament.d.ts +++ b/web/filament-js/filament.d.ts @@ -202,6 +202,8 @@ export class Renderer { export class Material { public createInstance(): MaterialInstance; + public getDefaultInstance(): MaterialInstance; + public getName(): string; } export class Frustum { diff --git a/web/filament-js/jsbindings.cpp b/web/filament-js/jsbindings.cpp index 448f36f6b8..e9dda67a4e 100644 --- a/web/filament-js/jsbindings.cpp +++ b/web/filament-js/jsbindings.cpp @@ -69,6 +69,7 @@ #include #include +#include #include #include @@ -875,7 +876,10 @@ class_("Material") .function("getDefaultInstance", select_overload(&Material::getDefaultInstance), allow_raw_pointers()) - .function("createInstance", &Material::createInstance, allow_raw_pointers()); + .function("createInstance", &Material::createInstance, allow_raw_pointers()) + .function("getName", EMBIND_LAMBDA(std::string, (Material* self), { + return std::string(self->getName()); + }), allow_raw_pointers()); class_("MaterialInstance") .function("setFloatParameter", EMBIND_LAMBDA(void, @@ -1322,6 +1326,9 @@ class_("gltfio$FilamentAsset") }), allow_raw_pointers()) .function("getBoundingBox", &FilamentAsset::getBoundingBox) + .function("getName", EMBIND_LAMBDA(std::string, (FilamentAsset* self, utils::Entity entity), { + return std::string(self->getName(entity)); + }), allow_raw_pointers()) .function("getAnimator", &FilamentAsset::getAnimator, allow_raw_pointers()) .function("getWireframe", &FilamentAsset::getWireframe) .function("getEngine", &FilamentAsset::getEngine, allow_raw_pointers()) @@ -1342,7 +1349,7 @@ class_("gltfio$UbershaderLoader") class_("gltfio$AssetLoader") .constructor(EMBIND_LAMBDA(AssetLoader*, (Engine* engine, UbershaderLoader materials), { - utils::NameComponentManager* names = nullptr; + auto names = new utils::NameComponentManager(utils::EntityManager::get()); return AssetLoader::create({ engine, materials.provider, names }); }), allow_raw_pointers())