Compare commits
468 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b81f2b3240 | |||
| 03d77beff9 | |||
| 64e7bb1e94 | |||
| a33cd42ca3 | |||
| 9055d5f697 | |||
| 971beb29d8 | |||
| 2ee21e05d4 | |||
| 5987751add | |||
| 94b59af973 | |||
| 70f8237a16 | |||
| 99cbdd3c1e | |||
| ce22854168 | |||
| 35b0193f15 | |||
| f8e514d21e | |||
| fad25c6e16 | |||
| 4103c878ec | |||
| 40788c7400 | |||
| 59bdc614f2 | |||
| be628d9406 | |||
| 66f442f1af | |||
| 2542397511 | |||
| 7641ba49c7 | |||
| fe6fd0bbe3 | |||
| e3a44d37d2 | |||
| 428dca003d | |||
| 4fe9e4f1c3 | |||
| d61e605093 | |||
| c526a7af55 | |||
| 6a23a987b3 | |||
| 7c582898f4 | |||
| ff26e1235c | |||
| 6990e473b3 | |||
| c87e4d4fd6 | |||
| d4292d4b43 | |||
| 035c79564b | |||
| 379d211832 | |||
| 03a16b46b5 | |||
| 0bbaf1d576 | |||
| bc01e147c2 | |||
| 1bd4aa91ff | |||
| 7b5a2a5388 | |||
| bd2da7bc9f | |||
| b56824786c | |||
| 13161b4f57 | |||
| 5665c0f298 | |||
| 7ffbd8455f | |||
| 83713b3b6d | |||
| 7bae2d0873 | |||
| 9d3171540d | |||
| 2391a0dbe9 | |||
| 2961f198b3 | |||
| 455e59a04f | |||
| 39653a1e4c | |||
| 2cbeef4c69 | |||
| 192de80782 | |||
| 51a588657e | |||
| 73ab9bb4c6 | |||
| 73716c28e2 | |||
| a3b7bd7df5 | |||
| c4fb604617 | |||
| 214dad2afc | |||
| affcc5305b | |||
| 11025b5466 | |||
| 5e472cd69c | |||
| eba36b8492 | |||
| 55854f5c0d | |||
| 12a181c1ff | |||
| b131f56f5e | |||
| 24aac6a00d | |||
| 7236da09b4 | |||
| 45a92b362f | |||
| 2085d9ec9e | |||
| 6a3f585fb9 | |||
| 7b4826cb44 | |||
| 28d412f5c7 | |||
| 0e5f6da9a9 | |||
| 563fd4082e | |||
| 42b52a6766 | |||
| 9c2e459e0c | |||
| 796e3eac79 | |||
| 8299b99e2f | |||
| c708f1582c | |||
| 782c1a388a | |||
| a188a3f7fa | |||
| ed7d00c1d8 | |||
| 30b1dab764 | |||
| 9090be8acf | |||
| a3d4eb65d5 | |||
| 9b2a4be707 | |||
| 5474a18753 | |||
| 5a45f778e6 | |||
| 53cae25eb2 | |||
| 0a43f8104e | |||
| 30ad238697 | |||
| 3cfbbbbf54 | |||
| ca8b7cbee8 | |||
| be3cfef65f | |||
| 65f5bc673f | |||
| d7b02e79c8 | |||
| a22bc00d46 | |||
| 76274c326e | |||
| 5bfcffc142 | |||
| 7054822be2 | |||
| ee92200300 | |||
| d3b1053f21 | |||
| 7987d4b27c | |||
| 0c97ce7a4a | |||
| df05f1909b | |||
| 13f020ddf5 | |||
| 8bcafc1151 | |||
| 7497ff39d2 | |||
| 65da634c71 | |||
| 97cbc55223 | |||
| c519ba2536 | |||
| 4b7613a659 | |||
| 7408da401b | |||
| a63ecb8133 | |||
| 788407b709 | |||
| 0e70dc6fa3 | |||
| 44302bb0f3 | |||
| 181017313d | |||
| 6615fe9438 | |||
| 113448dbf0 | |||
| 5cdf6db340 | |||
| 5c9616d4af | |||
| a954cbbf50 | |||
| dec2234019 | |||
| 0334ec3fa7 | |||
| 5fcd26cd3e | |||
| 8102f3a2ea | |||
| cbb17d22d4 | |||
| 8bed5194d8 | |||
| 90f05442aa | |||
| eb42217885 | |||
| 7e12d00874 | |||
| 6ea490e215 | |||
| 505a6c7396 | |||
| 8866dd6054 | |||
| b6fd18baed | |||
| 4245264029 | |||
| 3389b965eb | |||
| d12246833e | |||
| 44baa47bba | |||
| b95c1fdfa4 | |||
| 7b348379ac | |||
| 6aeb281249 | |||
| 04f6233d99 | |||
| d6cc1eaac4 | |||
| d0de169613 | |||
| 79fe7693a6 | |||
| b6ba8a5bd7 | |||
| f8b9606cdf | |||
| 84fddf02e2 | |||
| d03b3fb071 | |||
| 7e92d6f53f | |||
| 47d2fb6a9b | |||
| 06f64f8fbf | |||
| 0c56a05144 | |||
| 382eff169f | |||
| 0c557317a9 | |||
| a304b00038 | |||
| f1343e2f82 | |||
| d4797b0808 | |||
| ada1bac2a7 | |||
| 25890c8d6c | |||
| 0fb1dbcae1 | |||
| 9f3d887ac4 | |||
| b4081b3e45 | |||
| 8cf9caf7aa | |||
| 8d61632c26 | |||
| 2eaad2aa00 | |||
| 235b26ad61 | |||
| dd80323342 | |||
| af2f017cb4 | |||
| f80fb5eda8 | |||
| aa115befa9 | |||
| aa20b48188 | |||
| 96a735c542 | |||
| 3261e21d96 | |||
| c9dc9a3570 | |||
| 910b3d10e4 | |||
| 666f1fd878 | |||
| 373bb33cf0 | |||
| 4c5d17b203 | |||
| 8286d052b3 | |||
| aaa11d2109 | |||
| 67477ff3ae | |||
| aa3b8cd652 | |||
| b5b1140f5c | |||
| 7567f47a68 | |||
| 97d70f8e32 | |||
| 3baa988ad4 | |||
| 1ce9128da8 | |||
| a28748b35d | |||
| e6224a4e96 | |||
| fcba0a28b8 | |||
| 132de88d28 | |||
| df485ccf7b | |||
| 85a4d98c81 | |||
| ef020a3770 | |||
| 160b7183b2 | |||
| f1835fd89c | |||
| ecdb5ed07d | |||
| 6eeb3ea524 | |||
| 5edf5a41f1 | |||
| 6d2c656a04 | |||
| 2bf0434bcb | |||
| ff6ec82a6c | |||
| bd62b5873d | |||
| aacfc47fb5 | |||
| 666ef6589e | |||
| b83d773627 | |||
| d59ab5aba2 | |||
| 680a12d88f | |||
| f623232a2b | |||
| 71404c8828 | |||
| 6a18cb88af | |||
| b499f4b020 | |||
| 482689fd48 | |||
| 32f73201c5 | |||
| 3aeeb3cad5 | |||
| 4d5cbb6057 | |||
| bef95235d0 | |||
| 9a23d8887a | |||
| db0e67b9bd | |||
| e4513376bb | |||
| 445248af55 | |||
| 64a7239b17 | |||
| 3974c649ab | |||
| 31e7340daf | |||
| 3ac3311c0c | |||
| 90867b094a | |||
| 55ee2bb3bf | |||
| 406b730ef3 | |||
| b37b20b7d8 | |||
| 750442d224 | |||
| 389e057611 | |||
| 74d9bae896 | |||
| 46dff1a59c | |||
| 74c95089ea | |||
| ca2aab449e | |||
| 7498cebf5e | |||
| 2b8debbfff | |||
| 08c476e9e3 | |||
| 1670fb4e48 | |||
| 3955e1d60c | |||
| 10c3b475bf | |||
| 08fcdb382b | |||
| b1ea5429ce | |||
| d25804e6f8 | |||
| 52765cc85b | |||
| fcc9d64e7a | |||
| caf55fb8d1 | |||
| 7a95880e10 | |||
| 6cd073c3c8 | |||
| 1e3fc1ae2d | |||
| 6f739e22f3 | |||
| 8cf83454d7 | |||
| d2984c6ae4 | |||
| 41f0daaf3f | |||
| deb6ff1b16 | |||
| 9f6fa40448 | |||
| de7c8e9234 | |||
| 4d60f387ed | |||
| f740d46683 | |||
| 75dcdcec41 | |||
| 254caf9e5d | |||
| 1c6750f5b0 | |||
| 3548cfa248 | |||
| 973ccd34c9 | |||
| 43b8fd29f6 | |||
| a6548a72b3 | |||
| 7deb32431e | |||
| fc06a4babc | |||
| 382e00cff4 | |||
| c6e9aad0c7 | |||
| afe43c5f44 | |||
| 2381f01d12 | |||
| b9147344e1 | |||
| 70bbc5ed0a | |||
| 0183e1bdb7 | |||
| 983f90504d | |||
| bdebc9de62 | |||
| f1345419b6 | |||
| 5e70d6eef6 | |||
| 4aa9100c69 | |||
| 7b34e001ba | |||
| c2e05de89f | |||
| ea9c4d19d0 | |||
| f3bfe388af | |||
| 70cab9ef30 | |||
| f1a54a89b3 | |||
| c984f76b2f | |||
| b098bd2bd3 | |||
| 60037c2849 | |||
| cd67253173 | |||
| a596b8746b | |||
| 4d5b835352 | |||
| 35876f6425 | |||
| f6ce98249e | |||
| 00588b07c5 | |||
| 3376f4a16e | |||
| 25d2aa3464 | |||
| 29aefc5af2 | |||
| 39ae83efd4 | |||
| 86824f1b1f | |||
| 8189e3c00c | |||
| 4d01cdf895 | |||
| 7e7ca7edcf | |||
| e9a576341e | |||
| f52cddb445 | |||
| 78a1037983 | |||
| 84b7cf165c | |||
| 85523343b2 | |||
| 386e76f642 | |||
| 410e349329 | |||
| a47317bb32 | |||
| e643581971 | |||
| 3826142e94 | |||
| ce27b224df | |||
| b45de542da | |||
| f0763bc2a3 | |||
| dfa96f74e1 | |||
| 5d6d0f82b9 | |||
| a124ab2400 | |||
| d2263b0c90 | |||
| a8ffb24040 | |||
| 893ef38237 | |||
| f197993beb | |||
| ad9bb5fba4 | |||
| 982837052a | |||
| 8854794cbc | |||
| e0c4394f20 | |||
| 260203fa4d | |||
| d030e8f699 | |||
| 61984d2c4a | |||
| cfe023cc1d | |||
| 4cafb2fc4c | |||
| 46e17b7e0d | |||
| a6445c65aa | |||
| 162523d3ca | |||
| dbe56280a6 | |||
| 3fb975a8d9 | |||
| 267a60ef30 | |||
| 68af853a03 | |||
| 3142c701e3 | |||
| b62e42567c | |||
| 77e1dacb6f | |||
| 9e3dfff7b6 | |||
| 79eaa7364c | |||
| 51979d7f0c | |||
| 3fc44e944c | |||
| 1760f9dfb1 | |||
| 2a3009212a | |||
| d4242bbead | |||
| 631dd57eeb | |||
| 9cb5f4bd2f | |||
| a6425160fd | |||
| 88eb3ca2db | |||
| 3e90ed564c | |||
| 4b29d48f27 | |||
| c4594524da | |||
| 2a93e2ae7f | |||
| 14b1d541dc | |||
| 765509b510 | |||
| 8952c1a7e4 | |||
| fc305f8bf4 | |||
| 62c3f72355 | |||
| 92553f1e93 | |||
| 70cbb02cb2 | |||
| 0c7f2c5198 | |||
| d7780d8248 | |||
| 601ce85c05 | |||
| 4c1a49a8a4 | |||
| 37aa1eaa18 | |||
| 01a164847c | |||
| 794635b6a1 | |||
| 0a3b6f4da1 | |||
| 3bc7dceca5 | |||
| e0410d4345 | |||
| 6f1fd19ac7 | |||
| 6680f6863f | |||
| 1411964dcf | |||
| 4092f6b4d4 | |||
| 35269315cc | |||
| 504f301e4d | |||
| 8f8b64f99c | |||
| 6ba6deb863 | |||
| cc604f8e9a | |||
| e97f4a3563 | |||
| d995713d3b | |||
| e39e4064f2 | |||
| 0d50ede6f5 | |||
| 4786986abd | |||
| e34856468a | |||
| e2357b8625 | |||
| 6ec2258758 | |||
| 9f447afbdb | |||
| 16c39df439 | |||
| 8437b9c734 | |||
| 6317a6092d | |||
| 7faed50507 | |||
| 6fbb962b5e | |||
| db62d767ac | |||
| e7da11fda4 | |||
| 8f257b9a58 | |||
| c8fe6853c0 | |||
| 76a8b43ca3 | |||
| 0bf756dc08 | |||
| 4e70439653 | |||
| 696f44a673 | |||
| 5e9a3774ab | |||
| db18a45368 | |||
| a060640da3 | |||
| b8a41b7c13 | |||
| 9533920684 | |||
| f47f913bf5 | |||
| ed5ac2e923 | |||
| 7a8604bf2b | |||
| 3a1056a2c3 | |||
| 59be714fdc | |||
| 147b116f20 | |||
| f0b425614d | |||
| 4b672b11e7 | |||
| e865971fdd | |||
| 878c71b56a | |||
| ec4d5fbfa8 | |||
| 184af95507 | |||
| e6527196ed | |||
| c14f3789f7 | |||
| 24486c314d | |||
| 923589524b | |||
| 00eeed2e20 | |||
| 7b62dc19bf | |||
| a20ca49d53 | |||
| 0630885d92 | |||
| 774bb8ce56 | |||
| 0cc58f088a | |||
| 00805d30d0 | |||
| 2f6261dfbf | |||
| 2cd0e94a60 | |||
| 8f92de3683 | |||
| 31c1c0ac8d | |||
| 0e90382fd1 | |||
| 1667358e0c | |||
| 3467315aef | |||
| 7ae42a5bf7 | |||
| eb5fca898f | |||
| c9db46564f | |||
| 509a989d3b | |||
| bc4cc5db54 | |||
| 73708ec706 | |||
| 67017fcaf4 | |||
| 498afb3a5e | |||
| 4e535c1102 | |||
| 1689370356 | |||
| 123c198e19 | |||
| 60b3ce89b2 | |||
| 9bd3da409d | |||
| a8a38716bd | |||
| 8f007f6daf | |||
| 4c2ce3882e | |||
| 7b6902eafe | |||
| 46854a63dd | |||
| dc66891d60 | |||
| a22d086e60 | |||
| 74c1beed20 | |||
| c8cb0ee939 |
@@ -4,3 +4,11 @@ bin/
|
||||
lib/
|
||||
# Because apparently nobody has any self control
|
||||
*.orig
|
||||
|
||||
*.suo
|
||||
*.sdf
|
||||
tools/MayaExporter/MayaExporter/x64/Debug/
|
||||
tools/MayaExporter/x64/Debug/
|
||||
|
||||
tools/MayaExporter/MayaExporter/Debug/
|
||||
tools/MayaExporter/MayaExporter/GeneratedFiles/
|
||||
|
||||
@@ -14,6 +14,9 @@ endif()
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
|
||||
elseif(MSVC)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
|
||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
||||
endif()
|
||||
|
||||
#set(BUILD_SHARED_LIBS FALSE)
|
||||
@@ -34,6 +37,12 @@ foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
|
||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})
|
||||
endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES)
|
||||
|
||||
# DEBUG definition
|
||||
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
|
||||
$<$<CONFIG:Debug>:DEBUG>
|
||||
$<$<CONFIG:RelWithDebInfo>:DEBUG>
|
||||
)
|
||||
|
||||
include(cotire)
|
||||
add_subdirectory(src/Engine)
|
||||
add_subdirectory(src/Game)
|
||||
|
||||
+1
-1
Submodule assets updated: a3c92ac876...cfeeb1f880
@@ -4,21 +4,22 @@
|
||||
#include "../Core/System.h"
|
||||
#include "../Core/Octree.h"
|
||||
#include "Collision.h"
|
||||
#include "EntityAABB.h"
|
||||
|
||||
class CollidableOctreeSystem : public ImpureSystem, public PureSystem
|
||||
{
|
||||
public:
|
||||
CollidableOctreeSystem(EventBroker* eventBroker, Octree<AABB>* octree)
|
||||
: System(eventBroker)
|
||||
, PureSystem("Collidable")
|
||||
CollidableOctreeSystem(World* world, EventBroker* eventBroker, Octree<EntityAABB>* octree, const std::string& componentType)
|
||||
: System(world, eventBroker)
|
||||
, PureSystem(componentType)
|
||||
, m_Octree(octree)
|
||||
{ }
|
||||
|
||||
virtual void Update(World* world, double dt) override;
|
||||
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
||||
virtual void Update(double dt) override;
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
||||
|
||||
private:
|
||||
Octree<AABB>* m_Octree;
|
||||
Octree<EntityAABB>* m_Octree;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -10,10 +10,12 @@
|
||||
|
||||
#include "../Core/Ray.h"
|
||||
#include "../Core/AABB.h"
|
||||
#include "../Rendering/RawModel.h"
|
||||
#include "Rendering/RawModelCustom.h"
|
||||
//#include "Rendering/RawModelAssimp.h"
|
||||
#include "../Core/Transform.h"
|
||||
#include "../Core/Entity.h"
|
||||
#include "../Core/EntityWrapper.h"
|
||||
#include "EntityAABB.h"
|
||||
|
||||
class World;
|
||||
struct ComponentWrapper;
|
||||
@@ -26,6 +28,21 @@ bool RayVsAABB(const Ray& ray, const AABB& box);
|
||||
//Return true if the ray hits the box, also outputs distance from ray origin to intersection point in [outDistance].
|
||||
bool RayVsAABB(const Ray& ray, const AABB& box, float& outDistance);
|
||||
|
||||
//Return true if the ray hits the triangle.
|
||||
bool RayVsTriangle(const Ray& ray,
|
||||
const glm::vec3& v0,
|
||||
const glm::vec3& v1,
|
||||
const glm::vec3& v2,
|
||||
bool trueOnNegativeDistance = false);
|
||||
//Return true if the ray hits the triangle, and the distance is less than outDistance.
|
||||
bool RayVsTriangle(const Ray& ray,
|
||||
const glm::vec3& v0,
|
||||
const glm::vec3& v1,
|
||||
const glm::vec3& v2,
|
||||
float& outDistance,
|
||||
float& outUCoord,
|
||||
float& outVCoord,
|
||||
bool trueOnNegativeDistance = false);
|
||||
//Return true if the ray hits any of the triangles in the model. Stops checking when a hit is detected.
|
||||
bool RayVsModel(const Ray& ray,
|
||||
const std::vector<RawModel::Vertex>& modelVertices,
|
||||
@@ -50,6 +67,9 @@ bool AABBvsTriangles(const AABB& box,
|
||||
const std::vector<RawModel::Vertex>& modelVertices,
|
||||
const std::vector<unsigned int>& modelIndices,
|
||||
const glm::mat4& modelMatrix,
|
||||
glm::vec3& boxVelocity,
|
||||
float verticalStepHeight,
|
||||
bool& isOnGround,
|
||||
glm::vec3& outResolutionVector);
|
||||
|
||||
//Return true if the boxes are intersecting.
|
||||
@@ -57,10 +77,9 @@ bool AABBVsAABB(const AABB& a, const AABB& b);
|
||||
//Return true if the boxes are intersecting.
|
||||
//Also outputs the minimum translation that box [a] would need in order to resolve collision.
|
||||
bool AABBVsAABB(const AABB& a, const AABB& b, glm::vec3& minimumTranslation);
|
||||
bool IsSameBoxProbably(const AABB& first, const AABB& second, const float epsilon = 0.0001f);
|
||||
|
||||
// Calculates an absolute AABB from an entity AABB component
|
||||
boost::optional<AABB> EntityAbsoluteAABB(EntityWrapper& entity);
|
||||
boost::optional<EntityAABB> EntityAbsoluteAABB(EntityWrapper& entity);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -7,30 +7,23 @@
|
||||
#include "../Common.h"
|
||||
#include "../Core/System.h"
|
||||
#include "../Core/EventBroker.h"
|
||||
#include "../Core/EKeyUp.h"
|
||||
#include "../Core/Octree.h"
|
||||
#include "EntityAABB.h"
|
||||
|
||||
class CollisionSystem : public PureSystem
|
||||
{
|
||||
public:
|
||||
CollisionSystem(EventBroker* eventBroker, Octree<AABB>* octree)
|
||||
: System(eventBroker)
|
||||
CollisionSystem(World* world, EventBroker* eventBroker, Octree<EntityAABB>* octree)
|
||||
: System(world, eventBroker)
|
||||
, PureSystem("Collidable")
|
||||
, m_Octree(octree)
|
||||
, zPress(false)
|
||||
{
|
||||
//TODO: Debug stuff, remove later.
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &CollisionSystem::OnKeyUp);
|
||||
}
|
||||
{ }
|
||||
|
||||
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
||||
|
||||
private:
|
||||
Octree<AABB>* m_Octree;
|
||||
bool zPress;
|
||||
|
||||
EventRelay<CollisionSystem, Events::KeyUp> m_EKeyUp;
|
||||
bool OnKeyUp(const Events::KeyUp &event);
|
||||
Octree<EntityAABB>* m_Octree;
|
||||
std::vector<EntityAABB> m_OctreeResult;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -2,7 +2,7 @@
|
||||
#define Events_TriggerEnter_h__
|
||||
|
||||
#include "../Core/EventBroker.h"
|
||||
#include "../Core/Entity.h"
|
||||
#include "../Core/EntityWrapper.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
@@ -11,27 +11,27 @@ namespace Events
|
||||
struct TriggerTouch : Event
|
||||
{
|
||||
/** The id of the entity that touches the trigger. */
|
||||
EntityID Entity;
|
||||
EntityWrapper Entity;
|
||||
/** The id of the trigger entity. */
|
||||
EntityID Trigger;
|
||||
EntityWrapper Trigger;
|
||||
};
|
||||
|
||||
/** Thrown once, when an entity has completely left a trigger. */
|
||||
struct TriggerLeave : Event
|
||||
{
|
||||
/** The id of the entity that left the trigger. */
|
||||
EntityID Entity;
|
||||
EntityWrapper Entity;
|
||||
/** The id of the trigger entity. */
|
||||
EntityID Trigger;
|
||||
EntityWrapper Trigger;
|
||||
};
|
||||
|
||||
/** Thrown once, when an entity is completely contained inside a trigger. */
|
||||
struct TriggerEnter : Event
|
||||
{
|
||||
/** The id of the entity that entered the trigger. */
|
||||
EntityID Entity;
|
||||
EntityWrapper Entity;
|
||||
/** The id of the trigger entity. */
|
||||
EntityID Trigger;
|
||||
EntityWrapper Trigger;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
#ifndef EntityAABB_h__
|
||||
#define EntityAABB_h__
|
||||
|
||||
#include "../Core/AABB.h"
|
||||
#include "../Core/EntityWrapper.h"
|
||||
|
||||
struct EntityAABB : AABB
|
||||
{
|
||||
EntityAABB() = default;
|
||||
|
||||
EntityAABB(const glm::vec3& minPos, const glm::vec3& maxPos)
|
||||
: AABB(minPos, maxPos)
|
||||
{ }
|
||||
|
||||
EntityAABB(const AABB& aabb)
|
||||
: AABB(aabb)
|
||||
{ }
|
||||
|
||||
EntityWrapper Entity;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -8,14 +8,15 @@
|
||||
#include "../Core/EventBroker.h"
|
||||
#include "../Core/Octree.h"
|
||||
#include "ETrigger.h"
|
||||
#include "EntityAABB.h"
|
||||
|
||||
class AABB;
|
||||
|
||||
class TriggerSystem : public PureSystem
|
||||
{
|
||||
public:
|
||||
TriggerSystem(EventBroker* eventBroker, Octree<AABB>* octree)
|
||||
: System(eventBroker)
|
||||
TriggerSystem(World* world, EventBroker* eventBroker, Octree<EntityAABB>* octree)
|
||||
: System(world, eventBroker)
|
||||
, PureSystem("Trigger")
|
||||
, m_Octree(octree)
|
||||
{
|
||||
@@ -24,12 +25,13 @@ public:
|
||||
EVENT_SUBSCRIBE_MEMBER(m_ELeave, &TriggerSystem::OnLeave);
|
||||
}
|
||||
|
||||
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
||||
|
||||
private:
|
||||
Octree<AABB>* m_Octree;
|
||||
std::unordered_map<EntityID, std::unordered_set<EntityID>> m_EntitiesTouchingTrigger;
|
||||
std::unordered_map<EntityID, std::unordered_set<EntityID>> m_EntitiesCompletelyInTrigger;
|
||||
Octree<EntityAABB>* m_Octree;
|
||||
std::vector<EntityAABB> m_OctreeOut;
|
||||
std::unordered_map<EntityWrapper, std::unordered_set<EntityWrapper>> m_EntitiesTouchingTrigger;
|
||||
std::unordered_map<EntityWrapper, std::unordered_set<EntityWrapper>> m_EntitiesCompletelyInTrigger;
|
||||
|
||||
//TODO: Only exists for debug purposes, remove later.
|
||||
EventRelay<TriggerSystem, Events::TriggerEnter> m_EEnter;
|
||||
@@ -40,13 +42,13 @@ private:
|
||||
bool OnLeave(const Events::TriggerLeave &event);
|
||||
|
||||
//True if leave event was thrown.
|
||||
bool throwLeaveIfWasInTrigger(std::unordered_set<EntityID>& triggerSet, EntityID pId, EntityID tId);
|
||||
bool throwLeaveIfWasInTrigger(std::unordered_set<EntityWrapper>& triggerSet, EntityWrapper colliderENtity, EntityWrapper triggerEntity);
|
||||
template<typename Event>
|
||||
void publish(EntityID pId, EntityID tId)
|
||||
void publish(EntityWrapper collider, EntityWrapper trigger)
|
||||
{
|
||||
Event e;
|
||||
e.Trigger = tId;
|
||||
e.Entity = pId;
|
||||
e.Trigger = trigger;
|
||||
e.Entity = collider;
|
||||
m_EventBroker->Publish(e);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <unordered_map>
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
|
||||
#include "Core/Util/Logging.h"
|
||||
#include "Core/Util/IfDebug.h"
|
||||
@@ -9,7 +9,6 @@ public:
|
||||
AABB() = default;
|
||||
//No checks are made. Values in minPos must be less than values in maxPos, i.e. min.x < max.x, etc.
|
||||
AABB(const glm::vec3& minPos, const glm::vec3& maxPos);
|
||||
AABB(const glm::vec4& minPos, const glm::vec4& maxPos);
|
||||
//No checks are made. Size must consist of non-negative numbers.
|
||||
static AABB FromOriginSize(const glm::vec3& origin, const glm::vec3& size);
|
||||
virtual ~AABB();
|
||||
|
||||
@@ -5,12 +5,14 @@
|
||||
|
||||
struct ComponentInfo
|
||||
{
|
||||
typedef int EnumType;
|
||||
|
||||
struct Meta_t
|
||||
{
|
||||
std::string Annotation;
|
||||
unsigned int Allocation = 0;
|
||||
std::map<std::string, std::string> FieldAnnotations;
|
||||
std::map<std::string, std::map<std::string, int>> FieldEnumDefinitions;
|
||||
std::map<std::string, std::map<std::string, EnumType>> FieldEnumDefinitions;
|
||||
};
|
||||
|
||||
struct Field_t
|
||||
|
||||
@@ -61,6 +61,7 @@ public:
|
||||
|
||||
iterator begin() const;
|
||||
iterator end() const;
|
||||
size_t size() const;
|
||||
|
||||
//Dumps information about what the pool memory looks like right now
|
||||
//into an output stream (e.g. file/std::cout, anything that has an operator<<)
|
||||
|
||||
@@ -18,7 +18,7 @@ struct ComponentWrapper
|
||||
const ::EntityID EntityID;
|
||||
char* Data;
|
||||
|
||||
int Enum(const char* fieldName, const char* enumKey)
|
||||
ComponentInfo::EnumType Enum(const char* fieldName, const char* enumKey)
|
||||
{
|
||||
return Info.Meta->FieldEnumDefinitions.at(fieldName).at(enumKey);
|
||||
}
|
||||
@@ -43,6 +43,11 @@ struct ComponentWrapper
|
||||
// Specialization for string literals
|
||||
template <std::size_t N>
|
||||
void SetField(std::string name, const char(&value)[N]) { Field<std::string>(name) = std::string(value); }
|
||||
|
||||
void Copy(ComponentWrapper& destination)
|
||||
{
|
||||
memcpy(destination.Data, this->Data, Info.Stride);
|
||||
}
|
||||
|
||||
struct SubscriptProxy
|
||||
{
|
||||
@@ -58,7 +63,7 @@ struct ComponentWrapper
|
||||
|
||||
public:
|
||||
// Return the integer value of an enum type key for this field
|
||||
int Enum(const char* enumKey) { return m_Component->Enum(m_PropertyName.c_str(), enumKey); }
|
||||
ComponentInfo::EnumType Enum(const char* enumKey) { return m_Component->Enum(m_PropertyName.c_str(), enumKey); }
|
||||
|
||||
template <typename T>
|
||||
operator T&() { return m_Component->Field<T>(m_PropertyName); }
|
||||
@@ -81,7 +86,7 @@ class ComponentWrapperFactory
|
||||
{
|
||||
public:
|
||||
ComponentWrapperFactory() = default;
|
||||
ComponentWrapperFactory(std::string componentTypeName, std::size_t allocation = 0)
|
||||
ComponentWrapperFactory(std::string componentTypeName, unsigned int allocation = 0)
|
||||
{
|
||||
m_ComponentInfo.Name = componentTypeName;
|
||||
m_ComponentInfo.Meta->Allocation = allocation;
|
||||
@@ -91,7 +96,7 @@ public:
|
||||
void AddProperty(std::string fieldName, T defaultValue)
|
||||
{
|
||||
m_DefaultValues.push_back(defaultValue);
|
||||
m_ComponentInfo.Fields[fieldName].Name = typeid(T).name();
|
||||
m_ComponentInfo.Fields[fieldName].Type = typeid(T).name();
|
||||
m_ComponentInfo.Fields[fieldName].Offset = m_ComponentInfo.Stride;
|
||||
m_ComponentInfo.Fields[fieldName].Stride = sizeof(T);
|
||||
m_ComponentInfo.Stride += sizeof(T);
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
#ifndef ECaptured_h__
|
||||
#define ECaptured_h__
|
||||
|
||||
#include "EventBroker.h"
|
||||
#include "../Core/Entity.h"
|
||||
#include "Engine/GLM.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
//triggers when a capturePoint has been taken over
|
||||
struct Captured : Event
|
||||
{
|
||||
int TeamNumberThatCapturedCapturePoint;
|
||||
EntityID CapturePointID;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,21 @@
|
||||
#ifndef EComponentDeleted_h__
|
||||
#define EComponentDeleted_h__
|
||||
|
||||
#include "../Common.h"
|
||||
#include "Event.h"
|
||||
#include "Entity.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct ComponentDeleted : Event
|
||||
{
|
||||
EntityID Entity;
|
||||
std::string ComponentType;
|
||||
// True if the component was deleted as a result of the entity it was attached to being deleted
|
||||
bool Cascaded;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,19 @@
|
||||
#ifndef EEntityDeleted_h__
|
||||
#define EEntityDeleted_h__
|
||||
|
||||
#include "Event.h"
|
||||
#include "Entity.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct EntityDeleted : Event
|
||||
{
|
||||
EntityID DeletedEntity;
|
||||
// True if the entity deletion was triggered because the entity's parent was deleted before it
|
||||
bool Cascaded;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -11,6 +11,9 @@ struct KeyDown : Event
|
||||
{
|
||||
/** GLFW key code */
|
||||
int KeyCode;
|
||||
bool ModCtrl;
|
||||
bool ModAlt;
|
||||
bool ModShift;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -11,6 +11,9 @@ struct KeyUp : Event
|
||||
{
|
||||
/** GLFW key code */
|
||||
int KeyCode;
|
||||
bool ModCtrl;
|
||||
bool ModAlt;
|
||||
bool ModShift;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
#ifndef EPause_h__
|
||||
#define EPause_h__
|
||||
|
||||
#include "EventBroker.h"
|
||||
#include "World.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct Pause : Event
|
||||
{
|
||||
::World* World;
|
||||
};
|
||||
|
||||
struct Resume : Event
|
||||
{
|
||||
::World* World;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,17 @@
|
||||
#ifndef EPickupSpawned_h__
|
||||
#define EPickupSpawned_h__
|
||||
|
||||
#include "Core/Event.h"
|
||||
#include "Core/EntityWrapper.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct PickupSpawned : Event
|
||||
{
|
||||
EntityWrapper Pickup;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -2,17 +2,16 @@
|
||||
#define EPlayerDamage_h__
|
||||
|
||||
#include "EventBroker.h"
|
||||
#include "../Core/Entity.h"
|
||||
#include "../Core/EntityWrapper.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct PlayerDamage : Event
|
||||
{
|
||||
double DamageAmount;
|
||||
EntityID PlayerDamagedID;
|
||||
//optional TypeOfDamage
|
||||
std::string TypeOfDamage;
|
||||
//NOTE: this struct is missing information on what the damageSource is
|
||||
EntityWrapper Player;
|
||||
double Damage;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define EPlayerDeath_h__
|
||||
|
||||
#include "EventBroker.h"
|
||||
#include "../Core/Entity.h"
|
||||
#include "../Core/EntityWrapper.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
@@ -10,8 +10,7 @@ namespace Events
|
||||
struct PlayerDeath : Event
|
||||
{
|
||||
//KilledBy,KilledByWhat is optional for now. It might be used later in the playerlog-system
|
||||
EntityID KilledBy;
|
||||
EntityID PlayerID;
|
||||
EntityWrapper Player;
|
||||
std::string KilledByWhat;
|
||||
};
|
||||
|
||||
|
||||
@@ -2,16 +2,16 @@
|
||||
#define EPlayerHealthPickup_h__
|
||||
|
||||
#include "EventBroker.h"
|
||||
#include "../Core/Entity.h"
|
||||
#include "../Core/EntityWrapper.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct PlayerHealthPickup : Event
|
||||
{
|
||||
double HealthAmount;
|
||||
EntityID PlayerHealedID;
|
||||
};
|
||||
struct PlayerHealthPickup : Event
|
||||
{
|
||||
EntityWrapper Player;
|
||||
double HealthAmount;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
#ifndef EPlayerSpawned_h__
|
||||
#define EPlayerSpawned_h__
|
||||
|
||||
#include "Core/Event.h"
|
||||
#include "Core/EntityWrapper.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct PlayerSpawned : Event
|
||||
{
|
||||
int PlayerID;
|
||||
EntityWrapper Player;
|
||||
EntityWrapper Spawner;
|
||||
std::string PlayerName;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,17 @@
|
||||
#ifndef EShoot_h__
|
||||
#define EShoot_h__
|
||||
|
||||
#include "EventBroker.h"
|
||||
#include "../Core/EntityWrapper.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct Shoot : Event
|
||||
{
|
||||
EntityWrapper Player;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,20 @@
|
||||
#ifndef EWin_h__
|
||||
#define EWin_h__
|
||||
|
||||
#include "EventBroker.h"
|
||||
#include "../Core/Entity.h"
|
||||
#include "Engine/GLM.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
//triggers when a team has captured all capturePoints
|
||||
struct Win : Event
|
||||
{
|
||||
//can be 0 = none, 1,2
|
||||
int TeamThatWon;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -143,7 +143,7 @@ private:
|
||||
~EntityFile();
|
||||
|
||||
public:
|
||||
static std::size_t GetTypeStride(std::string typeName);
|
||||
static unsigned int GetTypeStride(std::string typeName);
|
||||
static void WriteAttributeData(char* outData, const ComponentInfo::Field_t& field, const std::map<std::string, std::string>& attributes);
|
||||
static void WriteValueData(char* outData, const ComponentInfo::Field_t& field, const char* valueData);
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define EntityWrapper_h__
|
||||
|
||||
#include <boost/optional.hpp>
|
||||
#include <boost/functional/hash.hpp>
|
||||
#include "ComponentWrapper.h"
|
||||
|
||||
class World;
|
||||
@@ -22,11 +23,35 @@ struct EntityWrapper
|
||||
|
||||
static const EntityWrapper Invalid;
|
||||
|
||||
bool HasComponent(const std::string& componentName);
|
||||
const std::string Name();
|
||||
bool HasComponent(const std::string& componentType);
|
||||
EntityWrapper Parent();
|
||||
EntityWrapper FirstChildByName(const std::string& name);
|
||||
EntityWrapper FirstParentWithComponent(const std::string& componentType);
|
||||
bool IsChildOf(EntityWrapper potentialParent);
|
||||
bool Valid();
|
||||
|
||||
ComponentWrapper operator[](const std::string& componentName);
|
||||
bool operator==(const EntityWrapper& e);
|
||||
explicit operator EntityID();
|
||||
ComponentWrapper operator[](const char* componentName);
|
||||
bool operator==(const EntityWrapper& e) const;
|
||||
bool operator!=(const EntityWrapper& e) const;
|
||||
explicit operator EntityID() const;
|
||||
|
||||
private:
|
||||
EntityWrapper firstChildByNameRecursive(const std::string& name, EntityID parent);
|
||||
};
|
||||
|
||||
namespace std
|
||||
{
|
||||
template<> struct hash<EntityWrapper>
|
||||
{
|
||||
std::size_t operator()(const EntityWrapper& e) const
|
||||
{
|
||||
std::size_t seed = 0;
|
||||
boost::hash_combine(seed, e.World);
|
||||
boost::hash_combine(seed, e.ID);
|
||||
return seed;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -102,7 +102,7 @@ public:
|
||||
m_ExtraMemory.push_back((char*)malloc(m_Stride));
|
||||
//We should preferably not enter here to avoid performance issues. Set more numMaxElements in constructor instead.
|
||||
if (!DisableMemoryPool::Value) {
|
||||
LOG_WARNING("Allocated slots exceed Pool size, extra memory allocated dynamically. Pool size: %u, dynamic size: %u.", m_NumSlots, m_ExtraMemory.size());
|
||||
LOG_DEBUG("Allocated slots exceed Pool size, extra memory allocated dynamically. Pool size: %u, dynamic size: %u.", m_NumSlots, m_ExtraMemory.size());
|
||||
}
|
||||
return m_ExtraMemory.back();
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ struct Child
|
||||
std::vector<ContainedObject>& m_StaticObjectsRef;
|
||||
std::vector<ContainedObject>& m_DynamicObjectsRef;
|
||||
|
||||
inline bool hasChildren() const;
|
||||
inline bool hasChildren() const { return m_Children[0] != nullptr; }
|
||||
int childIndexContainingPoint(const glm::vec3& point) const;
|
||||
std::vector<int> childIndicesContainingBox(const AABB& box) const;
|
||||
};
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
class Ray
|
||||
{
|
||||
public:
|
||||
Ray()
|
||||
: m_Origin(glm::vec3(0.f))
|
||||
, m_Direction(glm::vec3(0, 0, 1))
|
||||
{}
|
||||
Ray(const glm::vec3& origin, const glm::vec3& dir)
|
||||
: m_Origin(origin)
|
||||
, m_Direction(glm::normalize(dir))
|
||||
|
||||
@@ -32,10 +32,10 @@ public:
|
||||
};
|
||||
struct FailedLoadingException : public std::exception
|
||||
{
|
||||
virtual const char* what() const throw()
|
||||
{
|
||||
return "Resource is failed to load.";
|
||||
}
|
||||
FailedLoadingException(char const* const _Message)
|
||||
: std::exception(_Message)
|
||||
{ }
|
||||
FailedLoadingException() :std::exception("Resource failed to load.") { };
|
||||
};
|
||||
|
||||
// Pretend that this is a pure virtual function that you have to implement
|
||||
@@ -200,13 +200,16 @@ static T* ResourceManager::Load(const std::string& resourceName, Resource* paren
|
||||
}
|
||||
|
||||
//If resource has already been cached and completely loaded.
|
||||
it = m_ResourceCache.find(cacheKey);
|
||||
if (it != m_ResourceCache.end()) {
|
||||
if (it->second != nullptr) {
|
||||
return static_cast<T*>(it->second);
|
||||
} else {
|
||||
//Don't return null on failure, exception instead.
|
||||
throw Resource::FailedLoadingException();
|
||||
{
|
||||
boost::lock_guard<decltype(m_Mutex)> guard(m_Mutex);
|
||||
it = m_ResourceCache.find(cacheKey);
|
||||
if (it != m_ResourceCache.end()) {
|
||||
if (it->second != nullptr) {
|
||||
return static_cast<T*>(it->second);
|
||||
} else {
|
||||
//Don't return null on failure, exception instead.
|
||||
throw Resource::FailedLoadingException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,14 +11,14 @@ class System
|
||||
friend class SystemPipeline;
|
||||
|
||||
protected:
|
||||
System()
|
||||
: m_EventBroker(nullptr)
|
||||
{ }
|
||||
System(EventBroker* eventBroker)
|
||||
: m_EventBroker(eventBroker)
|
||||
System(World* world, EventBroker) { }
|
||||
System(World* world, EventBroker* eventBroker)
|
||||
: m_World(world)
|
||||
, m_EventBroker(eventBroker)
|
||||
{ }
|
||||
virtual ~System() = default;
|
||||
|
||||
World* m_World;
|
||||
EventBroker* m_EventBroker;
|
||||
};
|
||||
|
||||
@@ -34,7 +34,7 @@ protected:
|
||||
|
||||
const std::string m_ComponentType;
|
||||
|
||||
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt) = 0;
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cComponent, double dt) = 0;
|
||||
};
|
||||
|
||||
class ImpureSystem : public virtual System
|
||||
@@ -45,7 +45,7 @@ protected:
|
||||
ImpureSystem() = default;
|
||||
virtual ~ImpureSystem() = default;
|
||||
|
||||
virtual void Update(World* world, double dt) = 0;
|
||||
virtual void Update(double dt) = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -5,13 +5,19 @@
|
||||
#include "EventBroker.h"
|
||||
#include "System.h"
|
||||
#include "World.h"
|
||||
#include "EPause.h"
|
||||
|
||||
class SystemPipeline
|
||||
{
|
||||
public:
|
||||
SystemPipeline(EventBroker* eventBroker)
|
||||
: m_EventBroker(eventBroker)
|
||||
{ }
|
||||
SystemPipeline(World* world, EventBroker* eventBroker)
|
||||
: m_World(world)
|
||||
, m_EventBroker(eventBroker)
|
||||
{
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EPause, &SystemPipeline::OnPause);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EResume, &SystemPipeline::OnResume);
|
||||
}
|
||||
|
||||
~SystemPipeline()
|
||||
{
|
||||
for (UnorderedSystems& group : m_OrderedSystemGroups) {
|
||||
@@ -29,7 +35,7 @@ public:
|
||||
m_OrderedSystemGroups.resize(updateOrderLevel + 1);
|
||||
}
|
||||
UnorderedSystems& group = m_OrderedSystemGroups[updateOrderLevel];
|
||||
System* system = new T(m_EventBroker, args...);
|
||||
System* system = new T(m_World, m_EventBroker, args...);
|
||||
group.Systems[typeid(T).name()] = system;
|
||||
|
||||
PureSystem* pureSystem = dynamic_cast<PureSystem*>(system);
|
||||
@@ -47,8 +53,12 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void Update(World* world, double dt)
|
||||
void Update(double dt)
|
||||
{
|
||||
if (m_Paused) {
|
||||
dt = 0.0;
|
||||
}
|
||||
|
||||
for (UnorderedSystems& group : m_OrderedSystemGroups) {
|
||||
// Process events
|
||||
for (auto& pair : group.Systems) {
|
||||
@@ -57,18 +67,18 @@ public:
|
||||
|
||||
// Update
|
||||
for (auto& system : group.ImpureSystems) {
|
||||
system->Update(world, dt);
|
||||
system->Update(dt);
|
||||
}
|
||||
for (auto& pair : group.PureSystems) {
|
||||
const std::string& componentName = pair.first;
|
||||
auto& systems = pair.second;
|
||||
const ComponentPool* pool = world->GetComponents(componentName);
|
||||
const ComponentPool* pool = m_World->GetComponents(componentName);
|
||||
if (pool == nullptr) {
|
||||
continue;
|
||||
}
|
||||
for (auto& component : *pool) {
|
||||
for (auto& system : systems) {
|
||||
system->UpdateComponent(world, EntityWrapper(world, component.EntityID), component, dt);
|
||||
system->UpdateComponent(EntityWrapper(m_World, component.EntityID), component, dt);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -76,7 +86,10 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
World* m_World;
|
||||
EventBroker* m_EventBroker;
|
||||
bool m_Paused = false;
|
||||
|
||||
struct UnorderedSystems
|
||||
{
|
||||
std::map<std::string, System*> Systems;
|
||||
@@ -84,6 +97,21 @@ private:
|
||||
std::vector<ImpureSystem*> ImpureSystems;
|
||||
};
|
||||
std::vector<UnorderedSystems> m_OrderedSystemGroups;
|
||||
|
||||
EventRelay<SystemPipeline, Events::Pause> m_EPause;
|
||||
bool OnPause(const Events::Pause& e) {
|
||||
if (e.World == m_World) {
|
||||
m_Paused = true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
EventRelay<SystemPipeline, Events::Resume> m_EResume;
|
||||
bool OnResume(const Events::Resume& e) {
|
||||
if (e.World == m_World) {
|
||||
m_Paused = false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -3,14 +3,22 @@
|
||||
|
||||
#include "../GLM.h"
|
||||
#include "World.h"
|
||||
#include "EntityWrapper.h"
|
||||
|
||||
namespace Transform
|
||||
{
|
||||
|
||||
glm::mat4 AbsoluteTransformation(EntityWrapper entity);
|
||||
glm::vec3 AbsolutePosition(EntityWrapper entity);
|
||||
glm::vec3 AbsolutePosition(World* world, EntityID entity);
|
||||
glm::vec3 AbsoluteOrientationEuler(EntityWrapper entity);
|
||||
glm::quat AbsoluteOrientation(EntityWrapper entity);
|
||||
glm::quat AbsoluteOrientation(World* world, EntityID entity);
|
||||
glm::vec3 AbsoluteScale(EntityWrapper entity);
|
||||
glm::vec3 AbsoluteScale(World* world, EntityID entity);
|
||||
glm::mat4 ModelMatrix(EntityWrapper entity);
|
||||
glm::mat4 ModelMatrix(EntityID entity, World* world);
|
||||
glm::vec3 TransformPoint(const glm::vec3& point, const glm::mat4& matrix);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
#ifndef UniformScaleSystem_h__
|
||||
#define UniformScaleSystem_h__
|
||||
|
||||
#include "../GLM.h"
|
||||
#include "System.h"
|
||||
#include "../Rendering/ESetCamera.h"
|
||||
|
||||
class UniformScaleSystem : public PureSystem
|
||||
{
|
||||
public:
|
||||
UniformScaleSystem(World* world, EventBroker* eventBroker);
|
||||
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cUniformScale, double dt) override;
|
||||
|
||||
private:
|
||||
EntityWrapper m_Camera = EntityWrapper::Invalid;
|
||||
|
||||
EventRelay<UniformScaleSystem, Events::SetCamera> m_ESetCamera;
|
||||
bool OnSetCamera(const Events::SetCamera& e);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -42,7 +42,7 @@ enum class FileWatcher::FileEventFlags
|
||||
};
|
||||
|
||||
inline FileWatcher::FileEventFlags operator|(FileWatcher::FileEventFlags a, FileWatcher::FileEventFlags b) { return static_cast<FileWatcher::FileEventFlags>(static_cast<int>(a) | static_cast<int>(b)); }
|
||||
inline bool operator&(FileWatcher::FileEventFlags a, FileWatcher::FileEventFlags b) { return static_cast<int>(a)& static_cast<int>(b); }
|
||||
inline bool operator&(FileWatcher::FileEventFlags a, FileWatcher::FileEventFlags b) { return (static_cast<int>(a) & static_cast<int>(b)) != 0; }
|
||||
|
||||
class FileWatcher::Worker
|
||||
{
|
||||
@@ -54,7 +54,7 @@ public:
|
||||
private:
|
||||
struct FileInfo
|
||||
{
|
||||
int Size;
|
||||
std::size_t Size;
|
||||
std::time_t Timestamp;
|
||||
};
|
||||
|
||||
|
||||
@@ -29,41 +29,9 @@ enum _LOG_LEVEL
|
||||
|
||||
extern _LOG_LEVEL LOG_LEVEL;
|
||||
|
||||
const static char* _LOG_LEVEL_PREFIX[] =
|
||||
{
|
||||
"EE: ",
|
||||
"",
|
||||
"WW: ",
|
||||
"DD: "
|
||||
};
|
||||
extern const char* _LOG_LEVEL_PREFIX[];
|
||||
|
||||
static void _LOG(_LOG_LEVEL logLevel, const char* file, const char* func, unsigned int line, const char* format, ...)
|
||||
{
|
||||
if (logLevel > LOG_LEVEL) {
|
||||
return;
|
||||
}
|
||||
|
||||
char* message = nullptr;
|
||||
va_list args;
|
||||
|
||||
va_start(args, format);
|
||||
size_t size = vsnprintf(message, 0, format, args) + 1;
|
||||
va_end(args);
|
||||
|
||||
va_start(args, format);
|
||||
message = new char[size];
|
||||
vsnprintf(message, size, format, args);
|
||||
va_end(args);
|
||||
|
||||
if (logLevel == LOG_LEVEL_ERROR) {
|
||||
std::cerr << file << ":" << line << " " << func << std::endl;
|
||||
std::cerr << _LOG_LEVEL_PREFIX[logLevel] << message << std::endl;
|
||||
} else {
|
||||
std::cout << _LOG_LEVEL_PREFIX[logLevel] << message << std::endl;
|
||||
}
|
||||
|
||||
delete[] message;
|
||||
}
|
||||
extern void _LOG(_LOG_LEVEL logLevel, const char* file, const char* func, unsigned int line, const char* format, ...);
|
||||
|
||||
#define LOG(logLevel, format, ...) \
|
||||
_LOG(logLevel, __BASE_FILE__, __func__, __LINE__, format, ##__VA_ARGS__)
|
||||
@@ -77,7 +45,11 @@ static void _LOG(_LOG_LEVEL logLevel, const char* file, const char* func, unsign
|
||||
#define LOG_INFO(format, ...) \
|
||||
LOG(LOG_LEVEL_INFO, format, ##__VA_ARGS__)
|
||||
|
||||
#ifdef DEBUG
|
||||
#define LOG_DEBUG(format, ...) \
|
||||
LOG(LOG_LEVEL_DEBUG, format, ##__VA_ARGS__)
|
||||
#else
|
||||
#define LOG_DEBUG(format, ...)
|
||||
#endif
|
||||
|
||||
#endif // Logging_h__
|
||||
@@ -5,11 +5,15 @@
|
||||
#include "Entity.h"
|
||||
#include "ObjectPool.h"
|
||||
#include "ComponentPool.h"
|
||||
#include "EventBroker.h"
|
||||
|
||||
class World
|
||||
{
|
||||
public:
|
||||
World() = default;
|
||||
World(EventBroker* eventBroker)
|
||||
: m_EventBroker(eventBroker)
|
||||
{ }
|
||||
~World();
|
||||
|
||||
// Create empty entity
|
||||
@@ -46,6 +50,7 @@ public:
|
||||
std::string GetName(EntityID entity) const;
|
||||
|
||||
private:
|
||||
EventBroker* m_EventBroker = nullptr;
|
||||
EntityID m_CurrentEntityID = 0;
|
||||
|
||||
std::unordered_map<EntityID, EntityID> m_EntityParents;
|
||||
@@ -55,6 +60,7 @@ private:
|
||||
std::unordered_map<EntityID, std::string> m_EntityNames;
|
||||
|
||||
EntityID generateEntityID();
|
||||
void deleteEntityRecursive(EntityID entity, bool cascaded = false);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,115 @@
|
||||
#ifndef EditorCameraInputController_h__
|
||||
#define EditorCameraInputController_h__
|
||||
|
||||
#include <imgui/imgui.h>
|
||||
#include "../Input/FirstPersonInputController.h"
|
||||
#include "../Core/EMousePress.h"
|
||||
#include "../Core/EMouseRelease.h"
|
||||
#include "../Core/EMouseScroll.h"
|
||||
#include "../Core/ConfigFile.h"
|
||||
|
||||
template <typename EventContext>
|
||||
class EditorCameraInputController : public FirstPersonInputController<EventContext>
|
||||
{
|
||||
public:
|
||||
EditorCameraInputController(EventBroker* eventBroker, unsigned int playerID)
|
||||
: FirstPersonInputController(eventBroker, playerID)
|
||||
{
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EMousePress, &EditorCameraInputController::OnMousePress);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EMouseRelease, &EditorCameraInputController::OnMouseRelease);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EMouseScroll, &EditorCameraInputController::OnMouseScroll);
|
||||
|
||||
m_Config = ResourceManager::Load<ConfigFile>("Config.ini");
|
||||
m_SpeedMultiplier = m_Config->Get<float>("Editor.CameraSpeed", 3.f);
|
||||
}
|
||||
|
||||
virtual const glm::vec3 Movement() const override { return m_Movement * static_cast<float>(m_SpeedMultiplier); }
|
||||
|
||||
void Enable() { m_Enabled = true; }
|
||||
void Disable() { m_Enabled = false; }
|
||||
|
||||
virtual bool OnCommand(const Events::InputCommand& e) override
|
||||
{
|
||||
if (glm::abs(e.Value) > 0 && !m_MouseLocked) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
if (glm::abs(e.Value) > 0 && (io.WantCaptureKeyboard || io.WantCaptureMouse)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (e.Command == "Jump") {
|
||||
if (e.Value > 0) {
|
||||
m_Movement.y = glm::max(e.Value, 1.f);
|
||||
} else {
|
||||
m_Movement.y = 0.f;
|
||||
}
|
||||
}
|
||||
|
||||
if (e.Command == "Crouch") {
|
||||
if (e.Value > 0) {
|
||||
m_Movement.y = glm::min(-e.Value, -1.f);
|
||||
} else {
|
||||
m_Movement.y = 0.f;
|
||||
}
|
||||
}
|
||||
|
||||
if (e.Command == "Sprint") {
|
||||
if (e.Value > 0) {
|
||||
m_SpeedMultiplier *= 2.f;
|
||||
} else {
|
||||
m_SpeedMultiplier /= 2.f;
|
||||
}
|
||||
}
|
||||
|
||||
return FirstPersonInputController::OnCommand(e);
|
||||
}
|
||||
|
||||
protected:
|
||||
ConfigFile* m_Config;
|
||||
bool m_Enabled = false;
|
||||
double m_SpeedMultiplier = 1.f;
|
||||
|
||||
EventRelay<EventContext, Events::MousePress> m_EMousePress;
|
||||
bool OnMousePress(const Events::MousePress& e)
|
||||
{
|
||||
if (!m_Enabled) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (e.Button == GLFW_MOUSE_BUTTON_2) {
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
if (!io.WantCaptureMouse) {
|
||||
LockMouse();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
EventRelay<EventContext, Events::MouseRelease> m_EMouseRelease;
|
||||
bool OnMouseRelease(const Events::MouseRelease& e)
|
||||
{
|
||||
if (!m_Enabled) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (e.Button == GLFW_MOUSE_BUTTON_2) {
|
||||
UnlockMouse();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
EventRelay<EventContext, Events::MouseScroll> m_EMouseScroll;
|
||||
bool OnMouseScroll(const Events::MouseScroll& e)
|
||||
{
|
||||
if (!m_Enabled) {
|
||||
return false;
|
||||
}
|
||||
|
||||
m_SpeedMultiplier += e.DeltaY * (0.1 * m_SpeedMultiplier);
|
||||
m_Config->Set("Editor.CameraSpeed", m_SpeedMultiplier);
|
||||
m_Config->SaveToDisk();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,183 @@
|
||||
#ifndef EditorGUI_h__
|
||||
#define EditorGUI_h__
|
||||
|
||||
#include <imgui/imgui.h>
|
||||
#define IMGUI_DEFINE_MATH_OPERATORS
|
||||
#include <imgui/imgui_internal.h>
|
||||
#include <nativefiledialog/nfd.h>
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/any.hpp>
|
||||
#include <boost/algorithm/string/replace.hpp>
|
||||
#include "../Common.h"
|
||||
#include "../GLM.h"
|
||||
#include <glm/gtx/common.hpp>
|
||||
|
||||
#include "EditorWidgetSystem.h"
|
||||
#include "../Core/EventBroker.h"
|
||||
#include "../Core/World.h"
|
||||
#include "../Core/EntityWrapper.h"
|
||||
#include "../Core/ResourceManager.h"
|
||||
#include "../Core/EPause.h"
|
||||
#include "../Core/EKeyDown.h"
|
||||
#include "../Core/ELockMouse.h"
|
||||
#include "../Core/EFileDropped.h"
|
||||
#include "../Rendering/Texture.h"
|
||||
|
||||
class EditorGUI
|
||||
{
|
||||
public:
|
||||
EditorGUI(World* world, EventBroker* eventBroker);
|
||||
|
||||
enum class WidgetMode
|
||||
{
|
||||
Translate,
|
||||
Rotate,
|
||||
Scale
|
||||
};
|
||||
|
||||
enum class WidgetSpace
|
||||
{
|
||||
Global,
|
||||
Local
|
||||
};
|
||||
|
||||
void Draw();
|
||||
|
||||
void SelectEntity(EntityWrapper entity);
|
||||
void SetDirty(EntityWrapper entity);
|
||||
|
||||
// Called when an entity is selected in the entity tree
|
||||
typedef std::function<void(EntityWrapper)> OnEntitySelectedCallback_t;
|
||||
void SetEntitySelectedCallback(OnEntitySelectedCallback_t f) { m_OnEntitySelected = f; }
|
||||
// Called when the user means to import an entity file.
|
||||
// @param EntityWrapper The entity to parent the imported entity to. The entity will be imported into the world of this entity.
|
||||
// @param boost::filesystem::path The path to the entity to import
|
||||
// @return EntityWrapper The newly created entity
|
||||
typedef std::function<EntityWrapper(EntityWrapper, boost::filesystem::path)> OnEntityImport_t;
|
||||
void SetEntityImportCallback(OnEntityImport_t f) { m_OnEntityImport = f; }
|
||||
// Called when the user means to save an entity to file.
|
||||
// Permitted to throw exceptions on save failure.
|
||||
typedef std::function<void(EntityWrapper, boost::filesystem::path)> OnEntitySave_t;
|
||||
void SetEntitySaveCallback(OnEntitySave_t f) { m_OnEntitySave = f; }
|
||||
// Called when the user means to create a new entity.
|
||||
// @param EntityWrapper The parent of the entity to be created
|
||||
// @return EntityWrapper The newly created entity
|
||||
typedef std::function<EntityWrapper(EntityWrapper)> OnEntityCreate_t;
|
||||
void SetEntityCreateCallback(OnEntityCreate_t f) { m_OnEntityCreate = f; }
|
||||
// Called when the user means to delete an entity.
|
||||
typedef std::function<void(EntityWrapper)> OnEntityDelete_t;
|
||||
void SetEntityDeleteCallback(OnEntityDelete_t f) { m_OnEntityDelete = f; }
|
||||
// Called when the user means to change the parent of an entity.
|
||||
typedef std::function<void(EntityWrapper, EntityWrapper)> OnEntityChangeParent_t;
|
||||
void SetEntityChangeParentCallback(OnEntityChangeParent_t f) { m_OnEntityChangeParent = f; }
|
||||
// Called when the user means to rename an entity.
|
||||
typedef std::function<void(EntityWrapper, const std::string&)> OnEntityChangeName_t;
|
||||
void SetEntityChangeNameCallback(OnEntityChangeName_t f) { m_OnEntityChangeName = f; }
|
||||
// Called when the user means to attach a new component to an entity.
|
||||
typedef std::function<void(EntityWrapper, const std::string&)> OnComponentAttach_t;
|
||||
void SetComponentAttachCallback(OnComponentAttach_t f) { m_OnComponentAttach = f; }
|
||||
// Called when the user means to delete a component off an entity.
|
||||
typedef std::function<void(EntityWrapper, const std::string&)> OnComponentDelete_t;
|
||||
void SetComponentDeleteCallback(OnComponentDelete_t f) { m_OnComponentDelete = f; }
|
||||
// Called when the user selects a widget mode.
|
||||
typedef std::function<void(WidgetMode)> OnWidgetMode_t;
|
||||
void SetWidgetModeCallback(OnWidgetMode_t f) { m_OnWidgetMode = f; }
|
||||
// Called when the user selects a widget space.
|
||||
typedef std::function<void(WidgetSpace)> OnWidgetSpace_t;
|
||||
void SetWidgetSpaceCallback(OnWidgetSpace_t f) { m_OnWidgetSpace = f; }
|
||||
|
||||
private:
|
||||
World* m_World;
|
||||
EventBroker* m_EventBroker;
|
||||
|
||||
struct EntityFileInfo
|
||||
{
|
||||
boost::filesystem::path Path;
|
||||
bool Dirty = false;
|
||||
};
|
||||
|
||||
// Config variables
|
||||
const boost::filesystem::path m_DefaultEntityPath = boost::filesystem::path("Schema") / boost::filesystem::path("Entities");
|
||||
|
||||
// State
|
||||
EntityWrapper m_CurrentSelection = EntityWrapper::Invalid;
|
||||
std::unordered_map<EntityWrapper, EntityFileInfo> m_EntityFiles;
|
||||
EntityWrapper m_CurrentlyDragging = EntityWrapper::Invalid;
|
||||
std::string m_LastErrorMessage;
|
||||
WidgetMode m_CurrentWidgetMode = WidgetMode::Translate;
|
||||
WidgetSpace m_CurrentWidgetSpace = WidgetSpace::Global;
|
||||
std::set<std::string> m_ModalsToOpen;
|
||||
std::map<std::string, boost::any> m_ModalData;
|
||||
std::string m_DroppedFile = "";
|
||||
bool m_Paused = false;
|
||||
bool m_MouseLocked = false;
|
||||
|
||||
// Callbacks
|
||||
OnEntitySelectedCallback_t m_OnEntitySelected = nullptr;
|
||||
OnEntityImport_t m_OnEntityImport = nullptr;
|
||||
OnEntitySave_t m_OnEntitySave = nullptr;
|
||||
OnEntityCreate_t m_OnEntityCreate = nullptr;
|
||||
OnEntityDelete_t m_OnEntityDelete = nullptr;
|
||||
OnEntityChangeParent_t m_OnEntityChangeParent = nullptr;
|
||||
OnEntityChangeName_t m_OnEntityChangeName = nullptr;
|
||||
OnComponentAttach_t m_OnComponentAttach = nullptr;
|
||||
OnComponentDelete_t m_OnComponentDelete = nullptr;
|
||||
OnWidgetMode_t m_OnWidgetMode = nullptr;
|
||||
OnWidgetSpace_t m_OnWidgetSpace = nullptr;
|
||||
|
||||
// Events
|
||||
EventRelay<EditorGUI, Events::KeyDown> m_EKeyDown;
|
||||
bool OnKeyDown(const Events::KeyDown& e);
|
||||
EventRelay<EditorGUI, Events::FileDropped> m_EFileDropped;
|
||||
bool OnFileDropped(const Events::FileDropped& e);
|
||||
EventRelay<EditorGUI, Events::Pause> m_EPause;
|
||||
bool OnPause(const Events::Pause& e);
|
||||
EventRelay<EditorGUI, Events::Resume> m_EResume;
|
||||
bool OnResume(const Events::Resume& e);
|
||||
EventRelay<EditorGUI, Events::LockMouse> m_ELockMouse;
|
||||
bool OnLockMouse(const Events::LockMouse& e);
|
||||
EventRelay<EditorGUI, Events::UnlockMouse> m_EUnlockMouse;
|
||||
bool OnUnlockMouse(const Events::UnlockMouse& e);
|
||||
|
||||
// Utility functions
|
||||
boost::filesystem::path fileOpenDialog();
|
||||
boost::filesystem::path fileSaveDialog();
|
||||
const std::string formatEntityName(EntityWrapper entity);
|
||||
GLuint tryLoadTexture(std::string filePath);
|
||||
void openModal(const std::string& modal);
|
||||
void setWidgetMode(WidgetMode mode);
|
||||
void toggleWidgetSpace();
|
||||
static bool compareCharArray(const char* c1, const char* c2);
|
||||
|
||||
// Entity file handling methods
|
||||
void entityImport(World* world);
|
||||
void entitySave(EntityWrapper entity, bool saveAs = false);
|
||||
void entityCreate(World* world, EntityWrapper parent);
|
||||
void entityDelete(EntityWrapper entity);
|
||||
void entityChangeParent(EntityWrapper entity, EntityWrapper parent);
|
||||
|
||||
// UI drawing methods
|
||||
void drawMenu();
|
||||
void drawTools();
|
||||
void drawEntities(World* world);
|
||||
void drawEntitiesRecursive(World* world, EntityID parent);
|
||||
bool drawEntityNode(EntityWrapper entity);
|
||||
void drawComponents(EntityWrapper entity);
|
||||
bool drawComponentNode(EntityWrapper entity, const ComponentInfo& componentType);
|
||||
bool drawComponentField(ComponentWrapper& c, const ComponentInfo::Field_t& field);
|
||||
bool drawComponentField_Vector(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||
bool drawComponentField_Color(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||
bool drawComponentField_int(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||
bool drawComponentField_enum(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||
bool drawComponentField_float(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||
bool drawComponentField_double(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||
bool drawComponentField_bool(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||
bool drawComponentField_string(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||
void drawModals();
|
||||
|
||||
// Custom UI elements
|
||||
bool createDeleteButton(const std::string& componentType);
|
||||
void createWidgetToolButton(WidgetMode mode);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,27 @@
|
||||
#ifndef EditorRenderSystem_h__
|
||||
#define EditorRenderSystem_h__
|
||||
|
||||
#include "../Core/System.h"
|
||||
#include "../Rendering/IRenderer.h"
|
||||
#include "../Rendering/ModelJob.h"
|
||||
#include "../Rendering/Camera.h"
|
||||
#include "../Rendering/ESetCamera.h"
|
||||
|
||||
class EditorRenderSystem : public ImpureSystem
|
||||
{
|
||||
public:
|
||||
EditorRenderSystem(World* world, EventBroker* eventBroker, IRenderer* renderer, RenderFrame* renderFrame);
|
||||
|
||||
virtual void Update(double dt) override;
|
||||
|
||||
private:
|
||||
IRenderer* m_Renderer;
|
||||
RenderFrame* m_RenderFrame;
|
||||
Camera* m_EditorCamera;
|
||||
EntityWrapper m_CurrentCamera = EntityWrapper::Invalid;
|
||||
|
||||
EventRelay<EditorRenderSystem, Events::SetCamera> m_ESetCamera;
|
||||
bool OnSetCamera(Events::SetCamera& e);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,29 @@
|
||||
#include <numeric>
|
||||
#include <iomanip>
|
||||
#include <imgui/imgui.h>
|
||||
#include "../Common.h"
|
||||
#include "../GLM.h"
|
||||
#include "../OpenGL.h"
|
||||
|
||||
class EditorStats
|
||||
{
|
||||
public:
|
||||
EditorStats();
|
||||
void Draw(double dt);
|
||||
|
||||
private:
|
||||
// FPS graph
|
||||
const unsigned int m_SampleSize = 100;
|
||||
unsigned int m_FrameCount = 0;
|
||||
std::vector<double> m_FrameTimes;
|
||||
double m_TimeAccumulator = 0.0;
|
||||
double m_AveragedSamplesPerSecond = 10.0;
|
||||
const unsigned int m_AveragedSampleSize = 100;
|
||||
unsigned int m_CurrentAveragedSampleIndex = 0;
|
||||
std::vector<double> m_AveragedSamples;
|
||||
void drawFPSGraph(double dt);
|
||||
|
||||
void drawRAMUsage(double dt);
|
||||
|
||||
void drawVRAMStats(double dt);
|
||||
};
|
||||
@@ -1,94 +1,72 @@
|
||||
#include <imgui/imgui.h>
|
||||
#include <glm/gtx/common.hpp>
|
||||
#include <boost/filesystem/path.hpp>
|
||||
#include <nativefiledialog/nfd.h>
|
||||
#include "../Core/System.h"
|
||||
#include "../Core/EMousePress.h"
|
||||
#include "../Core/EMouseRelease.h"
|
||||
#include "../Core/EMouseMove.h"
|
||||
#include "../Core/ConfigFile.h"
|
||||
#include "../Input/EInputCommand.h"
|
||||
#include "../Rendering/IRenderer.h"
|
||||
#include "../Core/Transform.h"
|
||||
#include "../Core/EFileDropped.h"
|
||||
#include "../Rendering/Camera.h"
|
||||
#include "../Rendering/ESetCamera.h"
|
||||
#include "../Core/World.h"
|
||||
#include "../Core/SystemPipeline.h"
|
||||
#include "../Core/ResourceManager.h"
|
||||
#include "../Core/EntityFilePreprocessor.h"
|
||||
#include "../Core/EntityFileParser.h"
|
||||
#include "../Core/EntityFileWriter.h"
|
||||
#include "../Core/EMousePress.h"
|
||||
#include "../Input/EInputCommand.h"
|
||||
#include "EditorGUI.h"
|
||||
#include "EditorStats.h"
|
||||
#include "EditorCameraInputController.h"
|
||||
|
||||
class EditorSystem : public ImpureSystem
|
||||
{
|
||||
public:
|
||||
EditorSystem(EventBroker* eventBroker, IRenderer* renderer);
|
||||
EditorSystem(World* world, EventBroker* eventBroker, IRenderer* renderer, RenderFrame* renderFrame);
|
||||
~EditorSystem();
|
||||
|
||||
virtual void Update(World* world, double dt) override;
|
||||
void Update(double dt);
|
||||
|
||||
void Enable();
|
||||
void Disable();
|
||||
|
||||
private:
|
||||
IRenderer* m_Renderer;
|
||||
World* m_World = nullptr;
|
||||
Camera* m_Camera = nullptr;
|
||||
RenderFrame* m_RenderFrame;
|
||||
World* m_EditorWorld;
|
||||
SystemPipeline* m_EditorWorldSystemPipeline;
|
||||
//Camera* m_EditorCamera;
|
||||
EntityWrapper m_EditorCamera = EntityWrapper::Invalid;
|
||||
EntityWrapper m_ActualCamera = EntityWrapper::Invalid;
|
||||
EditorCameraInputController<EditorSystem>* m_EditorCameraInputController;
|
||||
EditorGUI* m_EditorGUI;
|
||||
EditorStats* m_EditorStats;
|
||||
|
||||
bool m_Enabled;
|
||||
bool m_Visible;
|
||||
boost::filesystem::path m_DefaultEntityDir;
|
||||
boost::filesystem::path m_CurrentFile;
|
||||
std::vector<glm::vec2> m_PickingQueue;
|
||||
// State
|
||||
double m_LastTime = 0.f;
|
||||
bool m_Enabled = true;
|
||||
EditorGUI::WidgetMode m_WidgetMode = EditorGUI::WidgetMode::Translate;
|
||||
EditorGUI::WidgetSpace m_WidgetSpace = EditorGUI::WidgetSpace::Global;
|
||||
EntityWrapper m_Widget = EntityWrapper::Invalid;
|
||||
EntityWrapper m_CurrentSelection = EntityWrapper::Invalid;
|
||||
|
||||
enum class WidgetMode
|
||||
{
|
||||
None,
|
||||
Translate,
|
||||
Rotate,
|
||||
Scale
|
||||
} m_WidgetMode = WidgetMode::None;
|
||||
// Utility functions
|
||||
EntityWrapper importEntity(EntityWrapper parent, boost::filesystem::path filePath);
|
||||
void setWidgetMode(EditorGUI::WidgetMode mode);
|
||||
|
||||
enum class WidgetSpace
|
||||
{
|
||||
Local,
|
||||
Global
|
||||
} m_WidgetSpace = WidgetSpace::Global;
|
||||
// GUI callbacks
|
||||
void OnEntitySelected(EntityWrapper entity);
|
||||
void OnEntitySave(EntityWrapper entity, boost::filesystem::path filePath);
|
||||
EntityWrapper OnEntityCreate(EntityWrapper parent);
|
||||
void OnEntityDelete(EntityWrapper entity);
|
||||
void OnEntityChangeParent(EntityWrapper entity, EntityWrapper parent);
|
||||
void OnEntityChangeName(EntityWrapper entity, const std::string& name);
|
||||
void OnComponentAttach(EntityWrapper entity, const std::string& componentType);
|
||||
void OnComponentDelete(EntityWrapper entity, const std::string& componentType);
|
||||
void OnWidgetSpace(EditorGUI::WidgetSpace widgetSpace);
|
||||
|
||||
EntityID m_Widget = EntityID_Invalid;
|
||||
EntityID m_WidgetX = EntityID_Invalid;
|
||||
EntityID m_WidgetPlaneX = EntityID_Invalid;
|
||||
EntityID m_WidgetY = EntityID_Invalid;
|
||||
EntityID m_WidgetPlaneY = EntityID_Invalid;
|
||||
EntityID m_WidgetZ = EntityID_Invalid;
|
||||
EntityID m_WidgetPlaneZ = EntityID_Invalid;
|
||||
EntityID m_WidgetOrigin = EntityID_Invalid;
|
||||
glm::vec3 m_WidgetCurrentAxis;
|
||||
float m_WidgetPickingDepth = 0.f;
|
||||
glm::vec3 m_WidgetPickingPosition = glm::vec3(0);
|
||||
|
||||
EntityID m_Selection = EntityID_Invalid;
|
||||
EntityID m_LastSelection = EntityID_Invalid;
|
||||
EntityID m_UIDraggingEntity = EntityID_Invalid;
|
||||
glm::vec3 m_Position;
|
||||
std::string m_LastDroppedFile;
|
||||
|
||||
static boost::filesystem::path openDialog(boost::filesystem::path defaultPath);
|
||||
static boost::filesystem::path saveDialog(boost::filesystem::path defaultPath);
|
||||
|
||||
EventRelay<EditorSystem, Events::InputCommand> m_EInputCommand;
|
||||
bool OnInputCommand(const Events::InputCommand& e);
|
||||
EventRelay<EditorSystem, Events::MouseRelease> m_EMouseRelease;
|
||||
bool OnMouseRelease(const Events::MouseRelease& e);
|
||||
// Events
|
||||
EventRelay<EditorSystem, Events::MousePress> m_EMousePress;
|
||||
bool OnMousePress(const Events::MousePress& e);
|
||||
EventRelay<EditorSystem, Events::MouseMove> m_EMouseMove;
|
||||
bool OnMouseMove(const Events::MouseMove& e);
|
||||
EventRelay<EditorSystem, Events::FileDropped> m_EFileDropped;
|
||||
bool OnFileDropped(const Events::FileDropped& e);
|
||||
|
||||
void Picking();
|
||||
void createWidget();
|
||||
void updateWidget();
|
||||
void setWidgetMode(WidgetMode newMode);
|
||||
void setWidgetSpace(WidgetSpace space);
|
||||
void drawUI(World* world, double dt);
|
||||
bool createDeleteButton(std::string componentType);
|
||||
bool createEntityNode(World* world, EntityID entity);
|
||||
void changeParent(EntityID entity, EntityID newParent);
|
||||
void fileImport(World* world);
|
||||
void fileSave(World* world);
|
||||
void fileSaveAs(World* world);
|
||||
EventRelay<EditorSystem, Events::WidgetDelta> m_EWidgetDelta;
|
||||
bool OnWidgetDelta(const Events::WidgetDelta& e);
|
||||
EventRelay<EditorSystem, Events::InputCommand> m_EInputCommand;
|
||||
bool OnInputCommand(const Events::InputCommand& e);
|
||||
EventRelay<EditorSystem, Events::SetCamera> m_ESetCamera;
|
||||
bool OnSetCamera(const Events::SetCamera& e);
|
||||
};
|
||||
@@ -0,0 +1,49 @@
|
||||
#ifndef EditorWidgetSystem_h__
|
||||
#define EditorWidgetSystem_h__
|
||||
|
||||
#include <imgui/imgui.h>
|
||||
#include "../GLM.h"
|
||||
#include "../Core/System.h"
|
||||
#include "../Rendering/IRenderer.h"
|
||||
#include "../Rendering/Util/ScreenCoords.h"
|
||||
#include "../Core/EMouseMove.h"
|
||||
#include "../Core/EMousePress.h"
|
||||
#include "../Core/EMouseRelease.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct WidgetDelta : Event
|
||||
{
|
||||
glm::vec3 Translation;
|
||||
glm::vec3 Rotation;
|
||||
glm::vec3 Scale;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
class EditorWidgetSystem : public ImpureSystem, PureSystem
|
||||
{
|
||||
public:
|
||||
EditorWidgetSystem(World* world, EventBroker* eventBroker, IRenderer* renderer);
|
||||
|
||||
virtual void Update(double dt) override;
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cEditorWidget, double dt) override;
|
||||
|
||||
private:
|
||||
IRenderer* m_Renderer;
|
||||
|
||||
// State
|
||||
EntityWrapper m_PickEntity = EntityWrapper::Invalid;
|
||||
PickData m_PickData;
|
||||
glm::vec2 m_MouseDelta;
|
||||
|
||||
EventRelay<EditorWidgetSystem, Events::MouseMove> m_EMouseMove;
|
||||
bool OnMouseMove(const Events::MouseMove& e);
|
||||
EventRelay<EditorWidgetSystem, Events::MousePress> m_EMousePress;
|
||||
bool OnMousePress(const Events::MousePress& e);
|
||||
EventRelay<EditorWidgetSystem, Events::MouseRelease> m_EMouseRelease;
|
||||
bool OnMouseRelease(const Events::MouseRelease& e);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -7,4 +7,5 @@
|
||||
#include <glm/gtx/rotate_vector.hpp>
|
||||
#include <glm/gtc/quaternion.hpp>
|
||||
#include <glm/gtx/quaternion.hpp>
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
#include <glm/gtx/projection.hpp>
|
||||
@@ -2,6 +2,7 @@
|
||||
#define Events_InputCommand_h__
|
||||
|
||||
#include "Core/EventBroker.h"
|
||||
#include "Core/EntityWrapper.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
@@ -9,7 +10,8 @@ namespace Events
|
||||
struct InputCommand : Event
|
||||
{
|
||||
/** Numerical ID of the player. */
|
||||
unsigned int PlayerID;
|
||||
int PlayerID;
|
||||
EntityWrapper Player;
|
||||
/** The command that was sent. */
|
||||
std::string Command;
|
||||
/** The value of the command. */
|
||||
|
||||
@@ -4,67 +4,232 @@
|
||||
#include "../GLM.h"
|
||||
#include "../Core/InputController.h"
|
||||
#include "../Core/ELockMouse.h"
|
||||
#include "InputHandler.h"
|
||||
|
||||
template <typename EventContext>
|
||||
class FirstPersonInputController : public InputController<EventContext>
|
||||
{
|
||||
public:
|
||||
FirstPersonInputController(EventBroker* eventBroker, unsigned int playerID)
|
||||
: InputController(eventBroker)
|
||||
, m_PlayerID(playerID)
|
||||
{
|
||||
EVENT_SUBSCRIBE_MEMBER(m_ELockMouse, &FirstPersonInputController::OnLockMouse);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EUnlockMouse, &FirstPersonInputController::OnUnlockMouse);
|
||||
FirstPersonInputController(EventBroker* eventBroker, int playerID);
|
||||
|
||||
virtual const glm::vec3 Movement() const { return m_Movement; }
|
||||
virtual const glm::vec3 Rotation() const { return m_Rotation; }
|
||||
virtual bool Jumping() const { return m_Jumping; }
|
||||
virtual bool Crouching() const { return m_Crouching; }
|
||||
virtual bool DoubleJumping() const { return m_DoubleJumping; }
|
||||
virtual void SetDoubleJumping(bool isDoubleJumping) {
|
||||
m_DoubleJumping = isDoubleJumping;
|
||||
}
|
||||
|
||||
const glm::quat Orientation() const { return m_Orientation; }
|
||||
|
||||
void LockMouse()
|
||||
{
|
||||
Events::LockMouse e;
|
||||
m_EventBroker->Publish(e);
|
||||
m_MouseLocked = true;
|
||||
}
|
||||
void LockMouse();
|
||||
void UnlockMouse();
|
||||
virtual bool OnCommand(const Events::InputCommand& e) override;
|
||||
virtual void Reset();
|
||||
|
||||
void UnlockMouse()
|
||||
{
|
||||
Events::UnlockMouse e;
|
||||
m_EventBroker->Publish(e);
|
||||
m_MouseLocked = false;
|
||||
}
|
||||
void AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer);
|
||||
virtual bool AssaultDashDoubleTapped() const { return m_AssaultDashDoubleTapped; }
|
||||
virtual bool PlayerIsDashing() const { return m_PlayerIsDashing; }
|
||||
|
||||
virtual bool OnCommand(const Events::InputCommand& e) override
|
||||
{
|
||||
if (m_PlayerID != e.PlayerID) {
|
||||
return false;
|
||||
}
|
||||
protected:
|
||||
const int m_PlayerID;
|
||||
bool m_MouseLocked = false;
|
||||
glm::vec3 m_Rotation;
|
||||
glm::vec3 m_Movement;
|
||||
bool m_Jumping = false;
|
||||
bool m_DoubleJumping = false;
|
||||
bool m_Crouching = false;
|
||||
//assault dash membervariables - needed to calculate the doubletap- and dashlogic
|
||||
double m_AssaultDashDoubleTapDeltaTime = 0.0;
|
||||
double m_AssaultDashCoolDownTimer = 0.0;
|
||||
//i will let m_AssaultDashDoubleTapSensitivityTimer stay hardcoded, its not really a gamevariable (more an inputvariable),
|
||||
//and its very unlikely that someone wants to change that value
|
||||
const float m_AssaultDashDoubleTapSensitivityTimer = 0.25f;
|
||||
std::string m_AssaultDashTapDirection = "";
|
||||
std::string m_CurrentDirectionVector = "";
|
||||
bool m_AssaultDashDoubleTapped = false;
|
||||
bool m_PlayerIsDashing = false;
|
||||
bool m_ShiftDashing = false;
|
||||
bool m_ValidDoubleTap = false;
|
||||
|
||||
if (m_MouseLocked) {
|
||||
if (e.Command == "Pitch") {
|
||||
float val = glm::radians(e.Value);
|
||||
m_Orientation = m_Orientation * glm::angleAxis<float>(-val, glm::vec3(1, 0, 0));
|
||||
return true;
|
||||
}
|
||||
//specialabilitys
|
||||
bool m_MovementKeyDown = false;
|
||||
bool m_SpecialAbilityKeyDown = false;
|
||||
|
||||
if (e.Command == "Yaw") {
|
||||
float val = glm::radians(e.Value);
|
||||
m_Orientation = glm::angleAxis<float>(-val, glm::vec3(0, 1, 0)) * m_Orientation;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
EventRelay<EventContext, Events::LockMouse> m_ELockMouse;
|
||||
bool OnLockMouse(const Events::LockMouse& e);
|
||||
EventRelay<EventContext, Events::UnlockMouse> m_EUnlockMouse;
|
||||
bool OnUnlockMouse(const Events::UnlockMouse& e);
|
||||
};
|
||||
|
||||
template <typename EventContext>
|
||||
FirstPersonInputController<EventContext>::FirstPersonInputController(EventBroker* eventBroker, int playerID)
|
||||
: InputController(eventBroker)
|
||||
, m_PlayerID(playerID)
|
||||
{
|
||||
EVENT_SUBSCRIBE_MEMBER(m_ELockMouse, &FirstPersonInputController::OnLockMouse);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EUnlockMouse, &FirstPersonInputController::OnUnlockMouse);
|
||||
}
|
||||
|
||||
template <typename EventContext>
|
||||
void FirstPersonInputController<EventContext>::Reset()
|
||||
{
|
||||
m_Rotation = glm::vec3(0.f, 0.f, 0.f);
|
||||
m_Jumping = false;
|
||||
}
|
||||
|
||||
template <typename EventContext>
|
||||
void FirstPersonInputController<EventContext>::LockMouse()
|
||||
{
|
||||
Events::LockMouse e;
|
||||
m_EventBroker->Publish(e);
|
||||
m_MouseLocked = true;
|
||||
}
|
||||
|
||||
template <typename EventContext>
|
||||
void FirstPersonInputController<EventContext>::UnlockMouse()
|
||||
{
|
||||
Events::UnlockMouse e;
|
||||
m_EventBroker->Publish(e);
|
||||
m_MouseLocked = false;
|
||||
}
|
||||
|
||||
template <typename EventContext>
|
||||
bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputCommand& e)
|
||||
{
|
||||
if (m_PlayerID != e.PlayerID) {
|
||||
return false;
|
||||
}
|
||||
|
||||
protected:
|
||||
const unsigned int m_PlayerID;
|
||||
glm::quat m_Orientation;
|
||||
bool m_MouseLocked = false;
|
||||
|
||||
EventRelay<EventContext, Events::LockMouse> m_ELockMouse;
|
||||
bool OnLockMouse(const Events::LockMouse& e) { m_MouseLocked = true; return true; }
|
||||
EventRelay<EventContext, Events::UnlockMouse> m_EUnlockMouse;
|
||||
bool OnUnlockMouse(const Events::UnlockMouse& e) { m_MouseLocked = false; return true; }
|
||||
};
|
||||
if (e.Command == "Pitch") {
|
||||
float val = glm::radians(e.Value);
|
||||
m_Rotation.x += -val;
|
||||
//m_Rotation.x = glm::clamp(m_Rotation.x, -glm::half_pi<float>(), glm::half_pi<float>());
|
||||
}
|
||||
|
||||
if (e.Command == "Yaw") {
|
||||
float val = glm::radians(e.Value);
|
||||
m_Rotation.y += -val;
|
||||
}
|
||||
|
||||
if (e.Command == "Forward" || e.Command == "Right") {
|
||||
if (e.Command == "Forward") {
|
||||
float val = glm::clamp(e.Value, -1.f, 1.f);
|
||||
m_Movement.z = -val;
|
||||
}
|
||||
if (e.Command == "Right") {
|
||||
float val = glm::clamp(e.Value, -1.f, 1.f);
|
||||
m_Movement.x = val;
|
||||
}
|
||||
if (glm::length2(m_Movement) > 0) {
|
||||
m_Movement = glm::normalize(m_Movement);
|
||||
}
|
||||
}
|
||||
|
||||
if (e.Command == "Forward" || e.Command == "Right") {
|
||||
if (e.Value != 0) {
|
||||
m_CurrentDirectionVector = e.Command == "Right" ? (e.Value > 0 ? "Right" : "Left") : (e.Value > 0 ? "Forward" : "Backward");
|
||||
}
|
||||
//if value = 0 then you have just released this key
|
||||
if (e.Value != 0) {
|
||||
m_MovementKeyDown = true;
|
||||
//if you pressed the same key within m_AssaultDashDoubleTapSensitivityTimer then you have doubletapped it
|
||||
if (m_AssaultDashDoubleTapDeltaTime < m_AssaultDashDoubleTapSensitivityTimer && m_AssaultDashTapDirection == m_CurrentDirectionVector) {
|
||||
m_ValidDoubleTap = true;
|
||||
}
|
||||
} else {
|
||||
//== 0
|
||||
m_MovementKeyDown = false;
|
||||
//you have just released the key, store what key it was and reset the doubletap-sensitivity-timer
|
||||
m_AssaultDashTapDirection = m_CurrentDirectionVector;
|
||||
m_AssaultDashDoubleTapDeltaTime = 0.f;
|
||||
}
|
||||
}
|
||||
|
||||
if (e.Command == "Jump") {
|
||||
m_Jumping = e.Value > 0;
|
||||
}
|
||||
|
||||
if (e.Command == "Crouch") {
|
||||
m_Crouching = e.Value > 0;
|
||||
}
|
||||
|
||||
if (e.Command == "SpecialAbility") {
|
||||
if (e.Value > 0) {
|
||||
m_SpecialAbilityKeyDown = true;
|
||||
} else {
|
||||
m_SpecialAbilityKeyDown = false;
|
||||
}
|
||||
}
|
||||
if (m_SpecialAbilityKeyDown && m_MovementKeyDown) {
|
||||
m_ShiftDashing = true;
|
||||
} else {
|
||||
m_ShiftDashing = false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename EventContext>
|
||||
bool FirstPersonInputController<EventContext>::OnUnlockMouse(const Events::UnlockMouse& e)
|
||||
{
|
||||
m_MouseLocked = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename EventContext>
|
||||
bool FirstPersonInputController<EventContext>::OnLockMouse(const Events::LockMouse& e)
|
||||
{
|
||||
m_MouseLocked = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename EventContext>
|
||||
void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer) {
|
||||
m_AssaultDashDoubleTapDeltaTime += dt;
|
||||
m_AssaultDashCoolDownTimer -= dt;
|
||||
//cooldown = assaultDashCoolDownMaxTimer sec, pretend the dash lasts 0.25 sec (for friction to do its work)
|
||||
if (m_AssaultDashCoolDownTimer > (assaultDashCoolDownMaxTimer - 0.25f)) {
|
||||
m_PlayerIsDashing = true;
|
||||
} else {
|
||||
m_PlayerIsDashing = false;
|
||||
}
|
||||
|
||||
//dashing with shift
|
||||
if (m_ShiftDashing && m_AssaultDashCoolDownTimer <= 0.0f && !isJumping) {
|
||||
//player is dashing with shift
|
||||
//the wanted-direction is set in playermovement already so we dont need to check what direction we want to dash in!
|
||||
m_AssaultDashCoolDownTimer = assaultDashCoolDownMaxTimer;
|
||||
m_AssaultDashDoubleTapped = true;
|
||||
m_AssaultDashDoubleTapDeltaTime = 0.f;
|
||||
//moving to the side has priority
|
||||
return;
|
||||
}
|
||||
|
||||
//dashing with doubletap - check if doubletap to dash enabled
|
||||
if (ResourceManager::Load<ConfigFile>("Input.ini")->Get<bool>("Keyboard.DoubleTapToDash", false)) {
|
||||
return;
|
||||
}
|
||||
|
||||
//reset the DoubleTapped state in case we recently doubleTapped (doubletap will only happen during 1 frame)
|
||||
if (m_AssaultDashDoubleTapped) {
|
||||
m_AssaultDashDoubleTapped = false;
|
||||
}
|
||||
|
||||
//check if we have received a valid doubletap
|
||||
if (!m_ValidDoubleTap) {
|
||||
return;
|
||||
}
|
||||
m_ValidDoubleTap = false;
|
||||
|
||||
if (!(m_AssaultDashCoolDownTimer <= 0.0f && !isJumping)) {
|
||||
//if we cant dash at the moment, then just reset the tap-sensitivity-timer
|
||||
m_AssaultDashDoubleTapDeltaTime = 0.f;
|
||||
return;
|
||||
}
|
||||
//ok, we have a valid tap, lets do it
|
||||
m_AssaultDashDoubleTapped = true;
|
||||
m_AssaultDashDoubleTapDeltaTime = 0.f;
|
||||
m_AssaultDashCoolDownTimer = assaultDashCoolDownMaxTimer;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -3,9 +3,12 @@
|
||||
|
||||
#include <string>
|
||||
#include <ctime>
|
||||
#include <limits>
|
||||
#include <queue>
|
||||
|
||||
#include <glm/common.hpp>
|
||||
#include <boost/asio.hpp>
|
||||
#include <boost/shared_array.hpp>
|
||||
|
||||
#include "Network/Network.h"
|
||||
#include "Network/MessageType.h"
|
||||
@@ -15,6 +18,9 @@
|
||||
#include "Core/EventBroker.h"
|
||||
#include "Core/ConfigFile.h"
|
||||
#include "Input/EInputCommand.h"
|
||||
#include "Core/EPlayerDamage.h"
|
||||
#include "Network/EInterpolate.h"
|
||||
#include "Core/EPlayerSpawned.h"
|
||||
|
||||
class Client : public Network
|
||||
{
|
||||
@@ -30,54 +36,76 @@ private:
|
||||
boost::asio::ip::udp::socket m_Socket;
|
||||
|
||||
// Sending message to server logic
|
||||
int bytesRead = -1;
|
||||
size_t bytesRead = 0;
|
||||
char readBuf[INPUTSIZE] = { 0 };
|
||||
int snapshotInterval = 33;
|
||||
std::clock_t previousSnapshotMessage = std::clock();
|
||||
|
||||
// Packet loss logic
|
||||
unsigned int m_PacketID = 0;
|
||||
unsigned int m_PreviousPacketID = 0;
|
||||
unsigned int m_SendPacketID = 0;
|
||||
PacketID m_PacketID = 0;
|
||||
PacketID m_PreviousPacketID = 0;
|
||||
PacketID m_SendPacketID = 0;
|
||||
|
||||
// Game logic
|
||||
World* m_World;
|
||||
std::string m_PlayerName;
|
||||
int m_PlayerID = -1;
|
||||
PlayerID m_PlayerID = -1;
|
||||
EntityID m_ServerEntityID = std::numeric_limits<EntityID>::max();
|
||||
bool m_IsConnected = false;
|
||||
EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
|
||||
// Server Client Lookup map
|
||||
// Assumes that root node for client and server is EntityID 0.
|
||||
|
||||
// Don't Add items to these two maps with insert, use insertIntoServerClientMaps(EntityID, EntityID)!!!!
|
||||
std::unordered_map<EntityID, EntityID> m_ServerIDToClientID;
|
||||
std::unordered_map<EntityID, EntityID> m_ClientIDToServerID;
|
||||
|
||||
// Network logic
|
||||
PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS];
|
||||
PlayerDefinition m_PlayerDefinitions[8];
|
||||
SnapshotDefinitions m_NextSnapshot;
|
||||
double m_DurationOfPingTime;
|
||||
std::clock_t m_StartPingTime;
|
||||
// Use to check if we should send disconnect message
|
||||
// if game is turned of by closing window.
|
||||
bool m_WasStarted = false;
|
||||
std::clock_t m_TimeSinceSentInputs;
|
||||
unsigned int m_SendInputIntervalMs;
|
||||
std::vector<Events::InputCommand> m_InputCommandBuffer;
|
||||
|
||||
// Private member functions
|
||||
void readFromServer();
|
||||
void sendSnapshotToServer();
|
||||
int receive(char* data, size_t length);
|
||||
size_t receive(char* data);
|
||||
void send(Packet& packet);
|
||||
void connect();
|
||||
void disconnect();
|
||||
void ping();
|
||||
void moveMessageHead(char*& data, size_t& length, size_t stepSize);
|
||||
void parseMessageType(Packet& packet);
|
||||
void parseEventMessage(Packet& packet);
|
||||
void updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID, const std::string& componentType);
|
||||
void parseConnect(Packet& packet);
|
||||
void parsePlayerConnected(Packet& packet);
|
||||
void parsePing();
|
||||
void parseServerPing();
|
||||
void parseKick();
|
||||
void parsePlayersSpawned(Packet& packet);
|
||||
void parseEntityDeletion(Packet& packet);
|
||||
void parseComponentDeletion(Packet& packet);
|
||||
void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType);
|
||||
void parseSnapshot(Packet& packet);
|
||||
void identifyPacketLoss();
|
||||
bool isConnected();
|
||||
bool hasServerTimedOut();
|
||||
EntityID createPlayer();
|
||||
void sendInputCommands();
|
||||
void sendLocalPlayerTransform();
|
||||
void becomePlayer();
|
||||
// Mapping Logic
|
||||
// Returns if local EntityID exist in map
|
||||
bool clientServerMapsHasEntity(EntityID clientEntityID);
|
||||
// Returns if server EntityID exist in map
|
||||
bool serverClientMapsHasEntity(EntityID serverEntityID);
|
||||
void insertIntoServerClientMaps(EntityID serverEntityID, EntityID clientEntityID);
|
||||
void deleteFromServerClientMaps(EntityID serverEntityID, EntityID clientEntityID);
|
||||
|
||||
// Events
|
||||
EventBroker* m_EventBroker;
|
||||
EventRelay<Client, Events::InputCommand> m_EInputCommand;
|
||||
bool OnInputCommand(const Events::InputCommand &e);
|
||||
bool OnInputCommand(const Events::InputCommand& e);
|
||||
EventRelay<Client, Events::PlayerDamage> m_EPlayerDamage;
|
||||
bool OnPlayerDamage(const Events::PlayerDamage& e);
|
||||
EventRelay<Client, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||
bool OnPlayerSpawned(const Events::PlayerSpawned& e);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
#ifndef Events_Interpolate_h__
|
||||
#define Events_Interpolate_h__
|
||||
|
||||
#include <boost/shared_array.hpp>
|
||||
|
||||
#include "Core/EventBroker.h"
|
||||
#include "Core/Entity.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct Interpolate : Event
|
||||
{
|
||||
EntityID Entity;
|
||||
boost::shared_array<char> DataArray;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,18 @@
|
||||
#ifndef Events_PlayerDisconnected
|
||||
#define Events_PlayerDisconnected
|
||||
|
||||
#include "Core/EventBroker.h"
|
||||
#include "Core/Entity.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct PlayerDisconnected : public Event
|
||||
{
|
||||
unsigned int PlayerID;
|
||||
EntityID Entity;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -5,13 +5,20 @@
|
||||
// Used to determine what type of message was sent.
|
||||
enum class MessageType
|
||||
{
|
||||
Connect,
|
||||
Disconnect,
|
||||
ClientPing,
|
||||
ServerPing,
|
||||
Message,
|
||||
Snapshot,
|
||||
Event,
|
||||
Connect,
|
||||
Disconnect,
|
||||
Ping,
|
||||
Message,
|
||||
Snapshot,
|
||||
OnInputCommand,
|
||||
OnPlayerDamage,
|
||||
PlayerConnected,
|
||||
BecomePlayer,
|
||||
Kick,
|
||||
OnPlayerSpawned,
|
||||
EntityDeleted,
|
||||
ComponentDeleted,
|
||||
PlayerTransform
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,12 +1,20 @@
|
||||
#ifndef Network_h__
|
||||
#define Network_h__
|
||||
|
||||
#include <ctime>
|
||||
|
||||
#include "Core/World.h"
|
||||
#include "Core/EventBroker.h"
|
||||
#include "Network/Packet.h"
|
||||
#include "Network/NetworkData.h"
|
||||
#include "Core/ResourceManager.h"
|
||||
#include "Core/ConfigFile.h"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
#define MAXCONNECTIONS 8
|
||||
#define INPUTSIZE 4097
|
||||
#define INPUTSIZE 32000
|
||||
typedef unsigned int PlayerID;
|
||||
typedef unsigned int PacketID;
|
||||
|
||||
class Network
|
||||
{
|
||||
@@ -14,6 +22,17 @@ public:
|
||||
virtual ~Network() { };
|
||||
virtual void Start(World* m_world, EventBroker *eventBroker) = 0;
|
||||
virtual void Update() = 0;
|
||||
protected:
|
||||
// For Debug
|
||||
bool isReadingData = false;
|
||||
NetworkData m_NetworkData;
|
||||
unsigned int m_SaveDataIntervalMs = 1000;
|
||||
std::clock_t m_SaveDataTimer;
|
||||
unsigned int m_MaxConnections;
|
||||
double m_TimeoutMs;
|
||||
void saveToFile();
|
||||
void updateNetworkData();
|
||||
void initialize();
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,18 @@
|
||||
#ifndef NetworkData_h__
|
||||
#define NetworkData_h__
|
||||
#include <vector>
|
||||
|
||||
struct NetworkData {
|
||||
double TotalTime = 0;
|
||||
size_t TotalDataReceived = 0;
|
||||
size_t TotalDataSent = 0;
|
||||
size_t AmountOfMessagesReceived = 0;
|
||||
unsigned int AmountOfMessagesSent = 0;
|
||||
// Interval based
|
||||
size_t DataReceivedThisInterval = 0;
|
||||
size_t DataSentThisInterval = 0;
|
||||
// pair: first=reveived, second=send
|
||||
std::vector<std::pair<size_t, size_t>> BandwidthBytes;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -13,7 +13,8 @@ public:
|
||||
// arg2: PacketID for identifying packet loss.
|
||||
Packet(MessageType type, unsigned int& packetID);
|
||||
// Used to create packet from already existing data buffer.
|
||||
Packet(char* data, const int sizeOfPacket);
|
||||
Packet(char* data, const size_t sizeOfPacket);
|
||||
Packet(MessageType type);
|
||||
~Packet();
|
||||
void Init(MessageType type, unsigned int& packetID);
|
||||
|
||||
@@ -49,17 +50,19 @@ public:
|
||||
// Pops the first element as if it was a string.
|
||||
std::string ReadString();
|
||||
char* ReadData(int SizeOfData);
|
||||
|
||||
int Size() { return m_Offset; };
|
||||
void ChangePacketID(unsigned int& packetID);
|
||||
size_t Size() { return m_Offset; };
|
||||
char* Data() { return m_Data; };
|
||||
unsigned int DataReadSize() { return m_ReturnDataOffset; }
|
||||
unsigned int MaxSize() { return m_MaxPacketSize; }
|
||||
size_t DataReadSize() { return m_ReturnDataOffset; }
|
||||
size_t MaxSize() { return m_MaxPacketSize; }
|
||||
size_t HeaderSize() { return m_HeaderSize; }
|
||||
|
||||
private:
|
||||
char* m_Data;
|
||||
unsigned int m_ReturnDataOffset = 0;
|
||||
int m_Offset = 0;
|
||||
unsigned int m_MaxPacketSize = 512;
|
||||
size_t m_ReturnDataOffset = 0;
|
||||
size_t m_Offset = 0;
|
||||
size_t m_MaxPacketSize = 512;
|
||||
size_t m_HeaderSize = 0;
|
||||
void resizeData();
|
||||
};
|
||||
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
#ifndef PlayerDefinition_h__
|
||||
#define PlayerDefinition_h__
|
||||
#include <string>
|
||||
#include "../Core/Entity.h"
|
||||
|
||||
struct PlayerDefinition {
|
||||
int EntityID = -1;
|
||||
::EntityID EntityID = EntityID_Invalid;
|
||||
std::string Name = "";
|
||||
boost::asio::ip::udp::endpoint Endpoint;
|
||||
unsigned int PacketID;
|
||||
std::clock_t StopTime;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -11,7 +11,13 @@
|
||||
#include "Network/PlayerDefinition.h"
|
||||
#include "Core/World.h"
|
||||
#include "Core/EventBroker.h"
|
||||
#include "Network/Network.h"
|
||||
#include "../Network/Network.h"
|
||||
#include "Input/EInputCommand.h"
|
||||
#include "Core/EPlayerDamage.h"
|
||||
#include "Network/EPlayerDisconnected.h"
|
||||
#include "Core/EPlayerSpawned.h"
|
||||
#include "Core/EEntityDeleted.h"
|
||||
#include "Core/EComponentDeleted.h"
|
||||
|
||||
class Server : public Network
|
||||
{
|
||||
@@ -25,56 +31,64 @@ private:
|
||||
boost::asio::ip::udp::endpoint m_ReceiverEndpoint;
|
||||
boost::asio::io_service m_IOService;
|
||||
boost::asio::ip::udp::socket m_Socket;
|
||||
PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS];
|
||||
|
||||
// Sending messages to client logic
|
||||
std::map<PlayerID, PlayerDefinition> m_ConnectedPlayers;
|
||||
// HACK: Fix INPUTSIZE
|
||||
char readBuffer[INPUTSIZE] = { 0 };
|
||||
int bytesRead = 0;
|
||||
size_t bytesRead = 0;
|
||||
// time for previouse message
|
||||
std::clock_t previousePingMessage = std::clock();
|
||||
std::clock_t previousSnapshotMessage = std::clock();
|
||||
std::clock_t timOutTimer = std::clock();
|
||||
// How often we send messages (milliseconds)
|
||||
int intervalMs = 1000;
|
||||
int snapshotInterval = 50;
|
||||
float pingIntervalMs;
|
||||
float snapshotInterval;
|
||||
int checkTimeOutInterval = 100;
|
||||
int m_NextPlayerID = 0;
|
||||
|
||||
//Timers
|
||||
std::clock_t m_StartPingTime;
|
||||
std::clock_t m_StopTimes[8];
|
||||
|
||||
// Game logic
|
||||
World* m_World;
|
||||
EventBroker* m_EventBroker;
|
||||
// vec.size() = ammount of players to create, stores playerID's
|
||||
std::vector<unsigned int> m_PlayersToCreate;
|
||||
|
||||
// Packet loss logic
|
||||
unsigned int m_PacketID;
|
||||
unsigned int m_PreviousPacketID;
|
||||
unsigned int m_SendPacketID;
|
||||
PacketID m_PacketID = 0;
|
||||
PacketID m_PreviousPacketID = 0;
|
||||
|
||||
// Private member functions
|
||||
int receive(char* data, size_t length);
|
||||
size_t receive(char* data);
|
||||
void readFromClients();
|
||||
void send(Packet& packet, int playerID);
|
||||
void send(PlayerID player, Packet& packet);
|
||||
void send(Packet& packet);
|
||||
void moveMessageHead(char*& data, size_t& length, size_t stepSize);
|
||||
void broadcast(std::string message);
|
||||
void broadcast(Packet& packet);
|
||||
void sendSnapshot();
|
||||
void addChildrenToPacket(Packet& packet, EntityID entityID);
|
||||
void sendPing();
|
||||
void checkForTimeOuts();
|
||||
void disconnect(int i);
|
||||
void disconnect(PlayerID playerID);
|
||||
void parseMessageType(Packet& packet);
|
||||
void parseEvent(Packet& packet);
|
||||
void parseOnInputCommand(Packet& packet);
|
||||
void parseOnPlayerDamage(Packet& packet);
|
||||
void parseConnect(Packet& packet);
|
||||
void parseDisconnect();
|
||||
void parseClientPing();
|
||||
void parseServerPing();
|
||||
void parseSnapshot(Packet& packet);
|
||||
void parsePing();
|
||||
void identifyPacketLoss();
|
||||
EntityID createPlayer();
|
||||
void kick(PlayerID player);
|
||||
PlayerID GetPlayerIDFromEndpoint(boost::asio::ip::udp::endpoint endpoint);
|
||||
// Debug event
|
||||
EventRelay<Server, Events::InputCommand> m_EInputCommand;
|
||||
bool OnInputCommand(const Events::InputCommand& e);
|
||||
EventRelay<Server, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||
bool OnPlayerSpawned(const Events::PlayerSpawned& e);
|
||||
EventRelay<Server, Events::EntityDeleted> m_EEntityDeleted;
|
||||
bool OnEntityDeleted(const Events::EntityDeleted& e);
|
||||
EventRelay<Server, Events::ComponentDeleted> m_EComponentDeleted;
|
||||
bool OnComponentDeleted(const Events::ComponentDeleted& e);
|
||||
void parsePlayerTransform(Packet& packet);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
#ifndef AnimationSystem_h__
|
||||
#define AnimationSystem_h__
|
||||
|
||||
#include "GLM.h"
|
||||
|
||||
#include "Common.h"
|
||||
#include "Core/System.h"
|
||||
#include "Core/ResourceManager.h"
|
||||
#include "Rendering/Model.h"
|
||||
#include "Rendering/EAnimationComplete.h"
|
||||
#include "Rendering/Skeleton.h"
|
||||
|
||||
class AnimationSystem : public PureSystem
|
||||
{
|
||||
public:
|
||||
AnimationSystem(World* world, EventBroker* eventBroker)
|
||||
: System(world, eventBroker)
|
||||
, PureSystem("Animation")
|
||||
{
|
||||
|
||||
}
|
||||
~AnimationSystem() { }
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& animationComponent, double dt) override;
|
||||
private:
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -2,6 +2,7 @@
|
||||
#define Camera_h__
|
||||
|
||||
#include "../GLM.h"
|
||||
#include "../Core/Util/Rectangle.h"
|
||||
|
||||
class Camera
|
||||
{
|
||||
@@ -32,7 +33,6 @@ public:
|
||||
glm::mat4 ViewMatrix() const { return m_ViewMatrix; }
|
||||
void SetViewMatrix(glm::mat4 val);
|
||||
|
||||
|
||||
float AspectRatio() const { return m_AspectRatio; }
|
||||
void SetAspectRatio(float val);
|
||||
|
||||
@@ -48,6 +48,8 @@ public:
|
||||
void UpdateViewMatrix();
|
||||
void UpdateProjectionMatrix();
|
||||
|
||||
glm::vec2 WorldToScreen(glm::vec3 worldCoord, Rectangle resolution);
|
||||
|
||||
private:
|
||||
|
||||
glm::vec3 m_Position;
|
||||
|
||||
@@ -1,66 +0,0 @@
|
||||
#include <imgui/imgui.h>
|
||||
#include "../Input/FirstPersonInputController.h"
|
||||
|
||||
template <typename EventContext>
|
||||
class DebugCameraInputController : public FirstPersonInputController<EventContext>
|
||||
{
|
||||
public:
|
||||
DebugCameraInputController(EventBroker* eventBroker, unsigned int playerID)
|
||||
: FirstPersonInputController(eventBroker, playerID)
|
||||
{ }
|
||||
|
||||
void SetPosition(const glm::vec3 position) { m_Position = position; }
|
||||
void SetOrientation(const glm::quat orientation) { m_Orientation = orientation; }
|
||||
|
||||
const glm::vec3 Position() const { return m_Position; }
|
||||
void SetBaseSpeed(float speed) { m_BaseSpeed = speed; }
|
||||
|
||||
virtual bool OnCommand(const Events::InputCommand& e) override
|
||||
{
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
|
||||
if (e.Command == "PrimaryFire") {
|
||||
if (e.Value > 0) {
|
||||
if (!io.WantCaptureMouse) {
|
||||
LockMouse();
|
||||
}
|
||||
} else {
|
||||
UnlockMouse();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!io.WantCaptureKeyboard) {
|
||||
if (e.Command == "Right") {
|
||||
float value = std::max(-1.f, std::min(e.Value, 1.f));
|
||||
m_Velocity.x = value;
|
||||
}
|
||||
if (e.Command == "Forward") {
|
||||
float value = std::max(-1.f, std::min(e.Value, 1.f));
|
||||
m_Velocity.z = -value;
|
||||
}
|
||||
if (e.Command == "Sprint") {
|
||||
if (e.Value > 0.f) {
|
||||
m_Speed = m_BaseSpeed * 2.f * (e.Value);
|
||||
} else {
|
||||
m_Speed = m_BaseSpeed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FirstPersonInputController::OnCommand(e);
|
||||
}
|
||||
|
||||
void Update(double dt)
|
||||
{
|
||||
if (glm::length2(m_Velocity) > 0) {
|
||||
m_Position += m_Orientation * (glm::normalize(m_Velocity) * m_Speed * (float)dt);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
glm::vec3 m_Position = glm::vec3(0, 0, 0);
|
||||
glm::vec3 m_Velocity = glm::vec3(0, 0, 0);
|
||||
float m_BaseSpeed = 2.0f;
|
||||
float m_Speed = m_BaseSpeed;
|
||||
};
|
||||
@@ -0,0 +1,35 @@
|
||||
#ifndef DirectionalLightJob_h__
|
||||
#define DirectionalLightJob_h__
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#include "../Common.h"
|
||||
#include "../GLM.h"
|
||||
#include "../Core/ComponentWrapper.h"
|
||||
#include "RenderJob.h"
|
||||
#include "../Core/Transform.h"
|
||||
#include "../Core/World.h"
|
||||
|
||||
struct DirectionalLightJob : RenderJob
|
||||
{
|
||||
DirectionalLightJob(ComponentWrapper transformComponent, ComponentWrapper directionalLightComponent, World* m_World)
|
||||
: RenderJob()
|
||||
{
|
||||
|
||||
Direction = glm::vec4(0,0,-1,0) * glm::inverse(Transform::AbsoluteOrientation(m_World, transformComponent.EntityID));
|
||||
//Direction = glm::vec4((glm::vec3)directionalLightComponent["Direction"], 0.f);
|
||||
Color = (glm::vec4)directionalLightComponent["Color"];
|
||||
Intensity = (double)directionalLightComponent["Intensity"];
|
||||
};
|
||||
|
||||
glm::vec4 Direction;
|
||||
glm::vec4 Color;
|
||||
float Intensity;
|
||||
|
||||
void CalculateHash() override
|
||||
{
|
||||
Hash = 0;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,63 @@
|
||||
#ifndef DrawBloomPass_h__
|
||||
#define DrawBloomPass_h__
|
||||
|
||||
#include "IRenderer.h"
|
||||
#include "DrawBloomPassState.h"
|
||||
//#include "LightCullingPass.h" Finalpass om den skall skickas in
|
||||
#include "FrameBuffer.h"
|
||||
#include "ShaderProgram.h"
|
||||
//#include "Util/UnorderedMapVec2.h"
|
||||
#include "Texture.h"
|
||||
#include "imgui/imgui.h"
|
||||
|
||||
class DrawBloomPass
|
||||
{
|
||||
public:
|
||||
DrawBloomPass(IRenderer* renderer /* ,Texture or finalpass*/ );
|
||||
~DrawBloomPass() { }
|
||||
void InitializeTextures();
|
||||
void InitializeFrameBuffers();
|
||||
void InitializeShaderPrograms();
|
||||
void InitializeBuffers();
|
||||
void ClearBuffer();
|
||||
|
||||
void FillGaussianBuffer(FrameBuffer* fb);
|
||||
|
||||
void Draw(GLuint texture);
|
||||
|
||||
//Getters
|
||||
//Return the blurred result of the texture that was sent into draw
|
||||
GLuint GaussianTexture() const { return m_FinalBlurTexture; }
|
||||
|
||||
|
||||
private:
|
||||
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
|
||||
void BlurOneMipMapLevel(GLuint* texture, GLint iterations, GLint mipMapLevel);
|
||||
|
||||
Texture* m_WhiteTexture;
|
||||
Model* m_ScreenQuad;
|
||||
|
||||
const IRenderer* m_Renderer;
|
||||
//const LightCullingPass* m_LightCullingPass
|
||||
//GLuint m_iterations = 5;
|
||||
GLint m_DebugTextureToDraw = 0;
|
||||
GLint m_Iterations = 3;
|
||||
|
||||
float m_ScreenSizes[10];
|
||||
|
||||
GLuint m_FinalBlurTexture;
|
||||
GLuint m_GaussianTexture_horiz;
|
||||
GLuint m_GaussianTexture_vert;
|
||||
|
||||
FrameBuffer m_GaussianFrameBuffer_horiz;
|
||||
FrameBuffer m_GaussianFrameBuffer_vert;
|
||||
FrameBuffer m_BlurredFinalTexture;
|
||||
|
||||
ShaderProgram* m_GaussianProgram_horiz;
|
||||
ShaderProgram* m_GaussianProgram_vert;
|
||||
ShaderProgram* m_GaussianProgram_both;
|
||||
ShaderProgram* m_CombineProgram;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,15 @@
|
||||
#ifndef DrawBloomPassState_h__
|
||||
#define DrawBloomPassState_h__
|
||||
|
||||
#include "Rendering/RenderState.h"
|
||||
|
||||
class DrawBloomPassState : public RenderState
|
||||
{
|
||||
public:
|
||||
DrawBloomPassState();
|
||||
~DrawBloomPassState();
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,29 @@
|
||||
#ifndef DrawColorCorrectionPass_h__
|
||||
#define DrawColorCorrectionPass_h__
|
||||
|
||||
#include "IRenderer.h"
|
||||
#include "DrawScreenQuadPassState.h"
|
||||
#include "FrameBuffer.h"
|
||||
#include "ShaderProgram.h"
|
||||
//#include "Util/UnorderedMapVec2.h"
|
||||
#include "Texture.h"
|
||||
#include "imgui/imgui.h"
|
||||
|
||||
class DrawColorCorrectionPass
|
||||
{
|
||||
public:
|
||||
DrawColorCorrectionPass(IRenderer* renderer);
|
||||
~DrawColorCorrectionPass() { }
|
||||
void InitializeFrameBuffers();
|
||||
void InitializeShaderPrograms();
|
||||
|
||||
void Draw(GLuint sceneTexture, GLuint bloomTexture, GLuint sceneTextureLowRes, GLuint bloomTextureLowRes, GLfloat gamma, GLfloat exposure);
|
||||
private:
|
||||
const IRenderer* m_Renderer;
|
||||
|
||||
ShaderProgram* m_ColorCorrectionProgram;
|
||||
|
||||
Model* m_ScreenQuad;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -17,22 +17,59 @@ public:
|
||||
void InitializeTextures();
|
||||
void InitializeFrameBuffers();
|
||||
void InitializeShaderPrograms();
|
||||
|
||||
void Draw(RenderScene& scene);
|
||||
void ClearBuffer();
|
||||
|
||||
//Getters
|
||||
//Return the texture that is used in later stages to apply the bloom effect
|
||||
GLuint BloomTexture() const { return m_BloomTexture; }
|
||||
GLuint BloomTextureLowRes() const { return m_BloomTextureLowRes; }
|
||||
//Return the texture with diffuse and lighting of the scene.
|
||||
GLuint SceneTexture() const { return m_SceneTexture; }
|
||||
GLuint SceneTextureLowRes() const { return m_SceneTextureLowRes; }
|
||||
//Return the framebuffer used in the scene rendering stage.
|
||||
FrameBuffer* FinalPassFrameBuffer() { return &m_FinalPassFrameBuffer; }
|
||||
FrameBuffer* FinalPassFrameBufferLowRes() { return &m_FinalPassFrameBufferLowRes; }
|
||||
|
||||
|
||||
private:
|
||||
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
|
||||
void GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint format, GLenum type, GLint numMipMaps) const;
|
||||
|
||||
void DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene);
|
||||
void DrawShieldToStencilBuffer(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene);
|
||||
void DrawShieldedModelRenderQueue(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene);
|
||||
void DrawToDepthBuffer(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene);
|
||||
|
||||
void BindExplosionUniforms(GLuint shaderHandle, std::shared_ptr<ExplosionEffectJob>& job, RenderScene& scene);
|
||||
void BindModelUniforms(GLuint shaderHandle, std::shared_ptr<ModelJob>& job, RenderScene& scene);
|
||||
|
||||
void BindExplosionTextures(std::shared_ptr<ExplosionEffectJob>& job);
|
||||
void BindModelTextures(std::shared_ptr<ModelJob>& job);
|
||||
|
||||
Texture* m_WhiteTexture;
|
||||
Texture* m_BlackTexture;
|
||||
Texture* m_NeutralNormalTexture;
|
||||
Texture* m_GreyTexture;
|
||||
|
||||
FrameBuffer m_FinalPassFrameBuffer;
|
||||
FrameBuffer m_FinalPassFrameBufferLowRes;
|
||||
GLuint m_BloomTexture;
|
||||
GLuint m_SceneTexture;
|
||||
GLuint m_BloomTextureLowRes;
|
||||
GLuint m_SceneTextureLowRes;
|
||||
GLuint m_DepthBuffer;
|
||||
GLuint m_DepthBufferLowRes;
|
||||
|
||||
//maqke this component based i guess?
|
||||
GLuint m_ShieldPixelRate = 16;
|
||||
|
||||
const IRenderer* m_Renderer;
|
||||
const LightCullingPass* m_LightCullingPass;
|
||||
|
||||
ShaderProgram* m_ForwardPlusProgram;
|
||||
|
||||
ShaderProgram* m_ExplosionEffectProgram;
|
||||
ShaderProgram* m_ShieldToStencilProgram;
|
||||
ShaderProgram* m_FillDepthBufferProgram;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -6,10 +6,17 @@
|
||||
class DrawFinalPassState : public RenderState
|
||||
{
|
||||
public:
|
||||
DrawFinalPassState();
|
||||
DrawFinalPassState(GLuint frameBuffer);
|
||||
~DrawFinalPassState();
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
class DrawStencilState : public RenderState
|
||||
{
|
||||
public:
|
||||
DrawStencilState(GLuint frameBuffer);
|
||||
~DrawStencilState();
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,42 +0,0 @@
|
||||
#ifndef DrawScenePass_h__
|
||||
#define DrawScenePass_h__
|
||||
|
||||
#include "IRenderer.h"
|
||||
#include "DrawScenePassState.h"
|
||||
#include "FrameBuffer.h"
|
||||
#include "ShaderProgram.h"
|
||||
#include "Util/UnorderedMapVec2.h"
|
||||
#include "Texture.h"
|
||||
|
||||
class DrawScenePass
|
||||
{
|
||||
public:
|
||||
DrawScenePass(IRenderer* renderer);
|
||||
~DrawScenePass() { }
|
||||
void InitializeTextures();
|
||||
void InitializeFrameBuffers();
|
||||
void InitializeShaderPrograms();
|
||||
|
||||
void Draw(RenderScene& scene);
|
||||
|
||||
//Getters
|
||||
|
||||
|
||||
private:
|
||||
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
|
||||
|
||||
static bool DepthSort(const std::shared_ptr<RenderJob> &i, const std::shared_ptr<RenderJob> &j)
|
||||
{
|
||||
return (i->Depth < j->Depth);
|
||||
};
|
||||
|
||||
Texture* m_WhiteTexture;
|
||||
|
||||
const IRenderer* m_Renderer;
|
||||
|
||||
ShaderProgram* m_BasicForwardProgram;
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,15 +0,0 @@
|
||||
#ifndef DrawScenePassState_h__
|
||||
#define DrawScenePassState_h__
|
||||
|
||||
#include "Rendering/RenderState.h"
|
||||
|
||||
class DrawScenePassState : public RenderState
|
||||
{
|
||||
public:
|
||||
DrawScenePassState();
|
||||
~DrawScenePassState();
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,28 @@
|
||||
#ifndef DrawScreenQuadPass_h__
|
||||
#define DrawScreenQuadPass_h__
|
||||
|
||||
#include "IRenderer.h"
|
||||
#include "DrawScreenQuadPassState.h"
|
||||
#include "FrameBuffer.h"
|
||||
#include "ShaderProgram.h"
|
||||
//#include "Util/UnorderedMapVec2.h"
|
||||
#include "Texture.h"
|
||||
|
||||
class DrawScreenQuadPass
|
||||
{
|
||||
public:
|
||||
DrawScreenQuadPass(IRenderer* renderer);
|
||||
~DrawScreenQuadPass() { }
|
||||
void InitializeFrameBuffers();
|
||||
void InitializeShaderPrograms();
|
||||
|
||||
void Draw(GLuint texture);
|
||||
private:
|
||||
const IRenderer* m_Renderer;
|
||||
|
||||
ShaderProgram* m_DrawQuadProgram;
|
||||
|
||||
Model* m_ScreenQuad;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,15 @@
|
||||
#ifndef DrawScreenQuadPassState_h__
|
||||
#define DrawScreenQuadPassState_h__
|
||||
|
||||
#include "Rendering/RenderState.h"
|
||||
|
||||
class DrawScreenQuadPassState : public RenderState
|
||||
{
|
||||
public:
|
||||
DrawScreenQuadPassState();
|
||||
~DrawScreenQuadPassState();
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,18 @@
|
||||
#ifndef Events_AnimationComplete_h__
|
||||
#define Events_AnimationComplete_h__
|
||||
|
||||
#include "../Core/EventBroker.h"
|
||||
#include "../Core/EntityWrapper.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct AnimationComplete : Event
|
||||
{
|
||||
EntityWrapper Entity;
|
||||
std::string Name;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -2,20 +2,14 @@
|
||||
#define Events_SetCamera_h__
|
||||
|
||||
#include "../Core/EventBroker.h"
|
||||
#include "../Core/Entity.h"
|
||||
#include <string.h>
|
||||
#include "../Core/EntityWrapper.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct SetCamera : Event
|
||||
{
|
||||
public:
|
||||
SetCamera() { };
|
||||
std::string Name;
|
||||
|
||||
private:
|
||||
|
||||
EntityWrapper CameraEntity;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
#ifndef ExplosionEffectJob_h__
|
||||
#define ExplosionEffectJob_h__
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#include "../Common.h"
|
||||
#include "../GLM.h"
|
||||
#include "../Core/ComponentWrapper.h"
|
||||
#include "Texture.h"
|
||||
#include "Model.h"
|
||||
#include "RenderJob.h"
|
||||
#include "../Core/ResourceManager.h"
|
||||
#include "Camera.h"
|
||||
#include "../Core/World.h"
|
||||
|
||||
struct ExplosionEffectJob : ModelJob
|
||||
{
|
||||
ExplosionEffectJob(ComponentWrapper explosionEffectComponent, ::Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialGroup matGroup, ComponentWrapper modelComponent, ::World* world, glm::vec4 fillColor, float fillPercentage)
|
||||
: ModelJob(model, camera, matrix, matGroup, modelComponent, world, fillColor, fillPercentage)
|
||||
{
|
||||
ExplosionOrigin = (glm::vec3)explosionEffectComponent["ExplosionOrigin"];
|
||||
TimeSinceDeath = (double)explosionEffectComponent["TimeSinceDeath"];
|
||||
ExplosionDuration = (double)explosionEffectComponent["ExplosionDuration"];
|
||||
EndColor = (glm::vec4)explosionEffectComponent["EndColor"];
|
||||
Randomness = (bool)explosionEffectComponent["Randomness"];
|
||||
RandomnessScalar = (double)explosionEffectComponent["RandomnessScalar"];
|
||||
Velocity = (glm::vec2)explosionEffectComponent["Velocity"];
|
||||
ColorByDistance = (bool)explosionEffectComponent["ColorByDistance"];
|
||||
ExponentialAccelaration = (bool)explosionEffectComponent["ExponentialAccelaration"];
|
||||
};
|
||||
|
||||
glm::vec3 ExplosionOrigin;
|
||||
double TimeSinceDeath = 0.f; //Seconds
|
||||
double ExplosionDuration = 2.f;
|
||||
//bool Gravity = true;
|
||||
//double GravityForce = 1.f; // Speed
|
||||
//double ObjectRadius = 2.f; // TODO: Change this for object radius when it's available
|
||||
glm::vec4 EndColor;
|
||||
bool Randomness = false;
|
||||
|
||||
float RandomnessScalar = 1.f;
|
||||
glm::vec2 Velocity;
|
||||
bool ColorByDistance = false;
|
||||
//bool ReverseAnimation = false;
|
||||
//bool Wireframe = false;
|
||||
bool ExponentialAccelaration = false;
|
||||
|
||||
std::array<float, 50> RandomNumbers = {
|
||||
0.3257552917701f,
|
||||
0.07601508315467f,
|
||||
0.57408909014151f,
|
||||
0.0f,
|
||||
0.8618231368539f,
|
||||
0.074957156588769f,
|
||||
0.39413607511396f,
|
||||
0.54579346698979f,
|
||||
0.83222648353885f,
|
||||
0.83635707285086f,
|
||||
0.34473986148124f,
|
||||
0.98092448710507f,
|
||||
0.46346380070944f,
|
||||
0.7308761201477f,
|
||||
0.70832470371776f,
|
||||
0.28268750909841f,
|
||||
0.26291620883295f,
|
||||
0.07685032816457f,
|
||||
0.30760929515008f,
|
||||
0.2781575388639f ,
|
||||
0.016950582161988f ,
|
||||
0.25787915254844f ,
|
||||
0.76293767279151f ,
|
||||
0.67730279903733f ,
|
||||
0.49042877018937f ,
|
||||
0.13002237823327f ,
|
||||
0.62803373841012f ,
|
||||
0.94525353747665f ,
|
||||
0.32893980076953f ,
|
||||
0.95952951719962f ,
|
||||
0.056386206790985f ,
|
||||
0.012030893476694f ,
|
||||
0.93090049220757f,
|
||||
0.83579883064879f,
|
||||
0.79733513938139f,
|
||||
0.8796381046435f ,
|
||||
0.94160434600972f ,
|
||||
0.76901855588379f ,
|
||||
0.50253688101775f ,
|
||||
0.82457069578793f ,
|
||||
0.80157403359263f ,
|
||||
0.87291810189975f ,
|
||||
0.64679548919517f ,
|
||||
0.42664138899494f ,
|
||||
0.77171308303797f ,
|
||||
0.75567959237643f ,
|
||||
0.45190826265696f ,
|
||||
0.59844922628181f ,
|
||||
0.56534937655802f ,
|
||||
0.195656257307f};
|
||||
|
||||
void CalculateHash() override
|
||||
{
|
||||
Hash = 0;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,36 @@
|
||||
#ifndef Font_h__
|
||||
#define Font_h__
|
||||
|
||||
#include <ft2build.h>
|
||||
#include FT_FREETYPE_H
|
||||
#include FT_GLYPH_H
|
||||
#include <boost/tokenizer.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
|
||||
#include "../OpenGL.h"
|
||||
#include "../GLM.h"
|
||||
#include "../Core/ResourceManager.h"
|
||||
|
||||
class Font : public Resource
|
||||
{
|
||||
friend class ResourceManager;
|
||||
private:
|
||||
Font(std::string path);
|
||||
|
||||
public:
|
||||
struct Character {
|
||||
GLuint TextureID; // ID handle of the glyph texture
|
||||
glm::ivec2 Size; // Size of glyph
|
||||
glm::ivec2 Bearing; // Offset from baseline to left/top of glyph
|
||||
GLuint Advance; // Offset to advance to next glyph
|
||||
};
|
||||
|
||||
|
||||
|
||||
int FontSize = 16;
|
||||
|
||||
~Font();
|
||||
|
||||
std::map<GLchar, Character> m_Characters;
|
||||
};
|
||||
#endif
|
||||
@@ -25,37 +25,28 @@ class IRenderer
|
||||
{
|
||||
public:
|
||||
GLFWwindow* Window() const { return m_Window; }
|
||||
//Returns screen size including window border and header
|
||||
Rectangle Resolution() const { return m_Resolution; }
|
||||
void SetResolution(const Rectangle& resolution) { m_Resolution = resolution; }
|
||||
virtual void SetResolution(const Rectangle& resolution) { m_Resolution = resolution; }
|
||||
bool Fullscreen() { return m_Fullscreen; }
|
||||
void SetFullscreen(bool fullscreen) { m_Fullscreen = fullscreen; }
|
||||
virtual void SetFullscreen(bool fullscreen) { m_Fullscreen = fullscreen; }
|
||||
bool VSYNC() const { return m_VSYNC; }
|
||||
void SetVSYNC(bool vsync) { m_VSYNC = vsync; }
|
||||
::Camera* Camera() const { return m_Camera; }
|
||||
void SetCamera(::Camera* camera)
|
||||
{
|
||||
if (camera == nullptr) {
|
||||
m_Camera = m_DefaultCamera;
|
||||
} else {
|
||||
m_Camera = camera;
|
||||
}
|
||||
}
|
||||
virtual void SetVSYNC(bool vsync) { m_VSYNC = vsync; }
|
||||
//Returns screen size excluding window border and header
|
||||
Rectangle GetViewportSize() const { return m_ViewportSize; }
|
||||
virtual void Initialize() = 0;
|
||||
virtual void Update(double dt) = 0;
|
||||
virtual void Draw(RenderFrame& rq) = 0;
|
||||
virtual PickData Pick(glm::vec2 screenCord) = 0;
|
||||
|
||||
World* m_World; //Temp world, untill viktor merge.
|
||||
|
||||
protected:
|
||||
Rectangle m_Resolution = Rectangle::Rectangle(1280, 720);
|
||||
Rectangle m_ViewportSize = Rectangle::Rectangle(1280, 720);
|
||||
bool m_Fullscreen = false;
|
||||
bool m_VSYNC = false;
|
||||
int m_GLVersion[2];
|
||||
std::string m_GLVendor;
|
||||
GLFWwindow* m_Window = nullptr;
|
||||
::Camera* m_DefaultCamera;
|
||||
::Camera* m_Camera = nullptr;
|
||||
};
|
||||
|
||||
#endif // Renderer_h__
|
||||
|
||||
@@ -46,8 +46,8 @@ private:
|
||||
int m_NumberOfTiles = 0;
|
||||
|
||||
struct Plane {
|
||||
glm::vec3 Normal;
|
||||
float d;
|
||||
glm::vec3 Normal = glm::vec3(0.f);
|
||||
float d = 0;
|
||||
};
|
||||
|
||||
struct Frustum {
|
||||
@@ -56,20 +56,21 @@ private:
|
||||
Frustum* m_Frustums;
|
||||
|
||||
//This should be a component
|
||||
struct PointLight {
|
||||
struct LightSource {
|
||||
glm::vec4 Position = glm::vec4(0.f);
|
||||
glm::vec4 Direction = glm::vec4(10.f);
|
||||
glm::vec4 Color = glm::vec4(1.f);
|
||||
float Radius = 5.f;
|
||||
float Intensity = 0.8f;
|
||||
float Falloff = 0.3f;
|
||||
float Padding = 1337;
|
||||
enum Type_t { Zero, Point, Directional, Spot } Type;
|
||||
};
|
||||
std::vector<PointLight> m_PointLights;
|
||||
std::vector<LightSource> m_LightSources;
|
||||
|
||||
struct LightGrid {
|
||||
float Start;
|
||||
float Amount;
|
||||
glm::vec2 Padding;
|
||||
float Start = 0;
|
||||
float Amount = 0;
|
||||
glm::vec2 Padding = glm::vec2(1.f, 2.f);
|
||||
};
|
||||
|
||||
LightGrid* m_LightGrid;
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#ifndef Model_h__
|
||||
#define Model_h__
|
||||
|
||||
#include "RawModel.h"
|
||||
#include "Rendering/RawModelCustom.h"
|
||||
//#include "Rendering/RawModelAssimp.h"
|
||||
#include "../OpenGL.h"
|
||||
|
||||
class Model : public ThreadUnsafeResource
|
||||
@@ -19,12 +20,11 @@ public:
|
||||
|
||||
GLuint VAO;
|
||||
GLuint ElementBuffer;
|
||||
RawModel* m_RawModel;
|
||||
|
||||
private:
|
||||
RawModel* m_RawModel;
|
||||
|
||||
GLuint VertexBuffer;
|
||||
GLuint DiffuseVertexColorBuffer;
|
||||
GLuint SpecularVertexColorBuffer;
|
||||
GLuint NormalBuffer;
|
||||
GLuint TangentNormalsBuffer;
|
||||
GLuint BiTangentNormalsBuffer;
|
||||
|
||||
@@ -12,23 +12,58 @@
|
||||
#include "../Core/ResourceManager.h"
|
||||
#include "Camera.h"
|
||||
#include "../Core/World.h"
|
||||
#include "../Core/Transform.h"
|
||||
#include "Skeleton.h"
|
||||
|
||||
struct ModelJob : RenderJob
|
||||
{
|
||||
ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialGroup matGroup, ComponentWrapper modelComponent, World* world)
|
||||
ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialGroup matGroup, ComponentWrapper modelComponent, World* world, glm::vec4 fillColor, float fillPercentage)
|
||||
: RenderJob()
|
||||
{
|
||||
Model = model;
|
||||
TextureID = (matGroup.Texture) ? matGroup.Texture->ResourceID : 0;
|
||||
DiffuseTexture = matGroup.Texture.get();
|
||||
NormalTexture = matGroup.NormalMap.get();
|
||||
SpecularTexture = matGroup.SpecularMap.get();
|
||||
if (modelComponent["DiffuseTexture"]) {
|
||||
DiffuseTexture = matGroup.Texture.get();
|
||||
} else {
|
||||
DiffuseTexture = nullptr;
|
||||
}
|
||||
if (modelComponent["NormalMap"]) {
|
||||
NormalTexture = matGroup.NormalMap.get();
|
||||
} else {
|
||||
NormalTexture = nullptr;
|
||||
}
|
||||
if (modelComponent["SpecularMap"]) {
|
||||
SpecularTexture = matGroup.SpecularMap.get();
|
||||
} else {
|
||||
SpecularTexture = nullptr;
|
||||
}
|
||||
if (modelComponent["GlowMap"]) {
|
||||
IncandescenceTexture = matGroup.IncandescenceMap.get();
|
||||
} else {
|
||||
IncandescenceTexture = nullptr;
|
||||
}
|
||||
DiffuseColor = matGroup.DiffuseColor;
|
||||
SpecularColor = matGroup.SpecularColor;
|
||||
IncandescenceColor = matGroup.IncandescenceColor;
|
||||
StartIndex = matGroup.StartIndex;
|
||||
EndIndex = matGroup.EndIndex;
|
||||
Matrix = matrix;
|
||||
Color = modelComponent["Color"];
|
||||
Entity = modelComponent.EntityID;
|
||||
glm::vec3 abspos = Transform::AbsolutePosition(world, modelComponent.EntityID);
|
||||
glm::vec3 worldpos = glm::vec3(camera->ViewMatrix() * glm::vec4(abspos, 1));
|
||||
Depth = worldpos.z;
|
||||
World = world;
|
||||
|
||||
FillColor = fillColor;
|
||||
FillPercentage = fillPercentage;
|
||||
Skeleton = Model->m_RawModel->m_Skeleton;
|
||||
|
||||
if (world->HasComponent(Entity, "Animation") && Skeleton != nullptr) {
|
||||
auto animationComponent = world->GetComponent(Entity, "Animation");
|
||||
Animation = model->m_RawModel->m_Skeleton->GetAnimation(animationComponent["Name"]);
|
||||
AnimationTime = (double)animationComponent["Time"];
|
||||
}
|
||||
};
|
||||
|
||||
unsigned int TextureID;
|
||||
@@ -39,13 +74,25 @@ struct ModelJob : RenderJob
|
||||
const Texture* DiffuseTexture;
|
||||
const Texture* NormalTexture;
|
||||
const Texture* SpecularTexture;
|
||||
const Texture* IncandescenceTexture;
|
||||
float Shininess = 0.f;
|
||||
glm::vec4 Color;
|
||||
const ::Model* Model = nullptr;
|
||||
::Skeleton* Skeleton = nullptr;
|
||||
const ::Skeleton::Animation* Animation = nullptr;
|
||||
|
||||
float AnimationTime = 0.f;
|
||||
|
||||
glm::vec4 DiffuseColor;
|
||||
glm::vec4 SpecularColor;
|
||||
glm::vec4 IncandescenceColor;
|
||||
unsigned int StartIndex = 0;
|
||||
unsigned int EndIndex = 0;
|
||||
World* World;
|
||||
|
||||
glm::vec4 FillColor = glm::vec4(0);
|
||||
float FillPercentage = 0.0;
|
||||
|
||||
void CalculateHash() override
|
||||
{
|
||||
Hash = TextureID;
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
#ifndef PickingPass_h__
|
||||
#define PickingPass_h__
|
||||
|
||||
|
||||
|
||||
#include "IRenderer.h"
|
||||
#include "PickingPassState.h"
|
||||
#include "FrameBuffer.h"
|
||||
@@ -10,8 +8,7 @@
|
||||
#include "Util/UnorderedMapiVec2.h"
|
||||
#include "../Core/EventBroker.h"
|
||||
#include "../Core/World.h"
|
||||
|
||||
|
||||
#include "Rendering/Skeleton.h"
|
||||
|
||||
class PickingPass
|
||||
{
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#ifndef RawModel_h__
|
||||
#define RawModel_h__
|
||||
#ifndef RawModelAssimp_h__
|
||||
#define RawModelAssimp_h__
|
||||
|
||||
#ifdef USING_ASSIMP_AS_IMPORTER
|
||||
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
@@ -18,29 +20,27 @@
|
||||
#include "Texture.h"
|
||||
#include "Skeleton.h"
|
||||
|
||||
class RawModel : public Resource
|
||||
#define RawModel RawModelAssimp
|
||||
|
||||
class RawModelAssimp : public Resource
|
||||
{
|
||||
friend class ResourceManager;
|
||||
|
||||
protected:
|
||||
RawModel(std::string fileName);
|
||||
RawModelAssimp(std::string fileName);
|
||||
|
||||
public:
|
||||
~RawModel();
|
||||
~RawModelAssimp();
|
||||
|
||||
struct Vertex
|
||||
{
|
||||
glm::vec3 Position;
|
||||
glm::vec3 Normal;
|
||||
glm::vec3 Tangent;
|
||||
glm::vec3 BiTangent;
|
||||
glm::vec3 BiNormal;
|
||||
glm::vec2 TextureCoords;
|
||||
glm::vec4 DiffuseVertexColor;
|
||||
glm::vec4 SpecularVertexColor;
|
||||
glm::vec4 BoneIndices1;
|
||||
glm::vec4 BoneIndices2;
|
||||
glm::vec4 BoneWeights1;
|
||||
glm::vec4 BoneWeights2;
|
||||
glm::vec4 BoneIndices;
|
||||
glm::vec4 BoneWeights;
|
||||
};
|
||||
|
||||
struct MaterialGroup
|
||||
@@ -68,8 +68,6 @@ private:
|
||||
std::vector<glm::ivec2> BoneIndices;
|
||||
std::vector<glm::vec2> BoneWeights;
|
||||
std::vector<glm::vec3> Normals;
|
||||
std::vector<glm::vec4> DiffuseVertexColor;
|
||||
std::vector<glm::vec4> SpecularVertexColor;
|
||||
std::vector<glm::vec3> TangentNormals;
|
||||
std::vector<glm::vec3> BiTangentNormals;
|
||||
std::vector<glm::vec2> TextureCoords;
|
||||
@@ -78,3 +76,4 @@ private:
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
||||
@@ -0,0 +1,102 @@
|
||||
#ifndef RawModelCustom_h__
|
||||
#define RawModelCustom_h__
|
||||
|
||||
#ifndef USING_ASSIMP_AS_IMPORTER
|
||||
|
||||
#define RawModel RawModelCustom
|
||||
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <cstdlib>
|
||||
#include <stack>
|
||||
|
||||
#include <boost/filesystem/path.hpp>
|
||||
|
||||
#include "../Common.h"
|
||||
#include "../GLM.h"
|
||||
#include "../Core/ResourceManager.h"
|
||||
#include "Texture.h"
|
||||
#include "Skeleton.h"
|
||||
|
||||
#include "boost\endian\buffers.hpp"
|
||||
|
||||
|
||||
|
||||
class RawModelCustom : public Resource
|
||||
{
|
||||
friend class ResourceManager;
|
||||
|
||||
protected:
|
||||
RawModelCustom(std::string fileName);
|
||||
|
||||
public:
|
||||
~RawModelCustom();
|
||||
|
||||
struct Vertex
|
||||
{
|
||||
glm::vec3 Position;
|
||||
glm::vec3 Normal;
|
||||
glm::vec3 Tangent;
|
||||
glm::vec3 BiNormal;
|
||||
glm::vec2 TextureCoords;
|
||||
glm::vec4 BoneIndices;
|
||||
glm::vec4 BoneWeights;
|
||||
};
|
||||
|
||||
struct MaterialGroup
|
||||
{
|
||||
float SpecularExponent;
|
||||
float ReflectionFactor;
|
||||
glm::vec4 DiffuseColor{ 1.0f, 1.0f, 1.0f, 1.0f };
|
||||
glm::vec4 SpecularColor{ 1.0f, 1.0f, 1.0f, 1.0f };
|
||||
glm::vec4 IncandescenceColor{ 1.0f, 1.0f, 1.0f, 1.0f };
|
||||
unsigned int StartIndex;
|
||||
unsigned int EndIndex;
|
||||
//float Transparency;
|
||||
std::string TexturePath;
|
||||
std::shared_ptr<::Texture> Texture;
|
||||
std::string NormalMapPath;
|
||||
std::shared_ptr<::Texture> NormalMap;
|
||||
std::string SpecularMapPath;
|
||||
std::shared_ptr<::Texture> SpecularMap;
|
||||
std::string IncandescenceMapPath;
|
||||
std::shared_ptr<::Texture> IncandescenceMap;
|
||||
};
|
||||
|
||||
std::vector<MaterialGroup> MaterialGroups;
|
||||
|
||||
std::vector<Vertex> m_Vertices;
|
||||
std::vector<unsigned int> m_Indices;
|
||||
Skeleton* m_Skeleton = nullptr;
|
||||
glm::mat4 m_Matrix;
|
||||
|
||||
private:
|
||||
|
||||
|
||||
void ReadMeshFile(std::string filePath);
|
||||
void ReadMeshFileHeader(std::size_t& offset, char* fileData);
|
||||
void ReadMesh(std::size_t& offset, char* fileData, const unsigned int& fileByteSize);
|
||||
void ReadVertices(std::size_t& offset, char* fileData, const unsigned int& fileByteSize);
|
||||
void ReadIndices(std::size_t& offset, char* fileData, const unsigned int& fileByteSize);
|
||||
|
||||
void ReadMaterialFile(std::string filePath);
|
||||
void ReadMaterials(std::size_t& offset, char* fileData, const unsigned int& fileByteSize);
|
||||
void ReadMaterialSingle(std::size_t& offset, char* fileData, const unsigned int& fileByteSize);
|
||||
|
||||
void ReadAnimationFile(std::string filePath);
|
||||
void ReadAnimationBindPoses(std::size_t& offset, char* fileData, const unsigned int& fileByteSize);
|
||||
void ReadAnimationJoint(std::size_t& offset, char* fileData, const unsigned int& fileByteSize);
|
||||
void ReadAnimationClips(std::size_t& offset, char* fileData, const unsigned int& fileByteSize, unsigned int numberOfClips);
|
||||
void ReadAnimationClipSingle(std::size_t& offset, char* fileData, const unsigned int& fileByteSize, unsigned int clipIndex);
|
||||
void ReadAnimationKeyFrame(std::size_t& offset, char* fileData, const unsigned int& fileByteSize, unsigned int numberOfJoints, Skeleton::Animation& animation);
|
||||
|
||||
//void CreateSkeleton(std::vector<std::tuple<std::string, glm::mat4>> &boneInfo, std::map<std::string, int> &boneNameMapping, aiNode* node, int parentID);
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
#include "RawModelAssimp.h"
|
||||
|
||||
#endif
|
||||
#endif
|
||||
@@ -14,7 +14,6 @@ struct RenderJob
|
||||
friend class RenderQueue;
|
||||
|
||||
public:
|
||||
|
||||
float Depth;
|
||||
|
||||
protected:
|
||||
|
||||
@@ -11,60 +11,47 @@
|
||||
#include "Camera.h"
|
||||
#include "RenderJob.h"
|
||||
#include "ModelJob.h"
|
||||
#include "TextJob.h"
|
||||
#include "PointLightJob.h"
|
||||
|
||||
|
||||
/*
|
||||
struct SpriteJob : RenderJob
|
||||
{
|
||||
unsigned int ShaderID = 0;
|
||||
unsigned int TextureID = 0;
|
||||
|
||||
glm::mat4 ModelMatrix;
|
||||
const Texture* DiffuseTexture = nullptr;
|
||||
const Texture* NormalTexture = nullptr;
|
||||
const Texture* SpecularTexture = nullptr;
|
||||
glm::vec4 Color;
|
||||
|
||||
void CalculateHash() override
|
||||
{
|
||||
Hash = TextureID;
|
||||
}
|
||||
};
|
||||
|
||||
struct PointLightJob : RenderJob
|
||||
{
|
||||
glm::vec4 Position;
|
||||
glm::vec4 Color;
|
||||
float Radius;
|
||||
float Intensity;
|
||||
float Falloff;
|
||||
float padding = 123;
|
||||
|
||||
void CalculateHash() override
|
||||
{
|
||||
Hash = 0;
|
||||
}
|
||||
};
|
||||
*/
|
||||
#include "DirectionalLightJob.h"
|
||||
#include "ExplosionEffectJob.h"
|
||||
|
||||
struct RenderScene
|
||||
{
|
||||
::Camera* Camera;
|
||||
std::list<std::shared_ptr<RenderJob>> ForwardJobs;
|
||||
std::list<std::shared_ptr<RenderJob>> PointLightJobs;
|
||||
::Camera* Camera = nullptr;
|
||||
struct Queues {
|
||||
std::list<std::shared_ptr<RenderJob>> OpaqueObjects;
|
||||
std::list<std::shared_ptr<RenderJob>> TransparentObjects;
|
||||
std::list<std::shared_ptr<RenderJob>> OpaqueShieldedObjects;
|
||||
std::list<std::shared_ptr<RenderJob>> TransparentShieldedObjects;
|
||||
std::list<std::shared_ptr<RenderJob>> ShieldObjects;
|
||||
std::list<std::shared_ptr<RenderJob>> PointLight;
|
||||
std::list<std::shared_ptr<RenderJob>> Text;
|
||||
std::list<std::shared_ptr<RenderJob>> DirectionalLight;
|
||||
} Jobs;
|
||||
|
||||
Rectangle Viewport;
|
||||
bool ClearDepth = false;
|
||||
glm::vec4 AmbientColor;
|
||||
|
||||
void Clear()
|
||||
{
|
||||
ForwardJobs.clear();
|
||||
PointLightJobs.clear();
|
||||
Jobs.OpaqueObjects.clear();
|
||||
Jobs.TransparentObjects.clear();
|
||||
Jobs.OpaqueShieldedObjects.clear();
|
||||
Jobs.TransparentShieldedObjects.clear();
|
||||
Jobs.ShieldObjects.clear();
|
||||
Jobs.Text.clear();
|
||||
Jobs.DirectionalLight.clear();
|
||||
}
|
||||
};
|
||||
|
||||
struct RenderFrame
|
||||
{
|
||||
public:
|
||||
//TODO: Getters
|
||||
GLfloat Gamma = 2.2f;
|
||||
GLfloat Exposure = 1.f;
|
||||
|
||||
void Add(RenderScene &scene)
|
||||
{
|
||||
@@ -94,5 +81,4 @@ public:
|
||||
private:
|
||||
int m_Size = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -2,6 +2,7 @@
|
||||
#define RenderState_h__
|
||||
|
||||
#include <functional>
|
||||
#include <boost/range/adaptor/reversed.hpp>
|
||||
#include "../Common.h"
|
||||
#include "../OpenGL.h"
|
||||
#include "../GLM.h"
|
||||
@@ -16,10 +17,13 @@ public:
|
||||
bool Disable(GLenum cap);
|
||||
bool CullFace(GLenum mode);
|
||||
bool ClearColor(glm::vec4 color);
|
||||
bool Clear(GLbitfield mask);
|
||||
bool BindFramebuffer(GLint framebuffer);
|
||||
bool BlendEquation(GLenum mode);
|
||||
bool BlendFunc(GLenum sfactor, GLenum dfactor);
|
||||
bool StencilOp(GLenum sfail, GLenum dpfail, GLenum dppass);
|
||||
bool StencilFunc(GLenum func, GLint ref, GLuint mask);
|
||||
bool StencilMask(GLuint mask);
|
||||
bool DepthMask(GLboolean flag);
|
||||
|
||||
private:
|
||||
std::vector<std::function<void(void)>> m_ResetFunctions;
|
||||
|
||||
@@ -15,41 +15,39 @@
|
||||
#include "Renderer.h"
|
||||
#include "PointLightJob.h"
|
||||
#include "../Core/Transform.h"
|
||||
#include "DebugCameraInputController.h"
|
||||
#include "../Core/EPlayerSpawned.h"
|
||||
|
||||
class RenderSystem : public ImpureSystem
|
||||
{
|
||||
public:
|
||||
RenderSystem(EventBroker* eventBrokerer, const IRenderer* renderer, RenderFrame* renderFrame);
|
||||
RenderSystem(World* world, EventBroker* eventBrokerer, const IRenderer* renderer, RenderFrame* renderFrame);
|
||||
~RenderSystem();
|
||||
|
||||
virtual void Update(World* world, double dt) override;
|
||||
virtual void Update(double dt) override;
|
||||
|
||||
private:
|
||||
World* m_World = nullptr;
|
||||
const IRenderer* m_Renderer;
|
||||
|
||||
RenderFrame* m_RenderFrame;
|
||||
bool m_SwitchCamera = false;
|
||||
Camera* m_Camera;
|
||||
DebugCameraInputController<RenderSystem>* m_DebugCameraInputController;
|
||||
|
||||
std::list<ComponentWrapper> m_CameraComponents;
|
||||
World* m_World;
|
||||
EntityWrapper m_CurrentCamera = EntityWrapper::Invalid;
|
||||
EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
|
||||
|
||||
EventRelay<RenderSystem, Events::SetCamera> m_ESetCamera;
|
||||
bool OnSetCamera(const Events::SetCamera &event);
|
||||
EntityID m_CurrentCamera = EntityID_Invalid;
|
||||
|
||||
void switchCamera(EntityID entity);
|
||||
|
||||
void updateCamera(World* world, double dt);
|
||||
void updateProjectionMatrix(ComponentWrapper& cameraComponent);
|
||||
|
||||
void fillModels(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
||||
void fillLight(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
||||
|
||||
bool OnSetCamera(Events::SetCamera &event);
|
||||
EventRelay<RenderSystem, Events::InputCommand> m_EInputCommand;
|
||||
bool OnInputCommand(const Events::InputCommand& e);
|
||||
EventRelay<RenderSystem, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||
bool OnPlayerSpawned(Events::PlayerSpawned& e);
|
||||
|
||||
void fillModels(RenderScene::Queues &jobs);
|
||||
void fillText(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
||||
void fillPointLights(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
||||
void fillDirectionalLights(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
||||
void fillLight(std::list<std::shared_ptr<RenderJob>>& jobs);
|
||||
bool isChildOfACamera(EntityWrapper entity);
|
||||
bool isChildOfCurrentCamera(EntityWrapper entity);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -11,20 +11,23 @@
|
||||
#include "FrameBuffer.h"
|
||||
#include "../Core/World.h"
|
||||
#include "PickingPass.h"
|
||||
#include "DrawScenePass.h"
|
||||
#include "LightCullingPass.h"
|
||||
#include "DrawFinalPass.h"
|
||||
#include "DrawScreenQuadPass.h"
|
||||
#include "DrawBloomPass.h"
|
||||
#include "DrawColorCorrectionPass.h"
|
||||
#include "../Core/EventBroker.h"
|
||||
#include "ImGuiRenderPass.h"
|
||||
#include "Camera.h"
|
||||
#include "../Core/Transform.h"
|
||||
#include "imgui/imgui.h"
|
||||
#include "TextPass.h"
|
||||
|
||||
class Renderer : public IRenderer
|
||||
{
|
||||
public:
|
||||
Renderer(EventBroker* eventBroker, World* world)
|
||||
Renderer(EventBroker* eventBroker)
|
||||
: m_EventBroker(eventBroker)
|
||||
, m_World(world)
|
||||
{ }
|
||||
|
||||
virtual void Initialize() override;
|
||||
@@ -36,7 +39,7 @@ public:
|
||||
private:
|
||||
//----------------------Variables----------------------//
|
||||
EventBroker* m_EventBroker;
|
||||
World* m_World;
|
||||
TextPass* m_TextPass;
|
||||
|
||||
Texture* m_ErrorTexture;
|
||||
Texture* m_WhiteTexture;
|
||||
@@ -45,11 +48,15 @@ private:
|
||||
Model* m_UnitQuad;
|
||||
Model* m_UnitSphere;
|
||||
|
||||
DrawScenePass* m_DrawScenePass;
|
||||
int m_DebugTextureToDraw = 0;
|
||||
|
||||
PickingPass* m_PickingPass;
|
||||
LightCullingPass* m_LightCullingPass;
|
||||
ImGuiRenderPass* m_ImGuiRenderPass;
|
||||
DrawFinalPass* m_DrawFinalPass;
|
||||
DrawScreenQuadPass* m_DrawScreenQuadPass;
|
||||
DrawBloomPass* m_DrawBloomPass;
|
||||
DrawColorCorrectionPass* m_DrawColorCorrectionPass;
|
||||
|
||||
//----------------------Functions----------------------//
|
||||
void InitializeWindow();
|
||||
@@ -59,14 +66,15 @@ private:
|
||||
//TODO: Renderer: Get InputUpdate out of renderer
|
||||
void InputUpdate(double dt);
|
||||
//void PickingPass(RenderQueueCollection& rq);
|
||||
void DrawScreenQuad(GLuint textureToDraw);
|
||||
//void DrawScreenQuad(GLuint textureToDraw);
|
||||
|
||||
static bool DepthSort(const std::shared_ptr<RenderJob> &i, const std::shared_ptr<RenderJob> &j) { return (i->Depth < j->Depth); }
|
||||
void FillDepth(RenderScene& scene);
|
||||
void SortRenderJobsByDepth(RenderScene &scene);
|
||||
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
|
||||
//--------------------ShaderPrograms-------------------//
|
||||
ShaderProgram* m_BasicForwardProgram;
|
||||
ShaderProgram* m_DrawScreenQuadProgram;
|
||||
ShaderProgram* m_BasicForwardProgram;
|
||||
ShaderProgram* m_ExplosionEffectProgram;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <sstream>
|
||||
#include "Common.h"
|
||||
#include "../GLM.h"
|
||||
#include <glm/gtx/matrix_decompose.hpp>
|
||||
|
||||
//struct Bone
|
||||
//{
|
||||
@@ -38,9 +39,9 @@ public:
|
||||
, OffsetMatrix(offsetMatrix)
|
||||
{ }
|
||||
|
||||
int ID;
|
||||
std::string Name;
|
||||
glm::mat4 OffsetMatrix;
|
||||
int ID;
|
||||
|
||||
Bone* Parent;
|
||||
std::vector<Bone*> Children;
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
#ifndef TextJob_h__
|
||||
#define TextJob_h__
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#include "../Common.h"
|
||||
#include "../GLM.h"
|
||||
#include "../Core/ComponentWrapper.h"
|
||||
#include "Texture.h"
|
||||
#include "RenderJob.h"
|
||||
#include "../Core/ResourceManager.h"
|
||||
#include "Font.h"
|
||||
|
||||
struct TextJob : RenderJob
|
||||
{
|
||||
TextJob(glm::mat4 matrix, Font* font, ComponentWrapper textComponent)
|
||||
: RenderJob()
|
||||
{
|
||||
Matrix = matrix;
|
||||
Color = (glm::vec4)textComponent["Color"];
|
||||
Content = (std::string)textComponent["Content"];
|
||||
Resource = font;
|
||||
|
||||
if ((int)textComponent["Alignment"] == textComponent["Alignment"].Enum("Left")) {
|
||||
Alignment = AlignmentEnum::Left;
|
||||
} else if ((int)textComponent["Alignment"] == textComponent["Alignment"].Enum("Right")) {
|
||||
Alignment = AlignmentEnum::Right;
|
||||
} else if ((int)textComponent["Alignment"] == textComponent["Alignment"].Enum("Center")) {
|
||||
Alignment = AlignmentEnum::Center;
|
||||
} else {
|
||||
LOG_ERROR("Text alignment invalid");
|
||||
Alignment = AlignmentEnum::Left;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
enum class AlignmentEnum
|
||||
{
|
||||
Left,
|
||||
Right,
|
||||
Center
|
||||
};
|
||||
|
||||
glm::mat4 Matrix;
|
||||
glm::vec4 Color;
|
||||
std::string Content;
|
||||
Font* Resource;
|
||||
AlignmentEnum Alignment;
|
||||
|
||||
|
||||
|
||||
void CalculateHash() override
|
||||
{
|
||||
Hash = 0;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,33 @@
|
||||
#ifndef TextRenderer_h__
|
||||
#define TextRenderer_h__
|
||||
|
||||
#include <ft2build.h>
|
||||
#include FT_FREETYPE_H
|
||||
|
||||
#include "../OpenGL.h"
|
||||
#include "../GLM.h"
|
||||
#include "ShaderProgram.h"
|
||||
#include "Font.h"
|
||||
#include "../Core/ResourceManager.h"
|
||||
#include "RenderQueue.h"
|
||||
#include "TextPassState.h"
|
||||
#include "FrameBuffer.h"
|
||||
|
||||
class TextPass
|
||||
{
|
||||
public:
|
||||
TextPass();
|
||||
void Initialize();
|
||||
void Update();
|
||||
void Draw(RenderScene& scene, FrameBuffer& frameBuffer);
|
||||
|
||||
private:
|
||||
void renderText(std::string text, Font* font, TextJob::AlignmentEnum alignment, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix);
|
||||
|
||||
Font* font;
|
||||
GLuint VAO, VBO;
|
||||
ShaderProgram* m_TextProgram;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,15 @@
|
||||
#ifndef TextPassState_h__
|
||||
#define TextPassState_h__
|
||||
|
||||
#include "Rendering/RenderState.h"
|
||||
|
||||
class TextPassState : public RenderState
|
||||
{
|
||||
public:
|
||||
TextPassState(GLuint frameBuffer);
|
||||
~TextPassState();
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -18,6 +18,7 @@ public:
|
||||
void Bind(GLenum textureUnit = GL_TEXTURE0);
|
||||
|
||||
GLuint m_Texture = 0;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
#ifndef CommonFuntions_h__
|
||||
#define CommonFuntions_h__
|
||||
|
||||
#include "../../Common.h"
|
||||
#include "../../OpenGL.h"
|
||||
#include "../../GLM.h"
|
||||
|
||||
class CommonFuntions
|
||||
{
|
||||
public:
|
||||
CommonFuntions() = delete;
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -9,7 +9,7 @@ inline bool _GLERROR(const char* info, const char* file, const char* func, unsig
|
||||
GLenum error = glGetError();
|
||||
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\nError code: %i, %s\n", info, error, gluErrorString(error));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
#include "Common.h"
|
||||
#include "Core/System.h"
|
||||
|
||||
class ExplosionEffectSystem : public PureSystem
|
||||
{
|
||||
public:
|
||||
ExplosionEffectSystem(World* world, EventBroker* eventBroker)
|
||||
: System(world, eventBroker)
|
||||
, PureSystem("ExplosionEffect")
|
||||
{ }
|
||||
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override
|
||||
{
|
||||
|
||||
if ((double)component["TimeSinceDeath"] > (double)component["ExplosionDuration"]) {
|
||||
(double)component["TimeSinceDeath"] = 0.f;
|
||||
}
|
||||
(double&)component["TimeSinceDeath"] += dt;
|
||||
|
||||
//if ((bool)Component["Gravity"] == true) {
|
||||
// (bool)Component["ExponentialAccelaration"] = false;
|
||||
//}
|
||||
}
|
||||
};
|
||||
+7
-3
@@ -14,12 +14,15 @@
|
||||
#include "Core/EKeyDown.h"
|
||||
#include "Core/EntityFilePreprocessor.h"
|
||||
#include "Core/SystemPipeline.h"
|
||||
#include "ExplosionEffectSystem.h"
|
||||
#include "Editor/EditorSystem.h"
|
||||
#include "Core/EntityFile.h"
|
||||
#include "Rendering/RenderSystem.h"
|
||||
#include "Core/EntityFileParser.h"
|
||||
#include "Core/Octree.h"
|
||||
|
||||
#include "Rendering/Font.h"
|
||||
#include "Systems/InterpolationSystem.h"
|
||||
#include "Collision/EntityAABB.h"
|
||||
// Network
|
||||
#include <boost/thread.hpp>
|
||||
#include "Network/Network.h"
|
||||
@@ -47,8 +50,9 @@ private:
|
||||
InputProxy* m_InputProxy;
|
||||
GUI::Frame* m_FrameStack;
|
||||
World* m_World;
|
||||
Octree<AABB>* m_OctreeCollision;
|
||||
Octree<AABB>* m_OctreeFrustrumCulling;
|
||||
Octree<EntityAABB>* m_OctreeCollision;
|
||||
Octree<EntityAABB>* m_OctreeTrigger;
|
||||
Octree<EntityAABB>* m_OctreeFrustrumCulling;
|
||||
SystemPipeline* m_SystemPipeline;
|
||||
RenderFrame* m_RenderFrame;
|
||||
// Network variables
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
#ifndef CapturePointSystem_h__
|
||||
#define CapturePointSystem_h__
|
||||
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <glm/common.hpp>
|
||||
|
||||
#include "Common.h"
|
||||
#include "Core/System.h"
|
||||
#include "Engine/Collision/ETrigger.h"
|
||||
#include "Core/ECaptured.h"
|
||||
#include "Core/EWin.h"
|
||||
|
||||
#include <tuple>
|
||||
#include <vector>
|
||||
|
||||
class CapturePointSystem : public PureSystem
|
||||
{
|
||||
public:
|
||||
//WARNING: on new map, destroy all info in the vectors, as well as reset all variables (just make new?)
|
||||
CapturePointSystem(World* world, EventBroker* eventBroker);
|
||||
|
||||
//updatecomponent
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& capturePoint, double dt) override;
|
||||
|
||||
private:
|
||||
//methods which will take care of specific events
|
||||
EventRelay<CapturePointSystem, Events::TriggerTouch> m_ETriggerTouch;
|
||||
bool CapturePointSystem::OnTriggerTouch(const Events::TriggerTouch& e);
|
||||
EventRelay<CapturePointSystem, Events::TriggerLeave> m_ETriggerLeave;
|
||||
bool CapturePointSystem::OnTriggerLeave(const Events::TriggerLeave& e);
|
||||
EventRelay<CapturePointSystem, Events::Captured> m_ECaptured;
|
||||
bool CapturePointSystem::OnCaptured(const Events::Captured& e);
|
||||
|
||||
bool m_WinnerWasFound = false;
|
||||
//need to track these variables for the captureSystem to work as per design!
|
||||
const int m_NotACapturePoint = 999;
|
||||
int m_RedTeamNextPossibleCapturePoint = m_NotACapturePoint;
|
||||
int m_BlueTeamNextPossibleCapturePoint = m_NotACapturePoint;
|
||||
int m_RedTeamHomeCapturePoint = m_NotACapturePoint;
|
||||
int m_BlueTeamHomeCapturePoint = m_NotACapturePoint;
|
||||
|
||||
int m_NumberOfCapturePoints = 0;
|
||||
std::map<int, EntityWrapper> m_CapturePointNumberToEntityMap;
|
||||
|
||||
//std::vector<ComponentWrapper>
|
||||
|
||||
const double m_CaptureTimeToTakeOver = 15.0;
|
||||
bool m_ResetTimers = false;
|
||||
|
||||
//vectors which will keep track of enter/leave changes
|
||||
std::vector<std::tuple<EntityWrapper, EntityWrapper>> m_ETriggerTouchVector;
|
||||
std::vector<std::tuple<EntityWrapper, EntityWrapper>> m_ETriggerLeaveVector;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -12,21 +12,22 @@
|
||||
|
||||
#include <tuple>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
class HealthSystem : public PureSystem
|
||||
{
|
||||
public:
|
||||
HealthSystem(EventBroker* eventBroker);
|
||||
HealthSystem(World* world, EventBroker* eventBroker);
|
||||
|
||||
//updatecomponent
|
||||
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
||||
|
||||
private:
|
||||
//methods which will take care of specific events
|
||||
EventRelay<HealthSystem, Events::PlayerDamage> m_EPlayerDamage;
|
||||
bool HealthSystem::OnPlayerDamaged(const Events::PlayerDamage& e);
|
||||
bool HealthSystem::OnPlayerDamaged(Events::PlayerDamage& e);
|
||||
EventRelay<HealthSystem, Events::PlayerHealthPickup> m_EPlayerHealthPickup;
|
||||
bool HealthSystem::OnPlayerHealthPickup(const Events::PlayerHealthPickup& e);
|
||||
bool HealthSystem::OnPlayerHealthPickup(Events::PlayerHealthPickup& e);
|
||||
|
||||
//vector which will keep track of health changes
|
||||
std::vector<std::tuple<EntityID, double>> m_DeltaHealthVector;
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
#ifndef Systems_InterpolationSystem_h__
|
||||
#define Systems_InterpolationSystem_h__
|
||||
|
||||
#include <queue>
|
||||
#include <unordered_map>
|
||||
#include <boost/shared_array.hpp>
|
||||
#include <glm/common.hpp>
|
||||
#include <glm/gtc/quaternion.hpp>
|
||||
|
||||
#include "Common.h"
|
||||
#include "Core/System.h"
|
||||
#include "Core/EventBroker.h"
|
||||
#include "Core/ResourceManager.h"
|
||||
#include "Core/ConfigFile.h"
|
||||
#include "Core/EPlayerSpawned.h"
|
||||
|
||||
#include "Network/EInterpolate.h"
|
||||
|
||||
class InterpolationSystem : public PureSystem
|
||||
{
|
||||
struct Transform
|
||||
{
|
||||
glm::vec3 Position;
|
||||
glm::vec3 Scale;
|
||||
glm::quat Orientation;
|
||||
float interpolationTime;
|
||||
};
|
||||
public:
|
||||
InterpolationSystem(World* world, EventBroker* eventBroker);
|
||||
~InterpolationSystem() { }
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& transform, double dt) override;
|
||||
private:
|
||||
std::unordered_map<EntityID, Transform> m_NextTransform;
|
||||
std::unordered_map<EntityID, Transform> m_LastReceivedTransform;
|
||||
EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
|
||||
|
||||
//glm::vec3 vectorInterpolation(glm::vec3 prev, glm::vec3 next, double currentTime);
|
||||
template <typename T>
|
||||
T vectorInterpolation(T prev, T next, double currentTime)
|
||||
{
|
||||
T difference = next - prev;
|
||||
T vector = (difference / m_SnapshotInterval) * static_cast<float>(currentTime);
|
||||
return vector;
|
||||
}
|
||||
float m_SnapshotInterval;
|
||||
|
||||
EventRelay<InterpolationSystem, Events::Interpolate> m_EInterpolate;
|
||||
bool InterpolationSystem::OnInterpolate(const Events::Interpolate& e);
|
||||
EventRelay<InterpolationSystem, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||
bool OnPlayerSpawned(Events::PlayerSpawned& e);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,21 @@
|
||||
#ifndef LifetimeSystem_h__
|
||||
#define LifetimeSystem_h__
|
||||
|
||||
#include "Core/System.h"
|
||||
|
||||
class LifetimeSystem : public ImpureSystem, PureSystem
|
||||
{
|
||||
public:
|
||||
LifetimeSystem(World* world, EventBroker* eventBroker)
|
||||
: System(world, eventBroker)
|
||||
, PureSystem("Lifetime")
|
||||
{ }
|
||||
|
||||
virtual void Update(double dt) override;
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cLifetime, double dt) override;
|
||||
|
||||
private:
|
||||
std::vector<EntityWrapper> m_Deletions;
|
||||
};
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user