From 613e1052c7eb2acb483cf32f07b18570880b6bef Mon Sep 17 00:00:00 2001 From: daemyung jang Date: Fri, 21 Jan 2022 11:03:59 +0900 Subject: [PATCH] Make morphable entities selectable in UI --- libs/viewer/include/viewer/SimpleViewer.h | 4 +++- libs/viewer/src/SimpleViewer.cpp | 29 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/libs/viewer/include/viewer/SimpleViewer.h b/libs/viewer/include/viewer/SimpleViewer.h index 27ad7efadf..72dc129780 100644 --- a/libs/viewer/include/viewer/SimpleViewer.h +++ b/libs/viewer/include/viewer/SimpleViewer.h @@ -236,13 +236,15 @@ private: std::function mCustomUI; // Properties that can be changed from the UI. - int mCurrentAnimation = 1; + int mCurrentAnimation = 1; // It is a 1-based index and 0 means not playing animation bool mResetAnimation = true; bool mEnableWireframe = false; int mVsmMsaaSamplesLog2 = 1; Settings mSettings; int mSidebarWidth; uint32_t mFlags; + utils::Entity mCurrentMorphingEntity; + std::vector mMorphWeights; // 0 is the default "free camera". Additional cameras come from the gltf file (1-based index). int mCurrentCamera = 0; diff --git a/libs/viewer/src/SimpleViewer.cpp b/libs/viewer/src/SimpleViewer.cpp index a44d69a1c6..bd9a351462 100644 --- a/libs/viewer/src/SimpleViewer.cpp +++ b/libs/viewer/src/SimpleViewer.cpp @@ -583,6 +583,17 @@ void SimpleViewer::updateUserInterface() { rm.setCastShadows(instance, scaster); ImGui::Checkbox("receives shadows", &sreceiver); rm.setReceiveShadows(instance, sreceiver); + auto numMorphTargets = mAsset->getMorphTargetCount(entity); + if (numMorphTargets > 0) { + bool selected = entity == mCurrentMorphingEntity; + ImGui::Checkbox("morphing", &selected); + if (selected) { + mCurrentMorphingEntity = entity; + mMorphWeights.resize(numMorphTargets, 0.0f); + } else { + mCurrentMorphingEntity = utils::Entity(); + } + } size_t numPrims = rm.getPrimitiveCount(instance); for (size_t prim = 0; prim < numPrims; ++prim) { const char* mname = rm.getMaterialInstanceAt(instance, prim)->getName(); @@ -980,6 +991,24 @@ void SimpleViewer::updateUserInterface() { ImGui::Unindent(); } + if (mCurrentMorphingEntity && ImGui::CollapsingHeader("Morphing")) { + const bool isAnimating = mCurrentAnimation > 0 && mAnimator && mAnimator->getAnimationCount() > 0; + if (isAnimating) { + ImGui::BeginDisabled(); + } + for (int i = 0; i != mMorphWeights.size(); ++i) { + ImGui::SliderFloat(mAsset->getMorphTargetNameAt(mCurrentMorphingEntity, i), + &mMorphWeights[i], 0.0f, 1.0); + } + if (isAnimating) { + ImGui::EndDisabled(); + } + if (!isAnimating) { + auto instance = rm.getInstance(mCurrentMorphingEntity); + rm.setMorphWeights(instance, mMorphWeights.data(), mMorphWeights.size()); + } + } + if (mEnableWireframe) { mScene->addEntity(mAsset->getWireframe()); } else {