Skip to content

Commit

Permalink
Merge pull request #1 from deni2312/feature/animation
Browse files Browse the repository at this point in the history
Feature/animation
  • Loading branch information
deni2312 authored May 3, 2024
2 parents 5025316 + f130d87 commit 8642289
Show file tree
Hide file tree
Showing 53 changed files with 21,167 additions and 915 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,7 @@ FodyWeavers.xsd
*.sln.iml

out/
vcpkg/
vcpkg_installed/
CMakeSettings.json
Models/bread
Expand Down
5 changes: 4 additions & 1 deletion Engine/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
cmake_minimum_required(VERSION 3.8.0)

project(PrismaEngineDll VERSION 0.1.0)

include("..\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake")

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(SOURCES "src/engine.cpp" ../GUI/src/MeshInfo.cpp ../GUI/include/MeshInfo.h src/Containers/VAO.cpp include/Containers/VAO.h src/Containers/VBO.cpp include/Containers/VBO.h src/Containers/EBO.cpp include/Containers/EBO.h ../GUI/src/ImGuiTabs.cpp ../GUI/include/ImGuiTabs.h src/Pipelines/PipelineSSR.cpp include/Pipelines/PipelineSSR.h src/Components/Component.cpp include/Components/Component.h src/Components/PhysicsMeshComponent.cpp include/Components/PhysicsMeshComponent.h src/Handlers/ComponentsHandler.cpp include/Handlers/ComponentsHandler.h ../GUI/src/FolderView.cpp ../GUI/include/FolderView.h)

