Indentation style changed to Allman
Using Artistic Style (http://astyle.sourceforge.net/) Options: --style=allman --indent=tab --keep-one-line-blocks --align-pointer=type --align-reference=name
This commit is contained in:
+5
-5
@@ -68,11 +68,11 @@ void Camera::Orientation(glm::quat val)
|
|||||||
void Camera::UpdateProjectionMatrix()
|
void Camera::UpdateProjectionMatrix()
|
||||||
{
|
{
|
||||||
m_ProjectionMatrix = glm::perspective(
|
m_ProjectionMatrix = glm::perspective(
|
||||||
m_FOV,
|
m_FOV,
|
||||||
m_AspectRatio,
|
m_AspectRatio,
|
||||||
m_NearClip,
|
m_NearClip,
|
||||||
m_FarClip
|
m_FarClip
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::UpdateViewMatrix()
|
void Camera::UpdateViewMatrix()
|
||||||
|
|||||||
+1
-1
@@ -30,7 +30,7 @@ public:
|
|||||||
|
|
||||||
glm::mat4 ViewMatrix() const { return m_ViewMatrix; }
|
glm::mat4 ViewMatrix() const { return m_ViewMatrix; }
|
||||||
void ViewMatrix(glm::mat4 val) { m_ViewMatrix = val; }
|
void ViewMatrix(glm::mat4 val) { m_ViewMatrix = val; }
|
||||||
|
|
||||||
float FOV() const { return m_FOV; }
|
float FOV() const { return m_FOV; }
|
||||||
void FOV(float val);
|
void FOV(float val);
|
||||||
|
|
||||||
|
|||||||
@@ -5,15 +5,15 @@
|
|||||||
|
|
||||||
namespace Components
|
namespace Components
|
||||||
{
|
{
|
||||||
// http://bulletphysics.org/mediawiki-1.5.8/index.php/Constraints
|
// http://bulletphysics.org/mediawiki-1.5.8/index.php/Constraints
|
||||||
struct BallSocketConstraint : Component
|
struct BallSocketConstraint : Component
|
||||||
{
|
{
|
||||||
// Create constraint between these entities
|
// Create constraint between these entities
|
||||||
EntityID EntityA;
|
EntityID EntityA;
|
||||||
EntityID EntityB;
|
EntityID EntityB;
|
||||||
// The pivot point in local coordinates
|
// The pivot point in local coordinates
|
||||||
glm::vec3 PivotA;
|
glm::vec3 PivotA;
|
||||||
glm::vec3 PivotB;
|
glm::vec3 PivotB;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif // Components_BallSocketConstraint_h__
|
#endif // Components_BallSocketConstraint_h__
|
||||||
@@ -6,12 +6,12 @@
|
|||||||
namespace Components
|
namespace Components
|
||||||
{
|
{
|
||||||
|
|
||||||
struct BoxShape : Component
|
struct BoxShape : Component
|
||||||
{
|
{
|
||||||
float Height;
|
float Height;
|
||||||
float Width;
|
float Width;
|
||||||
float Depth;
|
float Depth;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,10 @@
|
|||||||
|
|
||||||
namespace Components
|
namespace Components
|
||||||
{
|
{
|
||||||
struct CompoundShape : Component
|
struct CompoundShape : Component
|
||||||
{
|
{
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // Components_CompoundShape_h__
|
#endif // Components_CompoundShape_h__
|
||||||
@@ -7,10 +7,10 @@
|
|||||||
namespace Components
|
namespace Components
|
||||||
{
|
{
|
||||||
|
|
||||||
struct CustomShape : Component
|
struct CustomShape : Component
|
||||||
{
|
{
|
||||||
std::string fileName;
|
std::string fileName;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,10 @@
|
|||||||
|
|
||||||
namespace Components
|
namespace Components
|
||||||
{
|
{
|
||||||
struct FreeSteering : Component
|
struct FreeSteering : Component
|
||||||
{
|
{
|
||||||
float Speed = 35;
|
float Speed = 35;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // FreeSteering_h__
|
#endif // FreeSteering_h__
|
||||||
@@ -5,31 +5,31 @@
|
|||||||
|
|
||||||
namespace Components
|
namespace Components
|
||||||
{
|
{
|
||||||
// http://bulletphysics.org/mediawiki-1.5.8/index.php/Constraints
|
// http://bulletphysics.org/mediawiki-1.5.8/index.php/Constraints
|
||||||
struct HingeConstraint : Component
|
struct HingeConstraint : Component
|
||||||
{
|
{
|
||||||
// Create constraint between these entities
|
// Create constraint between these entities
|
||||||
EntityID EntityA;
|
EntityID EntityA;
|
||||||
EntityID EntityB;
|
EntityID EntityB;
|
||||||
// The pivot point in local coordinates
|
// The pivot point in local coordinates
|
||||||
glm::vec3 PivotA;
|
glm::vec3 PivotA;
|
||||||
glm::vec3 PivotB;
|
glm::vec3 PivotB;
|
||||||
// The axis to rotate around
|
// The axis to rotate around
|
||||||
glm::vec3 AxisA;
|
glm::vec3 AxisA;
|
||||||
glm::vec3 AxisB;
|
glm::vec3 AxisB;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
void setLimit(btScalar low,
|
void setLimit(btScalar low,
|
||||||
btScalar high,
|
btScalar high,
|
||||||
btScalar softness = 0.9f,
|
btScalar softness = 0.9f,
|
||||||
btScalar_biasFactor = 0.3f,
|
btScalar_biasFactor = 0.3f,
|
||||||
btScalar relaxationFactor = 1.0f)
|
btScalar relaxationFactor = 1.0f)
|
||||||
*/
|
*/
|
||||||
float LowLimit;
|
float LowLimit;
|
||||||
float HighLimit;
|
float HighLimit;
|
||||||
float Softness = 0.9f;
|
float Softness = 0.9f;
|
||||||
float BiasFactor = 0.3f;
|
float BiasFactor = 0.3f;
|
||||||
float RelaxationFactor = 1.0f;
|
float RelaxationFactor = 1.0f;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif // Components_HingeConstraint_h__
|
#endif // Components_HingeConstraint_h__
|
||||||
@@ -5,10 +5,10 @@
|
|||||||
|
|
||||||
namespace Components
|
namespace Components
|
||||||
{
|
{
|
||||||
struct MeshShape : Component
|
struct MeshShape : Component
|
||||||
{
|
{
|
||||||
std::string Filename;
|
std::string Filename;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // Components_MeshShape_h__
|
#endif // Components_MeshShape_h__
|
||||||
|
|||||||
@@ -6,12 +6,12 @@
|
|||||||
namespace Components
|
namespace Components
|
||||||
{
|
{
|
||||||
|
|
||||||
struct Physics : Component
|
struct Physics : Component
|
||||||
{
|
{
|
||||||
float Mass = 0;
|
float Mass = 0;
|
||||||
float Friction = 0;
|
float Friction = 0;
|
||||||
glm::vec3 Gravity = glm::vec3(0, -9.82f, 0);
|
glm::vec3 Gravity = glm::vec3(0, -9.82f, 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,12 +5,12 @@
|
|||||||
|
|
||||||
namespace Components
|
namespace Components
|
||||||
{
|
{
|
||||||
// http://bulletphysics.org/mediawiki-1.5.8/index.php/Constraints
|
// http://bulletphysics.org/mediawiki-1.5.8/index.php/Constraints
|
||||||
struct SliderConstraint : Component
|
struct SliderConstraint : Component
|
||||||
{
|
{
|
||||||
// Create constraint between these entities
|
// Create constraint between these entities
|
||||||
EntityID EntityA;
|
EntityID EntityA;
|
||||||
EntityID EntityB;
|
EntityID EntityB;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif // Components_SliderConstraint_h__
|
#endif // Components_SliderConstraint_h__
|
||||||
@@ -6,11 +6,11 @@
|
|||||||
namespace Components
|
namespace Components
|
||||||
{
|
{
|
||||||
|
|
||||||
struct SphereShape : Component
|
struct SphereShape : Component
|
||||||
{
|
{
|
||||||
float Radius;
|
float Radius;
|
||||||
float RollingFriction;
|
float RollingFriction;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,10 @@
|
|||||||
|
|
||||||
namespace Components
|
namespace Components
|
||||||
{
|
{
|
||||||
struct StaticMeshShape : Component
|
struct StaticMeshShape : Component
|
||||||
{
|
{
|
||||||
std::string Filename;
|
std::string Filename;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // Components_StaticMeshShape_h__
|
#endif // Components_StaticMeshShape_h__
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace Components
|
|||||||
|
|
||||||
struct Transform : Component
|
struct Transform : Component
|
||||||
{
|
{
|
||||||
Transform()
|
Transform()
|
||||||
: Scale(glm::vec3(1.f)) { }
|
: Scale(glm::vec3(1.f)) { }
|
||||||
|
|
||||||
glm::vec3 Position;
|
glm::vec3 Position;
|
||||||
|
|||||||
+15
-12
@@ -15,7 +15,8 @@ CubemapTexture::CubemapTexture(std::string posXFile, std::string negXFile, std::
|
|||||||
|
|
||||||
CubemapTexture::~CubemapTexture()
|
CubemapTexture::~CubemapTexture()
|
||||||
{
|
{
|
||||||
if (m_Texture != 0) {
|
if (m_Texture != 0)
|
||||||
|
{
|
||||||
//glDeleteTextures(1, &m_Texture);
|
//glDeleteTextures(1, &m_Texture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -25,17 +26,18 @@ void CubemapTexture::Load()
|
|||||||
m_Loaded = true;
|
m_Loaded = true;
|
||||||
|
|
||||||
m_Texture = SOIL_load_OGL_cubemap(
|
m_Texture = SOIL_load_OGL_cubemap(
|
||||||
m_TextureFiles[0].c_str(),
|
m_TextureFiles[0].c_str(),
|
||||||
m_TextureFiles[1].c_str(),
|
m_TextureFiles[1].c_str(),
|
||||||
m_TextureFiles[2].c_str(),
|
m_TextureFiles[2].c_str(),
|
||||||
m_TextureFiles[3].c_str(),
|
m_TextureFiles[3].c_str(),
|
||||||
m_TextureFiles[4].c_str(),
|
m_TextureFiles[4].c_str(),
|
||||||
m_TextureFiles[5].c_str(),
|
m_TextureFiles[5].c_str(),
|
||||||
SOIL_LOAD_AUTO,
|
SOIL_LOAD_AUTO,
|
||||||
SOIL_CREATE_NEW_ID,
|
SOIL_CREATE_NEW_ID,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
if (m_Texture == 0) {
|
if (m_Texture == 0)
|
||||||
|
{
|
||||||
LOG_ERROR("SOIL cubemap loading error: %s", SOIL_last_result());
|
LOG_ERROR("SOIL cubemap loading error: %s", SOIL_last_result());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -49,7 +51,8 @@ void CubemapTexture::Load()
|
|||||||
|
|
||||||
void CubemapTexture::Bind(GLenum textureUnit)
|
void CubemapTexture::Bind(GLenum textureUnit)
|
||||||
{
|
{
|
||||||
if (!m_Loaded) {
|
if (!m_Loaded)
|
||||||
|
{
|
||||||
LOG_WARNING("Cubemap \"%s\" was not loaded before being bound! Attempting to load now...", m_TextureFiles[0].c_str());
|
LOG_WARNING("Cubemap \"%s\" was not loaded before being bound! Attempting to load now...", m_TextureFiles[0].c_str());
|
||||||
Load();
|
Load();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ class CubemapTexture
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CubemapTexture(
|
CubemapTexture(
|
||||||
std::string posXFile,
|
std::string posXFile,
|
||||||
std::string negXFile,
|
std::string negXFile,
|
||||||
std::string posYFile,
|
std::string posYFile,
|
||||||
std::string negYFile,
|
std::string negYFile,
|
||||||
std::string posZFile,
|
std::string posZFile,
|
||||||
std::string negZFile);
|
std::string negZFile);
|
||||||
~CubemapTexture();
|
~CubemapTexture();
|
||||||
|
|
||||||
void Load();
|
void Load();
|
||||||
|
|||||||
+5
-2
@@ -18,9 +18,12 @@ public:
|
|||||||
T Create(std::string name)
|
T Create(std::string name)
|
||||||
{
|
{
|
||||||
auto it = m_FactoryFunctions.find(name);
|
auto it = m_FactoryFunctions.find(name);
|
||||||
if (it != m_FactoryFunctions.end()) {
|
if (it != m_FactoryFunctions.end())
|
||||||
|
{
|
||||||
return it->second();
|
return it->second();
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-8
@@ -32,10 +32,10 @@ void GameWorld::Initialize()
|
|||||||
physics->Friction = 0.5f;
|
physics->Friction = 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
for (int i = 0; i < 1; i++)
|
for (int i = 0; i < 1; i++)
|
||||||
{
|
{
|
||||||
auto entity = CreateEntity();
|
auto entity = CreateEntity();
|
||||||
@@ -81,7 +81,7 @@ void GameWorld::Initialize()
|
|||||||
hingeConstraint->HighLimit = glm::pi<float>();
|
hingeConstraint->HighLimit = glm::pi<float>();
|
||||||
hingeConstraint->PivotA = glm::vec3(-5, 0, 0);
|
hingeConstraint->PivotA = glm::vec3(-5, 0, 0);
|
||||||
hingeConstraint->PivotB = glm::vec3(0, 0, 0);
|
hingeConstraint->PivotB = glm::vec3(0, 0, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -98,7 +98,7 @@ void GameWorld::Initialize()
|
|||||||
emitter->Loop = true;
|
emitter->Loop = true;
|
||||||
GetSystem<Systems::SoundSystem>("SoundSystem")->PlaySound(emitter);
|
GetSystem<Systems::SoundSystem>("SoundSystem")->PlaySound(emitter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,12 +143,12 @@ void GameWorld::RegisterSystems()
|
|||||||
//m_SystemFactory.Register("PlayerSystem", [this]() { return new Systems::PlayerSystem(this); });
|
//m_SystemFactory.Register("PlayerSystem", [this]() { return new Systems::PlayerSystem(this); });
|
||||||
m_SystemFactory.Register("FreeSteeringSystem", [this]() { return new Systems::FreeSteeringSystem(this); });
|
m_SystemFactory.Register("FreeSteeringSystem", [this]() { return new Systems::FreeSteeringSystem(this); });
|
||||||
m_SystemFactory.Register("SoundSystem", [this]() { return new Systems::SoundSystem(this); });
|
m_SystemFactory.Register("SoundSystem", [this]() { return new Systems::SoundSystem(this); });
|
||||||
|
|
||||||
m_SystemFactory.Register("PhysicsSystem", [this]() { return new Systems::PhysicsSystem(this); });
|
m_SystemFactory.Register("PhysicsSystem", [this]() { return new Systems::PhysicsSystem(this); });
|
||||||
|
|
||||||
m_SystemFactory.Register("RenderSystem", [this]() { return new Systems::RenderSystem(this, m_Renderer); });
|
m_SystemFactory.Register("RenderSystem", [this]() { return new Systems::RenderSystem(this, m_Renderer); });
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameWorld::AddSystems()
|
void GameWorld::AddSystems()
|
||||||
@@ -163,8 +163,8 @@ void GameWorld::AddSystems()
|
|||||||
AddSystem("SoundSystem");
|
AddSystem("SoundSystem");
|
||||||
|
|
||||||
AddSystem("PhysicsSystem");
|
AddSystem("PhysicsSystem");
|
||||||
|
|
||||||
AddSystem("RenderSystem");
|
AddSystem("RenderSystem");
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
+14
-14
@@ -16,19 +16,19 @@
|
|||||||
#include "Systems/PhysicsSystem.h"
|
#include "Systems/PhysicsSystem.h"
|
||||||
|
|
||||||
#include "Components/Bounds.h"
|
#include "Components/Bounds.h"
|
||||||
#include "Components/Camera.h"
|
#include "Components/Camera.h"
|
||||||
#include "Components/Collision.h"
|
#include "Components/Collision.h"
|
||||||
#include "Components/DirectionalLight.h"
|
#include "Components/DirectionalLight.h"
|
||||||
#include "Components/Input.h"
|
#include "Components/Input.h"
|
||||||
#include "Components/Model.h"
|
#include "Components/Model.h"
|
||||||
#include "Components/ParticleEmitter.h"
|
#include "Components/ParticleEmitter.h"
|
||||||
#include "Components/PointLight.h"
|
#include "Components/PointLight.h"
|
||||||
#include "Components/PowerUp.h"
|
#include "Components/PowerUp.h"
|
||||||
#include "Components/SoundEmitter.h"
|
#include "Components/SoundEmitter.h"
|
||||||
#include "Components/Sprite.h"
|
#include "Components/Sprite.h"
|
||||||
#include "Components/Stat.h"
|
#include "Components/Stat.h"
|
||||||
#include "Components/Template.h"
|
#include "Components/Template.h"
|
||||||
#include "Components/Transform.h"
|
#include "Components/Transform.h"
|
||||||
|
|
||||||
#include "Components/CompoundShape.h"
|
#include "Components/CompoundShape.h"
|
||||||
#include "Components/BoxShape.h"
|
#include "Components/BoxShape.h"
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
class GameWorld : public World
|
class GameWorld : public World
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
GameWorld(std::shared_ptr<Renderer> renderer)
|
GameWorld(std::shared_ptr<Renderer> renderer)
|
||||||
: m_Renderer(renderer), World() { }
|
: m_Renderer(renderer), World() { }
|
||||||
|
|
||||||
void Initialize();
|
void Initialize();
|
||||||
|
|||||||
+38
-22
@@ -12,13 +12,16 @@ Model::Model(OBJ &obj)
|
|||||||
OBJ::MaterialInfo* currentMaterial = nullptr;
|
OBJ::MaterialInfo* currentMaterial = nullptr;
|
||||||
TextureGroup* currentTexGroup = nullptr;
|
TextureGroup* currentTexGroup = nullptr;
|
||||||
int index = 0;
|
int index = 0;
|
||||||
for (auto face : obj.Faces) {
|
for (auto face : obj.Faces)
|
||||||
if (face.Material == nullptr) {
|
{
|
||||||
|
if (face.Material == nullptr)
|
||||||
|
{
|
||||||
LOG_ERROR("Missing material for .obj file \"%s\"", obj.Path().string().c_str());
|
LOG_ERROR("Missing material for .obj file \"%s\"", obj.Path().string().c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// New material
|
// New material
|
||||||
if (face.Material != currentMaterial) {
|
if (face.Material != currentMaterial)
|
||||||
|
{
|
||||||
currentMaterial = face.Material;
|
currentMaterial = face.Material;
|
||||||
// Load texture
|
// Load texture
|
||||||
std::shared_ptr<Texture> texture = std::make_shared<Texture>(currentMaterial->TextureFile);
|
std::shared_ptr<Texture> texture = std::make_shared<Texture>(currentMaterial->TextureFile);
|
||||||
@@ -30,18 +33,21 @@ Model::Model(OBJ &obj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Face definitions
|
// Face definitions
|
||||||
for (auto faceDef : face.Definitions) {
|
for (auto faceDef : face.Definitions)
|
||||||
|
{
|
||||||
glm::vec3 vertex;
|
glm::vec3 vertex;
|
||||||
std::tie(vertex.x, vertex.y, vertex.z) = obj.Vertices.at(faceDef.VertexIndex - 1);
|
std::tie(vertex.x, vertex.y, vertex.z) = obj.Vertices.at(faceDef.VertexIndex - 1);
|
||||||
Vertices.push_back(vertex);
|
Vertices.push_back(vertex);
|
||||||
|
|
||||||
if (faceDef.NormalIndex != 0) {
|
if (faceDef.NormalIndex != 0)
|
||||||
|
{
|
||||||
glm::vec3 normal;
|
glm::vec3 normal;
|
||||||
std::tie(normal.x, normal.y, normal.z) = obj.Normals.at(faceDef.NormalIndex - 1);
|
std::tie(normal.x, normal.y, normal.z) = obj.Normals.at(faceDef.NormalIndex - 1);
|
||||||
Normals.push_back(normal);
|
Normals.push_back(normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (faceDef.TextureCoordIndex != 0) {
|
if (faceDef.TextureCoordIndex != 0)
|
||||||
|
{
|
||||||
glm::vec2 texCoord;
|
glm::vec2 texCoord;
|
||||||
// TODO: W-coord?
|
// TODO: W-coord?
|
||||||
std::tie(texCoord.x, texCoord.y, std::ignore) = obj.TextureCoords.at(faceDef.TextureCoordIndex - 1);
|
std::tie(texCoord.x, texCoord.y, std::ignore) = obj.TextureCoords.at(faceDef.TextureCoordIndex - 1);
|
||||||
@@ -53,19 +59,20 @@ Model::Model(OBJ &obj)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Vertices.size() > 0) {
|
if (Vertices.size() > 0)
|
||||||
|
{
|
||||||
CreateBuffers(Vertices, Normals, TextureCoords);
|
CreateBuffers(Vertices, Normals, TextureCoords);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Model::Loadobj(const char* path, std::vector <glm::vec3> & out_vertices, std::vector <glm::vec3> &out_normals, std::vector <glm::vec2> & out_TextureCoords)
|
bool Model::Loadobj(const char* path, std::vector <glm::vec3> &out_vertices, std::vector <glm::vec3> &out_normals, std::vector <glm::vec2> &out_TextureCoords)
|
||||||
{
|
{
|
||||||
std::vector< unsigned int > vertexIndices, TextureCoordIndices, normalIndices;
|
std::vector< unsigned int > vertexIndices, TextureCoordIndices, normalIndices;
|
||||||
std::vector< glm::vec3 > temp_vertices;
|
std::vector< glm::vec3 > temp_vertices;
|
||||||
std::vector< glm::vec2 > temp_TextureCoords;
|
std::vector< glm::vec2 > temp_TextureCoords;
|
||||||
std::vector< glm::vec3 > temp_normals;
|
std::vector< glm::vec3 > temp_normals;
|
||||||
|
|
||||||
FILE * file = fopen(path, "r");
|
FILE* file = fopen(path, "r");
|
||||||
LOG_INFO("Loading .obj file");
|
LOG_INFO("Loading .obj file");
|
||||||
if( file == NULL )
|
if( file == NULL )
|
||||||
{
|
{
|
||||||
@@ -76,7 +83,7 @@ bool Model::Loadobj(const char* path, std::vector <glm::vec3> & out_vertices, st
|
|||||||
|
|
||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
|
|
||||||
//read the first word of the line
|
//read the first word of the line
|
||||||
int res = fscanf(file, "%s", lineHeader);
|
int res = fscanf(file, "%s", lineHeader);
|
||||||
|
|
||||||
@@ -147,14 +154,14 @@ bool Model::Loadobj(const char* path, std::vector <glm::vec3> & out_vertices, st
|
|||||||
normalIndices.push_back(normalIndex[2]);
|
normalIndices.push_back(normalIndex[2]);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if ( strcmp( lineHeader, "mtllib" ) == 0 )
|
else if ( strcmp( lineHeader, "mtllib" ) == 0 )
|
||||||
{
|
{
|
||||||
|
|
||||||
char fileName[512];
|
char fileName[512];
|
||||||
fscanf(file, "%s\n", &fileName);
|
fscanf(file, "%s\n", &fileName);
|
||||||
|
|
||||||
|
|
||||||
FILE * mtlfile = fopen(fileName, "r");
|
FILE* mtlfile = fopen(fileName, "r");
|
||||||
LOG_INFO("Loading .mtl file");
|
LOG_INFO("Loading .mtl file");
|
||||||
if( mtlfile == NULL )
|
if( mtlfile == NULL )
|
||||||
{
|
{
|
||||||
@@ -171,10 +178,10 @@ bool Model::Loadobj(const char* path, std::vector <glm::vec3> & out_vertices, st
|
|||||||
|
|
||||||
if( mtlres == EOF ) // EOF - End Of File
|
if( mtlres == EOF ) // EOF - End Of File
|
||||||
{
|
{
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if ( strcmp( mtllineHeader, "map_Kd" ) == 0 )
|
else if ( strcmp( mtllineHeader, "map_Kd" ) == 0 )
|
||||||
{
|
{
|
||||||
char textureFileName[512];
|
char textureFileName[512];
|
||||||
fscanf(mtlfile, "%s", textureFileName);
|
fscanf(mtlfile, "%s", textureFileName);
|
||||||
@@ -182,7 +189,7 @@ bool Model::Loadobj(const char* path, std::vector <glm::vec3> & out_vertices, st
|
|||||||
LOG_INFO("Texture Loaded\n");
|
LOG_INFO("Texture Loaded\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -197,32 +204,41 @@ void Model::CreateBuffers( std::vector<glm::vec3> vertices, std::vector<glm::vec
|
|||||||
|
|
||||||
LOG_INFO("Generating VertexBuffer");
|
LOG_INFO("Generating VertexBuffer");
|
||||||
glGenBuffers(1, &VertexBuffer);
|
glGenBuffers(1, &VertexBuffer);
|
||||||
if (vertices.size() > 0) {
|
if (vertices.size() > 0)
|
||||||
|
{
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
|
glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
|
||||||
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STATIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STATIC_DRAW);
|
||||||
GLERROR("GLEW: BufferFail, VertexBuffer");
|
GLERROR("GLEW: BufferFail, VertexBuffer");
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
LOG_WARNING("Created empty vertex buffer!");
|
LOG_WARNING("Created empty vertex buffer!");
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO("Generating NormalBuffer");
|
LOG_INFO("Generating NormalBuffer");
|
||||||
glGenBuffers(1, &NormalBuffer);
|
glGenBuffers(1, &NormalBuffer);
|
||||||
if (normals.size() > 0) {
|
if (normals.size() > 0)
|
||||||
|
{
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, NormalBuffer);
|
glBindBuffer(GL_ARRAY_BUFFER, NormalBuffer);
|
||||||
glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), &normals[0], GL_STATIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), &normals[0], GL_STATIC_DRAW);
|
||||||
GLERROR("GLEW: BufferFail, NormalBuffer");
|
GLERROR("GLEW: BufferFail, NormalBuffer");
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
LOG_WARNING("Created empty normal buffer!");
|
LOG_WARNING("Created empty normal buffer!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LOG_INFO("Generating textureCoordBuffer");
|
LOG_INFO("Generating textureCoordBuffer");
|
||||||
glGenBuffers(1, &TextureCoordBuffer);
|
glGenBuffers(1, &TextureCoordBuffer);
|
||||||
if (textureCoords.size() > 0) {
|
if (textureCoords.size() > 0)
|
||||||
|
{
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, TextureCoordBuffer);
|
glBindBuffer(GL_ARRAY_BUFFER, TextureCoordBuffer);
|
||||||
glBufferData(GL_ARRAY_BUFFER, textureCoords.size() * sizeof(glm::vec2), &textureCoords[0], GL_STATIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, textureCoords.size() * sizeof(glm::vec2), &textureCoords[0], GL_STATIC_DRAW);
|
||||||
GLERROR("GLEW: BufferFail, TextureCoordBuffer");
|
GLERROR("GLEW: BufferFail, TextureCoordBuffer");
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
LOG_WARNING("Created empty texture coordinate buffer!");
|
LOG_WARNING("Created empty texture coordinate buffer!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
-10
@@ -34,7 +34,7 @@ public:
|
|||||||
std::vector<glm::vec3> Vertices;
|
std::vector<glm::vec3> Vertices;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::vector<glm::vec3> Normals;
|
std::vector<glm::vec3> Normals;
|
||||||
std::vector<glm::vec2> TextureCoords;
|
std::vector<glm::vec2> TextureCoords;
|
||||||
|
|
||||||
@@ -43,17 +43,17 @@ private:
|
|||||||
GLuint TextureCoordBuffer;
|
GLuint TextureCoordBuffer;
|
||||||
|
|
||||||
bool Loadobj(
|
bool Loadobj(
|
||||||
const char* path,
|
const char* path,
|
||||||
std::vector <glm::vec3> & out_vertices,
|
std::vector <glm::vec3> &out_vertices,
|
||||||
std::vector <glm::vec3> &out_normals,
|
std::vector <glm::vec3> &out_normals,
|
||||||
std::vector <glm::vec2> & out_TextureCoords
|
std::vector <glm::vec2> &out_TextureCoords
|
||||||
);
|
);
|
||||||
|
|
||||||
void CreateBuffers(
|
void CreateBuffers(
|
||||||
std::vector<glm::vec3> _Vertices,
|
std::vector<glm::vec3> _Vertices,
|
||||||
std::vector<glm::vec3> _Normals,
|
std::vector<glm::vec3> _Normals,
|
||||||
std::vector<glm::vec2>_TextureCoords
|
std::vector<glm::vec2>_TextureCoords
|
||||||
);
|
);
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif // Model_h__
|
#endif // Model_h__
|
||||||
+56
-28
@@ -7,15 +7,17 @@ bool OBJ::LoadFromFile(std::string filename)
|
|||||||
|
|
||||||
// http://paulbourke.net/dataformats/obj/
|
// http://paulbourke.net/dataformats/obj/
|
||||||
std::ifstream file(m_Path.string());
|
std::ifstream file(m_Path.string());
|
||||||
if (!file.is_open()) {
|
if (!file.is_open())
|
||||||
|
{
|
||||||
LOG_ERROR("Failed to open .obj \"%s\"", m_Path.string().c_str());
|
LOG_ERROR("Failed to open .obj \"%s\"", m_Path.string().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO("Parsing .obj \"%s\"", m_Path.string().c_str());
|
LOG_INFO("Parsing .obj \"%s\"", m_Path.string().c_str());
|
||||||
|
|
||||||
std::string line;
|
std::string line;
|
||||||
while (std::getline(file, line)) {
|
while (std::getline(file, line))
|
||||||
|
{
|
||||||
if (line.length() == 0)
|
if (line.length() == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -29,7 +31,8 @@ bool OBJ::LoadFromFile(std::string filename)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Material files
|
// Material files
|
||||||
if (prefix == "mtllib") {
|
if (prefix == "mtllib")
|
||||||
|
{
|
||||||
std::string materialFilename;
|
std::string materialFilename;
|
||||||
ss >> materialFilename;
|
ss >> materialFilename;
|
||||||
m_MaterialPath = m_Path.branch_path() / materialFilename;
|
m_MaterialPath = m_Path.branch_path() / materialFilename;
|
||||||
@@ -38,7 +41,8 @@ bool OBJ::LoadFromFile(std::string filename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Material statement
|
// Material statement
|
||||||
if (prefix == "usemtl") {
|
if (prefix == "usemtl")
|
||||||
|
{
|
||||||
std::string material;
|
std::string material;
|
||||||
ss >> material;
|
ss >> material;
|
||||||
m_CurrentMaterial = &Materials[material];
|
m_CurrentMaterial = &Materials[material];
|
||||||
@@ -46,7 +50,8 @@ bool OBJ::LoadFromFile(std::string filename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Vertices
|
// Vertices
|
||||||
if (prefix == "v") {
|
if (prefix == "v")
|
||||||
|
{
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
ss >> x >> y >> z;
|
ss >> x >> y >> z;
|
||||||
Vertices.push_back(std::make_tuple(x, y, z));
|
Vertices.push_back(std::make_tuple(x, y, z));
|
||||||
@@ -54,26 +59,30 @@ bool OBJ::LoadFromFile(std::string filename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Normals
|
// Normals
|
||||||
if (prefix == "vn") {
|
if (prefix == "vn")
|
||||||
|
{
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
ss >> x >> y >> z;
|
ss >> x >> y >> z;
|
||||||
Normals.push_back(std::make_tuple(x, y, z));
|
Normals.push_back(std::make_tuple(x, y, z));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Texture coordinates
|
// Texture coordinates
|
||||||
if (prefix == "vt") {
|
if (prefix == "vt")
|
||||||
|
{
|
||||||
float u, v, w;
|
float u, v, w;
|
||||||
ss >> u >> v >> w;
|
ss >> u >> v >> w;
|
||||||
TextureCoords.push_back(std::make_tuple(u, v, w));
|
TextureCoords.push_back(std::make_tuple(u, v, w));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Face definitions
|
// Face definitions
|
||||||
if (prefix == "f") {
|
if (prefix == "f")
|
||||||
|
{
|
||||||
Face face;
|
Face face;
|
||||||
face.Material = m_CurrentMaterial;
|
face.Material = m_CurrentMaterial;
|
||||||
|
|
||||||
std::string faceDefString;
|
std::string faceDefString;
|
||||||
while (ss >> faceDefString) {
|
while (ss >> faceDefString)
|
||||||
|
{
|
||||||
std::stringstream ss2(faceDefString);
|
std::stringstream ss2(faceDefString);
|
||||||
FaceDefinition faceDef = { 0, 0, 0 };
|
FaceDefinition faceDef = { 0, 0, 0 };
|
||||||
|
|
||||||
@@ -82,10 +91,13 @@ bool OBJ::LoadFromFile(std::string filename)
|
|||||||
if (!ss2)
|
if (!ss2)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (ss2.peek() == '/') {
|
if (ss2.peek() == '/')
|
||||||
|
{
|
||||||
ss2.ignore();
|
ss2.ignore();
|
||||||
ss2 >> faceDef.NormalIndex;
|
ss2 >> faceDef.NormalIndex;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
ss2 >> faceDef.TextureCoordIndex;
|
ss2 >> faceDef.TextureCoordIndex;
|
||||||
ss2.ignore();
|
ss2.ignore();
|
||||||
ss2 >> faceDef.NormalIndex;
|
ss2 >> faceDef.NormalIndex;
|
||||||
@@ -103,7 +115,8 @@ void OBJ::ParseMaterial()
|
|||||||
{
|
{
|
||||||
// http://paulbourke.net/dataformats/mtl/
|
// http://paulbourke.net/dataformats/mtl/
|
||||||
std::ifstream file(m_MaterialPath.string());
|
std::ifstream file(m_MaterialPath.string());
|
||||||
if (!file.is_open()) {
|
if (!file.is_open())
|
||||||
|
{
|
||||||
LOG_ERROR("Failed to open .mtl \"%s\"", m_MaterialPath.string().c_str());
|
LOG_ERROR("Failed to open .mtl \"%s\"", m_MaterialPath.string().c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -114,7 +127,8 @@ void OBJ::ParseMaterial()
|
|||||||
MaterialInfo* currentMaterial = nullptr;
|
MaterialInfo* currentMaterial = nullptr;
|
||||||
|
|
||||||
std::string line;
|
std::string line;
|
||||||
while (std::getline(file, line)) {
|
while (std::getline(file, line))
|
||||||
|
{
|
||||||
if (line.length() == 0)
|
if (line.length() == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -124,8 +138,9 @@ void OBJ::ParseMaterial()
|
|||||||
ss >> prefix;
|
ss >> prefix;
|
||||||
|
|
||||||
// Create a new material definition
|
// Create a new material definition
|
||||||
if (prefix == "newmtl") {
|
if (prefix == "newmtl")
|
||||||
MaterialInfo mat =
|
{
|
||||||
|
MaterialInfo mat =
|
||||||
{
|
{
|
||||||
"",
|
"",
|
||||||
std::make_tuple(0.2f, 0.2f, 0.2f),
|
std::make_tuple(0.2f, 0.2f, 0.2f),
|
||||||
@@ -149,39 +164,47 @@ void OBJ::ParseMaterial()
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Ambient color
|
// Ambient color
|
||||||
if (prefix == "Ka") {
|
if (prefix == "Ka")
|
||||||
|
{
|
||||||
float r, g, b;
|
float r, g, b;
|
||||||
ss >> r >> g >> b;
|
ss >> r >> g >> b;
|
||||||
currentMaterial->AmbientColor = std::make_tuple(r, g, b);
|
currentMaterial->AmbientColor = std::make_tuple(r, g, b);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Diffuse color
|
// Diffuse color
|
||||||
if (prefix == "Kd") {
|
if (prefix == "Kd")
|
||||||
|
{
|
||||||
float r, g, b;
|
float r, g, b;
|
||||||
ss >> r >> g >> b;
|
ss >> r >> g >> b;
|
||||||
currentMaterial->DiffuseColor = std::make_tuple(r, g, b);
|
currentMaterial->DiffuseColor = std::make_tuple(r, g, b);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Specular color
|
// Specular color
|
||||||
if (prefix == "Ks") {
|
if (prefix == "Ks")
|
||||||
|
{
|
||||||
float r, g, b;
|
float r, g, b;
|
||||||
ss >> r >> g >> b;
|
ss >> r >> g >> b;
|
||||||
currentMaterial->SpecularColor = std::make_tuple(r, g, b);
|
currentMaterial->SpecularColor = std::make_tuple(r, g, b);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Transmission filter
|
// Transmission filter
|
||||||
if (prefix == "Tf") {
|
if (prefix == "Tf")
|
||||||
|
{
|
||||||
std::stringstream ss2;
|
std::stringstream ss2;
|
||||||
ss2 << ss.str();
|
ss2 << ss.str();
|
||||||
|
|
||||||
std::string command;
|
std::string command;
|
||||||
ss2 >> command;
|
ss2 >> command;
|
||||||
if (command == "xyz") {
|
if (command == "xyz")
|
||||||
|
{
|
||||||
// TODO: "The "Ks xyz" statement specifies the specular reflectivity using CIEXYZ values."
|
// TODO: "The "Ks xyz" statement specifies the specular reflectivity using CIEXYZ values."
|
||||||
}
|
}
|
||||||
else if (command == "spectral") {
|
else if (command == "spectral")
|
||||||
|
{
|
||||||
// TODO: "The "Tf spectral" statement specifies the transmission filter using a spectral curve."
|
// TODO: "The "Tf spectral" statement specifies the transmission filter using a spectral curve."
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
float r, g, b;
|
float r, g, b;
|
||||||
ss >> r;
|
ss >> r;
|
||||||
// G and B are optional
|
// G and B are optional
|
||||||
@@ -195,22 +218,26 @@ void OBJ::ParseMaterial()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Optical density
|
// Optical density
|
||||||
if (prefix == "Ni") {
|
if (prefix == "Ni")
|
||||||
|
{
|
||||||
ss >> currentMaterial->OpticalDensity;
|
ss >> currentMaterial->OpticalDensity;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Alpha
|
// Alpha
|
||||||
if (prefix == "d" || prefix == "Tr") {
|
if (prefix == "d" || prefix == "Tr")
|
||||||
|
{
|
||||||
ss >> currentMaterial->Alpha;
|
ss >> currentMaterial->Alpha;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Shininess
|
// Shininess
|
||||||
if (prefix == "Ns") {
|
if (prefix == "Ns")
|
||||||
|
{
|
||||||
ss >> currentMaterial->Shininess;
|
ss >> currentMaterial->Shininess;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Illumination model
|
// Illumination model
|
||||||
if (prefix == "illum") {
|
if (prefix == "illum")
|
||||||
|
{
|
||||||
int illum = 0;
|
int illum = 0;
|
||||||
ss >> illum;
|
ss >> illum;
|
||||||
currentMaterial->IlluminationModel = illum;
|
currentMaterial->IlluminationModel = illum;
|
||||||
@@ -218,7 +245,8 @@ void OBJ::ParseMaterial()
|
|||||||
}
|
}
|
||||||
// Texture file
|
// Texture file
|
||||||
// TODO:
|
// TODO:
|
||||||
if (prefix == "map_Ka" || prefix == "map_Kd") {
|
if (prefix == "map_Ka" || prefix == "map_Kd")
|
||||||
|
{
|
||||||
std::string textureFile;
|
std::string textureFile;
|
||||||
ss >> textureFile;
|
ss >> textureFile;
|
||||||
currentMaterial->TextureFile = (m_MaterialPath.branch_path() / textureFile).string();
|
currentMaterial->TextureFile = (m_MaterialPath.branch_path() / textureFile).string();
|
||||||
|
|||||||
+45
-32
@@ -24,7 +24,8 @@ Renderer::Renderer()
|
|||||||
void Renderer::Initialize()
|
void Renderer::Initialize()
|
||||||
{
|
{
|
||||||
// Initialize GLFW
|
// Initialize GLFW
|
||||||
if (!glfwInit()) {
|
if (!glfwInit())
|
||||||
|
{
|
||||||
LOG_ERROR("GLFW: Initialization failed");
|
LOG_ERROR("GLFW: Initialization failed");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
@@ -35,7 +36,8 @@ void Renderer::Initialize()
|
|||||||
// Antialiasing
|
// Antialiasing
|
||||||
//glfwWindowHint(GLFW_SAMPLES, 16);
|
//glfwWindowHint(GLFW_SAMPLES, 16);
|
||||||
m_Window = glfwCreateWindow(WIDTH, HEIGHT, "OpenGL", nullptr, nullptr);
|
m_Window = glfwCreateWindow(WIDTH, HEIGHT, "OpenGL", nullptr, 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);
|
||||||
}
|
}
|
||||||
@@ -54,11 +56,12 @@ void Renderer::Initialize()
|
|||||||
glfwSetWindowTitle(m_Window, ss.str().c_str());
|
glfwSetWindowTitle(m_Window, ss.str().c_str());
|
||||||
|
|
||||||
// Initialize GLEW
|
// Initialize GLEW
|
||||||
if (glewInit() != GLEW_OK) {
|
if (glewInit() != GLEW_OK)
|
||||||
|
{
|
||||||
LOG_ERROR("GLEW: Initialization failed");
|
LOG_ERROR("GLEW: Initialization failed");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create Camera
|
// Create Camera
|
||||||
m_Camera = std::make_shared<Camera>(45.f, (float)WIDTH / HEIGHT, 0.01f, 1000.f);
|
m_Camera = std::make_shared<Camera>(45.f, (float)WIDTH / HEIGHT, 0.01f, 1000.f);
|
||||||
m_Camera->Position(glm::vec3(0.0f, 0.0f, 2.f));
|
m_Camera->Position(glm::vec3(0.0f, 0.0f, 2.f));
|
||||||
@@ -134,7 +137,8 @@ void Renderer::CreateShadowMap(int resolution)
|
|||||||
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_ShadowDepthTexture, 0);
|
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_ShadowDepthTexture, 0);
|
||||||
glDrawBuffer(GL_NONE);
|
glDrawBuffer(GL_NONE);
|
||||||
|
|
||||||
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
||||||
|
{
|
||||||
LOG_ERROR("Framebuffer incomplete!");
|
LOG_ERROR("Framebuffer incomplete!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -149,11 +153,13 @@ void Renderer::Draw(double dt)
|
|||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
// Draw bounding boxes
|
// Draw bounding boxes
|
||||||
if (m_DrawBounds) {
|
if (m_DrawBounds)
|
||||||
|
{
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
|
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
|
||||||
m_ShaderProgramDebugAABB.Bind();
|
m_ShaderProgramDebugAABB.Bind();
|
||||||
for (auto tuple : AABBsToRender) {
|
for (auto tuple : AABBsToRender)
|
||||||
|
{
|
||||||
glm::mat4 modelMatrix;
|
glm::mat4 modelMatrix;
|
||||||
bool colliding;
|
bool colliding;
|
||||||
std::tie(modelMatrix, colliding) = tuple;
|
std::tie(modelMatrix, colliding) = tuple;
|
||||||
@@ -211,11 +217,11 @@ void Renderer::DrawScene()
|
|||||||
glm::mat4 depthViewMatrix = glm::lookAt(m_SunPosition, m_SunTarget, glm::vec3(0, 1, 0)) * glm::translate(-m_Camera->Position() * glm::vec3(1, 0, 0));
|
glm::mat4 depthViewMatrix = glm::lookAt(m_SunPosition, m_SunTarget, glm::vec3(0, 1, 0)) * glm::translate(-m_Camera->Position() * glm::vec3(1, 0, 0));
|
||||||
glm::mat4 depthCamera = m_SunProjection * depthViewMatrix;
|
glm::mat4 depthCamera = m_SunProjection * depthViewMatrix;
|
||||||
glm::mat4 biasMatrix(
|
glm::mat4 biasMatrix(
|
||||||
0.5, 0.0, 0.0, 0.0,
|
0.5, 0.0, 0.0, 0.0,
|
||||||
0.0, 0.5, 0.0, 0.0,
|
0.0, 0.5, 0.0, 0.0,
|
||||||
0.0, 0.0, 0.5, 0.0,
|
0.0, 0.0, 0.5, 0.0,
|
||||||
0.5, 0.5, 0.5, 1.0
|
0.5, 0.5, 0.5, 1.0
|
||||||
);
|
);
|
||||||
|
|
||||||
m_ShaderProgram.Bind();
|
m_ShaderProgram.Bind();
|
||||||
glUniform1i(glGetUniformLocation(m_ShaderProgram.GetHandle(), "numberOfLights"), Lights);
|
glUniform1i(glGetUniformLocation(m_ShaderProgram.GetHandle(), "numberOfLights"), Lights);
|
||||||
@@ -226,7 +232,8 @@ void Renderer::DrawScene()
|
|||||||
glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "linearAttenuation"), Lights, Light_linearAttenuation.data());
|
glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "linearAttenuation"), Lights, Light_linearAttenuation.data());
|
||||||
glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "quadraticAttenuation"), Lights, Light_quadraticAttenuation.data());
|
glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "quadraticAttenuation"), Lights, Light_quadraticAttenuation.data());
|
||||||
glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "spotExponent"), Lights, Light_spotExponent.data());
|
glUniform1fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "spotExponent"), Lights, Light_spotExponent.data());
|
||||||
if (m_DrawWireframe) {
|
if (m_DrawWireframe)
|
||||||
|
{
|
||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||||
}
|
}
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
@@ -252,16 +259,18 @@ void Renderer::DrawScene()
|
|||||||
glUniformMatrix4fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "model"), 1, GL_FALSE, glm::value_ptr(modelMatrix));
|
glUniformMatrix4fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "model"), 1, GL_FALSE, glm::value_ptr(modelMatrix));
|
||||||
glUniformMatrix4fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "view"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix()));
|
glUniformMatrix4fv(glGetUniformLocation(m_ShaderProgram.GetHandle(), "view"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix()));
|
||||||
glBindVertexArray(model->VAO);
|
glBindVertexArray(model->VAO);
|
||||||
for (auto texGroup : model->TextureGroups) {
|
for (auto texGroup : model->TextureGroups)
|
||||||
|
{
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, *texGroup.Texture);
|
glBindTexture(GL_TEXTURE_2D, *texGroup.Texture);
|
||||||
glDrawArrays(GL_TRIANGLES, texGroup.StartIndex, texGroup.EndIndex - texGroup.StartIndex + 1);
|
glDrawArrays(GL_TRIANGLES, texGroup.StartIndex, texGroup.EndIndex - texGroup.StartIndex + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
// Debug draw model normals
|
// Debug draw model normals
|
||||||
if (m_DrawNormals) {
|
if (m_DrawNormals)
|
||||||
|
{
|
||||||
m_ShaderProgramNormals.Bind();
|
m_ShaderProgramNormals.Bind();
|
||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||||
DrawModels(m_ShaderProgramNormals);
|
DrawModels(m_ShaderProgramNormals);
|
||||||
@@ -304,7 +313,8 @@ void Renderer::DrawShadowMap()
|
|||||||
glUniformMatrix4fv(glGetUniformLocation(m_ShaderProgramShadows.GetHandle(), "MVP"), 1, GL_FALSE, glm::value_ptr(MVP));
|
glUniformMatrix4fv(glGetUniformLocation(m_ShaderProgramShadows.GetHandle(), "MVP"), 1, GL_FALSE, glm::value_ptr(MVP));
|
||||||
|
|
||||||
glBindVertexArray(model->VAO);
|
glBindVertexArray(model->VAO);
|
||||||
for (auto texGroup : model->TextureGroups) {
|
for (auto texGroup : model->TextureGroups)
|
||||||
|
{
|
||||||
glDrawArrays(GL_TRIANGLES, texGroup.StartIndex, texGroup.EndIndex - texGroup.StartIndex + 1);
|
glDrawArrays(GL_TRIANGLES, texGroup.StartIndex, texGroup.EndIndex - texGroup.StartIndex + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -343,7 +353,7 @@ void Renderer::DrawModels(ShaderProgram &shader)
|
|||||||
glBindVertexArray(model->VAO);
|
glBindVertexArray(model->VAO);
|
||||||
for (auto texGroup : model->TextureGroups) {
|
for (auto texGroup : model->TextureGroups) {
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, texGroup.Texture->texture);
|
glBindTexture(GL_TEXTURE_2D, texGroup.Texture->texture);
|
||||||
glDrawArrays(GL_TRIANGLES, texGroup.StartIndex, texGroup.EndIndex - texGroup.StartIndex + 1);
|
glDrawArrays(GL_TRIANGLES, texGroup.StartIndex, texGroup.EndIndex - texGroup.StartIndex + 1);
|
||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
@@ -367,14 +377,14 @@ void Renderer::AddModelToDraw(std::shared_ptr<Model> model, glm::vec3 position,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::AddPointLightToDraw(
|
void Renderer::AddPointLightToDraw(
|
||||||
glm::vec3 _position,
|
glm::vec3 _position,
|
||||||
glm::vec3 _specular,
|
glm::vec3 _specular,
|
||||||
glm::vec3 _diffuse,
|
glm::vec3 _diffuse,
|
||||||
float _constantAttenuation,
|
float _constantAttenuation,
|
||||||
float _linearAttenuation,
|
float _linearAttenuation,
|
||||||
float _quadraticAttenuation,
|
float _quadraticAttenuation,
|
||||||
float _spotExponent
|
float _spotExponent
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
Light_position.push_back(_position.x);
|
Light_position.push_back(_position.x);
|
||||||
Light_position.push_back(_position.y);
|
Light_position.push_back(_position.y);
|
||||||
@@ -402,7 +412,8 @@ void Renderer::AddAABBToDraw(glm::vec3 origin, glm::vec3 volumeVector, bool coll
|
|||||||
|
|
||||||
GLuint Renderer::CreateQuad()
|
GLuint Renderer::CreateQuad()
|
||||||
{
|
{
|
||||||
float quadVertices[] = {
|
float quadVertices[] =
|
||||||
|
{
|
||||||
-1.0f, -1.0f, 0.0f,
|
-1.0f, -1.0f, 0.0f,
|
||||||
1.0f, 1.0f, 0.0f,
|
1.0f, 1.0f, 0.0f,
|
||||||
-1.0f, 1.0f, 0.0f,
|
-1.0f, 1.0f, 0.0f,
|
||||||
@@ -411,7 +422,8 @@ GLuint Renderer::CreateQuad()
|
|||||||
1.0f, -1.0f, 0.0f,
|
1.0f, -1.0f, 0.0f,
|
||||||
1.0f, 1.0f, 0.0f,
|
1.0f, 1.0f, 0.0f,
|
||||||
};
|
};
|
||||||
float quadTexCoords[] = {
|
float quadTexCoords[] =
|
||||||
|
{
|
||||||
0.0f, 0.0f,
|
0.0f, 0.0f,
|
||||||
1.0f, 1.0f,
|
1.0f, 1.0f,
|
||||||
0.0f, 1.0f,
|
0.0f, 1.0f,
|
||||||
@@ -443,7 +455,8 @@ GLuint Renderer::CreateQuad()
|
|||||||
|
|
||||||
GLuint Renderer::CreateAABB()
|
GLuint Renderer::CreateAABB()
|
||||||
{
|
{
|
||||||
float vertices[] = {
|
float vertices[] =
|
||||||
|
{
|
||||||
// Bottom
|
// Bottom
|
||||||
-1.0f, -1.0f, 1.0f, // 0
|
-1.0f, -1.0f, 1.0f, // 0
|
||||||
1.0f, -1.0f, 1.0f, // 1
|
1.0f, -1.0f, 1.0f, // 1
|
||||||
@@ -494,14 +507,14 @@ GLuint Renderer::CreateAABB()
|
|||||||
|
|
||||||
GLuint Renderer::CreateSkybox()
|
GLuint Renderer::CreateSkybox()
|
||||||
{
|
{
|
||||||
glm::vec3 skyBoxVertices[] =
|
glm::vec3 skyBoxVertices[] =
|
||||||
{
|
{
|
||||||
glm::vec3( 1.0f, -1.0f, -1.0f), glm::vec3( 1.0f, -1.0f, 1.0f), glm::vec3( 1.0f, 1.0f, 1.0f), glm::vec3( 1.0f, 1.0f, 1.0f), glm::vec3( 1.0f, 1.0f, -1.0f), glm::vec3( 1.0f, -1.0f, -1.0f),
|
glm::vec3( 1.0f, -1.0f, -1.0f), glm::vec3( 1.0f, -1.0f, 1.0f), glm::vec3( 1.0f, 1.0f, 1.0f), glm::vec3( 1.0f, 1.0f, 1.0f), glm::vec3( 1.0f, 1.0f, -1.0f), glm::vec3( 1.0f, -1.0f, -1.0f),
|
||||||
glm::vec3(-1.0f, -1.0f, 1.0f), glm::vec3(-1.0f, -1.0f, -1.0f), glm::vec3(-1.0f, 1.0f, -1.0f), glm::vec3(-1.0f, 1.0f, -1.0f), glm::vec3(-1.0f, 1.0f, 1.0f), glm::vec3(-1.0f, -1.0f, 1.0f),
|
glm::vec3(-1.0f, -1.0f, 1.0f), glm::vec3(-1.0f, -1.0f, -1.0f), glm::vec3(-1.0f, 1.0f, -1.0f), glm::vec3(-1.0f, 1.0f, -1.0f), glm::vec3(-1.0f, 1.0f, 1.0f), glm::vec3(-1.0f, -1.0f, 1.0f),
|
||||||
glm::vec3(-1.0f, 1.0f, -1.0f), glm::vec3( 1.0f, 1.0f, -1.0f), glm::vec3( 1.0f, 1.0f, 1.0f), glm::vec3( 1.0f, 1.0f, 1.0f), glm::vec3(-1.0f, 1.0f, 1.0f), glm::vec3(-1.0f, 1.0f, -1.0f),
|
glm::vec3(-1.0f, 1.0f, -1.0f), glm::vec3( 1.0f, 1.0f, -1.0f), glm::vec3( 1.0f, 1.0f, 1.0f), glm::vec3( 1.0f, 1.0f, 1.0f), glm::vec3(-1.0f, 1.0f, 1.0f), glm::vec3(-1.0f, 1.0f, -1.0f),
|
||||||
glm::vec3(-1.0f, -1.0f, 1.0f), glm::vec3( 1.0f, -1.0f, 1.0f), glm::vec3( 1.0f, -1.0f, -1.0f), glm::vec3( 1.0f, -1.0f, -1.0f), glm::vec3(-1.0f, -1.0f, -1.0f), glm::vec3(-1.0f, -1.0f, 1.0f),
|
glm::vec3(-1.0f, -1.0f, 1.0f), glm::vec3( 1.0f, -1.0f, 1.0f), glm::vec3( 1.0f, -1.0f, -1.0f), glm::vec3( 1.0f, -1.0f, -1.0f), glm::vec3(-1.0f, -1.0f, -1.0f), glm::vec3(-1.0f, -1.0f, 1.0f),
|
||||||
glm::vec3( 1.0f, -1.0f, 1.0f), glm::vec3(-1.0f, -1.0f, 1.0f), glm::vec3(-1.0f, 1.0f, 1.0f), glm::vec3(-1.0f, 1.0f, 1.0f), glm::vec3( 1.0f, 1.0f, 1.0f), glm::vec3( 1.0f, -1.0f, 1.0f),
|
glm::vec3( 1.0f, -1.0f, 1.0f), glm::vec3(-1.0f, -1.0f, 1.0f), glm::vec3(-1.0f, 1.0f, 1.0f), glm::vec3(-1.0f, 1.0f, 1.0f), glm::vec3( 1.0f, 1.0f, 1.0f), glm::vec3( 1.0f, -1.0f, 1.0f),
|
||||||
glm::vec3(-1.0f, -1.0f, -1.0f), glm::vec3( 1.0f, -1.0f, -1.0f), glm::vec3( 1.0f, 1.0f, -1.0f), glm::vec3( 1.0f, 1.0f, -1.0f), glm::vec3(-1.0f, 1.0f, -1.0f), glm::vec3(-1.0f, -1.0f, -1.0f)
|
glm::vec3(-1.0f, -1.0f, -1.0f), glm::vec3( 1.0f, -1.0f, -1.0f), glm::vec3( 1.0f, 1.0f, -1.0f), glm::vec3( 1.0f, 1.0f, -1.0f), glm::vec3(-1.0f, 1.0f, -1.0f), glm::vec3(-1.0f, -1.0f, -1.0f)
|
||||||
};
|
};
|
||||||
|
|
||||||
GLuint vbo, vao;
|
GLuint vbo, vao;
|
||||||
|
|||||||
+11
-11
@@ -16,7 +16,7 @@
|
|||||||
class Renderer
|
class Renderer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
glm::mat4 viewMatrix;
|
glm::mat4 viewMatrix;
|
||||||
glm::mat4 projectionMatrix;
|
glm::mat4 projectionMatrix;
|
||||||
|
|
||||||
@@ -42,14 +42,14 @@ public:
|
|||||||
void AddModelToDraw(std::shared_ptr<Model> model, glm::vec3 position, glm::quat orientation, glm::vec3 scale, bool visible, bool shadowCaster);
|
void AddModelToDraw(std::shared_ptr<Model> model, glm::vec3 position, glm::quat orientation, glm::vec3 scale, bool visible, bool shadowCaster);
|
||||||
void AddTextToDraw();
|
void AddTextToDraw();
|
||||||
void AddPointLightToDraw(
|
void AddPointLightToDraw(
|
||||||
glm::vec3 _position,
|
glm::vec3 _position,
|
||||||
glm::vec3 _specular,
|
glm::vec3 _specular,
|
||||||
glm::vec3 _diffuse,
|
glm::vec3 _diffuse,
|
||||||
float _constantAttenuation,
|
float _constantAttenuation,
|
||||||
float _linearAttenuation,
|
float _linearAttenuation,
|
||||||
float _quadraticAttenuation,
|
float _quadraticAttenuation,
|
||||||
float _spotExponent
|
float _spotExponent
|
||||||
);
|
);
|
||||||
void AddAABBToDraw(glm::vec3 origin, glm::vec3 volumeVector, bool colliding);
|
void AddAABBToDraw(glm::vec3 origin, glm::vec3 volumeVector, bool colliding);
|
||||||
|
|
||||||
void LoadContent();
|
void LoadContent();
|
||||||
@@ -65,7 +65,7 @@ public:
|
|||||||
void DrawBounds(bool val) { m_DrawBounds = val; }
|
void DrawBounds(bool val) { m_DrawBounds = val; }
|
||||||
void DrawSkybox();
|
void DrawSkybox();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GLFWwindow* m_Window;
|
GLFWwindow* m_Window;
|
||||||
@@ -96,7 +96,7 @@ private:
|
|||||||
ShaderProgram m_ShaderProgramShadowsDrawDepth;
|
ShaderProgram m_ShaderProgramShadowsDrawDepth;
|
||||||
ShaderProgram m_ShaderProgramDebugAABB;
|
ShaderProgram m_ShaderProgramDebugAABB;
|
||||||
ShaderProgram m_ShaderProgramSkybox;
|
ShaderProgram m_ShaderProgramSkybox;
|
||||||
|
|
||||||
void ClearStuff();
|
void ClearStuff();
|
||||||
void DrawScene();
|
void DrawScene();
|
||||||
void DrawModels(ShaderProgram &shader);
|
void DrawModels(ShaderProgram &shader);
|
||||||
|
|||||||
+16
-8
@@ -7,7 +7,8 @@ GLuint Shader::CompileShader(GLenum shaderType, std::string fileName)
|
|||||||
|
|
||||||
std::string shaderFile;
|
std::string shaderFile;
|
||||||
std::ifstream in(fileName, std::ios::in);
|
std::ifstream in(fileName, std::ios::in);
|
||||||
if (!in) {
|
if (!in)
|
||||||
|
{
|
||||||
LOG_ERROR("Error: Failed to open shader file \"%s\"", fileName.c_str());
|
LOG_ERROR("Error: Failed to open shader file \"%s\"", fileName.c_str());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -31,7 +32,8 @@ GLuint Shader::CompileShader(GLenum shaderType, std::string fileName)
|
|||||||
|
|
||||||
GLint compileStatus;
|
GLint compileStatus;
|
||||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &compileStatus);
|
glGetShaderiv(shader, GL_COMPILE_STATUS, &compileStatus);
|
||||||
if(compileStatus != GL_TRUE) {
|
if(compileStatus != GL_TRUE)
|
||||||
|
{
|
||||||
LOG_ERROR("Shader compilation failed");
|
LOG_ERROR("Shader compilation failed");
|
||||||
GLsizei infoLogLength;
|
GLsizei infoLogLength;
|
||||||
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
|
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
|
||||||
@@ -54,7 +56,8 @@ Shader::Shader(GLenum shaderType, std::string fileName) : m_ShaderType(shaderTyp
|
|||||||
|
|
||||||
Shader::~Shader()
|
Shader::~Shader()
|
||||||
{
|
{
|
||||||
if (m_ShaderHandle != 0) {
|
if (m_ShaderHandle != 0)
|
||||||
|
{
|
||||||
glDeleteShader(m_ShaderHandle);
|
glDeleteShader(m_ShaderHandle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -87,7 +90,8 @@ bool Shader::IsCompiled() const
|
|||||||
|
|
||||||
ShaderProgram::~ShaderProgram()
|
ShaderProgram::~ShaderProgram()
|
||||||
{
|
{
|
||||||
if (m_ShaderProgramHandle != 0) {
|
if (m_ShaderProgramHandle != 0)
|
||||||
|
{
|
||||||
glDeleteProgram(m_ShaderProgramHandle);
|
glDeleteProgram(m_ShaderProgramHandle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -99,8 +103,10 @@ void ShaderProgram::AddShader(std::shared_ptr<Shader> shader)
|
|||||||
|
|
||||||
void ShaderProgram::Compile()
|
void ShaderProgram::Compile()
|
||||||
{
|
{
|
||||||
for (auto &shader : m_Shaders) {
|
for (auto &shader : m_Shaders)
|
||||||
if (!shader->IsCompiled()) {
|
{
|
||||||
|
if (!shader->IsCompiled())
|
||||||
|
{
|
||||||
shader->Compile();
|
shader->Compile();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,14 +114,16 @@ void ShaderProgram::Compile()
|
|||||||
|
|
||||||
GLuint ShaderProgram::Link()
|
GLuint ShaderProgram::Link()
|
||||||
{
|
{
|
||||||
if (m_Shaders.size() == 0) {
|
if (m_Shaders.size() == 0)
|
||||||
|
{
|
||||||
LOG_ERROR("Failed to link shader program: No shaders bound");
|
LOG_ERROR("Failed to link shader program: No shaders bound");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO("Linking shader program");
|
LOG_INFO("Linking shader program");
|
||||||
m_ShaderProgramHandle = glCreateProgram();
|
m_ShaderProgramHandle = glCreateProgram();
|
||||||
for (auto &shader : m_Shaders) {
|
for (auto &shader : m_Shaders)
|
||||||
|
{
|
||||||
glAttachShader(m_ShaderProgramHandle, shader->GetHandle());
|
glAttachShader(m_ShaderProgramHandle, shader->GetHandle());
|
||||||
}
|
}
|
||||||
glLinkProgram(m_ShaderProgramHandle);
|
glLinkProgram(m_ShaderProgramHandle);
|
||||||
|
|||||||
+3
-3
@@ -32,7 +32,7 @@ template <int SHADERTYPE>
|
|||||||
class ShaderType : public Shader
|
class ShaderType : public Shader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ShaderType(std::string fileName)
|
ShaderType(std::string fileName)
|
||||||
: Shader(SHADERTYPE, fileName) { }
|
: Shader(SHADERTYPE, fileName) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -60,10 +60,10 @@ public:
|
|||||||
class ShaderProgram
|
class ShaderProgram
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ShaderProgram()
|
ShaderProgram()
|
||||||
: m_ShaderProgramHandle(0) { }
|
: m_ShaderProgramHandle(0) { }
|
||||||
~ShaderProgram();
|
~ShaderProgram();
|
||||||
|
|
||||||
void AddShader(std::shared_ptr<Shader> shader);
|
void AddShader(std::shared_ptr<Shader> shader);
|
||||||
void Compile();
|
void Compile();
|
||||||
GLuint Link();
|
GLuint Link();
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
uniform vec4 Color;
|
uniform vec4 Color;
|
||||||
|
|
||||||
in VertexData {
|
in VertexData
|
||||||
|
{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec2 TextureCoord;
|
vec2 TextureCoord;
|
||||||
@@ -11,7 +12,8 @@ in VertexData {
|
|||||||
|
|
||||||
out vec4 FragmentColor;
|
out vec4 FragmentColor;
|
||||||
|
|
||||||
void main() {
|
void main()
|
||||||
|
{
|
||||||
//FragmentColor = vec4(1.0 - gl_Color.r, 1.0 - gl_Color.g, 1.0 - gl_Color.b, 0.0);
|
//FragmentColor = vec4(1.0 - gl_Color.r, 1.0 - gl_Color.g, 1.0 - gl_Color.b, 0.0);
|
||||||
FragmentColor = Color;
|
FragmentColor = Color;
|
||||||
}
|
}
|
||||||
+20
-16
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
uniform mat4 model;
|
uniform mat4 model;
|
||||||
uniform mat4 view;
|
uniform mat4 view;
|
||||||
|
|
||||||
layout(binding=0) uniform sampler2D texture0;
|
layout(binding=0) uniform sampler2D texture0;
|
||||||
layout(binding=1) uniform sampler2D shadowMap;
|
layout(binding=1) uniform sampler2D shadowMap;
|
||||||
|
|
||||||
@@ -16,7 +16,8 @@ uniform float linearAttenuation[maxNumberOfLights];
|
|||||||
uniform float quadraticAttenuation[maxNumberOfLights];
|
uniform float quadraticAttenuation[maxNumberOfLights];
|
||||||
uniform float spotExponent[maxNumberOfLights];
|
uniform float spotExponent[maxNumberOfLights];
|
||||||
|
|
||||||
in VertexData {
|
in VertexData
|
||||||
|
{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec2 TextureCoord;
|
vec2 TextureCoord;
|
||||||
@@ -24,10 +25,11 @@ in VertexData {
|
|||||||
} Input;
|
} Input;
|
||||||
|
|
||||||
vec3 scene_ambient = vec3(0.5, 0.5, 0.5);
|
vec3 scene_ambient = vec3(0.5, 0.5, 0.5);
|
||||||
|
|
||||||
out vec4 fragmentColor;
|
out vec4 fragmentColor;
|
||||||
|
|
||||||
void main() {
|
void main()
|
||||||
|
{
|
||||||
|
|
||||||
// Texture
|
// Texture
|
||||||
vec4 texel = texture2D(texture0, Input.TextureCoord);
|
vec4 texel = texture2D(texture0, Input.TextureCoord);
|
||||||
@@ -50,10 +52,12 @@ void main() {
|
|||||||
//float bias = 0.001 * tan(acos(cosTheta)); // cosTheta is dot( n,l ), clamped between 0 and 1
|
//float bias = 0.001 * tan(acos(cosTheta)); // cosTheta is dot( n,l ), clamped between 0 and 1
|
||||||
//bias = clamp(bias, 0.0, 0.01);
|
//bias = clamp(bias, 0.0, 0.01);
|
||||||
float visibility = 1.0;
|
float visibility = 1.0;
|
||||||
if (Input.ShadowCoord.x >= 0.0 && Input.ShadowCoord.x <= 1.0 && Input.ShadowCoord.y >= 0.0 && Input.ShadowCoord.y <= 1.0) {
|
if (Input.ShadowCoord.x >= 0.0 && Input.ShadowCoord.x <= 1.0 && Input.ShadowCoord.y >= 0.0 && Input.ShadowCoord.y <= 1.0)
|
||||||
|
{
|
||||||
float bias = 0.00005;
|
float bias = 0.00005;
|
||||||
vec4 shadowMapValue = texture(shadowMap, Input.ShadowCoord.xy);
|
vec4 shadowMapValue = texture(shadowMap, Input.ShadowCoord.xy);
|
||||||
if (shadowMapValue.z < clamp(Input.ShadowCoord.z - bias, 0, 1)) {
|
if (shadowMapValue.z < clamp(Input.ShadowCoord.z - bias, 0, 1))
|
||||||
|
{
|
||||||
visibility = 0.3;
|
visibility = 0.3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -68,40 +72,40 @@ void main() {
|
|||||||
//vec3 lightPosition = vec3(0, 0, 2);
|
//vec3 lightPosition = vec3(0, 0, 2);
|
||||||
vec3 Ls = specular[i]; // Specular light
|
vec3 Ls = specular[i]; // Specular light
|
||||||
vec3 Ld = diffuse[i]; // Diffuse light
|
vec3 Ld = diffuse[i]; // Diffuse light
|
||||||
|
|
||||||
vec3 lightPosView = vec3(view * vec4(position[i], 1.0));
|
vec3 lightPosView = vec3(view * vec4(position[i], 1.0));
|
||||||
vec3 surfacePosition = vec3(model * vec4(Input.Position, 1.0));
|
vec3 surfacePosition = vec3(model * vec4(Input.Position, 1.0));
|
||||||
vec3 surfacePosView = vec3(view * vec4(surfacePosition, 1.0));
|
vec3 surfacePosView = vec3(view * vec4(surfacePosition, 1.0));
|
||||||
vec3 surfaceToLight = normalize(lightPosView - surfacePosView);
|
vec3 surfaceToLight = normalize(lightPosView - surfacePosView);
|
||||||
mat3 normalMatrix = transpose(inverse(mat3(view * model)));
|
mat3 normalMatrix = transpose(inverse(mat3(view * model)));
|
||||||
vec3 surfaceNormal = normalize(normalMatrix * Input.Normal);
|
vec3 surfaceNormal = normalize(normalMatrix * Input.Normal);
|
||||||
|
|
||||||
float dist = length(position[i] - surfacePosition);
|
float dist = length(position[i] - surfacePosition);
|
||||||
|
|
||||||
attenuation = 1.0 / (constantAttenuation[i]
|
attenuation = 1.0 / (constantAttenuation[i]
|
||||||
+ linearAttenuation[i] * dist
|
+ linearAttenuation[i] * dist
|
||||||
+ quadraticAttenuation[i] * pow(dist, 2.0));
|
+ quadraticAttenuation[i] * pow(dist, 2.0));
|
||||||
//attenuation = attenuation * pow(clampedCosine, spotExponent[i]);
|
//attenuation = attenuation * pow(clampedCosine, spotExponent[i]);
|
||||||
|
|
||||||
// Diffuse light
|
// Diffuse light
|
||||||
float dotProd = dot(surfaceToLight, surfaceNormal);
|
float dotProd = dot(surfaceToLight, surfaceNormal);
|
||||||
dotProd = max(dotProd, 0.0);
|
dotProd = max(dotProd, 0.0);
|
||||||
|
|
||||||
Id = Ld * Kd * abs(dotProd) * attenuation;
|
Id = Ld * Kd * abs(dotProd) * attenuation;
|
||||||
|
|
||||||
// Specular light
|
// Specular light
|
||||||
vec3 reflection = reflect(-surfaceToLight, surfaceNormal);
|
vec3 reflection = reflect(-surfaceToLight, surfaceNormal);
|
||||||
float dotSpecular = dot(reflection, normalize(-surfacePosView));
|
float dotSpecular = dot(reflection, normalize(-surfacePosView));
|
||||||
dotSpecular = max(dotSpecular, 0.0);
|
dotSpecular = max(dotSpecular, 0.0);
|
||||||
float specularFactor = pow(dotSpecular, 30.0); // Specular factor
|
float specularFactor = pow(dotSpecular, 30.0); // Specular factor
|
||||||
|
|
||||||
Is = attenuation * Ls * Ks * specularFactor;
|
Is = attenuation * Ls * Ks * specularFactor;
|
||||||
|
|
||||||
totalLighting = totalLighting + Id + Is;
|
totalLighting = totalLighting + Id + Is;
|
||||||
}
|
}
|
||||||
|
|
||||||
fragmentColor = vec4(totalLighting, 1.0) * texel;
|
fragmentColor = vec4(totalLighting, 1.0) * texel;
|
||||||
|
|
||||||
|
|
||||||
//fragmentColor = vec4(Id, 1.0) * texel;
|
//fragmentColor = vec4(Id, 1.0) * texel;
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ uniform mat4 MVP;
|
|||||||
|
|
||||||
out vec4 FragmentColor;
|
out vec4 FragmentColor;
|
||||||
|
|
||||||
void main() {
|
void main()
|
||||||
|
{
|
||||||
FragmentColor = vec4(1.0, 1.0, 1.0, 1.0);
|
FragmentColor = vec4(1.0, 1.0, 1.0, 1.0);
|
||||||
}
|
}
|
||||||
@@ -5,13 +5,15 @@ uniform mat4 MVP;
|
|||||||
layout(triangles) in;
|
layout(triangles) in;
|
||||||
layout(line_strip, max_vertices = 6) out;
|
layout(line_strip, max_vertices = 6) out;
|
||||||
|
|
||||||
in VertexData {
|
in VertexData
|
||||||
|
{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec2 TextureCoord;
|
vec2 TextureCoord;
|
||||||
} Input[3];
|
} Input[3];
|
||||||
|
|
||||||
out VertexData {
|
out VertexData
|
||||||
|
{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec2 TextureCoord;
|
vec2 TextureCoord;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ uniform mat4 MVP;
|
|||||||
|
|
||||||
layout(location = 0) out float FragmentDepth;
|
layout(location = 0) out float FragmentDepth;
|
||||||
|
|
||||||
void main() {
|
void main()
|
||||||
|
{
|
||||||
FragmentDepth = gl_FragCoord.z;
|
FragmentDepth = gl_FragCoord.z;
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,8 @@ layout(location = 0) in vec3 Position;
|
|||||||
layout(location = 1) in vec3 Normal;
|
layout(location = 1) in vec3 Normal;
|
||||||
layout(location = 2) in vec2 TextureCoord;
|
layout(location = 2) in vec2 TextureCoord;
|
||||||
|
|
||||||
out VertexData {
|
out VertexData
|
||||||
|
{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec2 TextureCoord;
|
vec2 TextureCoord;
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
uniform samplerCube CubemapTexture;
|
uniform samplerCube CubemapTexture;
|
||||||
|
|
||||||
in VertexData {
|
in VertexData
|
||||||
|
{
|
||||||
vec3 TextureCoord;
|
vec3 TextureCoord;
|
||||||
} Input;
|
} Input;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ uniform mat4 MVP;
|
|||||||
|
|
||||||
layout(location = 0) in vec3 Position;
|
layout(location = 0) in vec3 Position;
|
||||||
|
|
||||||
out VertexData {
|
out VertexData
|
||||||
|
{
|
||||||
vec3 TextureCoord;
|
vec3 TextureCoord;
|
||||||
} Output;
|
} Output;
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ layout(location = 0) in vec3 Position;
|
|||||||
layout(location = 1) in vec3 Normal;
|
layout(location = 1) in vec3 Normal;
|
||||||
layout(location = 2) in vec2 TextureCoord;
|
layout(location = 2) in vec2 TextureCoord;
|
||||||
|
|
||||||
out VertexData {
|
out VertexData
|
||||||
|
{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
vec3 Normal;
|
vec3 Normal;
|
||||||
vec2 TextureCoord;
|
vec2 TextureCoord;
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
layout(binding = 0) uniform sampler2D DepthTexture;
|
layout(binding = 0) uniform sampler2D DepthTexture;
|
||||||
|
|
||||||
in VertexData {
|
in VertexData
|
||||||
|
{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
vec2 TextureCoord;
|
vec2 TextureCoord;
|
||||||
} Input;
|
} Input;
|
||||||
@@ -11,12 +12,13 @@ out vec4 FragmentColor;
|
|||||||
|
|
||||||
float LinearizeDepth(float z)
|
float LinearizeDepth(float z)
|
||||||
{
|
{
|
||||||
float n = 0.1; // camera z near
|
float n = 0.1; // camera z near
|
||||||
float f = 800.0; // camera z far
|
float f = 800.0; // camera z far
|
||||||
return (2.0 * n) / (f + n - z * (f - n));
|
return (2.0 * n) / (f + n - z * (f - n));
|
||||||
}
|
}
|
||||||
|
|
||||||
void main() {
|
void main()
|
||||||
|
{
|
||||||
float z = texture(DepthTexture, Input.TextureCoord).x;
|
float z = texture(DepthTexture, Input.TextureCoord).x;
|
||||||
vec4 color = vec4(z, z, z, 0);
|
vec4 color = vec4(z, z, z, 0);
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
layout(location = 0) in vec3 Position;
|
layout(location = 0) in vec3 Position;
|
||||||
layout(location = 2) in vec2 TextureCoord;
|
layout(location = 2) in vec2 TextureCoord;
|
||||||
|
|
||||||
out VertexData {
|
out VertexData
|
||||||
|
{
|
||||||
vec3 Position;
|
vec3 Position;
|
||||||
vec2 TextureCoord;
|
vec2 TextureCoord;
|
||||||
} Output;
|
} Output;
|
||||||
|
|||||||
+10
-8
@@ -4,19 +4,20 @@
|
|||||||
Skybox::Skybox(std::string skyboxPath, std::string extension /* = "png" */)
|
Skybox::Skybox(std::string skyboxPath, std::string extension /* = "png" */)
|
||||||
{
|
{
|
||||||
m_Cubemap = std::make_shared<CubemapTexture>(
|
m_Cubemap = std::make_shared<CubemapTexture>(
|
||||||
skyboxPath + "/right." + extension,
|
skyboxPath + "/right." + extension,
|
||||||
skyboxPath + "/left." + extension,
|
skyboxPath + "/left." + extension,
|
||||||
skyboxPath + "/top." + extension,
|
skyboxPath + "/top." + extension,
|
||||||
skyboxPath + "/bottom." + extension,
|
skyboxPath + "/bottom." + extension,
|
||||||
skyboxPath + "/front." + extension,
|
skyboxPath + "/front." + extension,
|
||||||
skyboxPath + "/back." + extension);
|
skyboxPath + "/back." + extension);
|
||||||
m_Cubemap->Load();
|
m_Cubemap->Load();
|
||||||
Initialize();
|
Initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Skybox::Initialize()
|
void Skybox::Initialize()
|
||||||
{
|
{
|
||||||
float cubeVertices[] = {
|
float cubeVertices[] =
|
||||||
|
{
|
||||||
-1.0f, -1.0f, -1.0f,
|
-1.0f, -1.0f, -1.0f,
|
||||||
1.0f, -1.0f, -1.0f,
|
1.0f, -1.0f, -1.0f,
|
||||||
1.0f, 1.0f, -1.0f,
|
1.0f, 1.0f, -1.0f,
|
||||||
@@ -29,7 +30,8 @@ void Skybox::Initialize()
|
|||||||
};
|
};
|
||||||
//std::copy(cubeVertices, cubeVertices + (3*8 - 1), m_CubeVertices);
|
//std::copy(cubeVertices, cubeVertices + (3*8 - 1), m_CubeVertices);
|
||||||
|
|
||||||
unsigned int cubeIndices[] = {
|
unsigned int cubeIndices[] =
|
||||||
|
{
|
||||||
// Back
|
// Back
|
||||||
0, 2, 3,
|
0, 2, 3,
|
||||||
0, 1, 2,
|
0, 1, 2,
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ class Skybox
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Skybox(std::string skyboxPath, std::string extension = "png");
|
Skybox(std::string skyboxPath, std::string extension = "png");
|
||||||
Skybox(std::shared_ptr<CubemapTexture> cubemap)
|
Skybox(std::shared_ptr<CubemapTexture> cubemap)
|
||||||
: m_Cubemap(cubemap) { Initialize(); }
|
: m_Cubemap(cubemap) { Initialize(); }
|
||||||
~Skybox();
|
~Skybox();
|
||||||
|
|
||||||
|
|||||||
@@ -7,15 +7,15 @@
|
|||||||
namespace Systems
|
namespace Systems
|
||||||
{
|
{
|
||||||
|
|
||||||
class DebugSystem : public System
|
class DebugSystem : public System
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DebugSystem(World* world)
|
DebugSystem(World* world)
|
||||||
: System(world) { }
|
: System(world) { }
|
||||||
|
|
||||||
void Update(double dt) override;
|
void Update(double dt) override;
|
||||||
//void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
//void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif // DebugSystem_h__
|
#endif // DebugSystem_h__
|
||||||
@@ -16,39 +16,49 @@ void Systems::FreeSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit
|
|||||||
{
|
{
|
||||||
auto steering = m_World->GetComponent<Components::FreeSteering>(entity, "FreeSteering");
|
auto steering = m_World->GetComponent<Components::FreeSteering>(entity, "FreeSteering");
|
||||||
auto input = m_World->GetComponent<Components::Input>(entity, "Input");
|
auto input = m_World->GetComponent<Components::Input>(entity, "Input");
|
||||||
if (steering && input) {
|
if (steering && input)
|
||||||
|
{
|
||||||
auto transform = m_World->GetComponent<Components::Transform>(entity, "Transform");
|
auto transform = m_World->GetComponent<Components::Transform>(entity, "Transform");
|
||||||
|
|
||||||
glm::vec3 Camera_Right = glm::vec3(glm::vec4(1, 0, 0, 0) * transform->Orientation);
|
glm::vec3 Camera_Right = glm::vec3(glm::vec4(1, 0, 0, 0) * transform->Orientation);
|
||||||
glm::vec3 Camera_Forward = glm::vec3(glm::vec4(0, 0, 1, 0) * transform->Orientation);
|
glm::vec3 Camera_Forward = glm::vec3(glm::vec4(0, 0, 1, 0) * transform->Orientation);
|
||||||
|
|
||||||
float speed = steering->Speed;
|
float speed = steering->Speed;
|
||||||
if (input->KeyState[GLFW_KEY_LEFT_SHIFT]) {
|
if (input->KeyState[GLFW_KEY_LEFT_SHIFT])
|
||||||
|
{
|
||||||
speed *= 4.0f;
|
speed *= 4.0f;
|
||||||
}
|
}
|
||||||
if (input->KeyState[GLFW_KEY_LEFT_ALT]) {
|
if (input->KeyState[GLFW_KEY_LEFT_ALT])
|
||||||
|
{
|
||||||
speed /= 4.0f;
|
speed /= 4.0f;
|
||||||
}
|
}
|
||||||
if (input->KeyState[GLFW_KEY_A]) {
|
if (input->KeyState[GLFW_KEY_A])
|
||||||
|
{
|
||||||
transform->Position -= Camera_Right * (float)dt * speed;
|
transform->Position -= Camera_Right * (float)dt * speed;
|
||||||
}
|
}
|
||||||
else if (input->KeyState[GLFW_KEY_D]) {
|
else if (input->KeyState[GLFW_KEY_D])
|
||||||
|
{
|
||||||
transform->Position += Camera_Right * (float)dt * speed;
|
transform->Position += Camera_Right * (float)dt * speed;
|
||||||
}
|
}
|
||||||
if (input->KeyState[GLFW_KEY_W]) {
|
if (input->KeyState[GLFW_KEY_W])
|
||||||
|
{
|
||||||
transform->Position -= Camera_Forward * (float)dt * speed;
|
transform->Position -= Camera_Forward * (float)dt * speed;
|
||||||
}
|
}
|
||||||
if (input->KeyState[GLFW_KEY_S]) {
|
if (input->KeyState[GLFW_KEY_S])
|
||||||
|
{
|
||||||
transform->Position += Camera_Forward * (float)dt * speed;
|
transform->Position += Camera_Forward * (float)dt * speed;
|
||||||
}
|
}
|
||||||
if (input->KeyState[GLFW_KEY_SPACE]) {
|
if (input->KeyState[GLFW_KEY_SPACE])
|
||||||
|
{
|
||||||
transform->Position += glm::vec3(0, 1, 0) * (float)dt * speed;
|
transform->Position += glm::vec3(0, 1, 0) * (float)dt * speed;
|
||||||
}
|
}
|
||||||
if (input->KeyState[GLFW_KEY_LEFT_CONTROL]) {
|
if (input->KeyState[GLFW_KEY_LEFT_CONTROL])
|
||||||
|
{
|
||||||
transform->Position -= glm::vec3(0, 1, 0) * (float)dt * speed;
|
transform->Position -= glm::vec3(0, 1, 0) * (float)dt * speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (input->MouseState[GLFW_MOUSE_BUTTON_LEFT]) {
|
if (input->MouseState[GLFW_MOUSE_BUTTON_LEFT])
|
||||||
|
{
|
||||||
// TOUCHING THIS CODE MIGHT CAUSE THE UNIVERSE TO IMPLODE, ALSO DRAGONS // spelling tobias :3
|
// TOUCHING THIS CODE MIGHT CAUSE THE UNIVERSE TO IMPLODE, ALSO DRAGONS // spelling tobias :3
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
transform->Orientation = glm::angleAxis<float>(input->dY / 300.f, glm::vec3(1, 0, 0)) * transform->Orientation;
|
transform->Orientation = glm::angleAxis<float>(input->dY / 300.f, glm::vec3(1, 0, 0)) * transform->Orientation;
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
|
|
||||||
namespace Systems
|
namespace Systems
|
||||||
{
|
{
|
||||||
class FreeSteeringSystem : public System
|
class FreeSteeringSystem : public System
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FreeSteeringSystem(World* world);
|
FreeSteeringSystem(World* world);
|
||||||
|
|
||||||
void Update(double dt) override;
|
void Update(double dt) override;
|
||||||
void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -8,12 +8,14 @@ void Systems::InputSystem::Update(double dt)
|
|||||||
m_LastMouseState = m_CurrentMouseState;
|
m_LastMouseState = m_CurrentMouseState;
|
||||||
|
|
||||||
// Keyboard input
|
// Keyboard input
|
||||||
for (int i = 0; i <= GLFW_KEY_LAST; ++i) {
|
for (int i = 0; i <= GLFW_KEY_LAST; ++i)
|
||||||
|
{
|
||||||
m_CurrentKeyState[i] = glfwGetKey(m_Renderer->GetWindow(), i);
|
m_CurrentKeyState[i] = glfwGetKey(m_Renderer->GetWindow(), i);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mouse buttons
|
// Mouse buttons
|
||||||
for (int i = 0; i <= GLFW_MOUSE_BUTTON_LAST; ++i) {
|
for (int i = 0; i <= GLFW_MOUSE_BUTTON_LAST; ++i)
|
||||||
|
{
|
||||||
m_CurrentMouseState[i] = glfwGetMouseButton(m_Renderer->GetWindow(), i);
|
m_CurrentMouseState[i] = glfwGetMouseButton(m_Renderer->GetWindow(), i);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,30 +28,36 @@ void Systems::InputSystem::Update(double dt)
|
|||||||
m_LastMouseY = ypos;
|
m_LastMouseY = ypos;
|
||||||
|
|
||||||
// Lock mouse while holding LMB
|
// Lock mouse while holding LMB
|
||||||
if (m_CurrentMouseState[GLFW_MOUSE_BUTTON_LEFT]) {
|
if (m_CurrentMouseState[GLFW_MOUSE_BUTTON_LEFT])
|
||||||
|
{
|
||||||
m_LastMouseX = m_Renderer->WIDTH / 2.f; // xpos;
|
m_LastMouseX = m_Renderer->WIDTH / 2.f; // xpos;
|
||||||
m_LastMouseY = m_Renderer->HEIGHT / 2.f; // ypos;
|
m_LastMouseY = m_Renderer->HEIGHT / 2.f; // ypos;
|
||||||
glfwSetCursorPos(m_Renderer->GetWindow(), m_LastMouseX, m_LastMouseY);
|
glfwSetCursorPos(m_Renderer->GetWindow(), m_LastMouseX, m_LastMouseY);
|
||||||
}
|
}
|
||||||
// Hide/show cursor with LMB
|
// Hide/show cursor with LMB
|
||||||
if (m_CurrentMouseState[GLFW_MOUSE_BUTTON_LEFT] && !m_LastMouseState[GLFW_MOUSE_BUTTON_LEFT]) {
|
if (m_CurrentMouseState[GLFW_MOUSE_BUTTON_LEFT] && !m_LastMouseState[GLFW_MOUSE_BUTTON_LEFT])
|
||||||
|
{
|
||||||
glfwSetInputMode(m_Renderer->GetWindow(), GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
glfwSetInputMode(m_Renderer->GetWindow(), GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
|
||||||
}
|
}
|
||||||
if (!m_CurrentMouseState[GLFW_MOUSE_BUTTON_LEFT] && m_LastMouseState[GLFW_MOUSE_BUTTON_LEFT]) {
|
if (!m_CurrentMouseState[GLFW_MOUSE_BUTTON_LEFT] && m_LastMouseState[GLFW_MOUSE_BUTTON_LEFT])
|
||||||
|
{
|
||||||
glfwSetInputMode(m_Renderer->GetWindow(), GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
glfwSetInputMode(m_Renderer->GetWindow(), GLFW_CURSOR, GLFW_CURSOR_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
// Wireframe
|
// Wireframe
|
||||||
if (m_CurrentKeyState[GLFW_KEY_F1] && !m_LastKeyState[GLFW_KEY_F1]) {
|
if (m_CurrentKeyState[GLFW_KEY_F1] && !m_LastKeyState[GLFW_KEY_F1])
|
||||||
|
{
|
||||||
m_Renderer->DrawWireframe(!m_Renderer->DrawWireframe());
|
m_Renderer->DrawWireframe(!m_Renderer->DrawWireframe());
|
||||||
}
|
}
|
||||||
// Normals
|
// Normals
|
||||||
if (m_CurrentKeyState[GLFW_KEY_F2] && !m_LastKeyState[GLFW_KEY_F2]) {
|
if (m_CurrentKeyState[GLFW_KEY_F2] && !m_LastKeyState[GLFW_KEY_F2])
|
||||||
|
{
|
||||||
m_Renderer->DrawNormals(!m_Renderer->DrawNormals());
|
m_Renderer->DrawNormals(!m_Renderer->DrawNormals());
|
||||||
}
|
}
|
||||||
// Bounds
|
// Bounds
|
||||||
if (m_CurrentKeyState[GLFW_KEY_F3] && !m_LastKeyState[GLFW_KEY_F3]) {
|
if (m_CurrentKeyState[GLFW_KEY_F3] && !m_LastKeyState[GLFW_KEY_F3])
|
||||||
|
{
|
||||||
m_Renderer->DrawBounds(!m_Renderer->DrawBounds());
|
m_Renderer->DrawBounds(!m_Renderer->DrawBounds());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ Systems::PhysicsSystem::PhysicsSystem(World* world) : System(world)
|
|||||||
m_CollisionConfiguration = new btDefaultCollisionConfiguration();
|
m_CollisionConfiguration = new btDefaultCollisionConfiguration();
|
||||||
m_Dispatcher = new btCollisionDispatcher(m_CollisionConfiguration);
|
m_Dispatcher = new btCollisionDispatcher(m_CollisionConfiguration);
|
||||||
m_Solver = new btSequentialImpulseConstraintSolver();
|
m_Solver = new btSequentialImpulseConstraintSolver();
|
||||||
|
|
||||||
m_DynamicsWorld = new btDiscreteDynamicsWorld(m_Dispatcher, m_Broadphase, m_Solver, m_CollisionConfiguration);
|
m_DynamicsWorld = new btDiscreteDynamicsWorld(m_Dispatcher, m_Broadphase, m_Solver, m_CollisionConfiguration);
|
||||||
|
|
||||||
m_DynamicsWorld->setGravity(btVector3(0, -9.82f, 0));
|
m_DynamicsWorld->setGravity(btVector3(0, -9.82f, 0));
|
||||||
@@ -20,14 +20,16 @@ Systems::PhysicsSystem::PhysicsSystem(World* world) : System(world)
|
|||||||
void Systems::PhysicsSystem::Update(double dt)
|
void Systems::PhysicsSystem::Update(double dt)
|
||||||
{
|
{
|
||||||
// Update entity transform in physics world
|
// Update entity transform in physics world
|
||||||
for (auto pair : *m_World->GetEntities()) {
|
for (auto pair : *m_World->GetEntities())
|
||||||
|
{
|
||||||
EntityID entity = pair.first;
|
EntityID entity = pair.first;
|
||||||
EntityID parent = pair.second;
|
EntityID parent = pair.second;
|
||||||
|
|
||||||
if (parent != 0)
|
if (parent != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (m_PhysicsData.find(entity) != m_PhysicsData.end()) {
|
if (m_PhysicsData.find(entity) != m_PhysicsData.end())
|
||||||
|
{
|
||||||
PhysicsData* physicsData = &m_PhysicsData[entity];
|
PhysicsData* physicsData = &m_PhysicsData[entity];
|
||||||
auto transformComponent = m_World->GetComponent<Components::Transform>(entity, "Transform");
|
auto transformComponent = m_World->GetComponent<Components::Transform>(entity, "Transform");
|
||||||
|
|
||||||
@@ -63,7 +65,8 @@ void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID p
|
|||||||
|
|
||||||
if (physicsComponent || sphereShapeComponent || boxShapeComponent || meshShapeComponent || staticMeshShapeComponent)
|
if (physicsComponent || sphereShapeComponent || boxShapeComponent || meshShapeComponent || staticMeshShapeComponent)
|
||||||
{
|
{
|
||||||
if (m_PhysicsData.find(entity) == m_PhysicsData.end()) {
|
if (m_PhysicsData.find(entity) == m_PhysicsData.end())
|
||||||
|
{
|
||||||
SetUpPhysicsState(entity, parent);
|
SetUpPhysicsState(entity, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,10 +87,11 @@ void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID p
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (m_PhysicsData.find(entity) != m_PhysicsData.end()) {
|
if (m_PhysicsData.find(entity) != m_PhysicsData.end())
|
||||||
|
{
|
||||||
TearDownPhysicsState(entity, parent);
|
TearDownPhysicsState(entity, parent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto ballSocketComponent = m_World->GetComponent<Components::BallSocketConstraint>(entity, "BallSocketConstraint");
|
auto ballSocketComponent = m_World->GetComponent<Components::BallSocketConstraint>(entity, "BallSocketConstraint");
|
||||||
auto sliderComponent = m_World->GetComponent<Components::SliderConstraint>(entity, "SliderConstraint");
|
auto sliderComponent = m_World->GetComponent<Components::SliderConstraint>(entity, "SliderConstraint");
|
||||||
@@ -145,7 +149,7 @@ void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID p
|
|||||||
btVector3 AxisB = btVector3(hingeComponent->AxisB.x, hingeComponent->AxisB.y, hingeComponent->AxisB.z);
|
btVector3 AxisB = btVector3(hingeComponent->AxisB.x, hingeComponent->AxisB.y, hingeComponent->AxisB.z);
|
||||||
|
|
||||||
|
|
||||||
btHingeConstraint *hingeConstraint = new btHingeConstraint(*m_PhysicsData[entityA].RigidBody, *m_PhysicsData[entityB].RigidBody, PivotA, PivotB, AxisA, AxisB, true);
|
btHingeConstraint* hingeConstraint = new btHingeConstraint(*m_PhysicsData[entityA].RigidBody, *m_PhysicsData[entityB].RigidBody, PivotA, PivotB, AxisA, AxisB, true);
|
||||||
hingeConstraint->setLimit(hingeComponent->LowLimit, hingeComponent->HighLimit, hingeComponent->Softness, hingeComponent->BiasFactor, hingeComponent->RelaxationFactor);
|
hingeConstraint->setLimit(hingeComponent->LowLimit, hingeComponent->HighLimit, hingeComponent->Softness, hingeComponent->BiasFactor, hingeComponent->RelaxationFactor);
|
||||||
|
|
||||||
|
|
||||||
@@ -159,7 +163,7 @@ void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID p
|
|||||||
|
|
||||||
void Systems::PhysicsSystem::OnComponentCreated(std::string type, std::shared_ptr<Component> component)
|
void Systems::PhysicsSystem::OnComponentCreated(std::string type, std::shared_ptr<Component> component)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Systems::PhysicsSystem::OnComponentRemoved(std::string type, Component* component)
|
void Systems::PhysicsSystem::OnComponentRemoved(std::string type, Component* component)
|
||||||
@@ -170,7 +174,8 @@ void Systems::PhysicsSystem::OnComponentRemoved(std::string type, Component* com
|
|||||||
void Systems::PhysicsSystem::SetUpPhysicsState(EntityID entity, EntityID parent)
|
void Systems::PhysicsSystem::SetUpPhysicsState(EntityID entity, EntityID parent)
|
||||||
{
|
{
|
||||||
auto transformComponent = m_World->GetComponent<Components::Transform>(entity, "Transform");
|
auto transformComponent = m_World->GetComponent<Components::Transform>(entity, "Transform");
|
||||||
if (!transformComponent) {
|
if (!transformComponent)
|
||||||
|
{
|
||||||
LOG_WARNING("Physics component missing transform component on entity %i", entity);
|
LOG_WARNING("Physics component missing transform component on entity %i", entity);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -182,7 +187,8 @@ void Systems::PhysicsSystem::SetUpPhysicsState(EntityID entity, EntityID parent)
|
|||||||
auto meshShapeComponent = m_World->GetComponent<Components::MeshShape>(entity, "MeshShape");
|
auto meshShapeComponent = m_World->GetComponent<Components::MeshShape>(entity, "MeshShape");
|
||||||
auto staticMeshShapeComponent = m_World->GetComponent<Components::StaticMeshShape>(entity, "StaticMeshShape");
|
auto staticMeshShapeComponent = m_World->GetComponent<Components::StaticMeshShape>(entity, "StaticMeshShape");
|
||||||
|
|
||||||
if (compoundShapeComponent && (sphereShapeComponent || boxShapeComponent || meshShapeComponent || staticMeshShapeComponent)) {
|
if (compoundShapeComponent && (sphereShapeComponent || boxShapeComponent || meshShapeComponent || staticMeshShapeComponent))
|
||||||
|
{
|
||||||
LOG_WARNING("Entity %i has both compound shape and normal shape! Normal shapes must be children to entity with compound shape.", entity);
|
LOG_WARNING("Entity %i has both compound shape and normal shape! Normal shapes must be children to entity with compound shape.", entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,7 +198,8 @@ void Systems::PhysicsSystem::SetUpPhysicsState(EntityID entity, EntityID parent)
|
|||||||
auto baseCompoundShape = m_World->GetComponent<Components::CompoundShape>(baseParent, "CompoundShape");*/
|
auto baseCompoundShape = m_World->GetComponent<Components::CompoundShape>(baseParent, "CompoundShape");*/
|
||||||
|
|
||||||
// Set-up compound shape
|
// Set-up compound shape
|
||||||
if (compoundShapeComponent) {
|
if (compoundShapeComponent)
|
||||||
|
{
|
||||||
btCompoundShape* compoundShape = new btCompoundShape();
|
btCompoundShape* compoundShape = new btCompoundShape();
|
||||||
physicsData->CollisionShape = compoundShape;
|
physicsData->CollisionShape = compoundShape;
|
||||||
|
|
||||||
@@ -201,7 +208,8 @@ void Systems::PhysicsSystem::SetUpPhysicsState(EntityID entity, EntityID parent)
|
|||||||
physicsData->MotionState = new btDefaultMotionState(transform);
|
physicsData->MotionState = new btDefaultMotionState(transform);
|
||||||
|
|
||||||
btVector3 inertia;
|
btVector3 inertia;
|
||||||
if (physicsComponent->Mass != 0) {
|
if (physicsComponent->Mass != 0)
|
||||||
|
{
|
||||||
physicsData->CollisionShape->calculateLocalInertia(physicsComponent->Mass, inertia);
|
physicsData->CollisionShape->calculateLocalInertia(physicsComponent->Mass, inertia);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,26 +218,34 @@ void Systems::PhysicsSystem::SetUpPhysicsState(EntityID entity, EntityID parent)
|
|||||||
|
|
||||||
m_DynamicsWorld->addRigidBody(physicsData->RigidBody);
|
m_DynamicsWorld->addRigidBody(physicsData->RigidBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set-up normal shapes
|
// Set-up normal shapes
|
||||||
else if (boxShapeComponent) {
|
else if (boxShapeComponent)
|
||||||
|
{
|
||||||
physicsData->CollisionShape = new btBoxShape(btVector3(boxShapeComponent->Width, boxShapeComponent->Height, boxShapeComponent->Depth));
|
physicsData->CollisionShape = new btBoxShape(btVector3(boxShapeComponent->Width, boxShapeComponent->Height, boxShapeComponent->Depth));
|
||||||
} else if (sphereShapeComponent) {
|
}
|
||||||
|
else if (sphereShapeComponent)
|
||||||
|
{
|
||||||
physicsData->CollisionShape = new btSphereShape(sphereShapeComponent->Radius);
|
physicsData->CollisionShape = new btSphereShape(sphereShapeComponent->Radius);
|
||||||
} else if (meshShapeComponent) {
|
}
|
||||||
|
else if (meshShapeComponent)
|
||||||
|
{
|
||||||
// TODO: Collision mesh things go here
|
// TODO: Collision mesh things go here
|
||||||
//new btConvexTriangleMeshShape()
|
//new btConvexTriangleMeshShape()
|
||||||
}
|
}
|
||||||
if (boxShapeComponent || sphereShapeComponent || meshShapeComponent || staticMeshShapeComponent) {
|
if (boxShapeComponent || sphereShapeComponent || meshShapeComponent || staticMeshShapeComponent)
|
||||||
|
{
|
||||||
btTransform transform;
|
btTransform transform;
|
||||||
transform.setFromOpenGLMatrix(glm::value_ptr(glm::translate(glm::mat4(), transformComponent->Position) * glm::toMat4(transformComponent->Orientation)));
|
transform.setFromOpenGLMatrix(glm::value_ptr(glm::translate(glm::mat4(), transformComponent->Position) * glm::toMat4(transformComponent->Orientation)));
|
||||||
|
|
||||||
// If there's a local physics component
|
// If there's a local physics component
|
||||||
if (physicsComponent) {
|
if (physicsComponent)
|
||||||
|
{
|
||||||
physicsData->MotionState = new btDefaultMotionState(transform);
|
physicsData->MotionState = new btDefaultMotionState(transform);
|
||||||
|
|
||||||
btVector3 inertia;
|
btVector3 inertia;
|
||||||
if (physicsComponent->Mass != 0) {
|
if (physicsComponent->Mass != 0)
|
||||||
|
{
|
||||||
physicsData->CollisionShape->calculateLocalInertia(physicsComponent->Mass, inertia);
|
physicsData->CollisionShape->calculateLocalInertia(physicsComponent->Mass, inertia);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,16 +253,20 @@ void Systems::PhysicsSystem::SetUpPhysicsState(EntityID entity, EntityID parent)
|
|||||||
physicsData->RigidBody = new btRigidBody(rigidBodyCI);
|
physicsData->RigidBody = new btRigidBody(rigidBodyCI);
|
||||||
|
|
||||||
m_DynamicsWorld->addRigidBody(physicsData->RigidBody);
|
m_DynamicsWorld->addRigidBody(physicsData->RigidBody);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
// Otherwise, find our base parent and attach to compound shape
|
// Otherwise, find our base parent and attach to compound shape
|
||||||
EntityID baseParent = m_World->GetEntityBaseParent(entity);
|
EntityID baseParent = m_World->GetEntityBaseParent(entity);
|
||||||
auto basePhysicsComponent = m_World->GetComponent<Components::Physics>(baseParent, "Physics");
|
auto basePhysicsComponent = m_World->GetComponent<Components::Physics>(baseParent, "Physics");
|
||||||
if (!basePhysicsComponent) {
|
if (!basePhysicsComponent)
|
||||||
|
{
|
||||||
LOG_WARNING("Failed to attach orphan collision shape on entity %i: missing physics component on base parent entity %i", entity, baseParent);
|
LOG_WARNING("Failed to attach orphan collision shape on entity %i: missing physics component on base parent entity %i", entity, baseParent);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto baseCompoundShapeComponent = m_World->GetComponent<Components::CompoundShape>(baseParent, "CompoundShape");
|
auto baseCompoundShapeComponent = m_World->GetComponent<Components::CompoundShape>(baseParent, "CompoundShape");
|
||||||
if (!baseCompoundShapeComponent) {
|
if (!baseCompoundShapeComponent)
|
||||||
|
{
|
||||||
LOG_WARNING("Failed to attach orphan collision shape on entity %i: missing compound shape on base parent entity %i", entity, baseParent);
|
LOG_WARNING("Failed to attach orphan collision shape on entity %i: missing compound shape on base parent entity %i", entity, baseParent);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -267,7 +287,7 @@ void Systems::PhysicsSystem::SetUpPhysicsState(EntityID entity, EntityID parent)
|
|||||||
void Systems::PhysicsSystem::TearDownPhysicsState(EntityID entity, EntityID parent)
|
void Systems::PhysicsSystem::TearDownPhysicsState(EntityID entity, EntityID parent)
|
||||||
{
|
{
|
||||||
PhysicsData* physicsData = &m_PhysicsData[entity];
|
PhysicsData* physicsData = &m_PhysicsData[entity];
|
||||||
|
|
||||||
delete physicsData->RigidBody;
|
delete physicsData->RigidBody;
|
||||||
delete physicsData->MotionState;
|
delete physicsData->MotionState;
|
||||||
delete physicsData->CollisionShape;
|
delete physicsData->CollisionShape;
|
||||||
|
|||||||
+26
-26
@@ -19,34 +19,34 @@
|
|||||||
namespace Systems
|
namespace Systems
|
||||||
{
|
{
|
||||||
|
|
||||||
class PhysicsSystem : public System
|
class PhysicsSystem : public System
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PhysicsSystem(World* world);
|
||||||
|
void Update(double dt) override;
|
||||||
|
void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
||||||
|
void OnComponentCreated(std::string type, std::shared_ptr<Component> component) override;
|
||||||
|
void OnComponentRemoved(std::string type, Component* component) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
btBroadphaseInterface* m_Broadphase;
|
||||||
|
btDefaultCollisionConfiguration* m_CollisionConfiguration;
|
||||||
|
btCollisionDispatcher* m_Dispatcher;
|
||||||
|
btSequentialImpulseConstraintSolver* m_Solver;
|
||||||
|
btDiscreteDynamicsWorld* m_DynamicsWorld;
|
||||||
|
|
||||||
|
struct PhysicsData
|
||||||
{
|
{
|
||||||
public:
|
btRigidBody* RigidBody;
|
||||||
PhysicsSystem(World* world);
|
btMotionState* MotionState;
|
||||||
void Update(double dt) override;
|
btCollisionShape* CollisionShape;
|
||||||
void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
|
||||||
void OnComponentCreated(std::string type, std::shared_ptr<Component> component) override;
|
|
||||||
void OnComponentRemoved(std::string type, Component* component) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
btBroadphaseInterface* m_Broadphase;
|
|
||||||
btDefaultCollisionConfiguration* m_CollisionConfiguration;
|
|
||||||
btCollisionDispatcher* m_Dispatcher;
|
|
||||||
btSequentialImpulseConstraintSolver* m_Solver;
|
|
||||||
btDiscreteDynamicsWorld* m_DynamicsWorld;
|
|
||||||
|
|
||||||
struct PhysicsData
|
|
||||||
{
|
|
||||||
btRigidBody* RigidBody;
|
|
||||||
btMotionState* MotionState;
|
|
||||||
btCollisionShape* CollisionShape;
|
|
||||||
};
|
|
||||||
std::map<EntityID, PhysicsData> m_PhysicsData;
|
|
||||||
std::map<std::pair<EntityID, EntityID>, btTypedConstraint*> m_Constraints;
|
|
||||||
|
|
||||||
void SetUpPhysicsState(EntityID entity, EntityID parent);
|
|
||||||
void TearDownPhysicsState(EntityID entity, EntityID parent);
|
|
||||||
};
|
};
|
||||||
|
std::map<EntityID, PhysicsData> m_PhysicsData;
|
||||||
|
std::map<std::pair<EntityID, EntityID>, btTypedConstraint*> m_Constraints;
|
||||||
|
|
||||||
|
void SetUpPhysicsState(EntityID entity, EntityID parent);
|
||||||
|
void TearDownPhysicsState(EntityID entity, EntityID parent);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // PhysicsSystem_h__
|
#endif // PhysicsSystem_h__
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
|
|
||||||
void Systems::RenderSystem::OnComponentCreated(std::string type, std::shared_ptr<Component> component)
|
void Systems::RenderSystem::OnComponentCreated(std::string type, std::shared_ptr<Component> component)
|
||||||
{
|
{
|
||||||
if(type == "Model") {
|
if(type == "Model")
|
||||||
|
{
|
||||||
auto modelComponent = std::static_pointer_cast<Components::Model>(component);
|
auto modelComponent = std::static_pointer_cast<Components::Model>(component);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -17,8 +18,10 @@ void Systems::RenderSystem::UpdateEntity(double dt, EntityID entity, EntityID pa
|
|||||||
|
|
||||||
// Draw models
|
// Draw models
|
||||||
auto modelComponent = m_World->GetComponent<Components::Model>(entity, "Model");
|
auto modelComponent = m_World->GetComponent<Components::Model>(entity, "Model");
|
||||||
if (modelComponent != nullptr) {
|
if (modelComponent != nullptr)
|
||||||
if (m_CachedModels.find(modelComponent->ModelFile) == m_CachedModels.end()){
|
{
|
||||||
|
if (m_CachedModels.find(modelComponent->ModelFile) == m_CachedModels.end())
|
||||||
|
{
|
||||||
m_CachedModels[modelComponent->ModelFile] = std::make_shared<Model>(OBJ(modelComponent->ModelFile));
|
m_CachedModels[modelComponent->ModelFile] = std::make_shared<Model>(OBJ(modelComponent->ModelFile));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,7 +36,8 @@ void Systems::RenderSystem::UpdateEntity(double dt, EntityID entity, EntityID pa
|
|||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
auto collision = m_World->GetComponent<Components::Collision>(entity, "Collision");
|
auto collision = m_World->GetComponent<Components::Collision>(entity, "Collision");
|
||||||
auto bounds = m_World->GetComponent<Components::Bounds>(entity, "Bounds");
|
auto bounds = m_World->GetComponent<Components::Bounds>(entity, "Bounds");
|
||||||
if (bounds != nullptr) {
|
if (bounds != nullptr)
|
||||||
|
{
|
||||||
glm::vec3 origin = m_TransformSystem->AbsolutePosition(entity) + (transformComponent->Scale * bounds->Origin);
|
glm::vec3 origin = m_TransformSystem->AbsolutePosition(entity) + (transformComponent->Scale * bounds->Origin);
|
||||||
glm::vec3 volumeVector = transformComponent->Scale * bounds->VolumeVector;
|
glm::vec3 volumeVector = transformComponent->Scale * bounds->VolumeVector;
|
||||||
m_Renderer->AddAABBToDraw(origin, volumeVector, (collision != nullptr && collision->CollidingEntities.size() > 0));
|
m_Renderer->AddAABBToDraw(origin, volumeVector, (collision != nullptr && collision->CollidingEntities.size() > 0));
|
||||||
@@ -41,20 +45,22 @@ void Systems::RenderSystem::UpdateEntity(double dt, EntityID entity, EntityID pa
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
auto pointLightComponent = m_World->GetComponent<Components::PointLight>(entity, "PointLight");
|
auto pointLightComponent = m_World->GetComponent<Components::PointLight>(entity, "PointLight");
|
||||||
if (pointLightComponent != nullptr) {
|
if (pointLightComponent != nullptr)
|
||||||
|
{
|
||||||
glm::vec3 position = m_TransformSystem->AbsolutePosition(entity);
|
glm::vec3 position = m_TransformSystem->AbsolutePosition(entity);
|
||||||
m_Renderer->AddPointLightToDraw(
|
m_Renderer->AddPointLightToDraw(
|
||||||
position,
|
position,
|
||||||
pointLightComponent->Specular,
|
pointLightComponent->Specular,
|
||||||
pointLightComponent->Diffuse,
|
pointLightComponent->Diffuse,
|
||||||
pointLightComponent->constantAttenuation,
|
pointLightComponent->constantAttenuation,
|
||||||
pointLightComponent->linearAttenuation,
|
pointLightComponent->linearAttenuation,
|
||||||
pointLightComponent->quadraticAttenuation,
|
pointLightComponent->quadraticAttenuation,
|
||||||
pointLightComponent->spotExponent);
|
pointLightComponent->spotExponent);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto cameraComponent = m_World->GetComponent<Components::Camera>(entity, "Camera");
|
auto cameraComponent = m_World->GetComponent<Components::Camera>(entity, "Camera");
|
||||||
if (cameraComponent != nullptr) {
|
if (cameraComponent != nullptr)
|
||||||
|
{
|
||||||
m_Renderer->GetCamera()->Position(transformComponent->Position);
|
m_Renderer->GetCamera()->Position(transformComponent->Position);
|
||||||
m_Renderer->GetCamera()->Orientation(transformComponent->Orientation);
|
m_Renderer->GetCamera()->Orientation(transformComponent->Orientation);
|
||||||
|
|
||||||
|
|||||||
+13
-13
@@ -17,23 +17,23 @@
|
|||||||
namespace Systems
|
namespace Systems
|
||||||
{
|
{
|
||||||
|
|
||||||
class RenderSystem : public System
|
class RenderSystem : public System
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RenderSystem(World* world, std::shared_ptr<Renderer> renderer)
|
RenderSystem(World* world, std::shared_ptr<Renderer> renderer)
|
||||||
: System(world), m_Renderer(renderer){ }
|
: System(world), m_Renderer(renderer) { }
|
||||||
|
|
||||||
void Initialize() override;
|
void Initialize() override;
|
||||||
|
|
||||||
std::unordered_map<std::string, std::shared_ptr<Model>> m_CachedModels;
|
std::unordered_map<std::string, std::shared_ptr<Model>> m_CachedModels;
|
||||||
|
|
||||||
void OnComponentCreated(std::string type, std:: shared_ptr<Component> component) override;
|
void OnComponentCreated(std::string type, std:: shared_ptr<Component> component) override;
|
||||||
void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<Renderer> m_Renderer;
|
std::shared_ptr<Renderer> m_Renderer;
|
||||||
std::shared_ptr<Systems::TransformSystem> m_TransformSystem;
|
std::shared_ptr<Systems::TransformSystem> m_TransformSystem;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-12
@@ -3,7 +3,7 @@
|
|||||||
#include "World.h"
|
#include "World.h"
|
||||||
|
|
||||||
Systems::SoundSystem::SoundSystem(World* world)
|
Systems::SoundSystem::SoundSystem(World* world)
|
||||||
: System(world)
|
: System(world)
|
||||||
{
|
{
|
||||||
//initialize OpenAL
|
//initialize OpenAL
|
||||||
ALCdevice* Device = alcOpenDevice(NULL);
|
ALCdevice* Device = alcOpenDevice(NULL);
|
||||||
@@ -26,7 +26,7 @@ Systems::SoundSystem::SoundSystem(World* world)
|
|||||||
|
|
||||||
void Systems::SoundSystem::Update(double dt)
|
void Systems::SoundSystem::Update(double dt)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Systems::SoundSystem::UpdateEntity(double dt, EntityID entity, EntityID parent)
|
void Systems::SoundSystem::UpdateEntity(double dt, EntityID entity, EntityID parent)
|
||||||
@@ -62,7 +62,7 @@ void Systems::SoundSystem::UpdateEntity(double dt, EntityID entity, EntityID par
|
|||||||
alSourcef(source, AL_GAIN, soundEmitter->Gain);
|
alSourcef(source, AL_GAIN, soundEmitter->Gain);
|
||||||
//alSourcef(source, AL_MAX_DISTANCE, soundEmitter->MaxDistance);
|
//alSourcef(source, AL_MAX_DISTANCE, soundEmitter->MaxDistance);
|
||||||
alSourcef(source, AL_REFERENCE_DISTANCE, soundEmitter->ReferenceDistance);
|
alSourcef(source, AL_REFERENCE_DISTANCE, soundEmitter->ReferenceDistance);
|
||||||
alSourcef(source, AL_PITCH, soundEmitter->Pitch);
|
alSourcef(source, AL_PITCH, soundEmitter->Pitch);
|
||||||
alSourcei(source, AL_LOOPING, soundEmitter->Loop);
|
alSourcei(source, AL_LOOPING, soundEmitter->Loop);
|
||||||
|
|
||||||
glm::vec3 emitterPos = transformComponent->Position;
|
glm::vec3 emitterPos = transformComponent->Position;
|
||||||
@@ -104,7 +104,8 @@ void Systems::SoundSystem::StopSound(std::shared_ptr<Components::SoundEmitter> e
|
|||||||
|
|
||||||
void Systems::SoundSystem::OnComponentCreated(std::string type, std::shared_ptr<Component> component)
|
void Systems::SoundSystem::OnComponentCreated(std::string type, std::shared_ptr<Component> component)
|
||||||
{
|
{
|
||||||
if(type == "SoundEmitter") {
|
if(type == "SoundEmitter")
|
||||||
|
{
|
||||||
ALuint source = CreateSource();
|
ALuint source = CreateSource();
|
||||||
m_Sources[component.get()] = source;
|
m_Sources[component.get()] = source;
|
||||||
}
|
}
|
||||||
@@ -112,8 +113,10 @@ void Systems::SoundSystem::OnComponentCreated(std::string type, std::shared_ptr<
|
|||||||
|
|
||||||
void Systems::SoundSystem::OnComponentRemoved(std::string type, Component* component)
|
void Systems::SoundSystem::OnComponentRemoved(std::string type, Component* component)
|
||||||
{
|
{
|
||||||
if(type == "SoundEmitter") {
|
if(type == "SoundEmitter")
|
||||||
if (m_Sources.find(component) != m_Sources.end()) {
|
{
|
||||||
|
if (m_Sources.find(component) != m_Sources.end())
|
||||||
|
{
|
||||||
ALuint source = m_Sources[component];
|
ALuint source = m_Sources[component];
|
||||||
alDeleteSources(1, &source);
|
alDeleteSources(1, &source);
|
||||||
}
|
}
|
||||||
@@ -125,30 +128,34 @@ ALuint Systems::SoundSystem::LoadFile(std::string path)
|
|||||||
if (m_BufferCache.find(path) != m_BufferCache.end())
|
if (m_BufferCache.find(path) != m_BufferCache.end())
|
||||||
return m_BufferCache[path];
|
return m_BufferCache[path];
|
||||||
|
|
||||||
FILE *fp = NULL;
|
FILE* fp = NULL;
|
||||||
fp = fopen(path.c_str(), "rb");
|
fp = fopen(path.c_str(), "rb");
|
||||||
|
|
||||||
if (fp == NULL) {
|
if (fp == NULL)
|
||||||
|
{
|
||||||
LOG_ERROR("Failed to load sound file \"%s\"", path.c_str());
|
LOG_ERROR("Failed to load sound file \"%s\"", path.c_str());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//CHECK FOR VALID WAVE-FILE
|
//CHECK FOR VALID WAVE-FILE
|
||||||
fread(type, sizeof(char), 4, fp);
|
fread(type, sizeof(char), 4, fp);
|
||||||
if(type[0]!='R' || type[1]!='I' || type[2]!='F' || type[3]!='F') {
|
if(type[0]!='R' || type[1]!='I' || type[2]!='F' || type[3]!='F')
|
||||||
|
{
|
||||||
LOG_ERROR("ERROR: No RIFF in WAVE-file");
|
LOG_ERROR("ERROR: No RIFF in WAVE-file");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
fread(&size, sizeof(unsigned long), 1, fp);
|
fread(&size, sizeof(unsigned long), 1, fp);
|
||||||
fread(type, sizeof(char), 4, fp);
|
fread(type, sizeof(char), 4, fp);
|
||||||
if(type[0]!='W' || type[1]!='A' || type[2]!='V' || type[3]!='E') {
|
if(type[0]!='W' || type[1]!='A' || type[2]!='V' || type[3]!='E')
|
||||||
|
{
|
||||||
LOG_ERROR("ERROR: Not WAVE-file");
|
LOG_ERROR("ERROR: Not WAVE-file");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
fread(type, sizeof(char), 4, fp);
|
fread(type, sizeof(char), 4, fp);
|
||||||
if(type[0]!='f' || type[1]!='m' || type[2]!='t' || type[3]!=' ') {
|
if(type[0]!='f' || type[1]!='m' || type[2]!='t' || type[3]!=' ')
|
||||||
|
{
|
||||||
LOG_ERROR("ERROR: No fmt in WAVE-file");
|
LOG_ERROR("ERROR: No fmt in WAVE-file");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -206,7 +213,7 @@ ALuint Systems::SoundSystem::CreateSource()
|
|||||||
ALuint source;
|
ALuint source;
|
||||||
alGenSources((ALuint)1, &source);
|
alGenSources((ALuint)1, &source);
|
||||||
|
|
||||||
alDopplerFactor(1); // Numbers greater than 1 will increase Doppler effect, numbers lower than 1 will decrease the Doppler effect
|
alDopplerFactor(1); // Numbers greater than 1 will increase Doppler effect, numbers lower than 1 will decrease the Doppler effect
|
||||||
alDopplerVelocity(350.f); // Defines the velocity of the sound
|
alDopplerVelocity(350.f); // Defines the velocity of the sound
|
||||||
|
|
||||||
return source;
|
return source;
|
||||||
|
|||||||
@@ -35,9 +35,9 @@ private:
|
|||||||
unsigned long sampleRate, avgBytesPerSec;
|
unsigned long sampleRate, avgBytesPerSec;
|
||||||
short bytesPerSample, bitsPerSample;
|
short bytesPerSample, bitsPerSample;
|
||||||
unsigned long dataSize;
|
unsigned long dataSize;
|
||||||
|
|
||||||
|
|
||||||
std::map<Component*, ALuint> m_Sources;
|
std::map<Component*, ALuint> m_Sources;
|
||||||
std::map<std::string, ALuint> m_BufferCache; // string = fileName
|
std::map<std::string, ALuint> m_BufferCache; // string = fileName
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ glm::vec3 Systems::TransformSystem::AbsolutePosition(EntityID entity)
|
|||||||
return absPosition * accumulativeOrientation;
|
return absPosition * accumulativeOrientation;
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::quat Systems::TransformSystem::AbsoluteOrientation(EntityID entity)
|
glm::quat Systems::TransformSystem::AbsoluteOrientation(EntityID entity)
|
||||||
{
|
{
|
||||||
glm::quat absOrientation;
|
glm::quat absOrientation;
|
||||||
|
|
||||||
|
|||||||
@@ -7,19 +7,19 @@
|
|||||||
namespace Systems
|
namespace Systems
|
||||||
{
|
{
|
||||||
|
|
||||||
class TransformSystem : public System
|
class TransformSystem : public System
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TransformSystem(World* world)
|
TransformSystem(World* world)
|
||||||
: System(world) { }
|
: System(world) { }
|
||||||
|
|
||||||
//void Update(double dt) override;
|
//void Update(double dt) override;
|
||||||
//void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
//void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
||||||
|
|
||||||
glm::vec3 AbsolutePosition(EntityID entity);
|
glm::vec3 AbsolutePosition(EntityID entity);
|
||||||
glm::quat AbsoluteOrientation(EntityID entity);
|
glm::quat AbsoluteOrientation(EntityID entity);
|
||||||
glm::vec3 AbsoluteScale(EntityID entity);
|
glm::vec3 AbsoluteScale(EntityID entity);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -9,7 +9,8 @@ Texture::Texture(std::string path)
|
|||||||
void Texture::Load(std::string path)
|
void Texture::Load(std::string path)
|
||||||
{
|
{
|
||||||
auto cachedTexture = m_TextureCache.find(path);
|
auto cachedTexture = m_TextureCache.find(path);
|
||||||
if (cachedTexture == m_TextureCache.end()) {
|
if (cachedTexture == m_TextureCache.end())
|
||||||
|
{
|
||||||
m_TextureCache[path] = SOIL_load_OGL_texture(path.c_str(), 0, 0, SOIL_FLAG_INVERT_Y);
|
m_TextureCache[path] = SOIL_load_OGL_texture(path.c_str(), 0, 0, SOIL_FLAG_INVERT_Y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -7,7 +7,8 @@
|
|||||||
inline bool _GLERROR(char* info, char* file, char* func, unsigned int line)
|
inline bool _GLERROR(char* info, char* file, char* func, unsigned int line)
|
||||||
{
|
{
|
||||||
GLenum error = glGetError();
|
GLenum error = glGetError();
|
||||||
if (error != GL_NO_ERROR) {
|
if (error != GL_NO_ERROR)
|
||||||
|
{
|
||||||
_LOG(LOG_LEVEL_ERROR, file, func, line, "GL Error: %s %i %s", info, error, gluErrorString(error));
|
_LOG(LOG_LEVEL_ERROR, file, func, line, "GL Error: %s %i %s", info, error, gluErrorString(error));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-2
@@ -55,10 +55,13 @@ static void _LOG(_LOG_LEVEL logLevel, char* file, char* func, unsigned int line,
|
|||||||
vsnprintf(message, size, format, args);
|
vsnprintf(message, size, format, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
if (logLevel == LOG_LEVEL_ERROR) {
|
if (logLevel == LOG_LEVEL_ERROR)
|
||||||
|
{
|
||||||
std::cerr << file << ":" << line << " " << func << std::endl;
|
std::cerr << file << ":" << line << " " << func << std::endl;
|
||||||
std::cerr << _LOG_LEVEL_PREFIX[logLevel] << message << std::endl;
|
std::cerr << _LOG_LEVEL_PREFIX[logLevel] << message << std::endl;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
std::cout << _LOG_LEVEL_PREFIX[logLevel] << message << std::endl;
|
std::cout << _LOG_LEVEL_PREFIX[logLevel] << message << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+23
-11
@@ -8,22 +8,27 @@ void World::RecycleEntityID(EntityID id)
|
|||||||
|
|
||||||
EntityID World::GenerateEntityID()
|
EntityID World::GenerateEntityID()
|
||||||
{
|
{
|
||||||
if (!m_RecycledEntityIDs.empty()) {
|
if (!m_RecycledEntityIDs.empty())
|
||||||
|
{
|
||||||
EntityID id = m_RecycledEntityIDs.top();
|
EntityID id = m_RecycledEntityIDs.top();
|
||||||
m_RecycledEntityIDs.pop();
|
m_RecycledEntityIDs.pop();
|
||||||
return id;
|
return id;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
return ++m_LastEntityID;
|
return ++m_LastEntityID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::RecursiveUpdate(std::shared_ptr<System> system, double dt, EntityID parentEntity)
|
void World::RecursiveUpdate(std::shared_ptr<System> system, double dt, EntityID parentEntity)
|
||||||
{
|
{
|
||||||
for (auto pair : m_EntityParents) {
|
for (auto pair : m_EntityParents)
|
||||||
|
{
|
||||||
EntityID child = pair.first;
|
EntityID child = pair.first;
|
||||||
EntityID parent = pair.second;
|
EntityID parent = pair.second;
|
||||||
|
|
||||||
if (parent == parentEntity) {
|
if (parent == parentEntity)
|
||||||
|
{
|
||||||
system->UpdateEntity(dt, child, parent);
|
system->UpdateEntity(dt, child, parent);
|
||||||
RecursiveUpdate(system, dt, child);
|
RecursiveUpdate(system, dt, child);
|
||||||
}
|
}
|
||||||
@@ -32,7 +37,8 @@ void World::RecursiveUpdate(std::shared_ptr<System> system, double dt, EntityID
|
|||||||
|
|
||||||
void World::Update(double dt)
|
void World::Update(double dt)
|
||||||
{
|
{
|
||||||
for (auto pair : m_Systems) {
|
for (auto pair : m_Systems)
|
||||||
|
{
|
||||||
auto system = pair.second;
|
auto system = pair.second;
|
||||||
system->Update(dt);
|
system->Update(dt);
|
||||||
RecursiveUpdate(system, dt, 0);
|
RecursiveUpdate(system, dt, 0);
|
||||||
@@ -73,8 +79,10 @@ bool World::ValidEntity(EntityID entity)
|
|||||||
void World::RemoveEntity(EntityID entity)
|
void World::RemoveEntity(EntityID entity)
|
||||||
{
|
{
|
||||||
m_EntitiesToRemove.push_back(entity);
|
m_EntitiesToRemove.push_back(entity);
|
||||||
for (auto pair : m_EntityParents) {
|
for (auto pair : m_EntityParents)
|
||||||
if (pair.second == entity) {
|
{
|
||||||
|
if (pair.second == entity)
|
||||||
|
{
|
||||||
m_EntitiesToRemove.push_back(pair.first);
|
m_EntitiesToRemove.push_back(pair.first);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -82,14 +90,17 @@ void World::RemoveEntity(EntityID entity)
|
|||||||
|
|
||||||
void World::ProcessEntityRemovals()
|
void World::ProcessEntityRemovals()
|
||||||
{
|
{
|
||||||
for (auto entity : m_EntitiesToRemove) {
|
for (auto entity : m_EntitiesToRemove)
|
||||||
|
{
|
||||||
m_EntityParents.erase(entity);
|
m_EntityParents.erase(entity);
|
||||||
// Remove components
|
// Remove components
|
||||||
for (auto pair : m_EntityComponents[entity]) {
|
for (auto pair : m_EntityComponents[entity])
|
||||||
|
{
|
||||||
auto type = pair.first;
|
auto type = pair.first;
|
||||||
auto component = pair.second;
|
auto component = pair.second;
|
||||||
// Trigger events
|
// Trigger events
|
||||||
for (auto pair : m_Systems) {
|
for (auto pair : m_Systems)
|
||||||
|
{
|
||||||
auto system = pair.second;
|
auto system = pair.second;
|
||||||
system->OnComponentRemoved(type, component.get());
|
system->OnComponentRemoved(type, component.get());
|
||||||
}
|
}
|
||||||
@@ -123,7 +134,8 @@ void World::Initialize()
|
|||||||
{
|
{
|
||||||
RegisterSystems();
|
RegisterSystems();
|
||||||
AddSystems();
|
AddSystems();
|
||||||
for (auto system : m_Systems) {
|
for (auto system : m_Systems)
|
||||||
|
{
|
||||||
system.second->Initialize();
|
system.second->Initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-5
@@ -28,7 +28,7 @@ public:
|
|||||||
virtual void RegisterSystems() = 0;
|
virtual void RegisterSystems() = 0;
|
||||||
virtual void AddSystems() = 0;
|
virtual void AddSystems() = 0;
|
||||||
virtual void RegisterComponents() = 0;
|
virtual void RegisterComponents() = 0;
|
||||||
|
|
||||||
|
|
||||||
void AddSystem(std::string systemType);
|
void AddSystem(std::string systemType);
|
||||||
template <class T>
|
template <class T>
|
||||||
@@ -68,7 +68,7 @@ public:
|
|||||||
/*std::vector<EntityID> GetEntityChildren(EntityID entity);*/
|
/*std::vector<EntityID> GetEntityChildren(EntityID entity);*/
|
||||||
|
|
||||||
virtual void Update(double dt);
|
virtual void Update(double dt);
|
||||||
// Recursively update through the scene graph
|
// Recursively update through the scene graph
|
||||||
void RecursiveUpdate(std::shared_ptr<System> system, double dt, EntityID parentEntity);
|
void RecursiveUpdate(std::shared_ptr<System> system, double dt, EntityID parentEntity);
|
||||||
|
|
||||||
std::unordered_map<EntityID, EntityID>* GetEntities() { return &m_EntityParents; }
|
std::unordered_map<EntityID, EntityID>* GetEntities() { return &m_EntityParents; }
|
||||||
@@ -100,7 +100,8 @@ protected:
|
|||||||
template <class T>
|
template <class T>
|
||||||
std::shared_ptr<T> World::GetSystem(std::string systemType)
|
std::shared_ptr<T> World::GetSystem(std::string systemType)
|
||||||
{
|
{
|
||||||
if (m_Systems.find(systemType) == m_Systems.end()) {
|
if (m_Systems.find(systemType) == m_Systems.end())
|
||||||
|
{
|
||||||
LOG_WARNING("Tried to get pointer to unregistered system \"%s\"!", systemType.c_str());
|
LOG_WARNING("Tried to get pointer to unregistered system \"%s\"!", systemType.c_str());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -112,7 +113,8 @@ template <class T>
|
|||||||
std::shared_ptr<T> World::AddComponent(EntityID entity, std::string componentType)
|
std::shared_ptr<T> World::AddComponent(EntityID entity, std::string componentType)
|
||||||
{
|
{
|
||||||
std::shared_ptr<T> component = std::shared_ptr<T>(static_cast<T*>(m_ComponentFactory.Create(componentType)));
|
std::shared_ptr<T> component = std::shared_ptr<T>(static_cast<T*>(m_ComponentFactory.Create(componentType)));
|
||||||
if (component == nullptr) {
|
if (component == nullptr)
|
||||||
|
{
|
||||||
LOG_ERROR("Failed to attach invalid component \"%s\" to entity #%i", componentType.c_str(), entity);
|
LOG_ERROR("Failed to attach invalid component \"%s\" to entity #%i", componentType.c_str(), entity);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -120,7 +122,8 @@ std::shared_ptr<T> World::AddComponent(EntityID entity, std::string componentTyp
|
|||||||
component->Entity = entity;
|
component->Entity = entity;
|
||||||
m_ComponentsOfType[componentType].push_back(component);
|
m_ComponentsOfType[componentType].push_back(component);
|
||||||
m_EntityComponents[entity][componentType] = component;
|
m_EntityComponents[entity][componentType] = component;
|
||||||
for (auto pair : m_Systems) {
|
for (auto pair : m_Systems)
|
||||||
|
{
|
||||||
auto system = pair.second;
|
auto system = pair.second;
|
||||||
system->OnComponentCreated(componentType, component);
|
system->OnComponentCreated(componentType, component);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user