From e9dee89b170b88a8ef5eadec5ed82453432c37ea Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Fri, 10 Mar 2023 16:47:19 +0800 Subject: [PATCH 1/6] Accommodated animation when shadows are in the scene --- Assets/Shaders/ShadowMapAnim_VS.glsl | 37 ++++++++++++ Assets/Shaders/ShadowMapAnim_VS.shshaderb | Bin 0 -> 2025 bytes .../Shaders/ShadowMapAnim_VS.shshaderb.shmeta | 3 + Assets/Shaders/ShinyHighlight_VS.glsl | 3 - .../MiddleEnd/Batching/SHSuperBatch.cpp | 11 +++- .../MiddleEnd/Batching/SHSuperBatch.h | 2 +- .../GlobalData/SHGraphicsPredefinedData.cpp | 17 ++++++ .../GlobalData/SHGraphicsPredefinedData.h | 4 ++ .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 55 +++++++++++------- .../MiddleEnd/Interface/SHGraphicsSystem.h | 2 + .../src/Graphics/RenderGraph/SHSubpass.cpp | 8 +-- .../src/Graphics/RenderGraph/SHSubpass.h | 9 ++- 12 files changed, 117 insertions(+), 34 deletions(-) create mode 100644 Assets/Shaders/ShadowMapAnim_VS.glsl create mode 100644 Assets/Shaders/ShadowMapAnim_VS.shshaderb create mode 100644 Assets/Shaders/ShadowMapAnim_VS.shshaderb.shmeta diff --git a/Assets/Shaders/ShadowMapAnim_VS.glsl b/Assets/Shaders/ShadowMapAnim_VS.glsl new file mode 100644 index 00000000..f5f9ab4e --- /dev/null +++ b/Assets/Shaders/ShadowMapAnim_VS.glsl @@ -0,0 +1,37 @@ +#version 450 +#extension GL_KHR_vulkan_glsl : enable + +//#include "ShaderDescriptorDefinitions.glsl" + + +layout(location = 0) in vec3 aVertexPos; +layout(location = 4) in mat4 worldTransform; +layout(location = 9) in uvec4 aBoneIndices; +layout(location = 10) in vec4 aBoneWeights; +layout(location = 11) in uint firstBoneIndex; + +layout(set = 1, binding = 0) uniform CameraData +{ + vec4 position; + mat4 vpMat; + mat4 viewMat; + mat4 projMat; +} cameraData; + +layout (std430, set = 2, binding = 1) buffer AnimBoneMatrices +{ + mat4 data[]; +} BoneMatrices; + +void main() +{ + // // Compute bone matrix + // mat4 boneMatrix = BoneMatrices.data[firstBoneIndex + aBoneIndices[0]] * aBoneWeights[0]; + // boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[1]] * aBoneWeights[1]; + // boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[2]] * aBoneWeights[2]; + // boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[3]] * aBoneWeights[3]; + + // clip space for rendering + gl_Position = cameraData.vpMat * worldTransform * vec4 (aVertexPos, 1.0f); + // gl_Position = cameraData.vpMat * worldTransform * boneMatrix * vec4 (aVertexPos, 1.0f); +} \ No newline at end of file diff --git a/Assets/Shaders/ShadowMapAnim_VS.shshaderb b/Assets/Shaders/ShadowMapAnim_VS.shshaderb new file mode 100644 index 0000000000000000000000000000000000000000..96c45e4742177cee622935fbe17c8524f09a8178 GIT binary patch literal 2025 zcmZ9LYflqF6o!{e3!>aaE-GLFub_z6m>4ezrkK=#!RW_k(=Iq>yKS}$sGs}^>QC~Q z_%r-s;`{8(G#jQlJ@dZjoH>`7?fWwn3YHh!^ z-p!ip4fP*X9Mxl!MD?agqefQG@_o3NnksQXG*wH$ipnS zhm&?1H{YjW(miOWEn5?J6WZ};7I5YKuEJOCBzluHO(PO(dG0UgKSt*8Q`Y0T(*u)s zGZ(|8OPU#vWHT`>Xw{bbv#2|NK(aUUN!au63!nDgk*|GOyhFP@$9&+>o?||6%*1o- z;dmcaS=i%;-OqnTn6)D>IL<8P*!qC+nK;Gq`B=`zac(gVOx&Kt=Yu;PM~%feFmXR5 zJ`T>u(Fb*MR#i1~=gSi6^ms{o7TAA>b_Rp_H_6?zu=9O_&p6CogGU_Zj={_h|GUy< z$x8_{+mL4Y9z3Q87Cm^b*aIAWaVGaq556ZbJhxxAI$TKEgk#H_~z~d6uobZG+ z=TaAWxHmroYzTSIOVby2@_@NlIDhU1?a71xw6pp6IcEbC59Z$SXFl`N^h@2uFGyp9 z#~;ic!;#O=HVD4I!2h~BOnBf%(^Lr;BX1C-xsUElNIC}DaD~_YiJx!PST$K=yKlX~` fr_RN8O+tQr=z)8=A>mE(?w+elFn<3uy(g0YL9(8# literal 0 HcmV?d00001 diff --git a/Assets/Shaders/ShadowMapAnim_VS.shshaderb.shmeta b/Assets/Shaders/ShadowMapAnim_VS.shshaderb.shmeta new file mode 100644 index 00000000..e31f63b1 --- /dev/null +++ b/Assets/Shaders/ShadowMapAnim_VS.shshaderb.shmeta @@ -0,0 +1,3 @@ +Name: ShadowMapAnim_VS +ID: 39393999 +Type: 2 diff --git a/Assets/Shaders/ShinyHighlight_VS.glsl b/Assets/Shaders/ShinyHighlight_VS.glsl index 483af1f0..044a2d7a 100644 --- a/Assets/Shaders/ShinyHighlight_VS.glsl +++ b/Assets/Shaders/ShinyHighlight_VS.glsl @@ -7,9 +7,6 @@ layout(location = 2) in vec3 aNormal; layout(location = 3) in vec3 aTangent; layout(location = 4) in mat4 worldTransform; layout(location = 8) in uvec2 integerData; -layout(location = 9) in uvec4 aBoneIndices; -layout(location = 10) in vec4 aBoneWeights; -layout(location = 11) in uint firstBoneIndex; layout(location = 0) out struct { diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHSuperBatch.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHSuperBatch.cpp index f8298716..5a2a079c 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHSuperBatch.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHSuperBatch.cpp @@ -17,6 +17,7 @@ of DigiPen Institute of Technology is prohibited. #include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h" #include "Graphics/MiddleEnd/Interface/SHRenderable.h" #include "Graphics/Descriptors/SHVkDescriptorPool.h" +#include "Graphics/Commands/SHVkCommandBuffer.h" namespace SHADE { @@ -108,11 +109,19 @@ namespace SHADE } } - void SHSuperBatch::Draw(Handle cmdBuffer, uint32_t frameIndex, bool bindBatchPipeline /*= true*/) noexcept + void SHSuperBatch::Draw(Handle cmdBuffer, uint32_t frameIndex, bool bindBatchPipeline /*= true*/, Handle nonAnimPipeline/* = {}*/, Handle animPipeline/* = {}*/) noexcept { // Build all batches for (auto& batch : batches) { + if (!bindBatchPipeline) + { + if (batch.IsAnimated()) + cmdBuffer->BindPipeline(animPipeline); + else + cmdBuffer->BindPipeline(nonAnimPipeline); + } + batch.Draw(cmdBuffer, frameIndex, bindBatchPipeline); } } diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHSuperBatch.h b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHSuperBatch.h index 4d831b9c..3ef9fc5e 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHSuperBatch.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHSuperBatch.h @@ -57,7 +57,7 @@ namespace SHADE void Clear() noexcept; void UpdateBuffers(uint32_t frameIndex, Handle descPool); void Build(Handle device, Handle descPool, uint32_t frameIndex) noexcept; - void Draw(Handle cmdBuffer, uint32_t frameIndex, bool bindBatchPipeline = true) noexcept; + void Draw(Handle cmdBuffer, uint32_t frameIndex, bool bindBatchPipeline = true, Handle nonAnimPipeline = {}, Handle animPipeline = {}) noexcept; /*-----------------------------------------------------------------------------*/ /* Getter Functions */ diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp index 91ec0cea..ae2b6f35 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp @@ -14,6 +14,7 @@ namespace SHADE std::vector> SHGraphicsPredefinedData::predefinedLayouts; SHVertexInputState SHGraphicsPredefinedData::defaultVertexInputState; SHVertexInputState SHGraphicsPredefinedData::shadowMapVertexInputState; + SHVertexInputState SHGraphicsPredefinedData::shadowMapAnimVertexInputState; std::vector SHGraphicsPredefinedData::perSystemData; @@ -333,6 +334,17 @@ namespace SHADE shadowMapVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::FLOAT_3D)}); shadowMapVertexInputState.AddBinding(true, true, { SHVertexAttribute(SHAttribFormat::MAT_4D) }, 4, 4); // Transform at binding 4 - 7 (4 slots) + + shadowMapAnimVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::FLOAT_3D) }); + shadowMapAnimVertexInputState.AddBinding(true, true, { SHVertexAttribute(SHAttribFormat::MAT_4D) }, 4, 4); // Transform at binding 4 - 7 (4 slots) + shadowMapAnimVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::UINT32_4D) }, 9, 9); // Attribute bone indices at index 5 + shadowMapAnimVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::FLOAT_4D) }, 10, 10); // Attribute bone weights at index 6 + shadowMapAnimVertexInputState.AddBinding(true, true, { SHVertexAttribute(SHAttribFormat::UINT32_1D) }, 11, 11); // Instance bone matrix first index at index 7 + + + //shadowMapAnimVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::FLOAT_3D) }); + //shadowMapAnimVertexInputState.AddBinding(true, true, { SHVertexAttribute(SHAttribFormat::MAT_4D) }, 4, 4); // Transform at binding 4 - 7 (4 slots) + } void SHGraphicsPredefinedData::Init(Handle logicalDevice) noexcept @@ -368,6 +380,11 @@ namespace SHADE return shadowMapVertexInputState; } + SHVertexInputState const& SHGraphicsPredefinedData::GetShadowMapAnimViState(void) noexcept + { + return shadowMapAnimVertexInputState; + } + SHGraphicsPredefinedData::PerSystem const& SHGraphicsPredefinedData::GetSystemData(SystemType systemType) noexcept { return perSystemData[static_cast(systemType)]; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.h b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.h index 4fbf06c1..051dce0d 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.h @@ -67,6 +67,9 @@ namespace SHADE //! vertex input state for shadow mapping static SHVertexInputState shadowMapVertexInputState; + //! vertex input state for shadow mapping + static SHVertexInputState shadowMapAnimVertexInputState; + //! Predefined data for each type of system static std::vector perSystemData; @@ -101,6 +104,7 @@ namespace SHADE static std::vector> GetPredefinedDescSetLayouts (SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes types) noexcept; static SHVertexInputState const& GetDefaultViState (void) noexcept; static SHVertexInputState const& GetShadowMapViState (void) noexcept; + static SHVertexInputState const& GetShadowMapAnimViState (void) noexcept; static PerSystem const& GetSystemData (SystemType systemType) noexcept; static SHDescriptorMappings::MapType const& GetMappings (SystemType systemType) noexcept; //static PerSystem const& GetBatchingSystemData(void) noexcept; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index bc50d0a7..69aa4188 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -128,8 +128,9 @@ namespace SHADE SHFreetypeInstance::Init(); - SHAssetManager::CompileAsset("../../Assets/Shaders/DeferredComposite_CS.glsl", false); - //SHAssetManager::CompileAsset("../../Assets/Shaders/ShadowMap_FS.glsl", false); + //SHAssetManager::CompileAsset("../../Assets/Shaders/DeferredComposite_CS.glsl", false); + //SHAssetManager::CompileAsset("../../Assets/Shaders/ShadowMap_VS.glsl", false); + //SHAssetManager::CompileAsset("../../Assets/Shaders/ShadowMapAnim_VS.glsl", false); //SHAssetManager::CompileAsset("../../Assets/Shaders/ShadowMap_FS.glsl", false); //SHAssetManager::CompileAsset("../../Assets/Shaders/SSAO_CS.glsl", false); //SHAssetManager::CompileAsset("../../Assets/Shaders/SSAOBlur_CS.glsl", false); @@ -145,24 +146,25 @@ namespace SHADE //SHAssetManager::CompileAsset("../../Assets/Shaders/Anim_VS.glsl", false); // Load Built In Shaders - static constexpr AssetID VS_DEFAULT = 39210065; defaultVertShader = SHResourceManager::LoadOrGet(VS_DEFAULT); - static constexpr AssetID VS_ANIM = 47911992; animtVertShader = SHResourceManager::LoadOrGet(VS_ANIM); - static constexpr AssetID FS_DEFAULT = 46377769; defaultFragShader = SHResourceManager::LoadOrGet(FS_DEFAULT); - static constexpr AssetID VS_DEBUG = 48002439; debugVertShader = SHResourceManager::LoadOrGet(VS_DEBUG); - static constexpr AssetID FS_DEBUG = 36671027; debugFragShader = SHResourceManager::LoadOrGet(FS_DEBUG); - static constexpr AssetID VS_DEBUG_MESH = 42127043; debugMeshVertShader = SHResourceManager::LoadOrGet(VS_DEBUG_MESH); - static constexpr AssetID CS_COMPOSITE = 45072428; deferredCompositeShader = SHResourceManager::LoadOrGet(CS_COMPOSITE); - static constexpr AssetID SSAO = 38430899; ssaoShader = SHResourceManager::LoadOrGet(SSAO); - static constexpr AssetID SSAO_BLUR = 39760835; ssaoBlurShader = SHResourceManager::LoadOrGet(SSAO_BLUR); - static constexpr AssetID TEXT_VS = 39816727; textVS = SHResourceManager::LoadOrGet(TEXT_VS); - static constexpr AssetID TEXT_FS = 38024754; textFS = SHResourceManager::LoadOrGet(TEXT_FS); - static constexpr AssetID RENDER_SC_VS = 48082949; renderToSwapchainVS = SHResourceManager::LoadOrGet(RENDER_SC_VS); - static constexpr AssetID RENDER_SC_FS = 36869006; renderToSwapchainFS = SHResourceManager::LoadOrGet(RENDER_SC_FS); - static constexpr AssetID SHADOW_MAP_VS = 44646107; shadowMapVS = SHResourceManager::LoadOrGet(SHADOW_MAP_VS); - static constexpr AssetID SHADOW_MAP_FS = 45925790; shadowMapFS = SHResourceManager::LoadOrGet(SHADOW_MAP_FS); - static constexpr AssetID TRAJECTORY_VS = 41042628; trajectoryVS = SHResourceManager::LoadOrGet(TRAJECTORY_VS); - static constexpr AssetID TRAJECTORY_FS = 45635685; trajectoryFS = SHResourceManager::LoadOrGet(TRAJECTORY_FS); - static constexpr AssetID SHADOW_BLUR_CS = 38004013; shadowMapBlurCS = SHResourceManager::LoadOrGet(SHADOW_BLUR_CS); + static constexpr AssetID VS_DEFAULT = 39210065; defaultVertShader = SHResourceManager::LoadOrGet(VS_DEFAULT); + static constexpr AssetID VS_ANIM = 47911992; animtVertShader = SHResourceManager::LoadOrGet(VS_ANIM); + static constexpr AssetID FS_DEFAULT = 46377769; defaultFragShader = SHResourceManager::LoadOrGet(FS_DEFAULT); + static constexpr AssetID VS_DEBUG = 48002439; debugVertShader = SHResourceManager::LoadOrGet(VS_DEBUG); + static constexpr AssetID FS_DEBUG = 36671027; debugFragShader = SHResourceManager::LoadOrGet(FS_DEBUG); + static constexpr AssetID VS_DEBUG_MESH = 42127043; debugMeshVertShader = SHResourceManager::LoadOrGet(VS_DEBUG_MESH); + static constexpr AssetID CS_COMPOSITE = 45072428; deferredCompositeShader = SHResourceManager::LoadOrGet(CS_COMPOSITE); + static constexpr AssetID SSAO = 38430899; ssaoShader = SHResourceManager::LoadOrGet(SSAO); + static constexpr AssetID SSAO_BLUR = 39760835; ssaoBlurShader = SHResourceManager::LoadOrGet(SSAO_BLUR); + static constexpr AssetID TEXT_VS = 39816727; textVS = SHResourceManager::LoadOrGet(TEXT_VS); + static constexpr AssetID TEXT_FS = 38024754; textFS = SHResourceManager::LoadOrGet(TEXT_FS); + static constexpr AssetID RENDER_SC_VS = 48082949; renderToSwapchainVS = SHResourceManager::LoadOrGet(RENDER_SC_VS); + static constexpr AssetID RENDER_SC_FS = 36869006; renderToSwapchainFS = SHResourceManager::LoadOrGet(RENDER_SC_FS); + static constexpr AssetID SHADOW_MAP_VS = 44646107; shadowMapVS = SHResourceManager::LoadOrGet(SHADOW_MAP_VS); + static constexpr AssetID SHADOW_MAP_ANIM_VS = 39393999; shadowMapAnimVS = SHResourceManager::LoadOrGet(SHADOW_MAP_ANIM_VS); + static constexpr AssetID SHADOW_MAP_FS = 45925790; shadowMapFS = SHResourceManager::LoadOrGet(SHADOW_MAP_FS); + static constexpr AssetID TRAJECTORY_VS = 41042628; trajectoryVS = SHResourceManager::LoadOrGet(TRAJECTORY_VS); + static constexpr AssetID TRAJECTORY_FS = 45635685; trajectoryFS = SHResourceManager::LoadOrGet(TRAJECTORY_FS); + static constexpr AssetID SHADOW_BLUR_CS = 38004013; shadowMapBlurCS = SHResourceManager::LoadOrGet(SHADOW_BLUR_CS); } @@ -919,10 +921,19 @@ namespace SHADE SHGraphicsPredefinedData::SystemType::BATCHING, SHGraphicsPredefinedData::GetShadowMapViState(), rasterState ); + + tempLibrary.CreateGraphicsPipelines + ( + { shadowMapAnimVS, shadowMapFS }, shadowMapNode->GetRenderpass(), shadowMapDrawSubpass, + SHGraphicsPredefinedData::SystemType::BATCHING_ANIM, + SHGraphicsPredefinedData::GetShadowMapAnimViState(), rasterState + ); + shadowMapPipeline = tempLibrary.GetGraphicsPipeline({ shadowMapVS, shadowMapFS, shadowMapDrawSubpass }); + shadowMapAnimPipeline = tempLibrary.GetGraphicsPipeline({ shadowMapAnimVS, shadowMapFS, shadowMapDrawSubpass }); } - shadowMapDrawSubpass->AddCompanionSubpass(gBufferWriteSubpass, shadowMapPipeline); // set companion subpass and pipeline - shadowMapDrawSubpass->AddCompanionSubpass(gBufferWriteVfxSubpass, shadowMapPipeline); // set companion subpass and pipeline + shadowMapDrawSubpass->AddCompanionSubpass(gBufferWriteSubpass, shadowMapPipeline, shadowMapAnimPipeline); // set companion subpass and pipeline + shadowMapDrawSubpass->AddCompanionSubpass(gBufferWriteVfxSubpass, shadowMapPipeline, shadowMapAnimPipeline); // set companion subpass and pipeline // add the shadow map and the blurred version to the lighting system uint32_t const NEW_SHADOW_MAP_INDEX = lightingSubSystem->AddShadowMap(renderGraph->GetRenderGraphResource(shadowMapBlurredResourceName), EVENT_DATA->lightEntity); diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h index 68752a6e..e674efb6 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h @@ -479,6 +479,7 @@ namespace SHADE Handle renderToSwapchainVS; Handle renderToSwapchainFS; Handle shadowMapVS; + Handle shadowMapAnimVS; Handle shadowMapFS; Handle trajectoryVS; Handle trajectoryFS; @@ -499,6 +500,7 @@ namespace SHADE Handle debugDrawFilledPipeline; Handle debugDrawFilledDepthPipeline; Handle shadowMapPipeline; // initialized only when a shadow map is needed + Handle shadowMapAnimPipeline; // initialized only when a shadow map is needed Handle genericAndTextureDescSet; diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp index ca13155d..87b3fc10 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp @@ -280,8 +280,8 @@ namespace SHADE for (auto& companion : companionSubpasses) { // if not bind pipeline for companion and and execute draw command - commandBuffer->BindPipeline(companion.pipeline); - companion.subpass->superBatch->Draw(commandBuffer, frameIndex, false); + //commandBuffer->BindPipeline(companion.nonAnimPipeline); + companion.subpass->superBatch->Draw(commandBuffer, frameIndex, false, companion.nonAnimPipeline, companion.animPipeline); } } } @@ -528,9 +528,9 @@ namespace SHADE subpassIndex = index; } - void SHSubpass::AddCompanionSubpass(Handle companion, Handle pipeline) noexcept + void SHSubpass::AddCompanionSubpass(Handle companion, Handle nonAnimPipeline, Handle animPipeline) noexcept { - companionSubpasses.push_back(CompanionSubpass{companion, pipeline}); + companionSubpasses.push_back(CompanionSubpass{companion, nonAnimPipeline, animPipeline}); //companionSubpass.companion = companion; //companionSubpass.pipeline = pipeline; } diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h index 7f843773..f13e0871 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h @@ -35,8 +35,11 @@ namespace SHADE // subpass whose data will be borrowed to draw Handle subpass; - // Pipeline that will be used for all the draw calls from all batches of the companion subpass - Handle pipeline; + // Pipeline that will be used for all the draw calls from all batches (that render without animation data) of the companion subpass + Handle nonAnimPipeline; + + // Pipeline that will be used for all the draw calls from all batches (that render with animation data) of the companion subpass + Handle animPipeline; }; private: @@ -167,7 +170,7 @@ namespace SHADE /*-----------------------------------------------------------------------*/ /* PUBLIC SETTERS AND GETTERS */ /*-----------------------------------------------------------------------*/ - void AddCompanionSubpass (Handle companion, Handle pipeline) noexcept; + void AddCompanionSubpass (Handle companion, Handle nonAnimPipeline, Handle animPipeline) noexcept; Handle GetParentNode(void) const noexcept; SHSubPassIndex GetIndex() const noexcept; From 801da75d877b22d34446aa695d4c7167484772e6 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Fri, 10 Mar 2023 18:37:28 +0800 Subject: [PATCH 2/6] Fixed shadows for animation --- Assets/Scenes/Level1.shade | 26 ++++++++++++++++-- Assets/Shaders/Silhouette_VS.glsl | 15 +++++++++- Assets/Shaders/Silhouette_VS.shshaderb | Bin 4133 -> 6053 bytes .../GlobalData/SHGraphicsPredefinedData.cpp | 6 ++-- .../src/Graphics/RenderGraph/SHSubpass.cpp | 2 +- 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/Assets/Scenes/Level1.shade b/Assets/Scenes/Level1.shade index ca74f938..7221f55d 100644 --- a/Assets/Scenes/Level1.shade +++ b/Assets/Scenes/Level1.shade @@ -2419,7 +2419,7 @@ Components: Transform Component: Translate: {x: 0, y: 0, z: 0} - Rotate: {x: -7.50001717, y: 1.39999998, z: -3.50001717} + Rotate: {x: -1.48352981, y: 1.39999998, z: -3.50001717} Scale: {x: 1, y: 1, z: 1} IsActive: true Renderable Component: @@ -6858,8 +6858,8 @@ NumberOfChildren: 0 Components: Transform Component: - Translate: {x: 2.13981342, y: 0.0490087792, z: -1.96055627} - Rotate: {x: 0, y: -1.53675354, z: 0} + Translate: {x: 2.13981342, y: 0.0490087792, z: -1.86932743} + Rotate: {x: -0, y: -1.53675354, z: 0} Scale: {x: 1, y: 1, z: 1} IsActive: true Renderable Component: @@ -8216,4 +8216,24 @@ Hovered: false Clicked: false IsActive: true + Scripts: ~ +- EID: 503 + Name: DirectionalLight + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: -0.407547206, y: 3.60323787, z: 2.62217617} + Rotate: {x: -0, y: 0, z: -0} + Scale: {x: 1, y: 1, z: 1} + IsActive: true + Light Component: + Position: {x: 0.300000012, y: 0, z: 0} + Type: Directional + Direction: {x: -1.15900004, y: 4.79300022, z: -0.994000018} + Color: {x: 1, y: 1, z: 1, w: 1} + Layer: 4294967295 + Strength: 0.800000012 + Casting Shadows: true + IsActive: true Scripts: ~ \ No newline at end of file diff --git a/Assets/Shaders/Silhouette_VS.glsl b/Assets/Shaders/Silhouette_VS.glsl index 1b45c333..a7fe585d 100644 --- a/Assets/Shaders/Silhouette_VS.glsl +++ b/Assets/Shaders/Silhouette_VS.glsl @@ -40,6 +40,12 @@ layout(set = 1, binding = 0) uniform CameraData mat4 projMat; } cameraData; +layout (std430, set = 2, binding = 1) buffer AnimBoneMatrices +{ + mat4 data[]; +} BoneMatrices; + + void main() { Out2.materialIndex = gl_InstanceIndex; @@ -63,6 +69,13 @@ void main() Out.normal.rgb = transposeInv * aNormal.rgb; Out.normal.rgb = normalize (Out.normal.rgb); + // Compute bone matrix + mat4 boneMatrix = BoneMatrices.data[firstBoneIndex + aBoneIndices[0]] * aBoneWeights[0]; + boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[1]] * aBoneWeights[1]; + boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[2]] * aBoneWeights[2]; + boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[3]] * aBoneWeights[3]; + // clip space for rendering - gl_Position = cameraData.vpMat * worldTransform * vec4 (aVertexPos, 1.0f); + gl_Position = cameraData.vpMat * worldTransform * boneMatrix * vec4 (aVertexPos, 1.0f); + // gl_Position = cameraData.vpMat * worldTransform * vec4 (aVertexPos, 1.0f); } \ No newline at end of file diff --git a/Assets/Shaders/Silhouette_VS.shshaderb b/Assets/Shaders/Silhouette_VS.shshaderb index 1bb76ec42331e3ece2cf26e15e72fbbb613e2633..6318555888e0c1f04b668c241c14b5ab73baa8b8 100644 GIT binary patch literal 6053 zcmZ9O`FmVd8OLv$WQr6h1zJ#`&ZKCotp&BzDpDF+48_m{TZ${;lDQ2RCo^F(NoieZ za9^Rg3kbOHJMJRl0x6*)(sf zoQj-|oP%sZo`-Blu0dXnEFwpdCFBJ1Z)A{vE0`Z6=@1#l#;3+6CdS6Enwp-Qo0{(( zX=PKbyq!%o^KLfX%NH~KPO13i?djG+v+6L6N42hD);NVV9JOTSGM-I)SvOBxd)v+I z_QGanPbEpRyt(XaeXV@vmfm=JBG?ddGiVjC{b zByab!nXJ1f?WHiau!CA)wO%5MxXpudR=f0*@bv!aUWw3p}Pl%dkC(&2RZj;4c=e(5NoKrhp54OYz_8P zfA6pQQ%ZfQ)cwx6p7+n8zau#F$vFq-nsU|>oLH`Zmj;V`QJZ(qwe>lhisc(<>f*IT zc|LW-b=2Lrx??@{c?b28@7sooy_iGWWyH8Q_anEt%o+Qsqn`$Ee)H(B?wyy@zM9!s z?Ge8Qto>ZfJ5<^e=q ze|6uBoONByTu035x|c9F5P4_CJkMoz@7m3y?mLq+&o<_Isq23!cmR>tU)^^o=ULU6 zcOXe}>b_$+?c>bGYxjKjF}t>$_6cUsS3c_T-ADWs zxbOR9FPm_l%Y|6{CU}PH!Mnf6ZJkaKFEPH_Roct#2PnehW56yX&Z*C^>ce z=XYTM+0OfRf9}Cy+<#&GKI*%H`69%9s(beSjR;-4zX{YY$L{+*1MzK-l4UjXnTX#8 zzXv;6L0up1o~b{b&q3BA<}lZJh`c_&)u$om@S9)`b$ueogYPM7yi!&%c*Z;egWd!xsLcc z^9vCPFKQhH zySJ$IN^rH--RN?TsA~^cu3GC=C0DKWC2+>;uf1C97`kig6SZCqw$@#U=c=xswO!2o zQsf#$|8eGP5&h$SsOuAZyAEt0PUD7-Fux43X0f&dWxw}>wYk4W!6%8FV}ieS_V9Y- zKq*W`9`_nC2f@aeKVohG%PS6T)tHx~8zUDnuK>#{j)<9L5BtzxiCBxd_4S;5oAT~k zpI0Gr(bLy}{Z@KU+{=xKKJugFonpQT@hs0re3Q}Z6s*6)wQgdTi@2M?5$8LMxM{F) z)^D7CauJt-Bd!UKxIqORN|^#HsN-Ul|;`xo5%!N$r( z><7U5Y74&)f{pbK1ot7Zv2qdnVX(g1!tWzsV+SkTN5RI*MeMy`eYN@b#XjDLxEE_O zw?5HNZPBay!PS0#4BdWukHhByuzd9ML9lW1(a(p#(a#6L(T9(NwT+f{@Dt!AB=Xn6 zpG4%NpPvF7Cm(q}4X*a{Gw5=TIIquwjdjG?d=9Lyw($Er*jRfP+!w&c%0=uK!TM?o zzb}D}wRgdN8EmXv#C`>=ueR{}D%jX+Kfi`+9n_cQXGAIf1M~JO_3C{>Mr?kpBby10FX3 delta 796 zcmX|;(MlUZ7=>rEy9p)~>Pc&Rn zonZ3@g*<@fz7OKN2!1Eo?S#XbbN(~`{xcc89hCD{>A4v#J2jgz#xhy+%v|5*>ysgN z2Xw&|=-u7yr0le5^>6ILix!Sny|G(uw*Am=1}1GXRR7sUtJQz7ixp+;ac1MN(b)9c zVJ-OL85dXGwOoE3xb~?Q)V*M2yL9UIKih@Z`flxAGw`-Ozy2+3Bgv;t58m@z?NGH3 z!B_8iIPZM7qW4sj$#M#_63=2UPn>wE*wd7Wr@e9x*kV%kQ*H~V15X2Gq`R@680)Fg zLn)Ar0~%C1H~gE<*infy2gougfobld{xhHqR2$bFqs!_$s;_cRTF)a-dI|0T-KT)Q zfcXd6sh4AZ!>Y+w9=$LcSf&D(abPA6NbA8>*MU6T>)&TLhHkFmM(e!oE388>2PQ#< z*h}~ake}!y_HV!+&ZvG2l##E@B76dt!ACM>_$QF3m3Y6{%VVVd|K@3Irr;`9*8FEc k4Rk>D6>v*q)y{ziP)3(ngCn5F)E~XZlS(W1$fs7o6FTo%h5!Hn diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp index ae2b6f35..3f312532 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp @@ -337,9 +337,9 @@ namespace SHADE shadowMapAnimVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::FLOAT_3D) }); shadowMapAnimVertexInputState.AddBinding(true, true, { SHVertexAttribute(SHAttribFormat::MAT_4D) }, 4, 4); // Transform at binding 4 - 7 (4 slots) - shadowMapAnimVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::UINT32_4D) }, 9, 9); // Attribute bone indices at index 5 - shadowMapAnimVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::FLOAT_4D) }, 10, 10); // Attribute bone weights at index 6 - shadowMapAnimVertexInputState.AddBinding(true, true, { SHVertexAttribute(SHAttribFormat::UINT32_1D) }, 11, 11); // Instance bone matrix first index at index 7 + shadowMapAnimVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::UINT32_4D) }, 6, 9); // Attribute bone indices at index 5 + shadowMapAnimVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::FLOAT_4D) }, 7, 10); // Attribute bone weights at index 6 + shadowMapAnimVertexInputState.AddBinding(true, true, { SHVertexAttribute(SHAttribFormat::UINT32_1D) }, 8, 11); // Instance bone matrix first index at index 7 //shadowMapAnimVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::FLOAT_3D) }); diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp index 87b3fc10..7eccbc52 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp @@ -496,7 +496,7 @@ namespace SHADE { if (!dummyPipelineLayout) { - auto const& batchingSystemData = SHGraphicsPredefinedData::GetSystemData(SHGraphicsPredefinedData::SystemType::BATCHING); + auto const& batchingSystemData = SHGraphicsPredefinedData::GetSystemData(SHGraphicsPredefinedData::SystemType::BATCHING_ANIM); std::vector newLayouts = batchingSystemData.descSetLayouts; if (inputDescriptorLayout) { From e531a087f644b301ea0d09eff6d118664a485b57 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Fri, 10 Mar 2023 18:53:40 +0800 Subject: [PATCH 3/6] Added events for play, pause and finished animations --- Assets/Scripts/AnimTest.cs | 13 ++ .../src/Animation/SHAnimationClip.cpp | 3 +- .../src/Animation/SHAnimationController.cpp | 28 +++- .../src/Animation/SHAnimationController.h | 8 +- .../src/Animation/SHAnimationSystem.h | 41 +++++- .../src/Animation/SHAnimatorComponent.cpp | 67 ++++++++- .../src/Animation/SHAnimatorComponent.h | 19 +++ SHADE_Engine/src/Events/SHEventDefines.h | 4 +- SHADE_Engine/src/Scripting/SHScriptEngine.cpp | 91 ++++++++++++ SHADE_Engine/src/Scripting/SHScriptEngine.h | 13 ++ SHADE_Managed/src/Components/Animator.cxx | 138 ++++++++++++++++++ SHADE_Managed/src/Components/Animator.hxx | 129 ++++++++++++++++ SHADE_Managed/src/Components/UIElement.cxx | 29 ++-- SHADE_Managed/src/Engine/EngineInterface.cxx | 2 + 14 files changed, 563 insertions(+), 22 deletions(-) diff --git a/Assets/Scripts/AnimTest.cs b/Assets/Scripts/AnimTest.cs index b0761476..69b47497 100644 --- a/Assets/Scripts/AnimTest.cs +++ b/Assets/Scripts/AnimTest.cs @@ -25,6 +25,10 @@ namespace SHADE.Test protected override void awake() { Animator = GetComponent(); + + Animator.OnClipStartedPlaying.RegisterAction((_) => Debug.Log("Start Playing")); + Animator.OnClipPaused.RegisterAction((_) => Debug.Log("Pause")); + Animator.OnClipFinished.RegisterAction((_) => Debug.Log("Finished")); } protected override void update() @@ -61,6 +65,15 @@ namespace SHADE.Test AnimationSystem.TimeScale = AnimationSystem.TimeScale > 0.0f ? 0.0f : AnimationSystem.DefaultTimeScale; } + + if (Input.GetKeyUp(Input.KeyCode.P)) + { + if (Animator.IsPlaying) + Animator.Pause(); + else + Animator.Play(); + + } } #endregion } diff --git a/SHADE_Engine/src/Animation/SHAnimationClip.cpp b/SHADE_Engine/src/Animation/SHAnimationClip.cpp index b4a62651..2066506f 100644 --- a/SHADE_Engine/src/Animation/SHAnimationClip.cpp +++ b/SHADE_Engine/src/Animation/SHAnimationClip.cpp @@ -31,8 +31,7 @@ namespace SHADE return; const float SECS_PER_TICK = 1.0f / static_cast(rawAnim->GetTicksPerSecond()); - const int ONE_PAST_LAST_FRAME = lastFrame + 1; - duration = static_cast(ONE_PAST_LAST_FRAME - firstFrame) * SECS_PER_TICK; + duration = static_cast(lastFrame - firstFrame) * SECS_PER_TICK; startTimeStamp = static_cast(firstFrame) * SECS_PER_TICK; } } \ No newline at end of file diff --git a/SHADE_Engine/src/Animation/SHAnimationController.cpp b/SHADE_Engine/src/Animation/SHAnimationController.cpp index 8152426f..3c04614a 100644 --- a/SHADE_Engine/src/Animation/SHAnimationController.cpp +++ b/SHADE_Engine/src/Animation/SHAnimationController.cpp @@ -15,6 +15,7 @@ of DigiPen Institute of Technology is prohibited. #include "SHAnimationSystem.h" #include "ECS_Base/Managers/SHSystemManager.h" #include "SHAnimationClip.h" +#include "Events/SHEventManager.hpp" namespace SHADE { @@ -55,7 +56,7 @@ namespace SHADE /*-----------------------------------------------------------------------------------*/ /* Lifecycle Functions */ /*-----------------------------------------------------------------------------------*/ - void SHAnimationController::Update(InstanceData& instData, float dt) + void SHAnimationController::Update(EntityID eid, InstanceData& instData, float dt) { // Is there a valid node if (!instData.CurrentNode) @@ -72,6 +73,7 @@ namespace SHADE instData.ClipPlaybackTime = instData.CurrentNode->Clip->GetStartTimeStamp() + instData.CurrentNode->Clip->GetTotalDuration(); // Go to next state + Handle originalClip = instData.CurrentNode->Clip; bool stateChanged = false; for (const auto& transition : instData.CurrentNode->Transitions) { @@ -107,7 +109,29 @@ namespace SHADE } // Handle if there is no next state, we repeat - if (!stateChanged) + if (stateChanged) + { + // Raise events + SHEventManager::BroadcastEvent + ( + SHAnimationSystem::FinishedEvent + { + eid, + originalClip + }, + SH_ANIMATION_FINISHED_EVENT + ); + SHEventManager::BroadcastEvent + ( + SHAnimationSystem::PlayEvent + { + eid, + instData.CurrentNode ? instData.CurrentNode->Clip : Handle() + }, + SH_ANIMATIONS_PLAY_EVENT + ); + } + else { instData.ClipPlaybackTime = instData.CurrentNode->Clip->GetStartTimeStamp(); } diff --git a/SHADE_Engine/src/Animation/SHAnimationController.h b/SHADE_Engine/src/Animation/SHAnimationController.h index 56bf6f45..e664b445 100644 --- a/SHADE_Engine/src/Animation/SHAnimationController.h +++ b/SHADE_Engine/src/Animation/SHAnimationController.h @@ -18,6 +18,7 @@ of DigiPen Institute of Technology is prohibited. // Project Includes #include "SH_API.h" #include "Resource/SHHandle.h" +#include "ECS_Base/SHECSMacros.h" namespace SHADE { @@ -162,7 +163,12 @@ namespace SHADE /// /// Runs a single update for the animation controller. /// - void Update(InstanceData& instData, float dt); + /// + /// EntityID of the entity that this animation controller is updating. + /// + /// Instance data that stores the current state. + /// Frame time. + void Update(EntityID eid, InstanceData& instData, float dt); /*---------------------------------------------------------------------------------*/ /* Usage Functions */ diff --git a/SHADE_Engine/src/Animation/SHAnimationSystem.h b/SHADE_Engine/src/Animation/SHAnimationSystem.h index fd972e47..975547c0 100644 --- a/SHADE_Engine/src/Animation/SHAnimationSystem.h +++ b/SHADE_Engine/src/Animation/SHAnimationSystem.h @@ -19,6 +19,11 @@ of DigiPen Institute of Technology is prohibited. namespace SHADE { + /*-----------------------------------------------------------------------------------*/ + /* Forward Declaration */ + /*-----------------------------------------------------------------------------------*/ + class SHAnimationClip; + /*-----------------------------------------------------------------------------------*/ /* Type Definitions */ /*-----------------------------------------------------------------------------------*/ @@ -29,7 +34,7 @@ namespace SHADE { public: /*---------------------------------------------------------------------------------*/ - /* Type Definitions */ + /* Type Definitions - System Routines */ /*---------------------------------------------------------------------------------*/ /// /// Responsible for updating the playback of all animator components and computing @@ -42,6 +47,40 @@ namespace SHADE void Execute(double dt) noexcept override final; }; + /*---------------------------------------------------------------------------------*/ + /* Type Definitions - Event Data */ + /*---------------------------------------------------------------------------------*/ + /// + /// Event data for the SH_ANIMATIONS_PLAY_EVENT event which is raised on the frame + /// that an animation has started playing. + /// + struct PlayEvent + { + EntityID Entity; + Handle PlayingClip; + float CurrentTimeStamp; + }; + /// + /// Event data for the SH_ANIMATIONS_PAUSED_EVENT event which is raised on the frame + /// that an animation is paused. + /// + struct PausedEvent + { + EntityID Entity; + Handle PausedClip; + float PauseTimeStamp; + }; + /// + /// Event data for the SH_ANIMATIONS_FINISHED_EVENT event which is raised on the + /// frame that an animation has finished playing. This will not be called for any + /// animation that loops. + /// + struct FinishedEvent + { + EntityID Entity; + Handle FinishedClip; + }; + /*---------------------------------------------------------------------------------*/ /* Constants */ /*---------------------------------------------------------------------------------*/ diff --git a/SHADE_Engine/src/Animation/SHAnimatorComponent.cpp b/SHADE_Engine/src/Animation/SHAnimatorComponent.cpp index d21ee5e1..fb866cbb 100644 --- a/SHADE_Engine/src/Animation/SHAnimatorComponent.cpp +++ b/SHADE_Engine/src/Animation/SHAnimatorComponent.cpp @@ -25,6 +25,7 @@ of DigiPen Institute of Technology is prohibited. #include "ECS_Base/Managers/SHSystemManager.h" #include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h" #include "Tools/SHDebugDraw.h" +#include "Events/SHEventManager.hpp" namespace SHADE { @@ -35,6 +36,8 @@ namespace SHADE { isPlaying = true; playOnce = false; + + raisePlayEvent(); } void SHAnimatorComponent::Play(Handle clip) @@ -91,11 +94,13 @@ namespace SHADE isPlaying = true; currPlaybackTime = 0.0f; + raisePlayEvent(); } void SHAnimatorComponent::Pause() { isPlaying = false; + raisePauseEvent(); } void SHAnimatorComponent::Stop() @@ -210,7 +215,20 @@ namespace SHADE return animController->SetTrigger(animInstanceData, paramName); } - + + /*-----------------------------------------------------------------------------------*/ + /* Getter Functions */ + /*-----------------------------------------------------------------------------------*/ + Handle SHAnimatorComponent::GetCurrentClip() const noexcept + { + if (animController) + { + return animInstanceData.CurrentNode ? animInstanceData.CurrentNode->Clip : Handle(); + } + + return currClip; + } + /*-----------------------------------------------------------------------------------*/ /* Helper Functions - Update */ /*-----------------------------------------------------------------------------------*/ @@ -221,7 +239,7 @@ namespace SHADE return; // Update the animation controller - animController->Update(animInstanceData, dt); + animController->Update(GetEID(), animInstanceData, dt); // Get current clip currClip = animInstanceData.CurrentNode->Clip; @@ -241,6 +259,7 @@ namespace SHADE playOnce = false; isPlaying = false; currPlaybackTime = currClip->GetStartTimeStamp() + currClip->GetTotalDuration(); + raiseFinishEvent(); } else { @@ -299,6 +318,50 @@ namespace SHADE updatePoseWithClip(poseTime, rawAnimData, child, transformMatrix); } } + + /*-----------------------------------------------------------------------------------*/ + /* Helper Functions - Event */ + /*-----------------------------------------------------------------------------------*/ + void SHAnimatorComponent::raisePlayEvent() + { + SHEventManager::BroadcastEvent + ( + SHAnimationSystem::PlayEvent + { + GetEID(), + GetCurrentClip(), + GetCurrentClipPlaybackTime() + }, + SH_ANIMATIONS_PLAY_EVENT + ); + } + + void SHAnimatorComponent::raisePauseEvent() + { + SHEventManager::BroadcastEvent + ( + SHAnimationSystem::PausedEvent + { + GetEID(), + GetCurrentClip(), + GetCurrentClipPlaybackTime() + }, + SH_ANIMATIONS_PAUSED_EVENT + ); + } + + void SHAnimatorComponent::raiseFinishEvent() + { + SHEventManager::BroadcastEvent + ( + SHAnimationSystem::FinishedEvent + { + GetEID(), + GetCurrentClip() + }, + SH_ANIMATION_FINISHED_EVENT + ); + } } /*-------------------------------------------------------------------------------------*/ diff --git a/SHADE_Engine/src/Animation/SHAnimatorComponent.h b/SHADE_Engine/src/Animation/SHAnimatorComponent.h index 01e50861..ba18bf71 100644 --- a/SHADE_Engine/src/Animation/SHAnimatorComponent.h +++ b/SHADE_Engine/src/Animation/SHAnimatorComponent.h @@ -24,6 +24,7 @@ of DigiPen Institute of Technology is prohibited. #include "Math/SHQuaternion.h" #include "SHRawAnimation.h" #include "SHAnimationController.h" +#include "SHAnimationSystem.h" namespace SHADE { @@ -166,6 +167,20 @@ namespace SHADE /// /// Handle GetAnimationController() const noexcept { return animController; } + /// + /// Retrieves the currently playing clip. If there is an Animation Controller, it + /// will be retrieved from it. Otherwise, the currently assigned Animation Clip is provided. + /// + /// Handle to the currently playing Animation Clip if any. + Handle GetCurrentClip() const noexcept; + /// + /// Retrieves the current timestamp of the currently playing clip. This is relative + /// to the start frame of the Animation Clip. This function will retrieve the correct + /// playback time depending on the current playback mode (Animation Controller or + /// Manual). + /// + /// Time in seconds of the current timestamp of the current clip. + float GetCurrentClipPlaybackTime() const noexcept { return animController ? animInstanceData.ClipPlaybackTime : currPlaybackTime; } private: /*---------------------------------------------------------------------------------*/ @@ -201,6 +216,10 @@ namespace SHADE void updatePoseWithClip(float poseTime, Handle rawAnimData, Handle node, const SHMatrix& parentMatrix); template T getInterpolatedValue(const std::vector>& keyframes, float poseTime); + // Event Functions + void raisePlayEvent(); + void raisePauseEvent(); + void raiseFinishEvent(); /*---------------------------------------------------------------------------------*/ /* RTTR */ diff --git a/SHADE_Engine/src/Events/SHEventDefines.h b/SHADE_Engine/src/Events/SHEventDefines.h index cdef68b9..2606370f 100644 --- a/SHADE_Engine/src/Events/SHEventDefines.h +++ b/SHADE_Engine/src/Events/SHEventDefines.h @@ -31,4 +31,6 @@ constexpr SHEventIdentifier SH_BUTTON_HOVER_ENTER_EVENT { 22 }; constexpr SHEventIdentifier SH_BUTTON_HOVER_EXIT_EVENT { 23 }; constexpr SHEventIdentifier SH_ASSET_COMPILE_EVENT { 24 }; constexpr SHEventIdentifier SH_GRAPHICS_LIGHT_DELETE_EVENT { 25 }; - +constexpr SHEventIdentifier SH_ANIMATIONS_PAUSED_EVENT { 26 }; +constexpr SHEventIdentifier SH_ANIMATIONS_PLAY_EVENT { 27 }; +constexpr SHEventIdentifier SH_ANIMATION_FINISHED_EVENT { 28 }; diff --git a/SHADE_Engine/src/Scripting/SHScriptEngine.cpp b/SHADE_Engine/src/Scripting/SHScriptEngine.cpp index bd2cfea5..3c36f998 100644 --- a/SHADE_Engine/src/Scripting/SHScriptEngine.cpp +++ b/SHADE_Engine/src/Scripting/SHScriptEngine.cpp @@ -34,6 +34,8 @@ of DigiPen Institute of Technology is prohibited. #include "UI/Events/SHButtonClickEvent.h" #include "UI/SHUIComponent.h" #include "Editor/EditorWindow/MenuBar/SHEditorMenuBar.h" +#include "Animation/SHAnimatorComponent.h" +#include "Resource/SHResourceManager.h" namespace SHADE { @@ -412,6 +414,49 @@ namespace SHADE return eventData->handle; } + SHEventHandle SHScriptEngine::onAnimatorRemoved(SHEventPtr eventPtr) + { + auto eventData = reinterpret_cast*>(eventPtr.get()); + if (eventData->data->removedComponentType == ComponentFamily::GetID()) + csAnimatorOnRemoved(eventData->data->eid); + return eventData->handle; + } + + SHEventHandle SHScriptEngine::onAnimatorClipStartedPlaying(SHEventPtr eventPtr) + { + auto eventData = reinterpret_cast*>(eventPtr.get()); + csAnimatorOnClipStartPlaying + ( + eventData->data->Entity, + SHResourceManager::GetAssetID(eventData->data->PlayingClip).value_or(INVALID_ASSET_ID), + eventData->data->CurrentTimeStamp + ); + return eventData->handle; + } + + SHEventHandle SHScriptEngine::onAnimatorClipPaused(SHEventPtr eventPtr) + { + auto eventData = reinterpret_cast*>(eventPtr.get()); + csAnimatorOnClipPaused + ( + eventData->data->Entity, + SHResourceManager::GetAssetID(eventData->data->PausedClip).value_or(INVALID_ASSET_ID), + eventData->data->PauseTimeStamp + ); + return eventData->handle; + } + + SHEventHandle SHScriptEngine::onAnimatorClipFinished(SHEventPtr eventPtr) + { + auto eventData = reinterpret_cast*>(eventPtr.get()); + csAnimatorOnClipFinished + ( + eventData->data->Entity, + SHResourceManager::GetAssetID(eventData->data->FinishedClip).value_or(INVALID_ASSET_ID) + ); + return eventData->handle; + } + /*-----------------------------------------------------------------------------------*/ /* Helper Functions */ /*-----------------------------------------------------------------------------------*/ @@ -578,6 +623,30 @@ namespace SHADE DEFAULT_CSHARP_NAMESPACE + ".UIElement", "OnHoverExited" ); + csAnimatorOnRemoved = dotNet.GetFunctionPtr + ( + DEFAULT_CSHARP_LIB_NAME, + DEFAULT_CSHARP_NAMESPACE + ".Animator", + "OnComponentRemoved" + ); + csAnimatorOnClipStartPlaying = dotNet.GetFunctionPtr + ( + DEFAULT_CSHARP_LIB_NAME, + DEFAULT_CSHARP_NAMESPACE + ".Animator", + "RaiseOnClipStartedPlaying" + ); + csAnimatorOnClipPaused = dotNet.GetFunctionPtr + ( + DEFAULT_CSHARP_LIB_NAME, + DEFAULT_CSHARP_NAMESPACE + ".Animator", + "RaiseOnClipPaused" + ); + csAnimatorOnClipFinished = dotNet.GetFunctionPtr + ( + DEFAULT_CSHARP_LIB_NAME, + DEFAULT_CSHARP_NAMESPACE + ".Animator", + "RaiseOnClipFinished" + ); csEditorRenderScripts = dotNet.GetFunctionPtr ( DEFAULT_CSHARP_LIB_NAME, @@ -663,6 +732,28 @@ namespace SHADE }; SHEventManager::SubscribeTo(SH_BUTTON_HOVER_EXIT_EVENT, std::dynamic_pointer_cast(hoverExitedUIElementEventReceiver)); + /* Animator */ + std::shared_ptr> removedAnimatorEventReceiver + { + std::make_shared>(this, &SHScriptEngine::onAnimatorRemoved) + }; + SHEventManager::SubscribeTo(SH_COMPONENT_REMOVED_EVENT, std::dynamic_pointer_cast(removedAnimatorEventReceiver)); + std::shared_ptr> animStartedPlayingEventReceiver + { + std::make_shared>(this, &SHScriptEngine::onAnimatorClipStartedPlaying) + }; + SHEventManager::SubscribeTo(SH_ANIMATIONS_PLAY_EVENT, std::dynamic_pointer_cast(animStartedPlayingEventReceiver)); + std::shared_ptr> animPausedEventReceiver + { + std::make_shared>(this, &SHScriptEngine::onAnimatorClipPaused) + }; + SHEventManager::SubscribeTo(SH_ANIMATIONS_PAUSED_EVENT, std::dynamic_pointer_cast(animPausedEventReceiver)); + std::shared_ptr> animFinishedEventReceiver + { + std::make_shared>(this, &SHScriptEngine::onAnimatorClipFinished) + }; + SHEventManager::SubscribeTo(SH_ANIMATION_FINISHED_EVENT, std::dynamic_pointer_cast(animFinishedEventReceiver)); + /* SceneGraph */ // Register for SceneNode child added event std::shared_ptr> addChildEventReceiver diff --git a/SHADE_Engine/src/Scripting/SHScriptEngine.h b/SHADE_Engine/src/Scripting/SHScriptEngine.h index b207ae64..1582c082 100644 --- a/SHADE_Engine/src/Scripting/SHScriptEngine.h +++ b/SHADE_Engine/src/Scripting/SHScriptEngine.h @@ -24,6 +24,7 @@ of DigiPen Institute of Technology is prohibited. #include "ECS_Base/System/SHSystemRoutine.h" #include "Events/SHEventDefines.h" #include "Events/SHEvent.h" +#include "Assets/SHAssetMacros.h" namespace SHADE { @@ -251,6 +252,8 @@ namespace SHADE using CsScriptDeserialiseYamlFuncPtr = bool(*)(EntityID, const void*); using CsScriptEditorFuncPtr = void(*)(EntityID); using CsEventRelayFuncPtr = void(*)(EntityID); + using CsEventRelayAnimFuncPtr = void(*)(EntityID, AssetID); + using CsEventRelayAnimTimeFuncPtr = void(*)(EntityID, AssetID, float); /*-----------------------------------------------------------------------------*/ /* Constants */ @@ -295,6 +298,12 @@ namespace SHADE CsEventRelayFuncPtr csUIElementOnReleased = nullptr; CsEventRelayFuncPtr csUIElementOnHoverEntered = nullptr; CsEventRelayFuncPtr csUIElementOnHoverExited = nullptr; + CsEventRelayFuncPtr csAnimatorOnRemoved = nullptr; + CsEventRelayAnimTimeFuncPtr csAnimatorOnClipStartPlaying = nullptr; + CsEventRelayAnimTimeFuncPtr csAnimatorOnClipPaused = nullptr; + CsEventRelayAnimFuncPtr csAnimatorOnClipFinished = nullptr; + + // - Editor CsScriptEditorFuncPtr csEditorRenderScripts = nullptr; CsFuncPtr csEditorUndo = nullptr; @@ -315,6 +324,10 @@ namespace SHADE SHEventHandle onSceneNodeChildrenAdded(SHEventPtr eventPtr); SHEventHandle onSceneNodeChildrenRemoved(SHEventPtr eventPtr); SHEventHandle onSceneDestroyed(SHEventPtr eventPtr); + SHEventHandle onAnimatorRemoved(SHEventPtr eventPtr); + SHEventHandle onAnimatorClipStartedPlaying(SHEventPtr eventPtr); + SHEventHandle onAnimatorClipPaused(SHEventPtr eventPtr); + SHEventHandle onAnimatorClipFinished(SHEventPtr eventPtr); /*-----------------------------------------------------------------------------*/ /* Helper Functions */ diff --git a/SHADE_Managed/src/Components/Animator.cxx b/SHADE_Managed/src/Components/Animator.cxx index 364ce046..f7fb92e3 100644 --- a/SHADE_Managed/src/Components/Animator.cxx +++ b/SHADE_Managed/src/Components/Animator.cxx @@ -17,6 +17,7 @@ of DigiPen Institute of Technology is prohibited. #include "Animator.hxx" #include "Assets/NativeAsset.hxx" #include "Utility/Convert.hxx" +#include "Utility/Debug.hxx" namespace SHADE { @@ -69,6 +70,65 @@ namespace SHADE return Convert::ToCLI(CURR_NODE->Name); return nullptr; } + bool Animator::IsPlaying::get() + { + return GetNativeComponent()->IsPlaying(); + } + float Animator::CurrentClipPlaybackTime::get() + { + return GetNativeComponent()->GetCurrentClipPlaybackTime(); + } + CallbackEvent^ Animator::OnClipStartedPlaying::get() + { + // Create map if it wasn't before + if (onClipStartPlayingEventMap == nullptr) + { + onClipStartPlayingEventMap = gcnew System::Collections::Generic::Dictionary^>(); + } + + // Create event if it wasn't before + if (!onClipStartPlayingEventMap->ContainsKey(owner.EntityId)) + { + onClipStartPlayingEventMap->Add(owner.EntityId, gcnew CallbackEvent()); + } + + // Return the event + return onClipStartPlayingEventMap[owner.EntityId]; + } + CallbackEvent^ Animator::OnClipPaused::get() + { + // Create map if it wasn't before + if (onClipPausedEventMap == nullptr) + { + onClipPausedEventMap = gcnew System::Collections::Generic::Dictionary^>(); + } + + // Create event if it wasn't before + if (!onClipPausedEventMap->ContainsKey(owner.EntityId)) + { + onClipPausedEventMap->Add(owner.EntityId, gcnew CallbackEvent()); + } + + // Return the event + return onClipPausedEventMap[owner.EntityId]; + } + CallbackEvent^ Animator::OnClipFinished::get() + { + // Create map if it wasn't before + if (onClipFinishedEventMap == nullptr) + { + onClipFinishedEventMap = gcnew System::Collections::Generic::Dictionary^>(); + } + + // Create event if it wasn't before + if (!onClipFinishedEventMap->ContainsKey(owner.EntityId)) + { + onClipFinishedEventMap->Add(owner.EntityId, gcnew CallbackEvent()); + } + + // Return the event + return onClipFinishedEventMap[owner.EntityId]; + } /*---------------------------------------------------------------------------------*/ /* Usage Functions */ @@ -156,4 +216,82 @@ namespace SHADE { return GetBoolParameter(paramName); } + + /*---------------------------------------------------------------------------------*/ + /* Static Clear Functions */ + /*---------------------------------------------------------------------------------*/ + void Animator::ClearStaticEventData() + { + if (onClipStartPlayingEventMap != nullptr) + onClipStartPlayingEventMap->Clear(); + if (onClipPausedEventMap != nullptr) + onClipPausedEventMap->Clear(); + if (onClipFinishedEventMap != nullptr) + onClipFinishedEventMap->Clear(); + } + + /*---------------------------------------------------------------------------------*/ + /* Event Handling Functions */ + /*---------------------------------------------------------------------------------*/ + void Animator::OnComponentRemoved(EntityID entity) + { + SAFE_NATIVE_CALL_BEGIN + // Remove the event if it contained an event + if (onClipStartPlayingEventMap != nullptr && onClipStartPlayingEventMap->ContainsKey(entity)) + { + onClipStartPlayingEventMap->Remove(entity); + } + if (onClipPausedEventMap != nullptr && onClipPausedEventMap->ContainsKey(entity)) + { + onClipPausedEventMap->Remove(entity); + } + if (onClipFinishedEventMap != nullptr && onClipFinishedEventMap->ContainsKey(entity)) + { + onClipFinishedEventMap->Remove(entity); + } + SAFE_NATIVE_CALL_END("Animator.OnComponentRemoved") + } + + void Animator::RaiseOnClipStartedPlaying(EntityID entity, AssetID animAssetId, float currTimeStamp) + { + SAFE_NATIVE_CALL_BEGIN + // Remove the event if it contained an event + if (onClipStartPlayingEventMap != nullptr && onClipStartPlayingEventMap->ContainsKey(entity)) + { + ClipStartPlayingEventData data; + data.PlayingClip = AnimationClipAsset(animAssetId); + data.CurrentTimeStamp = currTimeStamp; + onClipStartPlayingEventMap[entity]->Invoke(data); + } + SAFE_NATIVE_CALL_END("Animator.OnClipStartedPlaying") + } + + void Animator::RaiseOnClipPaused(EntityID entity, AssetID animAssetId, float currTimeStamp) + { + SAFE_NATIVE_CALL_BEGIN + // Remove the event if it contained an event + if (onClipPausedEventMap != nullptr && onClipPausedEventMap->ContainsKey(entity)) + { + ClipPausedEventData data; + data.PausedClip = AnimationClipAsset(animAssetId); + data.PauseTimeStamp = currTimeStamp; + onClipPausedEventMap[entity]->Invoke(data); + } + SAFE_NATIVE_CALL_END("Animator.OnClipPaused") + } + + void Animator::RaiseOnClipFinished(EntityID entity, AssetID animAssetId) + { + + SAFE_NATIVE_CALL_BEGIN + // Remove the event if it contained an event + if (onClipFinishedEventMap != nullptr && onClipFinishedEventMap->ContainsKey(entity)) + { + ClipFinishedEventData data; + data.FinishedClip = AnimationClipAsset(animAssetId); + onClipFinishedEventMap[entity]->Invoke(data); + } + SAFE_NATIVE_CALL_END("Animator.OnClipFinished") + } + } diff --git a/SHADE_Managed/src/Components/Animator.hxx b/SHADE_Managed/src/Components/Animator.hxx index 7100c54b..39b97053 100644 --- a/SHADE_Managed/src/Components/Animator.hxx +++ b/SHADE_Managed/src/Components/Animator.hxx @@ -25,6 +25,47 @@ of DigiPen Institute of Technology is prohibited. namespace SHADE { + /// + /// Simple struct that holds event data for the Animator.OnClipStartedPlaying event. + /// + public value struct ClipStartPlayingEventData + { + /// + /// Animation Clip that started playing. + /// + AnimationClipAsset PlayingClip; + /// + /// Timestamp that the Animation Clip started playing at. This is relative to + /// the first frame of the Animation Clip. + /// + float CurrentTimeStamp; + }; + /// + /// Simple struct that holds event data for the Animator.OnClipPaused event. + /// + public value struct ClipPausedEventData + { + /// + /// Animation Clip that was paused. + /// + AnimationClipAsset PausedClip; + /// + /// Timestamp that the Animation Clip was paused at. This is relative to + /// the first frame of the Animation Clip. + /// + float PauseTimeStamp; + }; + /// + /// Simple struct that holds event data for the Animator.OnClipFinished event. + /// + public value struct ClipFinishedEventData + { + /// + /// Animation Clip that just finished. + /// + AnimationClipAsset FinishedClip; + }; + /// /// CLR version of the SHADE Engine's SHAnimatorComponent. /// @@ -70,6 +111,45 @@ namespace SHADE { System::String^ get(); } + /// + /// Whether an animation is currently playing. + /// + property bool IsPlaying + { + bool get(); + } + /// + /// Retrieves the current timestamp of the currently playing clip. This is + /// relative to the start frame of the Animation Clip. This will retrieve the + /// correct playback time depending on the current playback mode + /// (Animation Controller or via direct Animation Clip). + /// + property float CurrentClipPlaybackTime + { + float get(); + } + /// + /// Event which is raised on the frame that an animation has started playing. + /// + property CallbackEvent^ OnClipStartedPlaying + { + CallbackEvent^ get(); + } + /// + /// Event which is raised on the frame that an animation is paused. + /// + property CallbackEvent^ OnClipPaused + { + CallbackEvent^ get(); + } + /// + /// Event which is raised on the frame that an animation has finished playing. + /// This will not be called for any animation that loops. + /// + property CallbackEvent^ OnClipFinished + { + CallbackEvent^ get(); + } /*-----------------------------------------------------------------------------*/ /* Usage Functions */ @@ -159,6 +239,55 @@ namespace SHADE /// Name of the parameter. /// True if the trigger is set. System::Nullable GetTriggerState(System::String^ paramName); + + internal: + /*-----------------------------------------------------------------------------*/ + /* Static Clear Functions */ + /*-----------------------------------------------------------------------------*/ + /// + /// Disposes static event data which may contains data from SHADE_Scripting. + /// + static void ClearStaticEventData(); + + private: + /*-----------------------------------------------------------------------------*/ + /* Event Handling Functions */ + /*-----------------------------------------------------------------------------*/ + /// + /// To be called from native code when this component is removed. + /// + /// The entity which has it's component removed. + static void OnComponentRemoved(EntityID entity); + /// + /// To be called from native code when a clip for this component has started + /// playing. + /// + /// The entity which has a clip start playing. + /// AssetID of the animation clip. + /// Timestamp that the clip was started at. + static void RaiseOnClipStartedPlaying(EntityID entity, AssetID animAssetId, float currTimeStamp); + /// + /// To be called from native code when a clip for this component has been paused. + /// + /// The entity which a clip has paused. + /// AssetID of the animation clip. + /// Timestamp that the clip was paused at. + static void RaiseOnClipPaused(EntityID entity, AssetID animAssetId, float currTimeStamp); + /// + /// To be called from native code when a clip for this component has finished + /// playing. + /// + /// The entity which a clip has finished playing. + /// AssetID of the animation clip. + static void RaiseOnClipFinished(EntityID entity, AssetID animAssetId); + + /*-----------------------------------------------------------------------------*/ + /* Static Data Members */ + /*-----------------------------------------------------------------------------*/ + // As these hold references to code in SHADE_Scripting, we must remember to dispose of them when changing scenes + static System::Collections::Generic::Dictionary^>^ onClipStartPlayingEventMap; + static System::Collections::Generic::Dictionary^>^ onClipPausedEventMap; + static System::Collections::Generic::Dictionary^>^ onClipFinishedEventMap; }; } diff --git a/SHADE_Managed/src/Components/UIElement.cxx b/SHADE_Managed/src/Components/UIElement.cxx index 8e6134e1..9e4a2459 100644 --- a/SHADE_Managed/src/Components/UIElement.cxx +++ b/SHADE_Managed/src/Components/UIElement.cxx @@ -28,18 +28,6 @@ namespace SHADE : Component(entity) {} - void UIElement::ClearStaticEventData() - { - if (onClickEventMap != nullptr) - onClickEventMap->Clear(); - if (onReleasedEventMap != nullptr) - onReleasedEventMap->Clear(); - if (onHoverEnterEventMap != nullptr) - onHoverEnterEventMap->Clear(); - if (onHoverExitEventMap != nullptr) - onHoverExitEventMap->Clear(); - } - /*---------------------------------------------------------------------------------*/ /* Properties */ /*---------------------------------------------------------------------------------*/ @@ -112,9 +100,24 @@ namespace SHADE return onHoverExitEventMap[owner.EntityId]; } + /*---------------------------------------------------------------------------------*/ + /* Static Clear Functions */ + /*---------------------------------------------------------------------------------*/ + void UIElement::ClearStaticEventData() + { + if (onClickEventMap != nullptr) + onClickEventMap->Clear(); + if (onReleasedEventMap != nullptr) + onReleasedEventMap->Clear(); + if (onHoverEnterEventMap != nullptr) + onHoverEnterEventMap->Clear(); + if (onHoverExitEventMap != nullptr) + onHoverExitEventMap->Clear(); + } + /*---------------------------------------------------------------------------------*/ /* Event Handling Functions */ - /*-----------------------------------------------------------------------------a----*/ + /*---------------------------------------------------------------------------------*/ void UIElement::OnComponentRemoved(EntityID entity) { SAFE_NATIVE_CALL_BEGIN diff --git a/SHADE_Managed/src/Engine/EngineInterface.cxx b/SHADE_Managed/src/Engine/EngineInterface.cxx index 50f8fbc2..ca7c6e77 100644 --- a/SHADE_Managed/src/Engine/EngineInterface.cxx +++ b/SHADE_Managed/src/Engine/EngineInterface.cxx @@ -22,6 +22,7 @@ of DigiPen Institute of Technology is prohibited. #include "Utility/Debug.hxx" #include "Scripts/ScriptStore.hxx" #include "Components/UIElement.hxx" +#include "Components/Animator.hxx" namespace SHADE { @@ -46,6 +47,7 @@ namespace SHADE // Unload static data of components that have access to the assembly UIElement::ClearStaticEventData(); + Animator::ClearStaticEventData(); // Unload the script scriptContext->Unload(); From 6be5895ec715d75d2fdec39bc072552e0f30e824 Mon Sep 17 00:00:00 2001 From: maverickdgg Date: Fri, 10 Mar 2023 18:56:04 +0800 Subject: [PATCH 4/6] Fixed Camera Collision --- SHADE_Engine/src/Camera/SHCameraSystem.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.cpp b/SHADE_Engine/src/Camera/SHCameraSystem.cpp index 921f6f80..bd4252f3 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.cpp +++ b/SHADE_Engine/src/Camera/SHCameraSystem.cpp @@ -206,6 +206,16 @@ namespace SHADE camera->dirtyView = true; } + camera->offset = offset; + + SHVec3 tOffset = pivot.GetTargetOffset(); + + + tOffset = SHVec3::RotateY(tOffset, SHMath::DegreesToRadians(pivot.GetYaw())); + + + if (pivot.lookAtCameraOrigin) + CameraLookAt(*camera, camera->position + pivot.GetTargetOffset()); @@ -250,7 +260,7 @@ namespace SHADE if (camera.isActive == false) return; - if (SHComponentManager::HasComponent(camera.GetEID()) == true && &camera != &editorCamera) + if (SHComponentManager::HasComponent(camera.GetEID()) == true && SHComponentManager::HasComponent(camera.GetEID()) == false && &camera != &editorCamera) { auto transform = SHComponentManager::GetComponent(camera.GetEID()); SHVec3 rotation = transform->GetWorldRotation(); @@ -273,14 +283,14 @@ namespace SHADE { camera.offset = arm->GetOffset(); - SHVec3 tOffset = arm->GetTargetOffset(); + /*SHVec3 tOffset = arm->GetTargetOffset(); tOffset = SHVec3::RotateY(tOffset, SHMath::DegreesToRadians(arm->GetYaw())); if (arm->lookAtCameraOrigin) - CameraLookAt(camera, camera.position + tOffset); + CameraLookAt(camera, camera.position + arm->GetTargetOffset());*/ } From d1e1a2e31c1f27d636ca358ff02fe156ef675725 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Fri, 10 Mar 2023 18:57:09 +0800 Subject: [PATCH 5/6] Fixed bug where animations would revert to bind pose when paused --- SHADE_Engine/src/Animation/SHAnimatorComponent.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/SHADE_Engine/src/Animation/SHAnimatorComponent.cpp b/SHADE_Engine/src/Animation/SHAnimatorComponent.cpp index fb866cbb..294d8098 100644 --- a/SHADE_Engine/src/Animation/SHAnimatorComponent.cpp +++ b/SHADE_Engine/src/Animation/SHAnimatorComponent.cpp @@ -124,9 +124,13 @@ namespace SHADE std::fill(boneMatrices.begin(), boneMatrices.end(), SHMatrix::Identity); // Do not do anything if is not playing or there's nothing to animate - if (!isPlaying || !rig || !rig->GetRootNode()) + if (!rig || !rig->GetRootNode()) return; + // We want to still display a paused pose, so we only prevent progression + if (!isPlaying) + dt = 0.0f; + // Update the animation controller if any, this will set the currClip if (animController) { @@ -270,7 +274,7 @@ namespace SHADE void SHAnimatorComponent::updateCurrentAnimatorState(Handle clip, float playbackTime) { // Nothing to animate - if (!clip || !isPlaying || !rig || !rig->GetRootNode()) + if (!clip || !rig || !rig->GetRootNode()) return; // Check that we have animation data From 1d16bd274412d0dcaa70407cea0e73a3780593f3 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Fri, 10 Mar 2023 19:22:50 +0800 Subject: [PATCH 6/6] Fixed more shadows --- Assets/Shaders/ShadowMapAnim_VS.glsl | 12 +++--- Assets/Shaders/ShadowMapAnim_VS.shshaderb | Bin 2025 -> 3749 bytes .../Graphics/MiddleEnd/Batching/SHBatch.cpp | 36 +++++++++++++----- .../GlobalData/SHGraphicsPredefinedData.cpp | 3 +- .../Graphics/RenderGraph/SHRenderGraph.cpp | 2 +- 5 files changed, 36 insertions(+), 17 deletions(-) diff --git a/Assets/Shaders/ShadowMapAnim_VS.glsl b/Assets/Shaders/ShadowMapAnim_VS.glsl index f5f9ab4e..17b135e0 100644 --- a/Assets/Shaders/ShadowMapAnim_VS.glsl +++ b/Assets/Shaders/ShadowMapAnim_VS.glsl @@ -26,12 +26,12 @@ layout (std430, set = 2, binding = 1) buffer AnimBoneMatrices void main() { // // Compute bone matrix - // mat4 boneMatrix = BoneMatrices.data[firstBoneIndex + aBoneIndices[0]] * aBoneWeights[0]; - // boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[1]] * aBoneWeights[1]; - // boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[2]] * aBoneWeights[2]; - // boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[3]] * aBoneWeights[3]; + mat4 boneMatrix = BoneMatrices.data[firstBoneIndex + aBoneIndices[0]] * aBoneWeights[0]; + boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[1]] * aBoneWeights[1]; + boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[2]] * aBoneWeights[2]; + boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[3]] * aBoneWeights[3]; // clip space for rendering - gl_Position = cameraData.vpMat * worldTransform * vec4 (aVertexPos, 1.0f); - // gl_Position = cameraData.vpMat * worldTransform * boneMatrix * vec4 (aVertexPos, 1.0f); + // gl_Position = cameraData.vpMat * worldTransform * vec4 (aVertexPos, 1.0f); + gl_Position = cameraData.vpMat * worldTransform * boneMatrix * vec4 (aVertexPos, 1.0f); } \ No newline at end of file diff --git a/Assets/Shaders/ShadowMapAnim_VS.shshaderb b/Assets/Shaders/ShadowMapAnim_VS.shshaderb index 96c45e4742177cee622935fbe17c8524f09a8178..047f485b41367464e6b0a86d3dd8d80f77753127 100644 GIT binary patch literal 3749 zcmZ9MS(_785QckTGJ^{sB8v)R2Ha6Z1w@f$7%-rN41(YuLefBECJ9Lx7DWa(^vdPh zU*oUx#^>>UJ6+JyJjMCytFO+fQ*|a|f2~ULZ~3yVlSwj`Je;gdejQQCnq(PFl01@3 z3assUP%H1F#^mcWs%s?%!|x z-aMiQF&{PFH}X6;dSLI=xop{MYDzcgYUSNe-}fbF-RoG5 zMV;%5n7n#@-=BKVQ@auKbN@}O*5+OGpJ7$&UCr08Vsgf(3v91qzvl}s{Qdau8U7it zecwbrf2w((&6xuER-^aEG|%a>nq%BL^m_$o-W71n!`h?%KG?I3o2TzviF)k6zd>=I zYXvr6y}obBxc$Aw>RqkHy1rvICa+%K-yJ#ctM(3-BufX>-vya#t-JXPunuSCC;tzO ze;4lM8}m0o?LK^G^#ta;XHYr&Co$*g3`6r&!7rgP=V{D5`57v5#+xzUp>NH&x!!pS zGv@x&tXr@u7W;djt(g38Xv}#QGf#d$x3FfpsOLFwx#kz}t=XA}=0&i4)cg|IJo%{k zWpLDNJZjzsHWoF%0vuS@-ff%z~;%vJZs?cJdfhb`9*Jzfz9=c-noYb@q@8th%H z$-ULYJdMRXKL(fQc^2P!`a2z(Pr&jq&riYT$;UiD1IIj##~eNf8;f~<0j^@P{{;9; zOg`rM71%ua*ryII&+{Ci8V>*f literal 2025 zcmZ9LYflqF6o!{e3!>aaE-GLFub_z6m>4ezrkK=#!RW_k(=Iq>yKS}$sGs}^>QC~Q z_%r-s;`{8(G#jQlJ@dZjoH>`7?fWwn3YHh!^ z-p!ip4fP*X9Mxl!MD?agqefQG@_o3NnksQXG*wH$ipnS zhm&?1H{YjW(miOWEn5?J6WZ};7I5YKuEJOCBzluHO(PO(dG0UgKSt*8Q`Y0T(*u)s zGZ(|8OPU#vWHT`>Xw{bbv#2|NK(aUUN!au63!nDgk*|GOyhFP@$9&+>o?||6%*1o- z;dmcaS=i%;-OqnTn6)D>IL<8P*!qC+nK;Gq`B=`zac(gVOx&Kt=Yu;PM~%feFmXR5 zJ`T>u(Fb*MR#i1~=gSi6^ms{o7TAA>b_Rp_H_6?zu=9O_&p6CogGU_Zj={_h|GUy< z$x8_{+mL4Y9z3Q87Cm^b*aIAWaVGaq556ZbJhxxAI$TKEgk#H_~z~d6uobZG+ z=TaAWxHmroYzTSIOVby2@_@NlIDhU1?a71xw6pp6IcEbC59Z$SXFl`N^h@2uFGyp9 z#~;ic!;#O=HVD4I!2h~BOnBf%(^Lr;BX1C-xsUElNIC}DaD~_YiJx!PST$K=yKlX~` fr_RN8O+tQr=z)8=A>mE(?w+elFn<3uy(g0YL9(8# diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp index 32a4fa76..4aa33de5 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Batching/SHBatch.cpp @@ -726,16 +726,34 @@ namespace SHADE cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::BONE_MATRIX_FIRST_INDEX, transformDataBuffer[frameIndex], 0); } - auto const& descMappings = SHGraphicsPredefinedData::GetMappings(SHGraphicsPredefinedData::SystemType::BATCHING); - if (instanceDataDescSet[frameIndex]) + if (IsAnimated()) { - cmdBuffer->BindDescriptorSet - ( - instanceDataDescSet[frameIndex], - SH_PIPELINE_TYPE::GRAPHICS, - descMappings.at(SHPredefinedDescriptorTypes::PER_INSTANCE_BATCH), - dynamicOffset - ); + auto const& descMappings = SHGraphicsPredefinedData::GetMappings(SHGraphicsPredefinedData::SystemType::BATCHING_ANIM); + if (instanceDataDescSet[frameIndex]) + { + cmdBuffer->BindDescriptorSet + ( + instanceDataDescSet[frameIndex], + SH_PIPELINE_TYPE::GRAPHICS, + descMappings.at(SHPredefinedDescriptorTypes::PER_INSTANCE_ANIM_BATCH), + dynamicOffset + ); + } + } + else + { + auto const& descMappings = SHGraphicsPredefinedData::GetMappings(SHGraphicsPredefinedData::SystemType::BATCHING); + if (instanceDataDescSet[frameIndex]) + { + cmdBuffer->BindDescriptorSet + ( + instanceDataDescSet[frameIndex], + SH_PIPELINE_TYPE::GRAPHICS, + descMappings.at(SHPredefinedDescriptorTypes::PER_INSTANCE_BATCH), + dynamicOffset + ); + } + } cmdBuffer->DrawMultiIndirect(drawDataBuffer[frameIndex], static_cast(drawData.size())); cmdBuffer->EndLabeledSegment(); diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp index 3f312532..76d34ff7 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp @@ -37,7 +37,8 @@ namespace SHADE {SHPredefinedDescriptorTypes::STATIC_DATA, 0}, {SHPredefinedDescriptorTypes::CAMERA, 1}, {SHPredefinedDescriptorTypes::PER_INSTANCE_ANIM_BATCH, 2}, - }); + {SHPredefinedDescriptorTypes::RENDER_GRAPH_RESOURCE, 3}, + }); perSystemData[SHUtilities::ConvertEnum(SystemType::TEXT_RENDERING)].descMappings.AddMappings ({ diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp index c44c9464..b9ca9d56 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp @@ -497,7 +497,7 @@ namespace SHADE } // get target node - auto targetNode = nodes.begin() + nodeIndexing.at(nodeToAddAfter); + auto targetNode = nodes.begin() + nodeIndexing.at(nodeToAddAfter) + 1; auto node = nodes.insert(targetNode, renderGraphStorage->resourceHub->Create(nodeName, renderGraphStorage, std::move(descInitParams), std::vector>(), true)); ReindexNodes ();