add_library(PrismaEngineDll STATIC ${SOURCES} "include/SceneObjects/Node.h" "src/SceneObjects/Node.cpp" "include/Helpers/Shader.h" "include/Helpers/stb_image.h" "include/SceneData/SceneLoader.h" "src/SceneData/SceneLoader.cpp" "include/Containers/Texture.h" "src/Containers/Texture.cpp" "include/SceneObjects/Camera.h" "src/SceneObjects/Camera.cpp" "include/SceneObjects/Mesh.h" "src/SceneObjects/Mesh.cpp" "include/Pipelines/PipelineForward.h" "src/Pipelines/PipelineForward.cpp" "include/Helpers/Settings.h" "include/Components/MaterialComponent.h" "src/Components/MaterialComponent.cpp" "include/SceneObjects/Light.h" "../GUI/include/ImGuiDebug.h" "../GUI/src/ImguiDebug.cpp" "../GUI/include/ImGuiCamera.h" "../GUI/src/ImguiCamera.cpp" "include/Containers/Ubo.h" "include/GlobalData/Defines.h" "include/Handlers/LightHandler.h" "src/Handlers/LightHandler.cpp" "include/Helpers/MultithreadLoad.h" "src/Helpers/MultithreadLoad.cpp" "include/Helpers/NodeHelper.h" "src/Helpers/NodeHelper.cpp" "include/SceneData/SceneData.h" "include/Helpers/ScenePrinter.h" "src/Helpers/ScenePrinter.cpp" "include/Containers/SSBO.h" "include/Handlers/MeshHandler.h" "src/Handlers/MeshHandler.cpp" "include/GlobalData/PrismaFunc.h" "src/GlobalData/PrismaFunc.cpp" "include/SceneData/MeshIndirect.h" "src/SceneData/MeshIndirect.cpp" "include/Containers/FBO.h" "src/Containers/FBO.cpp" "include/Pipelines/PipelineFullScreen.h" "src/Pipelines/PipelineFullScreen.cpp" "include/Pipelines/PipelineDeferred.h" "src/Pipelines/PipelineDeferred.cpp" "include/GlobalData/GlobalData.h" "include/GlobalData/Keys.h" "src/Containers/SSBO.cpp" "src/Containers/UBO.cpp" "include/Pipelines/PipelineHandler.h" "src/Pipelines/PipelineHandler.cpp" "include/Helpers/SettingsLoader.h" "src/Helpers/SettingsLoader.cpp" "include/Pipelines/PipelineSkybox.h" "src/Pipelines/PipelineSkybox.cpp" "src/GlobalData/GlobalData.cpp" "include/Pipelines/PipelineDIffuseIrradiance.h" "src/Pipelines/PipelineDiffuseIrradiance.cpp" "include/Pipelines/PipelinePrefilter.h" "src/Pipelines/PipelinePrefilter.cpp" "include/Pipelines/PipelineLUT.h" "src/Pipelines/PipelineLUT.cpp" "include/Pipelines/PipelineOmniShadow.h" "src/Pipelines/PipelineOmniShadow.cpp" "include/Helpers/IBLBuilder.h" "src/Helpers/IBLBuilder.cpp" "include/Pipelines/GenericShadow.h" "include/Physics/Physics.h" "src/Physics/Physics.cpp" "include/Physics/Line.h" "src/Physics/Line.cpp" "include/Physics/DrawDebugger.h" "src/Physics/DrawDebugger.cpp" "include/Helpers/GarbageCollector.h" "src/Helpers/GarbageCollector.cpp" ../GUI/src/ImGuiSelector.cpp ../GUI/include/ImGuiSelector.h include/Helpers/PrismaMath.h "include/Postprocess/Postprocess.h" "src/Postprocess/Postprocess.cpp" "include/Postprocess/PostprocessEffect.h" "src/Postprocess/PostprocessEffect.cpp" "include/Pipelines/PipelineCSM.h" "src/Pipelines/PipelineCSM.cpp" "include/Helpers/ClusterCalculation.h" "src/Helpers/ClusterCalculation.cpp" "include/Helpers/Timer.h")
add_library(PrismaEngineDll STATIC ${SOURCES} "include/SceneObjects/Node.h" "src/SceneObjects/Node.cpp" "include/Helpers/Shader.h" "include/Helpers/stb_image.h" "include/SceneData/SceneLoader.h" "src/SceneData/SceneLoader.cpp" "include/Containers/Texture.h" "src/Containers/Texture.cpp" "include/SceneObjects/Camera.h" "src/SceneObjects/Camera.cpp" "include/SceneObjects/Mesh.h" "src/SceneObjects/Mesh.cpp" "include/Pipelines/PipelineForward.h" "src/Pipelines/PipelineForward.cpp" "include/Helpers/Settings.h" "include/Components/MaterialComponent.h" "src/Components/MaterialComponent.cpp" "include/SceneObjects/Light.h" "../GUI/include/ImGuiDebug.h" "../GUI/src/ImguiDebug.cpp" "../GUI/include/ImGuiCamera.h" "../GUI/src/ImguiCamera.cpp" "include/Containers/Ubo.h" "include/GlobalData/Defines.h" "include/Handlers/LightHandler.h" "src/Handlers/LightHandler.cpp" "include/Helpers/MultithreadLoad.h" "src/Helpers/MultithreadLoad.cpp" "include/Helpers/NodeHelper.h" "src/Helpers/NodeHelper.cpp" "include/SceneData/SceneData.h" "include/Helpers/ScenePrinter.h" "src/Helpers/ScenePrinter.cpp" "include/Containers/SSBO.h" "include/Handlers/MeshHandler.h" "src/Handlers/MeshHandler.cpp" "include/GlobalData/PrismaFunc.h" "src/GlobalData/PrismaFunc.cpp" "include/SceneData/MeshIndirect.h" "src/SceneData/MeshIndirect.cpp" "include/Containers/FBO.h" "src/Containers/FBO.cpp" "include/Pipelines/PipelineFullScreen.h" "src/Pipelines/PipelineFullScreen.cpp" "include/Pipelines/PipelineDeferred.h" "src/Pipelines/PipelineDeferred.cpp" "include/GlobalData/GlobalData.h" "include/GlobalData/Keys.h" "src/Containers/SSBO.cpp" "src/Containers/UBO.cpp" "include/Pipelines/PipelineHandler.h" "src/Pipelines/PipelineHandler.cpp" "include/Helpers/SettingsLoader.h" "src/Helpers/SettingsLoader.cpp" "include/Pipelines/PipelineSkybox.h" "src/Pipelines/PipelineSkybox.cpp" "src/GlobalData/GlobalData.cpp" "include/Pipelines/PipelineDIffuseIrradiance.h" "src/Pipelines/PipelineDiffuseIrradiance.cpp" "include/Pipelines/PipelinePrefilter.h" "src/Pipelines/PipelinePrefilter.cpp" "include/Pipelines/PipelineLUT.h" "src/Pipelines/PipelineLUT.cpp" "include/Pipelines/PipelineOmniShadow.h" "src/Pipelines/PipelineOmniShadow.cpp" "include/Helpers/IBLBuilder.h" "src/Helpers/IBLBuilder.cpp" "include/Pipelines/GenericShadow.h" "include/Physics/Physics.h" "src/Physics/Physics.cpp" "include/Physics/Line.h" "src/Physics/Line.cpp" "include/Physics/DrawDebugger.h" "src/Physics/DrawDebugger.cpp" "include/Helpers/GarbageCollector.h" "src/Helpers/GarbageCollector.cpp" ../GUI/src/ImGuiSelector.cpp ../GUI/include/ImGuiSelector.h include/Helpers/PrismaMath.h "include/Postprocess/Postprocess.h" "src/Postprocess/Postprocess.cpp" "include/Postprocess/PostprocessEffect.h" "src/Postprocess/PostprocessEffect.cpp" "include/Pipelines/PipelineCSM.h" "src/Pipelines/PipelineCSM.cpp" "include/Helpers/ClusterCalculation.h" "src/Helpers/ClusterCalculation.cpp" "include/Helpers/Timer.h" "include/SceneData/Animator.h" "src/SceneData/Animator.cpp" "include/SceneData/Animation.h" "src/SceneData/Animation.cpp" "include/SceneObjects/AnimatedMesh.h" "src/SceneObjects/AnimatedMesh.cpp" "include/SceneData/Bone.h" "src/SceneData/Bone.cpp" "include/Handlers/AnimationHandler.h" "src/Handlers/AnimationHandler.cpp")

