AnimationSystem working
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#include "Core/ResourceManager.h"
|
||||
#include "Rendering/Model.h"
|
||||
#include "Rendering/EAnimationComplete.h"
|
||||
#include "Rendering/Skeleton.h"
|
||||
|
||||
class AnimationSystem : public PureSystem
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Entity name="GotToGoFast" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="-0.00432979874" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Core/UnitSphere.mesh</Resource>
|
||||
<Color A="1" B="1" G="39.2156868" R="392.15686"/>
|
||||
</c:Model>
|
||||
<c:RaptorCopter>
|
||||
<Axis X="1.50000012" Y="-2.20000005" Z="2.10000014"/>
|
||||
</c:RaptorCopter>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Animation>
|
||||
<Name>running</Name>
|
||||
<Time>0.9981707605223491</Time>
|
||||
<Speed>1</Speed>
|
||||
</c:Animation>
|
||||
<c:Model>
|
||||
<Resource>Models/Animtest.mesh</Resource>
|
||||
<Color A="1" B="392156.875" G="1" R="1"/>
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="0.5" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:DirectionalLight/>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Text>
|
||||
<Content>Got to Go FAST!!!!</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,60</Resource>
|
||||
<Color A="0" B="0.972549021" G="3.92156863" R="39.2156868"/>
|
||||
</c:Text>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="0.616941631" Z="0"/>
|
||||
<Scale X="0.5" Y="0.5" Z="1"/>
|
||||
<Orientation X="0" Y="4.47399998" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
@@ -64,6 +64,7 @@
|
||||
<c:Text>
|
||||
<Content>Welcome!</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,1280</Resource>
|
||||
<Color A="0" B="1" G="7.84313726" R="1"/>
|
||||
</c:Text>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="0" Z="0.700000048"/>
|
||||
@@ -79,7 +80,7 @@
|
||||
</c:RaptorCopter>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.37320328" Z="0"/>
|
||||
<Orientation X="0" Y="8903.9668" Z="0"/>
|
||||
<Orientation X="0" Y="9447.45117" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
@@ -261,7 +262,7 @@
|
||||
<Components>
|
||||
<c:Animation/>
|
||||
<c:Model>
|
||||
<Resource>Models/Arm.dae</Resource>
|
||||
<Resource>asd</Resource>
|
||||
<Color A="1" B="1" G="3.92156863" R="1"/>
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
@@ -273,14 +274,15 @@
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Animation/>
|
||||
<c:Animation>
|
||||
<Name></Name>
|
||||
</c:Animation>
|
||||
<c:Model>
|
||||
<Resource>Models/Sid_Flying.dae</Resource>
|
||||
<Resource>Models/Animtest.mesh</Resource>
|
||||
<Color A="1" B="11.7647057" G="1" R="11.7647057"/>
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="-1.42184281" Y="1.71298718" Z="-6.31712198"/>
|
||||
<Orientation X="4.66500044" Y="3.14159203" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
|
||||
@@ -7,25 +7,29 @@ void AnimationSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& a
|
||||
}
|
||||
|
||||
Model* model = ResourceManager::Load<Model>(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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<glm::mat4> frameBones = modelJob->Model->m_RawModel->m_Skeleton->GetFrameBones(
|
||||
*animation,
|
||||
0.0f
|
||||
);
|
||||
|
||||
if (modelJob->Animation != nullptr) {
|
||||
std::vector<glm::mat4> frameBones = modelJob->Skeleton->GetFrameBones( *modelJob->Animation, modelJob->AnimationTime);
|
||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<CollidableOctreeSystem>(updateOrderLevel, m_OctreeCollision);
|
||||
m_SystemPipeline->AddSystem<AnimationSystem>(updateOrderLevel);
|
||||
// Collision and TriggerSystem should update after player.
|
||||
++updateOrderLevel;
|
||||
m_SystemPipeline->AddSystem<CollisionSystem>(updateOrderLevel, m_OctreeCollision);
|
||||
|
||||
Reference in New Issue
Block a user