diff --git a/SHADE_Engine/src/Animation/SHRawAnimation.cpp b/SHADE_Engine/src/Animation/SHRawAnimation.cpp index 86d0af18..712611d4 100644 --- a/SHADE_Engine/src/Animation/SHRawAnimation.cpp +++ b/SHADE_Engine/src/Animation/SHRawAnimation.cpp @@ -22,6 +22,7 @@ namespace SHADE SHRawAnimation::SHRawAnimation(const SHAnimAsset& asset) : ticksPerSecond { static_cast(asset.ticksPerSecond) } , totalTime { static_cast(asset.duration) / static_cast(asset.ticksPerSecond) } + , totalFrames { static_cast(asset.duration) } { // Populate keyframes for (const auto& channel : asset.nodeChannels) diff --git a/SHADE_Engine/src/Animation/SHRawAnimation.h b/SHADE_Engine/src/Animation/SHRawAnimation.h index ee5d3769..e05e1a74 100644 --- a/SHADE_Engine/src/Animation/SHRawAnimation.h +++ b/SHADE_Engine/src/Animation/SHRawAnimation.h @@ -67,6 +67,7 @@ namespace SHADE const std::vector& GetChannels() const noexcept { return channels; } int GetTicksPerSecond() const noexcept { return ticksPerSecond; } float GetTotalTime() const noexcept { return totalTime; } + int GetTotalFrames() const noexcept { return totalFrames; } private: /*---------------------------------------------------------------------------------*/ @@ -75,6 +76,7 @@ namespace SHADE std::vector channels; int ticksPerSecond; float totalTime; + int totalFrames; /*---------------------------------------------------------------------------------*/ /* Helper Functions */ diff --git a/SHADE_Engine/src/Editor/EditorWindow/Animation/SHAnimationControllerEditor.cpp b/SHADE_Engine/src/Editor/EditorWindow/Animation/SHAnimationControllerEditor.cpp index c829c985..65c4d010 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/Animation/SHAnimationControllerEditor.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/Animation/SHAnimationControllerEditor.cpp @@ -3,7 +3,7 @@ \author Tng Kah Wei, kahwei.tng, 390009620 \par email: kahwei.tng\@digipen.edu \date Mar 1, 2023 -\brief Contains the definition of SHAnimationControllerEditor's functions. +\brief Contains the definition of SHAnimationControllerEditor's functions. Copyright (C) 2023 DigiPen Institute of Technology. diff --git a/SHADE_Engine/src/Editor/EditorWindow/Animation/SHAnimationControllerEditor.h b/SHADE_Engine/src/Editor/EditorWindow/Animation/SHAnimationControllerEditor.h index 7ac7432e..03da7771 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/Animation/SHAnimationControllerEditor.h +++ b/SHADE_Engine/src/Editor/EditorWindow/Animation/SHAnimationControllerEditor.h @@ -12,6 +12,7 @@ of DigiPen Institute of Technology is prohibited. #pragma once // STL Includes +#include // Project Includes #include "Resource/SHHandle.h" #include "Editor/EditorWindow/SHEditorWindow.h" @@ -19,6 +20,9 @@ of DigiPen Institute of Technology is prohibited. namespace SHADE { + /// + /// Editor for modifying the Animation Controller state machine. + /// class SHAnimationControllerEditor final : public SHEditorWindow { public: @@ -36,10 +40,35 @@ namespace SHADE void Exit() override; private: + /*---------------------------------------------------------------------------------*/ + /* Type Definitions */ + /*---------------------------------------------------------------------------------*/ + union NodeAttributeIndex + { + int16_t Raw; + struct + { + uint8_t OwnerNodeIndex; + uint8_t AttributeIndex; + }; + }; + union NodeLinkIndex + { + int32_t Raw; + struct + { + NodeAttributeIndex SourceAttribute; + NodeAttributeIndex DestinationAttribute; + }; + }; // What about same source and destination but different link? + /*---------------------------------------------------------------------------------*/ /* Data Members */ /*---------------------------------------------------------------------------------*/ SHAnimationController controller; + std::vector> inputNodesMap; + std::vector> outputNodesMap; + std::vector linkIndices; // Encodes details of the link in the node index /*---------------------------------------------------------------------------------*/ /* Helper Functions */ diff --git a/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp b/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp index a0aaf0fa..c1796501 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp @@ -23,6 +23,7 @@ #include "Serialization/SHSerialization.h" #include #include "Serialization/Prefab/SHPrefabManager.h" +#include "Editor/EditorWindow/RawAnimationInspector/SHRawAnimInspector.h" namespace SHADE { @@ -371,14 +372,18 @@ namespace SHADE case AssetType::SHADER: break; case AssetType::SHADER_BUILT_IN: break; case AssetType::TEXTURE: break; - case AssetType::MESH: break; + case AssetType::MODEL: + if (auto animInspector = SHEditorWindowManager::GetEditorWindow()) + { + animInspector->Open(asset->id); + } + break; + case AssetType::MESH: break; case AssetType::SCENE: - { - if(editor->LoadScene(asset->id)) - { - editor->editorConfig->workingSceneID = asset->id; - } - } + if (editor->LoadScene(asset->id)) + { + editor->editorConfig->workingSceneID = asset->id; + } break; case AssetType::PREFAB: break; case AssetType::MATERIAL: diff --git a/SHADE_Engine/src/Editor/EditorWindow/RawAnimationInspector/SHRawAnimInspector.cpp b/SHADE_Engine/src/Editor/EditorWindow/RawAnimationInspector/SHRawAnimInspector.cpp new file mode 100644 index 00000000..c2ccdb86 --- /dev/null +++ b/SHADE_Engine/src/Editor/EditorWindow/RawAnimationInspector/SHRawAnimInspector.cpp @@ -0,0 +1,170 @@ +/************************************************************************************//*! +\file SHRawAnimInspector.cpp +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Mar 1, 2023 +\brief Contains the definition of SHRawAnimInspector's functions. + + +Copyright (C) 2023 DigiPen Institute of Technology. +Reproduction or disclosure of this file or its contents without the prior written consent +of DigiPen Institute of Technology is prohibited. +*//*************************************************************************************/ +#include "SHpch.h" +#include "SHRawAnimInspector.h" + +// STL Includes +#include +// External Dependencies +#include +#include +// Project Includes +#include "Editor/IconsMaterialDesign.h" +#include "Animation/SHAnimationClip.h" +#include "Resource/SHResourceManager.h" +#include "Editor/EditorWindow/SHEditorWindowManager.h" +#include "Editor/SHEditorUI.h" + +namespace SHADE +{ + /*-----------------------------------------------------------------------------------*/ + /* SHAnimClipCreatePrompt - Cosntructors/Destructors */ + /*-----------------------------------------------------------------------------------*/ + SHAnimClipCreatePrompt::SHAnimClipCreatePrompt() + : SHPopUpWindow("Create Animation Clip", true, 0, 0) {} + + /*---------------------------------------------------------------------------------*/ + /* SHAnimClipCreatePrompt - Lifecycle Functions */ + /*---------------------------------------------------------------------------------*/ + void SHAnimClipCreatePrompt::Init(Handle rawAnim) + { + rawAnimation = rawAnim; + + // Set default parameters + if (rawAnimation) + { + newAssetName.clear(); + firstIndex = 0; + lastIndex = rawAnimation->GetTotalFrames(); + } + } + + void SHAnimClipCreatePrompt::Draw() + { + if (Begin()) + { + // Properties + SHEditorUI::InputTextField("Name", newAssetName); + SHEditorUI::PushID(0); + SHEditorUI::InputSlider("First Frame Index", 0, rawAnimation->GetTotalFrames(), firstIndex); + SHEditorUI::PopID(); + SHEditorUI::PushID(1); + SHEditorUI::InputSlider("Last Frame Index", 0, rawAnimation->GetTotalFrames(), lastIndex); + SHEditorUI::PopID(); + + // Invalid values + const bool INVALID_CONFIG = newAssetName.empty() || firstIndex > lastIndex || lastIndex < firstIndex; + + // Buttons + ImGui::BeginDisabled(INVALID_CONFIG); + { + if (ImGui::Button("Save")) + { + // Generate new asset + + + // Close + isOpen = false; + ImGui::CloseCurrentPopup(); + } + } + ImGui::EndDisabled(); + ImGui::SameLine(); + if (ImGui::Button("Cancel")) + { + // Close + isOpen = false; + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } + } + + /*-----------------------------------------------------------------------------------*/ + /* Cosntructors/Destructors */ + /*-----------------------------------------------------------------------------------*/ + SHRawAnimInspector::SHRawAnimInspector() + : SHEditorWindow("Animation Editor", ImGuiWindowFlags_MenuBar) + {} + + /*-----------------------------------------------------------------------------------*/ + /* Lifecycle Functions */ + /*-----------------------------------------------------------------------------------*/ + void SHRawAnimInspector::Init() + { + SHEditorWindow::Init(); + + SHEditorWindowManager::CreatePopupWindow(); + } + + void SHRawAnimInspector::Update() + { + SHEditorWindow::Update(); + + // Draw + if (Begin()) + { + + // Ignore if no asset + if (currRawAnim) + { + drawMenuBar(); + + + + // Button to add a new clip + if (ImGui::Button(std::format("{} Add", ICON_MD_ADD).data())) + { + auto prompt = SHEditorWindowManager::GetPopupWindow(); + prompt->Init(currRawAnim); + prompt->isOpen = true; + } + + // Render all clips + } + } + ImGui::End(); + } + + void SHRawAnimInspector::Exit() + { + SHEditorWindow::Exit(); + } + + /*-----------------------------------------------------------------------------------*/ + /* Usage Functions */ + /*-----------------------------------------------------------------------------------*/ + void SHRawAnimInspector::Open(AssetID assetId) + { + currRawAnim = SHResourceManager::LoadOrGet(assetId); + } + + /*-----------------------------------------------------------------------------------*/ + /* Helper Functions */ + /*-----------------------------------------------------------------------------------*/ + void SHRawAnimInspector::drawMenuBar() + { + if (ImGui::BeginMenuBar()) + { + if (ImGui::Button(std::format("{} Save", ICON_MD_SAVE).data())) + { + + } + + const std::string& ASSET_NAME = SHResourceManager::GetAssetName(currRawAnim).value_or("Unnamed Asset"); + ImGui::Text(ASSET_NAME.c_str()); + + ImGui::EndMenuBar(); + } + } +} \ No newline at end of file diff --git a/SHADE_Engine/src/Editor/EditorWindow/RawAnimationInspector/SHRawAnimInspector.h b/SHADE_Engine/src/Editor/EditorWindow/RawAnimationInspector/SHRawAnimInspector.h new file mode 100644 index 00000000..c2006d87 --- /dev/null +++ b/SHADE_Engine/src/Editor/EditorWindow/RawAnimationInspector/SHRawAnimInspector.h @@ -0,0 +1,86 @@ +/************************************************************************************//*! +\file SHRawAnimInspector.h +\author Tng Kah Wei, kahwei.tng, 390009620 +\par email: kahwei.tng\@digipen.edu +\date Mar 2, 2023 +\brief Contains the definition of SHRawAnimInspector. + +Copyright (C) 2023 DigiPen Institute of Technology. +Reproduction or disclosure of this file or its contents without the prior written consent +of DigiPen Institute of Technology is prohibited. +*//*************************************************************************************/ +#pragma once + +// Project Includes +#include "Assets/SHAssetMacros.h" +#include "Editor/EditorWindow/SHEditorWindow.h" +#include "Resource/SHHandle.h" +#include "Animation/SHRawAnimation.h" +#include "Editor/EditorWindow/SHPopUpWindow.h" + +namespace SHADE +{ + /// + /// Prompt for creating an animation clip. Init() must be called to pass in the correct + /// SHRawAnimation that the created clip will use. + /// + class SHAnimClipCreatePrompt : public SHPopUpWindow + { + public: + /*---------------------------------------------------------------------------------*/ + /* Constructors/Destructors */ + /*---------------------------------------------------------------------------------*/ + SHAnimClipCreatePrompt(); + + /*---------------------------------------------------------------------------------*/ + /* Lifecycle Functions */ + /*---------------------------------------------------------------------------------*/ + void Init(Handle rawAnim); + void Draw() override; + + private: + /*---------------------------------------------------------------------------------*/ + /* Data Members */ + /*---------------------------------------------------------------------------------*/ + std::string newAssetName; + int firstIndex; + int lastIndex; + Handle rawAnimation; + }; + + /// + /// Editor for generating SHAnimationClips from a single SHRawAnimation object. + /// + class SHRawAnimInspector final : public SHEditorWindow + { + public: + /*---------------------------------------------------------------------------------*/ + /* Constructors/Destructors */ + /*---------------------------------------------------------------------------------*/ + SHRawAnimInspector(); + ~SHRawAnimInspector() = default; + + /*---------------------------------------------------------------------------------*/ + /* Lifecycle Functions */ + /*---------------------------------------------------------------------------------*/ + void Init() override; + void Update() override; + void Exit() override; + + /*---------------------------------------------------------------------------------*/ + /* Usage Functions */ + /*---------------------------------------------------------------------------------*/ + void Open(AssetID assetId); + + private: + /*---------------------------------------------------------------------------------*/ + /* Data Members */ + /*---------------------------------------------------------------------------------*/ + Handle currRawAnim; + + /*---------------------------------------------------------------------------------*/ + /* Helper Functions */ + /*---------------------------------------------------------------------------------*/ + void drawMenuBar(); + }; +} diff --git a/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowIncludes.h b/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowIncludes.h index 829a1871..e0247d69 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowIncludes.h +++ b/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowIncludes.h @@ -1,11 +1,12 @@ #pragma once -#include "MenuBar/SHEditorMenuBar.h" // Menu Bar -#include "HierarchyPanel/SHHierarchyPanel.h" // Hierarchy Panel -#include "Inspector/SHEditorInspector.h" // Inspector -#include "Profiling/SHEditorProfiler.h" // Profiler -#include "ViewportWindow/SHEditorViewport.h" // Editor Viewport -#include "AssetBrowser/SHAssetBrowser.h" // Asset Browser -#include "MaterialInspector/SHMaterialInspector.h" // Material Inspector -#include "ColliderTagPanel/SHColliderTagPanel.h" // Collider Tag Panel -#include "InputBindings/SHInputBindingsPanel.h" // Input Bindings -#include "EditorWindow/Animation/SHAnimationControllerEditor.h" // Animation Controller Editor \ No newline at end of file +#include "MenuBar/SHEditorMenuBar.h" // Menu Bar +#include "HierarchyPanel/SHHierarchyPanel.h" // Hierarchy Panel +#include "Inspector/SHEditorInspector.h" // Inspector +#include "Profiling/SHEditorProfiler.h" // Profiler +#include "ViewportWindow/SHEditorViewport.h" // Editor Viewport +#include "AssetBrowser/SHAssetBrowser.h" // Asset Browser +#include "MaterialInspector/SHMaterialInspector.h" // Material Inspector +#include "ColliderTagPanel/SHColliderTagPanel.h" // Collider Tag Panel +#include "InputBindings/SHInputBindingsPanel.h" // Input Bindings +#include "EditorWindow/Animation/SHAnimationControllerEditor.h" // Animation Controller Editor +#include "EditorWindow/RawAnimationInspector/SHRawAnimInspector.h" // Raw Animation Inspector diff --git a/SHADE_Engine/src/Editor/SHEditor.cpp b/SHADE_Engine/src/Editor/SHEditor.cpp index 904a239b..1b45073c 100644 --- a/SHADE_Engine/src/Editor/SHEditor.cpp +++ b/SHADE_Engine/src/Editor/SHEditor.cpp @@ -118,6 +118,7 @@ namespace SHADE SHEditorWindowManager::CreateEditorWindow(); SHEditorWindowManager::CreateEditorWindow(); + SHEditorWindowManager::CreateEditorWindow(); //Add popup windows SHEditorWindowManager::CreatePopupWindow();