find_package(nlohmann_json CONFIG REQUIRED)
find_package(imguizmo CONFIG REQUIRED)
Expand Down
80 changes: 80 additions & 0 deletions Engine/Shaders/AnimationPipeline/vertex_forward.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#version 460 core
layout(location = 0) in vec3 aPos;
layout(location = 1) in vec3 aNormal;
layout(location = 2) in vec2 aTexCoords;
layout(location = 3) in vec3 aTangent;
layout(location = 4) in vec2 aBitangent;
layout(location = 5) in ivec4 boneIds;
layout(location = 6) in vec4 weights;

const int MAX_BONES = 128;
const int MAX_BONE_INFLUENCE = 4;

out vec3 FragPos;

out vec2 TexCoords;

out vec3 Normal;
out vec4 shadowDirData[16];

flat out int drawId;

uniform mat4 lightSpaceMatrix;

layout(std140, binding = 1) uniform MeshData
{
mat4 view;
mat4 projection;
};

layout(std430, binding = 6) buffer AnimationMatrices
{
mat4 modelAnimationMatrices[];
};

struct ShadowData {
mat4 shadow;
};

layout(std430, binding = 4) buffer ShadowMatrices
{
vec4 lenMat;
ShadowData shadowMatrices[];
};

struct SSBOAnimation {
mat4 animations[MAX_BONES];
};

layout(std430, binding = 8) buffer BoneMatrices
{
SSBOAnimation boneMatrices[];
};

void main()
{
vec4 totalPosition = vec4(0.0f);
for (int i = 0; i < MAX_BONE_INFLUENCE; i++)
{
if (boneIds[i] == -1)
continue;
if (boneIds[i] >= MAX_BONES)
{
totalPosition = vec4(aPos, 1.0f);
break;
}
vec4 localPosition = boneMatrices[gl_DrawID].animations[boneIds[i]] * vec4(aPos, 1.0f);
totalPosition += localPosition * weights[i];
}

drawId = gl_DrawID;
FragPos = vec3(modelAnimationMatrices[gl_DrawID] * vec4(aPos, 1.0));
TexCoords = aTexCoords;
mat3 normalMatrix = mat3(transpose(inverse(mat3(modelAnimationMatrices[gl_DrawID]))));
Normal = normalMatrix * aNormal;
for (int i = 0; i < lenMat.r; i++) {
shadowDirData[i] = shadowMatrices[i].shadow * vec4(FragPos, 1.0);
}

gl_Position = projection * view * modelAnimationMatrices[gl_DrawID] * totalPosition;
}
14 changes: 9 additions & 5 deletions Engine/Shaders/DeferredPipeline/fragment_d.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,14 @@ layout(bindless_sampler) uniform sampler2D gPosition;
layout(bindless_sampler) uniform sampler2D gNormal;
layout(bindless_sampler) uniform sampler2D gAlbedo;

uniform float zNear;
uniform float zFar;
uniform uvec3 gridSize;
uniform uvec2 screenDimensions;
layout(std140, binding = 2) uniform ClusterData
{
uvec4 gridSize;
uvec4 screenDimensions;
float zNear;
float zFar;
float padding[2];
};


struct Cluster
Expand Down Expand Up @@ -253,7 +257,7 @@ void main()

