Compare commits

...

384 Commits

Author SHA1 Message Date
Tleety b81f2b3240 WIP Bloom 2016-02-10 15:00:12 +01:00
Tleety 03d77beff9 MipMapping all textures 2016-02-10 10:46:27 +01:00
Tleety 64e7bb1e94 Good looking blur, need some fixes, but framerates takes a huge hit. 2016-02-09 16:19:17 +01:00
Tleety a33cd42ca3 WIP 2016-02-08 17:53:31 +01:00
Tleety 9055d5f697 Bugfix 2016-02-08 15:22:28 +01:00
Tleety 971beb29d8 Merge remote-tracking branch 'origin/master' into DefenderShield
# Conflicts:
#	resources/Schema/Components.xsd
2016-02-08 12:30:41 +01:00
Tleety 2ee21e05d4 Fixed so that Shielded objects can be picked. Shield objects can not however, so they will not be able to be picked in editor either. 2016-02-08 12:29:41 +01:00
William Moberg 5987751add Merge pull request #81 from teamfisk/HealthPickup
Health pickup
2016-02-08 11:50:47 +01:00
Tleety 94b59af973 Defender shield should now be working 2016-02-08 11:47:35 +01:00
Jace 70f8237a16 Merge pull request #60 from teamfisk/3rdPersonDeathCam
3rd person death cam
2016-02-08 11:39:57 +01:00
Jace 99cbdd3c1e Player death effect fixes 2016-02-08 11:39:29 +01:00
verysecrethero ce22854168 HealthPickups are now based on a percentage of player maxhealth. You can no longer pickup healthpacks if you are at max health. You can no longer gain more than maxHealth. 2016-02-08 11:22:28 +01:00
Jace 35b0193f15 Merge pull request #72 from teamfisk/BoxModelCollision
Collision in test phase
2016-02-08 10:29:41 +01:00
verysecrethero f8e514d21e Merge remote-tracking branch 'origin/master' into HealthPickup 2016-02-08 10:22:35 +01:00
verysecrethero fad25c6e16 Merge remote-tracking branch 'origin/master' into 3rdPersonDeathCam
# Conflicts:
#	include/Engine/Core/EPlayerHealthPickup.h
2016-02-08 10:21:30 +01:00
verysecrethero 4103c878ec Refactoring: Changed HealthPickupSystem to use a struct instead. Removed the Id in EPickupSpawned 2016-02-05 18:05:46 +01:00
William Moberg 40788c7400 Merge pull request #80 from teamfisk/DashFixBranch
Miscellaneous small fixes: For Tests, CapturePoint xml file, HealthSy…
2016-02-05 18:04:15 +01:00
William Moberg 59bdc614f2 Put SpecialAbility on left shift, and Sprint on left shift in DefaultInput. 2016-02-05 17:34:19 +01:00
verysecrethero be628d9406 Merge remote-tracking branch 'origin/master' into HealthPickup
# Conflicts:
#	resources/Schema/Components.xsd
2016-02-05 16:23:22 +01:00
verysecrethero 66f442f1af Added HealthGain to HealthPickup component. Changed PickupSpawnSystem so it copies the values from the old to the new entity. 2016-02-05 16:13:59 +01:00
verysecrethero 2542397511 Miscellaneous small fixes: For Tests, CapturePoint xml file, HealthSystem, DashAbility xml file. 2016-02-05 15:35:51 +01:00
William Moberg 7641ba49c7 Weapon doesn't explode in first person. 2016-02-05 15:16:24 +01:00
verysecrethero fe6fd0bbe3 PickupSpawnSystem now spawns a new HealthPickup after the respawnTimer is up. Added HealthPickup.xml entity. Event PickupSpawned now gets published when a new HealthPickup spawns. Player now gains health as he picks up the HealthPickup. 2016-02-05 15:15:04 +01:00
William Moberg e3a44d37d2 Merge branch 'master' into BoxModelCollision
# Conflicts:
#	src/Game/Systems/PlayerMovementSystem.cpp
2016-02-05 14:59:14 +01:00
William Moberg 428dca003d Tiny bug fix. 2016-02-05 14:40:50 +01:00
William Moberg 4fe9e4f1c3 Debug cleanup and some bug fixes. 2016-02-05 14:38:08 +01:00
William Moberg d61e605093 Can walk up "stair-steps". Cleanup WIP.
Better performance in RectanglevsTriangle check.
Added IsOnGround flag and VerticalStepHeight in Physics.
Lotsa commented code saved for historical reasons, remove later.
2016-02-05 10:56:34 +01:00
Tleety c526a7af55 WIP stencil stuff 2016-02-04 17:58:36 +01:00
verysecrethero 6a23a987b3 Started PickupSpawnSystem, added 2 events and a system 2016-02-04 17:43:45 +01:00
Tleety 7c582898f4 Working stencil buffer for the shield. 2016-02-04 14:33:39 +01:00
Jace ff26e1235c Merge pull request #77 from teamfisk/AMDCrashFix
AMD crash fix???????????
2016-02-04 12:05:05 +01:00
Jace 6990e473b3 Adding a clear here makes AMD drivers NOT crash for some reason. We're fixing the symptom but not the underlying cause. 2016-02-04 11:53:35 +01:00
Jace c87e4d4fd6 Added mutex to resource manager cache reading to avoid a potential race condition. We hope this is the actual bug we saw. 2016-02-04 11:53:11 +01:00
verysecrethero d4292d4b43 Merge pull request #63 from teamfisk/AssaultDash
Added AssaultDash
2016-02-04 11:50:00 +01:00
verysecrethero 035c79564b Changed Dash name to DashAbility. Fixed dash bug where you could do two different keys to dash. 2016-02-04 11:41:21 +01:00
Tleety 379d211832 some fixes with the stencil states and implemented stencil func/stencilop/stencilmask to renderstate 2016-02-04 11:13:26 +01:00
verysecrethero 03a16b46b5 Dash component now has the dash-maxCoolDownVariable in it. 2016-02-04 10:28:28 +01:00
verysecrethero 0bbaf1d576 Oops! Removed DebugCode... 2016-02-04 10:04:44 +01:00
Tleety bc01e147c2 Some state stuff, some draw stuff, some QA map stuff 2016-02-03 18:09:44 +01:00
verysecrethero 1bd4aa91ff Oops! Readded "Sprint" command. Removed some unnecessary variables in FirstPersonInputController. Fixed bug where you couldnt dash right away as the game started. 2016-02-03 17:45:37 +01:00
verysecrethero 7b5a2a5388 Dashing now works great both with shift and doubletap. Added Dash Component. Changed default Player.xml to have a Dash Component. Disabled Sprint. You can now disable DoubleTapToDash in Input.Ini. Added command "SpecialAbility". 2016-02-03 17:30:46 +01:00
Jace bd2da7bc9f Revert "Revert "Merge pull request #75 from teamfisk/NormalSpecularMapping""
This reverts commit b56824786c.
2016-02-03 16:30:00 +01:00
Jace b56824786c Revert "Merge pull request #75 from teamfisk/NormalSpecularMapping"
This reverts commit 192de80782, reversing
changes made to 24aac6a00d.
2016-02-03 16:16:06 +01:00
verysecrethero 13161b4f57 Merge remote-tracking branch 'origin/master' into AssaultDash 2016-02-03 15:07:19 +01:00
Tleety 5665c0f298 Models with Shield and shielded component now added to queues 2016-02-03 14:20:47 +01:00
Tleety 7ffbd8455f Added Queues for the models with shield and shielded components. 2016-02-03 13:53:57 +01:00
Tleety 83713b3b6d Renamde ShieldComponent since Component should not be in the name. Added Shielded component that will be put on objects that should be hidden behind shields. 2016-02-03 13:27:46 +01:00
Tleety 7bae2d0873 Added a ShieldComponent and a test area in QA map for defender shield 2016-02-03 11:58:06 +01:00
verysecrethero 9d3171540d AssaultDashCheck is now in FirstPersonInputController instead. TODO: config option, shift button, forward/backward dash 2016-02-03 11:54:14 +01:00
verysecrethero 2391a0dbe9 Merge remote-tracking branch 'origin/master' into AssaultDash 2016-02-03 11:51:26 +01:00
verysecrethero 2961f198b3 PlayerDeathSystem is now working well. Changed so the model is oriented correctly. Changed so camera is behind the player. Copied the current animation and froze it. 2016-02-03 11:48:22 +01:00
Tleety 455e59a04f Made the TEMPORARY capture point boxes transparent. 2016-02-03 11:39:18 +01:00
verysecrethero 39653a1e4c Merge remote-tracking branch 'origin/master' into 3rdPersonDeathCam 2016-02-03 10:38:21 +01:00
Jace 2cbeef4c69 Merge pull request #74 from teamfisk/Warnings-Jocke
Fixed warnings associated with Network
2016-02-03 10:37:10 +01:00
Jace 192de80782 Merge pull request #75 from teamfisk/NormalSpecularMapping
Normal specular mapping
2016-02-03 10:34:22 +01:00
Tleety 51a588657e QA map change 2016-02-03 10:11:53 +01:00
verysecrethero 73ab9bb4c6 Merge remote-tracking branch 'origin/master' into AssaultDash
# Conflicts:
#	src/Game/Systems/PlayerMovementSystem.cpp
2016-02-03 09:52:54 +01:00
Tleety 73716c28e2 pickpass fix 2016-02-02 17:40:22 +01:00
Tleety a3b7bd7df5 Fix in picking pass, QA map fix. Blue and red ray change. Player weapon change. 2016-02-02 17:39:57 +01:00
William Moberg c4fb604617 Merge branch 'BoxModelCollision' of github.com:teamfisk/TacticalZ into BoxModelCollision 2016-02-02 17:36:50 +01:00
William Moberg 214dad2afc Removed commented code. 2016-02-02 17:25:59 +01:00
William Moberg affcc5305b Collision affects velocity correctly, no wierd ice cream sliding along walls. 2016-02-02 17:19:59 +01:00
Tleety 11025b5466 QA-map stuff 2016-02-02 17:19:58 +01:00
verysecrethero 5e472cd69c DeathExplosion is now an XML file, changed PlayerDeathSystem accordingly. The effect should show as soon as the explosioneffect-fix is merged into master. TODO: remove the test 2016-02-02 17:18:12 +01:00
Tleety eba36b8492 Some QA-map fixes 2016-02-02 17:12:14 +01:00
Tleety 55854f5c0d Merge remote-tracking branch 'origin/master' into NormalSpecularMapping 2016-02-02 16:30:57 +01:00
Tleety 12a181c1ff Fixed a bug where normals scaled with model scale. Again. 2016-02-02 16:11:03 +01:00
Tleety b131f56f5e Made a quality assurance world that will need to be used before creating a pull request 2016-02-02 16:06:42 +01:00
Jace 24aac6a00d Merge pull request #62 from teamfisk/DoubleJump
You can now DoubleJump!
2016-02-02 15:31:03 +01:00
verysecrethero 7236da09b4 Merge remote-tracking branch 'origin/master' into 3rdPersonDeathCam 2016-02-02 15:13:00 +01:00
verysecrethero 45a92b362f DoubleJumping now in InputController instead. 2016-02-02 15:10:11 +01:00
verysecrethero 2085d9ec9e Merge remote-tracking branch 'origin/master' into DoubleJump 2016-02-02 14:22:00 +01:00
Jocke 6a3f585fb9 Fixed warnings associated with Network.cpp, Client.cpp, Server.cpp and Packet.cpp.
BOOST_ASIO_ERROR_CATEGORY_NOEXCEPT': macro redefinition was fixed by https://svn.boost.org/trac/boost/ticket/11539
2016-02-02 13:26:15 +01:00
Tleety 7b4826cb44 Merge remote-tracking branch 'origin/master' into NormalSpecularMapping 2016-02-02 13:24:31 +01:00
Tleety 28d412f5c7 Some small changes to test world and assets 2016-02-02 13:24:18 +01:00
Jace 0e5f6da9a9 Merge pull request #73 from teamfisk/CapturePointFixBranch
Several changes/fixes based on the latest broken refactoring in master
2016-02-02 13:22:03 +01:00
Jace 563fd4082e Updated movement test for model collisions 2016-02-02 12:10:39 +01:00
verysecrethero 42b52a6766 Several changes/fixes based on the latest broken refactoring.
Fixed Simon's mistake in CapturePointLogic. William fixed so TriggerSystem works again with CapturePoints.
2016-02-02 11:37:22 +01:00
Tleety 9c2e459e0c Deatheffect color now correctly calculated 2016-02-02 10:58:00 +01:00
William Moberg 796e3eac79 Merge branch 'master' into BoxModelCollision 2016-02-02 10:16:48 +01:00
Tleety 8299b99e2f Test world changes and some other small fixes 2016-02-01 19:08:46 +01:00
Tleety c708f1582c Merge remote-tracking branch 'origin/master' into NormalSpecularMapping 2016-02-01 18:30:30 +01:00
Tleety 782c1a388a Comment 2016-02-01 18:23:40 +01:00
Tleety a188a3f7fa Removed widget pointlight since it is now redundant 2016-02-01 18:22:36 +01:00
Tleety ed7d00c1d8 Bug where widgets did not get their ambient light now fixed. 2016-02-01 18:19:38 +01:00
William Moberg 30b1dab764 More efficient collision resolution case + comments. 2016-02-01 18:06:28 +01:00
Jace 9090be8acf Merge branch 'Warnings-Simon' 2016-02-01 17:53:55 +01:00
Jace a3d4eb65d5 Fixes #66 warnings 2016-02-01 17:53:01 +01:00
Jace 9b2a4be707 Merge pull request #71 from teamfisk/Warnings-Adam
Warnings adam
2016-02-01 17:52:18 +01:00
stiffly 5474a18753 #68 Fixed warning in SoundSystem.cpp 2016-02-01 17:15:51 +01:00
William Moberg 5a45f778e6 Fixed so players don't teleport to (NaN, NaN, NaN) on spawning. 2016-02-01 17:01:58 +01:00
Tleety 53cae25eb2 WIP on widget fuckery 2016-02-01 16:56:55 +01:00
Jace 0a43f8104e Added _CRT_SECURE_NO_WARNINGS definition compiling with MSVC 2016-02-01 16:31:01 +01:00
William Moberg 30ad238697 Merge branch 'master' into BoxModelCollision 2016-02-01 16:17:10 +01:00
William Moberg 3cfbbbbf54 CollisionSystem now utilizes Octree for collision detection. 2016-02-01 16:13:48 +01:00
Adam Byléhn ca8b7cbee8 Merge pull request #65 from teamfisk/EditorUsefulness
Editor usefulness
2016-02-01 16:13:37 +01:00
Jace be3cfef65f Merge remote-tracking branch 'origin/master' into EditorUsefulness
# Conflicts:
#	src/Engine/Rendering/DrawFinalPass.cpp
2016-02-01 16:00:46 +01:00
Jace 65f5bc673f Functional translation widget in global and local space 2016-02-01 15:47:56 +01:00
William Moberg d7b02e79c8 Merge branch 'master' into BoxModelCollision
# Conflicts:
#	include/Engine/Collision/CollisionSystem.h
#	src/Engine/Collision/CollisionSystem.cpp
2016-02-01 13:48:05 +01:00
Jace a22bc00d46 *cough* 2016-02-01 13:37:51 +01:00
William Moberg 76274c326e Fixed going through flat large triangles. Velocity affected by collision. 2016-02-01 13:34:39 +01:00
Jace 5bfcffc142 Fixed widget movement calculations going weird when world origin wasn't on screen 2016-02-01 11:56:21 +01:00
Tleety 7054822be2 SceneLight component now working 2016-02-01 11:12:03 +01:00
Jace ee92200300 Improved editor pause logic. Editor now pauses when it's enabled and makes sure UI is up to date with the current state. 2016-02-01 10:45:37 +01:00
Jace d3b1053f21 Fixes #59 2016-02-01 10:29:59 +01:00
verysecrethero 7987d4b27c Added AssaultDash and all its logic, including a doubletapkey. Doubletapkey could be made more generic. 2016-01-29 12:06:14 +01:00
verysecrethero 0c97ce7a4a You can now DoubleJump! 2016-01-29 10:12:49 +01:00
verysecrethero df05f1909b Completed the code to trigger the 3rd person camera on death. Cleaned up PlayerDeathSystem. Fixed HealthSystemTest. Removed the test for PlayerDeathSystem 2016-01-28 11:43:38 +01:00
Jace 13f020ddf5 Fixed #49 being able to parent an entity to itself, which resulted in infinite infinite loops everywhere! D: 2016-01-27 18:37:43 +01:00
Tleety 8bcafc1151 WIP 2016-01-27 18:07:05 +01:00
verysecrethero 7497ff39d2 Simon added Copy method to ComponentWrapper. Its being used in PlayerDeathSystem to copy model,animation,transform. TODO: 3rd person camera, cleanup, tests 2016-01-27 18:00:31 +01:00
Jace 65da634c71 File dropping into resource paths in the editor 2016-01-27 17:51:47 +01:00
Tleety 97cbc55223 Some debug features for color corrections and glow strength fix. 2016-01-27 17:21:00 +01:00
Jace c519ba2536 Component fields in the editor are now sorted in the order they're defined 2016-01-27 17:12:07 +01:00
Jace 4b7613a659 Sorted editor component dropdown and made it always be fully expanded to show as many components as possible 2016-01-27 17:07:48 +01:00
Jace 7408da401b Merge pull request #56 from teamfisk/NormalSpecularMapping
Transparency fix and support for Normal and Specular maps
2016-01-27 16:44:10 +01:00
Tleety a63ecb8133 Some wierd shader faults and merge error fixe 2016-01-27 15:54:36 +01:00
Jace 788407b709 Made CollisionSystem aware of entities 2016-01-27 15:42:50 +01:00
Tleety 0e70dc6fa3 Merge remote-tracking branch 'origin/master' into NormalSpecularMapping
# Conflicts:
#	include/Engine/Rendering/RenderSystem.h
#	src/Engine/Rendering/DrawFinalPass.cpp
#	src/Engine/Rendering/RenderSystem.cpp
2016-01-27 15:41:31 +01:00
Tleety 44302bb0f3 Specular support. Some edits to EditorTestWorld.xml aswell as some debugmodes for textures in the model component 2016-01-27 15:38:54 +01:00
Jace 181017313d Made entity parser give more useful errors and fixed the errors that were while I was at it 2016-01-27 15:16:59 +01:00
Jace 6615fe9438 Enabled multithreaded build for MSVC 2016-01-27 15:09:34 +01:00
Jace 113448dbf0 Added DEBUG preprocessor definition in Debug and RelWithDebInfo mode 2016-01-27 15:09:23 +01:00
verysecrethero 5cdf6db340 Modified HealthSystem so it actually publishes the DeathEvent. Modified EPlayerHealthPickup. Fixed 2 tests. Started work on PlayerDeathSystem 2016-01-27 14:46:45 +01:00
Tleety 5c9616d4af Fixed asset name 2016-01-27 13:55:23 +01:00
Tleety a954cbbf50 Normal map support 2016-01-27 13:52:27 +01:00
Jace dec2234019 Merge branch 'Cleanup'
# Conflicts:
#	src/Engine/Rendering/RenderSystem.cpp
2016-01-27 13:44:15 +01:00
Jace 0334ec3fa7 Merge remote-tracking branch 'origin/Animations'
# Conflicts:
#	src/Engine/Rendering/DrawFinalPass.cpp
#	src/Game/Systems/WeaponSystem.cpp
2016-01-27 13:36:49 +01:00
Jace 5fcd26cd3e Made TriggerSystem make use of Octree 2016-01-27 13:35:16 +01:00
Tleety 8102f3a2ea Working transparency in most common cases.
Transparency check is automatically set if the alpha color value is under 1
2016-01-27 12:59:44 +01:00
Tleety cbb17d22d4 WIP 2016-01-27 12:10:00 +01:00
Jace 8bed5194d8 "Proper" handling of conditional rendering of entities parented to camera or entities that should be hidden from the active local player perspective 2016-01-27 11:36:24 +01:00
William Moberg 90f05442aa Merge branch 'master' into BoxModelCollision
# Conflicts:
#	include/Engine/Core/Octree.h
#	resources/Schema/Entities/CollisionTestLevel.xml
#	src/Engine/Collision/CollisionSystem.cpp
#	src/Engine/Core/Octree.cpp
2016-01-27 10:52:27 +01:00
Jace eb42217885 Merge pull request #38 from teamfisk/CoolDeathAnimation
Cool death animation
2016-01-27 10:51:22 +01:00
Jace 7e12d00874 Merge branch 'master' into CoolDeathAnimation
# Conflicts:
#	include/Engine/Rendering/ModelJob.h
#	resources/Shaders/ForwardPlus.frag.glsl
#	src/Engine/Rendering/DrawFinalPass.cpp
#	src/Engine/Rendering/RenderSystem.cpp
2016-01-27 10:43:23 +01:00
William Moberg 6ea490e215 Tried a horrible recursive method, extreme framedrop. 2016-01-27 10:34:26 +01:00
Jace 505a6c7396 Hiding first person models properly 2016-01-25 14:32:48 +01:00
Jace 8866dd6054 Merge remote-tracking branch 'origin/Networking' into ShootRays 2016-01-25 11:57:44 +01:00
Jace b6fd18baed Hacked in serverside effects 2016-01-25 11:56:40 +01:00
Jace 4245264029 Weapon RayZ
Weapon RayZ
2016-01-25 11:26:33 +01:00
William Moberg 3389b965eb Test on game level v1. 2016-01-25 10:55:05 +01:00
viktorljung d12246833e Some further small fizes to resolution //Tobias 2016-01-25 01:26:41 +01:00
stiffly 44baa47bba Merge remote-tracking branch 'origin/master' into CoolDeathAnimation
# Conflicts:
#	include/Engine/Common.h
#	include/Engine/Rendering/DrawFinalPass.h
#	include/Engine/Rendering/DrawScenePass.h
#	include/Engine/Rendering/RenderQueue.h
#	include/Engine/Rendering/Renderer.h
#	resources/Shaders/ForwardPlus.frag.glsl
#	resources/Shaders/ForwardPlus.vert.glsl
#	src/Engine/Rendering/DrawFinalPass.cpp
#	src/Engine/Rendering/DrawScenePass.cpp
#	src/Engine/Rendering/RenderSystem.cpp
#	src/Engine/Rendering/Renderer.cpp
#	src/Game/Game.cpp
2016-01-25 01:21:15 +01:00
Jace b95c1fdfa4 Merge remote-tracking branch 'origin/Menu'
# Conflicts:
#	include/Engine/Rendering/ModelJob.h
#	resources/Schema/Components.xsd
#	resources/Schema/Entities/Player.xml
#	resources/Schema/Entities/RenderingWorld.xml
#	src/Game/Game.cpp
2016-01-25 00:25:03 +01:00
Jace 7b348379ac Quaternions are never the solution. 2016-01-25 00:22:55 +01:00
viktorljung 6aeb281249 Resolution fix in render stages //Tobias 2016-01-25 00:07:17 +01:00
Jace 04f6233d99 Crude animations 2016-01-24 23:44:29 +01:00
Jace d6cc1eaac4 Merge remote-tracking branch 'origin/Animations' 2016-01-24 23:06:59 +01:00
Jace d0de169613 Instagib! 2016-01-24 23:05:52 +01:00
viktorljung 79fe7693a6 picking values fixed 2016-01-24 23:05:45 +01:00
Jace b6ba8a5bd7 Network snapshot buffer size increased, needs to be looked over later 2016-01-24 23:05:26 +01:00
viktorljung f8b9606cdf Picking animation fix 2016-01-24 22:59:53 +01:00
viktorljung 84fddf02e2 Merge remote-tracking branch 'origin/master' into Animations 2016-01-24 22:42:12 +01:00
viktorljung d03b3fb071 Merge remote-tracking branch 'origin/master' into Menu
# Conflicts:
#	resources/Schema/Entities/Player.xml
2016-01-24 22:23:53 +01:00
viktorljung 7e92d6f53f Healthbar on player 2016-01-24 22:21:10 +01:00
Jace 47d2fb6a9b Fixed wrong drawing function used in PickingPass 2016-01-24 22:20:42 +01:00
stiffly 06f64f8fbf Added a player name to the PlayerSpawned event. When a player has spawned the server sends the name to the client which publishes the event. 2016-01-24 22:00:38 +01:00
Jace 0c56a05144 Merge branch 'master' of github.com:teamfisk/TacticalZ
# Conflicts:
#	resources/Schema/Entities/Player.xml
#	src/Engine/Network/Server.cpp
2016-01-24 21:21:51 +01:00
Jace 382eff169f Server refactoring to remove player dependency and lots of fixes. 2016-01-24 21:20:43 +01:00
viktorljung 0c557317a9 Merge remote-tracking branch 'origin/master' into Menu 2016-01-24 21:16:05 +01:00
viktorljung a304b00038 fixed crashes 2016-01-24 21:12:41 +01:00
William Moberg f1343e2f82 Collision may be working, kind of. 2016-01-24 21:08:42 +01:00
Tleety d4797b0808 Some entity files 2016-01-24 21:08:01 +01:00
viktorljung ada1bac2a7 Merge remote-tracking branch 'origin/master' into Menu
# Conflicts:
#	include/Engine/Rendering/RenderSystem.h
#	resources/Schema/Entities/RenderingWorld.xml
#	resources/Shaders/ForwardPlus.frag.glsl
#	src/Engine/Rendering/RenderSystem.cpp
2016-01-24 20:48:17 +01:00
Jace 25890c8d6c Merge remote-tracking branch 'origin/Networking' 2016-01-24 19:01:15 +01:00
Jace 0fb1dbcae1 Client now has authority over its own absolute position and orientation until we have reliable input messaging 2016-01-24 19:00:50 +01:00
Jace 9f3d887ac4 Networking bugfixes 2016-01-24 18:37:36 +01:00
Jace b4081b3e45 Merge remote-tracking branch 'origin/Networking'
# Conflicts:
#	src/Engine/Network/Client.cpp
#	src/Game/Systems/WeaponSystem.cpp
2016-01-24 18:36:37 +01:00
viktorljung 8cf9caf7aa AnimationSystem working 2016-01-24 18:31:23 +01:00
stiffly 8d61632c26 No longer spawns a f**king sphere. 2016-01-24 17:40:43 +01:00
stiffly 2eaad2aa00 Client now responds to deleted entity and component in server 2016-01-24 17:16:26 +01:00
Jace 235b26ad61 WIP shoot 2016-01-24 17:16:18 +01:00
viktorljung dd80323342 Merge remote-tracking branch 'origin/master' into Animations 2016-01-24 17:06:34 +01:00
viktorljung af2f017cb4 AnimationSystem base WIP 2016-01-24 17:05:34 +01:00
Viktor Ljung f80fb5eda8 Merge pull request #52 from teamfisk/Importer
Importer
2016-01-24 17:05:02 +01:00
antc13 aa115befa9 UnitRaptor is now displayed while models are being loaded in. 2016-01-24 17:04:12 +01:00
antc13 aa20b48188 Merge remote-tracking branch 'origin/master' into Importer
# Conflicts:
#	resources/Schema/Entities/MovementTest.xml
#	resources/Schema/Entities/Player.xml
2016-01-24 16:22:22 +01:00
antc13 96a735c542 Changed .obj to .mesh for all meshes. 2016-01-24 16:12:31 +01:00
Jace 3261e21d96 Coloring players depending on team and created a blue spawn in MovementTest 2016-01-24 15:46:01 +01:00
William Moberg c9dc9a3570 Merge branch 'master' into BoxModelCollision 2016-01-24 15:38:38 +01:00
William Moberg 910b3d10e4 WIP (false collisions), collision method expanded, not working. 2016-01-24 15:32:10 +01:00
antc13 666f1fd878 Removed temp variables & the "forced" animation in DrawFinalPass 2016-01-24 15:30:20 +01:00
Jace 373bb33cf0 Player jumping taking air acceleration into account 2016-01-24 15:20:34 +01:00
antc13 4c5d17b203 Merge remote-tracking branch 'origin/master' into Importer
# Conflicts:
#	resources/Schema/Entities/RenderingWorld.xml
#	resources/Shaders/ForwardPlus.frag.glsl
#	src/Engine/Editor/EditorSystem.cpp
#	src/Engine/Network/Server.cpp
#	src/Engine/Rendering/DrawFinalPass.cpp
#	src/Tests/OctTreeTestGameClass.cpp
#	src/Tests/OctTreeTestHardCodedTestWorld.h
#	src/Tests/ResourceManagerTest.cpp
2016-01-24 14:40:52 +01:00
antc13 8286d052b3 Changed color values from floats to glm::vec4 2016-01-24 14:38:17 +01:00
Jace aaa11d2109 Merge remote-tracking branch 'origin/master' into PlayerMovement 2016-01-24 14:18:23 +01:00
Jace 67477ff3ae EEntityDeleted and EComponentDeleted events published by World 2016-01-24 13:49:45 +01:00
viktorljung aa3b8cd652 Fixed text color and removed debugging code 2016-01-24 13:37:07 +01:00
antc13 b5b1140f5c Custom Animations should now work. We also save color values if there's no texture. 2016-01-24 13:28:40 +01:00
Jocke 7567f47a68 Weapon system now searches parents for health component (stops at first health component). 2016-01-24 11:56:46 +01:00
Jocke 97d70f8e32 Fixed in client for shoot event. Weapon system now damages health on any target not only players. 2016-01-24 11:36:01 +01:00
antc13 3baa988ad4 Changed .obj files to our own format. DummyScene.mesh may be broken. 2016-01-23 20:35:58 +01:00
Jace 1ce9128da8 Source-like movement 2016-01-23 19:45:23 +01:00
stiffly a28748b35d Merge remote-tracking branch 'origin/master' into Networking 2016-01-23 18:42:16 +01:00
William Moberg e6224a4e96 WIP (not working), attempt at separating axis theorem stuff. 2016-01-23 18:31:27 +01:00
viktorljung fcba0a28b8 Merge branch 'master' into Menu 2016-01-23 18:27:48 +01:00
Viktor Ljung 132de88d28 Merge pull request #50 from teamfisk/Forward+
Forward+
2016-01-23 18:23:16 +01:00
viktorljung df485ccf7b Merge branch 'master' into Forward+ 2016-01-23 18:21:35 +01:00
viktorljung 85a4d98c81 Revert "Revert "Merge pull request #43 from teamfisk/Forward+""
This reverts commit bd62b5873d.
2016-01-23 18:21:10 +01:00
viktorljung ef020a3770 Text fixed 2016-01-23 18:17:20 +01:00
viktorljung 160b7183b2 WIP 2016-01-23 18:07:07 +01:00
antc13 f1835fd89c Animations PROBABLY works fine if all joints got keyframes. 2016-01-23 18:02:42 +01:00
stiffly ecdb5ed07d Merge remote-tracking branch 'origin/master' into Networking 2016-01-23 17:51:06 +01:00
William Moberg 6eeb3ea524 WIP, Bug fix + nitpicks + optimizations. 2016-01-23 17:50:35 +01:00
Tleety 5edf5a41f1 Transparency bug fix 2016-01-23 16:45:26 +01:00
Jocke 6d2c656a04 Merge remote-tracking branch 'origin/Networking' into Networking 2016-01-23 16:41:42 +01:00
Jocke 2bf0434bcb Remade Snapshot logic from component based to entity based. 2016-01-23 16:40:38 +01:00
viktorljung ff6ec82a6c AMD fix 2016-01-23 16:27:01 +01:00
viktorljung bd62b5873d Revert "Merge pull request #43 from teamfisk/Forward+"
This reverts commit d59ab5aba2, reversing
changes made to bef95235d0.
2016-01-23 15:57:26 +01:00
viktorljung aacfc47fb5 Merge remote-tracking branch 'origin/master' into Menu
# Conflicts:
#	resources/Shaders/ForwardPlus.frag.glsl
#	src/Engine/Rendering/DrawFinalPass.cpp
2016-01-23 15:12:19 +01:00
Jace 666ef6589e Crouching! 2016-01-23 15:06:47 +01:00
Jace b83d773627 Infinite respawning for now 2016-01-23 15:06:41 +01:00
Viktor Ljung d59ab5aba2 Merge pull request #43 from teamfisk/Forward+
Bloom render pass and HDR colors
2016-01-23 14:58:10 +01:00
viktorljung 680a12d88f HealthMeter 2016-01-23 14:53:17 +01:00
Tleety f623232a2b Removed a temp variable. 2016-01-23 14:52:29 +01:00
William Moberg 71404c8828 Special case for collision vs ground (upward facing) triangles. 2016-01-23 14:01:54 +01:00
Tleety 6a18cb88af Merge remote-tracking branch 'origin/master' into Forward+
# Conflicts:
#	include/Engine/Rendering/Renderer.h
#	src/Engine/Rendering/PickingPass.cpp
#	src/Engine/Rendering/Renderer.cpp
2016-01-23 13:59:21 +01:00
Tleety b499f4b020 Fixed some rendering bugs and some code refactoring 2016-01-23 12:17:38 +01:00
Jace 482689fd48 fixup! Moved FirstPersonInputController implementation out of header 2016-01-23 12:16:40 +01:00
Jace 32f73201c5 Basic jumping! 2016-01-23 12:15:33 +01:00
Jace 3aeeb3cad5 Moved FirstPersonInputController implementation out of header 2016-01-23 12:15:32 +01:00
Jace 4d5cbb6057 fixup! Added EntityWrapper::IsChildOf and made snapshot interpolation and rendering exceptions for player less hacky 2016-01-23 12:14:29 +01:00
Jace bef95235d0 Merge pull request #41 from teamfisk/TextRendering
Text rendering
2016-01-23 11:51:11 +01:00
viktorljung 9a23d8887a Merge remote-tracking branch 'origin/master' into TextRendering
# Conflicts:
#	include/Engine/Rendering/RenderSystem.h
#	src/Engine/Rendering/RenderSystem.cpp
2016-01-23 11:48:10 +01:00
Jace db0e67b9bd Added EntityWrapper::IsChildOf and made snapshot interpolation and rendering exceptions for player less hacky 2016-01-23 11:44:16 +01:00
viktorljung e4513376bb fixup! Changed name and made a TextPassState 2016-01-23 11:39:10 +01:00
viktorljung 445248af55 Changed name and made a TextPassState 2016-01-23 11:38:31 +01:00
Jace 64a7239b17 Merge pull request #46 from teamfisk/CapturePointCrashFixBranch
Crash fix for: if you delete a team component in editor.
2016-01-23 11:10:57 +01:00
William Moberg 3974c649ab WIP on ModelBoxCollision. Octree works in Release mode. 2016-01-23 10:45:50 +01:00
Jace 31e7340daf Ignoring interpolation and rendering for local player entities! 2016-01-23 00:40:37 +01:00
Jace 3ac3311c0c "inline" caused missing symbol when compiling in Release for some reason 2016-01-23 00:38:11 +01:00
Jace 90867b094a Merge remote-tracking branch 'origin/TextRendering' into Networking
# Conflicts:
#	include/Engine/Rendering/RenderSystem.h
#	src/Engine/Rendering/RenderSystem.cpp
2016-01-22 22:08:56 +01:00
Jace 55ee2bb3bf Player input properly separated from editor input and server 2016-01-22 21:35:31 +01:00
stiffly 406b730ef3 Sends entity names. Temporarily 2016-01-22 19:07:20 +01:00
stiffly b37b20b7d8 Didn't bulid lol. Fixed. 2016-01-22 17:57:31 +01:00
stiffly 750442d224 Merge remote-tracking branch 'origin/Networking' into Networking 2016-01-22 17:49:56 +01:00
stiffly 389e057611 EPlayerSpawned special logic added to server and client. 2016-01-22 17:49:21 +01:00
Jace 74d9bae896 Added conditional spawning based on whether the running instance is a server or not 2016-01-22 17:34:57 +01:00
viktorljung 46dff1a59c Merge remote-tracking branch 'origin/master' into Menu
# Conflicts:
#	include/Engine/Rendering/RenderSystem.h
#	src/Engine/Rendering/RenderSystem.cpp
2016-01-22 17:02:56 +01:00
stiffly 74c95089ea Merge remote-tracking branch 'origin/PlayerMovement' into Networking 2016-01-22 16:19:35 +01:00
Jace ca2aab449e Basic movement and camera management between players and editor 2016-01-22 16:12:51 +01:00
Tleety 7498cebf5e Merge remote-tracking branch 'origin/master' into Forward+
# Conflicts:
#	src/Engine/Rendering/DrawFinalPassState.cpp
#	src/Engine/Rendering/PickingPass.cpp
#	src/Engine/Rendering/Renderer.cpp
2016-01-22 15:57:38 +01:00
Tleety 2b8debbfff Added MipMap texture generation 2016-01-22 15:55:32 +01:00
stiffly 08c476e9e3 Added kick logic to the server. Also typedefed. 2016-01-22 15:42:36 +01:00
William Moberg 1670fb4e48 Moved triangle vs ray code to method. 2016-01-22 14:45:50 +01:00
William Moberg 3955e1d60c Can resolve collision when AABB corners cut through triangle.
At least two more cases left to resolve.
2016-01-22 13:46:09 +01:00
stiffly 10c3b475bf Merge remote-tracking branch 'origin/Networking' into Networking
# Conflicts:
#	src/Engine/Network/Client.cpp
#	src/Engine/Network/Server.cpp
2016-01-22 13:19:51 +01:00
stiffly 08fcdb382b Used config for a lot of things 2016-01-22 13:18:53 +01:00
stiffly b1ea5429ce Used config for a lot of things 2016-01-22 11:53:04 +01:00
William Moberg d25804e6f8 Merge branch 'master' into BoxModelCollision 2016-01-22 11:24:19 +01:00
William Moberg 52765cc85b TriangleVsBox detection seems to work in all cases, but cannot resolve all cases yet.
Also added default ctor for Ray and removed compilation errors in CollisionSystem.
2016-01-22 11:22:56 +01:00
stiffly fcc9d64e7a Now publishes an EPlayerDisconnected event 2016-01-22 10:58:10 +01:00
Tleety caf55fb8d1 Small fix to the bloom light, now feels smoother. 2016-01-22 10:52:45 +01:00
stiffly 7a95880e10 Merge remote-tracking branch 'origin/master' into Networking 2016-01-22 10:36:11 +01:00
Jocke 6cd073c3c8 Added network metrics logging and reactored code. 2016-01-22 10:32:54 +01:00
Jace 1e3fc1ae2d Created EPlayerSpawned that gets published when a player spawns 2016-01-22 10:16:35 +01:00
verysecrethero 6f739e22f3 Crash fix for: if you delete a team component in editor. 2016-01-22 10:10:39 +01:00
Jace 8cf83454d7 Fixed input going through editor UI 2016-01-21 17:45:20 +01:00
William Moberg d2984c6ae4 Merge branch 'master' into BoxModelCollision 2016-01-21 17:42:58 +01:00
William Moberg 41f0daaf3f Merge pull request #45 from teamfisk/ShootEvent
Changed some files so it works with the changes in master. (weaponsys…
2016-01-21 17:40:57 +01:00
verysecrethero deb6ff1b16 Changed some files so it works with the changes in master. (weaponsystem,capturepoint,some tests) 2016-01-21 17:36:47 +01:00
William Moberg 9f6fa40448 Merge branch 'master' into BoxModelCollision
# Conflicts:
#	src/Engine/Collision/CollisionSystem.cpp
2016-01-21 17:16:55 +01:00
William Moberg de7c8e9234 WIP, collision detects too much, no resolving for most cases. 2016-01-21 17:10:36 +01:00
William Moberg 4d60f387ed Merge pull request #44 from teamfisk/EditorUsefulness
Editor refactoring
2016-01-21 17:03:52 +01:00
Jace f740d46683 Merge branch 'EditorUsefulness' of github.com:teamfisk/TacticalZ into EditorUsefulness 2016-01-21 17:01:06 +01:00
Jace 75dcdcec41 Fixed inconsistent editor input controls. Left mouse = select and move. Right mouse = camera. 2016-01-21 17:00:47 +01:00
viktorljung 254caf9e5d Picking depthbuffer fix 2016-01-21 16:49:20 +01:00
Jace 1c6750f5b0 Fixed uniform scale on editor widgets 2016-01-21 16:37:35 +01:00
William Moberg 3548cfa248 Merge pull request #27 from teamfisk/ShootEvent
Shoot event
2016-01-21 16:35:55 +01:00
verysecrethero 973ccd34c9 Removed unnecessary string in EPlayerDamage (TypeOfDamage). Renamed a variable in WeaponSystem 2016-01-21 16:30:07 +01:00
Jace 43b8fd29f6 Fixed widget world movement 2016-01-21 16:21:20 +01:00
Jace a6548a72b3 Merge remote-tracking branch 'origin/master' into EditorUsefulness
# Conflicts:
#	include/Engine/Collision/CollidableOctreeSystem.h
#	include/Engine/Collision/CollisionSystem.h
#	include/Engine/Collision/TriggerSystem.h
#	include/Engine/Rendering/RenderSystem.h
#	include/Game/Systems/PlayerSystem.h
#	resources/Schema/Components/Physics.xsd
#	resources/Schema/Types/Entity.xsd
#	src/Engine/Rendering/RenderSystem.cpp
#	src/Engine/Rendering/Renderer.cpp
#	src/Game/Game.cpp
#	src/Game/Systems/HealthSystem.cpp
#	src/Game/Systems/PlayerSystem.cpp
#	src/Tests/OctTreeTestGameClass.cpp
2016-01-21 16:16:35 +01:00
verysecrethero 7deb32431e Removed Color TestCode in WeaponSystem 2016-01-21 16:03:30 +01:00
Jace fc06a4babc Editor keyboard shortcuts:
Ctrl+S to save the currently selected entity file (iterates to the base parent)
Ctrl+N to create a new empty entity under the selection
Ctrl+O to import an entity file
Del to delete an entity
2016-01-21 15:58:27 +01:00
Ayumiwii 382e00cff4 Randomness fixed
Redundant continue removed
Redundant cross product removed
2016-01-21 15:34:08 +01:00
Tobias Dahl c6e9aad0c7 Merge pull request #42 from teamfisk/SpawnMiniBranch
HealthSystem now deletes the entity after publishing the PlayerDeath …
2016-01-21 15:10:16 +01:00
Tleety afe43c5f44 Shader will now handle Glowmaps. However the load code is not there yet. 2016-01-21 14:53:47 +01:00
Jace b9147344e1 Semi-working translation widget 2016-01-21 14:14:22 +01:00
Tleety 70bbc5ed0a Normals scaling with model scale bug fixed. 2016-01-21 13:52:43 +01:00
Jace 0183e1bdb7 Fixed enum string parsing bug that would ignore parsing additional fields in a component after it encountered the first enum. 2016-01-21 12:24:08 +01:00
Tleety 983f90504d Bloom effect added, will have to see if it needs improving. Also added HDR colors and gamma correction. 2016-01-21 12:02:28 +01:00
verysecrethero bdebc9de62 WeaponSystem now handles "PrimaryFire" input events. It sends out ePlayerDamage event if it hits a player. Included some tests 2016-01-21 11:55:51 +01:00
Jace f1345419b6 EditorWidgetSystem that takes care of moving widgets around 2016-01-21 10:30:19 +01:00
Jace 5e70d6eef6 EntityWrapper::Parent helper function 2016-01-21 10:29:48 +01:00
Jace 4aa9100c69 Camera::WorldToScreen helper function 2016-01-21 10:29:36 +01:00
verysecrethero 7b34e001ba Merge remote-tracking branch 'origin/master' into ShootEvent 2016-01-21 10:26:42 +01:00
verysecrethero c2e05de89f Deleted some components, etc for ShootEvent that will likely be used in a WeaponSystem instead 2016-01-21 10:24:34 +01:00
viktorljung ea9c4d19d0 Merge remote-tracking branch 'origin/master' into TextRendering
# Conflicts:
#	include/Game/Game.h
2016-01-21 10:19:32 +01:00
viktorljung f3bfe388af Clean up 2016-01-21 10:16:03 +01:00
antc13 c984f76b2f Importing & Reading Custom animation data. TODO: Shaders. 2016-01-20 18:36:03 +01:00
verysecrethero b098bd2bd3 Merge remote-tracking branch 'origin/master' into ShootEvent
# Conflicts:
#	include/Engine/Core/ComponentWrapper.h
#	include/Game/PlayerSystem.h
#	include/Game/Systems/HealthSystem.h
#	resources/Schema/Components.xsd
#	resources/Schema/Components/Player.xml
#	resources/Schema/Types/Entity.xsd
#	src/Game/PlayerSystem.cpp
#	src/Tests/HealthSystemTest.cpp
#	src/Tests/OctTreeTestAnders.cpp
#	src/Tests/OctTreeTestGameClass.cpp
#	src/Tests/OctTreeTestGameClass.h
#	src/Tests/OctTreeTestHardCodedTestWorld.h
2016-01-20 17:53:33 +01:00
William Moberg 4d5b835352 WIP triangles vs. AABB. 2016-01-20 16:43:09 +01:00
Tleety 86824f1b1f Colors above value 1 is now added to the bloomtexture, and will be used to get a glow effect in later stage. 2016-01-20 15:23:49 +01:00
Tleety 78a1037983 WIP
DrawScreenQuad implemented and working.
Started work on HDR coloring.
2016-01-20 13:34:56 +01:00
antc13 84b7cf165c Reduced the chance of crashing in Export. 2016-01-20 11:46:32 +01:00
antc13 386e76f642 Puyshing 2016-01-20 09:49:54 +01:00
antc13 a47317bb32 Merge branch 'master' of https://github.com/teamfisk/TacticalZ into Importer
# Conflicts:
#	include/Engine/Collision/Collision.h
#	resources/Shaders/ForwardPlus.frag.glsl
#	resources/Shaders/ForwardPlus.vert.glsl
2016-01-19 18:26:45 +01:00
antc13 e643581971 Commit in order to pull from Master. 2016-01-19 18:21:27 +01:00
antc13 3826142e94 Now supporting multiple material per mesh. Simon changed glDrawElementsBaseVertex to glDrawElements in DrawFinalPass.cpp Hallelulijah! 2016-01-19 17:40:34 +01:00
viktorljung ce27b224df Merge remote-tracking branch 'origin/master' into TextRendering
# Conflicts:
#	include/Engine/Rendering/RenderQueue.h
#	include/Engine/Rendering/RenderSystem.h
#	include/Engine/Rendering/Renderer.h
#	src/Engine/Rendering/RenderSystem.cpp
2016-01-19 17:27:09 +01:00
viktorljung f0763bc2a3 Font loading crash fixed 2016-01-19 17:18:18 +01:00
Jace 8854794cbc fixup! Editor widget selection and creation 2016-01-19 14:31:56 +01:00
Jace 260203fa4d Annotation on physics component 2016-01-19 13:28:16 +01:00
Jace d030e8f699 Editor widget selection and creation 2016-01-19 13:28:02 +01:00
Jace 61984d2c4a Removed lots of slowing debug output from entity parsing pipeline 2016-01-19 13:27:29 +01:00
Jace cfe023cc1d Created ComponentInfo::EnumType which defines which native type to use for enums. 2016-01-19 12:33:53 +01:00
Jace a6445c65aa Fixed EntityParser to handle string enums properly. 2016-01-19 12:15:20 +01:00
Jace 162523d3ca Made EntityFileWriter store enums as strings instead of integer values to be resistant to enum value changes! 2016-01-19 11:55:27 +01:00
viktorljung dbe56280a6 Resolution fixed and Centered text 2016-01-19 11:45:34 +01:00
Jace 3fb975a8d9 Editor widget entities 2016-01-19 11:44:03 +01:00
Jace 267a60ef30 Better loading of editor toolbox icons 2016-01-19 11:43:38 +01:00
Jace 68af853a03 Editor entity naming 2016-01-19 11:43:03 +01:00
Jace b62e42567c Fixed editor enum selection 2016-01-19 11:35:31 +01:00
Ayumiwii 77e1dacb6f Merge 2016-01-19 09:58:52 +01:00
Jace 9e3dfff7b6 WIP world pausing 2016-01-19 00:52:17 +01:00
Jace 79eaa7364c Editor toolbox buttons 2016-01-18 23:59:46 +01:00
Jace 51979d7f0c Changed System to take World through constructor and store it instead, cause it makes more sense. 2016-01-18 23:59:33 +01:00
Jace 3fc44e944c Editor entity reparenting. 2016-01-18 21:20:20 +01:00
Jace 1760f9dfb1 Added inequality operator to EntityWrapper 2016-01-18 21:17:52 +01:00
antc13 2a3009212a Importing custom mesh without material. 2016-01-18 19:37:55 +01:00
Jace d4242bbead Editor entity create and delete. 2016-01-18 19:26:00 +01:00
Jace 631dd57eeb Editor entity import, save, delete, component attach, component delete. 2016-01-18 18:55:19 +01:00
Jace 9cb5f4bd2f Added a stats window 2016-01-18 18:54:57 +01:00
viktorljung c4594524da Better default values and documentation 2016-01-18 17:51:17 +01:00
viktorljung 2a93e2ae7f Merge remote-tracking branch 'origin/master' into TextRendering
# Conflicts:
#	include/Engine/Rendering/RenderQueue.h
#	include/Engine/Rendering/RenderSystem.h
#	include/Game/Game.h
#	resources/Schema/Types/Entity.xsd
#	src/Engine/Rendering/RenderSystem.cpp
2016-01-18 17:44:26 +01:00
viktorljung 92553f1e93 text size can now be entered in the filepath with a comma separator, like this "filepath,16" 2016-01-18 17:17:12 +01:00
Ayumiwii 37aa1eaa18 Merge remote-tracking branch 'origin/master' into CoolDeathAnimation
# Conflicts:
#	include/Engine/Rendering/DrawScenePass.h
#	include/Engine/Rendering/RenderQueue.h
#	include/Engine/Rendering/RenderQueueFactory.h
#	include/Engine/Rendering/Renderer.h
#	include/Game/Game.h
#	resources/Schema/Components.xsd
#	resources/Schema/Entities/Test.xml
#	resources/Schema/Types/Entity.xsd
#	src/Engine/Rendering/DrawScenePass.cpp
#	src/Engine/Rendering/RenderQueueFactory.cpp
#	src/Engine/Rendering/Renderer.cpp
#	src/Game/Game.cpp
2016-01-18 16:02:43 +01:00
Jace 3bc7dceca5 Made EntityWrapper hashable 2016-01-18 14:55:49 +01:00
Ayumiwii 1411964dcf hourglass assets fixed 2016-01-18 14:24:31 +01:00
Ayumiwii 35269315cc Rename the thingie 2016-01-18 13:51:32 +01:00
Jace 504f301e4d Added refactored property sheet for components 2016-01-18 13:51:22 +01:00
Ayumiwii 8f8b64f99c First pass that actually work
Not at all done, but it'll have to do for now
2016-01-18 11:50:00 +01:00
Jace e39e4064f2 Entity tree button mockup 2016-01-17 23:06:32 +01:00
Jace 0d50ede6f5 Base work on reimplementing editor GUI 2016-01-17 07:34:20 +01:00
Jace 4786986abd Rendering pipeline fixes across the board and base work on refactored editor 2016-01-17 06:29:25 +01:00
Jace e34856468a Removed DrawScenePass, since it doesn't seem to be used 2016-01-17 06:27:45 +01:00
Jace e2357b8625 Fixed absolute position not taking scale into account 2016-01-17 06:23:13 +01:00
Jace 6ec2258758 Added UniformScale component which keeps an entity's scale at a uniform value relative to the screen. 2016-01-17 06:22:35 +01:00
Jace 9f447afbdb Added EntityWrapper::Valid and bool overload to be check if an entity is valid and still exists in the world more easily 2016-01-17 06:20:27 +01:00
antc13 16c39df439 Merge branch 'master' of https://github.com/teamfisk/TacticalZ into Importer
# Conflicts:
#	include/Engine/Collision/Collision.h
#	src/Engine/Rendering/Model.cpp
#	src/Engine/Rendering/RawModelAssimp.cpp
2016-01-15 18:00:30 +01:00
antc13 8437b9c734 Commit for Pull 2016-01-15 17:58:26 +01:00
antc13 6317a6092d Merge branch 'MayaExporter' of https://github.com/teamfisk/TacticalZ into Importer 2016-01-15 16:51:10 +01:00
viktorljung 7faed50507 Merge remote-tracking branch 'origin/master' into TextRendering 2016-01-15 13:24:24 +01:00
viktorljung 6fbb962b5e Merge branch 'Rendering' into TextRendering
# Conflicts:
#	include/Engine/Rendering/RenderQueue.h
#	include/Engine/Rendering/RenderQueueFactory.h
#	include/Engine/Rendering/Renderer.h
#	include/Engine/Rendering/ShaderProgram.h
#	include/Game/Game.h
#	resources/Schema/Components.xsd
#	resources/Schema/Entities/Test.xml
#	resources/Schema/Types/Entity.xsd
#	src/Engine/Rendering/RenderQueueFactory.cpp
#	src/Engine/Rendering/Renderer.cpp
#	src/Game/Game.cpp
2016-01-15 13:23:42 +01:00
antc13 4e70439653 Merge branch 'Importer' of https://github.com/teamfisk/TacticalZ into Importer 2016-01-15 09:48:42 +01:00
verysecrethero e6527196ed Modified a few files according to the current CodeStandards 2016-01-13 15:50:30 +01:00
verysecrethero c14f3789f7 PlayerSystem now counts down the CoolDownTimer on both HeldItems for the player. Updated ShootEventTest to verify this 2016-01-13 15:26:10 +01:00
antc13 24486c314d Reworked the Exporter. 2016-01-13 14:03:58 +01:00
FakeShemp 923589524b Fix the accelaration (possibly)
I haven't tested so I might just have destroyed everything.
2016-01-12 21:25:15 +01:00
Ayumiwii 00eeed2e20 Broken stuff, refactoring 2016-01-12 16:16:42 +01:00
antc13 7b62dc19bf Spitting out Meshes & Animation Data to file. 2016-01-12 15:39:29 +01:00
verysecrethero a20ca49d53 Fixed typo backslash instead of slash in various classes (the includes) 2016-01-12 10:46:34 +01:00
Ayumiwii 0630885d92 Many more things done 2016-01-11 19:59:45 +01:00
verysecrethero 774bb8ce56 Simplified PlayerSystem branches a lot! Thanks William! 2016-01-11 17:36:23 +01:00
verysecrethero 0cc58f088a EquippedItem,Ammo got changed to int instead of double. Loading entities from map the new way in Tests. ComponentWrapper:s Name is now Type 2016-01-11 17:15:49 +01:00
verysecrethero 00805d30d0 Merge remote-tracking branch 'origin/master' into ShootEvent 2016-01-11 17:06:48 +01:00
verysecrethero 2f6261dfbf EShoot: changed to string weaponType to int currentlyEquippedItem
PlayerSystem.h: added HeldItem enum
PlayerSystem.cpp: simplified writing doubles, uses HeldItem enum
ShootEventTest.cpp: simplified writing doubles
2016-01-11 15:49:33 +01:00
verysecrethero 2cd0e94a60 Changed the comparison method in PlayerSystem since its currently using doubles 2016-01-11 15:49:33 +01:00
verysecrethero 8f92de3683 xml/xsd files changed type to double. fixed cooldownbug in PlayerSystem. Added 4 tests in ShootEventTest and generalized it a lot 2016-01-11 15:49:33 +01:00
verysecrethero 31c1c0ac8d New Event: EShoot. New Components: PrimaryItem,SecondaryItem. New Test: ShootEventTest. Added LeftMouseRelease->Shoot in PlayerSystem
TODO: generalize the test
2016-01-11 15:49:33 +01:00
antc13 0e90382fd1 Merge branch 'master' of https://github.com/teamfisk/TacticalZ into MayaExporter 2016-01-11 13:09:09 +01:00
antc13 1667358e0c We now export animations. 2016-01-08 16:47:04 +01:00
Ayumiwii 3467315aef Lots of things done 2016-01-08 16:42:59 +01:00
FakeShemp eb5fca898f Fix small bug with push_back order
Commited directly from GitHub. Blame it if something explodes.
2015-12-21 12:55:25 +01:00
antc13 c9db46564f Spitting out files WIP 2015-12-18 16:21:07 +01:00
Teejoon 509a989d3b Merge branch 'MayaExporter' of github.com:teamfisk/TacticalZ into MayaExporter
Conflicts:
	tools/MayaExporter/MayaExporter/Menu.cpp
2015-12-18 10:07:44 +01:00
Teejoon bc4cc5db54 Changed how we get skeletons. Made so that we could get the bind pose for each skeleton in the scene 2015-12-18 10:03:00 +01:00
antc13 73708ec706 You can now add/remove animation clips. 2015-12-17 14:58:46 +01:00
antc13 67017fcaf4 Stepping through the timeline. 2015-12-16 11:33:42 +01:00
antc13 498afb3a5e Merge branch 'MayaExporter' of https://github.com/teamfisk/TacticalZ into MayaExporter
# Conflicts:
#	tools/MayaExporter/MayaExporter/Menu.h
2015-12-15 15:41:18 +01:00
antc13 4e535c1102 File Writer WIP. Rework soon™ 2015-12-15 15:24:46 +01:00
FakeShemp 1689370356 Export the skeletons
Not really tested though
2015-12-15 11:49:59 +01:00
viktorljung 123c198e19 Text component added and Text render queue 2015-12-14 14:48:24 +01:00
antc13 60b3ce89b2 Skeleton/Joints WIP 2015-12-14 12:59:54 +01:00
viktorljung 9bd3da409d Added Font to ResourceManager 2015-12-11 16:53:51 +01:00
viktorljung a8a38716bd Text renderer up and working, needs more work to be compatible with the ResourceManager and the Entity Component system 2015-12-11 16:12:29 +01:00
viktorljung 8f007f6daf Added Freetype 2.62 config and option files 2015-12-11 11:26:41 +01:00
viktorljung 4c2ce3882e Added fonts folder and font 2015-12-11 11:07:22 +01:00
viktorljung 7b6902eafe Merge remote-tracking branch 'origin/master' into TextRendering 2015-12-11 10:55:10 +01:00
viktorljung 46854a63dd Text rendering includes 2015-12-11 10:54:52 +01:00
viktorljung dc66891d60 Added Freetype 2.62 2015-12-10 11:22:56 +01:00
antc13 a22d086e60 Tested some of the Material Code. Seems to work. The project should now be following the code standard properly (hopefully). 2015-12-10 11:18:34 +01:00
FakeShemp 74c1beed20 gitignore 2015-12-09 12:03:01 +01:00
FakeShemp c8cb0ee939 Grab all materials 2015-12-09 11:58:49 +01:00
311 changed files with 16344 additions and 3025 deletions
+8
View File
@@ -4,3 +4,11 @@ bin/
lib/ lib/
# Because apparently nobody has any self control # Because apparently nobody has any self control
*.orig *.orig
*.suo
*.sdf
tools/MayaExporter/MayaExporter/x64/Debug/
tools/MayaExporter/x64/Debug/
tools/MayaExporter/MayaExporter/Debug/
tools/MayaExporter/MayaExporter/GeneratedFiles/
+9
View File
@@ -14,6 +14,9 @@ endif()
if(CMAKE_COMPILER_IS_GNUCXX) if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") 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() endif()
#set(BUILD_SHARED_LIBS FALSE) #set(BUILD_SHARED_LIBS FALSE)
@@ -34,6 +37,12 @@ foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})
endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES) endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES)
# DEBUG definition
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
$<$<CONFIG:Debug>:DEBUG>
$<$<CONFIG:RelWithDebInfo>:DEBUG>
)
include(cotire) include(cotire)
add_subdirectory(src/Engine) add_subdirectory(src/Engine)
add_subdirectory(src/Game) add_subdirectory(src/Game)
+1 -1
Submodule assets updated: 6ffb46e155...cfeeb1f880
@@ -4,21 +4,22 @@
#include "../Core/System.h" #include "../Core/System.h"
#include "../Core/Octree.h" #include "../Core/Octree.h"
#include "Collision.h" #include "Collision.h"
#include "EntityAABB.h"
class CollidableOctreeSystem : public ImpureSystem, public PureSystem class CollidableOctreeSystem : public ImpureSystem, public PureSystem
{ {
public: public:
CollidableOctreeSystem(EventBroker* eventBroker, Octree<AABB>* octree) CollidableOctreeSystem(World* world, EventBroker* eventBroker, Octree<EntityAABB>* octree, const std::string& componentType)
: System(eventBroker) : System(world, eventBroker)
, PureSystem("Collidable") , PureSystem(componentType)
, m_Octree(octree) , m_Octree(octree)
{ } { }
virtual void Update(World* world, double dt) override; virtual void Update(double dt) override;
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt) override; virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override;
private: private:
Octree<AABB>* m_Octree; Octree<EntityAABB>* m_Octree;
}; };
#endif #endif
+22 -3
View File
@@ -10,10 +10,12 @@
#include "../Core/Ray.h" #include "../Core/Ray.h"
#include "../Core/AABB.h" #include "../Core/AABB.h"
#include "../Rendering/RawModel.h" #include "Rendering/RawModelCustom.h"
//#include "Rendering/RawModelAssimp.h"
#include "../Core/Transform.h" #include "../Core/Transform.h"
#include "../Core/Entity.h" #include "../Core/Entity.h"
#include "../Core/EntityWrapper.h" #include "../Core/EntityWrapper.h"
#include "EntityAABB.h"
class World; class World;
struct ComponentWrapper; 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]. //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); 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. //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, bool RayVsModel(const Ray& ray,
const std::vector<RawModel::Vertex>& modelVertices, const std::vector<RawModel::Vertex>& modelVertices,
@@ -50,6 +67,9 @@ bool AABBvsTriangles(const AABB& box,
const std::vector<RawModel::Vertex>& modelVertices, const std::vector<RawModel::Vertex>& modelVertices,
const std::vector<unsigned int>& modelIndices, const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix, const glm::mat4& modelMatrix,
glm::vec3& boxVelocity,
float verticalStepHeight,
bool& isOnGround,
glm::vec3& outResolutionVector); glm::vec3& outResolutionVector);
//Return true if the boxes are intersecting. //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. //Return true if the boxes are intersecting.
//Also outputs the minimum translation that box [a] would need in order to resolve collision. //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 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 // Calculates an absolute AABB from an entity AABB component
boost::optional<AABB> EntityAbsoluteAABB(EntityWrapper& entity); boost::optional<EntityAABB> EntityAbsoluteAABB(EntityWrapper& entity);
} }
+7 -14
View File
@@ -7,30 +7,23 @@
#include "../Common.h" #include "../Common.h"
#include "../Core/System.h" #include "../Core/System.h"
#include "../Core/EventBroker.h" #include "../Core/EventBroker.h"
#include "../Core/EKeyUp.h"
#include "../Core/Octree.h" #include "../Core/Octree.h"
#include "EntityAABB.h"
class CollisionSystem : public PureSystem class CollisionSystem : public PureSystem
{ {
public: public:
CollisionSystem(EventBroker* eventBroker, Octree<AABB>* octree) CollisionSystem(World* world, EventBroker* eventBroker, Octree<EntityAABB>* octree)
: System(eventBroker) : System(world, eventBroker)
, PureSystem("Collidable") , PureSystem("Collidable")
, m_Octree(octree) , 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: private:
Octree<AABB>* m_Octree; Octree<EntityAABB>* m_Octree;
bool zPress; std::vector<EntityAABB> m_OctreeResult;
EventRelay<CollisionSystem, Events::KeyUp> m_EKeyUp;
bool OnKeyUp(const Events::KeyUp &event);
}; };
#endif #endif
+7 -7
View File
@@ -2,7 +2,7 @@
#define Events_TriggerEnter_h__ #define Events_TriggerEnter_h__
#include "../Core/EventBroker.h" #include "../Core/EventBroker.h"
#include "../Core/Entity.h" #include "../Core/EntityWrapper.h"
namespace Events namespace Events
{ {
@@ -11,27 +11,27 @@ namespace Events
struct TriggerTouch : Event struct TriggerTouch : Event
{ {
/** The id of the entity that touches the trigger. */ /** The id of the entity that touches the trigger. */
EntityID Entity; EntityWrapper Entity;
/** The id of the trigger entity. */ /** The id of the trigger entity. */
EntityID Trigger; EntityWrapper Trigger;
}; };
/** Thrown once, when an entity has completely left a trigger. */ /** Thrown once, when an entity has completely left a trigger. */
struct TriggerLeave : Event struct TriggerLeave : Event
{ {
/** The id of the entity that left the trigger. */ /** The id of the entity that left the trigger. */
EntityID Entity; EntityWrapper Entity;
/** The id of the trigger entity. */ /** The id of the trigger entity. */
EntityID Trigger; EntityWrapper Trigger;
}; };
/** Thrown once, when an entity is completely contained inside a trigger. */ /** Thrown once, when an entity is completely contained inside a trigger. */
struct TriggerEnter : Event struct TriggerEnter : Event
{ {
/** The id of the entity that entered the trigger. */ /** The id of the entity that entered the trigger. */
EntityID Entity; EntityWrapper Entity;
/** The id of the trigger entity. */ /** The id of the trigger entity. */
EntityID Trigger; EntityWrapper Trigger;
}; };
} }
+22
View File
@@ -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
+12 -10
View File
@@ -8,14 +8,15 @@
#include "../Core/EventBroker.h" #include "../Core/EventBroker.h"
#include "../Core/Octree.h" #include "../Core/Octree.h"
#include "ETrigger.h" #include "ETrigger.h"
#include "EntityAABB.h"
class AABB; class AABB;
class TriggerSystem : public PureSystem class TriggerSystem : public PureSystem
{ {
public: public:
TriggerSystem(EventBroker* eventBroker, Octree<AABB>* octree) TriggerSystem(World* world, EventBroker* eventBroker, Octree<EntityAABB>* octree)
: System(eventBroker) : System(world, eventBroker)
, PureSystem("Trigger") , PureSystem("Trigger")
, m_Octree(octree) , m_Octree(octree)
{ {
@@ -24,12 +25,13 @@ public:
EVENT_SUBSCRIBE_MEMBER(m_ELeave, &TriggerSystem::OnLeave); 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: private:
Octree<AABB>* m_Octree; Octree<EntityAABB>* m_Octree;
std::unordered_map<EntityID, std::unordered_set<EntityID>> m_EntitiesTouchingTrigger; std::vector<EntityAABB> m_OctreeOut;
std::unordered_map<EntityID, std::unordered_set<EntityID>> m_EntitiesCompletelyInTrigger; 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. //TODO: Only exists for debug purposes, remove later.
EventRelay<TriggerSystem, Events::TriggerEnter> m_EEnter; EventRelay<TriggerSystem, Events::TriggerEnter> m_EEnter;
@@ -40,13 +42,13 @@ private:
bool OnLeave(const Events::TriggerLeave &event); bool OnLeave(const Events::TriggerLeave &event);
//True if leave event was thrown. //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> template<typename Event>
void publish(EntityID pId, EntityID tId) void publish(EntityWrapper collider, EntityWrapper trigger)
{ {
Event e; Event e;
e.Trigger = tId; e.Trigger = trigger;
e.Entity = pId; e.Entity = collider;
m_EventBroker->Publish(e); m_EventBroker->Publish(e);
} }
}; };
+2
View File
@@ -4,6 +4,8 @@
#include <vector> #include <vector>
#include <map> #include <map>
#include <unordered_map> #include <unordered_map>
#include <algorithm>
#include <array>
#include "Core/Util/Logging.h" #include "Core/Util/Logging.h"
#include "Core/Util/IfDebug.h" #include "Core/Util/IfDebug.h"
-1
View File
@@ -9,7 +9,6 @@ public:
AABB() = default; AABB() = default;
//No checks are made. Values in minPos must be less than values in maxPos, i.e. min.x < max.x, etc. //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::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. //No checks are made. Size must consist of non-negative numbers.
static AABB FromOriginSize(const glm::vec3& origin, const glm::vec3& size); static AABB FromOriginSize(const glm::vec3& origin, const glm::vec3& size);
virtual ~AABB(); virtual ~AABB();
+3 -1
View File
@@ -5,12 +5,14 @@
struct ComponentInfo struct ComponentInfo
{ {
typedef int EnumType;
struct Meta_t struct Meta_t
{ {
std::string Annotation; std::string Annotation;
unsigned int Allocation = 0; unsigned int Allocation = 0;
std::map<std::string, std::string> FieldAnnotations; 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 struct Field_t
+8 -3
View File
@@ -18,7 +18,7 @@ struct ComponentWrapper
const ::EntityID EntityID; const ::EntityID EntityID;
char* Data; 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); return Info.Meta->FieldEnumDefinitions.at(fieldName).at(enumKey);
} }
@@ -44,6 +44,11 @@ struct ComponentWrapper
template <std::size_t N> template <std::size_t N>
void SetField(std::string name, const char(&value)[N]) { Field<std::string>(name) = std::string(value); } 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 struct SubscriptProxy
{ {
friend struct ComponentWrapper; friend struct ComponentWrapper;
@@ -58,7 +63,7 @@ struct ComponentWrapper
public: public:
// Return the integer value of an enum type key for this field // 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> template <typename T>
operator T&() { return m_Component->Field<T>(m_PropertyName); } operator T&() { return m_Component->Field<T>(m_PropertyName); }
@@ -81,7 +86,7 @@ class ComponentWrapperFactory
{ {
public: public:
ComponentWrapperFactory() = default; 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.Name = componentTypeName;
m_ComponentInfo.Meta->Allocation = allocation; m_ComponentInfo.Meta->Allocation = allocation;
+21
View File
@@ -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
+19
View File
@@ -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
+3
View File
@@ -11,6 +11,9 @@ struct KeyDown : Event
{ {
/** GLFW key code */ /** GLFW key code */
int KeyCode; int KeyCode;
bool ModCtrl;
bool ModAlt;
bool ModShift;
}; };
} }
+3
View File
@@ -11,6 +11,9 @@ struct KeyUp : Event
{ {
/** GLFW key code */ /** GLFW key code */
int KeyCode; int KeyCode;
bool ModCtrl;
bool ModAlt;
bool ModShift;
}; };
} }
+22
View File
@@ -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
+17
View File
@@ -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
+4 -5
View File
@@ -2,17 +2,16 @@
#define EPlayerDamage_h__ #define EPlayerDamage_h__
#include "EventBroker.h" #include "EventBroker.h"
#include "../Core/Entity.h" #include "../Core/EntityWrapper.h"
namespace Events namespace Events
{ {
struct PlayerDamage : Event struct PlayerDamage : Event
{ {
double DamageAmount; //NOTE: this struct is missing information on what the damageSource is
EntityID PlayerDamagedID; EntityWrapper Player;
//optional TypeOfDamage double Damage;
std::string TypeOfDamage;
}; };
} }
+2 -3
View File
@@ -2,7 +2,7 @@
#define EPlayerDeath_h__ #define EPlayerDeath_h__
#include "EventBroker.h" #include "EventBroker.h"
#include "../Core/Entity.h" #include "../Core/EntityWrapper.h"
namespace Events namespace Events
{ {
@@ -10,8 +10,7 @@ namespace Events
struct PlayerDeath : Event struct PlayerDeath : Event
{ {
//KilledBy,KilledByWhat is optional for now. It might be used later in the playerlog-system //KilledBy,KilledByWhat is optional for now. It might be used later in the playerlog-system
EntityID KilledBy; EntityWrapper Player;
EntityID PlayerID;
std::string KilledByWhat; std::string KilledByWhat;
}; };
+6 -6
View File
@@ -2,16 +2,16 @@
#define EPlayerHealthPickup_h__ #define EPlayerHealthPickup_h__
#include "EventBroker.h" #include "EventBroker.h"
#include "../Core/Entity.h" #include "../Core/EntityWrapper.h"
namespace Events namespace Events
{ {
struct PlayerHealthPickup : Event struct PlayerHealthPickup : Event
{ {
double HealthAmount; EntityWrapper Player;
EntityID PlayerHealedID; double HealthAmount;
}; };
} }
+20
View File
@@ -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
+17
View File
@@ -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
+1 -1
View File
@@ -143,7 +143,7 @@ private:
~EntityFile(); ~EntityFile();
public: 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 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); static void WriteValueData(char* outData, const ComponentInfo::Field_t& field, const char* valueData);
+29 -4
View File
@@ -2,6 +2,7 @@
#define EntityWrapper_h__ #define EntityWrapper_h__
#include <boost/optional.hpp> #include <boost/optional.hpp>
#include <boost/functional/hash.hpp>
#include "ComponentWrapper.h" #include "ComponentWrapper.h"
class World; class World;
@@ -22,11 +23,35 @@ struct EntityWrapper
static const EntityWrapper Invalid; 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); ComponentWrapper operator[](const char* componentName);
bool operator==(const EntityWrapper& e); bool operator==(const EntityWrapper& e) const;
explicit operator EntityID(); 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 #endif
+1 -1
View File
@@ -102,7 +102,7 @@ public:
m_ExtraMemory.push_back((char*)malloc(m_Stride)); m_ExtraMemory.push_back((char*)malloc(m_Stride));
//We should preferably not enter here to avoid performance issues. Set more numMaxElements in constructor instead. //We should preferably not enter here to avoid performance issues. Set more numMaxElements in constructor instead.
if (!DisableMemoryPool::Value) { 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(); return m_ExtraMemory.back();
} }
+1 -1
View File
@@ -111,7 +111,7 @@ struct Child
std::vector<ContainedObject>& m_StaticObjectsRef; std::vector<ContainedObject>& m_StaticObjectsRef;
std::vector<ContainedObject>& m_DynamicObjectsRef; 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; int childIndexContainingPoint(const glm::vec3& point) const;
std::vector<int> childIndicesContainingBox(const AABB& box) const; std::vector<int> childIndicesContainingBox(const AABB& box) const;
}; };
+4
View File
@@ -7,6 +7,10 @@
class Ray class Ray
{ {
public: public:
Ray()
: m_Origin(glm::vec3(0.f))
, m_Direction(glm::vec3(0, 0, 1))
{}
Ray(const glm::vec3& origin, const glm::vec3& dir) Ray(const glm::vec3& origin, const glm::vec3& dir)
: m_Origin(origin) : m_Origin(origin)
, m_Direction(glm::normalize(dir)) , m_Direction(glm::normalize(dir))
+14 -11
View File
@@ -32,10 +32,10 @@ public:
}; };
struct FailedLoadingException : public std::exception struct FailedLoadingException : public std::exception
{ {
virtual const char* what() const throw() FailedLoadingException(char const* const _Message)
{ : std::exception(_Message)
return "Resource is failed to load."; { }
} FailedLoadingException() :std::exception("Resource failed to load.") { };
}; };
// Pretend that this is a pure virtual function that you have to implement // 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. //If resource has already been cached and completely loaded.
it = m_ResourceCache.find(cacheKey); {
if (it != m_ResourceCache.end()) { boost::lock_guard<decltype(m_Mutex)> guard(m_Mutex);
if (it->second != nullptr) { it = m_ResourceCache.find(cacheKey);
return static_cast<T*>(it->second); if (it != m_ResourceCache.end()) {
} else { if (it->second != nullptr) {
//Don't return null on failure, exception instead. return static_cast<T*>(it->second);
throw Resource::FailedLoadingException(); } else {
//Don't return null on failure, exception instead.
throw Resource::FailedLoadingException();
}
} }
} }
+7 -7
View File
@@ -11,14 +11,14 @@ class System
friend class SystemPipeline; friend class SystemPipeline;
protected: protected:
System() System(World* world, EventBroker) { }
: m_EventBroker(nullptr) System(World* world, EventBroker* eventBroker)
{ } : m_World(world)
System(EventBroker* eventBroker) , m_EventBroker(eventBroker)
: m_EventBroker(eventBroker)
{ } { }
virtual ~System() = default; virtual ~System() = default;
World* m_World;
EventBroker* m_EventBroker; EventBroker* m_EventBroker;
}; };
@@ -34,7 +34,7 @@ protected:
const std::string m_ComponentType; 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 class ImpureSystem : public virtual System
@@ -45,7 +45,7 @@ protected:
ImpureSystem() = default; ImpureSystem() = default;
virtual ~ImpureSystem() = default; virtual ~ImpureSystem() = default;
virtual void Update(World* world, double dt) = 0; virtual void Update(double dt) = 0;
}; };
#endif #endif
+36 -8
View File
@@ -5,13 +5,19 @@
#include "EventBroker.h" #include "EventBroker.h"
#include "System.h" #include "System.h"
#include "World.h" #include "World.h"
#include "EPause.h"
class SystemPipeline class SystemPipeline
{ {
public: public:
SystemPipeline(EventBroker* eventBroker) SystemPipeline(World* world, EventBroker* eventBroker)
: m_EventBroker(eventBroker) : m_World(world)
{ } , m_EventBroker(eventBroker)
{
EVENT_SUBSCRIBE_MEMBER(m_EPause, &SystemPipeline::OnPause);
EVENT_SUBSCRIBE_MEMBER(m_EResume, &SystemPipeline::OnResume);
}
~SystemPipeline() ~SystemPipeline()
{ {
for (UnorderedSystems& group : m_OrderedSystemGroups) { for (UnorderedSystems& group : m_OrderedSystemGroups) {
@@ -29,7 +35,7 @@ public:
m_OrderedSystemGroups.resize(updateOrderLevel + 1); m_OrderedSystemGroups.resize(updateOrderLevel + 1);
} }
UnorderedSystems& group = m_OrderedSystemGroups[updateOrderLevel]; 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; group.Systems[typeid(T).name()] = system;
PureSystem* pureSystem = dynamic_cast<PureSystem*>(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) { for (UnorderedSystems& group : m_OrderedSystemGroups) {
// Process events // Process events
for (auto& pair : group.Systems) { for (auto& pair : group.Systems) {
@@ -57,18 +67,18 @@ public:
// Update // Update
for (auto& system : group.ImpureSystems) { for (auto& system : group.ImpureSystems) {
system->Update(world, dt); system->Update(dt);
} }
for (auto& pair : group.PureSystems) { for (auto& pair : group.PureSystems) {
const std::string& componentName = pair.first; const std::string& componentName = pair.first;
auto& systems = pair.second; auto& systems = pair.second;
const ComponentPool* pool = world->GetComponents(componentName); const ComponentPool* pool = m_World->GetComponents(componentName);
if (pool == nullptr) { if (pool == nullptr) {
continue; continue;
} }
for (auto& component : *pool) { for (auto& component : *pool) {
for (auto& system : systems) { 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: private:
World* m_World;
EventBroker* m_EventBroker; EventBroker* m_EventBroker;
bool m_Paused = false;
struct UnorderedSystems struct UnorderedSystems
{ {
std::map<std::string, System*> Systems; std::map<std::string, System*> Systems;
@@ -84,6 +97,21 @@ private:
std::vector<ImpureSystem*> ImpureSystems; std::vector<ImpureSystem*> ImpureSystems;
}; };
std::vector<UnorderedSystems> m_OrderedSystemGroups; 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 #endif
+8
View File
@@ -3,14 +3,22 @@
#include "../GLM.h" #include "../GLM.h"
#include "World.h" #include "World.h"
#include "EntityWrapper.h"
namespace Transform namespace Transform
{ {
glm::mat4 AbsoluteTransformation(EntityWrapper entity);
glm::vec3 AbsolutePosition(EntityWrapper entity);
glm::vec3 AbsolutePosition(World* world, EntityID 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::quat AbsoluteOrientation(World* world, EntityID entity);
glm::vec3 AbsoluteScale(EntityWrapper entity);
glm::vec3 AbsoluteScale(World* world, EntityID entity); glm::vec3 AbsoluteScale(World* world, EntityID entity);
glm::mat4 ModelMatrix(EntityWrapper entity);
glm::mat4 ModelMatrix(EntityID entity, World* world); glm::mat4 ModelMatrix(EntityID entity, World* world);
glm::vec3 TransformPoint(const glm::vec3& point, const glm::mat4& matrix);
} }
+22
View File
@@ -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
+2 -2
View File
@@ -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 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 class FileWatcher::Worker
{ {
@@ -54,7 +54,7 @@ public:
private: private:
struct FileInfo struct FileInfo
{ {
int Size; std::size_t Size;
std::time_t Timestamp; std::time_t Timestamp;
}; };
+6 -34
View File
@@ -29,41 +29,9 @@ enum _LOG_LEVEL
extern _LOG_LEVEL LOG_LEVEL; extern _LOG_LEVEL LOG_LEVEL;
const static char* _LOG_LEVEL_PREFIX[] = extern const char* _LOG_LEVEL_PREFIX[];
{
"EE: ",
"",
"WW: ",
"DD: "
};
static void _LOG(_LOG_LEVEL logLevel, const char* file, const char* func, unsigned int line, const char* format, ...) extern 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;
}
#define LOG(logLevel, format, ...) \ #define LOG(logLevel, format, ...) \
_LOG(logLevel, __BASE_FILE__, __func__, __LINE__, format, ##__VA_ARGS__) _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, ...) \ #define LOG_INFO(format, ...) \
LOG(LOG_LEVEL_INFO, format, ##__VA_ARGS__) LOG(LOG_LEVEL_INFO, format, ##__VA_ARGS__)
#ifdef DEBUG
#define LOG_DEBUG(format, ...) \ #define LOG_DEBUG(format, ...) \
LOG(LOG_LEVEL_DEBUG, format, ##__VA_ARGS__) LOG(LOG_LEVEL_DEBUG, format, ##__VA_ARGS__)
#else
#define LOG_DEBUG(format, ...)
#endif
#endif // Logging_h__ #endif // Logging_h__
+6
View File
@@ -5,11 +5,15 @@
#include "Entity.h" #include "Entity.h"
#include "ObjectPool.h" #include "ObjectPool.h"
#include "ComponentPool.h" #include "ComponentPool.h"
#include "EventBroker.h"
class World class World
{ {
public: public:
World() = default; World() = default;
World(EventBroker* eventBroker)
: m_EventBroker(eventBroker)
{ }
~World(); ~World();
// Create empty entity // Create empty entity
@@ -46,6 +50,7 @@ public:
std::string GetName(EntityID entity) const; std::string GetName(EntityID entity) const;
private: private:
EventBroker* m_EventBroker = nullptr;
EntityID m_CurrentEntityID = 0; EntityID m_CurrentEntityID = 0;
std::unordered_map<EntityID, EntityID> m_EntityParents; std::unordered_map<EntityID, EntityID> m_EntityParents;
@@ -55,6 +60,7 @@ private:
std::unordered_map<EntityID, std::string> m_EntityNames; std::unordered_map<EntityID, std::string> m_EntityNames;
EntityID generateEntityID(); EntityID generateEntityID();
void deleteEntityRecursive(EntityID entity, bool cascaded = false);
}; };
#endif #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
+183
View File
@@ -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
+29
View File
@@ -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);
};
+52 -74
View File
@@ -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/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 "../Rendering/IRenderer.h"
#include "../Core/Transform.h" #include "../Rendering/Camera.h"
#include "../Core/EFileDropped.h" #include "../Rendering/ESetCamera.h"
#include "../Core/World.h"
#include "../Core/SystemPipeline.h"
#include "../Core/ResourceManager.h"
#include "../Core/EntityFilePreprocessor.h" #include "../Core/EntityFilePreprocessor.h"
#include "../Core/EntityFileParser.h" #include "../Core/EntityFileParser.h"
#include "../Core/EntityFileWriter.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 class EditorSystem : public ImpureSystem
{ {
public: 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: private:
IRenderer* m_Renderer; IRenderer* m_Renderer;
World* m_World = nullptr; RenderFrame* m_RenderFrame;
Camera* m_Camera = nullptr; 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; // State
bool m_Visible; double m_LastTime = 0.f;
boost::filesystem::path m_DefaultEntityDir; bool m_Enabled = true;
boost::filesystem::path m_CurrentFile; EditorGUI::WidgetMode m_WidgetMode = EditorGUI::WidgetMode::Translate;
std::vector<glm::vec2> m_PickingQueue; EditorGUI::WidgetSpace m_WidgetSpace = EditorGUI::WidgetSpace::Global;
EntityWrapper m_Widget = EntityWrapper::Invalid;
EntityWrapper m_CurrentSelection = EntityWrapper::Invalid;
enum class WidgetMode // Utility functions
{ EntityWrapper importEntity(EntityWrapper parent, boost::filesystem::path filePath);
None, void setWidgetMode(EditorGUI::WidgetMode mode);
Translate,
Rotate,
Scale
} m_WidgetMode = WidgetMode::None;
enum class WidgetSpace // GUI callbacks
{ void OnEntitySelected(EntityWrapper entity);
Local, void OnEntitySave(EntityWrapper entity, boost::filesystem::path filePath);
Global EntityWrapper OnEntityCreate(EntityWrapper parent);
} m_WidgetSpace = WidgetSpace::Global; 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; // Events
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);
EventRelay<EditorSystem, Events::MousePress> m_EMousePress; EventRelay<EditorSystem, Events::MousePress> m_EMousePress;
bool OnMousePress(const Events::MousePress& e); bool OnMousePress(const Events::MousePress& e);
EventRelay<EditorSystem, Events::MouseMove> m_EMouseMove; EventRelay<EditorSystem, Events::WidgetDelta> m_EWidgetDelta;
bool OnMouseMove(const Events::MouseMove& e); bool OnWidgetDelta(const Events::WidgetDelta& e);
EventRelay<EditorSystem, Events::FileDropped> m_EFileDropped; EventRelay<EditorSystem, Events::InputCommand> m_EInputCommand;
bool OnFileDropped(const Events::FileDropped& e); bool OnInputCommand(const Events::InputCommand& e);
EventRelay<EditorSystem, Events::SetCamera> m_ESetCamera;
void Picking(); bool OnSetCamera(const Events::SetCamera& e);
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);
}; };
@@ -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
+1
View File
@@ -8,3 +8,4 @@
#include <glm/gtc/quaternion.hpp> #include <glm/gtc/quaternion.hpp>
#include <glm/gtx/quaternion.hpp> #include <glm/gtx/quaternion.hpp>
#include <glm/gtc/type_ptr.hpp> #include <glm/gtc/type_ptr.hpp>
#include <glm/gtx/projection.hpp>
+3 -1
View File
@@ -2,6 +2,7 @@
#define Events_InputCommand_h__ #define Events_InputCommand_h__
#include "Core/EventBroker.h" #include "Core/EventBroker.h"
#include "Core/EntityWrapper.h"
namespace Events namespace Events
{ {
@@ -9,7 +10,8 @@ namespace Events
struct InputCommand : Event struct InputCommand : Event
{ {
/** Numerical ID of the player. */ /** Numerical ID of the player. */
unsigned int PlayerID; int PlayerID;
EntityWrapper Player;
/** The command that was sent. */ /** The command that was sent. */
std::string Command; std::string Command;
/** The value of the command. */ /** The value of the command. */
+210 -45
View File
@@ -4,67 +4,232 @@
#include "../GLM.h" #include "../GLM.h"
#include "../Core/InputController.h" #include "../Core/InputController.h"
#include "../Core/ELockMouse.h" #include "../Core/ELockMouse.h"
#include "InputHandler.h"
template <typename EventContext> template <typename EventContext>
class FirstPersonInputController : public InputController<EventContext> class FirstPersonInputController : public InputController<EventContext>
{ {
public: public:
FirstPersonInputController(EventBroker* eventBroker, unsigned int playerID) FirstPersonInputController(EventBroker* eventBroker, int playerID);
: InputController(eventBroker)
, m_PlayerID(playerID) virtual const glm::vec3 Movement() const { return m_Movement; }
{ virtual const glm::vec3 Rotation() const { return m_Rotation; }
EVENT_SUBSCRIBE_MEMBER(m_ELockMouse, &FirstPersonInputController::OnLockMouse); virtual bool Jumping() const { return m_Jumping; }
EVENT_SUBSCRIBE_MEMBER(m_EUnlockMouse, &FirstPersonInputController::OnUnlockMouse); 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();
void UnlockMouse();
virtual bool OnCommand(const Events::InputCommand& e) override;
virtual void Reset();
void LockMouse() void AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer);
{ virtual bool AssaultDashDoubleTapped() const { return m_AssaultDashDoubleTapped; }
Events::LockMouse e; virtual bool PlayerIsDashing() const { return m_PlayerIsDashing; }
m_EventBroker->Publish(e);
m_MouseLocked = true;
}
void UnlockMouse() protected:
{ const int m_PlayerID;
Events::UnlockMouse e; bool m_MouseLocked = false;
m_EventBroker->Publish(e); glm::vec3 m_Rotation;
m_MouseLocked = false; 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;
virtual bool OnCommand(const Events::InputCommand& e) override //specialabilitys
{ bool m_MovementKeyDown = false;
if (m_PlayerID != e.PlayerID) { bool m_SpecialAbilityKeyDown = false;
return false;
}
if (m_MouseLocked) { EventRelay<EventContext, Events::LockMouse> m_ELockMouse;
if (e.Command == "Pitch") { bool OnLockMouse(const Events::LockMouse& e);
float val = glm::radians(e.Value); EventRelay<EventContext, Events::UnlockMouse> m_EUnlockMouse;
m_Orientation = m_Orientation * glm::angleAxis<float>(-val, glm::vec3(1, 0, 0)); bool OnUnlockMouse(const Events::UnlockMouse& e);
return true; };
}
if (e.Command == "Yaw") { template <typename EventContext>
float val = glm::radians(e.Value); FirstPersonInputController<EventContext>::FirstPersonInputController(EventBroker* eventBroker, int playerID)
m_Orientation = glm::angleAxis<float>(-val, glm::vec3(0, 1, 0)) * m_Orientation; : InputController(eventBroker)
return true; , 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; return false;
} }
protected: if (e.Command == "Pitch") {
const unsigned int m_PlayerID; float val = glm::radians(e.Value);
glm::quat m_Orientation; m_Rotation.x += -val;
bool m_MouseLocked = false; //m_Rotation.x = glm::clamp(m_Rotation.x, -glm::half_pi<float>(), glm::half_pi<float>());
}
EventRelay<EventContext, Events::LockMouse> m_ELockMouse; if (e.Command == "Yaw") {
bool OnLockMouse(const Events::LockMouse& e) { m_MouseLocked = true; return true; } float val = glm::radians(e.Value);
EventRelay<EventContext, Events::UnlockMouse> m_EUnlockMouse; m_Rotation.y += -val;
bool OnUnlockMouse(const Events::UnlockMouse& e) { m_MouseLocked = false; return true; } }
};
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 #endif
+20 -10
View File
@@ -20,6 +20,7 @@
#include "Input/EInputCommand.h" #include "Input/EInputCommand.h"
#include "Core/EPlayerDamage.h" #include "Core/EPlayerDamage.h"
#include "Network/EInterpolate.h" #include "Network/EInterpolate.h"
#include "Core/EPlayerSpawned.h"
class Client : public Network class Client : public Network
{ {
@@ -35,20 +36,21 @@ private:
boost::asio::ip::udp::socket m_Socket; boost::asio::ip::udp::socket m_Socket;
// Sending message to server logic // Sending message to server logic
int bytesRead = -1; size_t bytesRead = 0;
char readBuf[INPUTSIZE] = { 0 }; char readBuf[INPUTSIZE] = { 0 };
// Packet loss logic // Packet loss logic
unsigned int m_PacketID = 0; PacketID m_PacketID = 0;
unsigned int m_PreviousPacketID = 0; PacketID m_PreviousPacketID = 0;
unsigned int m_SendPacketID = 0; PacketID m_SendPacketID = 0;
// Game logic // Game logic
World* m_World; World* m_World;
std::string m_PlayerName; std::string m_PlayerName;
int m_PlayerID = -1; PlayerID m_PlayerID = -1;
EntityID m_ServerEntityID = std::numeric_limits<EntityID>::max(); EntityID m_ServerEntityID = std::numeric_limits<EntityID>::max();
bool m_IsConnected = false; bool m_IsConnected = false;
EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
// Server Client Lookup map // Server Client Lookup map
// Assumes that root node for client and server is EntityID 0. // Assumes that root node for client and server is EntityID 0.
@@ -57,31 +59,36 @@ private:
std::unordered_map<EntityID, EntityID> m_ClientIDToServerID; std::unordered_map<EntityID, EntityID> m_ClientIDToServerID;
// Network logic // Network logic
PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; PlayerDefinition m_PlayerDefinitions[8];
SnapshotDefinitions m_NextSnapshot; SnapshotDefinitions m_NextSnapshot;
double m_DurationOfPingTime; double m_DurationOfPingTime;
std::clock_t m_StartPingTime; std::clock_t m_StartPingTime;
std::clock_t m_TimeSinceSentInputs;
unsigned int m_SendInputIntervalMs;
std::vector<Events::InputCommand> m_InputCommandBuffer; std::vector<Events::InputCommand> m_InputCommandBuffer;
// Private member functions // Private member functions
void readFromServer(); void readFromServer();
int receive(char* data, size_t length); size_t receive(char* data);
void send(Packet& packet); void send(Packet& packet);
void connect(); void connect();
void disconnect(); void disconnect();
void ping();
void parseMessageType(Packet& packet); void parseMessageType(Packet& packet);
void updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID, const std::string& componentType); void updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID, const std::string& componentType);
void parseConnect(Packet& packet); void parseConnect(Packet& packet);
void parsePlayerConnected(Packet& packet); void parsePlayerConnected(Packet& packet);
void parsePing(); 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 InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType);
void parseSnapshot(Packet& packet); void parseSnapshot(Packet& packet);
void identifyPacketLoss(); void identifyPacketLoss();
bool hasServerTimedOut(); bool hasServerTimedOut();
EntityID createPlayer(); EntityID createPlayer();
void sendInputCommands(); void sendInputCommands();
void sendLocalPlayerTransform();
void becomePlayer(); void becomePlayer();
// Mapping Logic // Mapping Logic
// Returns if local EntityID exist in map // Returns if local EntityID exist in map
@@ -89,13 +96,16 @@ private:
// Returns if server EntityID exist in map // Returns if server EntityID exist in map
bool serverClientMapsHasEntity(EntityID serverEntityID); bool serverClientMapsHasEntity(EntityID serverEntityID);
void insertIntoServerClientMaps(EntityID serverEntityID, EntityID clientEntityID); void insertIntoServerClientMaps(EntityID serverEntityID, EntityID clientEntityID);
void deleteFromServerClientMaps(EntityID serverEntityID, EntityID clientEntityID);
// Events // Events
EventBroker* m_EventBroker; EventBroker* m_EventBroker;
EventRelay<Client, Events::InputCommand> m_EInputCommand; EventRelay<Client, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(const Events::InputCommand& e); bool OnInputCommand(const Events::InputCommand& e);
EventRelay<Client, Events::PlayerDamage> m_EPlayeDamage; EventRelay<Client, Events::PlayerDamage> m_EPlayerDamage;
bool OnPlayerDamage(const Events::PlayerDamage& e); bool OnPlayerDamage(const Events::PlayerDamage& e);
EventRelay<Client, Events::PlayerSpawned> m_EPlayerSpawned;
bool OnPlayerSpawned(const Events::PlayerSpawned& e);
}; };
#endif #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
+11 -7
View File
@@ -5,16 +5,20 @@
// Used to determine what type of message was sent. // Used to determine what type of message was sent.
enum class MessageType enum class MessageType
{ {
Connect, Connect,
Disconnect, Disconnect,
ClientPing, Ping,
ServerPing, Message,
Message, Snapshot,
Snapshot,
OnInputCommand, OnInputCommand,
OnPlayerDamage, OnPlayerDamage,
PlayerConnected, PlayerConnected,
BecomePlayer BecomePlayer,
Kick,
OnPlayerSpawned,
EntityDeleted,
ComponentDeleted,
PlayerTransform
}; };
#endif #endif
+21 -3
View File
@@ -1,13 +1,20 @@
#ifndef Network_h__ #ifndef Network_h__
#define Network_h__ #define Network_h__
#include <ctime>
#include "Core/World.h" #include "Core/World.h"
#include "Core/EventBroker.h" #include "Core/EventBroker.h"
#include "Network/Packet.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 32000
#define INPUTSIZE 4097 typedef unsigned int PlayerID;
#define TIMEOUTMS 15000 typedef unsigned int PacketID;
class Network class Network
{ {
@@ -15,6 +22,17 @@ public:
virtual ~Network() { }; virtual ~Network() { };
virtual void Start(World* m_world, EventBroker *eventBroker) = 0; virtual void Start(World* m_world, EventBroker *eventBroker) = 0;
virtual void Update() = 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 #endif
+18
View File
@@ -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
+9 -7
View File
@@ -13,7 +13,7 @@ public:
// arg2: PacketID for identifying packet loss. // arg2: PacketID for identifying packet loss.
Packet(MessageType type, unsigned int& packetID); Packet(MessageType type, unsigned int& packetID);
// Used to create packet from already existing data buffer. // 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(MessageType type);
~Packet(); ~Packet();
void Init(MessageType type, unsigned int& packetID); void Init(MessageType type, unsigned int& packetID);
@@ -51,16 +51,18 @@ public:
std::string ReadString(); std::string ReadString();
char* ReadData(int SizeOfData); char* ReadData(int SizeOfData);
void ChangePacketID(unsigned int& packetID); void ChangePacketID(unsigned int& packetID);
int Size() { return m_Offset; }; size_t Size() { return m_Offset; };
char* Data() { return m_Data; }; char* Data() { return m_Data; };
unsigned int DataReadSize() { return m_ReturnDataOffset; } size_t DataReadSize() { return m_ReturnDataOffset; }
unsigned int MaxSize() { return m_MaxPacketSize; } size_t MaxSize() { return m_MaxPacketSize; }
size_t HeaderSize() { return m_HeaderSize; }
private: private:
char* m_Data; char* m_Data;
unsigned int m_ReturnDataOffset = 0; size_t m_ReturnDataOffset = 0;
int m_Offset = 0; size_t m_Offset = 0;
unsigned int m_MaxPacketSize = 512; size_t m_MaxPacketSize = 512;
size_t m_HeaderSize = 0;
void resizeData(); void resizeData();
}; };
+2 -1
View File
@@ -1,9 +1,10 @@
#ifndef PlayerDefinition_h__ #ifndef PlayerDefinition_h__
#define PlayerDefinition_h__ #define PlayerDefinition_h__
#include <string> #include <string>
#include "../Core/Entity.h"
struct PlayerDefinition { struct PlayerDefinition {
int EntityID = -1; ::EntityID EntityID = EntityID_Invalid;
std::string Name = ""; std::string Name = "";
boost::asio::ip::udp::endpoint Endpoint; boost::asio::ip::udp::endpoint Endpoint;
unsigned int PacketID; unsigned int PacketID;
+26 -13
View File
@@ -14,6 +14,10 @@
#include "../Network/Network.h" #include "../Network/Network.h"
#include "Input/EInputCommand.h" #include "Input/EInputCommand.h"
#include "Core/EPlayerDamage.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 class Server : public Network
{ {
@@ -29,18 +33,19 @@ private:
boost::asio::ip::udp::socket m_Socket; boost::asio::ip::udp::socket m_Socket;
// Sending messages to client logic // Sending messages to client logic
PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; std::map<PlayerID, PlayerDefinition> m_ConnectedPlayers;
std::vector<PlayerDefinition> m_ConnectedUsers; // HACK: Fix INPUTSIZE
char readBuffer[INPUTSIZE] = { 0 }; char readBuffer[INPUTSIZE] = { 0 };
int bytesRead = 0; size_t bytesRead = 0;
// time for previouse message // time for previouse message
std::clock_t previousePingMessage = std::clock(); std::clock_t previousePingMessage = std::clock();
std::clock_t previousSnapshotMessage = std::clock(); std::clock_t previousSnapshotMessage = std::clock();
std::clock_t timOutTimer = std::clock(); std::clock_t timOutTimer = std::clock();
// How often we send messages (milliseconds) // How often we send messages (milliseconds)
int intervalMs = 1000; float pingIntervalMs;
int snapshotInterval = 50; float snapshotInterval;
int checkTimeOutInterval = 100; int checkTimeOutInterval = 100;
int m_NextPlayerID = 0;
//Timers //Timers
std::clock_t m_StartPingTime; std::clock_t m_StartPingTime;
@@ -50,32 +55,40 @@ private:
EventBroker* m_EventBroker; EventBroker* m_EventBroker;
// Packet loss logic // Packet loss logic
unsigned int m_PacketID = 0; PacketID m_PacketID = 0;
unsigned int m_PreviousPacketID = 0; PacketID m_PreviousPacketID = 0;
// Private member functions // Private member functions
int receive(char* data, size_t length); size_t receive(char* data);
void readFromClients(); void readFromClients();
void send(Packet& packet, int playerID); void send(PlayerID player, Packet& packet);
void send(Packet& packet); void send(Packet& packet);
void broadcast(Packet& packet); void broadcast(Packet& packet);
void sendSnapshot(); void sendSnapshot();
void addChildrenToPacket(Packet& packet, EntityID entityID);
void sendPing(); void sendPing();
void checkForTimeOuts(); void checkForTimeOuts();
void disconnect(int i); void disconnect(PlayerID playerID);
void parseMessageType(Packet& packet); void parseMessageType(Packet& packet);
void parseOnInputCommand(Packet& packet); void parseOnInputCommand(Packet& packet);
void parseOnPlayerDamage(Packet& packet); void parseOnPlayerDamage(Packet& packet);
void parseConnect(Packet& packet); void parseConnect(Packet& packet);
void parseDisconnect(); void parseDisconnect();
void parseClientPing(); void parseClientPing();
void parseServerPing(); void parsePing();
void identifyPacketLoss(); void identifyPacketLoss();
void createPlayer(); void kick(PlayerID player);
int GetPlayerIDFromEndpoint(boost::asio::ip::udp::endpoint endpoint); PlayerID GetPlayerIDFromEndpoint(boost::asio::ip::udp::endpoint endpoint);
// Debug event // Debug event
EventRelay<Server, Events::InputCommand> m_EInputCommand; EventRelay<Server, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(const Events::InputCommand& e); 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 #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
+3 -1
View File
@@ -2,6 +2,7 @@
#define Camera_h__ #define Camera_h__
#include "../GLM.h" #include "../GLM.h"
#include "../Core/Util/Rectangle.h"
class Camera class Camera
{ {
@@ -32,7 +33,6 @@ public:
glm::mat4 ViewMatrix() const { return m_ViewMatrix; } glm::mat4 ViewMatrix() const { return m_ViewMatrix; }
void SetViewMatrix(glm::mat4 val); void SetViewMatrix(glm::mat4 val);
float AspectRatio() const { return m_AspectRatio; } float AspectRatio() const { return m_AspectRatio; }
void SetAspectRatio(float val); void SetAspectRatio(float val);
@@ -48,6 +48,8 @@ public:
void UpdateViewMatrix(); void UpdateViewMatrix();
void UpdateProjectionMatrix(); void UpdateProjectionMatrix();
glm::vec2 WorldToScreen(glm::vec3 worldCoord, Rectangle resolution);
private: private:
glm::vec3 m_Position; 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;
};
+63
View File
@@ -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
+40 -3
View File
@@ -17,22 +17,59 @@ public:
void InitializeTextures(); void InitializeTextures();
void InitializeFrameBuffers(); void InitializeFrameBuffers();
void InitializeShaderPrograms(); void InitializeShaderPrograms();
void Draw(RenderScene& scene); 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: private:
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const; 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_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 IRenderer* m_Renderer;
const LightCullingPass* m_LightCullingPass; const LightCullingPass* m_LightCullingPass;
ShaderProgram* m_ForwardPlusProgram; ShaderProgram* m_ForwardPlusProgram;
ShaderProgram* m_ExplosionEffectProgram;
ShaderProgram* m_ShieldToStencilProgram;
ShaderProgram* m_FillDepthBufferProgram;
}; };
#endif #endif
@@ -6,10 +6,17 @@
class DrawFinalPassState : public RenderState class DrawFinalPassState : public RenderState
{ {
public: public:
DrawFinalPassState(); DrawFinalPassState(GLuint frameBuffer);
~DrawFinalPassState(); ~DrawFinalPassState();
private: private:
}; };
class DrawStencilState : public RenderState
{
public:
DrawStencilState(GLuint frameBuffer);
~DrawStencilState();
};
#endif #endif
-42
View File
@@ -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 -8
View File
@@ -2,20 +2,14 @@
#define Events_SetCamera_h__ #define Events_SetCamera_h__
#include "../Core/EventBroker.h" #include "../Core/EventBroker.h"
#include "../Core/Entity.h" #include "../Core/EntityWrapper.h"
#include <string.h>
namespace Events namespace Events
{ {
struct SetCamera : Event struct SetCamera : Event
{ {
public: EntityWrapper CameraEntity;
SetCamera() { };
std::string Name;
private:
}; };
} }
@@ -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
+36
View File
@@ -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
+7 -16
View File
@@ -25,37 +25,28 @@ class IRenderer
{ {
public: public:
GLFWwindow* Window() const { return m_Window; } GLFWwindow* Window() const { return m_Window; }
//Returns screen size including window border and header
Rectangle Resolution() const { return m_Resolution; } 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; } 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; } bool VSYNC() const { return m_VSYNC; }
void SetVSYNC(bool vsync) { m_VSYNC = vsync; } virtual void SetVSYNC(bool vsync) { m_VSYNC = vsync; }
::Camera* Camera() const { return m_Camera; } //Returns screen size excluding window border and header
void SetCamera(::Camera* camera) Rectangle GetViewportSize() const { return m_ViewportSize; }
{
if (camera == nullptr) {
m_Camera = m_DefaultCamera;
} else {
m_Camera = camera;
}
}
virtual void Initialize() = 0; virtual void Initialize() = 0;
virtual void Update(double dt) = 0; virtual void Update(double dt) = 0;
virtual void Draw(RenderFrame& rq) = 0; virtual void Draw(RenderFrame& rq) = 0;
virtual PickData Pick(glm::vec2 screenCord) = 0; virtual PickData Pick(glm::vec2 screenCord) = 0;
World* m_World; //Temp world, untill viktor merge.
protected: protected:
Rectangle m_Resolution = Rectangle::Rectangle(1280, 720); Rectangle m_Resolution = Rectangle::Rectangle(1280, 720);
Rectangle m_ViewportSize = Rectangle::Rectangle(1280, 720);
bool m_Fullscreen = false; bool m_Fullscreen = false;
bool m_VSYNC = false; bool m_VSYNC = false;
int m_GLVersion[2]; int m_GLVersion[2];
std::string m_GLVendor; std::string m_GLVendor;
GLFWwindow* m_Window = nullptr; GLFWwindow* m_Window = nullptr;
::Camera* m_DefaultCamera;
::Camera* m_Camera = nullptr;
}; };
#endif // Renderer_h__ #endif // Renderer_h__
+4 -4
View File
@@ -1,7 +1,8 @@
#ifndef Model_h__ #ifndef Model_h__
#define Model_h__ #define Model_h__
#include "RawModel.h" #include "Rendering/RawModelCustom.h"
//#include "Rendering/RawModelAssimp.h"
#include "../OpenGL.h" #include "../OpenGL.h"
class Model : public ThreadUnsafeResource class Model : public ThreadUnsafeResource
@@ -19,12 +20,11 @@ public:
GLuint VAO; GLuint VAO;
GLuint ElementBuffer; GLuint ElementBuffer;
RawModel* m_RawModel;
private: private:
RawModel* m_RawModel;
GLuint VertexBuffer; GLuint VertexBuffer;
GLuint DiffuseVertexColorBuffer;
GLuint SpecularVertexColorBuffer;
GLuint NormalBuffer; GLuint NormalBuffer;
GLuint TangentNormalsBuffer; GLuint TangentNormalsBuffer;
GLuint BiTangentNormalsBuffer; GLuint BiTangentNormalsBuffer;
+47 -4
View File
@@ -13,17 +13,38 @@
#include "Camera.h" #include "Camera.h"
#include "../Core/World.h" #include "../Core/World.h"
#include "../Core/Transform.h" #include "../Core/Transform.h"
#include "Skeleton.h"
struct ModelJob : RenderJob 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() : RenderJob()
{ {
Model = model; Model = model;
TextureID = (matGroup.Texture) ? matGroup.Texture->ResourceID : 0; TextureID = (matGroup.Texture) ? matGroup.Texture->ResourceID : 0;
DiffuseTexture = matGroup.Texture.get(); if (modelComponent["DiffuseTexture"]) {
NormalTexture = matGroup.NormalMap.get(); DiffuseTexture = matGroup.Texture.get();
SpecularTexture = matGroup.SpecularMap.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; StartIndex = matGroup.StartIndex;
EndIndex = matGroup.EndIndex; EndIndex = matGroup.EndIndex;
Matrix = matrix; Matrix = matrix;
@@ -33,6 +54,16 @@ struct ModelJob : RenderJob
glm::vec3 worldpos = glm::vec3(camera->ViewMatrix() * glm::vec4(abspos, 1)); glm::vec3 worldpos = glm::vec3(camera->ViewMatrix() * glm::vec4(abspos, 1));
Depth = worldpos.z; Depth = worldpos.z;
World = world; World = world;
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; unsigned int TextureID;
@@ -43,13 +74,25 @@ struct ModelJob : RenderJob
const Texture* DiffuseTexture; const Texture* DiffuseTexture;
const Texture* NormalTexture; const Texture* NormalTexture;
const Texture* SpecularTexture; const Texture* SpecularTexture;
const Texture* IncandescenceTexture;
float Shininess = 0.f; float Shininess = 0.f;
glm::vec4 Color; glm::vec4 Color;
const ::Model* Model = nullptr; 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 StartIndex = 0;
unsigned int EndIndex = 0; unsigned int EndIndex = 0;
World* World; World* World;
glm::vec4 FillColor = glm::vec4(0);
float FillPercentage = 0.0;
void CalculateHash() override void CalculateHash() override
{ {
Hash = TextureID; Hash = TextureID;
+1 -4
View File
@@ -1,8 +1,6 @@
#ifndef PickingPass_h__ #ifndef PickingPass_h__
#define PickingPass_h__ #define PickingPass_h__
#include "IRenderer.h" #include "IRenderer.h"
#include "PickingPassState.h" #include "PickingPassState.h"
#include "FrameBuffer.h" #include "FrameBuffer.h"
@@ -10,8 +8,7 @@
#include "Util/UnorderedMapiVec2.h" #include "Util/UnorderedMapiVec2.h"
#include "../Core/EventBroker.h" #include "../Core/EventBroker.h"
#include "../Core/World.h" #include "../Core/World.h"
#include "Rendering/Skeleton.h"
class PickingPass class PickingPass
{ {
@@ -1,5 +1,7 @@
#ifndef RawModel_h__ #ifndef RawModelAssimp_h__
#define RawModel_h__ #define RawModelAssimp_h__
#ifdef USING_ASSIMP_AS_IMPORTER
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
@@ -18,29 +20,27 @@
#include "Texture.h" #include "Texture.h"
#include "Skeleton.h" #include "Skeleton.h"
class RawModel : public Resource #define RawModel RawModelAssimp
class RawModelAssimp : public Resource
{ {
friend class ResourceManager; friend class ResourceManager;
protected: protected:
RawModel(std::string fileName); RawModelAssimp(std::string fileName);
public: public:
~RawModel(); ~RawModelAssimp();
struct Vertex struct Vertex
{ {
glm::vec3 Position; glm::vec3 Position;
glm::vec3 Normal; glm::vec3 Normal;
glm::vec3 Tangent; glm::vec3 Tangent;
glm::vec3 BiTangent; glm::vec3 BiNormal;
glm::vec2 TextureCoords; glm::vec2 TextureCoords;
glm::vec4 DiffuseVertexColor; glm::vec4 BoneIndices;
glm::vec4 SpecularVertexColor; glm::vec4 BoneWeights;
glm::vec4 BoneIndices1;
glm::vec4 BoneIndices2;
glm::vec4 BoneWeights1;
glm::vec4 BoneWeights2;
}; };
struct MaterialGroup struct MaterialGroup
@@ -68,8 +68,6 @@ private:
std::vector<glm::ivec2> BoneIndices; std::vector<glm::ivec2> BoneIndices;
std::vector<glm::vec2> BoneWeights; std::vector<glm::vec2> BoneWeights;
std::vector<glm::vec3> Normals; std::vector<glm::vec3> Normals;
std::vector<glm::vec4> DiffuseVertexColor;
std::vector<glm::vec4> SpecularVertexColor;
std::vector<glm::vec3> TangentNormals; std::vector<glm::vec3> TangentNormals;
std::vector<glm::vec3> BiTangentNormals; std::vector<glm::vec3> BiTangentNormals;
std::vector<glm::vec2> TextureCoords; std::vector<glm::vec2> TextureCoords;
@@ -78,3 +76,4 @@ private:
}; };
#endif #endif
#endif
+102
View File
@@ -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
-1
View File
@@ -14,7 +14,6 @@ struct RenderJob
friend class RenderQueue; friend class RenderQueue;
public: public:
float Depth; float Depth;
protected: protected:
+26 -43
View File
@@ -11,63 +11,47 @@
#include "Camera.h" #include "Camera.h"
#include "RenderJob.h" #include "RenderJob.h"
#include "ModelJob.h" #include "ModelJob.h"
#include "TextJob.h"
#include "PointLightJob.h" #include "PointLightJob.h"
#include "DirectionalLightJob.h" #include "DirectionalLightJob.h"
#include "ExplosionEffectJob.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;
}
};
*/
struct RenderScene struct RenderScene
{ {
::Camera* Camera; ::Camera* Camera = nullptr;
std::list<std::shared_ptr<RenderJob>> ForwardJobs; struct Queues {
std::list<std::shared_ptr<RenderJob>> PointLightJobs; std::list<std::shared_ptr<RenderJob>> OpaqueObjects;
std::list<std::shared_ptr<RenderJob>> DirectionalLightJobs; 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; Rectangle Viewport;
bool ClearDepth = false;
glm::vec4 AmbientColor;
void Clear() void Clear()
{ {
ForwardJobs.clear(); Jobs.OpaqueObjects.clear();
PointLightJobs.clear(); Jobs.TransparentObjects.clear();
DirectionalLightJobs.clear(); Jobs.OpaqueShieldedObjects.clear();
Jobs.TransparentShieldedObjects.clear();
Jobs.ShieldObjects.clear();
Jobs.Text.clear();
Jobs.DirectionalLight.clear();
} }
}; };
struct RenderFrame struct RenderFrame
{ {
public: public:
//TODO: Getters
GLfloat Gamma = 2.2f;
GLfloat Exposure = 1.f;
void Add(RenderScene &scene) void Add(RenderScene &scene)
{ {
@@ -97,5 +81,4 @@ public:
private: private:
int m_Size = 0; int m_Size = 0;
}; };
#endif #endif
+5 -1
View File
@@ -2,6 +2,7 @@
#define RenderState_h__ #define RenderState_h__
#include <functional> #include <functional>
#include <boost/range/adaptor/reversed.hpp>
#include "../Common.h" #include "../Common.h"
#include "../OpenGL.h" #include "../OpenGL.h"
#include "../GLM.h" #include "../GLM.h"
@@ -16,10 +17,13 @@ public:
bool Disable(GLenum cap); bool Disable(GLenum cap);
bool CullFace(GLenum mode); bool CullFace(GLenum mode);
bool ClearColor(glm::vec4 color); bool ClearColor(glm::vec4 color);
bool Clear(GLbitfield mask);
bool BindFramebuffer(GLint framebuffer); bool BindFramebuffer(GLint framebuffer);
bool BlendEquation(GLenum mode); bool BlendEquation(GLenum mode);
bool BlendFunc(GLenum sfactor, GLenum dfactor); 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: private:
std::vector<std::function<void(void)>> m_ResetFunctions; std::vector<std::function<void(void)>> m_ResetFunctions;
+18 -21
View File
@@ -15,42 +15,39 @@
#include "Renderer.h" #include "Renderer.h"
#include "PointLightJob.h" #include "PointLightJob.h"
#include "../Core/Transform.h" #include "../Core/Transform.h"
#include "DebugCameraInputController.h" #include "../Core/EPlayerSpawned.h"
class RenderSystem : public ImpureSystem class RenderSystem : public ImpureSystem
{ {
public: public:
RenderSystem(EventBroker* eventBrokerer, const IRenderer* renderer, RenderFrame* renderFrame); RenderSystem(World* world, EventBroker* eventBrokerer, const IRenderer* renderer, RenderFrame* renderFrame);
~RenderSystem(); ~RenderSystem();
virtual void Update(World* world, double dt) override; virtual void Update(double dt) override;
private: private:
World* m_World = nullptr;
const IRenderer* m_Renderer; const IRenderer* m_Renderer;
RenderFrame* m_RenderFrame; RenderFrame* m_RenderFrame;
bool m_SwitchCamera = false;
Camera* m_Camera; Camera* m_Camera;
DebugCameraInputController<RenderSystem>* m_DebugCameraInputController; World* m_World;
EntityWrapper m_CurrentCamera = EntityWrapper::Invalid;
std::list<ComponentWrapper> m_CameraComponents; EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
EventRelay<RenderSystem, Events::SetCamera> m_ESetCamera; EventRelay<RenderSystem, Events::SetCamera> m_ESetCamera;
bool OnSetCamera(const Events::SetCamera &event); bool OnSetCamera(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 fillPointLights(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
void fillDirectionalLights(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
EventRelay<RenderSystem, Events::InputCommand> m_EInputCommand; EventRelay<RenderSystem, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(const Events::InputCommand& e); 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 #endif
+15 -5
View File
@@ -11,13 +11,17 @@
#include "FrameBuffer.h" #include "FrameBuffer.h"
#include "../Core/World.h" #include "../Core/World.h"
#include "PickingPass.h" #include "PickingPass.h"
#include "DrawScenePass.h"
#include "LightCullingPass.h" #include "LightCullingPass.h"
#include "DrawFinalPass.h" #include "DrawFinalPass.h"
#include "DrawScreenQuadPass.h"
#include "DrawBloomPass.h"
#include "DrawColorCorrectionPass.h"
#include "../Core/EventBroker.h" #include "../Core/EventBroker.h"
#include "ImGuiRenderPass.h" #include "ImGuiRenderPass.h"
#include "Camera.h" #include "Camera.h"
#include "../Core/Transform.h" #include "../Core/Transform.h"
#include "imgui/imgui.h"
#include "TextPass.h"
class Renderer : public IRenderer class Renderer : public IRenderer
{ {
@@ -35,6 +39,7 @@ public:
private: private:
//----------------------Variables----------------------// //----------------------Variables----------------------//
EventBroker* m_EventBroker; EventBroker* m_EventBroker;
TextPass* m_TextPass;
Texture* m_ErrorTexture; Texture* m_ErrorTexture;
Texture* m_WhiteTexture; Texture* m_WhiteTexture;
@@ -43,11 +48,15 @@ private:
Model* m_UnitQuad; Model* m_UnitQuad;
Model* m_UnitSphere; Model* m_UnitSphere;
DrawScenePass* m_DrawScenePass; int m_DebugTextureToDraw = 0;
PickingPass* m_PickingPass; PickingPass* m_PickingPass;
LightCullingPass* m_LightCullingPass; LightCullingPass* m_LightCullingPass;
ImGuiRenderPass* m_ImGuiRenderPass; ImGuiRenderPass* m_ImGuiRenderPass;
DrawFinalPass* m_DrawFinalPass; DrawFinalPass* m_DrawFinalPass;
DrawScreenQuadPass* m_DrawScreenQuadPass;
DrawBloomPass* m_DrawBloomPass;
DrawColorCorrectionPass* m_DrawColorCorrectionPass;
//----------------------Functions----------------------// //----------------------Functions----------------------//
void InitializeWindow(); void InitializeWindow();
@@ -57,14 +66,15 @@ private:
//TODO: Renderer: Get InputUpdate out of renderer //TODO: Renderer: Get InputUpdate out of renderer
void InputUpdate(double dt); void InputUpdate(double dt);
//void PickingPass(RenderQueueCollection& rq); //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); } static bool DepthSort(const std::shared_ptr<RenderJob> &i, const std::shared_ptr<RenderJob> &j) { return (i->Depth < j->Depth); }
void SortRenderJobsByDepth(RenderScene &scene); void SortRenderJobsByDepth(RenderScene &scene);
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type); void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
//--------------------ShaderPrograms-------------------// //--------------------ShaderPrograms-------------------//
ShaderProgram* m_BasicForwardProgram; ShaderProgram* m_BasicForwardProgram;
ShaderProgram* m_DrawScreenQuadProgram; ShaderProgram* m_ExplosionEffectProgram;
}; };
#endif #endif
+2 -1
View File
@@ -4,6 +4,7 @@
#include <sstream> #include <sstream>
#include "Common.h" #include "Common.h"
#include "../GLM.h" #include "../GLM.h"
#include <glm/gtx/matrix_decompose.hpp>
//struct Bone //struct Bone
//{ //{
@@ -38,9 +39,9 @@ public:
, OffsetMatrix(offsetMatrix) , OffsetMatrix(offsetMatrix)
{ } { }
int ID;
std::string Name; std::string Name;
glm::mat4 OffsetMatrix; glm::mat4 OffsetMatrix;
int ID;
Bone* Parent; Bone* Parent;
std::vector<Bone*> Children; std::vector<Bone*> Children;
+58
View File
@@ -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
+33
View File
@@ -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
+15
View File
@@ -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
+1
View File
@@ -18,6 +18,7 @@ public:
void Bind(GLenum textureUnit = GL_TEXTURE0); void Bind(GLenum textureUnit = GL_TEXTURE0);
GLuint m_Texture = 0; GLuint m_Texture = 0;
}; };
#endif #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
+1 -1
View File
@@ -9,7 +9,7 @@ inline bool _GLERROR(const char* info, const char* file, const char* func, unsig
GLenum error = glGetError(); GLenum error = glGetError();
if (error != GL_NO_ERROR) if (error != GL_NO_ERROR)
{ {
_LOG(LOG_LEVEL_ERROR, file, func, line, "GL Error: %s, %i, %s", info, error, gluErrorString(error)); _LOG(LOG_LEVEL_ERROR, file, func, line, "GL Error: %s\nError code: %i, %s\n", info, error, gluErrorString(error));
return true; return true;
} }
+24
View File
@@ -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;
//}
}
};
+6 -2
View File
@@ -14,12 +14,15 @@
#include "Core/EKeyDown.h" #include "Core/EKeyDown.h"
#include "Core/EntityFilePreprocessor.h" #include "Core/EntityFilePreprocessor.h"
#include "Core/SystemPipeline.h" #include "Core/SystemPipeline.h"
#include "ExplosionEffectSystem.h"
#include "Editor/EditorSystem.h" #include "Editor/EditorSystem.h"
#include "Core/EntityFile.h" #include "Core/EntityFile.h"
#include "Rendering/RenderSystem.h" #include "Rendering/RenderSystem.h"
#include "Core/EntityFileParser.h" #include "Core/EntityFileParser.h"
#include "Core/Octree.h" #include "Core/Octree.h"
#include "Rendering/Font.h"
#include "Systems/InterpolationSystem.h" #include "Systems/InterpolationSystem.h"
#include "Collision/EntityAABB.h"
// Network // Network
#include <boost/thread.hpp> #include <boost/thread.hpp>
#include "Network/Network.h" #include "Network/Network.h"
@@ -47,8 +50,9 @@ private:
InputProxy* m_InputProxy; InputProxy* m_InputProxy;
GUI::Frame* m_FrameStack; GUI::Frame* m_FrameStack;
World* m_World; World* m_World;
Octree<AABB>* m_OctreeCollision; Octree<EntityAABB>* m_OctreeCollision;
Octree<AABB>* m_OctreeFrustrumCulling; Octree<EntityAABB>* m_OctreeTrigger;
Octree<EntityAABB>* m_OctreeFrustrumCulling;
SystemPipeline* m_SystemPipeline; SystemPipeline* m_SystemPipeline;
RenderFrame* m_RenderFrame; RenderFrame* m_RenderFrame;
// Network variables // Network variables
+5 -5
View File
@@ -17,10 +17,10 @@ class CapturePointSystem : public PureSystem
{ {
public: public:
//WARNING: on new map, destroy all info in the vectors, as well as reset all variables (just make new?) //WARNING: on new map, destroy all info in the vectors, as well as reset all variables (just make new?)
CapturePointSystem(EventBroker* eventBroker); CapturePointSystem(World* world, EventBroker* eventBroker);
//updatecomponent //updatecomponent
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& capturePoint, double dt) override; virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& capturePoint, double dt) override;
private: private:
//methods which will take care of specific events //methods which will take care of specific events
@@ -40,7 +40,7 @@ private:
int m_BlueTeamHomeCapturePoint = m_NotACapturePoint; int m_BlueTeamHomeCapturePoint = m_NotACapturePoint;
int m_NumberOfCapturePoints = 0; int m_NumberOfCapturePoints = 0;
std::map<int, EntityID> m_CapturePointNumberToEntityIDMap; std::map<int, EntityWrapper> m_CapturePointNumberToEntityMap;
//std::vector<ComponentWrapper> //std::vector<ComponentWrapper>
@@ -48,8 +48,8 @@ private:
bool m_ResetTimers = false; bool m_ResetTimers = false;
//vectors which will keep track of enter/leave changes //vectors which will keep track of enter/leave changes
std::vector<std::tuple<EntityID, EntityID>> m_ETriggerTouchVector; std::vector<std::tuple<EntityWrapper, EntityWrapper>> m_ETriggerTouchVector;
std::vector<std::tuple<EntityID, EntityID>> m_ETriggerLeaveVector; std::vector<std::tuple<EntityWrapper, EntityWrapper>> m_ETriggerLeaveVector;
}; };
#endif #endif
+5 -4
View File
@@ -12,21 +12,22 @@
#include <tuple> #include <tuple>
#include <vector> #include <vector>
#include <algorithm>
class HealthSystem : public PureSystem class HealthSystem : public PureSystem
{ {
public: public:
HealthSystem(EventBroker* eventBroker); HealthSystem(World* world, EventBroker* eventBroker);
//updatecomponent //updatecomponent
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt) override; virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override;
private: private:
//methods which will take care of specific events //methods which will take care of specific events
EventRelay<HealthSystem, Events::PlayerDamage> m_EPlayerDamage; 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; 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 //vector which will keep track of health changes
std::vector<std::tuple<EntityID, double>> m_DeltaHealthVector; std::vector<std::tuple<EntityID, double>> m_DeltaHealthVector;
+11 -11
View File
@@ -10,11 +10,12 @@
#include "Common.h" #include "Common.h"
#include "Core/System.h" #include "Core/System.h"
#include "Core/EventBroker.h" #include "Core/EventBroker.h"
#include "Core/ResourceManager.h"
#include "Core/ConfigFile.h"
#include "Core/EPlayerSpawned.h"
#include "Network/EInterpolate.h" #include "Network/EInterpolate.h"
#define SNAPSHOTINTERVAL 0.05f
class InterpolationSystem : public PureSystem class InterpolationSystem : public PureSystem
{ {
struct Transform struct Transform
@@ -22,32 +23,31 @@ class InterpolationSystem : public PureSystem
glm::vec3 Position; glm::vec3 Position;
glm::vec3 Scale; glm::vec3 Scale;
glm::quat Orientation; glm::quat Orientation;
double interpolationTime; float interpolationTime;
}; };
public: public:
InterpolationSystem(EventBroker* eventBroker) InterpolationSystem(World* world, EventBroker* eventBroker);
: System(eventBroker)
, PureSystem("Transform")
{
EVENT_SUBSCRIBE_MEMBER(m_EInterpolate, &InterpolationSystem::OnInterpolate);
}
~InterpolationSystem() { } ~InterpolationSystem() { }
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& transform, double dt) override; virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& transform, double dt) override;
private: private:
std::unordered_map<EntityID, Transform> m_NextTransform; std::unordered_map<EntityID, Transform> m_NextTransform;
std::unordered_map<EntityID, Transform> m_LastReceivedTransform; std::unordered_map<EntityID, Transform> m_LastReceivedTransform;
EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
//glm::vec3 vectorInterpolation(glm::vec3 prev, glm::vec3 next, double currentTime); //glm::vec3 vectorInterpolation(glm::vec3 prev, glm::vec3 next, double currentTime);
template <typename T> template <typename T>
T vectorInterpolation(T prev, T next, double currentTime) T vectorInterpolation(T prev, T next, double currentTime)
{ {
T difference = next - prev; T difference = next - prev;
T vector = (difference / SNAPSHOTINTERVAL) * static_cast<float>(currentTime); T vector = (difference / m_SnapshotInterval) * static_cast<float>(currentTime);
return vector; return vector;
} }
float m_SnapshotInterval;
EventRelay<InterpolationSystem, Events::Interpolate> m_EInterpolate; EventRelay<InterpolationSystem, Events::Interpolate> m_EInterpolate;
bool InterpolationSystem::OnInterpolate(const Events::Interpolate& e); bool InterpolationSystem::OnInterpolate(const Events::Interpolate& e);
EventRelay<InterpolationSystem, Events::PlayerSpawned> m_EPlayerSpawned;
bool OnPlayerSpawned(Events::PlayerSpawned& e);
}; };
#endif #endif
+21
View File
@@ -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
+33
View File
@@ -0,0 +1,33 @@
#ifndef PickupSpawnSystem_h__
#define PickupSpawnSystem_h__
#include "Core/System.h"
#include "Core/Transform.h"
#include "Core/ResourceManager.h"
#include "Core/EntityFileParser.h"
#include "Core/EPickupSpawned.h"
#include "Core/EPlayerHealthPickup.h"
#include "Engine/Collision/ETrigger.h"
#include "Common.h"
#include <tuple>
class PickupSpawnSystem : public ImpureSystem
{
public:
PickupSpawnSystem(World* world, EventBroker* eventBroker);
virtual void Update(double dt) override;
private:
EventRelay<PickupSpawnSystem, Events::TriggerTouch> m_ETriggerTouch;
bool OnTriggerTouch(Events::TriggerTouch& e);
struct NewHealthPickup {
glm::vec3 Pos;
double HealthGain;
double RespawnTimer;
double DecreaseThisRespawnTimer;
};
std::vector<NewHealthPickup> m_ETriggerTouchVector;
};
#endif
+29
View File
@@ -0,0 +1,29 @@
#ifndef PlayerDeathSystem_h__
#define PlayerDeathSystem_h__
#include "Core/System.h"
#include "Input/EInputCommand.h"
#include "GLM.h"
#include "Rendering/ESetCamera.h"
#include "Core/ConfigFile.h"
#include "Core/EntityFile.h"
#include "Core/EntityFileParser.h"
#include "Core/EPlayerDeath.h"
class PlayerDeathSystem : public ImpureSystem
{
public:
PlayerDeathSystem(World* world, EventBroker* eventBroker);
virtual void Update(double dt) override;
private:
EventRelay<PlayerDeathSystem, Events::PlayerDeath> m_OnPlayerDeath;
bool OnPlayerDeath(Events::PlayerDeath& e);
void createDeathEffect(EntityWrapper player);
};
#endif
+23
View File
@@ -0,0 +1,23 @@
#ifndef PlayerHUD_h__
#define PlayerHUD_h__
#include "../../Engine/Core/System.h"
#include "../../Engine/GLM.h"
#include "../../Engine/Rendering/ESetCamera.h"
#include <imgui/imgui.h>
class PlayerHUD : public ImpureSystem
{
public:
PlayerHUD(World* world, EventBroker* eventBrokerer);
~PlayerHUD();
virtual void Update(double dt) override;
private:
World* m_World;
EventBroker* m_EventBroker;
};
#endif
+16 -6
View File
@@ -1,14 +1,24 @@
#include "Common.h" #include "Common.h"
#include "GLM.h" #include "GLM.h"
#include "Core/System.h" #include "Core/System.h"
#include "Core/EPlayerSpawned.h"
#include "Input/FirstPersonInputController.h"
#include <imgui/imgui.h>
class PlayerMovementSystem : public PureSystem class PlayerMovementSystem : public ImpureSystem, PureSystem
{ {
public: public:
PlayerMovementSystem(EventBroker* eventBroker) PlayerMovementSystem(World* world, EventBroker* eventBroker);
: System(eventBroker) ~PlayerMovementSystem();
, PureSystem("Player")
{ } virtual void Update(double dt) override;
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt);
private:
// State
std::unordered_map<EntityWrapper, FirstPersonInputController<PlayerMovementSystem>*> m_PlayerInputControllers;
EventRelay<PlayerMovementSystem, Events::PlayerSpawned> m_EPlayerSpawned;
bool OnPlayerSpawned(Events::PlayerSpawned& e);
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt);
}; };
+18 -4
View File
@@ -2,17 +2,31 @@
#include "Input/EInputCommand.h" #include "Input/EInputCommand.h"
#include "Systems/SpawnerSystem.h" #include "Systems/SpawnerSystem.h"
#include "Events/ESpawnerSpawn.h" #include "Events/ESpawnerSpawn.h"
#include "Core/EPlayerSpawned.h"
#include "Core/EPlayerDeath.h"
#include "Rendering/ESetCamera.h"
#include "Core/ConfigFile.h"
class PlayerSpawnSystem : public ImpureSystem class PlayerSpawnSystem : public ImpureSystem
{ {
public: public:
PlayerSpawnSystem(EventBroker* eventBroker); PlayerSpawnSystem(World* world, EventBroker* eventBroker);
virtual void Update(World* world, double dt) override; virtual void Update(double dt) override;
private: private:
struct SpawnRequest
{
int PlayerID;
ComponentInfo::EnumType Team;
};
bool m_NetworkEnabled = false;
std::vector<SpawnRequest> m_SpawnRequests;
std::map<int, EntityWrapper> m_PlayerEntities;
EventRelay<PlayerSpawnSystem, Events::InputCommand> m_OnInputCommand; EventRelay<PlayerSpawnSystem, Events::InputCommand> m_OnInputCommand;
bool OnInputCommand(const Events::InputCommand& e); bool OnInputCommand(const Events::InputCommand& e);
EventRelay<PlayerSpawnSystem, Events::PlayerSpawned> m_OnPlayerSpawnerd;
std::vector<int> m_SpawnRequests; bool OnPlayerSpawned(Events::PlayerSpawned& e);
}; };
+4 -4
View File
@@ -4,14 +4,14 @@
class RaptorCopterSystem : public PureSystem class RaptorCopterSystem : public PureSystem
{ {
public: public:
RaptorCopterSystem(EventBroker* eventBroker) RaptorCopterSystem(World* world, EventBroker* eventBroker)
: System(eventBroker) : System(world, eventBroker)
, PureSystem("RaptorCopter") , PureSystem("RaptorCopter")
{ } { }
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt) override virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override
{ {
ComponentWrapper& transform = world->GetComponent(component.EntityID, "Transform"); ComponentWrapper& transform = m_World->GetComponent(component.EntityID, "Transform");
(glm::vec3&)transform["Orientation"] += (float)(double)component["Speed"] * (float)dt * (glm::vec3)component["Axis"]; (glm::vec3&)transform["Orientation"] += (float)(double)component["Speed"] * (float)dt * (glm::vec3)component["Axis"];
} }
}; };

Some files were not shown because too many files have changed in this diff Show More