#pragma once #include #include "ComponentPanel.h" #include "ModelResourceInspector.h" #include #include #include #include class SkinnedModelPanel : ComponentPanel { private: Scope m_ModelInspector; bool m_Expanded = false; std::string m_QueuedModelPath; public: SkinnedModelPanel() { CreateScope(); } void Draw(Nuake::Entity entity) override { using namespace Nuake; if (!entity.HasComponent()) return; SkinnedModelComponent& component = entity.GetComponent(); BeginComponentTable(SKINNED MESH, SkinnedModelComponent); { ImGui::Text("Model"); ImGui::TableNextColumn(); std::string label = "None"; const bool isModelNone = component.ModelResource == nullptr; if (!isModelNone) { label = std::to_string(component.ModelResource->ID); } if (ImGui::Button(label.c_str(), ImVec2(ImGui::GetContentRegionAvail().x, 0))) { } if (m_Expanded) { m_ModelInspector->Draw(); } if (ImGui::BeginDragDropTarget()) { if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("_Model")) { char* file = (char*)payload->Data; std::string fullPath = std::string(file, 256); fullPath = Nuake::FileSystem::AbsoluteToRelative(fullPath); if (Nuake::String::EndsWith(fullPath, ".model")) { } else { m_QueuedModelPath = fullPath; ImGui::OpenPopup("Create Skeleton"); } } ImGui::EndDragDropTarget(); } if (ImGui::BeginPopupModal("Create Skeleton", NULL, ImGuiWindowFlags_AlwaysAutoResize)) { ImGui::SetItemDefaultFocus(); ImGui::Text("Would you like to create the skeleton structure in the scene tree?"); ImGui::Separator(); if (ImGui::Button("OK", ImVec2(120, 0))) { component.ModelPath = m_QueuedModelPath; component.LoadModel(); Scene* scene = entity.GetScene(); scene->CreateSkeleton(entity); ImGui::CloseCurrentPopup(); } ImGui::SetItemDefaultFocus(); ImGui::SameLine(); if (ImGui::Button("Cancel", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); } ImGui::EndPopup(); } ImGui::TableNextColumn(); ComponentTableReset(component.ModelPath, ""); if (component.ModelResource) { auto& model = component.ModelResource; ImGui::TableNextColumn(); { ImGui::Text("Playing"); ImGui::TableNextColumn(); ImGui::Checkbox("##playing", &model->IsPlaying); ImGui::TableNextColumn(); ComponentTableReset(model->IsPlaying, true); ImGui::TableNextColumn(); } if(model->GetCurrentAnimation()) { ImGui::Text("Animation"); ImGui::TableNextColumn(); uint32_t animIndex = model->GetCurrentAnimationIndex(); uint32_t oldAnimIndex = animIndex; auto animations = model->GetAnimations(); if (ImGui::BeginCombo("Type", model->GetCurrentAnimation()->GetName().c_str())) { for (uint32_t n = 0; n < model->GetAnimationsCount(); n++) { bool is_selected = (animIndex == n); std::string animName = animations[n]->GetName(); if (animName.empty()) { animName = "Empty"; } if (ImGui::Selectable(animName.c_str(), is_selected)) { animIndex = n; } if (is_selected) ImGui::SetItemDefaultFocus(); } ImGui::EndCombo(); } if (animIndex != oldAnimIndex) { model->PlayAnimation(animIndex); } ImGui::TableNextColumn(); ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1, 1, 1, 0)); std::string resetLabel = std::string(ICON_FA_UNDO) + "##ResetAnimId"; if (ImGui::Button(resetLabel.c_str())) { model->PlayAnimation(0); } ImGui::PopStyleColor(); } } } EndComponentTable(); } };