Merge branch 'master' into DashEffect
This commit is contained in:
+1
-1
Submodule assets updated: 6ffc1ab82a...2c75d24ddf
@@ -2,8 +2,11 @@
|
|||||||
#define PerformanceTimer_h__
|
#define PerformanceTimer_h__
|
||||||
|
|
||||||
#include "../Common.h"
|
#include "../Common.h"
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
#include <boost/timer/timer.hpp>
|
#include <boost/timer/timer.hpp>
|
||||||
using boost::timer::cpu_timer;
|
using boost::timer::cpu_timer;
|
||||||
|
#endif //DEBUG
|
||||||
|
|
||||||
class PerformanceTimer
|
class PerformanceTimer
|
||||||
{
|
{
|
||||||
@@ -17,9 +20,11 @@ public:
|
|||||||
static void CreateExcelData();
|
static void CreateExcelData();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
#ifdef DEBUG
|
||||||
static std::map<std::string, cpu_timer> timers;
|
static std::map<std::string, cpu_timer> timers;
|
||||||
static cpu_timer m_Timer;
|
static cpu_timer m_Timer;
|
||||||
static std::string currentTimerRunning;
|
static std::string currentTimerRunning;
|
||||||
|
#endif //DEBUG
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -212,6 +212,33 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
|
|||||||
m_EventBroker->Publish(aeb);
|
m_EventBroker->Publish(aeb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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.SingleLevelBlend = true;
|
||||||
|
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.SingleLevelBlend = true;
|
||||||
|
aeb.Start = true;
|
||||||
|
aeb.Reverse = true;
|
||||||
|
m_EventBroker->Publish(aeb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,31 +10,32 @@
|
|||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
#include <boost/shared_array.hpp>
|
#include <boost/shared_array.hpp>
|
||||||
|
|
||||||
#include "Network/Network.h"
|
|
||||||
#include "Network/MessageType.h"
|
|
||||||
#include "Network/PlayerDefinition.h"
|
|
||||||
#include "Network/UDPClient.h"
|
|
||||||
#include "Network/TCPClient.h"
|
|
||||||
#include "Network/SnapshotDefinitions.h"
|
|
||||||
#include "Network/EKillDeath.h"
|
#include "Network/EKillDeath.h"
|
||||||
#include "Core/World.h"
|
#include "Core/World.h"
|
||||||
#include "Core/EntityFile.h"
|
#include "Core/EntityFile.h"
|
||||||
#include "Core/EventBroker.h"
|
#include "Core/EventBroker.h"
|
||||||
#include "Core/ConfigFile.h"
|
#include "Core/ConfigFile.h"
|
||||||
#include "Core/EPlayerDeath.h"
|
#include "Core/EPlayerDeath.h"
|
||||||
#include "Input/EInputCommand.h"
|
|
||||||
#include "Core/EPlayerDamage.h"
|
#include "Core/EPlayerDamage.h"
|
||||||
#include "../Game/Events/EDoubleJump.h"
|
|
||||||
#include "Network/EInterpolate.h"
|
|
||||||
#include "Network/SnapshotFilter.h"
|
|
||||||
#include "Core/EPlayerSpawned.h"
|
#include "Core/EPlayerSpawned.h"
|
||||||
#include "Core/EAmmoPickup.h"
|
#include "Core/EAmmoPickup.h"
|
||||||
#include "Network/ESearchForServers.h"
|
#include "Game/Events/EDoubleJump.h"
|
||||||
#include "../Game/Events/EDashAbility.h"
|
#include "Game/Events/EDashAbility.h"
|
||||||
|
#include "Game/Events/EReset.h"
|
||||||
|
#include "Input/EInputCommand.h"
|
||||||
|
#include "imgui/imgui.h"
|
||||||
|
#include "Network/Network.h"
|
||||||
|
#include "Network/MessageType.h"
|
||||||
|
#include "Network/PlayerDefinition.h"
|
||||||
|
#include "Network/UDPClient.h"
|
||||||
|
#include "Network/TCPClient.h"
|
||||||
|
#include "Network/SnapshotDefinitions.h"
|
||||||
#include "Network/EDisplayServerlist.h"
|
#include "Network/EDisplayServerlist.h"
|
||||||
#include "Network/EConnectRequest.h"
|
#include "Network/EConnectRequest.h"
|
||||||
#include "Network/EPlayerDisconnected.h"
|
#include "Network/EPlayerDisconnected.h"
|
||||||
#include "Game/Events/EReset.h"
|
#include "Network/ESearchForServers.h"
|
||||||
|
#include "Network/EInterpolate.h"
|
||||||
|
#include "Network/SnapshotFilter.h"
|
||||||
|
|
||||||
class Client : public Network
|
class Client : public Network
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
class DrawFinalPass
|
class DrawFinalPass
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass);
|
DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass, ConfigFile* config);
|
||||||
~DrawFinalPass();
|
~DrawFinalPass();
|
||||||
void InitializeTextures();
|
void InitializeTextures();
|
||||||
void InitializeFrameBuffers();
|
void InitializeFrameBuffers();
|
||||||
@@ -25,17 +25,77 @@ public:
|
|||||||
void Draw(RenderScene& scene, BlurHUD* blurHUDPass);
|
void Draw(RenderScene& scene, BlurHUD* blurHUDPass);
|
||||||
void ClearBuffer();
|
void ClearBuffer();
|
||||||
void OnWindowResize();
|
void OnWindowResize();
|
||||||
|
void setMSAA(unsigned int numberOfSamples);
|
||||||
|
|
||||||
//Return the texture that is used in later stages to apply the bloom effect
|
//Return the texture that is used in later stages to apply the bloom effect
|
||||||
GLuint BloomTexture() const { return m_BloomTexture; }
|
GLuint BloomTexture() {
|
||||||
|
if (m_MSAA){
|
||||||
|
m_AntiAliasedFrameBuffer->Bind();
|
||||||
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
m_AntiAliasedFrameBuffer->Unbind();
|
||||||
|
m_FinalPassFrameBuffer->Read();
|
||||||
|
glReadBuffer(GL_COLOR_ATTACHMENT1);
|
||||||
|
m_AntiAliasedFrameBuffer->Draw();
|
||||||
|
glBlitFramebuffer(
|
||||||
|
0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height,
|
||||||
|
0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height,
|
||||||
|
GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||||
|
return m_AntiAliasedTexture;
|
||||||
|
}
|
||||||
|
return m_BloomTexture; }
|
||||||
//Return the texture with diffuse and lighting of the scene.
|
//Return the texture with diffuse and lighting of the scene.
|
||||||
GLuint SceneTexture() const { return m_SceneTexture; }
|
GLuint DrawFinalPass::SceneTexture() {
|
||||||
|
if (m_MSAA) {
|
||||||
|
m_AntiAliasedFrameBuffer->Bind();
|
||||||
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
m_AntiAliasedFrameBuffer->Unbind();
|
||||||
|
m_FinalPassFrameBuffer->Read();
|
||||||
|
glReadBuffer(GL_COLOR_ATTACHMENT0);
|
||||||
|
m_AntiAliasedFrameBuffer->Draw();
|
||||||
|
glBlitFramebuffer(
|
||||||
|
0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height,
|
||||||
|
0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height,
|
||||||
|
GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||||
|
return m_AntiAliasedTexture;
|
||||||
|
}
|
||||||
|
return m_SceneTexture;
|
||||||
|
}
|
||||||
//Return the SceneTexture with the blurred HUD bits.
|
//Return the SceneTexture with the blurred HUD bits.
|
||||||
GLuint CombinedSceneTexture() const { return m_CombinedTexture; }
|
GLuint CombinedSceneTexture() {
|
||||||
|
if (m_MSAA) {
|
||||||
|
m_AntiAliasedFrameBuffer->Bind();
|
||||||
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
m_AntiAliasedFrameBuffer->Unbind();
|
||||||
|
m_FinalPassFrameBuffer->Read();
|
||||||
|
m_AntiAliasedFrameBuffer->Draw();
|
||||||
|
glBlitFramebuffer(
|
||||||
|
0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height,
|
||||||
|
0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height,
|
||||||
|
GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||||
|
return m_AntiAliasedTexture;
|
||||||
|
}
|
||||||
|
return m_CombinedTexture; }
|
||||||
//Return the blurred scene texture.
|
//Return the blurred scene texture.
|
||||||
GLuint FullBlurredTexture() const { return m_FullBlurredTexture; }
|
GLuint FullBlurredTexture() {
|
||||||
|
if (m_MSAA) {
|
||||||
|
m_AntiAliasedFrameBuffer->Bind();
|
||||||
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
m_AntiAliasedFrameBuffer->Unbind();
|
||||||
|
m_FinalPassFrameBuffer->Read();
|
||||||
|
m_AntiAliasedFrameBuffer->Draw();
|
||||||
|
glBlitFramebuffer(
|
||||||
|
0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height,
|
||||||
|
0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height,
|
||||||
|
GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||||
|
return m_AntiAliasedTexture;
|
||||||
|
}
|
||||||
|
return m_FullBlurredTexture; }
|
||||||
//Return the framebuffer used in the scene rendering stage.
|
//Return the framebuffer used in the scene rendering stage.
|
||||||
FrameBuffer* FinalPassFrameBuffer() { return &m_FinalPassFrameBuffer; }
|
FrameBuffer* FinalPassFrameBuffer() { return m_FinalPassFrameBuffer; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void DrawSprites(std::list<std::shared_ptr<RenderJob>>&jobs, RenderScene& scene);
|
void DrawSprites(std::list<std::shared_ptr<RenderJob>>&jobs, RenderScene& scene);
|
||||||
@@ -56,18 +116,21 @@ private:
|
|||||||
Texture* m_GreyTexture;
|
Texture* m_GreyTexture;
|
||||||
Texture* m_ErrorTexture;
|
Texture* m_ErrorTexture;
|
||||||
|
|
||||||
FrameBuffer m_FinalPassFrameBuffer;
|
FrameBuffer* m_FinalPassFrameBuffer = nullptr;
|
||||||
FrameBuffer m_ShieldDepthFrameBuffer;
|
FrameBuffer* m_ShieldDepthFrameBuffer = nullptr;
|
||||||
|
FrameBuffer* m_AntiAliasedFrameBuffer = nullptr;
|
||||||
GLuint m_BloomTexture = 0;
|
GLuint m_BloomTexture = 0;
|
||||||
GLuint m_SceneTexture = 0;
|
GLuint m_SceneTexture = 0;
|
||||||
GLuint m_DepthBuffer = 0;
|
GLuint m_DepthBuffer = 0;
|
||||||
GLuint m_ShieldBuffer = 0;
|
GLuint m_ShieldBuffer = 0;
|
||||||
GLuint m_CubeMapTexture = 0;
|
GLuint m_CubeMapTexture = 0;
|
||||||
GLuint m_FullBlurredTexture;
|
GLuint m_FullBlurredTexture = 0;
|
||||||
GLuint m_CombinedTexture; //This can be removed for less memory usage, just set m_sceneTexture to the return from m_BlurHUDPass.CombineTextures
|
GLuint m_CombinedTexture = 0; //This can be removed for less memory usage, just set m_sceneTexture to the return from m_BlurHUDPass.CombineTextures
|
||||||
|
GLuint m_AntiAliasedTexture = 0; //Is only used when MSAA is active;
|
||||||
|
|
||||||
//maqke this component based i guess?
|
//maqke this component based i guess?
|
||||||
GLuint m_ShieldPixelRate = 16;
|
GLuint m_ShieldPixelRate = 16;
|
||||||
|
unsigned int m_MSAA = 0;
|
||||||
|
|
||||||
const IRenderer* m_Renderer;
|
const IRenderer* m_Renderer;
|
||||||
const LightCullingPass* m_LightCullingPass;
|
const LightCullingPass* m_LightCullingPass;
|
||||||
|
|||||||
@@ -7,12 +7,13 @@
|
|||||||
class BufferResource
|
class BufferResource
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment, GLuint mipMapLod);
|
BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment, GLuint mipMapLod, bool multiSampling);
|
||||||
|
|
||||||
GLuint* m_ResourceHandle;
|
GLuint* m_ResourceHandle;
|
||||||
GLenum m_ResourceType;
|
GLenum m_ResourceType;
|
||||||
GLenum m_Attachment;
|
GLenum m_Attachment;
|
||||||
GLuint m_MipMapLod = 0;
|
GLuint m_MipMapLod = 0;
|
||||||
|
bool m_MultiSampling = false;
|
||||||
private:
|
private:
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -21,24 +22,33 @@ template <GLenum RESOURCETYPE>
|
|||||||
class ResourceType : public BufferResource
|
class ResourceType : public BufferResource
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ResourceType(GLuint* resourceHandle, GLenum attachment, GLuint mipMapLod)
|
ResourceType(GLuint* resourceHandle, GLenum attachment, GLuint mipMapLod, bool multiSampling)
|
||||||
: BufferResource(resourceHandle, RESOURCETYPE, attachment, mipMapLod) { }
|
: BufferResource(resourceHandle, RESOURCETYPE, attachment, mipMapLod, multiSampling) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
class Texture2D : public ResourceType<GL_TEXTURE_2D>
|
class Texture2D : public ResourceType<GL_TEXTURE_2D>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Texture2D(GLuint* resourceHandle, GLenum attachment, GLuint mipMapLod = 0)
|
Texture2D(GLuint* resourceHandle, GLenum attachment, GLuint mipMapLod = 0)
|
||||||
: ResourceType(resourceHandle, attachment, mipMapLod) { };
|
: ResourceType(resourceHandle, attachment, mipMapLod, false) { };
|
||||||
|
|
||||||
~Texture2D();
|
~Texture2D();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Texture2DMultiSample : public ResourceType<GL_TEXTURE_2D_MULTISAMPLE>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Texture2DMultiSample(GLuint* resourceHandle, GLenum attachment, GLuint mipMapLod = 0)
|
||||||
|
: ResourceType(resourceHandle, attachment, mipMapLod, true) { };
|
||||||
|
|
||||||
|
~Texture2DMultiSample();
|
||||||
|
};
|
||||||
|
|
||||||
class RenderBuffer : public ResourceType<GL_RENDERBUFFER>
|
class RenderBuffer : public ResourceType<GL_RENDERBUFFER>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RenderBuffer(GLuint* resourceHandle, GLenum attachment)
|
RenderBuffer(GLuint* resourceHandle, GLenum attachment, bool multiSampling = false)
|
||||||
: ResourceType(resourceHandle, attachment, 0)
|
: ResourceType(resourceHandle, attachment, 0, multiSampling)
|
||||||
{ };
|
{ };
|
||||||
|
|
||||||
~RenderBuffer();
|
~RenderBuffer();
|
||||||
@@ -48,12 +58,13 @@ class Texture2DArray : public ResourceType<GL_TEXTURE_2D_ARRAY>
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Texture2DArray(GLuint* resourceHandle, GLenum attachment)
|
Texture2DArray(GLuint* resourceHandle, GLenum attachment)
|
||||||
: ResourceType(resourceHandle, attachment, 0)
|
: ResourceType(resourceHandle, attachment, 0, false)
|
||||||
{ };
|
{ };
|
||||||
|
|
||||||
~Texture2DArray();
|
~Texture2DArray();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class FrameBuffer
|
class FrameBuffer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -65,9 +76,13 @@ public:
|
|||||||
void Generate();
|
void Generate();
|
||||||
void Bind();
|
void Bind();
|
||||||
void Unbind();
|
void Unbind();
|
||||||
|
void Read();
|
||||||
|
void Draw();
|
||||||
GLuint GetHandle();
|
GLuint GetHandle();
|
||||||
|
bool MultiSampling() { return m_MultiSampling; };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool m_MultiSampling = true;
|
||||||
GLuint m_BufferHandle;
|
GLuint m_BufferHandle;
|
||||||
std::vector<std::shared_ptr<BufferResource>> m_Resources;
|
std::vector<std::shared_ptr<BufferResource>> m_Resources;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -104,12 +104,17 @@ struct ModelJob : RenderJob
|
|||||||
FillPercentage = fillPercentage;
|
FillPercentage = fillPercentage;
|
||||||
IsShielded = isShielded;
|
IsShielded = isShielded;
|
||||||
|
|
||||||
|
|
||||||
|
if (world->HasComponent(Entity, "Unpickable")) {
|
||||||
|
NotPickable = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (model->IsSkinned()) {
|
if (model->IsSkinned()) {
|
||||||
Skeleton = Model->m_RawModel->m_Skeleton;
|
Skeleton = Model->m_RawModel->m_Skeleton;
|
||||||
|
|
||||||
if (Skeleton != nullptr) {
|
if (Skeleton != nullptr) {
|
||||||
|
|
||||||
EntityWrapper entityWrapper = EntityWrapper(world, modelComponent.EntityID);
|
EntityWrapper entityWrapper = EntityWrapper(world, modelComponent.EntityID);
|
||||||
|
|
||||||
|
|
||||||
if(Skeleton->BlendTrees.find(entityWrapper) != Skeleton->BlendTrees.end()) {
|
if(Skeleton->BlendTrees.find(entityWrapper) != Skeleton->BlendTrees.end()) {
|
||||||
BlendTree = Skeleton->BlendTrees.at(entityWrapper);
|
BlendTree = Skeleton->BlendTrees.at(entityWrapper);
|
||||||
@@ -147,6 +152,7 @@ struct ModelJob : RenderJob
|
|||||||
float FillPercentage = 0.0;
|
float FillPercentage = 0.0;
|
||||||
bool IsShielded;
|
bool IsShielded;
|
||||||
bool Shadow;
|
bool Shadow;
|
||||||
|
bool NotPickable = false;
|
||||||
|
|
||||||
void CalculateHash() override
|
void CalculateHash() override
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ private:
|
|||||||
bool m_ResizeWindow = false;
|
bool m_ResizeWindow = false;
|
||||||
int m_SSAO_Quality = 0;
|
int m_SSAO_Quality = 0;
|
||||||
int m_GLOW_Quality = 2;
|
int m_GLOW_Quality = 2;
|
||||||
|
unsigned int m_MSAA_Level = 0;
|
||||||
|
|
||||||
PickingPass* m_PickingPass;
|
PickingPass* m_PickingPass;
|
||||||
LightCullingPass* m_LightCullingPass;
|
LightCullingPass* m_LightCullingPass;
|
||||||
|
|||||||
@@ -20,11 +20,14 @@ public:
|
|||||||
, Parent(parent)
|
, Parent(parent)
|
||||||
, Name(name)
|
, Name(name)
|
||||||
, OffsetMatrix(offsetMatrix)
|
, OffsetMatrix(offsetMatrix)
|
||||||
{ }
|
{
|
||||||
|
BindTransformMatrix = glm::inverse(offsetMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
std::string Name;
|
std::string Name;
|
||||||
glm::mat4 OffsetMatrix;
|
glm::mat4 OffsetMatrix;
|
||||||
int ID;
|
int ID;
|
||||||
|
glm::mat4 BindTransformMatrix;
|
||||||
|
|
||||||
Bone* Parent;
|
Bone* Parent;
|
||||||
std::vector<Bone*> Children;
|
std::vector<Bone*> Children;
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ struct SpriteJob : RenderJob
|
|||||||
IncandescenceTexture = CommonFunctions::TryLoadResource<TextureSprite, true>(cSprite["GlowMap"]);
|
IncandescenceTexture = CommonFunctions::TryLoadResource<TextureSprite, true>(cSprite["GlowMap"]);
|
||||||
|
|
||||||
Linear = (bool)cSprite["Linear"];
|
Linear = (bool)cSprite["Linear"];
|
||||||
|
ClampToBorder = (bool)cSprite["ClampToBorder"];
|
||||||
|
|
||||||
StartIndex = matProp.material->StartIndex;
|
StartIndex = matProp.material->StartIndex;
|
||||||
EndIndex = matProp.material->EndIndex;
|
EndIndex = matProp.material->EndIndex;
|
||||||
@@ -93,6 +94,7 @@ struct SpriteJob : RenderJob
|
|||||||
float ScaleX = 1.f;
|
float ScaleX = 1.f;
|
||||||
float ScaleY = 1.f;
|
float ScaleY = 1.f;
|
||||||
bool Linear = false;
|
bool Linear = false;
|
||||||
|
bool ClampToBorder = false;
|
||||||
|
|
||||||
glm::vec4 FillColor = glm::vec4(0);
|
glm::vec4 FillColor = glm::vec4(0);
|
||||||
float FillPercentage = 0.0;
|
float FillPercentage = 0.0;
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ Texture* TryLoadResource(std::string path)
|
|||||||
|
|
||||||
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
|
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
|
||||||
void GenerateMultiSampleTexture(GLuint* texture, int numSamples, glm::vec2 dimensions, GLint internalFormat);
|
void GenerateMultiSampleTexture(GLuint* texture, int numSamples, glm::vec2 dimensions, GLint internalFormat);
|
||||||
void GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint format, GLenum type, GLint numMipMaps);
|
void GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type, GLint numMipMaps, GLint MAGFilter, GLint MINFilter);
|
||||||
void DeleteTexture(GLuint* texture);
|
void DeleteTexture(GLuint* texture);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#include "../Engine/Core/EPause.h"
|
#include "../Engine/Core/EPause.h"
|
||||||
#include "../Engine/Core/EComponentAttached.h"
|
#include "../Engine/Core/EComponentAttached.h"
|
||||||
#include "../Core/EPlayerSpawned.h"
|
#include "../Core/EPlayerSpawned.h"
|
||||||
|
#include "../Rendering/ESetCamera.h"
|
||||||
|
|
||||||
|
|
||||||
typedef std::pair<ALuint, std::vector<ALuint>> QueuedBuffers;
|
typedef std::pair<ALuint, std::vector<ALuint>> QueuedBuffers;
|
||||||
@@ -91,7 +92,6 @@ private:
|
|||||||
void matchBGMLoop();
|
void matchBGMLoop();
|
||||||
Source* m_CurrentBGM = nullptr;
|
Source* m_CurrentBGM = nullptr;
|
||||||
Source* m_CurrentBGMCombo = nullptr;
|
Source* m_CurrentBGMCombo = nullptr;
|
||||||
bool m_DrumLoopHasBeenStarted = false;
|
|
||||||
|
|
||||||
// Logic
|
// Logic
|
||||||
World* m_World = nullptr;
|
World* m_World = nullptr;
|
||||||
@@ -139,6 +139,8 @@ private:
|
|||||||
bool OnPlayQueueOnEntity(const Events::PlayQueueOnEntity &e);
|
bool OnPlayQueueOnEntity(const Events::PlayQueueOnEntity &e);
|
||||||
EventRelay<SoundManager, Events::ChangeBGM> m_EChangeBGM;
|
EventRelay<SoundManager, Events::ChangeBGM> m_EChangeBGM;
|
||||||
bool OnChangeBGM(const Events::ChangeBGM &e);
|
bool OnChangeBGM(const Events::ChangeBGM &e);
|
||||||
|
EventRelay<SoundManager, Events::SetCamera> m_ESetCamera;
|
||||||
|
bool OnSetCamera(const Events::SetCamera& e);
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -19,9 +19,9 @@ private:
|
|||||||
enum class PlayerClass
|
enum class PlayerClass
|
||||||
{
|
{
|
||||||
None = 0,
|
None = 0,
|
||||||
Assault,
|
Assault = 1,
|
||||||
Defender,
|
Defender = 2,
|
||||||
Sniper
|
Sniper = 2
|
||||||
};
|
};
|
||||||
struct SpawnRequest
|
struct SpawnRequest
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ public:
|
|||||||
// will try to pick a spawn location so that the spawned entity doesn't
|
// will try to pick a spawn location so that the spawned entity doesn't
|
||||||
// collide with anything that has that component and is collidable.
|
// collide with anything that has that component and is collidable.
|
||||||
static EntityWrapper Spawn(EntityWrapper spawner, EntityWrapper parent = EntityWrapper::Invalid, const std::string& dontCollideComponent = "");
|
static EntityWrapper Spawn(EntityWrapper spawner, EntityWrapper parent = EntityWrapper::Invalid, const std::string& dontCollideComponent = "");
|
||||||
|
static EntityWrapper SpawnEntityFile(const std::string& entityFilePath, EntityWrapper spawner, EntityWrapper parent = EntityWrapper::Invalid, const std::string& dontCollideComponent = "");
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EventRelay<SpawnerSystem, Events::SpawnerSpawn> m_OnSpawnerSpawn;
|
EventRelay<SpawnerSystem, Events::SpawnerSpawn> m_OnSpawnerSpawn;
|
||||||
|
|||||||
@@ -85,4 +85,7 @@ NumIterations=2
|
|||||||
NumIterations=4
|
NumIterations=4
|
||||||
|
|
||||||
[GLOW3]
|
[GLOW3]
|
||||||
NumIterations=6
|
NumIterations=6
|
||||||
|
|
||||||
|
[MSAA]
|
||||||
|
Level = 0;
|
||||||
|
|||||||
@@ -68,6 +68,7 @@
|
|||||||
<xs:include schemaLocation="Components/NetworkComponent.xsd"/>
|
<xs:include schemaLocation="Components/NetworkComponent.xsd"/>
|
||||||
<xs:include schemaLocation="Components/ServerIdentity.xsd"/>
|
<xs:include schemaLocation="Components/ServerIdentity.xsd"/>
|
||||||
<xs:include schemaLocation="Components/ServerList.xsd"/>
|
<xs:include schemaLocation="Components/ServerList.xsd"/>
|
||||||
|
<xs:include schemaLocation="Components/Unpickable.xsd"/>
|
||||||
<xs:include schemaLocation="Components/ConfigBtnResolution.xsd"/>
|
<xs:include schemaLocation="Components/ConfigBtnResolution.xsd"/>
|
||||||
<xs:include schemaLocation="Components/ConfigBtnFloat.xsd"/>
|
<xs:include schemaLocation="Components/ConfigBtnFloat.xsd"/>
|
||||||
<xs:include schemaLocation="Components/EndScreen.xsd"/>
|
<xs:include schemaLocation="Components/EndScreen.xsd"/>
|
||||||
|
|||||||
@@ -1,2 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
<PlayerSpawn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PlayerSpawn.xsd"/>
|
<PlayerSpawn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="PlayerSpawn.xsd">
|
||||||
|
<AssaultFile>Schema/Entities/PlayerAssaultBlue.xml</AssaultFile>
|
||||||
|
<DefenderFile>Schema/Entities/PlayerDefenderBlue.xml</DefenderFile>
|
||||||
|
<SniperFile></SniperFile>
|
||||||
|
</PlayerSpawn>
|
||||||
@@ -7,5 +7,12 @@
|
|||||||
<xs:annotation>
|
<xs:annotation>
|
||||||
<xs:documentation>Combined with a Spawner and a Team component, defines a spawn point for a player team.</xs:documentation>
|
<xs:documentation>Combined with a Spawner and a Team component, defines a spawn point for a player team.</xs:documentation>
|
||||||
</xs:annotation>
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:all>
|
||||||
|
<xs:element name="AssaultFile" type="t:string" minOccurs="0"/>
|
||||||
|
<xs:element name="DefenderFile" type="t:string" minOccurs="0"/>
|
||||||
|
<xs:element name="SniperFile" type="t:string" minOccurs="0"/>
|
||||||
|
</xs:all>
|
||||||
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
</xs:schema>
|
</xs:schema>
|
||||||
|
|||||||
@@ -10,5 +10,6 @@
|
|||||||
<KeepRatioY>false</KeepRatioY>
|
<KeepRatioY>false</KeepRatioY>
|
||||||
<KeepRatio>false</KeepRatio>
|
<KeepRatio>false</KeepRatio>
|
||||||
<Linear>true</Linear>
|
<Linear>true</Linear>
|
||||||
|
<ClampToBorder>false</ClampToBorder>
|
||||||
<BlurBackground>false</BlurBackground>
|
<BlurBackground>false</BlurBackground>
|
||||||
</Sprite>
|
</Sprite>
|
||||||
|
|||||||
@@ -39,6 +39,9 @@
|
|||||||
<xs:element name="Linear" type="t:bool" minOccurs="0">
|
<xs:element name="Linear" type="t:bool" minOccurs="0">
|
||||||
<xs:annotation><xs:documentation>If it should use Linear or Nearest sampling method.</xs:documentation></xs:annotation>
|
<xs:annotation><xs:documentation>If it should use Linear or Nearest sampling method.</xs:documentation></xs:annotation>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
|
<xs:element name="ClampToBorder" type="t:bool" minOccurs="0">
|
||||||
|
<xs:annotation><xs:documentation>If it should clamp to border or repeat the texture.</xs:documentation></xs:annotation>
|
||||||
|
</xs:element>
|
||||||
<xs:element name="BlurBackground" type="t:bool" minOccurs="0">
|
<xs:element name="BlurBackground" type="t:bool" minOccurs="0">
|
||||||
<xs:annotation><xs:documentation>Wether the background should be blurred begind this sprite.</xs:documentation></xs:annotation>
|
<xs:annotation><xs:documentation>Wether the background should be blurred begind this sprite.</xs:documentation></xs:annotation>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<Unpickable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Unpickable.xsd">
|
||||||
|
</Unpickable>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
|
||||||
|
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
|
||||||
|
|
||||||
|
<xs:element name="Unpickable">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>Makes the entity unpickable</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:element>
|
||||||
|
</xs:schema>
|
||||||
+10216
-10071
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -2,18 +2,58 @@
|
|||||||
<Entity name="ScoreBoard_Main_Origin" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
<Entity name="ScoreBoard_Main_Origin" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||||
|
|
||||||
<Components>
|
<Components>
|
||||||
<c:Transform/>
|
<c:NetworkComponent/>
|
||||||
|
<c:Transform>
|
||||||
|
<Orientation X="0" Y="4.71199989" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
</Components>
|
</Components>
|
||||||
|
|
||||||
<Children>
|
<Children>
|
||||||
|
<Entity name="Spawner_2">
|
||||||
|
<Components>
|
||||||
|
<c:Spawner>
|
||||||
|
<EntityFile>Schema/Entities/ScoreBoard_Red.xml</EntityFile>
|
||||||
|
</c:Spawner>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-16.5" Y="0" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="Background_Main">
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<GlowIntensity>0.80000019073486328</GlowIntensity>
|
||||||
|
<Resource>Models/Props/ScoreBoard/Scoreboard.mesh</Resource>
|
||||||
|
<Shadow>false</Shadow>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Orientation X="0" Y="3.13400006" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
<Entity name="Background_Spectator">
|
<Entity name="Background_Spectator">
|
||||||
<Components>
|
<Components>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/Core/UnitCube.mesh</Resource>
|
<GlowIntensity>0.70000028610229492</GlowIntensity>
|
||||||
|
<Resource>Models/Props/ScoreBoard/Spectatorboard.mesh</Resource>
|
||||||
|
<Shadow>false</Shadow>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="0" Y="-19" Z="0"/>
|
<Position X="0" Y="-19" Z="0"/>
|
||||||
<Scale X="30" Y="12" Z="1"/>
|
<Orientation X="0" Y="3.13300014" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity name="Spawner_1">
|
||||||
|
<Components>
|
||||||
|
<c:Spawner>
|
||||||
|
<EntityFile>Schema/Entities/ScoreBoard_Blue.xml</EntityFile>
|
||||||
|
</c:Spawner>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="16.5" Y="0" Z="0"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
</Components>
|
</Components>
|
||||||
<Children/>
|
<Children/>
|
||||||
@@ -30,48 +70,6 @@
|
|||||||
</Components>
|
</Components>
|
||||||
<Children/>
|
<Children/>
|
||||||
</Entity>
|
</Entity>
|
||||||
<Entity name="Background_Main">
|
|
||||||
<Components>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Core/UnitCube.mesh</Resource>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
|
||||||
<Scale X="69" Y="25" Z="1"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
<Entity name="Spawner_1">
|
|
||||||
<Components>
|
|
||||||
<c:Spawner>
|
|
||||||
<EntityFile>Schema/Entities/ScoreBoard_Red.xml</EntityFile>
|
|
||||||
</c:Spawner>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="16.5" Y="0" Z="0"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
<Entity name="Spawner_2">
|
|
||||||
<Components>
|
|
||||||
<c:Spawner>
|
|
||||||
<EntityFile>Schema/Entities/ScoreBoard_Blue.xml</EntityFile>
|
|
||||||
</c:Spawner>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="-16.5" Y="0" Z="0"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
<Entity name="EndScreenCameraSpawner">
|
|
||||||
<Components>
|
|
||||||
<c:Spawner>
|
|
||||||
<EntityFile>Schema/Entities/EndScreen.xml</EntityFile>
|
|
||||||
</c:Spawner>
|
|
||||||
<c:Transform/>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
</Children>
|
||||||
|
|
||||||
</Entity>
|
</Entity>
|
||||||
|
|||||||
@@ -150,12 +150,13 @@
|
|||||||
<Components>
|
<Components>
|
||||||
<c:BoneAttachment>
|
<c:BoneAttachment>
|
||||||
<BoneName>R_Ammo_Joint</BoneName>
|
<BoneName>R_Ammo_Joint</BoneName>
|
||||||
|
<ScaleOffset X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||||
<InheritScale>true</InheritScale>
|
<InheritScale>true</InheritScale>
|
||||||
</c:BoneAttachment>
|
</c:BoneAttachment>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="0.0540262833" Y="-0.0954347998" Z="-0.225546911"/>
|
<Position X="0.0540262833" Y="-0.0954347998" Z="-0.225546911"/>
|
||||||
<Orientation X="0.00124507793" Y="0.077417776" Z="0.00737103401"/>
|
<Orientation X="0.00124507793" Y="0.077417776" Z="0.00737103401"/>
|
||||||
<Scale X="0.5" Y="0.50000006" Z="0.499999911"/>
|
<Scale X="0.300000012" Y="0.300000042" Z="0.299999952"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
</Components>
|
</Components>
|
||||||
<Children>
|
<Children>
|
||||||
@@ -224,7 +225,7 @@
|
|||||||
<EntityFile>Schema/Entities/FriendlyBoostBlueHUD.xml</EntityFile>
|
<EntityFile>Schema/Entities/FriendlyBoostBlueHUD.xml</EntityFile>
|
||||||
</c:Spawner>
|
</c:Spawner>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="-0.000110394583" Y="-0.0960000008" Z="6.07890324e-05"/>
|
<Position X="-0.0762779638" Y="-0.04478902" Z="6.07890324e-05"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
</Components>
|
</Components>
|
||||||
<Children/>
|
<Children/>
|
||||||
|
|||||||
@@ -72,6 +72,7 @@
|
|||||||
<xs:element ref="c:ServerIdentity" minOccurs="0"/>
|
<xs:element ref="c:ServerIdentity" minOccurs="0"/>
|
||||||
<xs:element ref="c:ServerList" minOccurs="0"/>
|
<xs:element ref="c:ServerList" minOccurs="0"/>
|
||||||
<xs:element ref="c:EndScreen" minOccurs="0"/>
|
<xs:element ref="c:EndScreen" minOccurs="0"/>
|
||||||
|
<xs:element ref="c:Unpickable" minOccurs="0"/>
|
||||||
<xs:element ref="c:Fade" minOccurs="0"/>
|
<xs:element ref="c:Fade" minOccurs="0"/>
|
||||||
<xs:element ref="c:ConfigBtnResolution" minOccurs="0"/>
|
<xs:element ref="c:ConfigBtnResolution" minOccurs="0"/>
|
||||||
<xs:element ref="c:ConfigBtnFloat" minOccurs="0"/>
|
<xs:element ref="c:ConfigBtnFloat" minOccurs="0"/>
|
||||||
|
|||||||
@@ -1,14 +1,11 @@
|
|||||||
#version 430
|
#version 430
|
||||||
|
|
||||||
uniform mat4 M;
|
|
||||||
uniform mat4 V;
|
|
||||||
uniform mat4 P;
|
|
||||||
uniform vec4 Color;
|
uniform vec4 Color;
|
||||||
|
|
||||||
uniform sampler2D texture0;
|
uniform sampler2D texture0;
|
||||||
|
|
||||||
in VertexData{
|
in VertexData{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
|
vec4 ViewSpacePosition;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec2 TextureCoordinate;
|
vec2 TextureCoordinate;
|
||||||
vec4 DiffuseColor;
|
vec4 DiffuseColor;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#define MAX_SPLITS 4
|
#define MAX_SPLITS 4
|
||||||
|
|
||||||
|
uniform mat4 PVM;
|
||||||
uniform mat4 M;
|
uniform mat4 M;
|
||||||
uniform mat4 V;
|
uniform mat4 V;
|
||||||
uniform mat4 P;
|
uniform mat4 P;
|
||||||
@@ -23,6 +24,7 @@ uniform float ColorDistanceScalar;
|
|||||||
|
|
||||||
in VertexData{
|
in VertexData{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
|
vec4 ViewSpacePosition;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec3 Tangent;
|
vec3 Tangent;
|
||||||
vec3 BiTangent;
|
vec3 BiTangent;
|
||||||
@@ -34,6 +36,7 @@ in VertexData{
|
|||||||
|
|
||||||
out VertexData{
|
out VertexData{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
|
vec4 ViewSpacePosition;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec3 Tangent;
|
vec3 Tangent;
|
||||||
vec3 BiTangent;
|
vec3 BiTangent;
|
||||||
@@ -101,6 +104,7 @@ void PassThingsThrough(int index)
|
|||||||
// pass through vertex data
|
// pass through vertex data
|
||||||
Output.Normal = Input[index].Normal;
|
Output.Normal = Input[index].Normal;
|
||||||
Output.Position = Input[index].Position;
|
Output.Position = Input[index].Position;
|
||||||
|
Output.ViewSpacePosition = Input[index].ViewSpacePosition;
|
||||||
Output.TextureCoordinate = Input[index].TextureCoordinate;
|
Output.TextureCoordinate = Input[index].TextureCoordinate;
|
||||||
Output.Tangent = Input[index].Tangent;
|
Output.Tangent = Input[index].Tangent;
|
||||||
Output.BiTangent = Input[index].BiTangent;
|
Output.BiTangent = Input[index].BiTangent;
|
||||||
@@ -175,7 +179,7 @@ void main()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// convert to window space
|
// convert to window space
|
||||||
gl_Position = P * V * M * vec4(ExplodedPosition, 1.0);
|
gl_Position = PVM * vec4(ExplodedPosition, 1.0);
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
#define MIN_AMBIENT_LIGHT 0.3
|
#define MIN_AMBIENT_LIGHT 0.3
|
||||||
#define MAX_SPLITS 4
|
#define MAX_SPLITS 4
|
||||||
|
|
||||||
uniform mat4 VM;
|
|
||||||
uniform mat4 M;
|
uniform mat4 M;
|
||||||
uniform mat4 V;
|
uniform mat4 V;
|
||||||
uniform mat4 P;
|
uniform mat4 P;
|
||||||
@@ -65,6 +63,7 @@ layout (std430, binding = 4) buffer LightIndexBuffer
|
|||||||
|
|
||||||
in VertexData{
|
in VertexData{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
|
vec4 ViewSpacePosition;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec3 Tangent;
|
vec3 Tangent;
|
||||||
vec3 BiTangent;
|
vec3 BiTangent;
|
||||||
@@ -302,11 +301,10 @@ void main()
|
|||||||
vec4 diffuseTexel = texture2D(DiffuseTexture, Input.TextureCoordinate * DiffuseUVRepeat);
|
vec4 diffuseTexel = texture2D(DiffuseTexture, Input.TextureCoordinate * DiffuseUVRepeat);
|
||||||
vec4 glowTexel = texture2D(GlowMapTexture, Input.TextureCoordinate * GlowUVRepeat);
|
vec4 glowTexel = texture2D(GlowMapTexture, Input.TextureCoordinate * GlowUVRepeat);
|
||||||
vec4 specularTexel = texture2D(SpecularMapTexture, Input.TextureCoordinate * SpecularUVRepeat);
|
vec4 specularTexel = texture2D(SpecularMapTexture, Input.TextureCoordinate * SpecularUVRepeat);
|
||||||
vec4 position = VM * vec4(Input.Position, 1.0);
|
|
||||||
vec4 normal = V * CalcNormalMappedValue(Input.Normal, Input.Tangent, Input.BiTangent, Input.TextureCoordinate * NormalUVRepeat, NormalMapTexture);
|
vec4 normal = V * CalcNormalMappedValue(Input.Normal, Input.Tangent, Input.BiTangent, Input.TextureCoordinate * NormalUVRepeat, NormalMapTexture);
|
||||||
normal = normalize(normal);
|
normal = normalize(normal);
|
||||||
//vec4 normal = normalize(V * vec4(Input.Normal, 0.0));
|
//vec4 normal = normalize(V * vec4(Input.Normal, 0.0));
|
||||||
vec4 viewVec = normalize(-position);
|
vec4 viewVec = normalize(-Input.ViewSpacePosition);
|
||||||
vec3 I = normalize(vec3(M * vec4(Input.Position, 1.0)) - CameraPosition);
|
vec3 I = normalize(vec3(M * vec4(Input.Position, 1.0)) - CameraPosition);
|
||||||
vec3 R = reflect(-I, Input.Normal);
|
vec3 R = reflect(-I, Input.Normal);
|
||||||
//R = vec3(P * vec4(R, 1.0));
|
//R = vec3(P * vec4(R, 1.0));
|
||||||
@@ -333,7 +331,7 @@ void main()
|
|||||||
LightResult light_result;
|
LightResult light_result;
|
||||||
//These if statements should be removed.
|
//These if statements should be removed.
|
||||||
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, Input.ViewSpacePosition, normal, light.Falloff);
|
||||||
} else if (light.Type == 2) { //Directional
|
} else if (light.Type == 2) { //Directional
|
||||||
int DepthMapIndex = getShadowIndex(FarDistance);
|
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);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#version 430
|
#version 430
|
||||||
uniform mat4 PVM;
|
uniform mat4 PVM;
|
||||||
|
uniform mat4 VM;
|
||||||
#define MAX_SPLITS 4
|
#define MAX_SPLITS 4
|
||||||
uniform mat4 TIM;
|
uniform mat4 TIM;
|
||||||
|
|
||||||
@@ -17,6 +18,7 @@ layout(location = 4) in vec2 TextureCoords;
|
|||||||
|
|
||||||
out VertexData{
|
out VertexData{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
|
vec4 ViewSpacePosition;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec3 Tangent;
|
vec3 Tangent;
|
||||||
vec3 BiTangent;
|
vec3 BiTangent;
|
||||||
@@ -31,6 +33,7 @@ void main()
|
|||||||
gl_Position = PVM * vec4(Position, 1.0);
|
gl_Position = PVM * vec4(Position, 1.0);
|
||||||
//mat4 TIM = transpose(inverse(M));
|
//mat4 TIM = transpose(inverse(M));
|
||||||
Output.Position = Position;
|
Output.Position = Position;
|
||||||
|
Output.ViewSpacePosition = VM * vec4(Position, 1.0);
|
||||||
Output.TextureCoordinate = TextureCoords;
|
Output.TextureCoordinate = TextureCoords;
|
||||||
Output.Normal = vec3(TIM * vec4(Normal, 0.0));
|
Output.Normal = vec3(TIM * vec4(Normal, 0.0));
|
||||||
Output.Tangent = vec3(TIM * vec4(Tangent, 0.0));
|
Output.Tangent = vec3(TIM * vec4(Tangent, 0.0));
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ layout (std430, binding = 4) buffer LightIndexBuffer
|
|||||||
|
|
||||||
in VertexData{
|
in VertexData{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
|
vec4 ViewSpacePosition;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec3 Tangent;
|
vec3 Tangent;
|
||||||
vec3 BiTangent;
|
vec3 BiTangent;
|
||||||
@@ -141,11 +142,10 @@ void main()
|
|||||||
vec4 diffuseTexel = texture2D(DiffuseTexture, Input.TextureCoordinate * DiffuseUVRepeat);
|
vec4 diffuseTexel = texture2D(DiffuseTexture, Input.TextureCoordinate * DiffuseUVRepeat);
|
||||||
vec4 glowTexel = texture2D(GlowMapTexture, Input.TextureCoordinate * GlowUVRepeat);
|
vec4 glowTexel = texture2D(GlowMapTexture, Input.TextureCoordinate * GlowUVRepeat);
|
||||||
vec4 specularTexel = texture2D(SpecularMapTexture, Input.TextureCoordinate * SpecularUVRepeat);
|
vec4 specularTexel = texture2D(SpecularMapTexture, Input.TextureCoordinate * SpecularUVRepeat);
|
||||||
vec4 position = VM * vec4(Input.Position, 1.0);
|
|
||||||
vec4 normal = V * CalcNormalMappedValue(Input.Normal, Input.Tangent, Input.BiTangent, Input.TextureCoordinate * NormalUVRepeat, NormalMapTexture);
|
vec4 normal = V * CalcNormalMappedValue(Input.Normal, Input.Tangent, Input.BiTangent, Input.TextureCoordinate * NormalUVRepeat, NormalMapTexture);
|
||||||
normal = normalize(normal);
|
normal = normalize(normal);
|
||||||
//vec4 normal = normalize(V * vec4(Input.Normal, 0.0));
|
//vec4 normal = normalize(V * vec4(Input.Normal, 0.0));
|
||||||
vec4 viewVec = normalize(-position);
|
vec4 viewVec = normalize(-Input.ViewSpacePosition);
|
||||||
vec3 I = normalize(vec3(M * vec4(Input.Position, 1.0)) - CameraPosition);
|
vec3 I = normalize(vec3(M * vec4(Input.Position, 1.0)) - CameraPosition);
|
||||||
vec3 R = reflect(-I, Input.Normal);
|
vec3 R = reflect(-I, Input.Normal);
|
||||||
//R = vec3(P * vec4(R, 1.0));
|
//R = vec3(P * vec4(R, 1.0));
|
||||||
@@ -170,7 +170,7 @@ void main()
|
|||||||
LightResult light_result;
|
LightResult light_result;
|
||||||
//These if statements should be removed.
|
//These if statements should be removed.
|
||||||
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, Input.ViewSpacePosition, normal, light.Falloff);
|
||||||
} else if (light.Type == 2) { //Directional
|
} else if (light.Type == 2) { //Directional
|
||||||
light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal);
|
light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#define MAX_SPLITS 4
|
#define MAX_SPLITS 4
|
||||||
|
|
||||||
uniform mat4 PVM;
|
uniform mat4 PVM;
|
||||||
|
uniform mat4 VM;
|
||||||
uniform mat4 TIM;
|
uniform mat4 TIM;
|
||||||
uniform mat4 M;
|
uniform mat4 M;
|
||||||
uniform mat4 V;
|
uniform mat4 V;
|
||||||
@@ -21,6 +22,7 @@ layout(location = 6) in vec4 BoneWeights;
|
|||||||
|
|
||||||
out VertexData{
|
out VertexData{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
|
vec4 ViewSpacePosition;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec3 Tangent;
|
vec3 Tangent;
|
||||||
vec3 BiTangent;
|
vec3 BiTangent;
|
||||||
@@ -34,16 +36,15 @@ void main()
|
|||||||
{
|
{
|
||||||
mat4 boneTransform = mat4(1);
|
mat4 boneTransform = mat4(1);
|
||||||
|
|
||||||
if(BoneWeights[0] > 0.0f){
|
|
||||||
boneTransform = BoneWeights[0] * Bones[int(BoneIndices[0])]
|
boneTransform = BoneWeights[0] * Bones[int(BoneIndices[0])]
|
||||||
+ BoneWeights[1] * Bones[int(BoneIndices[1])]
|
+ BoneWeights[1] * Bones[int(BoneIndices[1])]
|
||||||
+ BoneWeights[2] * Bones[int(BoneIndices[2])]
|
+ BoneWeights[2] * Bones[int(BoneIndices[2])]
|
||||||
+ BoneWeights[3] * Bones[int(BoneIndices[3])];
|
+ BoneWeights[3] * Bones[int(BoneIndices[3])];
|
||||||
}
|
|
||||||
|
|
||||||
gl_Position = PVM*boneTransform * vec4(Position, 1.0);
|
gl_Position = PVM*boneTransform * vec4(Position, 1.0);
|
||||||
|
|
||||||
Output.Position = (boneTransform * vec4(Position, 1.0)).xyz;
|
Output.Position = (boneTransform * vec4(Position, 1.0)).xyz;
|
||||||
|
Output.ViewSpacePosition = VM * vec4(Position, 1.0);
|
||||||
Output.TextureCoordinate = TextureCoords;
|
Output.TextureCoordinate = TextureCoords;
|
||||||
Output.Normal = vec3(M * boneTransform * vec4(Normal, 0.0));
|
Output.Normal = vec3(M * boneTransform * vec4(Normal, 0.0));
|
||||||
Output.Tangent = vec3(M * vec4(Tangent, 0.0));
|
Output.Tangent = vec3(M * vec4(Tangent, 0.0));
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
#define MIN_AMBIENT_LIGHT 0.3
|
#define MIN_AMBIENT_LIGHT 0.3
|
||||||
#define MAX_SPLITS 4
|
#define MAX_SPLITS 4
|
||||||
|
|
||||||
uniform mat4 VM;
|
|
||||||
uniform mat4 M;
|
uniform mat4 M;
|
||||||
uniform mat4 V;
|
uniform mat4 V;
|
||||||
uniform mat4 P;
|
uniform mat4 P;
|
||||||
@@ -82,6 +80,7 @@ layout (std430, binding = 4) buffer LightIndexBuffer
|
|||||||
|
|
||||||
in VertexData{
|
in VertexData{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
|
vec4 ViewSpacePosition;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec3 Tangent;
|
vec3 Tangent;
|
||||||
vec3 BiTangent;
|
vec3 BiTangent;
|
||||||
@@ -362,13 +361,12 @@ void main()
|
|||||||
GlowUVRepeat1, GlowUVRepeat2, GlowUVRepeat3);
|
GlowUVRepeat1, GlowUVRepeat2, GlowUVRepeat3);
|
||||||
vec4 specularTexel = CalcBlendedTexel(splatTexel, SpecularMapTexture1, SpecularMapTexture2, SpecularMapTexture3,
|
vec4 specularTexel = CalcBlendedTexel(splatTexel, SpecularMapTexture1, SpecularMapTexture2, SpecularMapTexture3,
|
||||||
SpecularUVRepeat1, SpecularUVRepeat2, SpecularUVRepeat3);
|
SpecularUVRepeat1, SpecularUVRepeat2, SpecularUVRepeat3);
|
||||||
vec4 position = VM * vec4(Input.Position, 1.0);
|
|
||||||
//vec4 normal = V * CalcNormalMappedValue(Input.Normal, Input.Tangent, Input.BiTangent, Input.TextureCoordinate, SplatMapTexture);
|
//vec4 normal = V * CalcNormalMappedValue(Input.Normal, Input.Tangent, Input.BiTangent, Input.TextureCoordinate, SplatMapTexture);
|
||||||
vec4 normal = V * CalcBlendedNormal(splatTexel, NormalMapTexture1, NormalMapTexture2, NormalMapTexture3,
|
vec4 normal = V * CalcBlendedNormal(splatTexel, NormalMapTexture1, NormalMapTexture2, NormalMapTexture3,
|
||||||
NormalUVRepeat1, NormalUVRepeat2, NormalUVRepeat3);
|
NormalUVRepeat1, NormalUVRepeat2, NormalUVRepeat3);
|
||||||
normal = normalize(normal);
|
normal = normalize(normal);
|
||||||
//vec4 normal = normalize(V * vec4(Input.Normal, 0.0));
|
//vec4 normal = normalize(V * vec4(Input.Normal, 0.0));
|
||||||
vec4 viewVec = normalize(-position);
|
vec4 viewVec = normalize(-Input.ViewSpacePosition);
|
||||||
|
|
||||||
vec2 tilePos;
|
vec2 tilePos;
|
||||||
tilePos.x = int(gl_FragCoord.x/TILE_SIZE);
|
tilePos.x = int(gl_FragCoord.x/TILE_SIZE);
|
||||||
@@ -391,7 +389,7 @@ void main()
|
|||||||
LightResult light_result;
|
LightResult light_result;
|
||||||
//These if statements should be removed.
|
//These if statements should be removed.
|
||||||
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, Input.ViewSpacePosition, normal, light.Falloff);
|
||||||
} else if (light.Type == 2) { //Directional
|
} else if (light.Type == 2) { //Directional
|
||||||
int DepthMapIndex = getShadowIndex(FarDistance);
|
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);
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
#define MIN_AMBIENT_LIGHT 0.3
|
#define MIN_AMBIENT_LIGHT 0.3
|
||||||
#define MAX_SPLITS 4
|
#define MAX_SPLITS 4
|
||||||
|
|
||||||
uniform mat4 VM;
|
|
||||||
uniform mat4 M;
|
uniform mat4 M;
|
||||||
uniform mat4 V;
|
uniform mat4 V;
|
||||||
uniform mat4 P;
|
uniform mat4 P;
|
||||||
@@ -80,6 +78,7 @@ layout (std430, binding = 4) buffer LightIndexBuffer
|
|||||||
|
|
||||||
in VertexData{
|
in VertexData{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
|
vec4 ViewSpacePosition;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec3 Tangent;
|
vec3 Tangent;
|
||||||
vec3 BiTangent;
|
vec3 BiTangent;
|
||||||
@@ -193,13 +192,12 @@ void main()
|
|||||||
GlowUVRepeat1, GlowUVRepeat2, GlowUVRepeat3);
|
GlowUVRepeat1, GlowUVRepeat2, GlowUVRepeat3);
|
||||||
vec4 specularTexel = CalcBlendedTexel(splatTexel, SpecularMapTexture1, SpecularMapTexture2, SpecularMapTexture3,
|
vec4 specularTexel = CalcBlendedTexel(splatTexel, SpecularMapTexture1, SpecularMapTexture2, SpecularMapTexture3,
|
||||||
SpecularUVRepeat1, SpecularUVRepeat2, SpecularUVRepeat3);
|
SpecularUVRepeat1, SpecularUVRepeat2, SpecularUVRepeat3);
|
||||||
vec4 position = VM * vec4(Input.Position, 1.0);
|
|
||||||
//vec4 normal = V * CalcNormalMappedValue(Input.Normal, Input.Tangent, Input.BiTangent, Input.TextureCoordinate, SplatMapTexture);
|
//vec4 normal = V * CalcNormalMappedValue(Input.Normal, Input.Tangent, Input.BiTangent, Input.TextureCoordinate, SplatMapTexture);
|
||||||
vec4 normal = V * CalcBlendedNormal(splatTexel, NormalMapTexture1, NormalMapTexture2, NormalMapTexture3,
|
vec4 normal = V * CalcBlendedNormal(splatTexel, NormalMapTexture1, NormalMapTexture2, NormalMapTexture3,
|
||||||
NormalUVRepeat1, NormalUVRepeat2, NormalUVRepeat3);
|
NormalUVRepeat1, NormalUVRepeat2, NormalUVRepeat3);
|
||||||
normal = normalize(normal);
|
normal = normalize(normal);
|
||||||
//vec4 normal = normalize(V * vec4(Input.Normal, 0.0));
|
//vec4 normal = normalize(V * vec4(Input.Normal, 0.0));
|
||||||
vec4 viewVec = normalize(-position);
|
vec4 viewVec = normalize(-Input.ViewSpacePosition);
|
||||||
|
|
||||||
vec2 tilePos;
|
vec2 tilePos;
|
||||||
tilePos.x = int(gl_FragCoord.x/TILE_SIZE);
|
tilePos.x = int(gl_FragCoord.x/TILE_SIZE);
|
||||||
@@ -220,7 +218,7 @@ void main()
|
|||||||
LightResult light_result;
|
LightResult light_result;
|
||||||
//These if statements should be removed.
|
//These if statements should be removed.
|
||||||
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, Input.ViewSpacePosition, normal, light.Falloff);
|
||||||
} else if (light.Type == 2) { //Directional
|
} else if (light.Type == 2) { //Directional
|
||||||
light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal);
|
light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,12 +17,10 @@ out VertexData{
|
|||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
mat4 boneTransform = mat4(1);
|
mat4 boneTransform = mat4(1);
|
||||||
if(BoneWeights[0] > 0.0f){
|
|
||||||
boneTransform = BoneWeights[0] * Bones[int(BoneIndices[0])]
|
boneTransform = BoneWeights[0] * Bones[int(BoneIndices[0])]
|
||||||
+ BoneWeights[1] * Bones[int(BoneIndices[1])]
|
+ BoneWeights[1] * Bones[int(BoneIndices[1])]
|
||||||
+ BoneWeights[2] * Bones[int(BoneIndices[2])]
|
+ BoneWeights[2] * Bones[int(BoneIndices[2])]
|
||||||
+ BoneWeights[3] * Bones[int(BoneIndices[3])];
|
+ BoneWeights[3] * Bones[int(BoneIndices[3])];
|
||||||
}
|
|
||||||
|
|
||||||
gl_Position = PVM*boneTransform * vec4(Position, 1.0);
|
gl_Position = PVM*boneTransform * vec4(Position, 1.0);
|
||||||
Output.Position = (boneTransform * vec4(Position, 1.0)).xyz;
|
Output.Position = (boneTransform * vec4(Position, 1.0)).xyz;
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
#version 430
|
#version 430
|
||||||
|
|
||||||
uniform mat4 M;
|
uniform mat4 PVM;
|
||||||
uniform mat4 V;
|
|
||||||
uniform mat4 P;
|
|
||||||
|
|
||||||
layout (location = 0) in vec3 Position;
|
layout (location = 0) in vec3 Position;
|
||||||
layout (location = 4) in vec2 TextureCoords;
|
layout (location = 4) in vec2 TextureCoords;
|
||||||
@@ -13,6 +11,6 @@ out VertexData{
|
|||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = P * V * M * vec4(Position, 1.0);
|
gl_Position = PVM * vec4(Position, 1.0);
|
||||||
Output.TextureCoordinate = TextureCoords;
|
Output.TextureCoordinate = TextureCoords;
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
#version 430
|
#version 430
|
||||||
|
|
||||||
uniform mat4 M;
|
uniform mat4 PVM;
|
||||||
uniform mat4 V;
|
|
||||||
uniform mat4 P;
|
|
||||||
uniform mat4 Bones[100];
|
uniform mat4 Bones[100];
|
||||||
|
|
||||||
layout (location = 0) in vec3 Position;
|
layout (location = 0) in vec3 Position;
|
||||||
@@ -17,13 +15,11 @@ out VertexData{
|
|||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
mat4 boneTransform = mat4(1);
|
mat4 boneTransform = mat4(1);
|
||||||
if(BoneWeights[0] > 0.0f){
|
|
||||||
boneTransform = BoneWeights[0] * Bones[int(BoneIndices[0])]
|
boneTransform = BoneWeights[0] * Bones[int(BoneIndices[0])]
|
||||||
+ BoneWeights[1] * Bones[int(BoneIndices[1])]
|
+ BoneWeights[1] * Bones[int(BoneIndices[1])]
|
||||||
+ BoneWeights[2] * Bones[int(BoneIndices[2])]
|
+ BoneWeights[2] * Bones[int(BoneIndices[2])]
|
||||||
+ BoneWeights[3] * Bones[int(BoneIndices[3])];
|
+ BoneWeights[3] * Bones[int(BoneIndices[3])];
|
||||||
}
|
|
||||||
|
|
||||||
gl_Position = P * V * M * boneTransform * vec4(Position, 1.0);
|
gl_Position = PVM * boneTransform * vec4(Position, 1.0);
|
||||||
Output.TextureCoordinate = TextureCoords;
|
Output.TextureCoordinate = TextureCoords;
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
#include "Core/PerformanceTimer.h"
|
#include "Core/PerformanceTimer.h"
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
|
|
||||||
cpu_timer PerformanceTimer::m_Timer;
|
cpu_timer PerformanceTimer::m_Timer;
|
||||||
std::map<std::string, cpu_timer> PerformanceTimer::timers;
|
std::map<std::string, cpu_timer> PerformanceTimer::timers;
|
||||||
std::string PerformanceTimer::currentTimerRunning = "";
|
std::string PerformanceTimer::currentTimerRunning = "";
|
||||||
@@ -74,3 +77,15 @@ void PerformanceTimer::CreateExcelData()
|
|||||||
}
|
}
|
||||||
someFileStream.close();
|
someFileStream.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
void PerformanceTimer::StartTimer(std::string nameOfTimer) {};
|
||||||
|
void PerformanceTimer::StartTimerAndStopPrevious(std::string nameOfTimer) {};
|
||||||
|
void PerformanceTimer::StopTimer(std::string nameOfTimer) {};
|
||||||
|
void PerformanceTimer::SetFrameNumber(int frameNumber) {};
|
||||||
|
|
||||||
|
void PerformanceTimer::ResetAllTimers() {};
|
||||||
|
void PerformanceTimer::CreateExcelData() {};
|
||||||
|
|
||||||
|
#endif //DEBUG
|
||||||
|
|||||||
@@ -1,162 +0,0 @@
|
|||||||
#include "Core/TransformSystem.h"
|
|
||||||
|
|
||||||
std::unordered_map<EntityWrapper, glm::vec3> TransformSystem::PositionCache;
|
|
||||||
std::unordered_map<EntityWrapper, glm::quat> TransformSystem::OrientationCache;
|
|
||||||
std::unordered_map<EntityWrapper, glm::vec3> TransformSystem::ScaleCache;
|
|
||||||
std::unordered_map<EntityWrapper, glm::mat4> TransformSystem::MatrixCache;
|
|
||||||
|
|
||||||
int TransformSystem::RecalculatedPositions = 0;
|
|
||||||
int TransformSystem::RecalculatedOrientations = 0;
|
|
||||||
int TransformSystem::RecalculatedScales = 0;
|
|
||||||
|
|
||||||
TransformSystem::TransformSystem(SystemParams params)
|
|
||||||
: System(params)
|
|
||||||
{
|
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EEntityDeleted, &TransformSystem::OnEntityDeleted);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TransformSystem::OnEntityDeleted(const Events::EntityDeleted& e)
|
|
||||||
{
|
|
||||||
// Clean up deleted entity
|
|
||||||
PositionCache.erase(e.DeletedEntity);
|
|
||||||
OrientationCache.erase(e.DeletedEntity);
|
|
||||||
ScaleCache.erase(e.DeletedEntity);
|
|
||||||
MatrixCache.erase(e.DeletedEntity);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//glm::mat4 Transform::AbsoluteTransformation(EntityWrapper entity)
|
|
||||||
//{
|
|
||||||
// glm::mat4 t = glm::mat4(1.f);
|
|
||||||
//
|
|
||||||
// while (entity.Valid()) {
|
|
||||||
// t = glm::translate((const glm::vec3&)entity["Transform"]["Position"]) * glm::toMat4(glm::quat((const glm::vec3&)entity["Transform"]["Orientation"])) * glm::scale((const glm::vec3&)entity["Transform"]["Scale"]) * t;
|
|
||||||
// entity = entity.Parent();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return t;
|
|
||||||
//}
|
|
||||||
|
|
||||||
glm::vec3 TransformSystem::AbsolutePosition(World* world, EntityID entity)
|
|
||||||
{
|
|
||||||
return TransformSystem::AbsolutePosition(EntityWrapper(world, entity));
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::vec3 TransformSystem::AbsolutePosition(EntityWrapper entity)
|
|
||||||
{
|
|
||||||
if (!entity.Valid()) {
|
|
||||||
return glm::vec3();
|
|
||||||
}
|
|
||||||
|
|
||||||
auto cacheIt = PositionCache.find(entity);
|
|
||||||
ComponentWrapper cTransform = entity["Transform"];
|
|
||||||
ComponentWrapper::SubscriptProxy cTransformPosition = cTransform["Position"];
|
|
||||||
if (cacheIt != PositionCache.end() && !cTransformPosition.Dirty(DirtySetType::Transform)) {
|
|
||||||
return cacheIt->second;
|
|
||||||
} else {
|
|
||||||
EntityWrapper parent = entity.Parent();
|
|
||||||
// Calculate position
|
|
||||||
glm::vec3 position = AbsolutePosition(parent) + TransformSystem::AbsoluteOrientation(parent) * (TransformSystem::AbsoluteScale(parent) * (const glm::vec3&)cTransformPosition);
|
|
||||||
// Cache it
|
|
||||||
PositionCache[entity] = position;
|
|
||||||
RecalculatedPositions++;
|
|
||||||
// Unset dirty flag
|
|
||||||
cTransformPosition.SetDirty(DirtySetType::Transform, false);
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::vec3 TransformSystem::AbsoluteOrientationEuler(EntityWrapper entity)
|
|
||||||
{
|
|
||||||
glm::vec3 orientation;
|
|
||||||
|
|
||||||
while (entity.Valid()) {
|
|
||||||
ComponentWrapper transform = entity["Transform"];
|
|
||||||
orientation += (Field<glm::vec3>)transform["Orientation"];
|
|
||||||
entity = entity.Parent();
|
|
||||||
}
|
|
||||||
|
|
||||||
return orientation;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::quat TransformSystem::AbsoluteOrientation(World* world, EntityID entity)
|
|
||||||
{
|
|
||||||
return TransformSystem::AbsoluteOrientation(EntityWrapper(world, entity));
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::quat TransformSystem::AbsoluteOrientation(EntityWrapper entity)
|
|
||||||
{
|
|
||||||
if (!entity.Valid()) {
|
|
||||||
return glm::quat();
|
|
||||||
}
|
|
||||||
|
|
||||||
auto cacheIt = OrientationCache.find(entity);
|
|
||||||
ComponentWrapper cTransform = entity["Transform"];
|
|
||||||
ComponentWrapper::SubscriptProxy cTransformOrientation = cTransform["Orientation"];
|
|
||||||
if (cacheIt != OrientationCache.end() && !cTransformOrientation.Dirty(DirtySetType::Transform)) {
|
|
||||||
return cacheIt->second;
|
|
||||||
} else {
|
|
||||||
EntityWrapper parent = entity.Parent();
|
|
||||||
// Calculate orientation
|
|
||||||
glm::quat orientation = AbsoluteOrientation(parent) * glm::quat((const glm::vec3&)cTransformOrientation);
|
|
||||||
// Cache it
|
|
||||||
OrientationCache[entity] = orientation;
|
|
||||||
RecalculatedOrientations++;
|
|
||||||
// Unset dirty flag
|
|
||||||
cTransformOrientation.SetDirty(DirtySetType::Transform, false);
|
|
||||||
return orientation;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::vec3 TransformSystem::AbsoluteScale(World* world, EntityID entity)
|
|
||||||
{
|
|
||||||
return TransformSystem::AbsoluteScale(EntityWrapper(world, entity));
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::vec3 TransformSystem::AbsoluteScale(EntityWrapper entity)
|
|
||||||
{
|
|
||||||
if (!entity.Valid()) {
|
|
||||||
return glm::vec3(1.f);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto cacheIt = ScaleCache.find(entity);
|
|
||||||
ComponentWrapper cTransform = entity["Transform"];
|
|
||||||
ComponentWrapper::SubscriptProxy cTransformScale = cTransform["Scale"];
|
|
||||||
if (cacheIt != ScaleCache.end() && !cTransformScale.Dirty(DirtySetType::Transform)) {
|
|
||||||
return cacheIt->second;
|
|
||||||
} else {
|
|
||||||
EntityWrapper parent = entity.Parent();
|
|
||||||
// Calculate scale
|
|
||||||
glm::vec3 scale = AbsoluteScale(parent) * (const glm::vec3&)cTransformScale;
|
|
||||||
// Cache it
|
|
||||||
ScaleCache[entity] = scale;
|
|
||||||
RecalculatedPositions++;
|
|
||||||
// Unset dirty flag
|
|
||||||
cTransformScale.SetDirty(DirtySetType::Transform, false);
|
|
||||||
return scale;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::mat4 TransformSystem::ModelMatrix(EntityID entityID, World* world)
|
|
||||||
{
|
|
||||||
return ModelMatrix(EntityWrapper(world, entityID));
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::mat4 TransformSystem::ModelMatrix(EntityWrapper entity)
|
|
||||||
{
|
|
||||||
auto cacheIt = MatrixCache.find(entity);
|
|
||||||
ComponentWrapper cTransform = entity["Transform"];
|
|
||||||
bool isDirty = cTransform["Position"].Dirty(DirtySetType::Transform) || cTransform["Orientation"].Dirty(DirtySetType::Transform) || cTransform["Scale"].Dirty(DirtySetType::Transform);
|
|
||||||
if (cacheIt != MatrixCache.end() && !isDirty) {
|
|
||||||
return cacheIt->second;
|
|
||||||
} else {
|
|
||||||
glm::mat4 matrix = glm::translate(AbsolutePosition(entity)) * glm::toMat4(AbsoluteOrientation(entity)) * glm::scale(AbsoluteScale(entity));
|
|
||||||
MatrixCache[entity] = matrix;
|
|
||||||
return matrix;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::vec3 TransformSystem::TransformPoint(const glm::vec3& point, const glm::mat4& matrix)
|
|
||||||
{
|
|
||||||
return glm::vec3(matrix * glm::vec4(point.x, point.y, point.z, 1));
|
|
||||||
}
|
|
||||||
@@ -108,7 +108,15 @@ void Client::Update(double dt)
|
|||||||
|
|
||||||
hasServerTimedOut();
|
hasServerTimedOut();
|
||||||
}
|
}
|
||||||
//Network::Update();
|
|
||||||
|
if (ImGui::BeginPopupModal("Disconnected", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) {
|
||||||
|
ImGui::Text("You have been disconnected from server.\n\n");
|
||||||
|
ImGui::SetCursorPosX(ImGui::GetContentRegionAvailWidth() - 120);
|
||||||
|
if (ImGui::Button("OK", ImVec2(120, 0))) {
|
||||||
|
ImGui::CloseCurrentPopup();
|
||||||
|
}
|
||||||
|
ImGui::EndPopup();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::parseMessageType(Packet& packet)
|
void Client::parseMessageType(Packet& packet)
|
||||||
@@ -199,7 +207,7 @@ void Client::parseTCPConnect(Packet& packet)
|
|||||||
packet.WritePrimitive(m_PlayerID);
|
packet.WritePrimitive(m_PlayerID);
|
||||||
m_Unreliable.Send(packet);
|
m_Unreliable.Send(packet);
|
||||||
|
|
||||||
// LOG_INFO("Sent UDP Connect Server");
|
// LOG_INFO("Sent UDP Connect Server");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::parsePlayerConnected(Packet & packet)
|
void Client::parsePlayerConnected(Packet & packet)
|
||||||
@@ -695,6 +703,7 @@ void Client::hasServerTimedOut()
|
|||||||
if (timeSincePing > m_TimeoutMs) {
|
if (timeSincePing > m_TimeoutMs) {
|
||||||
// Clear everything and go to menu.
|
// Clear everything and go to menu.
|
||||||
LOG_INFO("Server has timed out, returning to menu, Beep Boop.");
|
LOG_INFO("Server has timed out, returning to menu, Beep Boop.");
|
||||||
|
ImGui::OpenPopup("Disconnected");
|
||||||
disconnect();
|
disconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,13 +68,13 @@ void BlurHUD::InitializeBuffers()
|
|||||||
}
|
}
|
||||||
m_GaussianFrameBuffer_horiz.Generate();
|
m_GaussianFrameBuffer_horiz.Generate();
|
||||||
|
|
||||||
CommonFunctions::GenerateTexture(&m_DepthStencil_vert, GL_CLAMP_TO_BORDER, GL_NEAREST,
|
//CommonFunctions::GenerateTexture(&m_DepthStencil_vert, GL_CLAMP_TO_BORDER, GL_NEAREST,
|
||||||
res2, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8);
|
// res2, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8);
|
||||||
CommonFunctions::GenerateTexture(&m_GaussianTexture_vert, GL_CLAMP_TO_EDGE, GL_NEAREST,
|
CommonFunctions::GenerateTexture(&m_GaussianTexture_vert, GL_CLAMP_TO_EDGE, GL_NEAREST,
|
||||||
res2, GL_RGBA16F, GL_RGBA, GL_FLOAT);
|
res2, GL_RGBA16F, GL_RGBA, GL_FLOAT);
|
||||||
|
|
||||||
if (m_GaussianFrameBuffer_vert.GetHandle() == 0) {
|
if (m_GaussianFrameBuffer_vert.GetHandle() == 0) {
|
||||||
m_GaussianFrameBuffer_vert.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_DepthStencil_vert, GL_DEPTH_STENCIL_ATTACHMENT)));
|
m_GaussianFrameBuffer_vert.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_DepthStencil_horiz, GL_DEPTH_STENCIL_ATTACHMENT)));
|
||||||
m_GaussianFrameBuffer_vert.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_GaussianTexture_vert, GL_COLOR_ATTACHMENT0)));
|
m_GaussianFrameBuffer_vert.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_GaussianTexture_vert, GL_COLOR_ATTACHMENT0)));
|
||||||
}
|
}
|
||||||
m_GaussianFrameBuffer_vert.Generate();
|
m_GaussianFrameBuffer_vert.Generate();
|
||||||
@@ -260,22 +260,22 @@ void BlurHUD::FillStencil(RenderScene& scene)
|
|||||||
glDrawElements(GL_TRIANGLES, spriteJob->EndIndex - spriteJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(spriteJob->StartIndex*sizeof(unsigned int)));
|
glDrawElements(GL_TRIANGLES, spriteJob->EndIndex - spriteJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(spriteJob->StartIndex*sizeof(unsigned int)));
|
||||||
}
|
}
|
||||||
|
|
||||||
state.BindFramebuffer(m_GaussianFrameBuffer_vert.GetHandle());
|
//state.BindFramebuffer(m_GaussianFrameBuffer_vert.GetHandle());
|
||||||
for (auto& job : scene.Jobs.SpriteJob) {
|
//for (auto& job : scene.Jobs.SpriteJob) {
|
||||||
auto spriteJob = std::dynamic_pointer_cast<SpriteJob>(job);
|
// auto spriteJob = std::dynamic_pointer_cast<SpriteJob>(job);
|
||||||
if (!spriteJob) {
|
// if (!spriteJob) {
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
if(!spriteJob->BlurBackground) {
|
// if(!spriteJob->BlurBackground) {
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
glm::mat4 MVP = VP * spriteJob->Matrix;
|
// glm::mat4 MVP = VP * spriteJob->Matrix;
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(MVP));
|
// glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(MVP));
|
||||||
|
|
||||||
glBindVertexArray(spriteJob->Model->VAO);
|
// glBindVertexArray(spriteJob->Model->VAO);
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, spriteJob->Model->ElementBuffer);
|
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, spriteJob->Model->ElementBuffer);
|
||||||
glDrawElements(GL_TRIANGLES, spriteJob->EndIndex - spriteJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(spriteJob->StartIndex*sizeof(unsigned int)));
|
// glDrawElements(GL_TRIANGLES, spriteJob->EndIndex - spriteJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(spriteJob->StartIndex*sizeof(unsigned int)));
|
||||||
}
|
//}
|
||||||
glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -76,12 +76,12 @@ void DrawBloomPass::InitializeShaderPrograms()
|
|||||||
void DrawBloomPass::InitializeBuffers()
|
void DrawBloomPass::InitializeBuffers()
|
||||||
{
|
{
|
||||||
CommonFunctions::GenerateMipMapTexture(
|
CommonFunctions::GenerateMipMapTexture(
|
||||||
&m_GaussianTexture_horiz, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height)
|
&m_GaussianTexture_horiz, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height),
|
||||||
, GL_RGB, GL_FLOAT, m_BloomLod);
|
GL_RGB16F, GL_RGB, GL_FLOAT, m_BloomLod, GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST);
|
||||||
CommonFunctions::GenerateMipMapTexture(
|
CommonFunctions::GenerateMipMapTexture(
|
||||||
&m_GaussianTexture_vert, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height)
|
&m_GaussianTexture_vert, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height),
|
||||||
, GL_RGB, GL_FLOAT, m_BloomLod);
|
GL_RGB16F, GL_RGB, GL_FLOAT, m_BloomLod, GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST);
|
||||||
CommonFunctions::GenerateTexture(&m_FinalGaussianTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
CommonFunctions::GenerateTexture(&m_FinalGaussianTexture, GL_CLAMP_TO_BORDER, GL_NEAREST, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
||||||
|
|
||||||
if (m_GaussianCombineBuffer.GetHandle() == 0) {
|
if (m_GaussianCombineBuffer.GetHandle() == 0) {
|
||||||
m_GaussianCombineBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_FinalGaussianTexture, GL_COLOR_ATTACHMENT0)));
|
m_GaussianCombineBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_FinalGaussianTexture, GL_COLOR_ATTACHMENT0)));
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include "Rendering/DrawFinalPass.h"
|
#include "Rendering/DrawFinalPass.h"
|
||||||
DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass)
|
DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass, ConfigFile* config)
|
||||||
: m_Renderer(renderer)
|
: m_Renderer(renderer)
|
||||||
, m_LightCullingPass(lightCullingPass)
|
, m_LightCullingPass(lightCullingPass)
|
||||||
, m_CubeMapPass(cubeMapPass)
|
, m_CubeMapPass(cubeMapPass)
|
||||||
@@ -8,6 +8,11 @@ DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCulling
|
|||||||
{
|
{
|
||||||
//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;
|
||||||
|
m_FinalPassFrameBuffer = new FrameBuffer();
|
||||||
|
m_ShieldDepthFrameBuffer = new FrameBuffer();
|
||||||
|
|
||||||
|
setMSAA(config->Get<int>("MSAA.Level", 0));
|
||||||
|
|
||||||
InitializeTextures();
|
InitializeTextures();
|
||||||
InitializeShaderPrograms();
|
InitializeShaderPrograms();
|
||||||
InitializeFrameBuffers();
|
InitializeFrameBuffers();
|
||||||
@@ -19,6 +24,9 @@ DrawFinalPass::~DrawFinalPass(){
|
|||||||
CommonFunctions::DeleteTexture(&m_DepthBuffer);
|
CommonFunctions::DeleteTexture(&m_DepthBuffer);
|
||||||
CommonFunctions::DeleteTexture(&m_ShieldBuffer);
|
CommonFunctions::DeleteTexture(&m_ShieldBuffer);
|
||||||
CommonFunctions::DeleteTexture(&m_CubeMapTexture);
|
CommonFunctions::DeleteTexture(&m_CubeMapTexture);
|
||||||
|
|
||||||
|
delete m_FinalPassFrameBuffer;
|
||||||
|
delete m_ShieldDepthFrameBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawFinalPass::InitializeTextures()
|
void DrawFinalPass::InitializeTextures()
|
||||||
@@ -32,26 +40,88 @@ void DrawFinalPass::InitializeTextures()
|
|||||||
|
|
||||||
void DrawFinalPass::InitializeFrameBuffers()
|
void DrawFinalPass::InitializeFrameBuffers()
|
||||||
{
|
{
|
||||||
CommonFunctions::GenerateTexture(&m_SceneTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
if (m_MSAA) {
|
||||||
//GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
CommonFunctions::GenerateTexture(&m_AntiAliasedTexture, GL_CLAMP_TO_BORDER, GL_NEAREST,
|
||||||
CommonFunctions::GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
||||||
//GenerateMipMapTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_FLOAT, 4);
|
|
||||||
//GenerateTexture(&m_StencilTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_STENCIL, GL_STENCIL_INDEX8, GL_INT);
|
|
||||||
|
|
||||||
CommonFunctions::GenerateTexture(&m_DepthBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST,
|
if (m_AntiAliasedFrameBuffer == nullptr) {
|
||||||
glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8);
|
m_AntiAliasedFrameBuffer = new FrameBuffer();
|
||||||
|
m_AntiAliasedFrameBuffer->AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_AntiAliasedTexture, GL_COLOR_ATTACHMENT0)));
|
||||||
|
}
|
||||||
|
m_AntiAliasedFrameBuffer->Generate();
|
||||||
|
|
||||||
m_FinalPassFrameBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_DepthBuffer, GL_DEPTH_STENCIL_ATTACHMENT)));
|
if (m_SceneTexture != 0) {
|
||||||
//m_FinalPassFrameBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_StencilTexture, GL_STENCIL_ATTACHMENT)));
|
glDeleteRenderbuffers(1, &m_SceneTexture);
|
||||||
m_FinalPassFrameBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_SceneTexture, GL_COLOR_ATTACHMENT0)));
|
}
|
||||||
m_FinalPassFrameBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_BloomTexture, GL_COLOR_ATTACHMENT1)));
|
glGenRenderbuffers(1, &m_SceneTexture);
|
||||||
m_FinalPassFrameBuffer.Generate();
|
GLERROR("FBO 1");
|
||||||
GLERROR("FBO generation");
|
glBindRenderbuffer(GL_RENDERBUFFER, m_SceneTexture);
|
||||||
|
GLERROR("FBO 11");
|
||||||
|
glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_RGB16F, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||||
|
GLERROR("FBO 111");
|
||||||
|
|
||||||
|
if (m_BloomTexture != 0) {
|
||||||
|
glDeleteRenderbuffers(1, &m_BloomTexture);
|
||||||
|
}
|
||||||
|
glGenRenderbuffers(1, &m_BloomTexture);
|
||||||
|
GLERROR("FBO 2");
|
||||||
|
glBindRenderbuffer(GL_RENDERBUFFER, m_BloomTexture);
|
||||||
|
GLERROR("FBO 22");
|
||||||
|
glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_RGB16F, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||||
|
GLERROR("FBO 222");
|
||||||
|
|
||||||
|
if (m_DepthBuffer != 0) {
|
||||||
|
glDeleteRenderbuffers(1, &m_DepthBuffer);
|
||||||
|
}
|
||||||
|
glGenRenderbuffers(1, &m_DepthBuffer);
|
||||||
|
GLERROR("FBO 3");
|
||||||
|
glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer);
|
||||||
|
GLERROR("FBO 33");
|
||||||
|
glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_DEPTH24_STENCIL8, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||||
|
GLERROR("FBO 333");
|
||||||
|
|
||||||
|
//CommonFunctions::GenerateMultiSampleTexture(&m_SceneTexture, m_MSAA, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F);
|
||||||
|
//CommonFunctions::GenerateMultiSampleTexture(&m_BloomTexture, m_MSAA, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F);
|
||||||
|
|
||||||
|
//CommonFunctions::GenerateMultiSampleTexture(&m_DepthBuffer, m_MSAA,
|
||||||
|
//glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH24_STENCIL8);
|
||||||
|
|
||||||
|
//CommonFunctions::GenerateMultiSampleTexture(&m_ShieldBuffer, m_MSAA,
|
||||||
|
//glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH_COMPONENT32F);
|
||||||
|
} else {
|
||||||
|
CommonFunctions::GenerateTexture(&m_SceneTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
||||||
|
//GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
||||||
|
CommonFunctions::GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
||||||
|
//GenerateMipMapTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_FLOAT, 4);
|
||||||
|
//GenerateTexture(&m_StencilTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_STENCIL, GL_STENCIL_INDEX8, GL_INT);
|
||||||
|
|
||||||
|
CommonFunctions::GenerateTexture(&m_DepthBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST,
|
||||||
|
glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8);
|
||||||
|
}
|
||||||
|
|
||||||
CommonFunctions::GenerateTexture(&m_ShieldBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST,
|
CommonFunctions::GenerateTexture(&m_ShieldBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST,
|
||||||
glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH_COMPONENT32, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT);
|
glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT);
|
||||||
m_ShieldDepthFrameBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_ShieldBuffer, GL_DEPTH_ATTACHMENT)));
|
|
||||||
m_ShieldDepthFrameBuffer.Generate();
|
if (m_FinalPassFrameBuffer->GetHandle() == 0) {
|
||||||
|
if (m_MSAA) {
|
||||||
|
m_FinalPassFrameBuffer->AddResource(std::shared_ptr<BufferResource>(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_STENCIL_ATTACHMENT)));
|
||||||
|
//m_FinalPassFrameBuffer->AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_StencilTexture, GL_STENCIL_ATTACHMENT)));
|
||||||
|
m_FinalPassFrameBuffer->AddResource(std::shared_ptr<BufferResource>(new RenderBuffer(&m_SceneTexture, GL_COLOR_ATTACHMENT0)));
|
||||||
|
m_FinalPassFrameBuffer->AddResource(std::shared_ptr<BufferResource>(new RenderBuffer(&m_BloomTexture, GL_COLOR_ATTACHMENT1)));
|
||||||
|
} else {
|
||||||
|
m_FinalPassFrameBuffer->AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_DepthBuffer, GL_DEPTH_STENCIL_ATTACHMENT)));
|
||||||
|
//m_FinalPassFrameBuffer->AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_StencilTexture, GL_STENCIL_ATTACHMENT)));
|
||||||
|
m_FinalPassFrameBuffer->AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_SceneTexture, GL_COLOR_ATTACHMENT0)));
|
||||||
|
m_FinalPassFrameBuffer->AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_BloomTexture, GL_COLOR_ATTACHMENT1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_FinalPassFrameBuffer->Generate();
|
||||||
|
GLERROR("FBO generation");
|
||||||
|
|
||||||
|
if (m_ShieldDepthFrameBuffer->GetHandle() == 0) {
|
||||||
|
m_ShieldDepthFrameBuffer->AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_ShieldBuffer, GL_DEPTH_ATTACHMENT)));
|
||||||
|
}
|
||||||
|
m_ShieldDepthFrameBuffer->Generate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawFinalPass::InitializeShaderPrograms()
|
void DrawFinalPass::InitializeShaderPrograms()
|
||||||
@@ -245,14 +315,14 @@ void DrawFinalPass::InitializeShaderPrograms()
|
|||||||
void DrawFinalPass::Draw(RenderScene& scene, BlurHUD* blurHUDPass)
|
void DrawFinalPass::Draw(RenderScene& scene, BlurHUD* blurHUDPass)
|
||||||
{
|
{
|
||||||
GLERROR("Pre");
|
GLERROR("Pre");
|
||||||
DrawFinalPassState* stateDethp = new DrawFinalPassState(m_ShieldDepthFrameBuffer.GetHandle());
|
DrawFinalPassState* stateDethp = new DrawFinalPassState(m_ShieldDepthFrameBuffer->GetHandle());
|
||||||
//Draw shields to stencil
|
//Draw shields to stencil
|
||||||
DrawToDepthStencilBuffer(scene.Jobs.ShieldObjects, scene);
|
DrawToDepthStencilBuffer(scene.Jobs.ShieldObjects, scene);
|
||||||
GLERROR("StencilPass");
|
GLERROR("StencilPass");
|
||||||
delete stateDethp;
|
delete stateDethp;
|
||||||
|
|
||||||
|
|
||||||
DrawFinalPassState* state = new DrawFinalPassState(m_FinalPassFrameBuffer.GetHandle());
|
DrawFinalPassState* state = new DrawFinalPassState(m_FinalPassFrameBuffer->GetHandle());
|
||||||
if (scene.ClearDepth) {
|
if (scene.ClearDepth) {
|
||||||
//glClear(GL_DEPTH_BUFFER_BIT);
|
//glClear(GL_DEPTH_BUFFER_BIT);
|
||||||
state->Disable(GL_DEPTH_TEST);
|
state->Disable(GL_DEPTH_TEST);
|
||||||
@@ -293,17 +363,22 @@ void DrawFinalPass::Draw(RenderScene& scene, BlurHUD* blurHUDPass)
|
|||||||
delete state;
|
delete state;
|
||||||
if (scene.ShouldBlur) {
|
if (scene.ShouldBlur) {
|
||||||
//This needs to be drawn only when the full scene is being renderd, and then let be, otherwise sprite and other shit will show on it.
|
//This needs to be drawn only when the full scene is being renderd, and then let be, otherwise sprite and other shit will show on it.
|
||||||
m_FullBlurredTexture = blurHUDPass->Draw(m_SceneTexture, scene);
|
GLuint sceneTexture = SceneTexture();
|
||||||
|
m_FullBlurredTexture = blurHUDPass->Draw(sceneTexture, scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawFinalPassState* stateSprite = new DrawFinalPassState(m_FinalPassFrameBuffer.GetHandle());
|
DrawFinalPassState* stateSprite;
|
||||||
if(scene.ShouldBlur) {
|
if(scene.ShouldBlur) {
|
||||||
//Combine nonblur and blur texture
|
//Combine nonblur and blur texture
|
||||||
stateSprite->Disable(GL_DEPTH_TEST);
|
GLuint sceneTexture = SceneTexture();
|
||||||
stateSprite->Disable(GL_STENCIL_TEST);
|
stateSprite = new DrawFinalPassState(m_FinalPassFrameBuffer->GetHandle());
|
||||||
m_CombinedTexture = blurHUDPass->CombineTextures(m_SceneTexture, m_FullBlurredTexture);
|
stateSprite->Disable(GL_DEPTH_TEST);
|
||||||
|
stateSprite->Disable(GL_STENCIL_TEST);
|
||||||
|
m_CombinedTexture = blurHUDPass->CombineTextures(sceneTexture, m_FullBlurredTexture);
|
||||||
|
|
||||||
}
|
} else {
|
||||||
|
stateSprite = new DrawFinalPassState(m_FinalPassFrameBuffer->GetHandle());
|
||||||
|
}
|
||||||
//Draw Transparen objects
|
//Draw Transparen objects
|
||||||
//state->BlendFunc(GL_ONE, GL_ONE);
|
//state->BlendFunc(GL_ONE, GL_ONE);
|
||||||
//state->StencilFunc(GL_EQUAL, 1, 0xFF);
|
//state->StencilFunc(GL_EQUAL, 1, 0xFF);
|
||||||
@@ -325,33 +400,67 @@ void DrawFinalPass::Draw(RenderScene& scene, BlurHUD* blurHUDPass)
|
|||||||
void DrawFinalPass::ClearBuffer()
|
void DrawFinalPass::ClearBuffer()
|
||||||
{
|
{
|
||||||
GLERROR("PRE");
|
GLERROR("PRE");
|
||||||
m_ShieldDepthFrameBuffer.Bind();
|
m_ShieldDepthFrameBuffer->Bind();
|
||||||
glClear(GL_DEPTH_BUFFER_BIT);
|
glClear(GL_DEPTH_BUFFER_BIT);
|
||||||
m_ShieldDepthFrameBuffer.Unbind();
|
m_ShieldDepthFrameBuffer->Unbind();
|
||||||
m_FinalPassFrameBuffer.Bind();
|
m_FinalPassFrameBuffer->Bind();
|
||||||
GLERROR("Bind HighRes");
|
GLERROR("Bind HighRes");
|
||||||
glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||||
glScissor(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
glScissor(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||||
GLERROR("ViewPort,Scissor LowRes");
|
GLERROR("ViewPort,Scissor LowRes");
|
||||||
glClearColor(0.f, 0.f, 0.f, 0.f);
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
m_FinalPassFrameBuffer.Unbind();
|
m_FinalPassFrameBuffer->Unbind();
|
||||||
GLERROR("END");
|
GLERROR("END");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DrawFinalPass::OnWindowResize()
|
void DrawFinalPass::OnWindowResize()
|
||||||
{
|
{
|
||||||
//InitializeFrameBuffers();
|
if (m_FinalPassFrameBuffer->MultiSampling() != (bool)m_MSAA) {
|
||||||
CommonFunctions::GenerateTexture(&m_DepthBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST,
|
delete m_FinalPassFrameBuffer;
|
||||||
glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8);
|
delete m_ShieldDepthFrameBuffer;
|
||||||
CommonFunctions::GenerateTexture(&m_SceneTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
m_FinalPassFrameBuffer = new FrameBuffer();
|
||||||
CommonFunctions::GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
m_ShieldDepthFrameBuffer = new FrameBuffer();
|
||||||
m_FinalPassFrameBuffer.Generate();
|
}
|
||||||
|
|
||||||
|
if (m_MSAA) {
|
||||||
|
if (m_AntiAliasedFrameBuffer != nullptr) {
|
||||||
|
delete m_AntiAliasedFrameBuffer;
|
||||||
|
m_AntiAliasedFrameBuffer = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
InitializeFrameBuffers();
|
||||||
GLERROR("Error changing texture resolutions");
|
GLERROR("Error changing texture resolutions");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DrawFinalPass::setMSAA(unsigned int numberOfSamples) {
|
||||||
|
if (m_MSAA == numberOfSamples) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(bool)numberOfSamples) {
|
||||||
|
if (m_AntiAliasedFrameBuffer != nullptr) {
|
||||||
|
delete m_AntiAliasedFrameBuffer;
|
||||||
|
m_AntiAliasedFrameBuffer = nullptr;
|
||||||
|
}
|
||||||
|
delete m_FinalPassFrameBuffer;
|
||||||
|
m_FinalPassFrameBuffer = new FrameBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((bool)numberOfSamples && !(bool)m_MSAA) {
|
||||||
|
delete m_FinalPassFrameBuffer;
|
||||||
|
m_FinalPassFrameBuffer = new FrameBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_MSAA = numberOfSamples;
|
||||||
|
|
||||||
|
InitializeFrameBuffers();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void DrawFinalPass::DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene)
|
void DrawFinalPass::DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene)
|
||||||
{
|
{
|
||||||
GLuint forwardHandle = m_ForwardPlusProgram->GetHandle();
|
GLuint forwardHandle = m_ForwardPlusProgram->GetHandle();
|
||||||
@@ -1215,11 +1324,6 @@ void DrawFinalPass::DrawToDepthStencilBuffer(std::list<std::shared_ptr<RenderJob
|
|||||||
if (lastShader != m_FillDepthStencilBufferSkinnedProgram->GetHandle()) {
|
if (lastShader != m_FillDepthStencilBufferSkinnedProgram->GetHandle()) {
|
||||||
m_FillDepthStencilBufferSkinnedProgram->Bind();
|
m_FillDepthStencilBufferSkinnedProgram->Bind();
|
||||||
lastShader = m_FillDepthStencilBufferSkinnedProgram->GetHandle();
|
lastShader = m_FillDepthStencilBufferSkinnedProgram->GetHandle();
|
||||||
glUniform1i(glGetUniformLocation(shaderSkinnedHandle, "SSAOQuality"), m_SSAOPass->TextureQuality());
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix()));
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix()));
|
|
||||||
glUniform2f(glGetUniformLocation(shaderSkinnedHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
|
||||||
glUniform4fv(glGetUniformLocation(shaderSkinnedHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor));
|
|
||||||
GLERROR("Bind Uniforms 1");
|
GLERROR("Bind Uniforms 1");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1238,11 +1342,6 @@ void DrawFinalPass::DrawToDepthStencilBuffer(std::list<std::shared_ptr<RenderJob
|
|||||||
if (lastShader != m_FillDepthStencilBufferProgram->GetHandle()) {
|
if (lastShader != m_FillDepthStencilBufferProgram->GetHandle()) {
|
||||||
m_FillDepthStencilBufferProgram->Bind();
|
m_FillDepthStencilBufferProgram->Bind();
|
||||||
lastShader = m_FillDepthStencilBufferProgram->GetHandle();
|
lastShader = m_FillDepthStencilBufferProgram->GetHandle();
|
||||||
glUniform1i(glGetUniformLocation(shaderHandle, "SSAOQuality"), m_SSAOPass->TextureQuality());
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix()));
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix()));
|
|
||||||
glUniform2f(glGetUniformLocation(shaderHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
|
||||||
glUniform4fv(glGetUniformLocation(shaderHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor));
|
|
||||||
GLERROR("Bind Uniforms 2");
|
GLERROR("Bind Uniforms 2");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1298,7 +1397,14 @@ void DrawFinalPass::DrawSprites(std::list<std::shared_ptr<RenderJob>>&jobs, Rend
|
|||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
}
|
}
|
||||||
|
if (spriteJob->ClampToBorder) {
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
glBindTexture(GL_TEXTURE_2D, m_ErrorTexture->m_Texture);
|
glBindTexture(GL_TEXTURE_2D, m_ErrorTexture->m_Texture);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,13 @@
|
|||||||
#include "Rendering/FrameBuffer.h"
|
#include "Rendering/FrameBuffer.h"
|
||||||
|
|
||||||
|
|
||||||
BufferResource::BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment, GLuint mipMapLod)
|
BufferResource::BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment, GLuint mipMapLod, bool multiSampling)
|
||||||
{
|
{
|
||||||
m_ResourceHandle = resourceHandle;
|
m_ResourceHandle = resourceHandle;
|
||||||
m_ResourceType = resourceType;
|
m_ResourceType = resourceType;
|
||||||
m_Attachment = attachment;
|
m_Attachment = attachment;
|
||||||
m_MipMapLod = mipMapLod;
|
m_MipMapLod = mipMapLod;
|
||||||
|
m_MultiSampling = multiSampling;
|
||||||
}
|
}
|
||||||
|
|
||||||
Texture2D::~Texture2D()
|
Texture2D::~Texture2D()
|
||||||
@@ -15,14 +16,23 @@ Texture2D::~Texture2D()
|
|||||||
if (m_ResourceHandle != 0) {
|
if (m_ResourceHandle != 0) {
|
||||||
glDeleteTextures(1, m_ResourceHandle);
|
glDeleteTextures(1, m_ResourceHandle);
|
||||||
}
|
}
|
||||||
|
*m_ResourceHandle = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Texture2DMultiSample::~Texture2DMultiSample()
|
||||||
|
{
|
||||||
|
if (m_ResourceHandle != 0) {
|
||||||
|
glDeleteTextures(1, m_ResourceHandle);
|
||||||
|
}
|
||||||
|
*m_ResourceHandle = 0;
|
||||||
|
}
|
||||||
|
|
||||||
RenderBuffer::~RenderBuffer()
|
RenderBuffer::~RenderBuffer()
|
||||||
{
|
{
|
||||||
if (m_ResourceHandle != 0) {
|
if (m_ResourceHandle != 0) {
|
||||||
glDeleteRenderbuffers(1, m_ResourceHandle);
|
glDeleteRenderbuffers(1, m_ResourceHandle);
|
||||||
}
|
}
|
||||||
|
*m_ResourceHandle = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Texture2DArray::~Texture2DArray()
|
Texture2DArray::~Texture2DArray()
|
||||||
@@ -30,6 +40,7 @@ Texture2DArray::~Texture2DArray()
|
|||||||
if (m_ResourceHandle != 0) {
|
if (m_ResourceHandle != 0) {
|
||||||
glDeleteTextures(1, m_ResourceHandle);
|
glDeleteTextures(1, m_ResourceHandle);
|
||||||
}
|
}
|
||||||
|
*m_ResourceHandle = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -42,6 +53,14 @@ FrameBuffer::~FrameBuffer()
|
|||||||
|
|
||||||
void FrameBuffer::AddResource(std::shared_ptr<BufferResource> resource)
|
void FrameBuffer::AddResource(std::shared_ptr<BufferResource> resource)
|
||||||
{
|
{
|
||||||
|
//m_MultiSampling is true when initialized
|
||||||
|
if (m_MultiSampling != resource->m_MultiSampling) {
|
||||||
|
if (m_MultiSampling == false) {
|
||||||
|
GLERROR("All renderbuffers is/is not using multisampling");
|
||||||
|
} else {
|
||||||
|
m_MultiSampling = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
m_Resources.push_back(resource);
|
m_Resources.push_back(resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,20 +74,23 @@ void FrameBuffer::Generate()
|
|||||||
}
|
}
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, m_BufferHandle);
|
glBindFramebuffer(GL_FRAMEBUFFER, m_BufferHandle);
|
||||||
GLERROR("1");
|
GLERROR("1");
|
||||||
|
|
||||||
for (auto it = m_Resources.begin(); it != m_Resources.end(); it++) {
|
for (auto it = m_Resources.begin(); it != m_Resources.end(); it++) {
|
||||||
switch ((*it)->m_ResourceType) {
|
switch ((*it)->m_ResourceType) {
|
||||||
|
case GL_TEXTURE_2D_MULTISAMPLE:
|
||||||
|
glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, GL_TEXTURE_2D_MULTISAMPLE, 0, 0);
|
||||||
|
GLERROR("FrameBuffer generate: GL_TEXTURE_2D_MULTISAMPLE");
|
||||||
|
break;
|
||||||
case GL_TEXTURE_2D:
|
case GL_TEXTURE_2D:
|
||||||
glFramebufferTexture(GL_FRAMEBUFFER, (*it)->m_Attachment, *(*it)->m_ResourceHandle, (*it)->m_MipMapLod);
|
glFramebufferTexture(GL_FRAMEBUFFER, (*it)->m_Attachment, *(*it)->m_ResourceHandle, (*it)->m_MipMapLod);
|
||||||
GLERROR("FrameBuffer generate: glFramebufferTexture2D");
|
GLERROR("FrameBuffer generate: GL_TEXTURE_2D");
|
||||||
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: GL_RENDERBUFFER");
|
||||||
break;
|
break;
|
||||||
case GL_TEXTURE_2D_ARRAY:
|
case GL_TEXTURE_2D_ARRAY:
|
||||||
glFramebufferTexture(GL_FRAMEBUFFER, (*it)->m_Attachment, *(*it)->m_ResourceHandle, 0);
|
glFramebufferTexture(GL_FRAMEBUFFER, (*it)->m_Attachment, *(*it)->m_ResourceHandle, 0);
|
||||||
GLERROR("FrameBuffer generate: glFramebufferTexture2DArray");
|
GLERROR("FrameBuffer generate: GL_TEXTURE_2D_ARRAY");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
GLERROR("2");
|
GLERROR("2");
|
||||||
@@ -77,8 +99,8 @@ void FrameBuffer::Generate()
|
|||||||
attachments.push_back((*it)->m_Attachment);
|
attachments.push_back((*it)->m_Attachment);
|
||||||
}
|
}
|
||||||
GLERROR("Attachment");
|
GLERROR("Attachment");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GLERROR("3");
|
GLERROR("3");
|
||||||
|
|
||||||
GLenum* bufferTextures = attachments.data();
|
GLenum* bufferTextures = attachments.data();
|
||||||
@@ -89,7 +111,7 @@ void FrameBuffer::Generate()
|
|||||||
|
|
||||||
if (GLenum frameBufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
if (GLenum frameBufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
||||||
GLERROR("Framebuffer incomplete");
|
GLERROR("Framebuffer incomplete");
|
||||||
//LOG_ERROR("FrameBuffer incomplete: 0x%x\n", frameBufferStatus);
|
LOG_ERROR("FrameBuffer incomplete: 0x%x\n", glCheckFramebufferStatus(GL_FRAMEBUFFER));
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
GLERROR("END");
|
GLERROR("END");
|
||||||
@@ -110,3 +132,11 @@ GLuint FrameBuffer::GetHandle()
|
|||||||
{
|
{
|
||||||
return m_BufferHandle;
|
return m_BufferHandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FrameBuffer::Read() {
|
||||||
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_BufferHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FrameBuffer::Draw() {
|
||||||
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_BufferHandle);
|
||||||
|
}
|
||||||
|
|||||||
@@ -76,6 +76,11 @@ void PickingPass::Draw(RenderScene& scene)
|
|||||||
auto modelJob = std::dynamic_pointer_cast<ModelJob>(job);
|
auto modelJob = std::dynamic_pointer_cast<ModelJob>(job);
|
||||||
|
|
||||||
if (modelJob) {
|
if (modelJob) {
|
||||||
|
if(modelJob->NotPickable) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int pickColor[2] = { m_ColorCounter[0], m_ColorCounter[1] };
|
int pickColor[2] = { m_ColorCounter[0], m_ColorCounter[1] };
|
||||||
|
|
||||||
PickingInfo pickInfo;
|
PickingInfo pickInfo;
|
||||||
|
|||||||
@@ -362,6 +362,11 @@ void RenderSystem::fillPointLights(std::list<std::shared_ptr<RenderJob>>& jobs,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EntityWrapper entity(world, pointlightC.EntityID);
|
||||||
|
if (!isEntityVisible(entity)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<PointLightJob> pointLightJob = std::shared_ptr<PointLightJob>(new PointLightJob(transformC, pointlightC, m_World));
|
std::shared_ptr<PointLightJob> pointLightJob = std::shared_ptr<PointLightJob>(new PointLightJob(transformC, pointlightC, m_World));
|
||||||
jobs.push_back(pointLightJob);
|
jobs.push_back(pointLightJob);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,10 +67,19 @@ void Renderer::InitializeWindow()
|
|||||||
// Create a window
|
// Create a window
|
||||||
GLFWmonitor* monitor = nullptr;
|
GLFWmonitor* monitor = nullptr;
|
||||||
if (m_Fullscreen) {
|
if (m_Fullscreen) {
|
||||||
monitor = glfwGetPrimaryMonitor();
|
//monitor = glfwGetPrimaryMonitor();
|
||||||
|
//const GLFWvidmode* mode = glfwGetVideoMode(monitor);
|
||||||
|
|
||||||
|
//glfwWindowHint(GLFW_RED_BITS, mode->redBits);
|
||||||
|
//glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);
|
||||||
|
//glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);
|
||||||
|
//glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate);
|
||||||
|
glfwWindowHint(GLFW_DECORATED, false);
|
||||||
|
glfwWindowHint(GLFW_AUTO_ICONIFY, false);
|
||||||
}
|
}
|
||||||
//glfwWindowHint(GLFW_SAMPLES, 8);
|
|
||||||
m_Window = glfwCreateWindow(m_Resolution.Width, m_Resolution.Height, "daydream", monitor, nullptr);
|
//glfwWindowHint(GLFW_SAMPLES, 8);
|
||||||
|
m_Window = glfwCreateWindow(m_Resolution.Width, m_Resolution.Height + 1, "daydream", monitor, nullptr);
|
||||||
if (!m_Window) {
|
if (!m_Window) {
|
||||||
LOG_ERROR("GLFW: Failed to create window");
|
LOG_ERROR("GLFW: Failed to create window");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
@@ -168,8 +177,10 @@ void Renderer::Draw(RenderFrame& frame)
|
|||||||
|
|
||||||
ImGui::SliderInt("SSAO Quality", &m_SSAO_Quality, 0, 3);
|
ImGui::SliderInt("SSAO Quality", &m_SSAO_Quality, 0, 3);
|
||||||
ImGui::SliderInt("Glow Quality", &m_GLOW_Quality, 0, 3);
|
ImGui::SliderInt("Glow Quality", &m_GLOW_Quality, 0, 3);
|
||||||
|
ImGui::SliderInt("MSAA Level", (int*)&m_MSAA_Level, 0, 16);
|
||||||
m_SSAOPass->ChangeQuality(m_SSAO_Quality);
|
m_SSAOPass->ChangeQuality(m_SSAO_Quality);
|
||||||
m_DrawBloomPass->ChangeQuality(m_GLOW_Quality);
|
m_DrawBloomPass->ChangeQuality(m_GLOW_Quality);
|
||||||
|
m_DrawFinalPass->setMSAA(m_MSAA_Level);
|
||||||
GLERROR("SSAO Settings");
|
GLERROR("SSAO Settings");
|
||||||
//clear buffer 0
|
//clear buffer 0
|
||||||
glClearColor(0.f, 0.f, 0.f, 0.f);
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
@@ -228,7 +239,8 @@ void Renderer::Draw(RenderFrame& frame)
|
|||||||
|
|
||||||
if (m_DebugTextureToDraw == 0) {
|
if (m_DebugTextureToDraw == 0) {
|
||||||
PerformanceTimer::StartTimer("Renderer-Color Correction Pass");
|
PerformanceTimer::StartTimer("Renderer-Color Correction Pass");
|
||||||
m_DrawColorCorrectionPass->Draw(m_DrawFinalPass->SceneTexture(), m_DrawBloomPass->GaussianTexture(), frame.Gamma, frame.Exposure);
|
GLuint test = m_DrawFinalPass->SceneTexture();
|
||||||
|
m_DrawColorCorrectionPass->Draw(test, m_DrawBloomPass->GaussianTexture(), frame.Gamma, frame.Exposure);
|
||||||
PerformanceTimer::StopTimer("Renderer-Color Correction Pass");
|
PerformanceTimer::StopTimer("Renderer-Color Correction Pass");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -307,7 +319,7 @@ void Renderer::InitializeRenderPasses()
|
|||||||
m_SSAOPass = new SSAOPass(this, m_Config);
|
m_SSAOPass = new SSAOPass(this, m_Config);
|
||||||
m_ShadowPass = new ShadowPass(this);
|
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_ShadowPass);
|
m_DrawFinalPass = new DrawFinalPass(this, m_LightCullingPass, m_CubeMapPass, m_SSAOPass, m_ShadowPass, m_Config);
|
||||||
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);
|
||||||
|
|||||||
@@ -226,8 +226,8 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i);
|
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i);
|
||||||
|
|
||||||
|
|
||||||
GLuint shaderHandle;
|
GLuint shaderHandle = 0;
|
||||||
|
GLuint lastModel = 0;
|
||||||
for (auto &job : scene.Jobs.DirectionalLight) {
|
for (auto &job : scene.Jobs.DirectionalLight) {
|
||||||
|
|
||||||
auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job);
|
auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job);
|
||||||
@@ -240,19 +240,6 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
//RadiusToLightspace(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]);
|
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]);
|
||||||
|
|
||||||
|
|
||||||
m_ShadowProgram->Bind();
|
|
||||||
shaderHandle = m_ShadowProgram->GetHandle();
|
|
||||||
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]));
|
|
||||||
|
|
||||||
m_ShadowProgramSkinned->Bind();
|
|
||||||
shaderHandle = m_ShadowProgramSkinned->GetHandle();
|
|
||||||
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");
|
GLERROR("ShadowLight ERROR");
|
||||||
|
|
||||||
for (auto &objectJob : scene.Jobs.OpaqueObjects) {
|
for (auto &objectJob : scene.Jobs.OpaqueObjects) {
|
||||||
@@ -264,8 +251,10 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(modelJob->Model->IsSkinned()) {
|
if(modelJob->Model->IsSkinned()) {
|
||||||
m_ShadowProgramSkinned->Bind();
|
if (shaderHandle != m_ShadowProgramSkinned->GetHandle()) {
|
||||||
shaderHandle = m_ShadowProgramSkinned->GetHandle();
|
m_ShadowProgramSkinned->Bind();
|
||||||
|
shaderHandle = m_ShadowProgramSkinned->GetHandle();
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<glm::mat4> frameBones;
|
std::vector<glm::mat4> frameBones;
|
||||||
if (modelJob->BlendTree != nullptr) {
|
if (modelJob->BlendTree != nullptr) {
|
||||||
@@ -276,15 +265,19 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
m_ShadowProgram->Bind();
|
if (shaderHandle != m_ShadowProgram->GetHandle()) {
|
||||||
shaderHandle = m_ShadowProgram->GetHandle();
|
m_ShadowProgram->Bind();
|
||||||
|
shaderHandle = m_ShadowProgram->GetHandle();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i] * m_LightView[i] * modelJob->Matrix));
|
||||||
glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), 1.f);
|
glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), 1.f);
|
||||||
|
|
||||||
glBindVertexArray(modelJob->Model->VAO);
|
if (lastModel != modelJob->ModelID) {
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
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)));
|
glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int)));
|
||||||
|
|
||||||
GLERROR("Shadow Draw ERROR");
|
GLERROR("Shadow Draw ERROR");
|
||||||
@@ -301,8 +294,10 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (modelJob->Model->IsSkinned()) {
|
if (modelJob->Model->IsSkinned()) {
|
||||||
m_ShadowProgramSkinned->Bind();
|
if (shaderHandle != m_ShadowProgramSkinned->GetHandle()) {
|
||||||
shaderHandle = m_ShadowProgramSkinned->GetHandle();
|
m_ShadowProgramSkinned->Bind();
|
||||||
|
shaderHandle = m_ShadowProgramSkinned->GetHandle();
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<glm::mat4> frameBones;
|
std::vector<glm::mat4> frameBones;
|
||||||
if (modelJob->BlendTree != nullptr) {
|
if (modelJob->BlendTree != nullptr) {
|
||||||
@@ -313,11 +308,13 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
m_ShadowProgram->Bind();
|
if (shaderHandle != m_ShadowProgram->GetHandle()) {
|
||||||
shaderHandle = m_ShadowProgram->GetHandle();
|
m_ShadowProgram->Bind();
|
||||||
|
shaderHandle = m_ShadowProgram->GetHandle();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i] * m_LightView[i] * modelJob->Matrix));
|
||||||
glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a);
|
glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a);
|
||||||
|
|
||||||
if (m_TexturedShadows) {
|
if (m_TexturedShadows) {
|
||||||
@@ -345,9 +342,10 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (lastModel != modelJob->ModelID) {
|
||||||
glBindVertexArray(modelJob->Model->VAO);
|
glBindVertexArray(modelJob->Model->VAO);
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
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)));
|
glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int)));
|
||||||
|
|
||||||
GLERROR("Shadow Draw ERROR");
|
GLERROR("Shadow Draw ERROR");
|
||||||
|
|||||||
@@ -33,33 +33,33 @@ void Skeleton::AccumulateBoneTransforms(bool noRootMotion, const Animation* anim
|
|||||||
PoseData poseData;
|
PoseData poseData;
|
||||||
|
|
||||||
if (animation->JointAnimations.find(bone->ID) != animation->JointAnimations.end()) {
|
if (animation->JointAnimations.find(bone->ID) != animation->JointAnimations.end()) {
|
||||||
std::vector<Animation::Keyframe> boneKeyFrames = animation->JointAnimations.at(bone->ID);
|
const std::vector<Animation::Keyframe>& boneKeyFrames = animation->JointAnimations.at(bone->ID);
|
||||||
|
|
||||||
Animation::Keyframe currentFrame;
|
const Animation::Keyframe* currentFrame;
|
||||||
Animation::Keyframe nextFrame;
|
const Animation::Keyframe* nextFrame;
|
||||||
|
|
||||||
if (boneKeyFrames.size() > 1) { // 2+ keyframes for the current bone
|
if (boneKeyFrames.size() > 1) { // 2+ keyframes for the current bone
|
||||||
for (int index = boneKeyFrames.size()-1; index >= 0; index--) { // find the bone keyframes that surrounds the current frame
|
for (int index = boneKeyFrames.size()-1; index >= 0; index--) { // find the bone keyframes that surrounds the current frame
|
||||||
if (time >= boneKeyFrames.at(index).Time) {
|
if (time >= boneKeyFrames.at(index).Time) {
|
||||||
currentFrame = boneKeyFrames.at(index);
|
currentFrame = &boneKeyFrames.at(index);
|
||||||
nextFrame = boneKeyFrames.at((index + 1) % boneKeyFrames.size());
|
nextFrame = &boneKeyFrames.at((index + 1) % boneKeyFrames.size());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float progress;
|
float progress;
|
||||||
|
|
||||||
if (nextFrame.Index == 0) {
|
if (nextFrame->Index == 0) {
|
||||||
nextFrame = currentFrame;
|
nextFrame = currentFrame;
|
||||||
progress = (time - currentFrame.Time) / (animation->Duration - currentFrame.Time);
|
progress = (time - currentFrame->Time) / (animation->Duration - currentFrame->Time);
|
||||||
} else {
|
} else {
|
||||||
progress = (time - currentFrame.Time) / (nextFrame.Time - currentFrame.Time);
|
progress = (time - currentFrame->Time) / (nextFrame->Time - currentFrame->Time);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
progress = glm::clamp(progress, 0.0f, 1.0f);
|
progress = glm::clamp(progress, 0.0f, 1.0f);
|
||||||
Animation::Keyframe::BoneProperty currentBoneProperty = currentFrame.BoneProperties;
|
const Animation::Keyframe::BoneProperty& currentBoneProperty = currentFrame->BoneProperties;
|
||||||
Animation::Keyframe::BoneProperty nextBoneProperty = nextFrame.BoneProperties;
|
const Animation::Keyframe::BoneProperty& nextBoneProperty = nextFrame->BoneProperties;
|
||||||
|
|
||||||
glm::vec3 position = currentBoneProperty.Position * (1.f - progress) + nextBoneProperty.Position * progress;
|
glm::vec3 position = currentBoneProperty.Position * (1.f - progress) + nextBoneProperty.Position * progress;
|
||||||
glm::quat rotation = glm::normalize(glm::slerp(currentBoneProperty.Rotation, nextBoneProperty.Rotation, progress));
|
glm::quat rotation = glm::normalize(glm::slerp(currentBoneProperty.Rotation, nextBoneProperty.Rotation, progress));
|
||||||
@@ -77,10 +77,10 @@ void Skeleton::AccumulateBoneTransforms(bool noRootMotion, const Animation* anim
|
|||||||
boneMatrices[bone->ID] = poseData;
|
boneMatrices[bone->ID] = poseData;
|
||||||
|
|
||||||
} else { // 1 keyframes for the current bone
|
} else { // 1 keyframes for the current bone
|
||||||
currentFrame = boneKeyFrames.at(0);
|
currentFrame = &boneKeyFrames.at(0);
|
||||||
poseData.Translation = currentFrame.BoneProperties.Position;
|
poseData.Translation = currentFrame->BoneProperties.Position;
|
||||||
poseData.Orientation = currentFrame.BoneProperties.Rotation;
|
poseData.Orientation = currentFrame->BoneProperties.Rotation;
|
||||||
poseData.Scale = currentFrame.BoneProperties.Scale;
|
poseData.Scale = currentFrame->BoneProperties.Scale;
|
||||||
boneMatrices[bone->ID] = poseData;
|
boneMatrices[bone->ID] = poseData;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -117,33 +117,33 @@ Skeleton::PoseData Skeleton::GetAdditiveBonePose(const Bone* bone, const Animati
|
|||||||
glm::vec3 scale = glm::vec3(1);
|
glm::vec3 scale = glm::vec3(1);
|
||||||
|
|
||||||
if (animation->JointAnimations.find(bone->ID) != animation->JointAnimations.end()) {
|
if (animation->JointAnimations.find(bone->ID) != animation->JointAnimations.end()) {
|
||||||
std::vector<Animation::Keyframe> boneKeyFrames = animation->JointAnimations.at(bone->ID);
|
const std::vector<Animation::Keyframe>& boneKeyFrames = animation->JointAnimations.at(bone->ID);
|
||||||
|
|
||||||
Animation::Keyframe currentFrame;
|
const Animation::Keyframe* currentFrame;
|
||||||
Animation::Keyframe nextFrame;
|
const Animation::Keyframe* nextFrame;
|
||||||
|
|
||||||
if (boneKeyFrames.size() > 1) { // 2+ keyframes for the current bone
|
if (boneKeyFrames.size() > 1) { // 2+ keyframes for the current bone
|
||||||
for (int index = boneKeyFrames.size()-1; index >= 0; index--) { // find the bone keyframes that surrounds the current frame
|
for (int index = boneKeyFrames.size()-1; index >= 0; index--) { // find the bone keyframes that surrounds the current frame
|
||||||
if (time >= boneKeyFrames.at(index).Time) {
|
if (time >= boneKeyFrames.at(index).Time) {
|
||||||
currentFrame = boneKeyFrames.at(index);
|
currentFrame = &boneKeyFrames.at(index);
|
||||||
nextFrame = boneKeyFrames.at((index + 1) % boneKeyFrames.size());
|
nextFrame = &boneKeyFrames.at((index + 1) % boneKeyFrames.size());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float progress;
|
float progress;
|
||||||
|
|
||||||
if (nextFrame.Index == 0) {
|
if (nextFrame->Index == 0) {
|
||||||
nextFrame = currentFrame;
|
nextFrame = currentFrame;
|
||||||
progress = (time - currentFrame.Time) / (animation->Duration - currentFrame.Time);
|
progress = (time - currentFrame->Time) / (animation->Duration - currentFrame->Time);
|
||||||
} else {
|
} else {
|
||||||
progress = (time - currentFrame.Time) / (nextFrame.Time - currentFrame.Time);
|
progress = (time - currentFrame->Time) / (nextFrame->Time - currentFrame->Time);
|
||||||
}
|
}
|
||||||
|
|
||||||
progress = glm::clamp(progress, 0.0f, 1.0f);
|
progress = glm::clamp(progress, 0.0f, 1.0f);
|
||||||
|
|
||||||
Animation::Keyframe::BoneProperty currentBoneProperty = currentFrame.BoneProperties;
|
const Animation::Keyframe::BoneProperty& currentBoneProperty = currentFrame->BoneProperties;
|
||||||
Animation::Keyframe::BoneProperty nextBoneProperty = nextFrame.BoneProperties;
|
const Animation::Keyframe::BoneProperty& nextBoneProperty = nextFrame->BoneProperties;
|
||||||
|
|
||||||
position = currentBoneProperty.Position * (1.f - progress) + nextBoneProperty.Position * progress;
|
position = currentBoneProperty.Position * (1.f - progress) + nextBoneProperty.Position * progress;
|
||||||
rotation = glm::slerp(currentBoneProperty.Rotation, nextBoneProperty.Rotation, progress);
|
rotation = glm::slerp(currentBoneProperty.Rotation, nextBoneProperty.Rotation, progress);
|
||||||
@@ -151,10 +151,10 @@ Skeleton::PoseData Skeleton::GetAdditiveBonePose(const Bone* bone, const Animati
|
|||||||
|
|
||||||
|
|
||||||
} else { // 1 keyframes for the current bone
|
} else { // 1 keyframes for the current bone
|
||||||
currentFrame = boneKeyFrames.at(0);
|
currentFrame = &boneKeyFrames.at(0);
|
||||||
position = currentFrame.BoneProperties.Position;
|
position = currentFrame->BoneProperties.Position;
|
||||||
rotation = currentFrame.BoneProperties.Rotation;
|
rotation = currentFrame->BoneProperties.Rotation;
|
||||||
scale = currentFrame.BoneProperties.Scale;
|
scale = currentFrame->BoneProperties.Scale;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,10 +270,10 @@ void Skeleton::AccumulateFinalPose(std::map<int, glm::mat4>& boneMatrices, std::
|
|||||||
boneMatrices[bone->ID] = boneMatrix * bone->OffsetMatrix;
|
boneMatrices[bone->ID] = boneMatrix * bone->OffsetMatrix;
|
||||||
} else {
|
} else {
|
||||||
if (bone->Parent) {
|
if (bone->Parent) {
|
||||||
boneMatrix = parentMatrix * (glm::inverse(bone->OffsetMatrix) * bone->Parent->OffsetMatrix);
|
boneMatrix = parentMatrix * bone->BindTransformMatrix * bone->Parent->OffsetMatrix;
|
||||||
boneMatrices[bone->ID] = boneMatrix * bone->OffsetMatrix;
|
boneMatrices[bone->ID] = boneMatrix * bone->OffsetMatrix;
|
||||||
} else {
|
} else {
|
||||||
boneMatrix = glm::inverse(bone->OffsetMatrix);
|
boneMatrix = bone->BindTransformMatrix;
|
||||||
boneMatrices[bone->ID] = parentMatrix;
|
boneMatrices[bone->ID] = parentMatrix;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,25 +17,26 @@ void CommonFunctions::GenerateMultiSampleTexture(GLuint* texture, int numSamples
|
|||||||
{
|
{
|
||||||
glDeleteTextures(1, texture);
|
glDeleteTextures(1, texture);
|
||||||
glGenTextures(1, texture);
|
glGenTextures(1, texture);
|
||||||
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, *texture);
|
glBindTexture(GL_TEXTURE_2D, *texture);
|
||||||
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, numSamples, internalFormat, dimensions.x, dimensions.y, false);
|
GLERROR("Texture initialization failed 1");
|
||||||
|
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, numSamples, internalFormat, dimensions.x, dimensions.y, GL_FALSE);
|
||||||
GLERROR("Texture initialization failed");
|
GLERROR("Texture initialization failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CommonFunctions::GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint format, GLenum type, GLint numMipMaps)
|
void CommonFunctions::GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type, GLint numMipMaps, GLint MAGFilter, GLint MINFilter)
|
||||||
{
|
{
|
||||||
glDeleteTextures(1, texture);
|
glDeleteTextures(1, texture);
|
||||||
glGenTextures(1, texture);
|
glGenTextures(1, texture);
|
||||||
glBindTexture(GL_TEXTURE_2D, *texture);
|
glBindTexture(GL_TEXTURE_2D, *texture);
|
||||||
glTexStorage2D(GL_TEXTURE_2D, numMipMaps, GL_RGBA8, dimensions.x, dimensions.y);
|
glTexStorage2D(GL_TEXTURE_2D, numMipMaps, internalFormat, dimensions.x, dimensions.y);
|
||||||
//glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, dimensions.x, dimensions.y, format, type, NULL);
|
//glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, dimensions.x, dimensions.y, format, type, NULL);
|
||||||
GLERROR("MipMap Texture glTexSubImage2D failed");
|
GLERROR("MipMap Texture glTexSubImage2D failed");
|
||||||
glGenerateMipmap(GL_TEXTURE_2D);
|
glGenerateMipmap(GL_TEXTURE_2D);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapping);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapping);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapping);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapping);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, MAGFilter);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, MINFilter);
|
||||||
GLERROR("MipMap Texture initialization failed");
|
GLERROR("MipMap Texture initialization failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,10 +30,7 @@ SoundManager::SoundManager(World* world, EventBroker* eventBroker)
|
|||||||
EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &SoundManager::OnPlayerSpawned);
|
EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &SoundManager::OnPlayerSpawned);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EPlayQueueOnEntity, &SoundManager::OnPlayQueueOnEntity);
|
EVENT_SUBSCRIBE_MEMBER(m_EPlayQueueOnEntity, &SoundManager::OnPlayQueueOnEntity);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EChangeBGM, &SoundManager::OnChangeBGM);
|
EVENT_SUBSCRIBE_MEMBER(m_EChangeBGM, &SoundManager::OnChangeBGM);
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &SoundManager::OnSetCamera);
|
||||||
Events::ChangeBGM e;
|
|
||||||
e.FilePath = "Audio/bgm/MenuMusic.wav";
|
|
||||||
m_EventBroker->Publish(e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SoundManager::~SoundManager()
|
SoundManager::~SoundManager()
|
||||||
@@ -67,8 +64,7 @@ void SoundManager::Update(double dt)
|
|||||||
deleteInactiveEmitters();
|
deleteInactiveEmitters();
|
||||||
updateEmitters(dt);
|
updateEmitters(dt);
|
||||||
updateListener(dt);
|
updateListener(dt);
|
||||||
if (m_DrumLoopHasBeenStarted)
|
matchBGMLoop();
|
||||||
matchBGMLoop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundManager::deleteInactiveEmitters()
|
void SoundManager::deleteInactiveEmitters()
|
||||||
@@ -363,15 +359,6 @@ bool SoundManager::OnPlayerSpawned(const Events::PlayerSpawned &e)
|
|||||||
{
|
{
|
||||||
if (e.PlayerID == -1) { // Local player
|
if (e.PlayerID == -1) { // Local player
|
||||||
m_LocalPlayer = e.Player;
|
m_LocalPlayer = e.Player;
|
||||||
if (m_DrumLoopHasBeenStarted) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
m_CurrentBGMCombo = createSource("Audio/BGM/Layer2.wav");
|
|
||||||
m_CurrentBGMCombo->Type = SoundType::BGM;
|
|
||||||
alSourcei(m_CurrentBGMCombo->ALsource, AL_LOOPING, 1);
|
|
||||||
setGain(m_CurrentBGMCombo, 0);
|
|
||||||
playSound(m_CurrentBGMCombo);
|
|
||||||
m_DrumLoopHasBeenStarted = true;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -394,7 +381,9 @@ bool SoundManager::OnPlayQueueOnEntity(const Events::PlayQueueOnEntity &e)
|
|||||||
bool SoundManager::OnChangeBGM(const Events::ChangeBGM &e)
|
bool SoundManager::OnChangeBGM(const Events::ChangeBGM &e)
|
||||||
{
|
{
|
||||||
if (m_CurrentBGM != nullptr) {
|
if (m_CurrentBGM != nullptr) {
|
||||||
stopSound(m_CurrentBGM);
|
if (getSourceState(m_CurrentBGM->ALsource) == AL_PLAYING) {
|
||||||
|
stopSound(m_CurrentBGM);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m_CurrentBGM = createSource(e.FilePath);
|
m_CurrentBGM = createSource(e.FilePath);
|
||||||
m_CurrentBGM->Type = SoundType::BGM;
|
m_CurrentBGM->Type = SoundType::BGM;
|
||||||
@@ -403,6 +392,34 @@ bool SoundManager::OnChangeBGM(const Events::ChangeBGM &e)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SoundManager::OnSetCamera(const Events::SetCamera& e)
|
||||||
|
{
|
||||||
|
if (e.CameraEntity.Name() == "Overview_Camera_Start_Menu") {
|
||||||
|
if (m_CurrentBGMCombo != nullptr) {
|
||||||
|
if (getSourceState(m_CurrentBGMCombo->ALsource) == AL_PLAYING) {
|
||||||
|
stopSound(m_CurrentBGMCombo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Events::ChangeBGM changeBGM;
|
||||||
|
changeBGM.FilePath = "Audio/BGM/MenuMusic.wav";
|
||||||
|
m_EventBroker->Publish(changeBGM);
|
||||||
|
} else if (e.CameraEntity.Name() == "PickTeamCamera") {
|
||||||
|
Events::ChangeBGM changeBGM;
|
||||||
|
changeBGM.FilePath = "Audio/BGM/Layer1.wav";
|
||||||
|
m_EventBroker->Publish(changeBGM);
|
||||||
|
if (m_CurrentBGMCombo != nullptr) {
|
||||||
|
if (getSourceState(m_CurrentBGMCombo->ALsource) == AL_PLAYING) {
|
||||||
|
stopSound(m_CurrentBGMCombo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_CurrentBGMCombo = createSource("Audio/BGM/Layer2.wav");
|
||||||
|
m_CurrentBGMCombo->Type = SoundType::BGM;
|
||||||
|
alSourcei(m_CurrentBGMCombo->ALsource, AL_LOOPING, 1);
|
||||||
|
setGain(m_CurrentBGMCombo, 0);
|
||||||
|
playSound(m_CurrentBGMCombo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ALenum SoundManager::getSourceState(ALuint source)
|
ALenum SoundManager::getSourceState(ALuint source)
|
||||||
{
|
{
|
||||||
ALenum state;
|
ALenum state;
|
||||||
@@ -419,14 +436,14 @@ void SoundManager::setSoundProperties(Source* source, ComponentWrapper* soundCom
|
|||||||
{
|
{
|
||||||
float gain;
|
float gain;
|
||||||
switch (source->Type) {
|
switch (source->Type) {
|
||||||
case SoundType::SFX:
|
case SoundType::SFX:
|
||||||
gain = m_SFXVolumeChannel;
|
gain = m_SFXVolumeChannel;
|
||||||
break;
|
break;
|
||||||
case SoundType::BGM:
|
case SoundType::BGM:
|
||||||
gain = m_BGMVolumeChannel;
|
gain = m_BGMVolumeChannel;
|
||||||
break;
|
break;
|
||||||
case SoundType::Announcer:
|
case SoundType::Announcer:
|
||||||
gain = m_AnnouncerVolumeChannel;
|
gain = m_AnnouncerVolumeChannel;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
gain = 1.f;
|
gain = 1.f;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ void HealthHUDSystem::Update(double dt)
|
|||||||
|
|
||||||
if (entity.HasComponent("Text")) {
|
if (entity.HasComponent("Text")) {
|
||||||
double health = (const double&)entityIDParent["Health"]["Health"];
|
double health = (const double&)entityIDParent["Health"]["Health"];
|
||||||
double maxHealth = (const double&)entityIDParent["Health"]["Health"];
|
double maxHealth = (const double&)entityIDParent["Health"]["MaxHealth"];
|
||||||
std::string s = "";
|
std::string s = "";
|
||||||
s = s + std::to_string((int)health);
|
s = s + std::to_string((int)health);
|
||||||
s = s + "/";
|
s = s + "/";
|
||||||
@@ -35,7 +35,7 @@ void HealthHUDSystem::Update(double dt)
|
|||||||
|
|
||||||
if(entity.HasComponent("Fill")) {
|
if(entity.HasComponent("Fill")) {
|
||||||
double health = (const double&)entityIDParent["Health"]["Health"];
|
double health = (const double&)entityIDParent["Health"]["Health"];
|
||||||
double maxHealth = (const double&)entityIDParent["Health"]["Health"];
|
double maxHealth = (const double&)entityIDParent["Health"]["MaxHealth"];
|
||||||
float healthPercentage = health/maxHealth;
|
float healthPercentage = health/maxHealth;
|
||||||
entity["Fill"]["Color"] = glm::vec4(1.0 - healthPercentage, 0.f, healthPercentage, glm::vec4(entity["Fill"]["Color"]).a);
|
entity["Fill"]["Color"] = glm::vec4(1.0 - healthPercentage, 0.f, healthPercentage, glm::vec4(entity["Fill"]["Color"]).a);
|
||||||
entity["Fill"]["Percentage"] = (double)healthPercentage;
|
entity["Fill"]["Percentage"] = (double)healthPercentage;
|
||||||
|
|||||||
@@ -83,15 +83,24 @@ void PlayerSpawnSystem::Update(double dt)
|
|||||||
if (it->Team == cSpawnerTeam["Team"].Enum("Spectator")) {
|
if (it->Team == cSpawnerTeam["Team"].Enum("Spectator")) {
|
||||||
++playersSpectating;
|
++playersSpectating;
|
||||||
break;
|
break;
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Choose a different spawner depending on class picked?
|
// TODO: Choose a different spawner depending on class picked?
|
||||||
|
std::string playerEntityFile;
|
||||||
|
if (it->Class == PlayerClass::Assault) {
|
||||||
|
playerEntityFile = (const std::string&)cPlayerSpawn["AssaultFile"];
|
||||||
|
} else if (it->Class == PlayerClass::Defender) {
|
||||||
|
playerEntityFile = (const std::string&)cPlayerSpawn["DefenderFile"];
|
||||||
|
} else if (it->Class == PlayerClass::Sniper) {
|
||||||
|
playerEntityFile = (const std::string&)cPlayerSpawn["SniperFile"];
|
||||||
|
}
|
||||||
|
|
||||||
// Spawn the player!
|
// Spawn the player!
|
||||||
EntityWrapper player = SpawnerSystem::Spawn(spawner, EntityWrapper::Invalid, "Player");
|
EntityWrapper player = SpawnerSystem::SpawnEntityFile(playerEntityFile, spawner, EntityWrapper::Invalid, "Player");
|
||||||
// Set the player team affiliation
|
// Set the player team affiliation
|
||||||
player["Team"]["Team"] = it->Team;
|
player["Team"]["Team"] = it->Team;
|
||||||
|
|
||||||
|
|||||||
@@ -30,11 +30,6 @@ bool SoundSystem::OnPlayerSpawned(const Events::PlayerSpawned &e)
|
|||||||
Events::PlayAnonuncerVoice go;
|
Events::PlayAnonuncerVoice go;
|
||||||
go.FilePath = "Audio/Announcer/" + m_Announcer + "/Go.wav";
|
go.FilePath = "Audio/Announcer/" + m_Announcer + "/Go.wav";
|
||||||
m_EventBroker->Publish(go);
|
m_EventBroker->Publish(go);
|
||||||
{
|
|
||||||
Events::ChangeBGM ev;
|
|
||||||
ev.FilePath = "Audio/BGM/Layer1.wav";
|
|
||||||
m_EventBroker->Publish(ev);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,17 @@ SpawnerSystem::SpawnerSystem(SystemParams params)
|
|||||||
}
|
}
|
||||||
|
|
||||||
EntityWrapper SpawnerSystem::Spawn(EntityWrapper spawner, EntityWrapper parent /*= EntityWrapper::Invalid*/, const std::string& dontCollideComponent)
|
EntityWrapper SpawnerSystem::Spawn(EntityWrapper spawner, EntityWrapper parent /*= EntityWrapper::Invalid*/, const std::string& dontCollideComponent)
|
||||||
|
{
|
||||||
|
// Load the entity file and parse it
|
||||||
|
const std::string& entityFilePath = spawner["Spawner"]["EntityFile"];
|
||||||
|
if (!entityFilePath.empty()) {
|
||||||
|
return SpawnEntityFile(entityFilePath, spawner, parent, dontCollideComponent);
|
||||||
|
} else {
|
||||||
|
return EntityWrapper::Invalid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EntityWrapper SpawnerSystem::SpawnEntityFile(const std::string& entityFilePath, EntityWrapper spawner, EntityWrapper parent /*= EntityWrapper::Invalid*/, const std::string& dontCollideComponent /*= ""*/)
|
||||||
{
|
{
|
||||||
// Spawn the entity in the parent's world if it exists, otherwise in the spawner's world
|
// Spawn the entity in the parent's world if it exists, otherwise in the spawner's world
|
||||||
World* world = parent.World;
|
World* world = parent.World;
|
||||||
@@ -15,8 +26,6 @@ EntityWrapper SpawnerSystem::Spawn(EntityWrapper spawner, EntityWrapper parent /
|
|||||||
world = spawner.World;
|
world = spawner.World;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load the entity file and parse it
|
|
||||||
const std::string& entityFilePath = spawner["Spawner"]["EntityFile"];
|
|
||||||
EntityWrapper spawnedEntity;
|
EntityWrapper spawnedEntity;
|
||||||
try {
|
try {
|
||||||
auto entityFile = ResourceManager::Load<EntityFile>(entityFilePath);
|
auto entityFile = ResourceManager::Load<EntityFile>(entityFilePath);
|
||||||
@@ -39,7 +48,7 @@ EntityWrapper SpawnerSystem::Spawn(EntityWrapper spawner, EntityWrapper parent /
|
|||||||
|
|
||||||
// Find any SpawnPoints existing as children of spawner
|
// Find any SpawnPoints existing as children of spawner
|
||||||
auto children = spawner.World->GetDirectChildren(spawner.ID);
|
auto children = spawner.World->GetDirectChildren(spawner.ID);
|
||||||
std::vector<EntityWrapper> spawnPoints;
|
std::list<EntityWrapper> spawnPoints;
|
||||||
for (auto kv = children.first; kv != children.second; ++kv) {
|
for (auto kv = children.first; kv != children.second; ++kv) {
|
||||||
const EntityID& child = kv->second;
|
const EntityID& child = kv->second;
|
||||||
if (spawner.World->HasComponent(child, "SpawnPoint")) {
|
if (spawner.World->HasComponent(child, "SpawnPoint")) {
|
||||||
|
|||||||
@@ -61,7 +61,11 @@ bool SpectatorCameraSystem::OnInputCommand(const Events::InputCommand& e)
|
|||||||
// TODO: 1 Signifies spectator, should probably have real enum here later.
|
// TODO: 1 Signifies spectator, should probably have real enum here later.
|
||||||
// Spectators should never end up at the class select, instead put them at the SpectatorCamera.
|
// Spectators should never end up at the class select, instead put them at the SpectatorCamera.
|
||||||
if (swapToClass && m_PickedTeam != 1) {
|
if (swapToClass && m_PickedTeam != 1) {
|
||||||
camName = "PickClassCamera";
|
if (m_PickedTeam == 2) {
|
||||||
|
camName = "PickClassCameraRed";
|
||||||
|
} else if (m_PickedTeam == 3) {
|
||||||
|
camName = "PickClassCameraBlue";
|
||||||
|
}
|
||||||
} else if (e.Command == "SwapToTeamPick") {
|
} else if (e.Command == "SwapToTeamPick") {
|
||||||
camName = "PickTeamCamera";
|
camName = "PickTeamCamera";
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user