// Locating which cluster this fragment is part of
uint zTile = uint((log(abs(vec3(view * vec4(FragPos, 1.0)).z) / zNear) * gridSize.z) / log(zFar / zNear));
vec2 tileSize = screenDimensions / gridSize.xy;
vec2 tileSize = screenDimensions.xy / gridSize.xy;
uvec3 tile = uvec3(gl_FragCoord.xy / tileSize, zTile);
uint tileIndex =
tile.x + (tile.y * gridSize.x) + (tile.z * gridSize.x * gridSize.y);
Expand Down
16 changes: 8 additions & 8 deletions Engine/Shaders/ForwardPipeline/fragment.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,6 @@ uniform vec3 viewPos;
in vec3 Normal;
flat in int drawId;
in vec4 shadowDirData[16];
uniform float zNear;
uniform float zFar;
uniform uvec3 gridSize;
uniform uvec2 screenDimensions;


struct Cluster
Expand All @@ -36,10 +32,14 @@ struct DirectionalData
vec2 padding;
};

layout(std140, binding = 2) uniform LightSpaceMatrices
layout(std140, binding = 2) uniform ClusterData
{
mat4 lightSpaceMatrices[16];
};
uvec4 gridSize;
uvec4 screenDimensions;
float zNear;
float zFar;
float padding[2];
};

