Merge remote-tracking branch 'origin/master' into BoxModelCollision
This commit is contained in:
+1
-1
Submodule assets updated: 2bf82ffb6e...3af64d8b1f
@@ -23,7 +23,7 @@ struct EntityWrapper
|
|||||||
|
|
||||||
static const EntityWrapper Invalid;
|
static const EntityWrapper Invalid;
|
||||||
|
|
||||||
const std::string Name();
|
const std::string Name() const;
|
||||||
bool HasComponent(const std::string& componentType);
|
bool HasComponent(const std::string& componentType);
|
||||||
void AttachComponent(const char* componentName);
|
void AttachComponent(const char* componentName);
|
||||||
EntityWrapper Parent();
|
EntityWrapper Parent();
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include "../Game/Events/EDashAbility.h"
|
#include "../Game/Events/EDashAbility.h"
|
||||||
#include "InputHandler.h"
|
#include "InputHandler.h"
|
||||||
#include "Rendering/EAutoAnimationBlend.h"
|
#include "Rendering/EAutoAnimationBlend.h"
|
||||||
|
#include "Rendering/ESetBlendWeight.h"
|
||||||
|
|
||||||
template <typename EventContext>
|
template <typename EventContext>
|
||||||
class FirstPersonInputController : public InputController<EventContext>
|
class FirstPersonInputController : public InputController<EventContext>
|
||||||
@@ -47,7 +48,6 @@ protected:
|
|||||||
bool m_CrouchingLastFrame = false;
|
bool m_CrouchingLastFrame = false;
|
||||||
//assault dash membervariables - needed to calculate the doubletap- and dashlogic
|
//assault dash membervariables - needed to calculate the doubletap- and dashlogic
|
||||||
double m_AssaultDashDoubleTapDeltaTime = 0.0;
|
double m_AssaultDashDoubleTapDeltaTime = 0.0;
|
||||||
double m_DashEffectResetTimer = 0.0;
|
|
||||||
//i will let m_AssaultDashDoubleTapSensitivityTimer stay hardcoded, its not really a gamevariable (more an inputvariable),
|
//i will let m_AssaultDashDoubleTapSensitivityTimer stay hardcoded, its not really a gamevariable (more an inputvariable),
|
||||||
//and its very unlikely that someone wants to change that value
|
//and its very unlikely that someone wants to change that value
|
||||||
const float m_AssaultDashDoubleTapSensitivityTimer = 0.25f;
|
const float m_AssaultDashDoubleTapSensitivityTimer = 0.25f;
|
||||||
@@ -113,7 +113,6 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
|
|||||||
if (e.Command == "Pitch") {
|
if (e.Command == "Pitch") {
|
||||||
float val = glm::radians(e.Value);
|
float val = glm::radians(e.Value);
|
||||||
m_Rotation.x += -val;
|
m_Rotation.x += -val;
|
||||||
//m_Rotation.x = glm::clamp(m_Rotation.x, -glm::half_pi<float>(), glm::half_pi<float>());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e.Command == "Yaw") {
|
if (e.Command == "Yaw") {
|
||||||
@@ -126,22 +125,11 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
|
|||||||
float val = glm::clamp(e.Value, -1.f, 1.f);
|
float val = glm::clamp(e.Value, -1.f, 1.f);
|
||||||
m_Movement.z = -val;
|
m_Movement.z = -val;
|
||||||
|
|
||||||
|
//Animation
|
||||||
if (m_PlayerEntity.Valid()) {
|
if (m_PlayerEntity.Valid()) {
|
||||||
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
|
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
|
||||||
if (playerModel.Valid()) {
|
if (playerModel.Valid()) {
|
||||||
if (val > 0) {
|
if (val > 0) { // Walk/Run
|
||||||
Events::AutoAnimationBlend aeb;
|
|
||||||
aeb.Duration = 0.1;
|
|
||||||
|
|
||||||
if(m_Crouching) {
|
|
||||||
aeb.NodeName = "Walk";
|
|
||||||
} else {
|
|
||||||
aeb.NodeName = "Run";
|
|
||||||
}
|
|
||||||
aeb.RootNode = playerModel;
|
|
||||||
aeb.Start = true;
|
|
||||||
m_EventBroker->Publish(aeb);
|
|
||||||
} else if (val < 0) {
|
|
||||||
Events::AutoAnimationBlend aeb;
|
Events::AutoAnimationBlend aeb;
|
||||||
aeb.Duration = 0.1;
|
aeb.Duration = 0.1;
|
||||||
if (m_Crouching) {
|
if (m_Crouching) {
|
||||||
@@ -151,10 +139,46 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
|
|||||||
}
|
}
|
||||||
aeb.RootNode = playerModel;
|
aeb.RootNode = playerModel;
|
||||||
aeb.Start = true;
|
aeb.Start = true;
|
||||||
|
aeb.SingleLevelBlend = true;
|
||||||
|
m_EventBroker->Publish(aeb);
|
||||||
|
} else if (val < 0) { // Walk/run Backwards
|
||||||
|
Events::AutoAnimationBlend aeb;
|
||||||
|
aeb.Duration = 0.1;
|
||||||
|
if (m_Crouching) {
|
||||||
|
aeb.NodeName = "Walk";
|
||||||
|
} else {
|
||||||
|
aeb.NodeName = "Run";
|
||||||
|
}
|
||||||
|
aeb.RootNode = playerModel;
|
||||||
|
aeb.Start = true;
|
||||||
|
aeb.SingleLevelBlend = true;
|
||||||
aeb.Reverse = true;
|
aeb.Reverse = true;
|
||||||
m_EventBroker->Publish(aeb);
|
m_EventBroker->Publish(aeb);
|
||||||
} else {
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EntityWrapper firstPersonModel = m_PlayerEntity.FirstChildByName("Hands");
|
||||||
|
if (firstPersonModel.Valid()) {
|
||||||
|
if (val > 0) { // Walk/Run
|
||||||
|
if (!m_Crouching) {
|
||||||
|
Events::AutoAnimationBlend aeb;
|
||||||
|
aeb.Duration = 0.1;
|
||||||
|
aeb.NodeName = "Run";
|
||||||
|
aeb.RootNode = firstPersonModel;
|
||||||
|
aeb.Start = true;
|
||||||
|
m_EventBroker->Publish(aeb);
|
||||||
|
}
|
||||||
|
} else if (val < 0) { // Walk/run Backwards
|
||||||
|
if (!m_Crouching) {
|
||||||
|
Events::AutoAnimationBlend aeb;
|
||||||
|
aeb.Duration = 0.1;
|
||||||
|
aeb.NodeName = "Run";
|
||||||
|
aeb.RootNode = firstPersonModel;
|
||||||
|
aeb.Start = true;
|
||||||
|
aeb.Reverse = true;
|
||||||
|
m_EventBroker->Publish(aeb);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -163,49 +187,92 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
|
|||||||
float val = glm::clamp(e.Value, -1.f, 1.f);
|
float val = glm::clamp(e.Value, -1.f, 1.f);
|
||||||
m_Movement.x = val;
|
m_Movement.x = val;
|
||||||
|
|
||||||
|
|
||||||
|
//Animation
|
||||||
if (m_PlayerEntity.Valid()) {
|
if (m_PlayerEntity.Valid()) {
|
||||||
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
|
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
|
||||||
|
if (playerModel.Valid()) { //Right Strafe
|
||||||
if (playerModel.Valid()) {
|
|
||||||
if (val > 0) {
|
if (val > 0) {
|
||||||
Events::AutoAnimationBlend aeb;
|
Events::AutoAnimationBlend aeb;
|
||||||
aeb.Duration = 0.1;
|
aeb.Duration = 0.1;
|
||||||
aeb.NodeName = "Right";
|
aeb.NodeName = "Right";
|
||||||
aeb.RootNode = playerModel;
|
aeb.RootNode = playerModel;
|
||||||
|
aeb.SingleLevelBlend = true;
|
||||||
aeb.Start = true;
|
aeb.Start = true;
|
||||||
m_EventBroker->Publish(aeb);
|
m_EventBroker->Publish(aeb);
|
||||||
} else if (val < 0) {
|
} else if (val < 0) { //LeftStrafe
|
||||||
Events::AutoAnimationBlend aeb;
|
Events::AutoAnimationBlend aeb;
|
||||||
aeb.Duration = 0.1;
|
aeb.Duration = 0.1;
|
||||||
aeb.NodeName = "Left";
|
aeb.NodeName = "Left";
|
||||||
aeb.RootNode = playerModel;
|
aeb.RootNode = playerModel;
|
||||||
|
aeb.SingleLevelBlend = true;
|
||||||
aeb.Start = true;
|
aeb.Start = true;
|
||||||
m_EventBroker->Publish(aeb);
|
m_EventBroker->Publish(aeb);
|
||||||
} else {
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
if (glm::length2(m_Movement) > 0) {
|
|
||||||
m_Movement = glm::normalize(m_Movement);
|
|
||||||
} else {
|
|
||||||
if (m_PlayerEntity.Valid()) {
|
|
||||||
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
|
|
||||||
|
|
||||||
if (playerModel.Valid()) {
|
|
||||||
Events::AutoAnimationBlend aeb;
|
|
||||||
aeb.Duration = 0.1;
|
|
||||||
aeb.NodeName = "Idle";
|
|
||||||
aeb.RootNode = playerModel;
|
|
||||||
m_EventBroker->Publish(aeb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Animation
|
||||||
|
if (glm::length2(m_Movement) < 0.25f) {
|
||||||
|
//Blend to Idle
|
||||||
|
if (m_PlayerEntity.Valid()) {
|
||||||
|
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
|
||||||
|
if (playerModel.Valid()) {
|
||||||
|
Events::AutoAnimationBlend aeb;
|
||||||
|
aeb.Duration = 0.1;
|
||||||
|
aeb.NodeName = "Idle";
|
||||||
|
aeb.RootNode = playerModel;
|
||||||
|
aeb.Start = true;
|
||||||
|
m_EventBroker->Publish(aeb);
|
||||||
|
}
|
||||||
|
EntityWrapper firstPersonModel = m_PlayerEntity.FirstChildByName("Hands");
|
||||||
|
if (firstPersonModel.Valid()) {
|
||||||
|
Events::AutoAnimationBlend aeb;
|
||||||
|
aeb.Duration = 0.1;
|
||||||
|
aeb.NodeName = "Idle";
|
||||||
|
aeb.RootNode = firstPersonModel;
|
||||||
|
aeb.Start = true;
|
||||||
|
m_EventBroker->Publish(aeb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//Blend to movement
|
||||||
|
if (m_PlayerEntity.Valid()) {
|
||||||
|
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
|
||||||
|
if (playerModel.Valid()) {
|
||||||
|
Events::AutoAnimationBlend aeb;
|
||||||
|
aeb.Duration = 0.1;
|
||||||
|
aeb.NodeName = "DirectionBlend";
|
||||||
|
aeb.RootNode = playerModel;
|
||||||
|
m_EventBroker->Publish(aeb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (glm::length2(m_Movement) > 0) {
|
||||||
|
m_Movement = glm::normalize(m_Movement);
|
||||||
|
|
||||||
|
//Animation
|
||||||
|
// movement direction blend
|
||||||
|
if (m_PlayerEntity.Valid()) {
|
||||||
|
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
|
||||||
|
if (playerModel.Valid()) {
|
||||||
|
glm::vec2 direction = glm::normalize(glm::vec2(m_Movement.x, m_Movement.z));
|
||||||
|
double weight = glm::abs(glm::dot(glm::vec2(1, 0), direction));
|
||||||
|
Events::SetBlendWeight sbw;
|
||||||
|
sbw.NodeName = "DirectionBlend";
|
||||||
|
sbw.Weight = weight;
|
||||||
|
sbw.RootNode = playerModel;
|
||||||
|
m_EventBroker->Publish(sbw);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (e.Command == "Forward" || e.Command == "Right") {
|
if (e.Command == "Forward" || e.Command == "Right") {
|
||||||
if (e.Value != 0) {
|
if (e.Value != 0) {
|
||||||
m_CurrentDirectionVector = e.Command == "Right" ? (e.Value > 0 ? "Right" : "Left") : (e.Value > 0 ? "Forward" : "Backward");
|
m_CurrentDirectionVector = e.Command == "Right" ? (e.Value > 0 ? "Right" : "Left") : (e.Value > 0 ? "Forward" : "Backward");
|
||||||
@@ -238,6 +305,8 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
|
|||||||
if (e.Command == "Crouch") {
|
if (e.Command == "Crouch") {
|
||||||
m_Crouching = e.Value > 0;
|
m_Crouching = e.Value > 0;
|
||||||
|
|
||||||
|
|
||||||
|
//Animation
|
||||||
if (m_PlayerEntity.Valid()) {
|
if (m_PlayerEntity.Valid()) {
|
||||||
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
|
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
|
||||||
if (playerModel.Valid()) {
|
if (playerModel.Valid()) {
|
||||||
@@ -291,17 +360,10 @@ bool FirstPersonInputController<EventContext>::OnLockMouse(const Events::LockMou
|
|||||||
template <typename EventContext>
|
template <typename EventContext>
|
||||||
void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, double& assaultDashCoolDownTimer, EntityID playerID) {
|
void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, double& assaultDashCoolDownTimer, EntityID playerID) {
|
||||||
m_AssaultDashDoubleTapDeltaTime += dt;
|
m_AssaultDashDoubleTapDeltaTime += dt;
|
||||||
m_DashEffectResetTimer += dt;
|
|
||||||
assaultDashCoolDownTimer -= dt;
|
assaultDashCoolDownTimer -= dt;
|
||||||
//cooldown = assaultDashCoolDownMaxTimer sec, pretend the dash lasts 0.25 sec (for friction to do its work)
|
//cooldown = assaultDashCoolDownMaxTimer sec, pretend the dash lasts 0.25 sec (for friction to do its work)
|
||||||
if (assaultDashCoolDownTimer > (assaultDashCoolDownMaxTimer - 0.25f)) {
|
if (assaultDashCoolDownTimer > (assaultDashCoolDownMaxTimer - 0.25f)) {
|
||||||
m_PlayerIsDashing = true;
|
m_PlayerIsDashing = true;
|
||||||
if (m_DashEffectResetTimer > 0.05) {
|
|
||||||
Events::DashAbility e;
|
|
||||||
e.Player = playerID;
|
|
||||||
m_EventBroker->Publish(e);
|
|
||||||
m_DashEffectResetTimer = 0.0;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
m_PlayerIsDashing = false;
|
m_PlayerIsDashing = false;
|
||||||
}
|
}
|
||||||
@@ -313,6 +375,7 @@ void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool
|
|||||||
assaultDashCoolDownTimer = assaultDashCoolDownMaxTimer;
|
assaultDashCoolDownTimer = assaultDashCoolDownMaxTimer;
|
||||||
m_AssaultDashDoubleTapped = true;
|
m_AssaultDashDoubleTapped = true;
|
||||||
m_AssaultDashDoubleTapDeltaTime = 0.f;
|
m_AssaultDashDoubleTapDeltaTime = 0.f;
|
||||||
|
|
||||||
Events::DashAbility e;
|
Events::DashAbility e;
|
||||||
e.Player = playerID;
|
e.Player = playerID;
|
||||||
m_EventBroker->Publish(e);
|
m_EventBroker->Publish(e);
|
||||||
|
|||||||
@@ -13,6 +13,8 @@
|
|||||||
#include "../Core/EntityWrapper.h"
|
#include "../Core/EntityWrapper.h"
|
||||||
#include "Rendering/AutoBlendQueue.h"
|
#include "Rendering/AutoBlendQueue.h"
|
||||||
#include "../Input/EInputCommand.h"
|
#include "../Input/EInputCommand.h"
|
||||||
|
#include "../Core/EEntityDeleted.h"
|
||||||
|
#include "Rendering/ESetBlendWeight.h"
|
||||||
#include "imgui/imgui.h"
|
#include "imgui/imgui.h"
|
||||||
|
|
||||||
class AnimationSystem : public ImpureSystem
|
class AnimationSystem : public ImpureSystem
|
||||||
@@ -28,6 +30,13 @@ private:
|
|||||||
|
|
||||||
EventRelay<AnimationSystem, Events::AutoAnimationBlend> m_EAutoAnimationBlend;
|
EventRelay<AnimationSystem, Events::AutoAnimationBlend> m_EAutoAnimationBlend;
|
||||||
bool OnAutoAnimationBlend(Events::AutoAnimationBlend& e);
|
bool OnAutoAnimationBlend(Events::AutoAnimationBlend& e);
|
||||||
|
|
||||||
|
EventRelay<AnimationSystem, Events::EntityDeleted> m_EEntityDeleted;
|
||||||
|
bool OnEntityDeleted(Events::EntityDeleted& e);
|
||||||
|
|
||||||
|
EventRelay<AnimationSystem, Events::SetBlendWeight> m_ESetBlendWeight;
|
||||||
|
bool OnSetBlendWeight(Events::SetBlendWeight& e);
|
||||||
|
|
||||||
std::unordered_map<EntityWrapper, AutoBlendQueue> m_AutoBlendQueues;
|
std::unordered_map<EntityWrapper, AutoBlendQueue> m_AutoBlendQueues;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ public:
|
|||||||
std::shared_ptr<BlendTree> GetBlendTree();
|
std::shared_ptr<BlendTree> GetBlendTree();
|
||||||
|
|
||||||
AutoBlendQueue::AutoBlendJob& GetActiveBlendJob();
|
AutoBlendQueue::AutoBlendJob& GetActiveBlendJob();
|
||||||
|
|
||||||
|
bool Empty() { return m_BlendQueue.empty(); }
|
||||||
private:
|
private:
|
||||||
std::list<AutoblendNode> m_BlendQueue;
|
std::list<AutoblendNode> m_BlendQueue;
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ public:
|
|||||||
std::vector<glm::mat4> GetFinalPose() { return m_FinalPose; }
|
std::vector<glm::mat4> GetFinalPose() { return m_FinalPose; }
|
||||||
glm::mat4 GetBoneTransform(int boneID);
|
glm::mat4 GetBoneTransform(int boneID);
|
||||||
bool IsValid() { return (m_Root == nullptr ? false : true); }
|
bool IsValid() { return (m_Root == nullptr ? false : true); }
|
||||||
|
|
||||||
void PrintTree();
|
void PrintTree();
|
||||||
BlendTree::AutoBlendInfo AutoBlendStep(AutoBlendInfo blendInfo);
|
BlendTree::AutoBlendInfo AutoBlendStep(AutoBlendInfo blendInfo);
|
||||||
|
|
||||||
@@ -84,16 +83,20 @@ public:
|
|||||||
|
|
||||||
EntityWrapper GetSubTreeRoot(std::string nodeName);
|
EntityWrapper GetSubTreeRoot(std::string nodeName);
|
||||||
|
|
||||||
|
std::vector<EntityWrapper> GetSingleLevelRoots(std::string name);
|
||||||
|
std::vector<EntityWrapper> GetEntitesByName(std::string name);
|
||||||
|
|
||||||
|
void SetWeightByName(std::string name, double weight);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Skeleton* m_Skeleton = nullptr;
|
Skeleton* m_Skeleton = nullptr;
|
||||||
Node* m_Root = nullptr;
|
Node* m_Root = nullptr;
|
||||||
|
|
||||||
std::vector<glm::mat4> m_FinalPose;
|
std::vector<glm::mat4> m_FinalPose;
|
||||||
std::map<int, glm::mat4> m_FinalBoneTransforms;
|
std::map<int, glm::mat4> m_FinalBoneTransforms;
|
||||||
|
std::vector<BlendTree::Node*> FindNodesByName(std::string name);
|
||||||
std::vector<glm::mat4> AccumulateFinalPose();
|
std::vector<glm::mat4> AccumulateFinalPose();
|
||||||
BlendTree::Node* FillTreeByName(Node* parentNode, std::string name, EntityWrapper parentEntity);
|
BlendTree::Node* FillTreeByName(Node* parentNode, std::string name, EntityWrapper parentEntity);
|
||||||
std::vector<BlendTree::Node*> FindNodesByName(std::string name);
|
|
||||||
|
|
||||||
void Blend(std::map<int, Skeleton::PoseData>& pose);
|
void Blend(std::map<int, Skeleton::PoseData>& pose);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,12 +11,13 @@
|
|||||||
#include "Util/UnorderedMapVec2.h"
|
#include "Util/UnorderedMapVec2.h"
|
||||||
#include "Util/CommonFunctions.h"
|
#include "Util/CommonFunctions.h"
|
||||||
#include "Texture.h"
|
#include "Texture.h"
|
||||||
|
#include "ShadowPass.h"
|
||||||
#include "BlurHUD.h"
|
#include "BlurHUD.h"
|
||||||
|
|
||||||
class DrawFinalPass
|
class DrawFinalPass
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass);
|
DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass);
|
||||||
~DrawFinalPass();
|
~DrawFinalPass();
|
||||||
void InitializeTextures();
|
void InitializeTextures();
|
||||||
void InitializeFrameBuffers();
|
void InitializeFrameBuffers();
|
||||||
@@ -72,6 +73,7 @@ private:
|
|||||||
const LightCullingPass* m_LightCullingPass;
|
const LightCullingPass* m_LightCullingPass;
|
||||||
const CubeMapPass* m_CubeMapPass;
|
const CubeMapPass* m_CubeMapPass;
|
||||||
const SSAOPass* m_SSAOPass;
|
const SSAOPass* m_SSAOPass;
|
||||||
|
const ShadowPass* m_ShadowPass;
|
||||||
|
|
||||||
ShaderProgram* m_ForwardPlusProgram;
|
ShaderProgram* m_ForwardPlusProgram;
|
||||||
ShaderProgram* m_ExplosionEffectProgram;
|
ShaderProgram* m_ExplosionEffectProgram;
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ struct AutoAnimationBlend : Event
|
|||||||
bool Reverse = false;
|
bool Reverse = false;
|
||||||
bool Restart = false;
|
bool Restart = false;
|
||||||
bool SingleLevelBlend = false;
|
bool SingleLevelBlend = false;
|
||||||
|
|
||||||
double Weight = -1.0;
|
double Weight = -1.0;
|
||||||
|
|
||||||
EntityWrapper AnimationEntity = EntityWrapper::Invalid;
|
EntityWrapper AnimationEntity = EntityWrapper::Invalid;
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#ifndef Events_SetBlendWeight_h__
|
||||||
|
#define Events_SetBlendWeight_h__
|
||||||
|
|
||||||
|
#include "../Core/EventBroker.h"
|
||||||
|
#include "../Core/EntityWrapper.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
//Sets the blend weight for all nodes with "NodeName"
|
||||||
|
struct SetBlendWeight : Event
|
||||||
|
{
|
||||||
|
EntityWrapper RootNode = EntityWrapper::Invalid;
|
||||||
|
std::string NodeName;
|
||||||
|
double Weight;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -15,8 +15,8 @@
|
|||||||
|
|
||||||
struct ExplosionEffectJob : ModelJob
|
struct ExplosionEffectJob : ModelJob
|
||||||
{
|
{
|
||||||
ExplosionEffectJob(ComponentWrapper explosionEffectComponent, ::Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matGroup, ComponentWrapper modelComponent, ::World* world, glm::vec4 fillColor, float fillPercentage, bool isShielded)
|
ExplosionEffectJob(ComponentWrapper explosionEffectComponent, ::Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matGroup, ComponentWrapper modelComponent, ::World* world, glm::vec4 fillColor, float fillPercentage, bool isShielded, bool shadow)
|
||||||
: ModelJob(model, camera, matrix, matGroup, modelComponent, world, fillColor, fillPercentage, isShielded)
|
: ModelJob(model, camera, matrix, matGroup, modelComponent, world, fillColor, fillPercentage, isShielded, shadow)
|
||||||
{
|
{
|
||||||
ExplosionOrigin = (glm::vec3)explosionEffectComponent["ExplosionOrigin"];
|
ExplosionOrigin = (glm::vec3)explosionEffectComponent["ExplosionOrigin"];
|
||||||
TimeSinceDeath = (double)explosionEffectComponent["TimeSinceDeath"];
|
TimeSinceDeath = (double)explosionEffectComponent["TimeSinceDeath"];
|
||||||
|
|||||||
@@ -43,6 +43,16 @@ public:
|
|||||||
~RenderBuffer();
|
~RenderBuffer();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Texture2DArray : public ResourceType<GL_TEXTURE_2D_ARRAY>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Texture2DArray(GLuint* resourceHandle, GLenum attachment)
|
||||||
|
: ResourceType(resourceHandle, attachment)
|
||||||
|
{ };
|
||||||
|
|
||||||
|
~Texture2DArray();
|
||||||
|
};
|
||||||
|
|
||||||
class FrameBuffer
|
class FrameBuffer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
struct ModelJob : RenderJob
|
struct ModelJob : RenderJob
|
||||||
{
|
{
|
||||||
ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matProp, ComponentWrapper modelComponent, World* world, glm::vec4 fillColor, float fillPercentage, bool isShielded)
|
ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matProp, ComponentWrapper modelComponent, World* world, glm::vec4 fillColor, float fillPercentage, bool isShielded, bool shadow)
|
||||||
: RenderJob()
|
: RenderJob()
|
||||||
{
|
{
|
||||||
Model = model;
|
Model = model;
|
||||||
@@ -115,6 +115,7 @@ struct ModelJob : RenderJob
|
|||||||
glm::vec3 worldpos = glm::vec3(camera->ViewMatrix() * glm::vec4(abspos, 1));
|
glm::vec3 worldpos = glm::vec3(camera->ViewMatrix() * glm::vec4(abspos, 1));
|
||||||
Depth = worldpos.z;
|
Depth = worldpos.z;
|
||||||
World = world;
|
World = world;
|
||||||
|
Shadow = shadow;
|
||||||
|
|
||||||
FillColor = fillColor;
|
FillColor = fillColor;
|
||||||
FillPercentage = fillPercentage;
|
FillPercentage = fillPercentage;
|
||||||
@@ -162,6 +163,8 @@ struct ModelJob : RenderJob
|
|||||||
glm::vec4 FillColor = glm::vec4(0);
|
glm::vec4 FillColor = glm::vec4(0);
|
||||||
float FillPercentage = 0.0;
|
float FillPercentage = 0.0;
|
||||||
bool IsShielded;
|
bool IsShielded;
|
||||||
|
bool Shadow;
|
||||||
|
|
||||||
void CalculateHash() override
|
void CalculateHash() override
|
||||||
{
|
{
|
||||||
Hash = TextureID;
|
Hash = TextureID;
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
#include "TextPass.h"
|
#include "TextPass.h"
|
||||||
#include "Util/CommonFunctions.h"
|
#include "Util/CommonFunctions.h"
|
||||||
#include "Core/PerformanceTimer.h"
|
#include "Core/PerformanceTimer.h"
|
||||||
|
#include "ShadowPass.h"
|
||||||
|
|
||||||
class Renderer : public IRenderer
|
class Renderer : public IRenderer
|
||||||
{
|
{
|
||||||
@@ -77,6 +78,7 @@ private:
|
|||||||
DrawColorCorrectionPass* m_DrawColorCorrectionPass;
|
DrawColorCorrectionPass* m_DrawColorCorrectionPass;
|
||||||
SSAOPass* m_SSAOPass;
|
SSAOPass* m_SSAOPass;
|
||||||
CubeMapPass* m_CubeMapPass;
|
CubeMapPass* m_CubeMapPass;
|
||||||
|
ShadowPass* m_ShadowPass;
|
||||||
BlurHUD* m_BlurHUDPass;
|
BlurHUD* m_BlurHUDPass;
|
||||||
|
|
||||||
//----------------------Functions----------------------//
|
//----------------------Functions----------------------//
|
||||||
|
|||||||
@@ -0,0 +1,87 @@
|
|||||||
|
#ifndef ShadowPass_h__
|
||||||
|
#define ShadowPass_h__
|
||||||
|
|
||||||
|
#include "IRenderer.h"
|
||||||
|
#include "FrameBuffer.h"
|
||||||
|
#include "ShaderProgram.h"
|
||||||
|
#include "../Core/EventBroker.h"
|
||||||
|
#include "../Core/World.h"
|
||||||
|
#include "ShadowPassState.h"
|
||||||
|
#include "imgui/imgui.h"
|
||||||
|
|
||||||
|
#define MAX_SPLITS 4
|
||||||
|
|
||||||
|
enum NearFar { NEAR = 0, FAR = 1 };
|
||||||
|
enum LRBT { LEFT = 0, RIGHT = 1, BOTTOM = 2, TOP = 3 };
|
||||||
|
|
||||||
|
struct ShadowFrustum
|
||||||
|
{
|
||||||
|
float NearClip;
|
||||||
|
float FarClip;
|
||||||
|
float FOV;
|
||||||
|
float AspectRatio;
|
||||||
|
glm::vec3 MiddlePoint;
|
||||||
|
float Radius;
|
||||||
|
std::array<float, 4> LRBT;
|
||||||
|
std::array<glm::vec3, 8> CornerPoint;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ShadowPass
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ShadowPass(IRenderer* renderer);
|
||||||
|
ShadowPass(IRenderer * renderer, int ShadowResX, int ShadowResY);
|
||||||
|
~ShadowPass();
|
||||||
|
|
||||||
|
void InitializeFrameBuffers();
|
||||||
|
void InitializeShaderPrograms();
|
||||||
|
void ClearBuffer();
|
||||||
|
void Draw(RenderScene& scene);
|
||||||
|
|
||||||
|
void DebugGUI();
|
||||||
|
|
||||||
|
GLuint DepthMap() const { return m_DepthMap; }
|
||||||
|
std::array<glm::mat4, MAX_SPLITS> LightP() const { return m_LightProjection; }
|
||||||
|
std::array<glm::mat4, MAX_SPLITS> LightV() const { return m_LightView; }
|
||||||
|
std::array<float, MAX_SPLITS> FarDistance() const { std::array<float, MAX_SPLITS> f; for (int i = 0; i < MAX_SPLITS; i++) f[i] = m_shadowFrusta[i].FarClip; return f; }
|
||||||
|
int CurrentNrOfSplits() const { return m_CurrentNrOfSplits; }
|
||||||
|
|
||||||
|
void SetSplitWeight(float split_weight) { m_SplitWeight = split_weight; };
|
||||||
|
private:
|
||||||
|
void InitializeCameras(RenderScene & scene);
|
||||||
|
void UpdateSplitDist(std::array<ShadowFrustum, MAX_SPLITS>& frusta, float near_distance, float far_distance);
|
||||||
|
void UpdateFrustumPoints(ShadowFrustum& frustum, glm::vec3 camera_position, glm::vec3 view_dir);
|
||||||
|
void UpdateFrustumPoints(ShadowFrustum& frustum, glm::mat4 p, glm::mat4 v);
|
||||||
|
|
||||||
|
void PointsToLightspace(ShadowFrustum& frustum, glm::mat4 v);
|
||||||
|
|
||||||
|
float FindRadius(ShadowFrustum& frustum);
|
||||||
|
void RadiusToLightspace(ShadowFrustum& frustum);
|
||||||
|
|
||||||
|
EventBroker* m_EventBroker;
|
||||||
|
const IRenderer* m_Renderer;
|
||||||
|
|
||||||
|
GLuint m_DepthMap;
|
||||||
|
FrameBuffer m_DepthBuffer;
|
||||||
|
ShaderProgram* m_ShadowProgram;
|
||||||
|
|
||||||
|
std::array<glm::mat4, MAX_SPLITS> m_LightProjection;
|
||||||
|
std::array<glm::mat4, MAX_SPLITS> m_LightView;
|
||||||
|
|
||||||
|
GLfloat m_NearFarPlane[2] = { -34.f, 27.f };
|
||||||
|
GLuint m_ResolutionSizeWidth = 1024 * 2;
|
||||||
|
GLuint m_ResolutionSizeHeight = 1024 * 2;
|
||||||
|
|
||||||
|
bool m_TransparentObjects = false;
|
||||||
|
bool m_TexturedShadows = false;
|
||||||
|
bool m_EnableShadows = true;
|
||||||
|
|
||||||
|
int m_CurrentNrOfSplits = 4;
|
||||||
|
float m_SplitWeight = 0.962f;
|
||||||
|
|
||||||
|
std::array<ShadowFrustum, MAX_SPLITS> m_shadowFrusta;
|
||||||
|
|
||||||
|
Texture* m_WhiteTexture = ResourceManager::Load<Texture>("Textures/Core/White.png");
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef ShadowPassState_h_
|
||||||
|
#define ShadowPassState_h_
|
||||||
|
|
||||||
|
#include "Rendering/RenderState.h"
|
||||||
|
|
||||||
|
class ShadowPassState : public RenderState
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ShadowPassState(GLuint frameBuffer);
|
||||||
|
~ShadowPassState();
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -293,10 +293,8 @@ private:
|
|||||||
firstPersonWeapon = SpawnerSystem::Spawn(firstPersonAttachment, firstPersonAttachment);
|
firstPersonWeapon = SpawnerSystem::Spawn(firstPersonAttachment, firstPersonAttachment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (IsServer) {
|
if (thirdPersonAttachment.Valid()) {
|
||||||
if (thirdPersonAttachment.Valid()) {
|
thirdPersonWeapon = SpawnerSystem::Spawn(thirdPersonAttachment, thirdPersonAttachment);
|
||||||
thirdPersonWeapon = SpawnerSystem::Spawn(thirdPersonAttachment, thirdPersonAttachment);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WeaponInfo& wi = m_ActiveWeapons[player];
|
WeaponInfo& wi = m_ActiveWeapons[player];
|
||||||
|
|||||||
@@ -8,5 +8,6 @@
|
|||||||
<NormalMap>true</NormalMap>
|
<NormalMap>true</NormalMap>
|
||||||
<SpecularMap>true</SpecularMap>
|
<SpecularMap>true</SpecularMap>
|
||||||
<GlowMap>true</GlowMap>
|
<GlowMap>true</GlowMap>
|
||||||
|
<Shadow>true</Shadow>
|
||||||
<GlowIntensity>3.0</GlowIntensity>
|
<GlowIntensity>3.0</GlowIntensity>
|
||||||
</Model>
|
</Model>
|
||||||
@@ -36,6 +36,9 @@
|
|||||||
<xs:element name="GlowIntensity" type="t:double" minOccurs="0">
|
<xs:element name="GlowIntensity" type="t:double" minOccurs="0">
|
||||||
<xs:annotation><xs:documentation>Intensity of the glow map</xs:documentation></xs:annotation>
|
<xs:annotation><xs:documentation>Intensity of the glow map</xs:documentation></xs:annotation>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
|
<xs:element name="Shadow" type="t:bool" minOccurs="0">
|
||||||
|
<xs:annotation><xs:documentation>Whether the object cast/recieve shadows or not</xs:documentation></xs:annotation>
|
||||||
|
</xs:element>
|
||||||
</xs:all>
|
</xs:all>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -2,17 +2,12 @@
|
|||||||
<Entity name="DashEffect" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
<Entity name="DashEffect" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||||
|
|
||||||
<Components>
|
<Components>
|
||||||
<c:Animation/>
|
|
||||||
<c:Lifetime>
|
<c:Lifetime>
|
||||||
<Lifetime>0.5</Lifetime>
|
<Lifetime>0.5</Lifetime>
|
||||||
</c:Lifetime>
|
</c:Lifetime>
|
||||||
<c:ExplosionEffect>
|
|
||||||
<Velocity X="0" Y="0" Z="0"/>
|
|
||||||
<TimeSinceDeath>0</TimeSinceDeath>
|
|
||||||
<ExplosionDuration>0.5</ExplosionDuration>
|
|
||||||
<EndColor A="0" B="0" G="0" R="0"/>
|
|
||||||
</c:ExplosionEffect>
|
|
||||||
<c:Model/>
|
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
</Components>
|
</Components>
|
||||||
|
|
||||||
|
<Children/>
|
||||||
|
|
||||||
</Entity>
|
</Entity>
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<Entity xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||||
|
|
||||||
|
<Components>
|
||||||
|
<c:Collidable/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="-6.44986534" Z="-6.68222857"/>
|
||||||
|
<Scale X="1.10000002" Y="1.10000002" Z="1.10000002"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Collidable/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="0.215699792" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:FloatingEffect>
|
||||||
|
<Period>12</Period>
|
||||||
|
<Time>513.93462028501312</Time>
|
||||||
|
<Axis X="0" Y="0.100000001" Z="0"/>
|
||||||
|
</c:FloatingEffect>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-0" Y="-0.0882625133" Z="-0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Collidable/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="0.121641584" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
|
||||||
|
</Entity>
|
||||||
@@ -245,6 +245,13 @@
|
|||||||
</Entity>
|
</Entity>
|
||||||
</Children>
|
</Children>
|
||||||
</Entity>
|
</Entity>
|
||||||
|
<Entity name="Ambient">
|
||||||
|
<Components>
|
||||||
|
<c:SceneLight/>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
</Children>
|
</Children>
|
||||||
|
|
||||||
</Entity>
|
</Entity>
|
||||||
|
|||||||
@@ -2,64 +2,168 @@
|
|||||||
<Entity xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
<Entity xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||||
|
|
||||||
<Components>
|
<Components>
|
||||||
<c:Transform>
|
<c:Transform/>
|
||||||
<Position X="0" Y="0" Z="-0.313012958"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
</Components>
|
||||||
|
|
||||||
<Children>
|
<Children>
|
||||||
<Entity>
|
<Entity name="RedSpawn">
|
||||||
<Components>
|
<Components>
|
||||||
<c:Camera/>
|
<c:Team>
|
||||||
<c:Listener/>
|
<Team>
|
||||||
|
<Red/>
|
||||||
|
</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:PlayerSpawn/>
|
||||||
|
<c:Spawner>
|
||||||
|
<EntityFile>Schema/Entities/PlayerAssaultFallbackRed.xml</EntityFile>
|
||||||
|
</c:Spawner>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="2.56531811" Y="0.637967348" Z="0.202344239"/>
|
<Position X="0.300000012" Y="0.0270000007" Z="0"/>
|
||||||
<Orientation X="2.68780756" Y="1.36143553" Z="3.14159179"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Collidable/>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>../assets/Models/Core/Tri.obj</Resource>
|
|
||||||
<Color A="1" B="1" G="0.392156869" R="0"/>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
|
||||||
<Scale X="2" Y="2" Z="0.200000003"/>
|
|
||||||
<Orientation X="2.70100021" Y="2.37000012" Z="0.266000003"/>
|
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
</Components>
|
</Components>
|
||||||
<Children>
|
<Children>
|
||||||
<Entity>
|
<Entity>
|
||||||
<Components>
|
<Components>
|
||||||
|
<c:SpawnPoint/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/Tri.obj</Resource>
|
<Resource>Models/Characters/Assault/AssaultRed.mesh</Resource>
|
||||||
<Color A="1" B="0" G="0" R="1"/>
|
<Color A="1" B="0" G="0" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Orientation X="0" Y="3.14159274" Z="4.71238899"/>
|
<Position X="0.800000012" Y="0" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:SpawnPoint/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Characters/Assault/AssaultRed.mesh</Resource>
|
||||||
|
<Color A="1" B="0.0117647061" G="0" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-0.600000024" Y="0" Z="0"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
</Components>
|
</Components>
|
||||||
<Children/>
|
<Children/>
|
||||||
</Entity>
|
</Entity>
|
||||||
</Children>
|
</Children>
|
||||||
</Entity>
|
</Entity>
|
||||||
<Entity>
|
<Entity name="DirectionalLight">
|
||||||
<Components>
|
<Components>
|
||||||
<c:AABB/>
|
<c:SceneLight>
|
||||||
<c:Collidable/>
|
<Gamma>0.5</Gamma>
|
||||||
|
<Exposure>4</Exposure>
|
||||||
|
</c:SceneLight>
|
||||||
|
<c:DirectionalLight/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
<Resource>sModels/Widgets/Lights/DirectionalLightWidget.mesh</Resource>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Physics/>
|
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="-1.95333278" Y="0.296304941" Z="2.56487775"/>
|
<Position X="-6.00145912" Y="1.42697716" Z="3.04144025"/>
|
||||||
|
<Orientation X="5.69400024" Y="841.179565" Z="0"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
</Components>
|
</Components>
|
||||||
<Children/>
|
<Children/>
|
||||||
</Entity>
|
</Entity>
|
||||||
|
<Entity name="ObstacleCourse">
|
||||||
|
<Components>
|
||||||
|
<c:Collidable/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Test/ObstacleCourse.mesh</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="BlueSpawn">
|
||||||
|
<Components>
|
||||||
|
<c:Team>
|
||||||
|
<Team>
|
||||||
|
<Blue/>
|
||||||
|
</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:PlayerSpawn/>
|
||||||
|
<c:Spawner>
|
||||||
|
<EntityFile>Schema/Entities/Player.xml</EntityFile>
|
||||||
|
</c:Spawner>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0.300000012" Y="0.0270000007" Z="6.67400026"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:SpawnPoint/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Characters/Assault/AssaultBlue.mesh</Resource>
|
||||||
|
<Color A="1" B="1" G="0.254901975" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-0.600000024" Y="0" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:SpawnPoint/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Characters/Assault/AssaultBlue.mesh</Resource>
|
||||||
|
<Color A="1" B="1" G="0.254901975" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0.800000012" Y="0" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="Arms">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>ActivateDeactive</Pose1>
|
||||||
|
<Pose2></Pose2>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Characters/Defender/FirstPersonDefenderBlue.mesh</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="1.30585015" Z="2.01450038"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="ActivateDeactive">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>ActivateDeactiveShieldF</AnimationName>
|
||||||
|
<Time>0.68323420867830964</Time>
|
||||||
|
<Speed>1</Speed>
|
||||||
|
<Play>true</Play>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="Weapon">
|
||||||
|
<Components>
|
||||||
|
<c:BoneAttachment>
|
||||||
|
<BoneName>R_Arm_Weapon_Joint</BoneName>
|
||||||
|
</c:BoneAttachment>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Weapons/Blue/DefenderWeaponBlue.mesh</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-0.0621522591" Y="-0.169021279" Z="-0.219918266"/>
|
||||||
|
<Orientation X="-0.709758997" Y="1.22785306" Z="-0.154755235"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
</Children>
|
</Children>
|
||||||
|
|
||||||
</Entity>
|
</Entity>
|
||||||
|
|||||||
@@ -54,7 +54,10 @@
|
|||||||
</Entity>
|
</Entity>
|
||||||
<Entity name="DirectionalLight">
|
<Entity name="DirectionalLight">
|
||||||
<Components>
|
<Components>
|
||||||
<c:SceneLight/>
|
<c:SceneLight>
|
||||||
|
<Gamma>0.49999982118606567</Gamma>
|
||||||
|
<Exposure>2.5599997043609619</Exposure>
|
||||||
|
</c:SceneLight>
|
||||||
<c:DirectionalLight/>
|
<c:DirectionalLight/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>sModels/Widgets/Lights/DirectionalLightWidget.mesh</Resource>
|
<Resource>sModels/Widgets/Lights/DirectionalLightWidget.mesh</Resource>
|
||||||
@@ -120,6 +123,48 @@
|
|||||||
</Entity>
|
</Entity>
|
||||||
</Children>
|
</Children>
|
||||||
</Entity>
|
</Entity>
|
||||||
|
<Entity name="Arms">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>ActivateDeactive</Pose1>
|
||||||
|
<Pose2></Pose2>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Characters/Defender/FirstPersonDefenderBlue.mesh</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="1.30585015" Z="2.01450038"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="ActivateDeactive">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>ActivateDeactiveShieldF</AnimationName>
|
||||||
|
<Time>0.44649605185380015</Time>
|
||||||
|
<Play>true</Play>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="Weapon">
|
||||||
|
<Components>
|
||||||
|
<c:BoneAttachment>
|
||||||
|
<BoneName>R_Arm_Weapon_Joint</BoneName>
|
||||||
|
</c:BoneAttachment>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Weapons/Blue/DefenderWeaponBlue.mesh</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0.00681143999" Y="-0.204994932" Z="-0.209244296"/>
|
||||||
|
<Orientation X="-0.581807375" Y="0.562133908" Z="-0.0719003305"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
</Children>
|
</Children>
|
||||||
|
|
||||||
</Entity>
|
</Entity>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,6 @@
|
|||||||
<Entity name="PlayerAssault" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
<Entity name="PlayerAssault" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||||
|
|
||||||
<Components>
|
<Components>
|
||||||
<c:NetworkComponent/>
|
|
||||||
<c:AABB>
|
<c:AABB>
|
||||||
<Origin X="0" Y="0.772000015" Z="0"/>
|
<Origin X="0" Y="0.772000015" Z="0"/>
|
||||||
<Size X="1" Y="1.60000002" Z="1"/>
|
<Size X="1" Y="1.60000002" Z="1"/>
|
||||||
@@ -22,6 +21,7 @@
|
|||||||
</c:DefenderWeapon>
|
</c:DefenderWeapon>
|
||||||
<c:DoubleJump/>
|
<c:DoubleJump/>
|
||||||
<c:Health/>
|
<c:Health/>
|
||||||
|
<c:NetworkComponent/>
|
||||||
<c:Physics>
|
<c:Physics>
|
||||||
<Velocity X="2.30999646e-23" Y="0" Z="1.05272533e-23"/>
|
<Velocity X="2.30999646e-23" Y="0" Z="1.05272533e-23"/>
|
||||||
</c:Physics>
|
</c:Physics>
|
||||||
@@ -463,7 +463,7 @@
|
|||||||
<Color A="1" B="0.392156869" G="0.392156869" R="0.392156869"/>
|
<Color A="1" B="0.392156869" G="0.392156869" R="0.392156869"/>
|
||||||
</c:Fill>
|
</c:Fill>
|
||||||
<c:Sprite>
|
<c:Sprite>
|
||||||
<DiffuseTexture>Textures/Icons/Abilities/Superman-01.png</DiffuseTexture>
|
<DiffuseTexture>Textures\Icons\Abilities\Superman-01.png</DiffuseTexture>
|
||||||
<GlowMap></GlowMap>
|
<GlowMap></GlowMap>
|
||||||
<DepthSort>false</DepthSort>
|
<DepthSort>false</DepthSort>
|
||||||
<Color A="1" B="0.206628323" G="0.78039217" R="0.192802757"/>
|
<Color A="1" B="0.206628323" G="0.78039217" R="0.192802757"/>
|
||||||
@@ -504,25 +504,25 @@
|
|||||||
<Children>
|
<Children>
|
||||||
<Entity name="PrimaryAttachment">
|
<Entity name="PrimaryAttachment">
|
||||||
<Components>
|
<Components>
|
||||||
<c:WeaponAttachment>
|
|
||||||
<Weapon>AssaultWeapon</Weapon>
|
|
||||||
</c:WeaponAttachment>
|
|
||||||
<c:Spawner>
|
<c:Spawner>
|
||||||
<EntityFile>Schema/Entities/WeaponAssaultBlueView.xml</EntityFile>
|
<EntityFile>Schema/Entities/WeaponAssaultBlueView.xml</EntityFile>
|
||||||
</c:Spawner>
|
</c:Spawner>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
|
<c:WeaponAttachment>
|
||||||
|
<Weapon>AssaultWeapon</Weapon>
|
||||||
|
</c:WeaponAttachment>
|
||||||
</Components>
|
</Components>
|
||||||
<Children/>
|
<Children/>
|
||||||
</Entity>
|
</Entity>
|
||||||
<Entity name="SecondaryAttachment">
|
<Entity name="SecondaryAttachment">
|
||||||
<Components>
|
<Components>
|
||||||
<c:WeaponAttachment>
|
|
||||||
<Weapon>DefenderWeapon</Weapon>
|
|
||||||
</c:WeaponAttachment>
|
|
||||||
<c:Spawner>
|
<c:Spawner>
|
||||||
<EntityFile>Schema/Entities/WeaponDefenderBlueView.xml</EntityFile>
|
<EntityFile>Schema/Entities/WeaponDefenderBlueView.xml</EntityFile>
|
||||||
</c:Spawner>
|
</c:Spawner>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
|
<c:WeaponAttachment>
|
||||||
|
<Weapon>DefenderWeapon</Weapon>
|
||||||
|
</c:WeaponAttachment>
|
||||||
</Components>
|
</Components>
|
||||||
<Children/>
|
<Children/>
|
||||||
</Entity>
|
</Entity>
|
||||||
@@ -566,19 +566,19 @@
|
|||||||
<c:BoneAttachment>
|
<c:BoneAttachment>
|
||||||
<BoneName>R_Arm_Weapon_Joint</BoneName>
|
<BoneName>R_Arm_Weapon_Joint</BoneName>
|
||||||
</c:BoneAttachment>
|
</c:BoneAttachment>
|
||||||
|
<c:Spawner>
|
||||||
|
<EntityFile>Schema/Entities/WeaponAssaultBlueWorld.xml</EntityFile>
|
||||||
|
</c:Spawner>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0.17052114" Y="1.03320956" Z="-0.224843055"/>
|
||||||
|
<Orientation X="-0.035638921" Y="-0.0872893855" Z="0.133119702"/>
|
||||||
|
</c:Transform>
|
||||||
<c:WeaponAttachment>
|
<c:WeaponAttachment>
|
||||||
<Weapon>AssaultWeapon</Weapon>
|
<Weapon>AssaultWeapon</Weapon>
|
||||||
<Person>
|
<Person>
|
||||||
<ThirdPerson/>
|
<ThirdPerson/>
|
||||||
</Person>
|
</Person>
|
||||||
</c:WeaponAttachment>
|
</c:WeaponAttachment>
|
||||||
<c:Spawner>
|
|
||||||
<EntityFile>Schema/Entities/WeaponAssaultBlueWorld.xml</EntityFile>
|
|
||||||
</c:Spawner>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0.153499424" Y="1.04221034" Z="-0.231716871"/>
|
|
||||||
<Orientation X="-0.0108785164" Y="-0.0253766086" Z="0.137640417"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
</Components>
|
||||||
<Children/>
|
<Children/>
|
||||||
</Entity>
|
</Entity>
|
||||||
@@ -587,26 +587,26 @@
|
|||||||
<c:BoneAttachment>
|
<c:BoneAttachment>
|
||||||
<BoneName>R_Arm_Weapon_Joint</BoneName>
|
<BoneName>R_Arm_Weapon_Joint</BoneName>
|
||||||
</c:BoneAttachment>
|
</c:BoneAttachment>
|
||||||
|
<c:Spawner>
|
||||||
|
<EntityFile>Schema/Entities/SidearmWeaponWorld.xml</EntityFile>
|
||||||
|
</c:Spawner>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0.17052114" Y="1.03320956" Z="-0.224843055"/>
|
||||||
|
<Orientation X="-0.035638921" Y="-0.0872893855" Z="0.133119702"/>
|
||||||
|
</c:Transform>
|
||||||
<c:WeaponAttachment>
|
<c:WeaponAttachment>
|
||||||
<Weapon>SidearmWeapon</Weapon>
|
<Weapon>SidearmWeapon</Weapon>
|
||||||
<Person>
|
<Person>
|
||||||
<ThirdPerson/>
|
<ThirdPerson/>
|
||||||
</Person>
|
</Person>
|
||||||
</c:WeaponAttachment>
|
</c:WeaponAttachment>
|
||||||
<c:Spawner>
|
|
||||||
<EntityFile>Schema/Entities/SidearmWeaponWorld.xml</EntityFile>
|
|
||||||
</c:Spawner>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0.153499424" Y="1.04221034" Z="-0.231716871"/>
|
|
||||||
<Orientation X="-0.0108785164" Y="-0.0253766086" Z="0.137640417"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
</Components>
|
||||||
<Children/>
|
<Children/>
|
||||||
</Entity>
|
</Entity>
|
||||||
<Entity name="BlendTreeLower">
|
<Entity name="BlendTreeLower">
|
||||||
<Components>
|
<Components>
|
||||||
<c:Blend>
|
<c:Blend>
|
||||||
<Pose1>StandCrouchBlend</Pose1>
|
<Pose1>MovementBlend</Pose1>
|
||||||
<Pose2>JumpDashBlend</Pose2>
|
<Pose2>JumpDashBlend</Pose2>
|
||||||
<Weight>2.5146881298480398e-63</Weight>
|
<Weight>2.5146881298480398e-63</Weight>
|
||||||
<SubTreeRoot>true</SubTreeRoot>
|
<SubTreeRoot>true</SubTreeRoot>
|
||||||
@@ -628,7 +628,7 @@
|
|||||||
<Entity name="CrouchMovement">
|
<Entity name="CrouchMovement">
|
||||||
<Components>
|
<Components>
|
||||||
<c:Blend>
|
<c:Blend>
|
||||||
<Pose1>MovementBlend</Pose1>
|
<Pose1>DirectionBlend</Pose1>
|
||||||
<Pose2>Idle</Pose2>
|
<Pose2>Idle</Pose2>
|
||||||
<Weight>1</Weight>
|
<Weight>1</Weight>
|
||||||
</c:Blend>
|
</c:Blend>
|
||||||
@@ -659,7 +659,7 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>CrouchStrafeLeftF</AnimationName>
|
<AnimationName>CrouchStrafeLeftF</AnimationName>
|
||||||
<Time>0.15801023731376773</Time>
|
<Time>0.79179726223533642</Time>
|
||||||
<Play>true</Play>
|
<Play>true</Play>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
@@ -670,7 +670,7 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>CrouchStrafeRightF</AnimationName>
|
<AnimationName>CrouchStrafeRightF</AnimationName>
|
||||||
<Time>0.085331699264550309</Time>
|
<Time>0.719118724186119</Time>
|
||||||
<Play>true</Play>
|
<Play>true</Play>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
@@ -683,7 +683,7 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>CrouchWalkF</AnimationName>
|
<AnimationName>CrouchWalkF</AnimationName>
|
||||||
<Time>0.86370568444195328</Time>
|
<Time>0.49749270936352197</Time>
|
||||||
<Play>true</Play>
|
<Play>true</Play>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
@@ -696,7 +696,8 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>CrouchF</AnimationName>
|
<AnimationName>CrouchF</AnimationName>
|
||||||
<Time>0.99862473341677438</Time>
|
<Time>1.1707202063102131</Time>
|
||||||
|
<Play>true</Play>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
</Components>
|
</Components>
|
||||||
@@ -707,7 +708,7 @@
|
|||||||
<Entity name="StandMovement">
|
<Entity name="StandMovement">
|
||||||
<Components>
|
<Components>
|
||||||
<c:Blend>
|
<c:Blend>
|
||||||
<Pose1>MovementBlend</Pose1>
|
<Pose1>DirectionBlend</Pose1>
|
||||||
<Pose2>Idle</Pose2>
|
<Pose2>Idle</Pose2>
|
||||||
<Weight>1</Weight>
|
<Weight>1</Weight>
|
||||||
</c:Blend>
|
</c:Blend>
|
||||||
@@ -738,7 +739,7 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>WalkF</AnimationName>
|
<AnimationName>WalkF</AnimationName>
|
||||||
<Time>0.36886031385172657</Time>
|
<Time>0.0026473387732952602</Time>
|
||||||
<Play>true</Play>
|
<Play>true</Play>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
@@ -749,7 +750,8 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>RunF</AnimationName>
|
<AnimationName>RunF</AnimationName>
|
||||||
<Time>0.64087381787562947</Time>
|
<Time>0.60179430680919843</Time>
|
||||||
|
<Speed>2</Speed>
|
||||||
<Play>true</Play>
|
<Play>true</Play>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
@@ -772,7 +774,8 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>StrafeLeftF</AnimationName>
|
<AnimationName>StrafeLeftF</AnimationName>
|
||||||
<Time>0.55045293488526426</Time>
|
<Time>0.20450294221067544</Time>
|
||||||
|
<Speed>2</Speed>
|
||||||
<Play>true</Play>
|
<Play>true</Play>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
@@ -783,7 +786,8 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>StrafeRightF</AnimationName>
|
<AnimationName>StrafeRightF</AnimationName>
|
||||||
<Time>0.57396846476537888</Time>
|
<Time>0.28191395104664174</Time>
|
||||||
|
<Speed>2</Speed>
|
||||||
<Play>true</Play>
|
<Play>true</Play>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
@@ -798,7 +802,7 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>IdleF</AnimationName>
|
<AnimationName>IdleF</AnimationName>
|
||||||
<Time>1.0177411602680451</Time>
|
<Time>0.96819454985941356</Time>
|
||||||
<Play>true</Play>
|
<Play>true</Play>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
@@ -856,7 +860,7 @@
|
|||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>DashForwardF</AnimationName>
|
<AnimationName>DashForwardF</AnimationName>
|
||||||
<Time>1</Time>
|
<Time>1</Time>
|
||||||
<Speed>2</Speed>
|
<Speed>1.7999999523162842</Speed>
|
||||||
<Loop>false</Loop>
|
<Loop>false</Loop>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
@@ -868,7 +872,7 @@
|
|||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>DashBackwardF</AnimationName>
|
<AnimationName>DashBackwardF</AnimationName>
|
||||||
<Time>1</Time>
|
<Time>1</Time>
|
||||||
<Speed>2</Speed>
|
<Speed>1.7999999523162842</Speed>
|
||||||
<Loop>false</Loop>
|
<Loop>false</Loop>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
@@ -887,24 +891,24 @@
|
|||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
</Components>
|
</Components>
|
||||||
<Children>
|
<Children>
|
||||||
<Entity name="DashLeft">
|
<Entity name="DashRight">
|
||||||
<Components>
|
<Components>
|
||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>DashLeftF</AnimationName>
|
<AnimationName>DashRightF</AnimationName>
|
||||||
<Time>1</Time>
|
<Time>1</Time>
|
||||||
<Speed>2</Speed>
|
<Speed>1.7999999523162842</Speed>
|
||||||
<Loop>false</Loop>
|
<Loop>false</Loop>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
</Components>
|
</Components>
|
||||||
<Children/>
|
<Children/>
|
||||||
</Entity>
|
</Entity>
|
||||||
<Entity name="DashRight">
|
<Entity name="DashLeft">
|
||||||
<Components>
|
<Components>
|
||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>DashRightF</AnimationName>
|
<AnimationName>DashLeftF</AnimationName>
|
||||||
<Time>1</Time>
|
<Time>1</Time>
|
||||||
<Speed>2</Speed>
|
<Speed>1.7999999523162842</Speed>
|
||||||
<Loop>false</Loop>
|
<Loop>false</Loop>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
@@ -981,7 +985,7 @@
|
|||||||
</Entity>
|
</Entity>
|
||||||
</Children>
|
</Children>
|
||||||
</Entity>
|
</Entity>
|
||||||
<Entity name="MovementBlend">
|
<Entity name="MovementBlend2">
|
||||||
<Components>
|
<Components>
|
||||||
<c:Blend>
|
<c:Blend>
|
||||||
<Pose1>Idle</Pose1>
|
<Pose1>Idle</Pose1>
|
||||||
@@ -995,6 +999,7 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>IdleAssaultRifleU</AnimationName>
|
<AnimationName>IdleAssaultRifleU</AnimationName>
|
||||||
|
<Time>1.6337870249215687</Time>
|
||||||
<Play>true</Play>
|
<Play>true</Play>
|
||||||
<Additive>true</Additive>
|
<Additive>true</Additive>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
@@ -1006,6 +1011,7 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName>IdleAssaultRifleU</AnimationName>
|
<AnimationName>IdleAssaultRifleU</AnimationName>
|
||||||
|
<Time>1.6337870249215687</Time>
|
||||||
<Play>true</Play>
|
<Play>true</Play>
|
||||||
<Additive>true</Additive>
|
<Additive>true</Additive>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
|
|||||||
@@ -553,8 +553,8 @@
|
|||||||
<Entity name="Cube1">
|
<Entity name="Cube1">
|
||||||
<Components>
|
<Components>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/Core/UnitCube.mesh</Resource>
|
<Resource>Models/BushAlive.mesh</Resource>
|
||||||
<Color A="0.505882382" B="0" G="1" R="0"/>
|
<Color A="1" B="0" G="1" R="0"/>
|
||||||
<Transparent>true</Transparent>
|
<Transparent>true</Transparent>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<Entity name="ShinyStoneCrystalBlueLights" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||||
|
|
||||||
|
<Components>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Color A="1" B="1" G="0" R="0"/>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
<Intensity>2</Intensity>
|
||||||
|
<Falloff>0.5</Falloff>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-0.030024644" Y="1.9786495" Z="-0.242380202"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Color A="1" B="1" G="0.454901963" R="0"/>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
<Intensity>2</Intensity>
|
||||||
|
<Falloff>0.5</Falloff>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-0.030024644" Y="0.980793118" Z="-0.242380202"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
|
||||||
|
</Entity>
|
||||||
@@ -0,0 +1,273 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<Entity name="ShootingRange" 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.736272275" Z="-10.0567217"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
|
||||||
|
<Children>
|
||||||
|
<Entity name="TargetBoard">
|
||||||
|
<Components>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-2" Y="0" Z="0"/>
|
||||||
|
<Orientation X="1.5" Y="0" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="1" G="0.392156869" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="1" Y="0.100000001" Z="1"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="0" G="0" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.850000024" Y="1.10000002" Z="0.850000024"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="1" G="0.392156869" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.800000012" Y="1.10000002" Z="0.800000012"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="0" G="0" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.699999988" Y="1.10000002" Z="0.699999988"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="1" G="0.392156869" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.600000024" Y="1.10000002" Z="0.600000024"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="0" G="0.00392156886" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.200000003" Y="1.10000002" Z="0.200000003"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="TargetBoard">
|
||||||
|
<Components>
|
||||||
|
<c:Transform>
|
||||||
|
<Orientation X="1.5" Y="0" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="1" G="0.392156869" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="1" Y="0.100000001" Z="1"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="0" G="0" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.850000024" Y="1.10000002" Z="0.850000024"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="1" G="0.392156869" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.800000012" Y="1.10000002" Z="0.800000012"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="0" G="0" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.699999988" Y="1.10000002" Z="0.699999988"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="1" G="0.392156869" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.600000024" Y="1.10000002" Z="0.600000024"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="0" G="0.00392156886" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.200000003" Y="1.10000002" Z="0.200000003"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="TargetBoard">
|
||||||
|
<Components>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="2" Y="0" Z="0"/>
|
||||||
|
<Orientation X="1.5" Y="0" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="1" G="0.392156869" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="1" Y="0.100000001" Z="1"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="0" G="0" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.850000024" Y="1.10000002" Z="0.850000024"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="1" G="0.392156869" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.800000012" Y="1.10000002" Z="0.800000012"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="0" G="0" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.699999988" Y="1.10000002" Z="0.699999988"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="1" G="0.392156869" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.600000024" Y="1.10000002" Z="0.600000024"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Core/UnitCylinder.mesh</Resource>
|
||||||
|
<Color A="1" B="0" G="0.00392156886" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Scale X="0.200000003" Y="1.10000002" Z="0.200000003"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
|
||||||
|
</Entity>
|
||||||
@@ -0,0 +1,528 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<Entity name="PlayerModel" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||||
|
|
||||||
|
<Components>
|
||||||
|
<c:BlendAdditive>
|
||||||
|
<Adder>BlendTreeAim</Adder>
|
||||||
|
<Receiver>BlendTreeAssault</Receiver>
|
||||||
|
</c:BlendAdditive>
|
||||||
|
<c:Shielded/>
|
||||||
|
<c:HiddenForLocalPlayer/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>Models/Characters/Assault/AssaultBlue.mesh</Resource>
|
||||||
|
<Color A="1" B="1" G="0.25" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
|
||||||
|
<Children>
|
||||||
|
<Entity name="PrimaryAttachment">
|
||||||
|
<Components>
|
||||||
|
<c:BoneAttachment>
|
||||||
|
<BoneName>R_Arm_Weapon_Joint</BoneName>
|
||||||
|
</c:BoneAttachment>
|
||||||
|
<c:WeaponAttachment>
|
||||||
|
<Weapon>AssaultWeapon</Weapon>
|
||||||
|
<Person>
|
||||||
|
<ThirdPerson/>
|
||||||
|
</Person>
|
||||||
|
</c:WeaponAttachment>
|
||||||
|
<c:Spawner>
|
||||||
|
<EntityFile>Schema/Entities/WeaponAssaultBlueWorld.xml</EntityFile>
|
||||||
|
</c:Spawner>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0.158476353" Y="1.07276821" Z="-0.235679001"/>
|
||||||
|
<Orientation X="0.150311232" Y="-0.0436343439" Z="0.10047026"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="SecondaryAttachment">
|
||||||
|
<Components>
|
||||||
|
<c:BoneAttachment>
|
||||||
|
<BoneName>R_Arm_Weapon_Joint</BoneName>
|
||||||
|
</c:BoneAttachment>
|
||||||
|
<c:WeaponAttachment>
|
||||||
|
<Weapon>SidearmWeapon</Weapon>
|
||||||
|
<Person>
|
||||||
|
<ThirdPerson/>
|
||||||
|
</Person>
|
||||||
|
</c:WeaponAttachment>
|
||||||
|
<c:Spawner>
|
||||||
|
<EntityFile>Schema/Entities/SidearmWeaponWorld.xml</EntityFile>
|
||||||
|
</c:Spawner>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0.158476353" Y="1.07276821" Z="-0.235679001"/>
|
||||||
|
<Orientation X="0.150311232" Y="-0.0436343439" Z="0.10047026"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="BlendTreeAim">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>AimPrimary</Pose1>
|
||||||
|
<Pose2>AimSecondary</Pose2>
|
||||||
|
<Weight>0</Weight>
|
||||||
|
<SubTreeRoot>true</SubTreeRoot>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="AimSecondary">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>AimSecWepA</AnimationName>
|
||||||
|
<Time>0.57222229242324829</Time>
|
||||||
|
<Loop>false</Loop>
|
||||||
|
<Additive>true</Additive>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="AimPrimary">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>AimRifleA</AnimationName>
|
||||||
|
<Time>0.57222229242324829</Time>
|
||||||
|
<Loop>false</Loop>
|
||||||
|
<Additive>true</Additive>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="BlendTreeAssault">
|
||||||
|
<Components>
|
||||||
|
<c:BlendOverride>
|
||||||
|
<Master>ReloadSwitchBlend</Master>
|
||||||
|
<Slave>FinalMovementBlend</Slave>
|
||||||
|
</c:BlendOverride>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="FinalMovementBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>StandCrouchBlend</Pose1>
|
||||||
|
<Pose2>JumpDashBlend</Pose2>
|
||||||
|
<Weight>2.5146881298480398e-63</Weight>
|
||||||
|
<SubTreeRoot>true</SubTreeRoot>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="StandCrouchBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>StandMovement</Pose1>
|
||||||
|
<Pose2>CrouchMovement</Pose2>
|
||||||
|
<Weight>0</Weight>
|
||||||
|
<SubTreeRoot>true</SubTreeRoot>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="CrouchMovement">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>MovementBlend</Pose1>
|
||||||
|
<Pose2>Idle</Pose2>
|
||||||
|
<Weight>1</Weight>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="MovementBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>Walk</Pose1>
|
||||||
|
<Pose2>StrafeLRBlend</Pose2>
|
||||||
|
<Weight>0</Weight>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="StrafeLRBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>Left</Pose1>
|
||||||
|
<Pose2>Right</Pose2>
|
||||||
|
<Weight>0.033793529385008014</Weight>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="Left">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>CrouchStrafeLeftF</AnimationName>
|
||||||
|
<Time>0.37873000664436773</Time>
|
||||||
|
<Play>true</Play>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="Right">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>CrouchStrafeRightF</AnimationName>
|
||||||
|
<Time>0.30605146859515031</Time>
|
||||||
|
<Play>true</Play>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="Walk">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>CrouchWalkF</AnimationName>
|
||||||
|
<Time>0.084425453772553283</Time>
|
||||||
|
<Play>true</Play>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="Idle">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>CrouchF</AnimationName>
|
||||||
|
<Time>0.99862473341677438</Time>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="StandMovement">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>MovementBlend</Pose1>
|
||||||
|
<Pose2>Idle</Pose2>
|
||||||
|
<Weight>1</Weight>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="MovementBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>RunWalkBlend</Pose1>
|
||||||
|
<Pose2>StrafeLRBlend</Pose2>
|
||||||
|
<Weight>0</Weight>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="RunWalkBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>Walk</Pose1>
|
||||||
|
<Pose2>Run</Pose2>
|
||||||
|
<Weight>1</Weight>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="Walk">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>WalkF</AnimationName>
|
||||||
|
<Time>0.58958008318232658</Time>
|
||||||
|
<Play>true</Play>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="Run">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>RunF</AnimationName>
|
||||||
|
<Time>0.45938030142915665</Time>
|
||||||
|
<Play>true</Play>
|
||||||
|
<Reverse>true</Reverse>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="StrafeLRBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>Left</Pose1>
|
||||||
|
<Pose2>Right</Pose2>
|
||||||
|
<Weight>0.033793529385008014</Weight>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="Left">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>StrafeLeftF</AnimationName>
|
||||||
|
<Time>0.77117270421586426</Time>
|
||||||
|
<Play>true</Play>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="Right">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>StrafeRightF</AnimationName>
|
||||||
|
<Time>0.79468823409597888</Time>
|
||||||
|
<Play>true</Play>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="Idle">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>IdleF</AnimationName>
|
||||||
|
<Time>1.8384679867885865</Time>
|
||||||
|
<Play>true</Play>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="JumpDashBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>Jump</Pose1>
|
||||||
|
<Pose2>DashBlend</Pose2>
|
||||||
|
<Weight>1</Weight>
|
||||||
|
<SubTreeRoot>true</SubTreeRoot>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="Jump">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>JumpF</AnimationName>
|
||||||
|
<Time>0.5</Time>
|
||||||
|
<Loop>false</Loop>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="DashBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>DashFBBlend</Pose1>
|
||||||
|
<Pose2>DashLRBlend</Pose2>
|
||||||
|
<Weight>0.014621149736541383</Weight>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="DashFBBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>DashForward</Pose1>
|
||||||
|
<Pose2>DashBackward</Pose2>
|
||||||
|
<Weight>0.014363533804961248</Weight>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="DashForward">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>DashForwardF</AnimationName>
|
||||||
|
<Time>1</Time>
|
||||||
|
<Speed>2</Speed>
|
||||||
|
<Loop>false</Loop>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="DashBackward">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>DashBackwardF</AnimationName>
|
||||||
|
<Time>1</Time>
|
||||||
|
<Speed>2</Speed>
|
||||||
|
<Loop>false</Loop>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="DashLRBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>DashLeft</Pose1>
|
||||||
|
<Pose2>DashRight</Pose2>
|
||||||
|
<Weight>4.3244885367500671e-16</Weight>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="DashLeft">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>DashLeftF</AnimationName>
|
||||||
|
<Time>1</Time>
|
||||||
|
<Speed>2</Speed>
|
||||||
|
<Loop>false</Loop>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="DashRight">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>DashRightF</AnimationName>
|
||||||
|
<Time>1</Time>
|
||||||
|
<Speed>2</Speed>
|
||||||
|
<Loop>false</Loop>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="ReloadSwitchBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>ReloadSwitch</Pose1>
|
||||||
|
<Pose2>WeaponActionBlend</Pose2>
|
||||||
|
<Weight>1</Weight>
|
||||||
|
<SubTreeRoot>true</SubTreeRoot>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="ReloadSwitch">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>ReloadSwitchU</AnimationName>
|
||||||
|
<Time>0.00030848838797092881</Time>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="WeaponActionBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>IdleBlend</Pose1>
|
||||||
|
<Pose2>ShootBlend</Pose2>
|
||||||
|
<Weight>0</Weight>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="IdleBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>IdlePrimary</Pose1>
|
||||||
|
<Pose2>IdleSecondary</Pose2>
|
||||||
|
<Weight>0</Weight>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="IdlePrimary">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>IdleAssaultRifleU</AnimationName>
|
||||||
|
<Time>1.0138027682248349</Time>
|
||||||
|
<Play>true</Play>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="IdleSecondary">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>IdleSecWepU</AnimationName>
|
||||||
|
<Time>1.0173278085146222</Time>
|
||||||
|
<Play>true</Play>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="ShootBlend">
|
||||||
|
<Components>
|
||||||
|
<c:Blend>
|
||||||
|
<Pose1>ShootPrimary</Pose1>
|
||||||
|
<Pose2>ShootSecondary</Pose2>
|
||||||
|
<Weight>0</Weight>
|
||||||
|
</c:Blend>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity name="ShootPrimary">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>ShootFastRifleU</AnimationName>
|
||||||
|
<Time>0.12914212153428517</Time>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="ShootSecondary">
|
||||||
|
<Components>
|
||||||
|
<c:Animation>
|
||||||
|
<AnimationName>ShootSecWepFastU</AnimationName>
|
||||||
|
</c:Animation>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
|
||||||
|
</Entity>
|
||||||
@@ -91,8 +91,8 @@
|
|||||||
<Resource>Models/Weapons/Blue/AssaultWeaponBlue.mesh</Resource>
|
<Resource>Models/Weapons/Blue/AssaultWeaponBlue.mesh</Resource>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="0.118469834" Y="-0.231588811" Z="-0.181454763"/>
|
<Position X="0.120748274" Y="-0.228437141" Z="-0.181454718"/>
|
||||||
<Orientation X="0.0104042515" Y="-0.00268274755" Z="0.0428440832"/>
|
<Orientation X="0.0102804415" Y="-0.00312523148" Z="0.0428143665"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
</Components>
|
</Components>
|
||||||
<Children>
|
<Children>
|
||||||
@@ -127,9 +127,9 @@
|
|||||||
<InheritScale>true</InheritScale>
|
<InheritScale>true</InheritScale>
|
||||||
</c:BoneAttachment>
|
</c:BoneAttachment>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="0.0517482236" Y="-0.0985872298" Z="-0.255526245"/>
|
<Position X="0.0540266186" Y="-0.0954354703" Z="-0.255526125"/>
|
||||||
<Orientation X="0.000683688093" Y="0.0774232447" Z="0.0011862258"/>
|
<Orientation X="0.000778362213" Y="0.0774229616" Z="0.00124316185"/>
|
||||||
<Scale X="0.25" Y="0.250000119" Z="0.500000238"/>
|
<Scale X="0.25000003" Y="0.250000238" Z="0.500000417"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
</Components>
|
</Components>
|
||||||
<Children>
|
<Children>
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#version 430
|
#version 430
|
||||||
|
|
||||||
|
#define MAX_SPLITS 4
|
||||||
|
|
||||||
uniform mat4 M;
|
uniform mat4 M;
|
||||||
uniform mat4 V;
|
uniform mat4 V;
|
||||||
uniform mat4 P;
|
uniform mat4 P;
|
||||||
@@ -22,6 +24,7 @@ in VertexData{
|
|||||||
vec2 TextureCoordinate;
|
vec2 TextureCoordinate;
|
||||||
vec4 ExplosionColor;
|
vec4 ExplosionColor;
|
||||||
float ExplosionPercentageElapsed;
|
float ExplosionPercentageElapsed;
|
||||||
|
vec4 PositionLightSpace[MAX_SPLITS];
|
||||||
}Input[];
|
}Input[];
|
||||||
|
|
||||||
out VertexData{
|
out VertexData{
|
||||||
@@ -32,6 +35,7 @@ out VertexData{
|
|||||||
vec2 TextureCoordinate;
|
vec2 TextureCoordinate;
|
||||||
vec4 ExplosionColor;
|
vec4 ExplosionColor;
|
||||||
float ExplosionPercentageElapsed;
|
float ExplosionPercentageElapsed;
|
||||||
|
vec4 PositionLightSpace[MAX_SPLITS];
|
||||||
}Output;
|
}Output;
|
||||||
|
|
||||||
layout(triangles) in;
|
layout(triangles) in;
|
||||||
@@ -145,6 +149,10 @@ void main()
|
|||||||
Output.TextureCoordinate = Input[i].TextureCoordinate;
|
Output.TextureCoordinate = Input[i].TextureCoordinate;
|
||||||
Output.Tangent = Input[i].Tangent;
|
Output.Tangent = Input[i].Tangent;
|
||||||
Output.BiTangent = Input[i].BiTangent;
|
Output.BiTangent = Input[i].BiTangent;
|
||||||
|
for (int j = 0; j < MAX_SPLITS; j++)
|
||||||
|
{
|
||||||
|
Output.PositionLightSpace[j] = Input[i].PositionLightSpace[j];
|
||||||
|
}
|
||||||
|
|
||||||
// convert to model space for the gravity to always be in -y
|
// convert to model space for the gravity to always be in -y
|
||||||
vec4 ExplodedPositionInModelSpace = M * vec4(ExplodedPosition, 1.0);
|
vec4 ExplodedPositionInModelSpace = M * vec4(ExplodedPosition, 1.0);
|
||||||
@@ -186,6 +194,10 @@ void main()
|
|||||||
Output.TextureCoordinate = Input[i].TextureCoordinate;
|
Output.TextureCoordinate = Input[i].TextureCoordinate;
|
||||||
Output.Tangent = Input[i].Tangent;
|
Output.Tangent = Input[i].Tangent;
|
||||||
Output.BiTangent = Input[i].BiTangent;
|
Output.BiTangent = Input[i].BiTangent;
|
||||||
|
for (int j = 0; j < MAX_SPLITS; j++)
|
||||||
|
{
|
||||||
|
Output.PositionLightSpace[j] = Input[i].PositionLightSpace[j];
|
||||||
|
}
|
||||||
|
|
||||||
// no change in position, pass through vertex
|
// no change in position, pass through vertex
|
||||||
gl_Position = gl_in[i].gl_Position;
|
gl_Position = gl_in[i].gl_Position;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#version 430
|
#version 430
|
||||||
|
|
||||||
#define MIN_AMBIENT_LIGHT 0.3
|
#define MIN_AMBIENT_LIGHT 0.3
|
||||||
|
#define MAX_SPLITS 4
|
||||||
|
|
||||||
uniform mat4 VM;
|
uniform mat4 VM;
|
||||||
uniform mat4 M;
|
uniform mat4 M;
|
||||||
@@ -15,6 +16,7 @@ uniform float FillPercentage;
|
|||||||
uniform float GlowIntensity;
|
uniform float GlowIntensity;
|
||||||
uniform vec3 CameraPosition;
|
uniform vec3 CameraPosition;
|
||||||
uniform int SSAOQuality;
|
uniform int SSAOQuality;
|
||||||
|
uniform float FarDistance[MAX_SPLITS];
|
||||||
|
|
||||||
uniform vec2 DiffuseUVRepeat;
|
uniform vec2 DiffuseUVRepeat;
|
||||||
uniform vec2 NormalUVRepeat;
|
uniform vec2 NormalUVRepeat;
|
||||||
@@ -26,6 +28,7 @@ layout (binding = 2) uniform sampler2D NormalMapTexture;
|
|||||||
layout (binding = 3) uniform sampler2D SpecularMapTexture;
|
layout (binding = 3) uniform sampler2D SpecularMapTexture;
|
||||||
layout (binding = 4) uniform sampler2D GlowMapTexture;
|
layout (binding = 4) uniform sampler2D GlowMapTexture;
|
||||||
layout (binding = 5) uniform samplerCube CubeMap;
|
layout (binding = 5) uniform samplerCube CubeMap;
|
||||||
|
layout (binding = 30) uniform sampler2DArrayShadow DepthMap;
|
||||||
|
|
||||||
#define TILE_SIZE 16
|
#define TILE_SIZE 16
|
||||||
|
|
||||||
@@ -60,7 +63,6 @@ layout (std430, binding = 4) buffer LightIndexBuffer
|
|||||||
float LightIndex[];
|
float LightIndex[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
in VertexData{
|
in VertexData{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
@@ -69,6 +71,7 @@ in VertexData{
|
|||||||
vec2 TextureCoordinate;
|
vec2 TextureCoordinate;
|
||||||
vec4 ExplosionColor;
|
vec4 ExplosionColor;
|
||||||
float ExplosionPercentageElapsed;
|
float ExplosionPercentageElapsed;
|
||||||
|
vec4 PositionLightSpace[MAX_SPLITS];
|
||||||
}Input;
|
}Input;
|
||||||
|
|
||||||
out vec4 sceneColor;
|
out vec4 sceneColor;
|
||||||
@@ -79,6 +82,25 @@ struct LightResult {
|
|||||||
vec4 Specular;
|
vec4 Specular;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
vec2 poissonDisk[16] = vec2[](
|
||||||
|
vec2( -0.94201624, -0.39906216 ),
|
||||||
|
vec2( 0.94558609, -0.76890725 ),
|
||||||
|
vec2( -0.094184101, -0.92938870 ),
|
||||||
|
vec2( 0.34495938, 0.29387760 ),
|
||||||
|
vec2( -0.91588581, 0.45771432 ),
|
||||||
|
vec2( -0.81544232, -0.87912464 ),
|
||||||
|
vec2( -0.38277543, 0.27676845 ),
|
||||||
|
vec2( 0.97484398, 0.75648379 ),
|
||||||
|
vec2( 0.44323325, -0.97511554 ),
|
||||||
|
vec2( 0.53742981, -0.47373420 ),
|
||||||
|
vec2( -0.26496911, -0.41893023 ),
|
||||||
|
vec2( 0.79197514, 0.19090188 ),
|
||||||
|
vec2( -0.24188840, 0.99706507 ),
|
||||||
|
vec2( -0.81409955, 0.91437590 ),
|
||||||
|
vec2( 0.19984126, 0.78641367 ),
|
||||||
|
vec2( 0.14383161, -0.14100790 )
|
||||||
|
);
|
||||||
|
|
||||||
float CalcAttenuation(float radius, float dist, float falloff) {
|
float CalcAttenuation(float radius, float dist, float falloff) {
|
||||||
return 1.0 - smoothstep(radius * falloff, radius, dist);
|
return 1.0 - smoothstep(radius * falloff, radius, dist);
|
||||||
}
|
}
|
||||||
@@ -125,6 +147,154 @@ vec4 CalcNormalMappedValue(vec3 normal, vec3 tangent, vec3 bitangent, vec2 textu
|
|||||||
return vec4(TBN * normalize(NormalMap), 0.0);
|
return vec4(TBN * normalize(NormalMap), 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns a "random" value.
|
||||||
|
float Random(vec3 seed, int i)
|
||||||
|
{
|
||||||
|
vec4 seed4 = vec4(seed, i);
|
||||||
|
float dot_product = dot(seed4, vec4(12.9898, 78.233, 45.164, 94.673));
|
||||||
|
return fract(sin(dot_product) * 43758.5453);
|
||||||
|
}
|
||||||
|
|
||||||
|
int getShadowIndex(float far_distance[1])
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getShadowIndex(float far_distance[2])
|
||||||
|
{
|
||||||
|
float depth = gl_FragCoord.z / gl_FragCoord.w;
|
||||||
|
|
||||||
|
int index = 1;
|
||||||
|
if ( depth < far_distance[0] )
|
||||||
|
{
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getShadowIndex(float far_distance[3])
|
||||||
|
{
|
||||||
|
float depth = gl_FragCoord.z / gl_FragCoord.w;
|
||||||
|
|
||||||
|
int index = 2;
|
||||||
|
if ( depth < far_distance[0] )
|
||||||
|
{
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
else if ( depth < far_distance[1] && depth > far_distance[0] )
|
||||||
|
{
|
||||||
|
index = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getShadowIndex(float far_distance[4])
|
||||||
|
{
|
||||||
|
float depth = gl_FragCoord.z / gl_FragCoord.w;
|
||||||
|
|
||||||
|
int index = 3;
|
||||||
|
if ( depth < far_distance[0] )
|
||||||
|
{
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
else if ( depth < far_distance[1] && depth > far_distance[0] )
|
||||||
|
{
|
||||||
|
index = 1;
|
||||||
|
}
|
||||||
|
else if ( depth < far_distance[2] && depth > far_distance[1] )
|
||||||
|
{
|
||||||
|
index = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Standard hardware-calculated PCF method
|
||||||
|
float PCFShadow(sampler2DArrayShadow depth_texture_array, vec3 projection_coords, int layer_index)
|
||||||
|
{
|
||||||
|
return texture(depth_texture_array, vec4(projection_coords.xy, layer_index, projection_coords.z));
|
||||||
|
}
|
||||||
|
|
||||||
|
// PCF + Poisson model method
|
||||||
|
float PoissonShadow(sampler2DArrayShadow depth_texture_array, vec3 projection_coords, int layer_index, int taps, float spread)
|
||||||
|
{
|
||||||
|
int loop;
|
||||||
|
float multiplier = 1.0 / float(taps);
|
||||||
|
float shadowMapDepth;
|
||||||
|
|
||||||
|
for (int i = 0; i < taps; i++)
|
||||||
|
{
|
||||||
|
loop = i;
|
||||||
|
vec3 newProjCoords = projection_coords + vec3(poissonDisk[loop], 0.0) / (spread * (1.0 + layer_index));
|
||||||
|
shadowMapDepth += multiplier * texture(depth_texture_array, vec4(newProjCoords.xy, layer_index, newProjCoords.z));
|
||||||
|
}
|
||||||
|
|
||||||
|
return shadowMapDepth;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PCF + Poisson + RandomSample model method
|
||||||
|
float PoissonDotShadow(sampler2DArrayShadow depth_texture_array, vec3 projection_coords, int layer_index, int taps, float spread)
|
||||||
|
{
|
||||||
|
int loop;
|
||||||
|
float multiplier = 1.0 / float(taps);
|
||||||
|
float shadowMapDepth;
|
||||||
|
|
||||||
|
for (int i = 0; i < taps; i++)
|
||||||
|
{
|
||||||
|
loop = int(16.0 * Random(gl_FragCoord.xyy, i)) % 16;
|
||||||
|
vec3 newProjCoords = projection_coords + vec3(poissonDisk[loop], 0.0) / (spread * (1.0 + layer_index));
|
||||||
|
shadowMapDepth += multiplier * texture(depth_texture_array, vec4(newProjCoords.xy, layer_index, newProjCoords.z));
|
||||||
|
}
|
||||||
|
|
||||||
|
return shadowMapDepth;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hardware PCF + Additional software PCF method
|
||||||
|
float SoftwarePCF(sampler2DArrayShadow depth_texture_array, vec3 projection_coords, int layer_index, float bias)
|
||||||
|
{
|
||||||
|
float shadow = 0.0;
|
||||||
|
|
||||||
|
vec3 texelSize = 1.0 / textureSize(depth_texture_array, 0);
|
||||||
|
for(int x = -1; x <= 1; x++)
|
||||||
|
{
|
||||||
|
for(int y = -1; y <= 1; y++)
|
||||||
|
{
|
||||||
|
shadow += texture(depth_texture_array, vec4(projection_coords.xy + vec2(x, y) * texelSize.xy / (1.0 + layer_index), layer_index, projection_coords.z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return shadow / 9.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
float CalcShadowValue(vec4 light_space_pos, vec3 normal, vec3 light_dir, sampler2DArrayShadow depth_texture_array, int layer_index)
|
||||||
|
{
|
||||||
|
float shadowMapDepth;
|
||||||
|
float bias = 0.005;
|
||||||
|
|
||||||
|
// Various bias methods.
|
||||||
|
|
||||||
|
//bias = max(0.05 * (1.0 - dot(normal, light_dir)), bias);
|
||||||
|
//bias = bias * tan(acos(clamp(dot(normal, -light_dir), 0.0, 1.0)));
|
||||||
|
bias = bias + bias * tan(acos(clamp(dot(normal, -light_dir), 0.0, 1.0)));
|
||||||
|
|
||||||
|
// Calculate coordinates in projection space.
|
||||||
|
|
||||||
|
vec3 projCoords = vec3(light_space_pos.xy, light_space_pos.z + bias) / light_space_pos.w;
|
||||||
|
projCoords = projCoords * 0.5 + 0.5;
|
||||||
|
//projCoords = (floor(projCoords * 255.0)) / 255.0;
|
||||||
|
|
||||||
|
// Various methods for shadow calculation in fastest to slowest order.
|
||||||
|
|
||||||
|
//shadowMapDepth = PCFShadow(depth_texture_array, projCoords, layer_index);
|
||||||
|
//shadowMapDepth = PoissonShadow(depth_texture_array, projCoords, layer_index, 4, 25.0 * FarDistance[MAX_SPLITS - 1]);
|
||||||
|
//shadowMapDepth = PoissonDotShadow(depth_texture_array, projCoords, layer_index, 4, 25.0 * FarDistance[MAX_SPLITS - 1]);
|
||||||
|
shadowMapDepth = SoftwarePCF(depth_texture_array, projCoords, layer_index, bias);
|
||||||
|
|
||||||
|
return shadowMapDepth;
|
||||||
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
float ao = texelFetch(AOTexture, ivec2(gl_FragCoord.xy) >> int(SSAOQuality), 0).r;
|
float ao = texelFetch(AOTexture, ivec2(gl_FragCoord.xy) >> int(SSAOQuality), 0).r;
|
||||||
@@ -152,6 +322,8 @@ void main()
|
|||||||
|
|
||||||
int start = int(LightGrids.Data[currentTile].Start);
|
int start = int(LightGrids.Data[currentTile].Start);
|
||||||
int amount = int(LightGrids.Data[currentTile].Amount);
|
int amount = int(LightGrids.Data[currentTile].Amount);
|
||||||
|
|
||||||
|
float shadowFactor = 0.0;
|
||||||
|
|
||||||
for(int i = start; i < start + amount; i++) {
|
for(int i = start; i < start + amount; i++) {
|
||||||
|
|
||||||
@@ -163,11 +335,16 @@ void main()
|
|||||||
if(light.Type == 1) { // point
|
if(light.Type == 1) { // point
|
||||||
light_result = CalcPointLightSource(V * light.Position, light.Radius, light.Color, light.Intensity, viewVec, position, normal, light.Falloff);
|
light_result = CalcPointLightSource(V * light.Position, light.Radius, light.Color, light.Intensity, viewVec, position, normal, light.Falloff);
|
||||||
} else if (light.Type == 2) { //Directional
|
} else if (light.Type == 2) { //Directional
|
||||||
|
int DepthMapIndex = getShadowIndex(FarDistance);
|
||||||
light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal);
|
light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal);
|
||||||
|
shadowFactor = CalcShadowValue(Input.PositionLightSpace[DepthMapIndex], Input.Normal, vec3(light.Direction), DepthMap, DepthMapIndex);
|
||||||
}
|
}
|
||||||
totalLighting.Diffuse += vec4(light_result.Diffuse.rgb * ao, light_result.Diffuse.a);
|
totalLighting.Diffuse += vec4(light_result.Diffuse.rgb * ao, light_result.Diffuse.a);
|
||||||
totalLighting.Specular += vec4(light_result.Specular.rgb * ao, light_result.Specular.a);
|
totalLighting.Specular += vec4(light_result.Specular.rgb * ao, light_result.Specular.a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
totalLighting.Diffuse *= vec4(min(vec3(shadowFactor) + AmbientColor.xyz, vec3(1.0)), 1.0);
|
||||||
|
totalLighting.Specular *= vec4(min(vec3(shadowFactor) + AmbientColor.xyz, vec3(1.0)), 1.0);
|
||||||
|
|
||||||
vec4 color_result = mix((Color * diffuseTexel * DiffuseColor), Input.ExplosionColor, Input.ExplosionPercentageElapsed);
|
vec4 color_result = mix((Color * diffuseTexel * DiffuseColor), Input.ExplosionColor, Input.ExplosionPercentageElapsed);
|
||||||
color_result = color_result * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel));
|
color_result = color_result * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel));
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
#version 430
|
#version 430
|
||||||
uniform mat4 PVM;
|
uniform mat4 PVM;
|
||||||
|
#define MAX_SPLITS 4
|
||||||
uniform mat4 TIM;
|
uniform mat4 TIM;
|
||||||
|
|
||||||
uniform mat4 M;
|
uniform mat4 M;
|
||||||
uniform mat4 V;
|
uniform mat4 V;
|
||||||
uniform mat4 P;
|
uniform mat4 P;
|
||||||
|
uniform mat4 LightV[MAX_SPLITS];
|
||||||
|
uniform mat4 LightP[MAX_SPLITS];
|
||||||
|
|
||||||
layout(location = 0) in vec3 Position;
|
layout(location = 0) in vec3 Position;
|
||||||
layout(location = 1) in vec3 Normal;
|
layout(location = 1) in vec3 Normal;
|
||||||
@@ -19,6 +23,7 @@ out VertexData{
|
|||||||
vec2 TextureCoordinate;
|
vec2 TextureCoordinate;
|
||||||
vec4 ExplosionColor;
|
vec4 ExplosionColor;
|
||||||
float ExplosionPercentageElapsed;
|
float ExplosionPercentageElapsed;
|
||||||
|
vec4 PositionLightSpace[MAX_SPLITS];
|
||||||
}Output;
|
}Output;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
@@ -32,4 +37,9 @@ void main()
|
|||||||
Output.BiTangent = vec3(TIM * vec4(BiTangent, 0.0));
|
Output.BiTangent = vec3(TIM * vec4(BiTangent, 0.0));
|
||||||
Output.ExplosionColor = vec4(1.0);
|
Output.ExplosionColor = vec4(1.0);
|
||||||
Output.ExplosionPercentageElapsed = 0.0;
|
Output.ExplosionPercentageElapsed = 0.0;
|
||||||
|
|
||||||
|
for(int i = 0; i < MAX_SPLITS; i++)
|
||||||
|
{
|
||||||
|
Output.PositionLightSpace[i] = LightP[i] * LightV[i] * M * vec4(Position, 1.0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
#version 430
|
#version 430
|
||||||
|
|
||||||
#define MIN_AMBIENT_LIGHT 0.3
|
#define MIN_AMBIENT_LIGHT 0.3
|
||||||
|
#define MAX_SPLITS 4
|
||||||
|
|
||||||
uniform mat4 VM;
|
uniform mat4 VM;
|
||||||
uniform mat4 M;
|
uniform mat4 M;
|
||||||
@@ -70,6 +71,7 @@ in VertexData{
|
|||||||
vec2 TextureCoordinate;
|
vec2 TextureCoordinate;
|
||||||
vec4 ExplosionColor;
|
vec4 ExplosionColor;
|
||||||
float ExplosionPercentageElapsed;
|
float ExplosionPercentageElapsed;
|
||||||
|
vec4 PositionLightSpace[MAX_SPLITS];
|
||||||
}Input;
|
}Input;
|
||||||
|
|
||||||
out vec4 sceneColor;
|
out vec4 sceneColor;
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
#version 430
|
#version 430
|
||||||
|
|
||||||
|
#define MAX_SPLITS 4
|
||||||
|
|
||||||
uniform mat4 PVM;
|
uniform mat4 PVM;
|
||||||
uniform mat4 TIM;
|
uniform mat4 TIM;
|
||||||
uniform mat4 M;
|
uniform mat4 M;
|
||||||
uniform mat4 V;
|
uniform mat4 V;
|
||||||
uniform mat4 P;
|
uniform mat4 P;
|
||||||
uniform mat4 Bones[100];
|
uniform mat4 Bones[100];
|
||||||
|
uniform mat4 LightV[MAX_SPLITS];
|
||||||
|
uniform mat4 LightP[MAX_SPLITS];
|
||||||
|
|
||||||
layout(location = 0) in vec3 Position;
|
layout(location = 0) in vec3 Position;
|
||||||
layout(location = 1) in vec3 Normal;
|
layout(location = 1) in vec3 Normal;
|
||||||
@@ -23,6 +27,7 @@ out VertexData{
|
|||||||
vec2 TextureCoordinate;
|
vec2 TextureCoordinate;
|
||||||
vec4 ExplosionColor;
|
vec4 ExplosionColor;
|
||||||
float ExplosionPercentageElapsed;
|
float ExplosionPercentageElapsed;
|
||||||
|
vec4 PositionLightSpace[MAX_SPLITS];
|
||||||
}Output;
|
}Output;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
@@ -45,4 +50,9 @@ void main()
|
|||||||
Output.BiTangent = vec3(M * vec4(BiTangent, 0.0));
|
Output.BiTangent = vec3(M * vec4(BiTangent, 0.0));
|
||||||
Output.ExplosionColor = vec4(1.0);
|
Output.ExplosionColor = vec4(1.0);
|
||||||
Output.ExplosionPercentageElapsed = 0.0;
|
Output.ExplosionPercentageElapsed = 0.0;
|
||||||
|
|
||||||
|
for(int i = 0; i < MAX_SPLITS; i++)
|
||||||
|
{
|
||||||
|
Output.PositionLightSpace[i] = LightP[i] * LightV[i] * M * boneTransform * vec4(Position, 1.0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
#version 430
|
#version 430
|
||||||
|
|
||||||
|
#define MAX_SPLITS 4
|
||||||
|
|
||||||
uniform mat4 M;
|
uniform mat4 M;
|
||||||
uniform mat4 V;
|
uniform mat4 V;
|
||||||
uniform mat4 P;
|
uniform mat4 P;
|
||||||
@@ -95,6 +97,7 @@ in VertexData{
|
|||||||
vec2 TextureCoordinate;
|
vec2 TextureCoordinate;
|
||||||
vec4 ExplosionColor;
|
vec4 ExplosionColor;
|
||||||
float ExplosionPercentageElapsed;
|
float ExplosionPercentageElapsed;
|
||||||
|
vec4 PositionLightSpace[MAX_SPLITS];
|
||||||
}Input;
|
}Input;
|
||||||
|
|
||||||
out vec4 sceneColor;
|
out vec4 sceneColor;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#version 430
|
#version 430
|
||||||
|
|
||||||
#define MIN_AMBIENT_LIGHT 0.3
|
#define MIN_AMBIENT_LIGHT 0.3
|
||||||
|
#define MAX_SPLITS 4
|
||||||
|
|
||||||
uniform mat4 VM;
|
uniform mat4 VM;
|
||||||
uniform mat4 M;
|
uniform mat4 M;
|
||||||
@@ -13,6 +14,10 @@ uniform vec4 FillColor;
|
|||||||
uniform vec4 Color;
|
uniform vec4 Color;
|
||||||
uniform vec4 AmbientColor;
|
uniform vec4 AmbientColor;
|
||||||
uniform int SSAOQuality;
|
uniform int SSAOQuality;
|
||||||
|
uniform float FarDistance[MAX_SPLITS];
|
||||||
|
|
||||||
|
layout (binding = 0) uniform sampler2D AOTexture;
|
||||||
|
layout (binding = 30) uniform sampler2DArrayShadow DepthMap;
|
||||||
|
|
||||||
//Get bineded at the same time as the textures
|
//Get bineded at the same time as the textures
|
||||||
uniform vec2 DiffuseUVRepeat1;
|
uniform vec2 DiffuseUVRepeat1;
|
||||||
@@ -27,7 +32,6 @@ uniform vec2 SpecularUVRepeat3;
|
|||||||
uniform vec2 GlowUVRepeat1;
|
uniform vec2 GlowUVRepeat1;
|
||||||
uniform vec2 GlowUVRepeat2;
|
uniform vec2 GlowUVRepeat2;
|
||||||
uniform vec2 GlowUVRepeat3;
|
uniform vec2 GlowUVRepeat3;
|
||||||
layout (binding = 0) uniform sampler2D AOTexture;
|
|
||||||
layout (binding = 1) uniform sampler2D SplatMapTexture;
|
layout (binding = 1) uniform sampler2D SplatMapTexture;
|
||||||
layout (binding = 2) uniform sampler2D DiffuseTexture1;
|
layout (binding = 2) uniform sampler2D DiffuseTexture1;
|
||||||
layout (binding = 3) uniform sampler2D DiffuseTexture2;
|
layout (binding = 3) uniform sampler2D DiffuseTexture2;
|
||||||
@@ -84,6 +88,7 @@ in VertexData{
|
|||||||
vec2 TextureCoordinate;
|
vec2 TextureCoordinate;
|
||||||
vec4 ExplosionColor;
|
vec4 ExplosionColor;
|
||||||
float ExplosionPercentageElapsed;
|
float ExplosionPercentageElapsed;
|
||||||
|
vec4 PositionLightSpace[MAX_SPLITS];
|
||||||
}Input;
|
}Input;
|
||||||
|
|
||||||
out vec4 sceneColor;
|
out vec4 sceneColor;
|
||||||
@@ -94,6 +99,25 @@ struct LightResult {
|
|||||||
vec4 Specular;
|
vec4 Specular;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
vec2 poissonDisk[16] = vec2[](
|
||||||
|
vec2( -0.94201624, -0.39906216 ),
|
||||||
|
vec2( 0.94558609, -0.76890725 ),
|
||||||
|
vec2( -0.094184101, -0.92938870 ),
|
||||||
|
vec2( 0.34495938, 0.29387760 ),
|
||||||
|
vec2( -0.91588581, 0.45771432 ),
|
||||||
|
vec2( -0.81544232, -0.87912464 ),
|
||||||
|
vec2( -0.38277543, 0.27676845 ),
|
||||||
|
vec2( 0.97484398, 0.75648379 ),
|
||||||
|
vec2( 0.44323325, -0.97511554 ),
|
||||||
|
vec2( 0.53742981, -0.47373420 ),
|
||||||
|
vec2( -0.26496911, -0.41893023 ),
|
||||||
|
vec2( 0.79197514, 0.19090188 ),
|
||||||
|
vec2( -0.24188840, 0.99706507 ),
|
||||||
|
vec2( -0.81409955, 0.91437590 ),
|
||||||
|
vec2( 0.19984126, 0.78641367 ),
|
||||||
|
vec2( 0.14383161, -0.14100790 )
|
||||||
|
);
|
||||||
|
|
||||||
float CalcAttenuation(float radius, float dist, float falloff) {
|
float CalcAttenuation(float radius, float dist, float falloff) {
|
||||||
return 1.0 - smoothstep(radius * 0.3, radius, dist);
|
return 1.0 - smoothstep(radius * 0.3, radius, dist);
|
||||||
}
|
}
|
||||||
@@ -177,6 +201,154 @@ vec4 CalcBlendedNormal(vec4 blendValue, sampler2D R, sampler2D G, sampler2D B,
|
|||||||
return vec4(TBN * normalize(Normal_result), 0.0);
|
return vec4(TBN * normalize(Normal_result), 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns a "random" value.
|
||||||
|
float Random(vec3 seed, int i)
|
||||||
|
{
|
||||||
|
vec4 seed4 = vec4(seed, i);
|
||||||
|
float dot_product = dot(seed4, vec4(12.9898, 78.233, 45.164, 94.673));
|
||||||
|
return fract(sin(dot_product) * 43758.5453);
|
||||||
|
}
|
||||||
|
|
||||||
|
int getShadowIndex(float far_distance[1])
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getShadowIndex(float far_distance[2])
|
||||||
|
{
|
||||||
|
float depth = gl_FragCoord.z / gl_FragCoord.w;
|
||||||
|
|
||||||
|
int index = 1;
|
||||||
|
if ( depth < far_distance[0] )
|
||||||
|
{
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getShadowIndex(float far_distance[3])
|
||||||
|
{
|
||||||
|
float depth = gl_FragCoord.z / gl_FragCoord.w;
|
||||||
|
|
||||||
|
int index = 2;
|
||||||
|
if ( depth < far_distance[0] )
|
||||||
|
{
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
else if ( depth < far_distance[1] && depth > far_distance[0] )
|
||||||
|
{
|
||||||
|
index = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getShadowIndex(float far_distance[4])
|
||||||
|
{
|
||||||
|
float depth = gl_FragCoord.z / gl_FragCoord.w;
|
||||||
|
|
||||||
|
int index = 3;
|
||||||
|
if ( depth < far_distance[0] )
|
||||||
|
{
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
else if ( depth < far_distance[1] && depth > far_distance[0] )
|
||||||
|
{
|
||||||
|
index = 1;
|
||||||
|
}
|
||||||
|
else if ( depth < far_distance[2] && depth > far_distance[1] )
|
||||||
|
{
|
||||||
|
index = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Standard hardware-calculated PCF method
|
||||||
|
float PCFShadow(sampler2DArrayShadow depth_texture_array, vec3 projection_coords, int layer_index)
|
||||||
|
{
|
||||||
|
return texture(depth_texture_array, vec4(projection_coords.xy, layer_index, projection_coords.z));
|
||||||
|
}
|
||||||
|
|
||||||
|
// PCF + Poisson model method
|
||||||
|
float PoissonShadow(sampler2DArrayShadow depth_texture_array, vec3 projection_coords, int layer_index, int taps, float spread)
|
||||||
|
{
|
||||||
|
int loop;
|
||||||
|
float multiplier = 1.0 / float(taps);
|
||||||
|
float shadowMapDepth;
|
||||||
|
|
||||||
|
for (int i = 0; i < taps; i++)
|
||||||
|
{
|
||||||
|
loop = i;
|
||||||
|
vec3 newProjCoords = projection_coords + vec3(poissonDisk[loop], 0.0) / (spread * (1.0 + layer_index));
|
||||||
|
shadowMapDepth += multiplier * texture(depth_texture_array, vec4(newProjCoords.xy, layer_index, newProjCoords.z));
|
||||||
|
}
|
||||||
|
|
||||||
|
return shadowMapDepth;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PCF + Poisson + RandomSample model method
|
||||||
|
float PoissonDotShadow(sampler2DArrayShadow depth_texture_array, vec3 projection_coords, int layer_index, int taps, float spread)
|
||||||
|
{
|
||||||
|
int loop;
|
||||||
|
float multiplier = 1.0 / float(taps);
|
||||||
|
float shadowMapDepth;
|
||||||
|
|
||||||
|
for (int i = 0; i < taps; i++)
|
||||||
|
{
|
||||||
|
loop = int(16.0 * Random(gl_FragCoord.xyy, i)) % 16;
|
||||||
|
vec3 newProjCoords = projection_coords + vec3(poissonDisk[loop], 0.0) / (spread * (1.0 + layer_index));
|
||||||
|
shadowMapDepth += multiplier * texture(depth_texture_array, vec4(newProjCoords.xy, layer_index, newProjCoords.z));
|
||||||
|
}
|
||||||
|
|
||||||
|
return shadowMapDepth;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hardware PCF + Additional software PCF method
|
||||||
|
float SoftwarePCF(sampler2DArrayShadow depth_texture_array, vec3 projection_coords, int layer_index, float bias)
|
||||||
|
{
|
||||||
|
float shadow = 0.0;
|
||||||
|
|
||||||
|
vec3 texelSize = 1.0 / textureSize(depth_texture_array, 0);
|
||||||
|
for(int x = -1; x <= 1; x++)
|
||||||
|
{
|
||||||
|
for(int y = -1; y <= 1; y++)
|
||||||
|
{
|
||||||
|
shadow += texture(depth_texture_array, vec4(projection_coords.xy + vec2(x, y) * texelSize.xy / (1.0 + layer_index), layer_index, projection_coords.z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return shadow / 9.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
float CalcShadowValue(vec4 light_space_pos, vec3 normal, vec3 light_dir, sampler2DArrayShadow depth_texture_array, int layer_index)
|
||||||
|
{
|
||||||
|
float shadowMapDepth;
|
||||||
|
float bias = 0.005;
|
||||||
|
|
||||||
|
// Various bias methods.
|
||||||
|
|
||||||
|
//bias = max(0.05 * (1.0 - dot(normal, light_dir)), bias);
|
||||||
|
//bias = bias * tan(acos(clamp(dot(normal, -light_dir), 0.0, 1.0)));
|
||||||
|
bias = bias + bias * tan(acos(clamp(dot(normal, -light_dir), 0.0, 1.0)));
|
||||||
|
|
||||||
|
// Calculate coordinates in projection space.
|
||||||
|
|
||||||
|
vec3 projCoords = vec3(light_space_pos.xy, light_space_pos.z + bias) / light_space_pos.w;
|
||||||
|
projCoords = projCoords * 0.5 + 0.5;
|
||||||
|
//projCoords = (floor(projCoords * 255.0)) / 255.0;
|
||||||
|
|
||||||
|
// Various methods for shadow calculation in fastest to slowest order.
|
||||||
|
|
||||||
|
//shadowMapDepth = PCFShadow(depth_texture_array, projCoords, layer_index);
|
||||||
|
//shadowMapDepth = PoissonShadow(depth_texture_array, projCoords, layer_index, 4, 25.0 * FarDistance[MAX_SPLITS - 1]);
|
||||||
|
//shadowMapDepth = PoissonDotShadow(depth_texture_array, projCoords, layer_index, 4, 25.0 * FarDistance[MAX_SPLITS - 1]);
|
||||||
|
shadowMapDepth = SoftwarePCF(depth_texture_array, projCoords, layer_index, bias);
|
||||||
|
|
||||||
|
return shadowMapDepth;
|
||||||
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
float ao = texelFetch(AOTexture, ivec2(gl_FragCoord.xy) >> int(SSAOQuality), 0).r;
|
float ao = texelFetch(AOTexture, ivec2(gl_FragCoord.xy) >> int(SSAOQuality), 0).r;
|
||||||
@@ -209,6 +381,8 @@ void main()
|
|||||||
int start = int(LightGrids.Data[currentTile].Start);
|
int start = int(LightGrids.Data[currentTile].Start);
|
||||||
int amount = int(LightGrids.Data[currentTile].Amount);
|
int amount = int(LightGrids.Data[currentTile].Amount);
|
||||||
|
|
||||||
|
float shadowFactor = 0.0;
|
||||||
|
|
||||||
for(int i = start; i < start + amount; i++) {
|
for(int i = start; i < start + amount; i++) {
|
||||||
|
|
||||||
int l = int(LightIndex[i]);
|
int l = int(LightIndex[i]);
|
||||||
@@ -219,12 +393,17 @@ void main()
|
|||||||
if(light.Type == 1) { // point
|
if(light.Type == 1) { // point
|
||||||
light_result = CalcPointLightSource(V * light.Position, light.Radius, light.Color, light.Intensity, viewVec, position, normal, light.Falloff);
|
light_result = CalcPointLightSource(V * light.Position, light.Radius, light.Color, light.Intensity, viewVec, position, normal, light.Falloff);
|
||||||
} else if (light.Type == 2) { //Directional
|
} else if (light.Type == 2) { //Directional
|
||||||
|
int DepthMapIndex = getShadowIndex(FarDistance);
|
||||||
light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal);
|
light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal);
|
||||||
|
shadowFactor = CalcShadowValue(Input.PositionLightSpace[DepthMapIndex], Input.Normal, vec3(light.Direction), DepthMap, DepthMapIndex);
|
||||||
}
|
}
|
||||||
totalLighting.Diffuse += vec4(light_result.Diffuse.rgb * ao, light_result.Diffuse.a);
|
totalLighting.Diffuse += vec4(light_result.Diffuse.rgb * ao, light_result.Diffuse.a);
|
||||||
totalLighting.Specular += vec4(light_result.Specular.rgb * ao, light_result.Specular.a);
|
totalLighting.Specular += vec4(light_result.Specular.rgb * ao, light_result.Specular.a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
totalLighting.Diffuse *= vec4(min(vec3(shadowFactor) + AmbientColor.xyz, vec3(1.0)), 1.0);
|
||||||
|
totalLighting.Specular *= vec4(min(vec3(shadowFactor) + AmbientColor.xyz, vec3(1.0)), 1.0);
|
||||||
|
|
||||||
vec4 color_result = mix((Color * diffuseTexel * DiffuseColor), Input.ExplosionColor, Input.ExplosionPercentageElapsed);
|
vec4 color_result = mix((Color * diffuseTexel * DiffuseColor), Input.ExplosionColor, Input.ExplosionPercentageElapsed);
|
||||||
color_result = color_result * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel));
|
color_result = color_result * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel));
|
||||||
//vec4 color_result = (DiffuseColor + Input.ExplosionColor) * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel)) * diffuseTexel * Color;
|
//vec4 color_result = (DiffuseColor + Input.ExplosionColor) * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel)) * diffuseTexel * Color;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#version 430
|
#version 430
|
||||||
|
|
||||||
#define MIN_AMBIENT_LIGHT 0.3
|
#define MIN_AMBIENT_LIGHT 0.3
|
||||||
|
#define MAX_SPLITS 4
|
||||||
|
|
||||||
uniform mat4 VM;
|
uniform mat4 VM;
|
||||||
uniform mat4 M;
|
uniform mat4 M;
|
||||||
@@ -85,6 +86,7 @@ in VertexData{
|
|||||||
vec2 TextureCoordinate;
|
vec2 TextureCoordinate;
|
||||||
vec4 ExplosionColor;
|
vec4 ExplosionColor;
|
||||||
float ExplosionPercentageElapsed;
|
float ExplosionPercentageElapsed;
|
||||||
|
vec4 PositionLightSpace[MAX_SPLITS];
|
||||||
}Input;
|
}Input;
|
||||||
|
|
||||||
out vec4 sceneColor;
|
out vec4 sceneColor;
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#version 430
|
||||||
|
|
||||||
|
#define ALPHA_CUTOFF 0.3
|
||||||
|
|
||||||
|
layout (binding = 24) uniform sampler2D DiffuseTexture;
|
||||||
|
uniform float Alpha;
|
||||||
|
|
||||||
|
in VertexData{
|
||||||
|
vec2 TextureCoordinate;
|
||||||
|
}Input;
|
||||||
|
|
||||||
|
layout (location = 0) out float ShadowMap;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 diffuseTexel = texture(DiffuseTexture, Input.TextureCoordinate) * Alpha;
|
||||||
|
|
||||||
|
if (diffuseTexel.a < ALPHA_CUTOFF)
|
||||||
|
{
|
||||||
|
discard;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#version 430
|
||||||
|
|
||||||
|
uniform mat4 M;
|
||||||
|
uniform mat4 V;
|
||||||
|
uniform mat4 P;
|
||||||
|
|
||||||
|
layout (location = 0) in vec3 Position;
|
||||||
|
layout (location = 4) in vec2 TextureCoords;
|
||||||
|
|
||||||
|
out VertexData{
|
||||||
|
vec2 TextureCoordinate;
|
||||||
|
}Output;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = P * V * M * vec4(Position, 1.0);
|
||||||
|
Output.TextureCoordinate = TextureCoords;
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
const EntityWrapper EntityWrapper::Invalid = EntityWrapper(nullptr, EntityID_Invalid);
|
const EntityWrapper EntityWrapper::Invalid = EntityWrapper(nullptr, EntityID_Invalid);
|
||||||
|
|
||||||
const std::string EntityWrapper::Name()
|
const std::string EntityWrapper::Name() const
|
||||||
{
|
{
|
||||||
return World->GetName(ID);
|
return World->GetName(ID);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ glm::vec3 Transform::AbsolutePosition(World* world, EntityID entity)
|
|||||||
while (entity != EntityID_Invalid) {
|
while (entity != EntityID_Invalid) {
|
||||||
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
||||||
EntityID parent = world->GetParent(entity);
|
EntityID parent = world->GetParent(entity);
|
||||||
position += Transform::AbsoluteOrientation(world, parent) * (glm::vec3)transform["Position"];
|
position += Transform::AbsoluteScale(world, parent) * (Transform::AbsoluteOrientation(world, parent) * (glm::vec3)transform["Position"]);
|
||||||
entity = parent;
|
entity = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,12 +89,12 @@ glm::mat4 Transform::ModelMatrix(EntityID entity, World* world)
|
|||||||
{
|
{
|
||||||
return AbsoluteTransformation(EntityWrapper(world, entity));
|
return AbsoluteTransformation(EntityWrapper(world, entity));
|
||||||
|
|
||||||
glm::vec3 position = Transform::AbsolutePosition(world, entity);
|
//glm::vec3 position = Transform::AbsolutePosition(world, entity);
|
||||||
glm::quat orientation = Transform::AbsoluteOrientation(world, entity);
|
//glm::quat orientation = Transform::AbsoluteOrientation(world, entity);
|
||||||
glm::vec3 scale = Transform::AbsoluteScale(world, entity);
|
//glm::vec3 scale = Transform::AbsoluteScale(world, entity);
|
||||||
|
|
||||||
glm::mat4 modelMatrix = glm::translate(glm::mat4(), position) * glm::toMat4(orientation) * glm::scale(scale);
|
//glm::mat4 modelMatrix = glm::translate(glm::mat4(), position) * glm::toMat4(orientation) * glm::scale(scale);
|
||||||
return modelMatrix;
|
//return modelMatrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec3 Transform::TransformPoint(const glm::vec3& point, const glm::mat4& matrix)
|
glm::vec3 Transform::TransformPoint(const glm::vec3& point, const glm::mat4& matrix)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ EditorRenderSystem::EditorRenderSystem(SystemParams params, IRenderer* renderer,
|
|||||||
{
|
{
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &EditorRenderSystem::OnSetCamera);
|
EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &EditorRenderSystem::OnSetCamera);
|
||||||
auto resolution = Rectangle::Rectangle(1280, 720);
|
auto resolution = Rectangle::Rectangle(1280, 720);
|
||||||
m_EditorCamera = new Camera((float)resolution.Width / resolution.Height, glm::radians(45.f), 0.01f, 5000.f);
|
m_EditorCamera = new Camera((float)resolution.Width / resolution.Height, glm::radians(45.f), 0.001f, 500.f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorRenderSystem::Update(double dt)
|
void EditorRenderSystem::Update(double dt)
|
||||||
@@ -54,7 +54,7 @@ void EditorRenderSystem::Update(double dt)
|
|||||||
EntityWrapper entity(m_World, cModel.EntityID);
|
EntityWrapper entity(m_World, cModel.EntityID);
|
||||||
glm::mat4 modelMatrix = Transform::ModelMatrix(entity.ID, entity.World);
|
glm::mat4 modelMatrix = Transform::ModelMatrix(entity.ID, entity.World);
|
||||||
for (auto matGroup : model->MaterialGroups()) {
|
for (auto matGroup : model->MaterialGroups()) {
|
||||||
std::shared_ptr<ModelJob> modelJob = std::make_shared<ModelJob>(model, scene.Camera, modelMatrix, matGroup, cModel, entity.World, glm::vec4(0), 0.f, false);
|
std::shared_ptr<ModelJob> modelJob = std::make_shared<ModelJob>(model, scene.Camera, modelMatrix, matGroup, cModel, entity.World, glm::vec4(0), 0.f, false, false);
|
||||||
if (cModel["Transparent"]) {
|
if (cModel["Transparent"]) {
|
||||||
scene.Jobs.TransparentObjects.push_back(modelJob);
|
scene.Jobs.TransparentObjects.push_back(modelJob);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -204,14 +204,21 @@ bool EditorSystem::OnWidgetDelta(const Events::WidgetDelta& e)
|
|||||||
if (m_CurrentSelection.Valid()) {
|
if (m_CurrentSelection.Valid()) {
|
||||||
if (m_WidgetSpace == EditorGUI::WidgetSpace::Global) {
|
if (m_WidgetSpace == EditorGUI::WidgetSpace::Global) {
|
||||||
glm::quat parentOrientation;
|
glm::quat parentOrientation;
|
||||||
|
glm::vec3 parentScale(1.f);
|
||||||
EntityWrapper parent = m_CurrentSelection.Parent();
|
EntityWrapper parent = m_CurrentSelection.Parent();
|
||||||
if (parent.Valid()) {
|
if (parent.Valid()) {
|
||||||
parentOrientation = glm::inverse(Transform::AbsoluteOrientation(parent));
|
parentOrientation = glm::inverse(Transform::AbsoluteOrientation(parent));
|
||||||
|
parentScale = Transform::AbsoluteScale(parent);
|
||||||
}
|
}
|
||||||
(glm::vec3&)m_CurrentSelection["Transform"]["Position"] += parentOrientation * e.Translation;
|
(glm::vec3&)m_CurrentSelection["Transform"]["Position"] += parentOrientation * e.Translation / parentScale;
|
||||||
} else if (m_WidgetSpace == EditorGUI::WidgetSpace::Local) {
|
} else if (m_WidgetSpace == EditorGUI::WidgetSpace::Local) {
|
||||||
|
glm::vec3 parentScale(1.f);
|
||||||
|
EntityWrapper parent = m_CurrentSelection.Parent();
|
||||||
|
if (parent.Valid()) {
|
||||||
|
parentScale = Transform::AbsoluteScale(parent);
|
||||||
|
}
|
||||||
glm::quat selectionOri = glm::quat((glm::vec3)m_CurrentSelection["Transform"]["Orientation"]);
|
glm::quat selectionOri = glm::quat((glm::vec3)m_CurrentSelection["Transform"]["Orientation"]);
|
||||||
glm::vec3 localTranslation = selectionOri * e.Translation;
|
glm::vec3 localTranslation = selectionOri * e.Translation / parentScale;
|
||||||
(glm::vec3&)m_CurrentSelection["Transform"]["Position"] += localTranslation;
|
(glm::vec3&)m_CurrentSelection["Transform"]["Position"] += localTranslation;
|
||||||
}
|
}
|
||||||
m_EditorGUI->SetDirty(m_CurrentSelection);
|
m_EditorGUI->SetDirty(m_CurrentSelection);
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ AnimationSystem::AnimationSystem(SystemParams params)
|
|||||||
: System(params)
|
: System(params)
|
||||||
{
|
{
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EAutoAnimationBlend, &AnimationSystem::OnAutoAnimationBlend);
|
EVENT_SUBSCRIBE_MEMBER(m_EAutoAnimationBlend, &AnimationSystem::OnAutoAnimationBlend);
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_EEntityDeleted, &AnimationSystem::OnEntityDeleted);
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_ESetBlendWeight, &AnimationSystem::OnSetBlendWeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimationSystem::Update(double dt)
|
void AnimationSystem::Update(double dt)
|
||||||
@@ -122,16 +124,16 @@ void AnimationSystem::UpdateAnimations(double dt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void AnimationSystem::UpdateWeights(double dt)
|
void AnimationSystem::UpdateWeights(double dt)
|
||||||
{
|
{
|
||||||
for (auto& autoBlendQueue : m_AutoBlendQueues) {
|
for (auto it = m_AutoBlendQueues.begin(); it != m_AutoBlendQueues.end(); ) {
|
||||||
|
LOG_INFO("%s", it->first.Name().c_str());
|
||||||
if(autoBlendQueue.second.HasActiveBlendJob()) {
|
it->second.PrintQueue();
|
||||||
AutoBlendQueue::AutoBlendJob& blendJob = autoBlendQueue.second.GetActiveBlendJob();
|
|
||||||
|
if(it->second.HasActiveBlendJob()) {
|
||||||
std::shared_ptr<BlendTree> blendTree = autoBlendQueue.second.GetBlendTree();
|
AutoBlendQueue::AutoBlendJob& blendJob = it->second.GetActiveBlendJob();
|
||||||
|
LOG_INFO("%s", blendJob.RootNode.Name().c_str());
|
||||||
|
std::shared_ptr<BlendTree> blendTree = it->second.GetBlendTree();
|
||||||
if (blendTree != nullptr) {
|
if (blendTree != nullptr) {
|
||||||
if (blendJob.Duration != 0.0) {
|
if (blendJob.Duration != 0.0) {
|
||||||
blendJob.BlendInfo.progress = glm::clamp(blendJob.CurrentTime / blendJob.Duration, 0.0, 1.0);
|
blendJob.BlendInfo.progress = glm::clamp(blendJob.CurrentTime / blendJob.Duration, 0.0, 1.0);
|
||||||
@@ -140,10 +142,17 @@ void AnimationSystem::UpdateWeights(double dt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
blendJob.BlendInfo = blendTree->AutoBlendStep(blendJob.BlendInfo);
|
blendJob.BlendInfo = blendTree->AutoBlendStep(blendJob.BlendInfo);
|
||||||
|
} else {
|
||||||
|
it = m_AutoBlendQueues.erase(it);
|
||||||
|
}
|
||||||
|
it++;
|
||||||
|
} else {
|
||||||
|
if (it->second.Empty()) {
|
||||||
|
it = m_AutoBlendQueues.erase(it);
|
||||||
|
} else {
|
||||||
|
it++;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,46 +186,163 @@ bool AnimationSystem::OnAutoAnimationBlend(Events::AutoAnimationBlend& e)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EntityWrapper subTreeRoot;
|
||||||
|
|
||||||
|
|
||||||
EntityWrapper subTreeRoot = blendTree->GetSubTreeRoot(e.NodeName);
|
if (e.SingleLevelBlend) {
|
||||||
|
subTreeRoot = blendTree->GetSubTreeRoot(e.NodeName);
|
||||||
|
|
||||||
if (!subTreeRoot.Valid()) {
|
if (!subTreeRoot.Valid()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
AutoBlendQueue::AutoBlendJob abj;
|
AutoBlendQueue::AutoBlendJob abj;
|
||||||
abj.AnimationEntity = e.AnimationEntity;
|
abj.AnimationEntity = e.AnimationEntity;
|
||||||
abj.CurrentTime = 0.0;
|
abj.CurrentTime = 0.0;
|
||||||
abj.Delay = e.Delay;
|
abj.Delay = e.Delay;
|
||||||
abj.Duration = e.Duration;
|
abj.Duration = e.Duration;
|
||||||
abj.RootNode = e.RootNode;
|
abj.RootNode = e.RootNode;
|
||||||
|
|
||||||
abj.BlendInfo.NodeName = e.NodeName;
|
abj.BlendInfo.NodeName = e.NodeName;
|
||||||
abj.BlendInfo.progress = 0.0;
|
abj.BlendInfo.progress = 0.0;
|
||||||
abj.BlendInfo.Start = e.Start;
|
abj.BlendInfo.Start = e.Start;
|
||||||
abj.BlendInfo.SingleBlend = e.SingleLevelBlend;
|
abj.BlendInfo.SingleBlend = e.SingleLevelBlend;
|
||||||
abj.BlendInfo.Weight = e.Weight;
|
abj.BlendInfo.Weight = e.Weight;
|
||||||
|
|
||||||
EntityWrapper nodeEntity = subTreeRoot.FirstChildByName(e.NodeName); // more than one
|
std::vector<EntityWrapper> animationEntities = blendTree->GetEntitesByName(e.NodeName); // more than one
|
||||||
if (nodeEntity.Valid()) {
|
for(auto entity : animationEntities)
|
||||||
if (nodeEntity.HasComponent("Animation")) {
|
if (entity.Valid()) {
|
||||||
const Skeleton::Animation* animation = skeleton->GetAnimation(nodeEntity["Animation"]["AnimationName"]);
|
if (entity.HasComponent("Animation")) {
|
||||||
(bool&)nodeEntity["Animation"]["Reverse"] = e.Reverse;
|
const Skeleton::Animation* animation = skeleton->GetAnimation(entity["Animation"]["AnimationName"]);
|
||||||
|
(bool&)entity["Animation"]["Reverse"] = e.Reverse;
|
||||||
|
|
||||||
if (e.Restart) {
|
if (e.Restart) {
|
||||||
if (animation != nullptr) {
|
if (animation != nullptr) {
|
||||||
if (e.Restart) {
|
if (e.Restart) {
|
||||||
if (e.Reverse) {
|
if (e.Reverse) {
|
||||||
(double&)nodeEntity["Animation"]["Time"] = animation->Duration;
|
(double&)entity["Animation"]["Time"] = animation->Duration;
|
||||||
} else {
|
} else {
|
||||||
(double&)nodeEntity["Animation"]["Time"] = 0.0;
|
(double&)entity["Animation"]["Time"] = 0.0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_AutoBlendQueues[subTreeRoot].Insert(abj);
|
||||||
|
} else {
|
||||||
|
std::vector<EntityWrapper> subtreeroots = blendTree->GetSingleLevelRoots(e.NodeName);
|
||||||
|
|
||||||
|
for(auto entity : subtreeroots) {
|
||||||
|
subTreeRoot = entity;
|
||||||
|
|
||||||
|
if (!subTreeRoot.Valid()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
AutoBlendQueue::AutoBlendJob abj;
|
||||||
|
abj.AnimationEntity = e.AnimationEntity;
|
||||||
|
abj.CurrentTime = 0.0;
|
||||||
|
abj.Delay = e.Delay;
|
||||||
|
abj.Duration = e.Duration;
|
||||||
|
abj.RootNode = e.RootNode;
|
||||||
|
|
||||||
|
abj.BlendInfo.NodeName = e.NodeName;
|
||||||
|
abj.BlendInfo.progress = 0.0;
|
||||||
|
abj.BlendInfo.Start = e.Start;
|
||||||
|
abj.BlendInfo.SingleBlend = e.SingleLevelBlend;
|
||||||
|
abj.BlendInfo.Weight = e.Weight;
|
||||||
|
m_AutoBlendQueues[subTreeRoot].Insert(abj);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<EntityWrapper> animationEntities = blendTree->GetEntitesByName(e.NodeName); // more than one
|
||||||
|
for (auto entity : animationEntities)
|
||||||
|
if (entity.Valid()) {
|
||||||
|
if (entity.HasComponent("Animation")) {
|
||||||
|
const Skeleton::Animation* animation = skeleton->GetAnimation(entity["Animation"]["AnimationName"]);
|
||||||
|
(bool&)entity["Animation"]["Reverse"] = e.Reverse;
|
||||||
|
|
||||||
|
if (e.Restart) {
|
||||||
|
if (animation != nullptr) {
|
||||||
|
if (e.Restart) {
|
||||||
|
if (e.Reverse) {
|
||||||
|
(double&)entity["Animation"]["Time"] = animation->Duration;
|
||||||
|
} else {
|
||||||
|
(double&)entity["Animation"]["Time"] = 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m_AutoBlendQueues[subTreeRoot].Insert(abj);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AnimationSystem::OnEntityDeleted(Events::EntityDeleted& e)
|
||||||
|
{
|
||||||
|
EntityWrapper entity = EntityWrapper(m_World, e.DeletedEntity);
|
||||||
|
|
||||||
|
if (entity.HasComponent("Model")) {
|
||||||
|
Model* model;
|
||||||
|
try {
|
||||||
|
model = ResourceManager::Load<::Model, true>(entity["Model"]["Resource"]);
|
||||||
|
} catch (const std::exception&) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Skeleton* skeleton = model->m_RawModel->m_Skeleton;
|
||||||
|
if (skeleton == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skeleton->BlendTrees.find(entity) != skeleton->BlendTrees.end()) {
|
||||||
|
skeleton->BlendTrees.erase(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AnimationSystem::OnSetBlendWeight(Events::SetBlendWeight& e)
|
||||||
|
{
|
||||||
|
if (!e.RootNode.Valid()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!e.RootNode.HasComponent("Model")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Model* model;
|
||||||
|
try {
|
||||||
|
model = ResourceManager::Load<::Model, true>((std::string)e.RootNode["Model"]["Resource"]);
|
||||||
|
} catch (const std::exception&) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Skeleton* skeleton = model->m_RawModel->m_Skeleton;
|
||||||
|
if (skeleton == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<BlendTree> blendTree;
|
||||||
|
if (skeleton->BlendTrees.find(e.RootNode) != skeleton->BlendTrees.end()) {
|
||||||
|
blendTree = skeleton->BlendTrees.at(e.RootNode);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(e.Weight >= 0 && e.Weight <= 1) {
|
||||||
|
|
||||||
|
blendTree->SetWeightByName(e.NodeName, e.Weight);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -38,11 +38,14 @@ void AutoBlendQueue::Insert(AutoBlendJob autoBlendJob)
|
|||||||
double animationSpeed = (double)autoBlendJob.AnimationEntity["Animation"]["Speed"];
|
double animationSpeed = (double)autoBlendJob.AnimationEntity["Animation"]["Speed"];
|
||||||
double animationTime = (double)autoBlendJob.AnimationEntity["Animation"]["Time"];
|
double animationTime = (double)autoBlendJob.AnimationEntity["Animation"]["Time"];
|
||||||
|
|
||||||
|
if (animationSpeed != 0) {
|
||||||
if ((bool)autoBlendJob.AnimationEntity["Animation"]["Reverse"]) {
|
if ((bool)autoBlendJob.AnimationEntity["Animation"]["Reverse"]) {
|
||||||
AnimationDuration = (animation->Duration * animationSpeed) - (animation->Duration - animationTime);
|
AnimationDuration = (animation->Duration / animationSpeed) - (animation->Duration - animationTime);
|
||||||
|
} else {
|
||||||
|
AnimationDuration = (animation->Duration / animationSpeed) - animationTime;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
AnimationDuration = (animation->Duration * animationSpeed) - animationTime;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
blendNode.StartTime += AnimationDuration;
|
blendNode.StartTime += AnimationDuration;
|
||||||
@@ -75,7 +78,6 @@ void AutoBlendQueue::Insert(AutoBlendJob autoBlendJob)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
m_BlendQueue.clear();
|
m_BlendQueue.clear();
|
||||||
m_BlendQueue.push_back(blendNode);
|
m_BlendQueue.push_back(blendNode);
|
||||||
}
|
}
|
||||||
@@ -124,7 +126,7 @@ bool AutoBlendQueue::HasActiveBlendJob()
|
|||||||
try {
|
try {
|
||||||
model = ResourceManager::Load<::Model, true>(blendJob.RootNode["Model"]["Resource"]);
|
model = ResourceManager::Load<::Model, true>(blendJob.RootNode["Model"]["Resource"]);
|
||||||
} catch (const std::exception&) {
|
} catch (const std::exception&) {
|
||||||
m_BlendQueue.pop_front();
|
//m_BlendQueue.pop_front();
|
||||||
return HasActiveBlendJob();
|
return HasActiveBlendJob();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,8 @@
|
|||||||
|
|
||||||
BlendTree::BlendTree(EntityWrapper ModelEntity, Skeleton* skeleton)
|
BlendTree::BlendTree(EntityWrapper ModelEntity, Skeleton* skeleton)
|
||||||
{
|
{
|
||||||
|
|
||||||
m_Skeleton = skeleton;
|
m_Skeleton = skeleton;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (ModelEntity.HasComponent("Animation")) {
|
if (ModelEntity.HasComponent("Animation")) {
|
||||||
const Skeleton::Animation* animation = skeleton->GetAnimation(ModelEntity["Animation"]["AnimationName"]);
|
const Skeleton::Animation* animation = skeleton->GetAnimation(ModelEntity["Animation"]["AnimationName"]);
|
||||||
if (animation == nullptr) {
|
if (animation == nullptr) {
|
||||||
@@ -217,7 +214,6 @@ BlendTree::AutoBlendInfo BlendTree::AutoBlendStep(AutoBlendInfo blendInfo)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return blendInfo;
|
return blendInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,7 +266,7 @@ BlendTree::AutoBlendInfo BlendTree::AutoBlendStep(AutoBlendInfo blendInfo)
|
|||||||
currentNode = currentNode->Parent;
|
currentNode = currentNode->Parent;
|
||||||
|
|
||||||
if (blendInfo.SingleBlend) {
|
if (blendInfo.SingleBlend) {
|
||||||
break;
|
return blendInfo;;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if(goalNodes.size() >= 2) {
|
} else if(goalNodes.size() >= 2) {
|
||||||
@@ -331,9 +327,11 @@ BlendTree::AutoBlendInfo BlendTree::AutoBlendStep(AutoBlendInfo blendInfo)
|
|||||||
|
|
||||||
lastNode = currentNode;
|
lastNode = currentNode;
|
||||||
currentNode = currentNode->Parent;
|
currentNode = currentNode->Parent;
|
||||||
|
if (blendInfo.SingleBlend) {
|
||||||
|
return blendInfo;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return blendInfo;
|
return blendInfo;
|
||||||
@@ -427,6 +425,55 @@ EntityWrapper BlendTree::GetSubTreeRoot(std::string nodeName)
|
|||||||
return subTreeRoots.front()->Entity;
|
return subTreeRoots.front()->Entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<EntityWrapper> BlendTree::GetSingleLevelRoots(std::string name)
|
||||||
|
{
|
||||||
|
std::vector<Node*> nodes = FindNodesByName(name);
|
||||||
|
std::vector<EntityWrapper> entities;
|
||||||
|
|
||||||
|
for (auto it = nodes.begin(); it != nodes.end(); it++) {
|
||||||
|
Node* currentNode = (*it)->Parent;
|
||||||
|
|
||||||
|
if(currentNode->Entity.Valid()) {
|
||||||
|
entities.push_back(currentNode->Entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return entities;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<EntityWrapper> BlendTree::GetEntitesByName(std::string name)
|
||||||
|
{
|
||||||
|
std::vector<Node*> nodes = FindNodesByName(name);
|
||||||
|
std::vector<EntityWrapper> entities;
|
||||||
|
|
||||||
|
for (auto it = nodes.begin(); it != nodes.end(); it++) {
|
||||||
|
Node* currentNode = (*it);
|
||||||
|
|
||||||
|
if (currentNode->Entity.Valid()) {
|
||||||
|
entities.push_back(currentNode->Entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return entities;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BlendTree::SetWeightByName(std::string name, double weight)
|
||||||
|
{
|
||||||
|
std::vector<Node*> nodes = FindNodesByName(name);
|
||||||
|
|
||||||
|
for (auto node : nodes) {
|
||||||
|
EntityWrapper entity = node->Entity;
|
||||||
|
|
||||||
|
if(entity.HasComponent("Blend")) {
|
||||||
|
entity["Blend"]["Weight"] = weight;
|
||||||
|
node->Weight = weight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void BlendTree::Blend(std::map<int, Skeleton::PoseData>& pose)
|
void BlendTree::Blend(std::map<int, Skeleton::PoseData>& pose)
|
||||||
{
|
{
|
||||||
Node* currentNode;
|
Node* currentNode;
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
#include "Rendering/DrawFinalPass.h"
|
#include "Rendering/DrawFinalPass.h"
|
||||||
DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass)
|
DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass)
|
||||||
: m_Renderer(renderer)
|
: m_Renderer(renderer)
|
||||||
, m_LightCullingPass(lightCullingPass)
|
, m_LightCullingPass(lightCullingPass)
|
||||||
, m_CubeMapPass(cubeMapPass)
|
, m_CubeMapPass(cubeMapPass)
|
||||||
, m_SSAOPass(ssaoPass)
|
, m_SSAOPass(ssaoPass)
|
||||||
|
, m_ShadowPass(shadowPass)
|
||||||
{
|
{
|
||||||
//TODO: Make sure that uniforms are not sent into shader if not needed.
|
//TODO: Make sure that uniforms are not sent into shader if not needed.
|
||||||
m_ShieldPixelRate = 8;
|
m_ShieldPixelRate = 8;
|
||||||
@@ -369,6 +370,13 @@ void DrawFinalPass::DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>&
|
|||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, m_SSAOPass->SSAOTexture());
|
glBindTexture(GL_TEXTURE_2D, m_SSAOPass->SSAOTexture());
|
||||||
|
|
||||||
|
glActiveTexture(GL_TEXTURE30);
|
||||||
|
if (m_ShadowPass->DepthMap() != NULL) {
|
||||||
|
glBindTexture(GL_TEXTURE_2D_ARRAY, m_ShadowPass->DepthMap());
|
||||||
|
} else {
|
||||||
|
glBindTexture(GL_TEXTURE_2D_ARRAY, m_WhiteTexture->m_Texture);
|
||||||
|
}
|
||||||
|
|
||||||
for (auto &job : jobs) {
|
for (auto &job : jobs) {
|
||||||
auto explosionEffectJob = std::dynamic_pointer_cast<ExplosionEffectJob>(job);
|
auto explosionEffectJob = std::dynamic_pointer_cast<ExplosionEffectJob>(job);
|
||||||
if (explosionEffectJob) {
|
if (explosionEffectJob) {
|
||||||
@@ -1339,6 +1347,10 @@ void DrawFinalPass::BindExplosionUniforms(GLuint shaderHandle, std::shared_ptr<E
|
|||||||
glUniform1f(glGetUniformLocation(shaderHandle, "FillPercentage"), job->FillPercentage);
|
glUniform1f(glGetUniformLocation(shaderHandle, "FillPercentage"), job->FillPercentage);
|
||||||
GLERROR("Bind 19 uniform");
|
GLERROR("Bind 19 uniform");
|
||||||
glUniform1f(glGetUniformLocation(shaderHandle, "GlowIntensity"), job->GlowIntensity);
|
glUniform1f(glGetUniformLocation(shaderHandle, "GlowIntensity"), job->GlowIntensity);
|
||||||
|
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "LightP"), MAX_SPLITS, GL_FALSE, glm::value_ptr(*m_ShadowPass->LightP().data()));
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "LightV"), MAX_SPLITS, GL_FALSE, glm::value_ptr(*m_ShadowPass->LightV().data()));
|
||||||
|
glUniform1fv(glGetUniformLocation(shaderHandle, "FarDistance"), MAX_SPLITS, m_ShadowPass->FarDistance().data());
|
||||||
GLERROR("END");
|
GLERROR("END");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1366,8 +1378,11 @@ void DrawFinalPass::BindModelUniforms(GLuint shaderHandle, std::shared_ptr<Model
|
|||||||
GLint Location_Color = glGetUniformLocation(shaderHandle, "Color");
|
GLint Location_Color = glGetUniformLocation(shaderHandle, "Color");
|
||||||
glUniform4fv(Location_Color, 1, glm::value_ptr(job->Color));
|
glUniform4fv(Location_Color, 1, glm::value_ptr(job->Color));
|
||||||
GLint Location_GlowIntensity = glGetUniformLocation(shaderHandle, "GlowIntensity");
|
GLint Location_GlowIntensity = glGetUniformLocation(shaderHandle, "GlowIntensity");
|
||||||
|
glUniform1f(Location_GlowIntensity, job->GlowIntensity);
|
||||||
|
|
||||||
glUniform1f(Location_GlowIntensity, job->GlowIntensity);
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "LightP"), MAX_SPLITS, GL_FALSE, glm::value_ptr(*m_ShadowPass->LightP().data()));
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "LightV"), MAX_SPLITS, GL_FALSE, glm::value_ptr(*m_ShadowPass->LightV().data()));
|
||||||
|
glUniform1fv(glGetUniformLocation(shaderHandle, "FarDistance"), MAX_SPLITS, m_ShadowPass->FarDistance().data());
|
||||||
|
|
||||||
GLERROR("END");
|
GLERROR("END");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,13 @@ RenderBuffer::~RenderBuffer()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Texture2DArray::~Texture2DArray()
|
||||||
|
{
|
||||||
|
if (m_ResourceHandle != 0) {
|
||||||
|
glDeleteTextures(1, m_ResourceHandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
FrameBuffer::~FrameBuffer()
|
FrameBuffer::~FrameBuffer()
|
||||||
{
|
{
|
||||||
@@ -53,12 +60,15 @@ void FrameBuffer::Generate()
|
|||||||
case GL_TEXTURE_2D:
|
case GL_TEXTURE_2D:
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle, 0);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle, 0);
|
||||||
GLERROR("FrameBuffer generate: glFramebufferTexture2D");
|
GLERROR("FrameBuffer generate: glFramebufferTexture2D");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case GL_RENDERBUFFER:
|
case GL_RENDERBUFFER:
|
||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle);
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle);
|
||||||
GLERROR("FrameBuffer generate: glFramebufferRenderbuffer");
|
GLERROR("FrameBuffer generate: glFramebufferRenderbuffer");
|
||||||
break;
|
break;
|
||||||
|
case GL_TEXTURE_2D_ARRAY:
|
||||||
|
glFramebufferTexture(GL_FRAMEBUFFER, (*it)->m_Attachment, *(*it)->m_ResourceHandle, 0);
|
||||||
|
GLERROR("FrameBuffer generate: glFramebufferTexture2DArray");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
GLERROR("2");
|
GLERROR("2");
|
||||||
|
|
||||||
|
|||||||
@@ -258,7 +258,8 @@ void RenderSystem::fillModels(RenderScene::Queues &Jobs)
|
|||||||
m_World,
|
m_World,
|
||||||
fillColor,
|
fillColor,
|
||||||
fillPercentage,
|
fillPercentage,
|
||||||
isShielded
|
isShielded,
|
||||||
|
false
|
||||||
));
|
));
|
||||||
if (m_World->HasComponent(cModel.EntityID, "Shield")){
|
if (m_World->HasComponent(cModel.EntityID, "Shield")){
|
||||||
explosionEffectJob->CalculateHash();
|
explosionEffectJob->CalculateHash();
|
||||||
@@ -296,7 +297,8 @@ void RenderSystem::fillModels(RenderScene::Queues &Jobs)
|
|||||||
m_World,
|
m_World,
|
||||||
fillColor,
|
fillColor,
|
||||||
fillPercentage,
|
fillPercentage,
|
||||||
isShielded
|
isShielded,
|
||||||
|
(bool)cModel["Shadow"]
|
||||||
));
|
));
|
||||||
if (m_World->HasComponent(cModel.EntityID, "Shield")) {
|
if (m_World->HasComponent(cModel.EntityID, "Shield")) {
|
||||||
modelJob->CalculateHash();
|
modelJob->CalculateHash();
|
||||||
|
|||||||
@@ -146,7 +146,9 @@ void Renderer::Draw(RenderFrame& frame)
|
|||||||
m_DrawFinalPass->ClearBuffer();
|
m_DrawFinalPass->ClearBuffer();
|
||||||
m_DrawBloomPass->ClearBuffer();
|
m_DrawBloomPass->ClearBuffer();
|
||||||
m_SSAOPass->ClearBuffer();
|
m_SSAOPass->ClearBuffer();
|
||||||
|
m_ShadowPass->ClearBuffer();
|
||||||
m_BlurHUDPass->ClearBuffer();
|
m_BlurHUDPass->ClearBuffer();
|
||||||
|
m_ShadowPass->DebugGUI();
|
||||||
PerformanceTimer::StopTimer("Renderer-ClearBuffers");
|
PerformanceTimer::StopTimer("Renderer-ClearBuffers");
|
||||||
GLERROR("ClearBuffers");
|
GLERROR("ClearBuffers");
|
||||||
for (auto scene : frame.RenderScenes) {
|
for (auto scene : frame.RenderScenes) {
|
||||||
@@ -162,6 +164,9 @@ void Renderer::Draw(RenderFrame& frame)
|
|||||||
PerformanceTimer::StartTimer("Renderer-Depth");
|
PerformanceTimer::StartTimer("Renderer-Depth");
|
||||||
SortRenderJobsByDepth(*scene);
|
SortRenderJobsByDepth(*scene);
|
||||||
GLERROR("SortByDepth");
|
GLERROR("SortByDepth");
|
||||||
|
PerformanceTimer::StartTimerAndStopPrevious("Draw shadow maps");
|
||||||
|
m_ShadowPass->Draw(*scene);
|
||||||
|
GLERROR("Draw shadow maps");
|
||||||
PerformanceTimer::StartTimerAndStopPrevious("Renderer-Generate Frustrums");
|
PerformanceTimer::StartTimerAndStopPrevious("Renderer-Generate Frustrums");
|
||||||
m_LightCullingPass->GenerateNewFrustum(*scene);
|
m_LightCullingPass->GenerateNewFrustum(*scene);
|
||||||
GLERROR("Generate frustums");
|
GLERROR("Generate frustums");
|
||||||
@@ -264,8 +269,9 @@ void Renderer::InitializeRenderPasses()
|
|||||||
m_LightCullingPass = new LightCullingPass(this);
|
m_LightCullingPass = new LightCullingPass(this);
|
||||||
m_CubeMapPass = new CubeMapPass(this);
|
m_CubeMapPass = new CubeMapPass(this);
|
||||||
m_SSAOPass = new SSAOPass(this, m_Config);
|
m_SSAOPass = new SSAOPass(this, m_Config);
|
||||||
|
m_ShadowPass = new ShadowPass(this);
|
||||||
m_BlurHUDPass = new BlurHUD(this);
|
m_BlurHUDPass = new BlurHUD(this);
|
||||||
m_DrawFinalPass = new DrawFinalPass(this, m_LightCullingPass, m_CubeMapPass, m_SSAOPass);
|
m_DrawFinalPass = new DrawFinalPass(this, m_LightCullingPass, m_CubeMapPass, m_SSAOPass, m_ShadowPass);
|
||||||
m_DrawScreenQuadPass = new DrawScreenQuadPass(this);
|
m_DrawScreenQuadPass = new DrawScreenQuadPass(this);
|
||||||
m_DrawBloomPass = new DrawBloomPass(this, m_Config);
|
m_DrawBloomPass = new DrawBloomPass(this, m_Config);
|
||||||
m_DrawColorCorrectionPass = new DrawColorCorrectionPass(this);
|
m_DrawColorCorrectionPass = new DrawColorCorrectionPass(this);
|
||||||
|
|||||||
@@ -0,0 +1,313 @@
|
|||||||
|
#include "Rendering/ShadowPass.h"
|
||||||
|
|
||||||
|
ShadowPass::ShadowPass(IRenderer * renderer, int shadow_res_x, int shadow_res_y)
|
||||||
|
{
|
||||||
|
m_Renderer = renderer;
|
||||||
|
m_ResolutionSizeWidth = shadow_res_x;
|
||||||
|
m_ResolutionSizeHeight = shadow_res_y;
|
||||||
|
|
||||||
|
InitializeFrameBuffers();
|
||||||
|
InitializeShaderPrograms();
|
||||||
|
}
|
||||||
|
|
||||||
|
ShadowPass::ShadowPass(IRenderer * renderer)
|
||||||
|
{
|
||||||
|
m_Renderer = renderer;
|
||||||
|
|
||||||
|
InitializeFrameBuffers();
|
||||||
|
InitializeShaderPrograms();
|
||||||
|
}
|
||||||
|
|
||||||
|
ShadowPass::~ShadowPass()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShadowPass::DebugGUI()
|
||||||
|
{
|
||||||
|
ImGui::Checkbox("EnableShadows", &m_EnableShadows);
|
||||||
|
ImGui::DragFloat2("ShadowMapNearFar", m_NearFarPlane, 1.f, -1000.f, 1000.f);
|
||||||
|
ImGui::DragFloat("ShadowClippingWeight", &m_SplitWeight, 0.001f, 0.f, 1.f);
|
||||||
|
ImGui::Checkbox("ShadowTransparentObjects", &m_TransparentObjects);
|
||||||
|
ImGui::Checkbox("ShadowOnTextureAlphas", &m_TexturedShadows);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShadowPass::InitializeCameras(RenderScene & scene)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
||||||
|
m_shadowFrusta[i].AspectRatio = scene.Camera->AspectRatio();
|
||||||
|
m_shadowFrusta[i].FOV = scene.Camera->FOV();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateSplitDist computes the near and far distances for every frustum slice
|
||||||
|
// in camera eye space - that is, at what distance does a slice start and end
|
||||||
|
void ShadowPass::UpdateSplitDist(std::array<ShadowFrustum, MAX_SPLITS>& frusta, float near_distance, float far_distance)
|
||||||
|
{
|
||||||
|
float lambda = m_SplitWeight;
|
||||||
|
float ratio = far_distance / near_distance;
|
||||||
|
|
||||||
|
frusta[0].NearClip = near_distance;
|
||||||
|
|
||||||
|
for (int i = 1; i < m_CurrentNrOfSplits; i++) {
|
||||||
|
float si = i / static_cast<float>(m_CurrentNrOfSplits);
|
||||||
|
|
||||||
|
frusta[i].NearClip = lambda * (near_distance * powf(ratio, si)) + (1 - lambda) * (near_distance + (far_distance - near_distance) * si);
|
||||||
|
frusta[i - 1].FarClip = frusta[i].NearClip * 1.005f;
|
||||||
|
}
|
||||||
|
|
||||||
|
frusta[m_CurrentNrOfSplits - 1].FarClip = far_distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShadowPass::UpdateFrustumPoints(ShadowFrustum& frustum, glm::mat4 p, glm::mat4 v)
|
||||||
|
{
|
||||||
|
std::array<glm::vec4, 8> CornerPoint = {
|
||||||
|
glm::vec4(-1.f, -1.f, -1.f, 1.f),
|
||||||
|
glm::vec4(-1.f, 1.f, -1.f, 1.f),
|
||||||
|
glm::vec4(1.f, 1.f, -1.f, 1.f),
|
||||||
|
glm::vec4(1.f, -1.f, -1.f, 1.f),
|
||||||
|
glm::vec4(-1.f, -1.f, 1.f, 1.f),
|
||||||
|
glm::vec4(-1.f, 1.f, 1.f, 1.f),
|
||||||
|
glm::vec4(1.f, 1.f, 1.f, 1.f),
|
||||||
|
glm::vec4(1.f, -1.f, 1.f, 1.f)
|
||||||
|
};
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
glm::vec4 NDC = glm::inverse(p) * CornerPoint[i];
|
||||||
|
NDC = NDC / NDC.w;
|
||||||
|
frustum.CornerPoint[i] = glm::vec3(glm::inverse(v) * NDC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute the 8 corner points of the current view frustum in world space
|
||||||
|
void ShadowPass::UpdateFrustumPoints(ShadowFrustum& frustum, glm::vec3 camera_position, glm::vec3 view_dir)
|
||||||
|
{
|
||||||
|
glm::vec3 up = glm::vec3(0.f, 1.f, 0.f);
|
||||||
|
glm::vec3 right = glm::normalize(glm::cross(view_dir, up));
|
||||||
|
|
||||||
|
glm::vec3 far_center = camera_position + glm::normalize(view_dir) * frustum.FarClip;
|
||||||
|
glm::vec3 near_center = camera_position + glm::normalize(view_dir) * frustum.NearClip;
|
||||||
|
frustum.MiddlePoint = near_center + (far_center - near_center) * 0.5f;
|
||||||
|
|
||||||
|
up = glm::normalize(glm::cross(right, view_dir));
|
||||||
|
|
||||||
|
// these heights and widths are half the heights and widths of the near and far plane rectangles.
|
||||||
|
float near_height = tan(frustum.FOV / 2.f) * frustum.NearClip;
|
||||||
|
float near_width = near_height * frustum.AspectRatio;
|
||||||
|
float far_height = tan(frustum.FOV / 2.f) * frustum.FarClip;
|
||||||
|
float far_width = far_height * frustum.AspectRatio;
|
||||||
|
|
||||||
|
frustum.CornerPoint[0] = near_center - up * near_height - right * near_width;
|
||||||
|
frustum.CornerPoint[1] = near_center + up * near_height - right * near_width;
|
||||||
|
frustum.CornerPoint[2] = near_center + up * near_height + right * near_width;
|
||||||
|
frustum.CornerPoint[3] = near_center - up * near_height + right * near_width;
|
||||||
|
|
||||||
|
frustum.CornerPoint[4] = far_center - up * far_height - right * far_width;
|
||||||
|
frustum.CornerPoint[5] = far_center + up * far_height - right * far_width;
|
||||||
|
frustum.CornerPoint[6] = far_center + up * far_height + right * far_width;
|
||||||
|
frustum.CornerPoint[7] = far_center - up * far_height + right * far_width;
|
||||||
|
}
|
||||||
|
|
||||||
|
float ShadowPass::FindRadius(ShadowFrustum& frustum)
|
||||||
|
{
|
||||||
|
float radius = 0.f;
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
float distance = glm::distance(frustum.MiddlePoint, frustum.CornerPoint[i]);
|
||||||
|
if (distance > radius) {
|
||||||
|
radius = distance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
frustum.Radius = radius;
|
||||||
|
return radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShadowPass::InitializeFrameBuffers()
|
||||||
|
{
|
||||||
|
// Depth texture
|
||||||
|
glGenTextures(1, &m_DepthMap);
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D_ARRAY, m_DepthMap);
|
||||||
|
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_DEPTH_COMPONENT16, m_ResolutionSizeWidth, m_ResolutionSizeHeight, m_CurrentNrOfSplits);
|
||||||
|
|
||||||
|
//glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, m_ResolutionSizeWidth, m_ResolutionSizeHeight, m_CurrentNrOfSplits, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
||||||
|
|
||||||
|
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
|
||||||
|
glTexParameterfv(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BORDER_COLOR, glm::vec4(1.f).data);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
|
||||||
|
|
||||||
|
m_DepthBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2DArray(&m_DepthMap, GL_DEPTH_ATTACHMENT)));
|
||||||
|
m_DepthBuffer.Generate();
|
||||||
|
|
||||||
|
GLERROR("depthMap failed END");
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShadowPass::InitializeShaderPrograms()
|
||||||
|
{
|
||||||
|
m_ShadowProgram = ResourceManager::Load<ShaderProgram>("#ShadowProgram");
|
||||||
|
m_ShadowProgram->AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/Shadow.vert.glsl")));
|
||||||
|
m_ShadowProgram->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/Shadow.frag.glsl")));
|
||||||
|
m_ShadowProgram->Compile();
|
||||||
|
m_ShadowProgram->BindFragDataLocation(0, "ShadowMap");
|
||||||
|
m_ShadowProgram->Link();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShadowPass::ClearBuffer()
|
||||||
|
{
|
||||||
|
m_DepthBuffer.Bind();
|
||||||
|
|
||||||
|
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
||||||
|
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i);
|
||||||
|
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_DepthBuffer.Unbind();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShadowPass::PointsToLightspace(ShadowFrustum& frustum, glm::mat4 v)
|
||||||
|
{
|
||||||
|
float left = INFINITY;
|
||||||
|
float right = -INFINITY;
|
||||||
|
float bottom = INFINITY;
|
||||||
|
float top = -INFINITY;
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
glm::vec3 tempPoint = glm::vec3(v * glm::vec4(frustum.CornerPoint[i], 1.f));
|
||||||
|
|
||||||
|
if (tempPoint.x < left) { left = tempPoint.x; }
|
||||||
|
if (tempPoint.x > right) { right = tempPoint.x; }
|
||||||
|
if (tempPoint.y < bottom) { bottom = tempPoint.y; }
|
||||||
|
if (tempPoint.y > top) { top = tempPoint.y; }
|
||||||
|
}
|
||||||
|
|
||||||
|
frustum.LRBT = { left, right, bottom, top };
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShadowPass::RadiusToLightspace(ShadowFrustum& frustum)
|
||||||
|
{
|
||||||
|
float quantizationStep = 1.0f / m_ResolutionSizeHeight;
|
||||||
|
|
||||||
|
float left = -frustum.Radius;
|
||||||
|
float right = frustum.Radius;
|
||||||
|
float bottom = -frustum.Radius;
|
||||||
|
float top = frustum.Radius;
|
||||||
|
|
||||||
|
frustum.LRBT = { left, right, bottom, top };
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShadowPass::Draw(RenderScene & scene)
|
||||||
|
{
|
||||||
|
if (m_EnableShadows) {
|
||||||
|
InitializeCameras(scene);
|
||||||
|
UpdateSplitDist(m_shadowFrusta, scene.Camera->NearClip(), scene.Camera->FarClip());
|
||||||
|
|
||||||
|
ShadowPassState* state = new ShadowPassState(m_DepthBuffer.GetHandle());
|
||||||
|
|
||||||
|
m_ShadowProgram->Bind();
|
||||||
|
GLuint shaderHandle = m_ShadowProgram->GetHandle();
|
||||||
|
glViewport(0, 0, m_ResolutionSizeWidth, m_ResolutionSizeHeight);
|
||||||
|
|
||||||
|
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
||||||
|
UpdateFrustumPoints(m_shadowFrusta[i], scene.Camera->Position(), scene.Camera->Forward());
|
||||||
|
|
||||||
|
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i);
|
||||||
|
|
||||||
|
for (auto &job : scene.Jobs.DirectionalLight) {
|
||||||
|
auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job);
|
||||||
|
|
||||||
|
if (directionalLightJob) {
|
||||||
|
m_LightView[i] = glm::lookAt(glm::vec3(-directionalLightJob->Direction) + m_shadowFrusta[i].MiddlePoint, m_shadowFrusta[i].MiddlePoint, glm::vec3(0.f, 1.f, 0.f));
|
||||||
|
|
||||||
|
PointsToLightspace(m_shadowFrusta[i], m_LightView[i]);
|
||||||
|
//FindRadius(m_shadowFrusta[i]);
|
||||||
|
//RadiusToLightspace(m_shadowFrusta[i]);
|
||||||
|
m_LightProjection[i] = glm::ortho(m_shadowFrusta[i].LRBT[LEFT], m_shadowFrusta[i].LRBT[RIGHT], m_shadowFrusta[i].LRBT[BOTTOM], m_shadowFrusta[i].LRBT[TOP], m_NearFarPlane[NEAR], m_NearFarPlane[FAR]);
|
||||||
|
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i]));
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_LightView[i]));
|
||||||
|
|
||||||
|
GLERROR("ShadowLight ERROR");
|
||||||
|
|
||||||
|
for (auto &objectJob : scene.Jobs.OpaqueObjects) {
|
||||||
|
if (!std::dynamic_pointer_cast<ExplosionEffectJob>(objectJob)) {
|
||||||
|
auto modelJob = std::dynamic_pointer_cast<ModelJob>(objectJob);
|
||||||
|
|
||||||
|
if (!modelJob->Shadow) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
||||||
|
glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), 1.f);
|
||||||
|
|
||||||
|
glBindVertexArray(modelJob->Model->VAO);
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
||||||
|
glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int)));
|
||||||
|
|
||||||
|
GLERROR("Shadow Draw ERROR");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (m_TransparentObjects) {
|
||||||
|
state->CullFace(GL_BACK);
|
||||||
|
for (auto &objectJob : scene.Jobs.TransparentObjects) {
|
||||||
|
if (!std::dynamic_pointer_cast<ExplosionEffectJob>(objectJob)) {
|
||||||
|
auto modelJob = std::dynamic_pointer_cast<ModelJob>(objectJob);
|
||||||
|
|
||||||
|
if (!modelJob->Shadow) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
||||||
|
glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a);
|
||||||
|
|
||||||
|
if (m_TexturedShadows) {
|
||||||
|
switch (modelJob->Type) {
|
||||||
|
case RawModel::MaterialType::SingleTextures:
|
||||||
|
case RawModel::MaterialType::Basic:
|
||||||
|
{
|
||||||
|
glActiveTexture(GL_TEXTURE24);
|
||||||
|
if (modelJob->DiffuseTexture.size() > 0 && modelJob->DiffuseTexture[0]->Texture != nullptr) {
|
||||||
|
glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture[0]->Texture->m_Texture);
|
||||||
|
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(modelJob->DiffuseTexture[0]->UVRepeat));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture);
|
||||||
|
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f)));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case RawModel::MaterialType::SplatMapping:
|
||||||
|
{
|
||||||
|
glActiveTexture(GL_TEXTURE24);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture);
|
||||||
|
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f)));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glBindVertexArray(modelJob->Model->VAO);
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
||||||
|
glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int)));
|
||||||
|
|
||||||
|
GLERROR("Shadow Draw ERROR");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
state->CullFace(GL_FRONT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||||
|
m_DepthBuffer.Unbind();
|
||||||
|
delete state;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#include "Rendering/ShadowPassState.h"
|
||||||
|
|
||||||
|
ShadowPassState::ShadowPassState(GLuint frameBuffer)
|
||||||
|
{
|
||||||
|
BindFramebuffer(frameBuffer);
|
||||||
|
Enable(GL_DEPTH_TEST);
|
||||||
|
Enable(GL_CULL_FACE);
|
||||||
|
Disable(GL_BLEND);
|
||||||
|
Disable(GL_TEXTURE_2D);
|
||||||
|
CullFace(GL_FRONT);
|
||||||
|
ClearColor(glm::vec4(0.f, 0.f, 0.f, 0.f));
|
||||||
|
//Enable(GL_ALPHA_TEST);
|
||||||
|
//glAlphaFunc(GL_GREATER, 0.9f);
|
||||||
|
}
|
||||||
|
|
||||||
|
ShadowPassState::~ShadowPassState()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
@@ -321,6 +321,8 @@ Skeleton::~Skeleton()
|
|||||||
for (auto &kv : Bones) {
|
for (auto &kv : Bones) {
|
||||||
delete kv.second;
|
delete kv.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BlendTrees.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
const Skeleton::Animation* Skeleton::GetAnimation(std::string name)
|
const Skeleton::Animation* Skeleton::GetAnimation(std::string name)
|
||||||
|
|||||||
@@ -81,27 +81,18 @@ void PlayerMovementSystem::updateMovementControllers(double dt)
|
|||||||
cameraOrientation.x += controller->Rotation().x;
|
cameraOrientation.x += controller->Rotation().x;
|
||||||
// Limit camera pitch so we don't break our necks
|
// Limit camera pitch so we don't break our necks
|
||||||
cameraOrientation.x = glm::clamp(cameraOrientation.x, -glm::half_pi<float>(), glm::half_pi<float>());
|
cameraOrientation.x = glm::clamp(cameraOrientation.x, -glm::half_pi<float>(), glm::half_pi<float>());
|
||||||
|
|
||||||
// Set third person model aim pitch
|
// Set third person model aim pitch
|
||||||
EntityWrapper playerModel = player.FirstChildByName("PlayerModel");
|
EntityWrapper playerModel = player.FirstChildByName("PlayerModel");
|
||||||
|
|
||||||
//Third-person aim
|
|
||||||
if (playerModel.Valid()) {
|
if (playerModel.Valid()) {
|
||||||
EntityWrapper aimPrimaryEntity = playerModel.FirstChildByName("AimPrimary");
|
EntityWrapper aimPrimaryEntity = playerModel.FirstChildByName("Aim");
|
||||||
if(aimPrimaryEntity.Valid()){
|
if(aimPrimaryEntity.Valid()){
|
||||||
if(aimPrimaryEntity.HasComponent("Animation")) {
|
if(aimPrimaryEntity.HasComponent("Animation")) {
|
||||||
float pitch = cameraOrientation.x + 0.2f;
|
float pitch = cameraOrientation.x;
|
||||||
double time = (pitch + glm::half_pi<float>()) / glm::pi<float>();
|
double time = ((pitch + glm::half_pi<float>()) / glm::pi<float>());
|
||||||
(double&)aimPrimaryEntity["Animation"]["Time"] = time;
|
(double&)aimPrimaryEntity["Animation"]["Time"] = time;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EntityWrapper aimSecondaryEntity = playerModel.FirstChildByName("AimSecondary");
|
|
||||||
if (aimSecondaryEntity.Valid()) {
|
|
||||||
if (aimSecondaryEntity.HasComponent("Animation")) {
|
|
||||||
float pitch = cameraOrientation.x + 0.2f;
|
|
||||||
double time = (pitch + glm::half_pi<float>()) / glm::pi<float>();
|
|
||||||
(double&)aimSecondaryEntity["Animation"]["Time"] = time;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,7 +204,7 @@ void PlayerMovementSystem::updateMovementControllers(double dt)
|
|||||||
{
|
{
|
||||||
Events::AutoAnimationBlend aeb;
|
Events::AutoAnimationBlend aeb;
|
||||||
aeb.Duration = 0.25;
|
aeb.Duration = 0.25;
|
||||||
aeb.NodeName = "StandCrouchBlend";
|
aeb.NodeName = "MovementBlend";
|
||||||
aeb.RootNode = playerModel;
|
aeb.RootNode = playerModel;
|
||||||
aeb.Start = true;
|
aeb.Start = true;
|
||||||
aeb.Restart = false;
|
aeb.Restart = false;
|
||||||
@@ -244,11 +235,11 @@ void PlayerMovementSystem::updateMovementControllers(double dt)
|
|||||||
{
|
{
|
||||||
Events::AutoAnimationBlend aeb;
|
Events::AutoAnimationBlend aeb;
|
||||||
aeb.Duration = 0.25;
|
aeb.Duration = 0.25;
|
||||||
aeb.NodeName = "StandCrouchBlend";
|
aeb.NodeName = "MovementBlend";
|
||||||
aeb.RootNode = playerModel;
|
aeb.RootNode = playerModel;
|
||||||
aeb.Start = true;
|
aeb.Start = true;
|
||||||
aeb.Restart = false;
|
aeb.Restart = false;
|
||||||
aeb.AnimationEntity = playerModel.FirstChildByName("Jump");
|
aeb.AnimationEntity = playerModel.FirstChildByName("BlendTreeLower").FirstChildByName("Jump");
|
||||||
m_EventBroker->Publish(aeb);
|
m_EventBroker->Publish(aeb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -382,12 +373,12 @@ void PlayerMovementSystem::spawnHexagon(EntityWrapper target)
|
|||||||
bool PlayerMovementSystem::OnDashAbility(Events::DashAbility & e)
|
bool PlayerMovementSystem::OnDashAbility(Events::DashAbility & e)
|
||||||
{
|
{
|
||||||
EntityWrapper player(m_World, e.Player);
|
EntityWrapper player(m_World, e.Player);
|
||||||
if (!player.Valid() || !IsClient){// || player.ID == LocalPlayer.ID) {
|
if (!player.Valid()){// || !IsClient || player.ID == LocalPlayer.ID) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto entityFile = ResourceManager::Load<EntityFile>("Schema/Entities/DashEffect.xml");
|
// auto entityFile = ResourceManager::Load<EntityFile>("Schema/Entities/DashEffect.xml");
|
||||||
EntityWrapper dashEffect = entityFile->MergeInto(m_World);
|
// EntityWrapper dashEffect = entityFile->MergeInto(m_World);
|
||||||
EntityWrapper playerModel = player.FirstChildByName("PlayerModel");
|
EntityWrapper playerModel = player.FirstChildByName("PlayerModel");
|
||||||
|
|
||||||
for (auto& kv : m_PlayerInputControllers) {
|
for (auto& kv : m_PlayerInputControllers) {
|
||||||
@@ -405,7 +396,7 @@ bool PlayerMovementSystem::OnDashAbility(Events::DashAbility & e)
|
|||||||
if (controller->Movement().x > 0) {
|
if (controller->Movement().x > 0) {
|
||||||
{
|
{
|
||||||
Events::AutoAnimationBlend aeb;
|
Events::AutoAnimationBlend aeb;
|
||||||
aeb.Duration = 0.3;
|
aeb.Duration = 0.1;
|
||||||
aeb.NodeName = "DashRight";
|
aeb.NodeName = "DashRight";
|
||||||
aeb.RootNode = playerModel;
|
aeb.RootNode = playerModel;
|
||||||
aeb.Restart = true;
|
aeb.Restart = true;
|
||||||
@@ -414,19 +405,18 @@ bool PlayerMovementSystem::OnDashAbility(Events::DashAbility & e)
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
Events::AutoAnimationBlend aeb;
|
Events::AutoAnimationBlend aeb;
|
||||||
aeb.Duration = 0.3;
|
aeb.Duration = 0.2;
|
||||||
aeb.NodeName = "StandCrouchBlend";
|
aeb.NodeName = "MovementBlend";
|
||||||
aeb.RootNode = playerModel;
|
aeb.RootNode = playerModel;
|
||||||
aeb.Delay = -0.3;
|
|
||||||
aeb.Start = true;
|
aeb.Start = true;
|
||||||
aeb.Restart = false;
|
aeb.Restart = false;
|
||||||
aeb.AnimationEntity = playerModel.FirstChildByName("DashForward");
|
aeb.AnimationEntity = playerModel.FirstChildByName("DashRight");
|
||||||
m_EventBroker->Publish(aeb);
|
m_EventBroker->Publish(aeb);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
{
|
{
|
||||||
Events::AutoAnimationBlend aeb;
|
Events::AutoAnimationBlend aeb;
|
||||||
aeb.Duration = 0.3;
|
aeb.Duration = 0.1;
|
||||||
aeb.NodeName = "DashLeft";
|
aeb.NodeName = "DashLeft";
|
||||||
aeb.RootNode = playerModel;
|
aeb.RootNode = playerModel;
|
||||||
aeb.Restart = true;
|
aeb.Restart = true;
|
||||||
@@ -435,13 +425,12 @@ bool PlayerMovementSystem::OnDashAbility(Events::DashAbility & e)
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
Events::AutoAnimationBlend aeb;
|
Events::AutoAnimationBlend aeb;
|
||||||
aeb.Duration = 0.3;
|
aeb.Duration = 0.2;
|
||||||
aeb.NodeName = "StandCrouchBlend";
|
aeb.NodeName = "MovementBlend";
|
||||||
aeb.RootNode = playerModel;
|
aeb.RootNode = playerModel;
|
||||||
aeb.Delay = -0.3;
|
|
||||||
aeb.Start = true;
|
aeb.Start = true;
|
||||||
aeb.Restart = false;
|
aeb.Restart = false;
|
||||||
aeb.AnimationEntity = playerModel.FirstChildByName("DashForward");
|
aeb.AnimationEntity = playerModel.FirstChildByName("DashLeft");
|
||||||
m_EventBroker->Publish(aeb);
|
m_EventBroker->Publish(aeb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -449,7 +438,7 @@ bool PlayerMovementSystem::OnDashAbility(Events::DashAbility & e)
|
|||||||
if (controller->Movement().z < 0) {
|
if (controller->Movement().z < 0) {
|
||||||
{
|
{
|
||||||
Events::AutoAnimationBlend aeb;
|
Events::AutoAnimationBlend aeb;
|
||||||
aeb.Duration = 0.3;
|
aeb.Duration = 0.1;
|
||||||
aeb.NodeName = "DashForward";
|
aeb.NodeName = "DashForward";
|
||||||
aeb.RootNode = playerModel;
|
aeb.RootNode = playerModel;
|
||||||
aeb.Restart = true;
|
aeb.Restart = true;
|
||||||
@@ -458,10 +447,9 @@ bool PlayerMovementSystem::OnDashAbility(Events::DashAbility & e)
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
Events::AutoAnimationBlend aeb;
|
Events::AutoAnimationBlend aeb;
|
||||||
aeb.Duration = 0.3;
|
aeb.Duration = 0.2;
|
||||||
aeb.NodeName = "StandCrouchBlend";
|
aeb.NodeName = "MovementBlend";
|
||||||
aeb.RootNode = playerModel;
|
aeb.RootNode = playerModel;
|
||||||
aeb.Delay = -0.3;
|
|
||||||
aeb.Start = true;
|
aeb.Start = true;
|
||||||
aeb.Restart = false;
|
aeb.Restart = false;
|
||||||
aeb.AnimationEntity = playerModel.FirstChildByName("DashForward");
|
aeb.AnimationEntity = playerModel.FirstChildByName("DashForward");
|
||||||
@@ -470,7 +458,7 @@ bool PlayerMovementSystem::OnDashAbility(Events::DashAbility & e)
|
|||||||
} else {
|
} else {
|
||||||
{
|
{
|
||||||
Events::AutoAnimationBlend aeb;
|
Events::AutoAnimationBlend aeb;
|
||||||
aeb.Duration = 0.3;
|
aeb.Duration = 0.1;
|
||||||
aeb.NodeName = "DashBackward";
|
aeb.NodeName = "DashBackward";
|
||||||
aeb.RootNode = playerModel;
|
aeb.RootNode = playerModel;
|
||||||
aeb.Restart = true;
|
aeb.Restart = true;
|
||||||
@@ -479,32 +467,41 @@ bool PlayerMovementSystem::OnDashAbility(Events::DashAbility & e)
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
Events::AutoAnimationBlend aeb;
|
Events::AutoAnimationBlend aeb;
|
||||||
aeb.Duration = 0.3;
|
aeb.Duration = 0.2;
|
||||||
aeb.NodeName = "StandCrouchBlend";
|
aeb.NodeName = "MovementBlend";
|
||||||
aeb.RootNode = playerModel;
|
aeb.RootNode = playerModel;
|
||||||
aeb.Delay = -0.3;
|
|
||||||
aeb.Start = true;
|
aeb.Start = true;
|
||||||
aeb.Restart = false;
|
aeb.Restart = false;
|
||||||
aeb.AnimationEntity = playerModel.FirstChildByName("DashForward");
|
aeb.AnimationEntity = playerModel.FirstChildByName("DashBackward");
|
||||||
m_EventBroker->Publish(aeb);
|
m_EventBroker->Publish(aeb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
auto playerEntityAnimation = playerModel["Animation"];
|
EntityWrapper dashEffectModel;
|
||||||
|
dashEffectModel = playerModel.Clone();
|
||||||
playerEntityModel.Copy(dashEffect["Model"]);
|
player["Transform"].Copy(dashEffectModel["Transform"]);
|
||||||
playerEntityAnimation.Copy(dashEffect["Animation"]);
|
|
||||||
dashEffect["ExplosionEffect"]["EndColor"] = (glm::vec4)playerEntityModel["Color"];
|
|
||||||
((glm::vec4&)dashEffect["ExplosionEffect"]["EndColor"]).w = 0.f;
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
dashEffectModel.AttachComponent("ExplosionEffect");
|
||||||
|
dashEffectModel["ExplosionEffect"]["EndColor"] = (glm::vec4)playerModel["Model"]["Color"];
|
||||||
|
((glm::vec4&)dashEffectModel["ExplosionEffect"]["EndColor"]).w = 0.f;
|
||||||
|
(double&)dashEffectModel["ExplosionEffect"]["ExplosionDuration"] = dashEffect["Lifetime"]["Lifetime"];
|
||||||
|
(glm::vec3&)dashEffectModel["ExplosionEffect"]["ExplosionOrigin"] = glm::vec3(0, 1, 0) + (0.2f * controller->Movement());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
auto animationChildren = dashEffectModel.ChildrenWithComponent("Animation");
|
||||||
|
|
||||||
|
for (auto animationEntity : animationChildren) {
|
||||||
|
(bool&)animationEntity["Animation"]["Play"] = false;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -208,18 +208,6 @@ bool PlayerSpawnSystem::OnPlayerSpawned(Events::PlayerSpawned& e)
|
|||||||
m_EventBroker->Publish(lock);
|
m_EventBroker->Publish(lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
// HACK: Set the player model color to team color
|
|
||||||
EntityWrapper playerModel = e.Player.FirstChildByName("PlayerModel");
|
|
||||||
if (playerModel.Valid() && e.Player.HasComponent("Team")) {
|
|
||||||
ComponentWrapper cTeam = e.Player["Team"];
|
|
||||||
ComponentWrapper cModel = playerModel["Model"];
|
|
||||||
if ((ComponentInfo::EnumType)cTeam["Team"] == cTeam["Team"].Enum("Red")) {
|
|
||||||
cModel["Color"] = glm::vec3(1.f, 0.f, 0.f);
|
|
||||||
} else if ((ComponentInfo::EnumType)cTeam["Team"] == cTeam["Team"].Enum("Blue")) {
|
|
||||||
cModel["Color"] = glm::vec3(0.f, 0.25f, 1.f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -133,11 +133,6 @@ void AssaultWeaponBehaviour::OnReload(ComponentWrapper cWeapon, WeaponInfo& wi)
|
|||||||
b1.Restart = true;
|
b1.Restart = true;
|
||||||
b1.Start = true;
|
b1.Start = true;
|
||||||
m_EventBroker->Publish(b1);
|
m_EventBroker->Publish(b1);
|
||||||
Events::AutoAnimationBlend b2;
|
|
||||||
b2.RootNode = wi.ThirdPersonPlayerModel;
|
|
||||||
b2.NodeName = "MovementBlend";
|
|
||||||
b2.AnimationEntity = wi.ThirdPersonPlayerModel.FirstChildByName("AssaultWeaponBlend").FirstChildByName("Reload");
|
|
||||||
m_EventBroker->Publish(b2);
|
|
||||||
|
|
||||||
// Spawn explosion effect
|
// Spawn explosion effect
|
||||||
if (wi.FirstPersonEntity.Valid()) {
|
if (wi.FirstPersonEntity.Valid()) {
|
||||||
@@ -247,6 +242,7 @@ void AssaultWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi
|
|||||||
|
|
||||||
// Play animation
|
// Play animation
|
||||||
playAnimationAndReturn(wi.FirstPersonEntity, "ActionBlend", "Fire");
|
playAnimationAndReturn(wi.FirstPersonEntity, "ActionBlend", "Fire");
|
||||||
|
|
||||||
// Third person anim
|
// Third person anim
|
||||||
Events::AutoAnimationBlend b1;
|
Events::AutoAnimationBlend b1;
|
||||||
b1.RootNode = wi.ThirdPersonPlayerModel;
|
b1.RootNode = wi.ThirdPersonPlayerModel;
|
||||||
@@ -254,11 +250,6 @@ void AssaultWeaponBehaviour::fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi
|
|||||||
b1.Restart = true;
|
b1.Restart = true;
|
||||||
b1.Start = true;
|
b1.Start = true;
|
||||||
m_EventBroker->Publish(b1);
|
m_EventBroker->Publish(b1);
|
||||||
Events::AutoAnimationBlend b2;
|
|
||||||
b2.RootNode = wi.ThirdPersonPlayerModel;
|
|
||||||
b2.NodeName = "MovementBlend";
|
|
||||||
b2.AnimationEntity = wi.ThirdPersonPlayerModel.FirstChildByName("AssaultWeaponBlend").FirstChildByName("Fire");
|
|
||||||
m_EventBroker->Publish(b2);
|
|
||||||
|
|
||||||
// Sound
|
// Sound
|
||||||
Events::PlaySoundOnEntity e;
|
Events::PlaySoundOnEntity e;
|
||||||
|
|||||||
Reference in New Issue
Block a user