diff --git a/include/Engine/Rendering/AnimationSystem.h b/include/Engine/Rendering/AnimationSystem.h
index 0876bfd7..fcdcbc92 100644
--- a/include/Engine/Rendering/AnimationSystem.h
+++ b/include/Engine/Rendering/AnimationSystem.h
@@ -8,6 +8,7 @@
#include "Core/ResourceManager.h"
#include "Rendering/Model.h"
#include "Rendering/EAnimationComplete.h"
+#include "Rendering/Skeleton.h"
class AnimationSystem : public PureSystem
{
diff --git a/include/Engine/Rendering/ModelJob.h b/include/Engine/Rendering/ModelJob.h
index 01f4cca4..ccfd209c 100644
--- a/include/Engine/Rendering/ModelJob.h
+++ b/include/Engine/Rendering/ModelJob.h
@@ -13,6 +13,7 @@
#include "Camera.h"
#include "../Core/World.h"
#include "../Core/Transform.h"
+#include "Skeleton.h"
struct ModelJob : RenderJob
{
@@ -37,6 +38,14 @@ struct ModelJob : RenderJob
glm::vec3 worldpos = glm::vec3(camera->ViewMatrix() * glm::vec4(abspos, 1));
Depth = worldpos.z;
World = world;
+
+ Skeleton = Model->m_RawModel->m_Skeleton;
+
+ if (world->HasComponent(Entity, "Animation")) {
+ auto animationComponent = world->GetComponent(Entity, "Animation");
+ Animation = model->m_RawModel->m_Skeleton->GetAnimation(animationComponent["Name"]);
+ AnimationTime = (double)animationComponent["Time"];
+ }
};
unsigned int TextureID;
@@ -51,6 +60,11 @@ struct ModelJob : RenderJob
float Shininess = 0.f;
glm::vec4 Color;
const ::Model* Model = nullptr;
+ ::Skeleton* Skeleton = nullptr;
+ const ::Skeleton::Animation* Animation = nullptr;
+
+ float AnimationTime = 0.f;
+
glm::vec4 DiffuseColor;
glm::vec4 SpecularColor;
glm::vec4 IncandescenceColor;
diff --git a/resources/Schema/Entities/FastWorld.xml b/resources/Schema/Entities/FastWorld.xml
new file mode 100644
index 00000000..655a9766
--- /dev/null
+++ b/resources/Schema/Entities/FastWorld.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Models/Core/UnitSphere.mesh
+
+
+
+
+
+
+
+
+
+
+
+ running
+
+ 1
+
+
+ Models/Animtest.mesh
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Got to Go FAST!!!!
+ Fonts/DroidSans.ttf,60
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/Schema/Entities/RenderingWorld.xml b/resources/Schema/Entities/RenderingWorld.xml
index 6b2dc510..2c101dc6 100644
--- a/resources/Schema/Entities/RenderingWorld.xml
+++ b/resources/Schema/Entities/RenderingWorld.xml
@@ -64,6 +64,7 @@
Welcome!
Fonts/DroidSans.ttf,1280
+
@@ -79,7 +80,7 @@
-
+
@@ -261,7 +262,7 @@
- Models/Arm.dae
+ asd
@@ -273,14 +274,15 @@
-
+
+
+
- Models/Sid_Flying.dae
+ Models/Animtest.mesh
-
diff --git a/src/Engine/Rendering/AnimationSystem.cpp b/src/Engine/Rendering/AnimationSystem.cpp
index b65c5a33..e699866b 100644
--- a/src/Engine/Rendering/AnimationSystem.cpp
+++ b/src/Engine/Rendering/AnimationSystem.cpp
@@ -7,25 +7,29 @@ void AnimationSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& a
}
Model* model = ResourceManager::Load(entity["Model"]["Resource"]);
- //Skeleton* skeleton = model->m_Skeleton;
- //auto animation == skeleton->GetAnimation(animation["Name"]);
+ Skeleton* skeleton = model->m_RawModel->m_Skeleton;
+ const Skeleton::Animation* animation = skeleton->GetAnimation(animationComponent["Name"]);
double animationSpeed = (double)animationComponent["Speed"];
if( animationSpeed != 0.0) {
double nextTime = (double)animationComponent["Time"] + animationSpeed * dt;
- if (!animationComponent["Loop"] && glm::abs(nextTime) > animation->Duration) {
+
+ if (!(bool)animationComponent["Loop"] && glm::abs(nextTime) > animation->Duration) {
(double&)animationComponent["Time"] = glm::sign(nextTime) * animation->Duration;
(double&)animationComponent["Speed"] = 0.0;
Events::AnimationComplete e;
e.Entity = entity;
- // e.Name = animationComponent->Name;
+ e.Name = (std::string)animationComponent["Name"];
m_EventBroker->Publish(e);
} else {
- (double&)animationComponent["Time"] = nextTime;
+ if (glm::abs(nextTime) > animation->Duration) {
+ (double&)animationComponent["Time"] = glm::abs(nextTime) - animation->Duration;
+ } else {
+ (double&)animationComponent["Time"] = nextTime;
+ }
}
-
}
}
diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp
index ca2a9d77..9abf69d3 100644
--- a/src/Engine/Rendering/DrawFinalPass.cpp
+++ b/src/Engine/Rendering/DrawFinalPass.cpp
@@ -96,12 +96,9 @@ void DrawFinalPass::Draw(RenderScene& scene)
//TODO: Fixa så att modelsJobs kan spela upp olika animationer och så att den kan få in en tid istället för 1.0f - Hälsningar Johan och Andreas :)
if (modelJob->Model->m_RawModel->m_Skeleton != nullptr) {
- auto animation = modelJob->Model->m_RawModel->m_Skeleton->GetAnimation("running");
- if (animation != nullptr) {
- std::vector frameBones = modelJob->Model->m_RawModel->m_Skeleton->GetFrameBones(
- *animation,
- 0.0f
- );
+
+ if (modelJob->Animation != nullptr) {
+ std::vector frameBones = modelJob->Skeleton->GetFrameBones( *modelJob->Animation, modelJob->AnimationTime);
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
}
}
diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp
index 384c4a5b..a8e1a947 100644
--- a/src/Game/Game.cpp
+++ b/src/Game/Game.cpp
@@ -10,6 +10,7 @@
#include "Core/EntityFileWriter.h"
#include "Game/Systems/CapturePointSystem.h"
#include "Game/Systems/WeaponSystem.h"
+#include "../Engine/Rendering/AnimationSystem.h"
Game::Game(int argc, char* argv[])
{
@@ -86,6 +87,7 @@ Game::Game(int argc, char* argv[])
// Populate Octree with collidables
++updateOrderLevel;
m_SystemPipeline->AddSystem(updateOrderLevel, m_OctreeCollision);
+ m_SystemPipeline->AddSystem(updateOrderLevel);
// Collision and TriggerSystem should update after player.
++updateOrderLevel;
m_SystemPipeline->AddSystem(updateOrderLevel, m_OctreeCollision);