layout(std140, binding = 1) uniform MeshData
{
Expand Down Expand Up @@ -284,7 +284,7 @@ void main()

// Locating which cluster this fragment is part of
uint zTile = uint((log(abs(vec3(view*vec4(FragPos,1.0)).z) / zNear) * gridSize.z) / log(zFar / zNear));
vec2 tileSize = screenDimensions / gridSize.xy;
vec2 tileSize = screenDimensions.xy / gridSize.xy;
uvec3 tile = uvec3(gl_FragCoord.xy / tileSize, zTile);
uint tileIndex =
tile.x + (tile.y * gridSize.x) + (tile.z * gridSize.x * gridSize.y);
Expand Down
2 changes: 0 additions & 2 deletions Engine/Shaders/ForwardPipeline/vertex.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ out vec4 shadowDirData[16];

flat out int drawId;

uniform mat4 lightSpaceMatrix;

layout(std140, binding = 1) uniform MeshData
{
mat4 view;
Expand Down
2 changes: 1 addition & 1 deletion Engine/include/Containers/VAO.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace Prisma {

void bind();

void addAttribPointer(unsigned int id, unsigned int stride, unsigned int size, void *offset);
void addAttribPointer(unsigned int id, unsigned int stride, unsigned int size, void *offset,unsigned int type=GL_FLOAT);

static void resetVao();

Expand Down
3 changes: 3 additions & 0 deletions Engine/include/GlobalData/Defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
const int MAX_DIR_LIGHTS = 1024;
const int MAX_OMNI_LIGHTS = 1024;
const int MAX_CLUSTER_SIZE = 100;
const int MAX_BONE_INFLUENCE = 4;
const int MAX_BONES = 128;
const int MAX_ANIMATION_MESHES = 1024;
const std::string DIR_DEFAULT_BLACK = "../../../Resources/res/black.png";
const std::string DIR_DEFAULT_NORMAL = "../../../Resources/res/normal.jpg";
const std::string DIR_DEFAULT_SETTINGS = "../../../configuration/settings.json";
Expand Down
28 changes: 28 additions & 0 deletions Engine/include/Handlers/AnimationHandler.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#pragma once
#include <memory>
#include "glm/glm.hpp"
#include "../Containers/SSBO.h"
#include "../GlobalData/Defines.h"
#include <vector>

namespace Prisma {
class AnimationHandler {
public:
AnimationHandler(const AnimationHandler&) = delete;
AnimationHandler& operator=(const AnimationHandler&) = delete;

static AnimationHandler& getInstance();

void updateAnimations();

AnimationHandler();

private:
std::shared_ptr<SSBO> m_ssboAnimation;
struct SSBOAnimation {
glm::mat4 animations[MAX_BONES];
};
void copyMatrices(SSBOAnimation& animation, std::vector<glm::mat4>& animationsData);
static std::shared_ptr<AnimationHandler> instance;
};
}
14 changes: 14 additions & 0 deletions Engine/include/Handlers/MeshHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <memory>
#include "glm/glm.hpp"
#include "../Containers/Ubo.h"
#include "../Helpers/Settings.h"

namespace Prisma {
class MeshHandler {
Expand All @@ -11,6 +12,15 @@ namespace Prisma {
glm::mat4 view;
glm::mat4 projection;
};

struct alignas(16) UBOCluster {
glm::uvec4 gridSize;
glm::uvec4 screenDimensions;
float zNear;
float zFar;
float padding[2];
};

static const unsigned int VIEW_OFFSET = 0;
static const unsigned int PROJECTION_OFFSET = sizeof(glm::mat4);

Expand All @@ -19,6 +29,7 @@ namespace Prisma {
MeshHandler(const MeshHandler&) = delete;
MeshHandler& operator=(const MeshHandler&) = delete;
void updateCamera();
void updateCluster();

static MeshHandler& getInstance();

Expand All @@ -27,6 +38,9 @@ namespace Prisma {
private:
std::shared_ptr<UBOData> m_uboData;
std::shared_ptr<Ubo> m_ubo;
std::shared_ptr<Ubo> m_uboCluster;
UBOCluster m_uboClusterData;
Prisma::Settings m_settings;
static std::shared_ptr<MeshHandler> instance;
};
}
24 changes: 24 additions & 0 deletions Engine/include/Helpers/PrismaMath.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
#include "glm/glm.hpp"
#include "glm/gtx/quaternion.hpp"
#include "glm/gtc/matrix_transform.hpp"
#include <assimp/matrix4x4.h>
#include <assimp/quaternion.h>

namespace Prisma{

Expand Down Expand Up @@ -41,6 +43,28 @@ namespace Prisma{
return q;
}

static glm::mat4 getTransform(aiMatrix4x4 matrix) {
glm::mat4 transform;
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 4; k++) {
transform[j][k] = matrix[j][k];
}
}
transform = glm::transpose(transform);
return transform;
}

static glm::vec3 getVec(const aiVector3D& vec)
{
return glm::vec3(vec.x, vec.y, vec.z);
}

static glm::quat getQuat(const aiQuaternion& pOrientation)
{
return glm::quat(pOrientation.w, pOrientation.x, pOrientation.y, pOrientation.z);
}


static HitInfo rayAABBIntersect(const glm::vec3& rayStart, const glm::vec3& rayEnd, const glm::vec3& bbMin, const glm::vec3& bbMax) {
glm::vec3 rayDir = glm::normalize(rayEnd - rayStart);

Expand Down
11 changes: 11 additions & 0 deletions Engine/include/Pipelines/PipelineForward.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,20 @@ namespace Prisma {
unsigned int m_gridSizePos;
unsigned int m_screenDimensionsPos;

unsigned int m_irradianceAnimatePos;
unsigned int m_prefilterAnimatePos;
unsigned int m_lutAnimatePos;
unsigned int m_viewAnimatePos;

unsigned int m_nearAnimatePos;
unsigned int m_farAnimatePos;
unsigned int m_gridSizeAnimatePos;
unsigned int m_screenDimensionsAnimatePos;

Prisma::Settings m_settings;

std::shared_ptr<Shader> m_shader;
std::shared_ptr<Shader> m_shaderAnimate;
glm::mat4 m_projection;
std::shared_ptr<Prisma::FBO> m_fbo;
std::shared_ptr<Prisma::FBO> m_output;
Expand Down
54 changes: 54 additions & 0 deletions Engine/include/SceneData/Animation.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#pragma once
#include "glm/glm.hpp"
#include <iostream>
#include <vector>
#include <assimp/Importer.hpp>
#include <assimp/postprocess.h>
#include "../SceneObjects/AnimatedMesh.h"
#include "../GlobalData/Defines.h"
#include "Bone.h"

namespace Prisma {
class AnimatedMesh;
}

namespace Prisma {

struct BoneInfo;

struct AssimpNodeData
{
glm::mat4 transformation;
std::string name;
int childrenCount;
std::vector<AssimpNodeData> children;
};

class Animation {
public:
Animation() = default;

Animation(const std::string& animationPath, std::shared_ptr<Prisma::AnimatedMesh> model);

~Animation();

Bone* FindBone(const std::string& name);


float GetTicksPerSecond() { return m_TicksPerSecond; }
float GetDuration() { return m_Duration; }
const AssimpNodeData& GetRootNode() { return m_RootNode; }
const std::map<std::string, Prisma::BoneInfo>& GetBoneIDMap();

private:
void ReadMissingBones(const aiAnimation* animation, std::shared_ptr<Prisma::AnimatedMesh> model);
glm::mat4 m_inverseTransform;
void ReadHierarchyData(AssimpNodeData& dest, const aiNode* src);
float m_Duration;
int m_TicksPerSecond;
std::vector<Bone> m_Bones;
AssimpNodeData m_RootNode;
std::map<std::string, Prisma::BoneInfo> m_BoneInfoMap;
};

}
Loading

0 comments on commit 8642289

Please sign in to comment.