Compare commits

..

400 Commits

Author SHA1 Message Date
Jace 9b98bbbea8 Fields are now set to dirty when they're changed! 2016-03-12 01:26:03 +01:00
Jace 80649ce51d Updated the ENTIRE CODEBASE TO MATCH 2016-03-12 00:38:33 +01:00
Jace a4b0b108d4 Created a wrapper for field types that is able to detect changes to set dirty flags in the future 2016-03-12 00:38:26 +01:00
Jace b7d93058b1 Added base work for dity bits in components 2016-03-08 21:11:59 +01:00
Jace 5d53fc74cb Merge branch 'Dirtybit' of github.com:teamfisk/TacticalZ into Dirtybit 2016-03-08 15:46:21 +01:00
Jace ecc8d998cf Added ComponentInfo::Field_t::Index 2016-03-08 15:46:14 +01:00
William Moberg e3c0fb2178 Added SetDirty function. 2016-03-08 15:44:02 +01:00
William Moberg 090bd806ce Added DirtyBit enum to Dirty getter in ComponentWrapper. 2016-03-08 15:39:16 +01:00
William Moberg 3436ba6656 Merge pull request #177 from teamfisk/AmmoPickup
Fixed some systems added twice in Game.cpp
2016-03-08 09:46:36 +01:00
verysecrethero fc3a3a8f2e Fixed a crashbug in Ammo/HealthPickup which was actually caused by systems being added twice in Game.cpp. This is also a possible fix for DamageIndicator,Capturepoint,TextField,KillFeed 2016-03-07 17:16:18 +01:00
Tobias Dahl 3edc2f4819 Merge pull request #174 from teamfisk/CapturePointFixBranch
CapturePoints now have red/blue/spectator model-children
2016-03-07 15:25:22 +01:00
Adam Byléhn 9c3fa25834 Merge pull request #176 from teamfisk/PlayerHUD
Player hud
2016-03-07 15:14:37 +01:00
verysecrethero 3eaad275ba New CapturePointAddition fixed to work on Network by Joachim 2016-03-07 14:50:31 +01:00
Tleety 47ece6a5bf Changed shield component to track Active, so it and sprint glow full if they are active.
Changed how reflections are calculated with light.
2016-03-07 14:42:50 +01:00
verysecrethero 64df3fd7ad CapturePoints now have red/blue/spectator model-children 2016-03-07 14:30:27 +01:00
Tleety 99d663d5a2 ShiftIcon should now track ability depending on what ability the player has and change icon accordingly. 2016-03-07 13:55:37 +01:00
Tleety 388fe7c259 Fixed some stuff on the player HUD 2016-03-07 11:28:10 +01:00
Tobias Dahl 46d7c8bea4 Merge pull request #172 from teamfisk/ScoreBoard
Score board
2016-03-07 11:09:17 +01:00
Tleety c7099de9e4 Merge remote-tracking branch 'origin/master' into ScoreBoard
# Conflicts:
#	assets
2016-03-07 10:58:55 +01:00
Tleety cb9dad5c67 Merge remote-tracking branch 'origin/master' into ScoreBoard 2016-03-07 10:49:57 +01:00
Tleety a8f2d0a8e6 Some assets, some fixes to the scoreboard 2016-03-07 10:48:46 +01:00
Jace b7a7f7fd5e ???? 2016-03-04 15:02:01 +01:00
Jace 434ff1e7eb ???? 2016-03-04 10:06:49 +01:00
Jace e58b5ffd6f Merge remote-tracking branch 'origin/Movement' into Weapons
# Conflicts:
#	resources/Schema/Entities/Player.xml
#	src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp
2016-03-04 09:43:34 +01:00
Jace 4557455e49 HUD stuff 2016-03-04 09:41:12 +01:00
viktorljung c1f5cf65a7 Movement animations 2016-03-04 09:39:16 +01:00
Jace a8ad85b004 Merge remote-tracking branch 'origin/IconsForPlaytest' into Weapons 2016-03-04 09:39:11 +01:00
Jace 3ac8a5c7ef Working map 2016-03-04 09:38:38 +01:00
Jace ebd4c58c41 "Fixed" weapon spawning over network 2016-03-04 09:23:18 +01:00
Jace 42cccfbac0 Merge branch 'Weapons' of github.com:teamfisk/TacticalZ into Weapons
# Conflicts:
#	assets
#	src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp
2016-03-04 08:56:58 +01:00
Jocke e2674d915e Constrained weapon behavior to client side only 2016-03-04 08:55:55 +01:00
Jace 2b55450c18 Cray cray weapons 2016-03-04 08:54:59 +01:00
viktorljung 7ba0e4ea9d Run, Strafe and jump animations now playing 2016-03-04 08:35:02 +01:00
Jocke d78a7e20e2 Merge branch 'master' into Weapons 2016-03-04 08:29:33 +01:00
Jocke 5b80ba4398 Made 3 new healthHUDs 1 for each class. 2016-03-04 08:22:48 +01:00
Jocke 2187df080a Merge branch 'master' into IconsForPlaytest 2016-03-04 05:17:54 +01:00
Jocke eec40b6519 We can now read larger packets than 65536 bytes in TCPClient::readBuffer() 2016-03-04 05:10:18 +01:00
Jace 177667eef5 The only working branch ever 2016-03-04 05:02:25 +01:00
antc13 1f047ea300 Latest Map version (Hopefully) Now with textures. Made some very minor tweaks as well, by removing duplicated meshes. 2016-03-04 04:22:04 +01:00
Joachim Pettersson e6472b9745 Merge pull request #170 from teamfisk/ScoreBoard
I Hope To God That This Works.
2016-03-04 04:03:46 +01:00
Tleety 19ee66fc75 Fix 2016-03-04 03:57:37 +01:00
Tobias Dahl 7675af1ef6 Merge pull request #168 from teamfisk/SniperSprintBranch
Sniper sprint effect
2016-03-04 03:31:53 +01:00
Jocke 2507516a85 Tweaked values for the effect to look better 2016-03-04 03:28:58 +01:00
Jocke 0398006fdc added safety ifs and renamed dasheffect to sprinteffect 2016-03-04 03:19:41 +01:00
Jace dbafab2cef fixup! First attempt at AssaultWeapon animations! 2016-03-04 03:07:36 +01:00
Tleety 103fe98fe2 KD now updated 2016-03-04 03:06:42 +01:00
Jace 609f6619a6 Merge remote-tracking branch 'origin/Animations' into Weapons 2016-03-04 03:04:36 +01:00
Jace 03ea9bcf40 fixup! Duration no longer needed 2016-03-04 03:00:03 +01:00
Jace d37b7c2277 fixup! First attempt at AssaultWeapon animations! 2016-03-04 02:55:19 +01:00
viktorljung 1bd71931b8 Fixed crash when trying to blend to a nonexistent node 2016-03-04 02:53:23 +01:00
Tleety 0e95c5bb95 Fixes 2016-03-04 02:52:04 +01:00
Jace b7fa7f9119 Duration no longer needed 2016-03-04 02:50:03 +01:00
Jace 608e339172 Merge remote-tracking branch 'origin/Animations' into Weapons 2016-03-04 02:48:41 +01:00
Jace 3a8f7c5d03 First attempt at AssaultWeapon animations! 2016-03-04 02:48:03 +01:00
viktorljung 1ff91a5c5d fixup! Blend duration can now be 0.0
Commited input test stuff
2016-03-04 02:30:05 +01:00
viktorljung 49802fed91 Blend duration can now be 0.0 2016-03-04 02:24:13 +01:00
Tleety 45991000ae Removed unused code 2016-03-04 02:20:42 +01:00
Tleety 778bbd13ca double's should now be displayed with only 1 decimal. 2016-03-04 02:19:13 +01:00
viktorljung 1616fb20d1 Skinned meshes now in T-Pose when not it's blendtree is null 2016-03-04 02:03:50 +01:00
Tleety 00b5a1771c Should now work fully, not KD tho 2016-03-04 01:34:29 +01:00
antc13 86306b3132 Merge branch 'master' of https://github.com/teamfisk/TacticalZ
# Conflicts:
#	resources/Schema/Entities/NewMap2version2.xml
2016-03-04 01:15:42 +01:00
Tleety 66374b7ff9 Should now track score correctly 2016-03-04 00:21:01 +01:00
Tleety fe7c1dd808 Merge remote-tracking branch 'origin/DeathEventUsesPlayerID' into ScoreBoard
# Conflicts:
#	include/Engine/Network/Server.h
2016-03-03 23:56:57 +01:00
Tleety 118d61c711 Should now remove players from scoreboard if they disconnect 2016-03-03 23:55:52 +01:00
Jace 4dd46e2e21 Merge branch 'master' into Weapons 2016-03-03 23:46:46 +01:00
Jace 7e6d32aaec Fixed AssaultWeapon reload logic 2016-03-03 23:45:28 +01:00
Jace 9426942988 Merge pull request #169 from teamfisk/Animations
Animations
2016-03-03 23:45:24 +01:00
stiffly 2167b6f7b1 Fix for previous commit.. 2016-03-03 23:43:50 +01:00
viktorljung bebdacabb4 Clean up 2016-03-03 23:41:08 +01:00
viktorljung 66c8a17b17 Merge remote-tracking branch 'origin/master' into Animations
# Conflicts:
#	resources/Schema/Types/Entity.xsd
2016-03-03 23:21:14 +01:00
viktorljung e3fbd2082c BlendQueues fully working 2016-03-03 23:20:13 +01:00
Jace 217c3fe55c Fixes 2016-03-03 22:58:45 +01:00
Tleety 0a21fe15dd Merge remote-tracking branch 'origin/master' into ScoreBoard
# Conflicts:
#	resources/Schema/Components.xsd
#	resources/Schema/Entities/Player.xml
#	resources/Schema/Types/Entity.xsd
2016-03-03 22:56:39 +01:00
Tleety 011aa53bc0 ScoreScreen things 2016-03-03 22:55:18 +01:00
stiffly 714665f0a3 Updated the PlayerID getter in Server.cpp. 2016-03-03 22:55:12 +01:00
stiffly 8466a282b7 The server will now parse a death event and pass it forward with a KillDeath event to the score system. 2016-03-03 22:48:42 +01:00
Jace 80ad76c023 Merge branch 'Playtest2-Fallback' of github.com:teamfisk/TacticalZ into Playtest2-Fallback 2016-03-03 22:25:46 +01:00
Jace c84d7ebb8f PlayerAssaultFallbackBlue and PlayerAssaultFallbackRed 2016-03-03 22:25:07 +01:00
Jocke ae13a2db6b Player cannot see their own sprint effect. 2016-03-03 22:09:51 +01:00
Jocke 984b8ad3e9 SprintEffect defaults to 30% extra speed. 2016-03-03 21:57:27 +01:00
Tleety f5ea4e06c7 Map 2016-03-03 21:37:18 +01:00
Jocke b1148c0c6c Added a afterimage SprintEffect for the Sniper. 2016-03-03 21:24:31 +01:00
viktorljung 68332102ea Can now blend non unique nodes 2016-03-03 21:20:55 +01:00
Jace 6532e9896e fixup! Playtest 2 Fallback Map 2016-03-03 21:05:21 +01:00
Jace e24a0b127b Added Ability cooldown UI and missing texture 2016-03-03 20:59:30 +01:00
Tleety 00c585de3c Score should now track to all clients 2016-03-03 20:45:16 +01:00
Jace c0e160833c Playtest 2 Fallback Map 2016-03-03 20:43:28 +01:00
Jace cbb2ec2fd6 Unique ids for entity nodes in the editor to prevent weird behaviour when multiple entities have the same name 2016-03-03 20:43:28 +01:00
Jace c467d54d44 Merge pull request #167 from teamfisk/Weapons
Working Assault Weapon
2016-03-03 20:43:13 +01:00
Jace 0e5810d39e Merge branch 'master' into Weapons 2016-03-03 20:41:50 +01:00
Jace eba296196c Merge remote-tracking branch 'origin/master' into Weapons
# Conflicts:
#	src/Game/Game.cpp
2016-03-03 20:05:10 +01:00
Jace b2371f4a43 Working AssaultWeapon 2016-03-03 20:00:42 +01:00
maqu14 f1c5df1418 Merge branch 'master' of github.com:teamfisk/TacticalZ 2016-03-03 19:58:53 +01:00
Jocke a5c1e34b8d Merge remote-tracking branch 'origin/master' into SniperSprintBranch 2016-03-03 18:49:42 +01:00
Jace e55a399bad Merge pull request #165 from teamfisk/PickClassCamera
Pick class camera
2016-03-03 18:41:04 +01:00
Jocke 06b7052bf2 Merge remote-tracking branch 'origin/master' into SniperSprintBranch 2016-03-03 18:26:47 +01:00
Joachim Pettersson 2dfcd3ad95 Merge pull request #158 from teamfisk/SniperSprintBranch
Looks good// William
2016-03-03 18:25:38 +01:00
Adam Byléhn 44924ea1f9 Merge pull request #166 from teamfisk/FixNetworkBugs
Hot fix: Infinite loop when a player disconnected from the server.
2016-03-03 18:22:13 +01:00
Jocke 7943fc7ad6 Hot fix: Infinite loop when a player disconnected from the server. 2016-03-03 18:14:33 +01:00
verysecrethero be331cb778 fixed 2016-03-03 18:05:10 +01:00
viktorljung a3494b92c8 Blending queues now working 2016-03-03 17:48:25 +01:00
verysecrethero a72dc94d5d Merge branch 'SniperSprintBranch' of github.com:teamfisk/TacticalZ into SniperSprintBranch
# Conflicts:
#	include/Engine/Input/FirstPersonInputController.h
2016-03-03 17:35:17 +01:00
verysecrethero c5f3bfc0cd Fixed the stuff in comments 2016-03-03 17:33:41 +01:00
William Moberg 98366ec038 PickClass used for class-picking, SwapToClassPick to swap camera. 2016-03-03 16:59:17 +01:00
William Moberg 398bc725b6 When pick class buttons are clicked they send an InputCommand, not an ButtonClicked event. 2016-03-03 16:32:24 +01:00
Tleety 3e9ad7dc14 Merge remote-tracking branch 'origin/master' into ScoreBoard 2016-03-03 15:57:26 +01:00
Tobias Dahl fe36e8b423 Merge pull request #164 from teamfisk/FixNetworkBugs
Fixed invisible players and connect crash.
2016-03-03 15:57:02 +01:00
Tleety 8b86c73ecc Merge remote-tracking branch 'origin/FixNetworkBugs' into ScoreBoard 2016-03-03 15:49:15 +01:00
William Moberg 8859f652b9 Input ClassPick now switches to a camera with class buttons, they do nothing now and have test textures. 2016-03-03 15:48:55 +01:00
Tleety c125f8c5f5 Merge branch 'master' into ScoreBoard 2016-03-03 15:18:46 +01:00
stiffly a7bff92899 The readBuffer now checks if the whole packet has arrived before attempting to parse it. 2016-03-03 15:16:42 +01:00
Tobias Dahl bfcf7b240e Merge pull request #163 from teamfisk/revert-145-Shadows
Revert "Shadows"
2016-03-03 14:25:10 +01:00
Tobias Dahl 73b8bff1f3 Revert "Shadows" 2016-03-03 14:24:43 +01:00
Tleety ed1d203c72 Merge branch 'master' into ScoreBoard 2016-03-03 14:07:44 +01:00
Tobias Dahl 1deb506fb2 Merge pull request #145 from teamfisk/Shadows
Shadows
2016-03-03 14:06:48 +01:00
viktorljung 8957b0b464 Merge remote-tracking branch 'origin/master' into Animations 2016-03-03 14:05:43 +01:00
Tleety f4983cf961 WIP 2016-03-03 13:53:40 +01:00
Jace 1210c91535 Added Gameplay.AutoReload bool to config 2016-03-03 13:51:47 +01:00
Jocke ae3cab6cd1 Merge remote-tracking branch 'origin/master' into FixNetworkBugs 2016-03-03 13:31:43 +01:00
maqu14 2cd39c7188 New map version (NewMap2version4NEW) 2016-03-03 13:31:17 +01:00
Jocke a9b19d9af1 Packet write now only warns when a a packet is huge 2016-03-03 13:29:45 +01:00
maqu14 9c1a638a41 New map (NewMap2version4NEW) 2016-03-03 13:28:18 +01:00
Tleety 96bc5db7bb Merge commit '0e8b97dbbade6bb39c6f2b8af6c1cfc43ce67cde' into ScoreBoard
# Conflicts:
#	resources/Schema/Entities/Player.xml
#	src/Game/Game.cpp
2016-03-03 13:22:28 +01:00
Tleety c8aeae2c96 WIP 2016-03-03 12:58:35 +01:00
Jocke da81f21799 Merge remote-tracking branch 'origin/master' into SniperSprintBranch
# Conflicts:
#	include/Engine/Input/FirstPersonInputController.h
2016-03-03 12:16:09 +01:00
Jocke cb7beae28c Only do physics and collision calculations on the clients side, and only for their own entity. 2016-03-03 11:39:00 +01:00
Tleety ff6e2167d4 Some new events and changes to ScoreSystem 2016-03-03 11:25:06 +01:00
Tleety 27d3ec4118 Added some fields in score components to track more data. Added some logic to the ScoreSystem class 2016-03-03 09:49:20 +01:00
Jace 9d4441852c DefenderWeapon view punch and crosshair travel with return 2016-03-03 03:49:44 +01:00
FakeShemp 7ea26d10ee Rewritten. Works as a charm now. 2016-03-03 03:28:21 +01:00
FakeShemp 28e9ba1208 Merge branch 'master' into Shadows
# Conflicts:
#	include/Engine/Rendering/DrawFinalPass.h
#	src/Engine/Rendering/DrawFinalPass.cpp
#	src/Engine/Rendering/FrameBuffer.cpp
#	src/Engine/Rendering/Renderer.cpp
2016-03-03 03:00:05 +01:00
viktorljung 362378536e Switching rooms 2016-03-03 01:39:12 +01:00
Jace 0e8b97dbba Made AmmunitionHUD into TextFieldReader which reads any component field on a parent and updates a Text component with the value! 2016-03-03 01:35:32 +01:00
Tleety 40c66f76ae A component for tracking score for players. 2016-03-03 01:28:43 +01:00
Jace 13546aa3fc DefenderWeapon and SidearmWeapon 2016-03-03 01:13:39 +01:00
Tleety 047a119e3f ScoreScreenSystem things 2016-03-03 01:04:24 +01:00
Tleety d74ae4e411 Some fixes to the Player and map, added skeleton system for the ScoreScreen 2016-03-03 00:55:44 +01:00
Tleety 050ce57e24 Fixed AbilityUI for player and changed so the AbilityCooldown system wont need a child with text, instead just write if it has one. 2016-03-03 00:32:07 +01:00
Tleety 8005ca377c Merge branch 'master' into ScoreBoard
# Conflicts:
#	resources/Schema/Components.xsd
2016-03-02 23:26:33 +01:00
Tobias Dahl f0c2fdead1 Merge pull request #156 from teamfisk/HUD-Timers
Hud timers for dash ability
2016-03-02 22:53:25 +01:00
Jace afd0e69a8a Updated Player.xml for multiple weapons 2016-03-02 22:50:04 +01:00
Tleety e1ca104fc9 Merge remote-tracking branch 'origin/master' into HUD-Timers
# Conflicts:
#	resources/Schema/Entities/Player.xml
2016-03-02 22:49:26 +01:00
Jace 6f8023b285 HACK: Added Activate button for spawners in editor. Right now it includes the event from Game, but SpawnerSystem should probably be moved to Engine. 2016-03-02 22:48:01 +01:00
Jace b431a875f7 New weapon behaviours 2016-03-02 22:48:01 +01:00
Tleety 2cb4a307eb Merge branch 'master' into HUD-Timers
# Conflicts:
#	resources/Schema/Entities/QualityAssurance.xml
#	src/Game/Game.cpp
2016-03-02 22:42:12 +01:00
Tleety 9c9d1eede6 Components for ScoreScreen Added 2016-03-02 22:34:03 +01:00
Jace 6507efc0db Merge pull request #162 from teamfisk/Boost-icons
Boost icons
2016-03-02 22:28:57 +01:00
Tobias Dahl 96a3e68bf4 Merge pull request #160 from teamfisk/EntityFileCaching
Entity file caching
2016-03-02 22:19:20 +01:00
Tleety 2d438060dd Player arrow change 2016-03-02 22:08:23 +01:00
Tleety a339c61f5b Merge remote-tracking branch 'origin/master' into Boost-icons
# Conflicts:
#	resources/Schema/Components.xsd
#	resources/Schema/Types/Entity.xsd
2016-03-02 21:51:52 +01:00
Tleety 8b81ba9019 Some small fixes, also added new UI elements to Player 2016-03-02 21:40:20 +01:00
Jace 9a668ed7d7 Now here's the real fix for the lag when loading entity files: CONSOLE SPAM 2016-03-02 20:16:03 +01:00
Jace 7624c6ee0a Updated all uses of EntityXMLFile to use the new EntityFile to load entities into a world. 2016-03-02 20:12:59 +01:00
Jace 3ef15dcb81 EntityFile now releases EntityXMLFile after processing. 2016-03-02 20:01:18 +01:00
Jace 5923d2d7a7 Made SpawnerSystem utilize the new EntityFile for spawning instead 2016-03-02 19:52:34 +01:00
Jace 069583e09f Created EntityFile which loads an EntityXMLFile into a temporary world to be merged with another world when you want to create a copy of the entity loaded from disk. This allows us to free EntityXMLFile once it's loaded into an EntityFile. 2016-03-02 19:52:11 +01:00
Jace 44b4a597d4 fixup! Created World::Merge which will merge a world into another one 2016-03-02 19:50:52 +01:00
Jace 618e96da90 "Fixed" this crash in debug. The attachment vector is sometimes empty! @Tleety 2016-03-02 19:49:54 +01:00
Jace fb9914d08a Fixed AMD shader compilation error 2016-03-02 19:48:20 +01:00
Jace 0c0f2d7e50 fixup! Renamed EntityFile to EntityXMLFile to be able to separate file parsing from entity creation 2016-03-02 18:56:22 +01:00
Jace 26d6546d79 Renamed EntityFile to EntityXMLFile to be able to separate file parsing from entity creation 2016-03-02 18:53:40 +01:00
Jace 62c8196ad4 Created World::Merge which will merge a world into another one 2016-03-02 18:53:39 +01:00
Tleety 7af17049e9 BoostIcons should now track correctly 2016-03-02 18:13:09 +01:00
Jocke 85ba5552e9 Merge remote-tracking branch 'origin/master' into FixNetworkBugs 2016-03-02 17:59:20 +01:00
Joachim Pettersson 76117cb3ce Merge pull request #155 from teamfisk/Respawning
Looks good man! 🇺🇸 🍔 😎
2016-03-02 17:55:32 +01:00
William Moberg e6b3bbeb54 Merge remote-tracking branch 'origin/master' into Respawning
# Conflicts:
#	resources/Schema/Types/Entity.xsd
2016-03-02 17:50:59 +01:00
Tobias Dahl 01def459a1 Merge pull request #159 from teamfisk/FloatingEffect
Added a FloatingEffectSystem to the game.
2016-03-02 17:49:25 +01:00
antc13 3094dd301b Added a default value to Position in FloatingEffect.xml 2016-03-02 17:47:22 +01:00
William Moberg 76ab746a22 Merge pull request #157 from teamfisk/DashAbiltyEffect
Dash abilty effect
2016-03-02 17:43:55 +01:00
viktorljung e9bbb5ed2a Fixed BlendTree crash when animation nodes are null 2016-03-02 17:42:55 +01:00
antc13 e56f203f7c Removed unnecessary comment & added FloatingEffect to Schema/Types/Entity.xsd 2016-03-02 17:42:11 +01:00
stiffly 267c007291 Removed unnecessary comments, variables and functions. 2016-03-02 17:39:27 +01:00
Tleety 8b66d29adc Skeleton system for Boost icons 2016-03-02 17:32:45 +01:00
antc13 7d15313209 Added a FloatingEffectSystem to the game. Pickups now move up and down, if so desired. 2016-03-02 17:22:44 +01:00
Tleety a9a19193ad Component for Boost icons 2016-03-02 17:21:15 +01:00
verysecrethero f84d1ac4a1 Merge remote-tracking branch 'origin/master' into SniperSprintBranch
# Conflicts:
#	include/Engine/Input/FirstPersonInputController.h
2016-03-02 17:11:36 +01:00
viktorljung d8a0e69ff0 fixup! AutoAnimationBlend now working correctly for unique nodes, Commited debug code 2016-03-02 17:11:18 +01:00
William Moberg 53c520123a Uncommented code. 2016-03-02 17:06:53 +01:00
viktorljung 1aefa1dec6 AutoAnimationBlend now working correctly for unique nodes 2016-03-02 17:06:51 +01:00
Jocke 0a6653d079 Merge remote-tracking branch 'origin/master' into FixNetworkBugs 2016-03-02 17:06:24 +01:00
stiffly 92d5ec70ba Merge remote-tracking branch 'origin/master' into DashAbiltyEffect 2016-03-02 16:57:07 +01:00
stiffly 233a1d0990 The dash effect is now ignored on the local player, because it was annoying. Copies of yourself could be in your way. 2016-03-02 16:56:43 +01:00
William Moberg 4ef76f6c45 Merge branch 'master' into Respawning
# Conflicts:
#	resources/Schema/Types/Entity.xsd
2016-03-02 16:51:24 +01:00
Joachim Pettersson f8f4b4d939 Merge pull request #151 from teamfisk/CPArrow
CapturePoint indicator HUD
2016-03-02 16:48:52 +01:00
stiffly a5c086e389 Dash effect now working over network, by sending events. Similar to jump effect. 2016-03-02 16:48:38 +01:00
William Moberg 91dbbb9c11 Merge branch 'master' into Respawning 2016-03-02 16:47:55 +01:00
Tleety 78835f95d8 Removed comment 2016-03-02 16:47:30 +01:00
William Moberg dc10661e6b Respawn time now only displays numbers, centered below CPHUD. 2016-03-02 16:45:43 +01:00
Tobias Dahl 8a66b1e5c8 Merge pull request #119 from teamfisk/AssaultBoost
BoostSystem
2016-03-02 16:44:49 +01:00
verysecrethero 3c8df35be9 Merge remote-tracking branch 'origin/master' into AssaultBoost
# Conflicts:
#	src/Game/Game.cpp
2016-03-02 15:59:16 +01:00
Joachim Pettersson f761416e20 Merge pull request #152 from teamfisk/PickupBranch
Added the already-at-maxammo/health-savetrigger for the PickupSystems
2016-03-02 15:41:44 +01:00
Jocke 9161c11764 Changed m_ETriggerTouchVector for-loop so it wont break when an item triggers the condition. This is done to update all somePickup.DecreaseThisRespawnTimer's. 2016-03-02 15:31:42 +01:00
Tleety cdbc348cfa AbilityCooldownHUD should now correctly track cooldown for dash ability. 2016-03-02 14:46:37 +01:00
William Moberg 95078b6a4b Fix so client doesn't override the servers respawn time with its config file. Server or single player client can still override the component with the config RespawnTime. 2016-03-02 14:37:33 +01:00
Tleety 502a290d36 Merge branch 'master' into HUD-Timers
# Conflicts:
#	resources/Schema/Components.xsd
#	resources/Schema/Entities/PlayerRed.xml
#	resources/Schema/Types/Entity.xsd
2016-03-02 14:22:13 +01:00
stiffly 1217b25d02 DashEffect will now spawn a player model behind the player that will fade out . 2016-03-02 14:15:20 +01:00
Tleety a2b938d8f6 Merge branch 'master' into CPArrow
# Conflicts:
#	resources/Schema/Entities/Player.xml
#	resources/Schema/Entities/PlayerRed.xml
2016-03-02 13:58:44 +01:00
Tleety ab7fd89546 Should now correctly track if another player takes your last capture point 2016-03-02 13:56:35 +01:00
viktorljung 8422742a9e Merge remote-tracking branch 'origin/master' into Animations
# Conflicts:
#	src/Engine/Rendering/DrawFinalPass.cpp
2016-03-02 13:50:08 +01:00
William Moberg 06d60f9884 Merge branch 'master' into Respawning 2016-03-02 13:47:03 +01:00
William Moberg 629ebb871f SpectatorCamera shows capturepoint HUD and respawntimer. It no longer requires CapturePointGameMode component to work. 2016-03-02 13:45:49 +01:00
Tleety 6968e71e07 Arrow should now correctly track the next point no matter when you join the game 2016-03-02 13:36:24 +01:00
viktorljung c3f24f494d fixup! AutoAnimationBlend on unique node working but scale is not working correctly
Commited some things that shouldn't have been commited
2016-03-02 13:34:47 +01:00
viktorljung 07ccb9c041 AutoAnimationBlend on unique node working but scale is not working correctly 2016-03-02 13:30:04 +01:00
Tobias Dahl 2fb3bb2a39 Merge pull request #153 from teamfisk/RenderSetingsV2
Shield and stuff
2016-03-02 13:15:52 +01:00
Tleety 6540848392 WIP 2016-03-02 11:59:56 +01:00
Teejoon de9657700b Fixed draw final pass with shided objects having to many if-statments.
Shields is working with transparancy

Player cameras should have nearclip fater away and far clip nearer.

Defaultconfig push
2016-03-02 11:59:48 +01:00
verysecrethero 4652cd7861 Added the already-at-maxammo/health-save-trigger for the PickupSystems 2016-03-02 11:53:04 +01:00
antc13 e6f46b396e Merge branch 'master' of https://github.com/teamfisk/TacticalZ 2016-03-02 11:44:29 +01:00
Jocke cfba8efd24 WritePrimitive would spam a warning when snapshots got bigger than 512 and it got resized. 2016-03-02 10:59:03 +01:00
FakeShemp 5a6374f013 Fix the remainder of errors. Might have borked splatmap in the process. 2016-03-02 10:57:22 +01:00
verysecrethero 03a35d0f5e Merge pull request #149 from teamfisk/FixNetworkBugs
Seems OK
2016-03-02 10:11:52 +01:00
Tobias Dahl e4e9af5d9c Merge pull request #148 from teamfisk/DashFixBranch
Moved the Dash CoolDown (CoolDownTimer) to the component (DashAbility…
2016-03-02 10:05:02 +01:00
Tleety 96768e66de Redplayer arrow fix 2016-03-02 09:57:41 +01:00
Teejoon ef66f3ebe5 Transparancy with shild fix 2016-03-01 23:14:23 +01:00
Tleety 799990f44d Next CP indicator should now be fully working. 2016-03-01 22:54:13 +01:00
Jace 39369aa3e5 Merge pull request #150 from teamfisk/EditorCameraSpeedFix
Fixed editor camera speed changing when scrolling on UI elements
2016-03-01 22:51:16 +01:00
Jace 6eb0b83d6b Fixed editor camera speed changing when scrolling on UI elements 2016-03-01 22:47:43 +01:00
Tleety ab40fa715b The arrow should now track CapturePoints correctly at start and when they are captured. 2016-03-01 21:57:30 +01:00
Tleety a38c18fd3a Merge remote-tracking branch 'origin/master' into CPArrow 2016-03-01 20:33:30 +01:00
Tobias Dahl 9747a201b7 Merge pull request #147 from teamfisk/CapturePointFixBranch
ECaptured: added NextCapturePoint entitywrapper. Changed CapturePoint…
2016-03-01 20:33:10 +01:00
Tleety 6281e20000 Arrow should now track the CapturePoint specified in the Component. 2016-03-01 20:31:09 +01:00
FakeShemp 1ae2f3f5f3 Begin clean-up 2016-03-01 19:10:13 +01:00
verysecrethero f147929aa9 Moved the Dash CoolDown (CoolDownTimer) to the component (DashAbility). Fixed 2 warnings 2016-03-01 17:57:18 +01:00
Jocke aadfdfdd90 AmmoPickups and HealthPickups will only spawn on the server. When a ammo pickup is taken the Server will send an Event to that
Client and it will update its ammo.
2016-03-01 17:55:00 +01:00
William Moberg 5a8261453e Eliminated some SAXParsing errors from our console output. 2016-03-01 17:40:42 +01:00
verysecrethero bba002dea9 Removed DebugCode 2016-03-01 17:37:30 +01:00
verysecrethero 15195964da ECaptured: added NextCapturePoint entitywrapper. Changed CapturePointID to CapturePointTakenID. Fixed so CapturePoints works in singleplayer again. Captured event is now sent in the next Update, since the information for NextCapturePoint is needed 2016-03-01 17:34:30 +01:00
William Moberg a9762f44ca Merge branch 'master' into Respawning 2016-03-01 17:34:23 +01:00
William Moberg 3d4427dd20 Added entity SpectatorCamera that shows respawntime, will activate when explosion effect is deleted. 2016-03-01 17:32:14 +01:00
Tleety b0a66f9e83 Components for CapturePoint arrow HUD element and a system skeleton 2016-03-01 16:19:59 +01:00
William Moberg 5c6a652316 Fixed so unregistered components are ignored instead of crashing the game. 2016-03-01 15:53:59 +01:00
Tleety 7ba5e01560 CapturePointArrow component files 2016-03-01 15:37:28 +01:00
antc13 25331ddd70 Merge branch 'master' of https://github.com/teamfisk/TacticalZ 2016-03-01 15:28:27 +01:00
antc13 141c58005f Changing Models WIP 2016-03-01 15:28:22 +01:00
Jocke 6d68486c05 Merge remote-tracking branch 'origin/master' into FixNetworkBugs 2016-03-01 15:07:06 +01:00
Jace c60e1ba7e4 Merge pull request #144 from teamfisk/RenderSetingsV2
Render settings
2016-03-01 13:49:38 +01:00
Tobias Dahl 63d205f56a Merge pull request #146 from teamfisk/EditorKeyboardFix
Fixed editor keyboard shortcuts getting mixed up with GUI input actions
2016-03-01 13:46:01 +01:00
Jace 36f6ade87a Fixed editor keyboard shortcuts getting mixed up with GUI input actions 2016-03-01 13:38:51 +01:00
FakeShemp 1961c16fe2 add weight slider 2016-03-01 13:27:52 +01:00
FakeShemp d32a483bb4 remove farclip override 2016-03-01 13:17:17 +01:00
FakeShemp e23ea78aeb Merge remote-tracking branch 'origin/master' into Shadows
# Conflicts:
#	resources/Shaders/ForwardPlus.frag.glsl
2016-03-01 13:04:11 +01:00
Teejoon 724d7b1586 Merge remote-tracking branch 'origin/master' into RenderSetingsV2
Conflicts:
	src/Engine/Rendering/DrawFinalPass.cpp
2016-03-01 12:56:00 +01:00
Teejoon 8cda614de4 Added transparent object that disappeared from the merge 2016-03-01 12:54:01 +01:00
Teejoon 77eaa45702 Merge remote-tracking branch 'origin/master' into HEAD
Conflicts:
	src/Engine/Rendering/CubeMapPass.cpp
	src/Engine/Rendering/DrawFinalPass.cpp
2016-03-01 12:11:27 +01:00
Tobias Dahl dfa224b4dd Merge pull request #142 from teamfisk/Respawning
Added CapturePointGameMode component with RespawnTime
2016-03-01 11:28:56 +01:00
Jace 86df8f14f4 Merge pull request #143 from teamfisk/Transparency-fix
Transparency fix
2016-03-01 11:26:26 +01:00
Tleety eaea645068 Reflectance should now work as an inverse of the specular alpha value. 2016-03-01 11:19:44 +01:00
Tleety 21bf7f4df3 Glow should now legit be working through transparency. 2016-03-01 11:03:16 +01:00
William Moberg e2b7e5400d Check so CapturePointGameMode pool exists and has a size. 2016-03-01 10:20:52 +01:00
FakeShemp 4153a31e3a Fix goof. 2016-02-29 19:47:24 +01:00
FakeShemp 0908be1e02 Shadows are pretty much done. 2016-02-29 19:45:56 +01:00
FakeShemp 2ed5fad699 The shadows are working 2016-02-29 19:17:16 +01:00
FakeShemp 70374fa10e It compiles, but no shadows 2016-02-29 18:20:32 +01:00
William Moberg 658eace093 Added component CapturePointGameMode that contains respawntime. 2016-02-29 18:20:14 +01:00
FakeShemp 20468cba1b Merge branch 'master' into Shadows
# Conflicts:
#	assets
#	include/Engine/Rendering/DrawFinalPass.h
#	include/Engine/Rendering/Renderer.h
#	resources/Shaders/ForwardPlus.frag.glsl
#	resources/Shaders/ForwardPlus.vert.glsl
#	src/Engine/Rendering/DrawFinalPass.cpp
#	src/Engine/Rendering/FrameBuffer.cpp
#	src/Engine/Rendering/Renderer.cpp
2016-02-29 18:03:00 +01:00
Joachim Pettersson c106768939 Merge pull request #135 from teamfisk/JumpHeightAdjustment
Player jump speed can be adjusted
2016-02-29 17:37:25 +01:00
William Moberg c7dad79e72 Merge branch 'master' into JumpHeightAdjustment
# Conflicts:
#	resources/Schema/Components.xsd
#	resources/Schema/Entities/Player.xml
#	resources/Schema/Entities/PlayerRed.xml
#	src/Game/Systems/PlayerMovementSystem.cpp
2016-02-29 17:28:40 +01:00
Joachim Pettersson d37f8cc350 Merge pull request #141 from teamfisk/BoxModelCollision
Collision jittering + disappearing weapon
2016-02-29 17:13:34 +01:00
viktorljung 5bc0483f49 Removed AnimationOffset and improved BlendTree 2016-02-29 15:51:37 +01:00
William Moberg 3c35c0a956 Frustum culling octree updates after collisions, no more disappearing weapons. 2016-02-29 15:50:26 +01:00
William Moberg d47a806c64 Made a easy hack to solve jittering when standing still. Jittering should still be present when moving, but at least it is less prominent when moving. 2016-02-29 15:49:23 +01:00
William Moberg 8e21c5a5e4 Reverts last WIP since it probably added code without improving anything.
Revert "WIP, should take shortest resolution even if forced upwards because of slopes, not solving the jittering problem though. + debug code."

This reverts commit db5170c699.
2016-02-29 15:38:36 +01:00
Teejoon df7ace6626 We only uses one depth buffer now 2016-02-29 11:44:29 +01:00
Jocke bef79d116b Merge remote-tracking branch 'origin/master' into FixNetworkBugs 2016-02-29 10:15:16 +01:00
William Moberg db5170c699 WIP, should take shortest resolution even if forced upwards because of slopes, not solving the jittering problem though. + debug code. 2016-02-29 09:37:51 +01:00
Jace bb76c9d248 WIP multi-weapon behaviours 2016-02-29 06:58:57 +01:00
FakeShemp 7749fc5474 Small fixing up 2016-02-28 19:46:50 +01:00
FakeShemp 6dd7f1a657 Buggy transparent shadows.
Transparent textures might glow.
2016-02-28 18:00:23 +01:00
Tleety 144e548b7a Added AbilityCooldownHUD component and system to track the cooldown on the dashability, this needs to be extended for other abilities when they are implemented. However current dash time needs to be included into the component, since we can currently just see the max cooldown time. 2016-02-28 17:17:24 +01:00
Teejoon 9cbc6f7755 Added GenerateTexture, GenerateMipMapTexture and DeleteTexture to CommonFunctions 2016-02-28 16:16:22 +01:00
Teejoon d3a245606a SSAO and Glow is no longe conflicting with each other.
Texture should get the id = 0 when they are deleted and not assigned a new texture after. Else they will start to conflict with each other.
2016-02-28 15:02:40 +01:00
FakeShemp 14b0a64720 begin fixing transparent object's shadows 2016-02-27 18:42:51 +01:00
FakeShemp 8647267cad Make code less dumb, save 7 fps 2016-02-27 18:04:33 +01:00
FakeShemp ecab5de056 Various shadow calculation methods implemented and ready for use. 2016-02-27 16:35:15 +01:00
FakeShemp 38d8cdded2 Texture Array is now working. Enjoy your single Bind(). 2016-02-27 15:53:28 +01:00
Teejoon b320d8d1e4 WIP 2016-02-26 18:01:38 +01:00
FakeShemp 22c391df54 Initial work on texture arrays 2016-02-26 17:40:35 +01:00
Jocke afddd276a4 Merge remote-tracking branch 'origin/master' into FixNetworkBugs 2016-02-26 16:54:09 +01:00
Jocke a48e1b567a Removed comments 2016-02-26 16:49:25 +01:00
Teejoon 62e22d3821 Fix 2016-02-26 13:32:16 +01:00
Teejoon 0805375483 Deleted SSAO sliders except Quality 2016-02-26 13:25:19 +01:00
Jace 0c60b637c3 Who's merging without compiling? 2016-02-26 12:52:10 +01:00
William Moberg d411de894f Merge pull request #140 from teamfisk/FixNetworkBugs
Death explosion should always get triggered now.
2016-02-26 12:01:19 +01:00
Teejoon f56705d921 You can now change the quality of SSAO by sliding the SSAO Quality 2016-02-26 11:51:20 +01:00
Jocke 18450ff4f3 Death explosion should always get triggered now. (I hope) 2016-02-26 11:08:05 +01:00
William Moberg 22b473a0b6 Merge pull request #139 from teamfisk/EditorCopyPaste
Editor copy paste
2016-02-26 11:01:18 +01:00
FakeShemp f220d8088c Begin clean-up 2016-02-26 10:53:16 +01:00
viktorljung 5c3b472a4d Merge remote-tracking branch 'origin/master' into Animations
# Conflicts:
#	include/Engine/Rendering/ModelJob.h
#	resources/Schema/Components.xsd
#	resources/Schema/Types/Entity.xsd
#	src/Engine/Rendering/DrawFinalPass.cpp
#	src/Engine/Rendering/PickingPass.cpp
#	src/Engine/Rendering/Renderer.cpp
#	src/Engine/Rendering/Skeleton.cpp
2016-02-26 10:21:22 +01:00
viktorljung af034673f6 BoneAttachments now working and BlendTrees are created in the AnimationSystem 2016-02-26 10:17:47 +01:00
FakeShemp df2e4abb52 WE HAVE WORKING CASCADE SHADOWS 2016-02-25 21:21:38 +01:00
FakeShemp 8867e7ac3c Working shadows, no cascade blend yet 2016-02-25 20:29:41 +01:00
antc13 21ca3f5b38 Merge branch 'master' of https://github.com/teamfisk/TacticalZ 2016-02-25 18:22:13 +01:00
Jace f161fce719 Merge pull request #138 from teamfisk/PlayerAtOriginFix
Teleporting to origin on spawn fixed.
2016-02-25 17:55:03 +01:00
Jace 0343683678 Fixed cubemaps being generated over and over again each frame. 2016-02-25 17:51:40 +01:00
Jace 9e6c67596d Basic editor copy and paste. Doesn't actually copy the entity until you paste it. 2016-02-25 17:51:28 +01:00
William Moberg 89d0d5753f Fix for player teleporting to (0,0,0). Saves player previous position in CollisionSystem instead of Physics component so it won't be saved when editing Players. 2016-02-25 16:16:24 +01:00
Adam Byléhn 748a178801 Merge pull request #136 from teamfisk/FixNetworkBugs
Fix network bugs
2016-02-25 16:09:08 +01:00
Jocke eac9a9daf6 Pull request #136 Merge remote-tracking branch 'origin/master' into FixNetworkBugs
# Conflicts:
#	src/Engine/Network/Client.cpp
2016-02-25 16:07:06 +01:00
antc13 d9afb527a4 Merge branch 'master' of https://github.com/teamfisk/TacticalZ 2016-02-25 16:06:29 +01:00
Jocke 059fe5c6c0 Fixed typo m_EPDoubleJump to m_EDoubleJump. 2016-02-25 16:04:27 +01:00
Joachim Pettersson fb465ede81 Merge pull request #134 from teamfisk/HUDDesync
Good job! 👍
2016-02-25 15:53:07 +01:00
Jocke f66fa7a183 Merge remote-tracking branch 'origin/master' into FixNetworkBugs
# Conflicts:
#	include/Engine/Network/Client.h
#	include/Engine/Network/MessageType.h
#	include/Engine/Network/Server.h
#	include/Engine/Network/TCPServer.h
#	src/Engine/Network/Client.cpp
#	src/Engine/Network/TCPServer.cpp
2016-02-25 15:13:11 +01:00
Jocke 508d8a6f00 Fixed memory leak in TCPServer::AcceptNewConnections caused by acceptor->async_accept().
Fixed some formating and comments.
2016-02-25 14:24:38 +01:00
William Moberg cd315bbaa0 Added DoubleJump component and JumpSpeed in Player component so jumpheight can be adjusted for regular jump and double jump. 2016-02-25 12:12:44 +01:00
stiffly 8ce6308649 In snapshot: now sends player information and also CP information. Now it is no longer true that they will arrive in pre order. Appropriate actions were therefor implemented. 2016-02-25 11:56:40 +01:00
stiffly f10958c268 Capturepoint logic is now purely done on the serverside. 2016-02-25 11:50:29 +01:00
viktorljung c97d0d9381 Fixed memory leaks and cleaned up Skeleton and BlendTree 2016-02-25 11:30:09 +01:00
antc13 ad97f7f8a9 Merge branch 'master' of https://github.com/teamfisk/TacticalZ 2016-02-25 10:55:20 +01:00
antc13 c9c5e9841d New Map WIP, Map2 version 2 is with models on both sides. 2016-02-25 10:55:14 +01:00
William Moberg da1c7b3093 Merge pull request #133 from teamfisk/AndersTest
Ammo,HealthPickup now takes in account for possible parenting/childin…
2016-02-25 09:58:14 +01:00
verysecrethero ef87102d1f Ammo,HealthPickup now takes in account for possible parenting/childing of the pickup. Also saved the xml files with the new scaling 2016-02-24 17:53:37 +01:00
Jace 9a41bda4cf Merge pull request #132 from teamfisk/CubeMap
Cube map
2016-02-24 16:03:49 +01:00
Tleety fc18932068 Merge remote-tracking branch 'origin/master' into CubeMap
# Conflicts:
#	src/Engine/Rendering/Renderer.cpp
2016-02-24 15:45:30 +01:00
Tobias Dahl b874ea8641 Merge pull request #131 from teamfisk/ResizeWindowFixFromSSAOMerge
Have fix the resizing errors
2016-02-24 15:22:12 +01:00
Tobias Dahl 2609a0253d Merge pull request #129 from teamfisk/HUDDesync
Networking improvements
2016-02-24 15:22:01 +01:00
William Moberg de309d3b9d Merge pull request #130 from teamfisk/AndersTest
CapturePointSystem fix, DamageIndicatorSystem fix
2016-02-24 15:17:36 +01:00
Tobias Dahl f7ef6707a7 Merge pull request #116 from teamfisk/SeeTeamMates
See team mates
2016-02-24 15:05:19 +01:00
Tleety feeff5b164 Debug tool for different CubeMap
changed cubemap influence.
2016-02-24 14:47:47 +01:00
stiffly 7394436e7a Removed unnecessary comment. 2016-02-24 14:23:54 +01:00
Tleety f41e0b29be assets 2016-02-24 14:21:48 +01:00
Tleety 607e83134d Cubemaps working 2016-02-24 14:16:49 +01:00
verysecrethero 5af4f9d8e7 Removed a comment originating from HUDDesynch branch 2016-02-24 14:06:41 +01:00
verysecrethero af68236e71 now using a define INDICATOR_TEST to activate the DamageIndicatorSystem test. 2016-02-24 13:58:05 +01:00
Tleety 6f9ce8a0c1 WIP 2016-02-24 13:57:54 +01:00
Jocke fa13c1d065 Double jump is now working. 2016-02-23 18:24:46 +01:00
verysecrethero e2831c5593 CapturePointSystem fix, DamageIndicatorSystem fix 2016-02-23 17:29:33 +01:00
Tleety 8d23c531af Cubemaps kinda functioning, still somthing wierd with the vectors. 2016-02-23 17:17:50 +01:00
viktorljung 606a9bf94f BlendTree now working but has some memory leaks 2016-02-23 17:06:41 +01:00
Tleety 91b0ac5fbd Some groundwork for cubemaps. 2016-02-23 16:00:43 +01:00
stiffly d77119bb2d Fixed print for serverlist. 2016-02-23 11:47:44 +01:00
stiffly 27669b7383 Merge remote-tracking branch 'origin/master' into HUDDesync 2016-02-23 11:09:44 +01:00
stiffly fc7d62a5ad Various clean ups. 2016-02-23 11:07:56 +01:00
stiffly c42e1e0967 SoundSystem Fix. Now subscribes to an event that was thought to be listened to. 2016-02-23 11:07:41 +01:00
stiffly fe9dbf0b0f Serverlist fix. 2016-02-23 10:33:20 +01:00
Tleety 4ffb03fdd5 Merge remote-tracking branch 'origin/master' into SmallFixes-Tobias
# Conflicts:
#	src/Engine/Rendering/DrawFinalPass.cpp
2016-02-23 10:02:53 +01:00
Teejoon fe3e0bac5b Changed SpritIndicator values on player 2016-02-22 18:45:02 +01:00
Teejoon fa4f007604 Changed name from Indicator to SpriteIndicator. Can now be an indicator for a single team or every one 2016-02-22 18:35:00 +01:00
viktorljung 127edb4e60 Fixed some memory leaks 2016-02-22 17:47:30 +01:00
stiffly e5ff88d3c9 SoundSystem bug fix 2016-02-22 17:41:14 +01:00
stiffly 845a30ed0f Merge remote-tracking branch 'origin/DynamicPacketBuffer' into HUDDesync
# Conflicts:
#	include/Engine/Network/TCPServer.h
#	src/Engine/Network/TCPServer.cpp
2016-02-22 17:39:48 +01:00
Jocke 34a71b0767 Fixed linking issue. 2016-02-22 17:24:35 +01:00
stiffly 833006744a WIP 2016-02-22 17:00:25 +01:00
Jocke b2d8cddfb7 WE now send the map on connect after that only player information. 2016-02-22 16:46:31 +01:00
Teejoon 6fab971734 Merge branch 'master' of https://github.com/teamfisk/TacticalZ into SeeTeamMates
Conflicts:
	include/Engine/Rendering/SpriteJob.h
	resources/Schema/Components.xsd
	resources/Schema/Entities/Player.xml
	resources/Schema/Entities/PlayerRed.xml
2016-02-22 16:43:18 +01:00
Jocke ed9149fe63 Network buffer should now dynamically increase when needed. 2016-02-22 16:04:27 +01:00
viktorljung abd36c81f8 Added BlendTree that stores and blends multiple animations 2016-02-22 15:58:38 +01:00
stiffly 4c1a284636 Server now does Capture point logic too. 2016-02-22 11:30:31 +01:00
stiffly 23dc8e07b2 Will this do the trick? Now tells the server to send HUD entities too. 2016-02-22 10:41:37 +01:00
stiffly c7d31cac2d Merge remote-tracking branch 'origin/master' into FriendlyHost/Join
# Conflicts:
#	src/Engine/Network/Client.cpp
2016-02-22 10:19:48 +01:00
stiffly a1e932d261 Merge remote-tracking branch 'origin/master' into FriendlyHost/Join 2016-02-22 10:06:51 +01:00
stiffly 070f1bd394 Merge remote-tracking branch 'origin/FriendlyHost/Join' into FriendlyHost/Join
# Conflicts:
#	src/Engine/Network/Client.cpp
2016-02-22 10:06:25 +01:00
stiffly 993d804cef Added an event to search for servers.
Client now broadcasts a serverlistrequest.
An active server will then answer the request and send info about the server.
The client saves this data to a list and presents it to the user.
2016-02-22 10:05:47 +01:00
stiffly 2f259c3773 Added an event to search for servers.
Client now broadcasts a serverlistrequest.
An active server will then answer the request and send info about the server.
The client saves this data to a list and presents it to the user.
2016-02-19 15:38:09 +01:00
Tleety 97fcdb342d Bloom should now show behind transparent objects. 2016-02-19 14:23:40 +01:00
Tleety 949ee76f55 Fallow and name fix 2016-02-19 13:52:16 +01:00
FakeShemp 73a4336206 Try some stuff 2016-02-18 23:33:10 +01:00
FakeShemp f2ab02d860 More WIP
Switching between levels seem to work, but I borked all matrices
2016-02-18 22:38:50 +01:00
FakeShemp bf376f54b6 WIP
I think this is now finding the different segments of the cascade
2016-02-18 20:48:39 +01:00
viktorljung 3c9c95cff4 Animation blending improved and Animation Override added 2016-02-18 16:34:18 +01:00
verysecrethero b81bb9eeea Changed SprintAbility to take StrengthOfEffect. PlayerMovementSystem: if Sniper is sprinting he will now move faster. 2016-02-18 15:17:19 +01:00
verysecrethero b2304a95f8 Fixed some XML documentation 2016-02-18 13:49:22 +01:00
verysecrethero 8c92b7ceb6 Small cleanup. Clarified a few comments 2016-02-18 13:40:17 +01:00
verysecrethero 7f489b3569 Added Assault,Defender,Sniper Components,Entities. Added ShieldAbility,Sprintability-Component (not implemented). Changed BoostSystem to use a childed Boost to the player. All friendly fire is 0 damage. 2016-02-18 10:40:09 +01:00
FakeShemp 178402e964 cascade shadow wip 2016-02-18 10:08:29 +01:00
verysecrethero c3ed429377 Added BoostSystem, Added BoostAssault entity XML 2016-02-17 18:11:36 +01:00
Teejoon c4d3c515e4 Marge with Master 2016-02-17 18:04:49 +01:00
Teejoon 7cc58dc94c Merge branch 'master' of https://github.com/teamfisk/TacticalZ into SeeTeamMates 2016-02-17 18:00:30 +01:00
Teejoon 5e3af7ac5d Player Indicator now working OK. Scaling depending on how far away you are makes the Indicator to hide players head behind it. Shields are making indicators to disappear. 2016-02-17 17:58:01 +01:00
stiffly 46987beefb Updated the serverlist, now prints adress and port of the server. 2016-02-17 17:05:10 +01:00
Teejoon 4fd0108443 Working billbording 2016-02-17 16:50:24 +01:00
verysecrethero 56bc1fee3d Added LifeTimeOfEffect in BoostAssault,BoostDefender components. 2016-02-17 16:43:38 +01:00
verysecrethero 1c9a1a9904 playerMovementSpeed,playerCrouchSpeed in the player component now also gets AssaultBoosted. 2016-02-17 16:04:44 +01:00
stiffly 950ecba1c0 Merge remote-tracking branch 'origin/master' into FriendlyHost/Join 2016-02-17 15:52:58 +01:00
stiffly fdc8f753cb Implemented primitive server "heartbeat" logic, which sends server info from server to client without being connected. 2016-02-17 15:51:26 +01:00
viktorljung debb1881bf BoneAttachment working 2016-02-17 15:48:45 +01:00
verysecrethero e8aff02c4e Merge remote-tracking branch 'origin/master' into AssaultBoost 2016-02-17 14:58:28 +01:00
viktorljung db8bc612bd AdditiveBlend now working, needs cleanup 2016-02-17 14:55:02 +01:00
verysecrethero f7303ad787 Merge remote-tracking branch 'origin/master' into AssaultBoost 2016-02-17 14:38:04 +01:00
verysecrethero 456cd35a12 Merge remote-tracking branch 'origin/master' into AssaultBoost
# Conflicts:
#	resources/Schema/Components.xsd
2016-02-17 11:52:06 +01:00
viktorljung e7118ce8e5 WIP 2016-02-17 10:52:50 +01:00
Jocke 4432891437 Fixed crash in Client::parsePlayerDamage. 2016-02-17 10:21:50 +01:00
Jocke a006db9e63 WIP Fix dsync 2016-02-16 16:06:17 +01:00
Teejoon 17da9a8036 WIP 2016-02-16 15:56:58 +01:00
Jocke 717af2c4a4 Fixed bug in Client::parsePlayerDamage() 2016-02-16 10:22:15 +00:00
FakeShemp 36043010af wip for shadows
they work, but will be shit until we get cascaded.
2016-02-10 20:51:33 +01:00
FakeShemp cb77c1ff97 Working pcf, not optimized 2016-02-10 16:16:41 +01:00
FakeShemp 69db32337d Shado wip 2016-02-10 15:16:58 +01:00
verysecrethero 2f53ed140f Merge remote-tracking branch 'origin/master' into AssaultBoost
# Conflicts:
#	resources/Schema/Components.xsd
2016-02-10 14:16:55 +01:00
Ayumiwii 6af167675d Shadow WIP stage 2
- fix cel-shading
2016-02-10 11:48:44 +01:00
Ayumiwii ecd823cb9f Shadow WIP stage 2
-  Soft shadow
2016-02-09 16:15:11 +01:00
FakeShemp 847c539373 Fix viewport 2016-02-09 14:44:12 +01:00
Ayumiwii cb7f06573f Shadows stage 2 WIP 2016-02-09 14:08:57 +01:00
verysecrethero 4bf91ba56a Merge remote-tracking branch 'origin/master' into AssaultBoost
# Conflicts:
#	resources/Schema/Components.xsd
#	src/Game/Systems/PlayerMovementSystem.cpp
2016-02-08 10:12:13 +01:00
Ayumiwii 6542d1b444 Shadow WIP
- DepthTexture working
2016-02-05 17:29:53 +01:00
Ayumiwii bbf6058c17 Shadow WIP
- fixed file placing of ShadowPass.cpp
2016-02-05 16:13:46 +01:00
Ayumiwii 0e51ae7dc9 shadow wip 2016-02-05 15:31:20 +01:00
Ayumiwii c912cd7a42 Shadows wip 2016-02-05 15:12:17 +01:00
Ayumiwii 7f1016476b Shadows WIP
- create 2D texture (depthmap)
2016-02-05 15:08:56 +01:00
verysecrethero 047e71a4e1 Added BoostAssault,BoostDefender components. Added their effects in HealthSystem,PlayerMovementSystem 2016-02-04 16:18:54 +01:00
315 changed files with 73844 additions and 4430 deletions
+1 -1
Submodule assets updated: 1e7adc749e...52ea74c5d5
@@ -24,6 +24,7 @@ public:
private: private:
Octree<EntityAABB>* m_Octree; Octree<EntityAABB>* m_Octree;
std::vector<EntityAABB> m_OctreeResult; std::vector<EntityAABB> m_OctreeResult;
std::unordered_map<EntityWrapper, glm::vec3> m_PrevPositions;
}; };
#endif #endif
+12
View File
@@ -2,6 +2,7 @@
#define ComponentInfo_h__ #define ComponentInfo_h__
#include "../Common.h" #include "../Common.h"
#include "Entity.h"
#include <boost/shared_array.hpp> #include <boost/shared_array.hpp>
struct ComponentInfo struct ComponentInfo
@@ -21,6 +22,7 @@ struct ComponentInfo
{ {
std::string Name; std::string Name;
std::string Type; std::string Type;
unsigned char Index;
unsigned int Offset; unsigned int Offset;
unsigned int Stride; unsigned int Stride;
}; };
@@ -32,6 +34,16 @@ struct ComponentInfo
unsigned int Stride = 0; unsigned int Stride = 0;
boost::shared_array<char> Defaults = nullptr; boost::shared_array<char> Defaults = nullptr;
std::shared_ptr<Meta_t> Meta = nullptr; std::shared_ptr<Meta_t> Meta = nullptr;
std::size_t GetHeaderSize() const
{
std::size_t size = 0;
// A component block starts with an entity ID
size += sizeof(EntityID);
return size;
}
}; };
template<> template<>
+10 -8
View File
@@ -5,16 +5,15 @@
#include "MemoryPool.h" #include "MemoryPool.h"
#include "ComponentInfo.h" #include "ComponentInfo.h"
#include "ComponentWrapper.h" #include "ComponentWrapper.h"
#include "DirtySet.h"
class ComponentPool;
class ComponentPoolForwardIterator class ComponentPoolForwardIterator
: public std::iterator<std::forward_iterator_tag, ComponentWrapper> : public std::iterator<std::forward_iterator_tag, ComponentWrapper>
{ {
public: public:
ComponentPoolForwardIterator(const ComponentInfo& componentInfo, const MemoryPool<char>::iterator begin, const MemoryPool<char>::iterator end) ComponentPoolForwardIterator(ComponentPool* pool, const MemoryPool<char>::iterator begin, const MemoryPool<char>::iterator end);
: m_ComponentInfo(componentInfo)
, m_MemoryPoolIterator(begin)
, m_MemoryPoolEnd(end)
{ }
ComponentPoolForwardIterator(const ComponentPoolForwardIterator& other) = default; ComponentPoolForwardIterator(const ComponentPoolForwardIterator& other) = default;
ComponentPoolForwardIterator(ComponentPoolForwardIterator&& other) = default; ComponentPoolForwardIterator(ComponentPoolForwardIterator&& other) = default;
@@ -27,6 +26,7 @@ public:
ComponentWrapper operator*() const; ComponentWrapper operator*() const;
private: private:
ComponentPool* m_ComponentPool;
const ComponentInfo& m_ComponentInfo; const ComponentInfo& m_ComponentInfo;
MemoryPool<char>::iterator m_MemoryPoolIterator; MemoryPool<char>::iterator m_MemoryPoolIterator;
const MemoryPool<char>::iterator m_MemoryPoolEnd; const MemoryPool<char>::iterator m_MemoryPoolEnd;
@@ -34,6 +34,7 @@ private:
class ComponentPool class ComponentPool
{ {
friend class ComponentPoolForwardIterator;
public: public:
typedef ComponentPoolForwardIterator iterator; typedef ComponentPoolForwardIterator iterator;
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
@@ -44,7 +45,7 @@ public:
ComponentPool(const ::ComponentInfo& ci) ComponentPool(const ::ComponentInfo& ci)
: m_ComponentInfo(ci) : m_ComponentInfo(ci)
, m_Pool(ci.Meta->Allocation, sizeof(EntityID) + ci.Stride) , m_Pool(ci.Meta->Allocation, ci.GetHeaderSize() + ci.Stride)
{ } { }
~ComponentPool(); ~ComponentPool();
ComponentPool(const ComponentPool& other); ComponentPool(const ComponentPool& other);
@@ -61,8 +62,8 @@ public:
// Delete a component and free its memory // Delete a component and free its memory
void Delete(ComponentWrapper& wrapper); void Delete(ComponentWrapper& wrapper);
iterator begin() const; iterator begin();
iterator end() const; iterator end();
size_t size() const; size_t size() const;
//Dumps information about what the pool memory looks like right now //Dumps information about what the pool memory looks like right now
@@ -80,6 +81,7 @@ private:
::ComponentInfo m_ComponentInfo; ::ComponentInfo m_ComponentInfo;
MemoryPool<char> m_Pool; MemoryPool<char> m_Pool;
std::unordered_map<EntityID, char*> m_EntityToComponent; std::unordered_map<EntityID, char*> m_EntityToComponent;
DirtySet m_DirtySet;
}; };
#endif #endif
+181 -37
View File
@@ -4,46 +4,66 @@
#include <boost/shared_array.hpp> #include <boost/shared_array.hpp>
#include <boost/any.hpp> #include <boost/any.hpp>
#include "../Common.h" #include "../Common.h"
#include "../GLM.h"
#include "Entity.h" #include "Entity.h"
#include "ComponentInfo.h" #include "ComponentInfo.h"
#include "DirtySet.h"
#include "Util/Any.h" #include "Util/Any.h"
template <typename T, typename Enable = void>
struct ComponentField { };
template <typename T>
struct ComponentField<T, typename std::enable_if<std::is_trivially_copyable<T>::value>::type>
{
static T& Get(const ComponentInfo::Field_t& info, char* data) { return *reinterpret_cast<T*>(data); }
static void Set(const ComponentInfo::Field_t& info, char* data, const T& value) { Get(data) = value; }
};
template <>
struct ComponentField<std::string, void>
{
static std::string& Get(const ComponentInfo::Field_t& info, char* data) { return **reinterpret_cast<std::string**>(data); }
static void Set(const ComponentInfo::Field_t& info, char* data, const std::string& value) { Get(info, data) = value; }
};
struct ComponentWrapper struct ComponentWrapper
{ {
ComponentWrapper(const ComponentInfo& componentInfo, char* data) ComponentWrapper(const ComponentInfo& componentInfo, char* data, ::DirtyBitField* dirtyBitField)
: Info(componentInfo) : Info(componentInfo)
, EntityID(*reinterpret_cast<::EntityID*>(data)) , EntityID(*reinterpret_cast<::EntityID*>(data))
, Data(data + sizeof(::EntityID)) , Data(data + componentInfo.GetHeaderSize())
, DirtyBitField(dirtyBitField)
{ } { }
const ComponentInfo& Info; const ComponentInfo& Info;
const ::EntityID EntityID; const ::EntityID EntityID;
char* Data; char* Data;
::DirtyBitField* DirtyBitField = nullptr;
ComponentInfo::EnumType 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);
} }
bool Dirty(DirtySetType type, const std::string& fieldName)
{
if (DirtyBitField == nullptr) {
return true;
} else {
auto& field = Info.Fields.at(fieldName);
return DirtyBitField->operator[](type).count(field.Index) == 1;
}
}
void SetDirty(DirtySetType type, const std::string& fieldName, bool dirty = true)
{
if (DirtyBitField == nullptr) {
return;
}
auto& field = Info.Fields.at(fieldName);
if (dirty) {
DirtyBitField->operator[](type).insert(field.Index);
} else {
DirtyBitField->operator[](type).erase(field.Index);
}
}
void SetAllDirty(const std::string& fieldName, bool dirty = true)
{
LOG_DEBUG("DIRTY: %s %s", Info.Name.c_str(), fieldName.c_str());
for (auto& kv : *DirtyBitField) {
SetDirty(kv.first, fieldName);
}
}
template <typename T> template <typename T>
T& Field(std::string name) T& Field(const std::string& name)
{ {
const ComponentInfo::Field_t& field = Info.Fields.at(name); const ComponentInfo::Field_t& field = Info.Fields.at(name);
if (sizeof(T) > field.Stride) { if (sizeof(T) > field.Stride) {
@@ -55,13 +75,15 @@ struct ComponentWrapper
} }
template <typename T> template <typename T>
void SetField(std::string name, const T value) { Field<T>(name) = value; } void SetField(const std::string& name, const T& value)
//template <typename T> {
//void SetField(std::string name, T& value) { Field<T>(name) = value; } Field<T>(name) = value;
SetAllDirty(name);
}
// Specialization for string literals // Specialization for string literals
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(const std::string& name, const char(&value)[N]) { SetField(name, std::string(value)); }
void Copy(ComponentWrapper& destination) void Copy(ComponentWrapper& destination)
{ {
@@ -95,40 +117,162 @@ struct ComponentWrapper
struct SubscriptProxy struct SubscriptProxy
{ {
friend struct ComponentWrapper; friend struct ComponentWrapper;
private:
SubscriptProxy(ComponentWrapper* component, std::string propertyName) public:
SubscriptProxy(ComponentWrapper* component, std::string fieldName)
: m_Component(component) : m_Component(component)
, m_PropertyName(propertyName) , m_FieldName(fieldName)
{ } { }
ComponentWrapper* m_Component; ComponentWrapper* m_Component;
std::string m_PropertyName; std::string m_FieldName;
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
ComponentInfo::EnumType Enum(const char* enumKey) { return m_Component->Enum(m_PropertyName.c_str(), enumKey); } ComponentInfo::EnumType Enum(const char* enumKey) { return m_Component->Enum(m_FieldName.c_str(), enumKey); }
bool Dirty(DirtySetType type) { return m_Component->Dirty(type, m_FieldName); }
void SetDirty(DirtySetType type, bool dirty = true) { m_Component->SetDirty(type, m_FieldName, dirty); }
void SetAllDirty(bool dirty = true) { m_Component->SetAllDirty(m_FieldName, dirty); }
template <typename T> operator const double&() { return m_Component->Field<double>(m_FieldName); }
operator T&() { return m_Component->Field<T>(m_PropertyName); } operator const float&() { return m_Component->Field<float>(m_FieldName); }
operator const int&() { return m_Component->Field<int>(m_FieldName); }
operator const glm::vec3&() { return m_Component->Field<glm::vec3>(m_FieldName); }
operator const glm::vec4&() { return m_Component->Field<glm::vec4>(m_FieldName); }
operator const glm::quat&() { return m_Component->Field<glm::quat>(m_FieldName); }
operator const bool&() { return m_Component->Field<bool>(m_FieldName); }
operator const std::string&() { return m_Component->Field<std::string>(m_FieldName); }
// Don't allow non-const references
// If this wasn't deleted, the above overloads would still get called for some reason...
template <
typename T,
typename = typename std::enable_if<!std::is_base_of<::FIELDLOL, T>::value>::type
>
operator T&() = delete;
// Value assignment
template <typename T> template <typename T>
void operator=(const T val) { m_Component->SetField<T>(m_PropertyName, val); } void operator=(const T& val) { m_Component->SetField<T>(m_FieldName, val); }
// TODO: Pass by reference and rvalue (universal reference?)
//template <typename T>
//void operator=(T& val) { m_Component->SetField<T>(m_PropertyName, val); }
// Specialization for string literals // Specialization for string literals
template <std::size_t N> template <std::size_t N>
void operator=(const char(&val)[N]) { m_Component->SetField<N>(m_PropertyName, val); } void operator=(const char(&val)[N]) { m_Component->SetField<N>(m_FieldName, val); }
}; };
SubscriptProxy operator[](std::string propertyName) { return SubscriptProxy(this, propertyName); } SubscriptProxy operator[](const std::string& propertyName) { return SubscriptProxy(this, propertyName); }
}; };
struct FIELDLOL { }; // lol
template <typename T>
struct FieldBase : FIELDLOL
{
FieldBase(ComponentWrapper::SubscriptProxy& Proxy)
: Proxy(Proxy)
, Data(Proxy.m_Component->Field<T>(Proxy.m_FieldName))
{ }
void SetAllDirty() { Proxy.SetAllDirty(); }
FieldBase& operator=(const FieldBase& rhs) { Data = rhs.Data; SetAllDirty(); return *this; }
FieldBase& operator=(const T& rhs) { Data = rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator+=(const T2& rhs) { Data += rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator-=(const T2& rhs) { Data -= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator*=(const T2& rhs) { Data *= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator/=(const T2& rhs) { Data /= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator%=(const T2& rhs) { Data %= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator&=(const T2& rhs) { Data &= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator|=(const T2& rhs) { Data |= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator^=(const T2& rhs) { Data ^= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator<<=(const T2& rhs) { Data <<= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator>>=(const T2& rhs) { Data >>= rhs; SetAllDirty(); return *this; }
T operator+() const { return +Data; }
T operator-() const { return -Data; }
T operator~() const { return ~Data; }
FieldBase& operator++() { Data++; SetAllDirty(); return *this; }
T operator++(int) { T tmp = Data; operator++(); return tmp; }
FieldBase& operator--() { Data--; SetAllDirty(); return *this; }
T operator--(int) { T tmp = Data; operator--(); return tmp; }
operator const T&() const { return Data; }
const T& operator*() const { return operator const T&(); }
protected:
ComponentWrapper::SubscriptProxy Proxy;
T& Data;
};
template <typename T>
struct Field : FieldBase<T>
{
using FieldBase<T>::FieldBase;
using FieldBase<T>::operator=;
};
template <>
struct Field<glm::vec3> : FieldBase<glm::vec3>
{
using FieldBase<glm::vec3>::FieldBase;
using FieldBase<glm::vec3>::operator=;
glm::vec3::value_type x() const { return Data.x; }
void x(glm::vec3::value_type val) { Data.x = val; SetAllDirty(); }
glm::vec3::value_type y() const { return Data.y; }
void y(glm::vec3::value_type val) { Data.y = val; SetAllDirty(); }
glm::vec3::value_type z() const { return Data.z; }
void z(glm::vec3::value_type val) { Data.z = val; SetAllDirty(); }
template <typename T> friend glm::vec3 operator+(const Field<glm::vec3>& lhs, const T& rhs) { return static_cast<glm::vec3>(lhs) + glm::vec3(rhs); }
template <typename T> friend glm::vec3 operator-(const Field<glm::vec3>& lhs, const T& rhs) { return static_cast<glm::vec3>(lhs) - glm::vec3(rhs); }
template <typename T> friend glm::vec3 operator*(const Field<glm::vec3>& lhs, const T& rhs) { return static_cast<glm::vec3>(lhs) * glm::vec3(rhs); }
template <typename T> friend glm::vec3 operator/(const Field<glm::vec3>& lhs, const T& rhs) { return static_cast<glm::vec3>(lhs) / glm::vec3(rhs); }
template <typename T> friend glm::vec3 operator+(const T& lhs, const Field<glm::vec3>& rhs) { return glm::vec3(lhs) + static_cast<glm::vec3>(rhs); }
template <typename T> friend glm::vec3 operator-(const T& lhs, const Field<glm::vec3>& rhs) { return glm::vec3(lhs) - static_cast<glm::vec3>(rhs); }
template <typename T> friend glm::vec3 operator*(const T& lhs, const Field<glm::vec3>& rhs) { return glm::vec3(lhs) * static_cast<glm::vec3>(rhs); }
template <typename T> friend glm::vec3 operator/(const T& lhs, const Field<glm::vec3>& rhs) { return glm::vec3(lhs) / static_cast<glm::vec3>(rhs); }
friend glm::vec3& operator+=(glm::vec3& lhs, const Field<glm::vec3>& rhs) { lhs += *rhs; return lhs; }
};
template <>
struct Field<glm::vec4> : FieldBase<glm::vec4>
{
//Field(glm::vec4& Data)
// : FieldBase(Data)
//{ }
using FieldBase<glm::vec4>::FieldBase;
using FieldBase<glm::vec4>::operator=;
glm::vec4::value_type x() const { return Data.x; }
void x(glm::vec4::value_type val) { Data.x = val; SetAllDirty(); }
glm::vec4::value_type y() const { return Data.y; }
void y(glm::vec4::value_type val) { Data.y = val; SetAllDirty(); }
glm::vec4::value_type z() const { return Data.z; }
void z(glm::vec4::value_type val) { Data.z = val; SetAllDirty(); }
glm::vec4::value_type w() const { return Data.w; }
void w(glm::vec4::value_type val) { Data.w = val; SetAllDirty(); }
template <typename T> friend glm::vec4 operator+(const Field<glm::vec4>& lhs, const T& rhs) { return static_cast<glm::vec4>(lhs) + glm::vec4(rhs); }
template <typename T> friend glm::vec4 operator-(const Field<glm::vec4>& lhs, const T& rhs) { return static_cast<glm::vec4>(lhs) - glm::vec4(rhs); }
template <typename T> friend glm::vec4 operator*(const Field<glm::vec4>& lhs, const T& rhs) { return static_cast<glm::vec4>(lhs) * glm::vec4(rhs); }
template <typename T> friend glm::vec4 operator/(const Field<glm::vec4>& lhs, const T& rhs) { return static_cast<glm::vec4>(lhs) / glm::vec4(rhs); }
template <typename T> friend glm::vec4 operator+(const T& lhs, const Field<glm::vec4>& rhs) { return glm::vec4(lhs) + static_cast<glm::vec4>(rhs); }
template <typename T> friend glm::vec4 operator-(const T& lhs, const Field<glm::vec4>& rhs) { return glm::vec4(lhs) - static_cast<glm::vec4>(rhs); }
template <typename T> friend glm::vec4 operator*(const T& lhs, const Field<glm::vec4>& rhs) { return glm::vec4(lhs) * static_cast<glm::vec4>(rhs); }
template <typename T> friend glm::vec4 operator/(const T& lhs, const Field<glm::vec4>& rhs) { return glm::vec4(lhs) / static_cast<glm::vec4>(rhs); }
friend glm::vec4& operator+=(glm::vec4& lhs, const Field<glm::vec4>& rhs) { lhs += *rhs; return lhs; }
};
// A component wrapper that "owns" its data through a shared pointer // A component wrapper that "owns" its data through a shared pointer
struct SharedComponentWrapper : ComponentWrapper struct SharedComponentWrapper : ComponentWrapper
{ {
SharedComponentWrapper(const ComponentInfo& componentInfo, boost::shared_array<char> data) SharedComponentWrapper(const ComponentInfo& componentInfo, boost::shared_array<char> data)
: ComponentWrapper(componentInfo, data.get()) : ComponentWrapper(componentInfo, data.get(), nullptr)
, m_DataReference(data) , m_DataReference(data)
{ } { }
+16
View File
@@ -0,0 +1,16 @@
#ifndef DirtySet_h__
#define DirtySet_h__
#include <set>
#include "ComponentInfo.h"
enum class DirtySetType
{
Transform,
Network
};
typedef std::unordered_map<DirtySetType, std::set<decltype(ComponentInfo::Field_t::Index)>> DirtyBitField;
typedef std::unordered_map<EntityID, DirtyBitField> DirtySet;
#endif
+3 -1
View File
@@ -12,7 +12,9 @@ namespace Events
struct Captured : Event struct Captured : Event
{ {
int TeamNumberThatCapturedCapturePoint; int TeamNumberThatCapturedCapturePoint;
EntityID CapturePointID; EntityID CapturePointTakenID;
EntityWrapper BlueTeamNextCapturePoint;
EntityWrapper RedTeamNextCapturePoint;
}; };
} }
+3 -2
View File
@@ -10,8 +10,9 @@ 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
EntityWrapper Player; EntityWrapper Player = EntityWrapper::Invalid;
std::string KilledByWhat; EntityWrapper Killer = EntityWrapper::Invalid;
std::string KilledByWhat = "";
}; };
} }
+9 -152
View File
@@ -1,164 +1,21 @@
#ifndef EntityFile_h__ #ifndef EntityFile_h__
#define EntityFile_h__ #define EntityFile_h__
#include <stack> #include "World.h"
#include <boost/lexical_cast.hpp> #include "EntityXMLFile.h"
#include <xercesc/util/XercesDefs.hpp> #include "EntityXMLFilePreprocessor.h"
#include <xercesc/util/PlatformUtils.hpp> #include "EntityXMLFileParser.h"
#include <xercesc/sax2/SAX2XMLReader.hpp> #include "EntityWrapper.h"
#include <xercesc/sax2/XMLReaderFactory.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/sax2/Attributes.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/XMLChar.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/framework/XMLDocumentHandler.hpp>
#include <xercesc/framework/psvi/XSElementDeclaration.hpp>
#include <xercesc/framework/psvi/XSComplexTypeDefinition.hpp>
#include <xercesc/framework/psvi/XSParticle.hpp>
#include <xercesc/framework/psvi/XSModelGroup.hpp>
#include <xercesc/framework/psvi/XSAnnotation.hpp>
#include <xercesc/framework/psvi/XSValue.hpp>
#include <xercesc/framework/XMLGrammarPoolImpl.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMLSInput.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include "../GLM.h" class EntityFile : private World, public Resource
#include "Util/XercesString.h"
#include "ResourceManager.h"
#include "Entity.h"
#include "ComponentInfo.h"
class EntityFileHandler
{
friend class EntityFileSAXHandler;
public:
// @param EntityID The entity found
// @param EntityID The parent of the entity
typedef std::function<void(EntityID, EntityID, const std::string&)> OnStartEntityCallback;
void SetStartEntityCallback(OnStartEntityCallback c) { m_OnStartEntityCallback = c; }
// @param EntityID The entity the component corresponds to
// @param std::string Type name of the component
typedef std::function<void(EntityID, const std::string&)> OnStartComponentCallback;
void SetStartComponentCallback(OnStartComponentCallback c) { m_OnStartComponentCallback = c; }
// @param EntityID Entity
// @param std::string Component name
// @param std::string Field name
// @param std::map<std::string, std::string> Field attribute names and values
typedef std::function<void(EntityID, const std::string&, const std::string&, const std::map<std::string, std::string>&)> OnStartFieldCallback;
void SetStartFieldCallback(OnStartFieldCallback c) { m_OnStartFieldCallback = c; }
// @param EntityID Entity
// @param std::string Component name
// @param std::string Field name
// @param char* Field data
typedef std::function<void(EntityID, const std::string&, const std::string&, const char*)> OnStartFieldDataCallback;
void SetStartFieldDataCallback(OnStartFieldDataCallback c) { m_OnStartFieldDataCallback = c; }
private:
OnStartEntityCallback m_OnStartEntityCallback = nullptr;
OnStartComponentCallback m_OnStartComponentCallback = nullptr;
OnStartFieldCallback m_OnStartFieldCallback = nullptr;
OnStartFieldDataCallback m_OnStartFieldDataCallback = nullptr;
};
class EntityFileSAXHandler : public xercesc::DefaultHandler
{ {
public: public:
enum class State EntityFile(std::string path);
{
Unknown,
Entity,
Component,
ComponentField
};
EntityFileSAXHandler(const EntityFileHandler* handler, xercesc::SAX2XMLReader* reader); EntityWrapper MergeInto(World* other);
void startElement(const XMLCh* const _uri, const XMLCh* const _localName, const XMLCh* const _qname, const xercesc::Attributes& attrs) override;
void characters(const XMLCh* const chars, const XMLSize_t length) override;
void endElement(const XMLCh* const _uri, const XMLCh* const _localName, const XMLCh* const _qname) override;
void warning(const xercesc::SAXParseException& e);
void error(const xercesc::SAXParseException& e);
void fatalError(const xercesc::SAXParseException& e);
private: private:
const EntityFileHandler* m_Handler; EntityID m_RootEntity = EntityID_Invalid;
xercesc::XMLGrammarPool* m_GrammarPool;
xercesc::SAX2XMLReader* m_Reader;
//State m_CurrentScope = State::Unknown;
std::stack<State> m_StateStack;
unsigned int m_NextEntityID = 0;
std::stack<EntityID> m_EntityStack;
std::string m_CurrentComponent;
std::string m_CurrentField;
std::map<std::string, std::string> m_CurrentAttributes;
void onStartEntity(const xercesc::Attributes& attrs);
void onEndEntity();
void onStartEntityRef(const xercesc::Attributes& attrs);
void onStartComponent(const std::string& name);
void onEndComponent(const std::string& name);
void onStartComponentField(const std::string& field, const xercesc::Attributes& attrs);
void onEndComponentField(const std::string& field);
void onFieldData(char* data);
};
class EntityFileXMLErrorHandler : public xercesc::ErrorHandler
{
public:
void warning(const xercesc::SAXParseException& e) override
{
reportParseException("Warning", e);
}
void error(const xercesc::SAXParseException& e) override
{
reportParseException("Error", e);
}
void fatalError(const xercesc::SAXParseException& e) override
{
reportParseException("FATAL ERROR", e);
}
void resetErrors() override { }
private:
void reportParseException(std::string type, const xercesc::SAXParseException& e)
{
char* message = xercesc::XMLString::transcode(e.getMessage());
char* systemID = xercesc::XMLString::transcode(e.getSystemId());
std::cerr << systemID << ":" << e.getLineNumber() << ":" << e.getColumnNumber() << std::endl;
std::cerr << type << ": " << message << std::endl;
xercesc::XMLString::release(&systemID);
xercesc::XMLString::release(&message);
}
};
class EntityFile : public Resource
{
friend class ResourceManager;
friend class EntityFileSAXHandler;
private:
EntityFile(boost::filesystem::path path);
~EntityFile();
public:
static unsigned int GetTypeStride(std::string typeName);
static void WriteAttributeData(char* outData, const ComponentInfo::Field_t& field, const std::map<std::string, std::string>& attributes);
static void WriteValueData(char* outData, const ComponentInfo::Field_t& field, const char* valueData);
xercesc::XMLGrammarPool* GrammarPool() const { return m_GrammarPool; }
void Parse(const EntityFileHandler* handler) const;
private:
boost::filesystem::path m_FilePath;
xercesc::XMLGrammarPool* m_GrammarPool;
xercesc::SAX2XMLReader* m_SAX2XMLReader;
//std::map<std::string, ::ComponentInfo> m_ComponentInfo;
//std::vector<std::string> m_EntityReferences;
static void setReaderFeatures(xercesc::SAX2XMLReader* reader);
}; };
#endif #endif
+8
View File
@@ -27,18 +27,26 @@ struct EntityWrapper
bool HasComponent(const std::string& componentType); bool HasComponent(const std::string& componentType);
void AttachComponent(const char* componentName); void AttachComponent(const char* componentName);
EntityWrapper Parent(); EntityWrapper Parent();
EntityWrapper FirstParentByName(const std::string& parentEntityName);
EntityWrapper FirstChildByName(const std::string& name); EntityWrapper FirstChildByName(const std::string& name);
EntityWrapper FirstLevelChildByName(const std::string& name);
EntityWrapper FirstParentWithComponent(const std::string& componentType); EntityWrapper FirstParentWithComponent(const std::string& componentType);
EntityWrapper Clone(EntityWrapper parent = EntityWrapper::Invalid);
std::vector<EntityWrapper> ChildrenWithComponent(const std::string& componentType);
void DeleteChildren();
bool IsChildOf(EntityWrapper potentialParent); bool IsChildOf(EntityWrapper potentialParent);
bool Valid() const; bool Valid() const;
ComponentWrapper operator[](const char* componentName); ComponentWrapper operator[](const char* componentName);
ComponentWrapper operator[](const std::string& componentName);
bool operator==(const EntityWrapper& e) const; bool operator==(const EntityWrapper& e) const;
bool operator!=(const EntityWrapper& e) const; bool operator!=(const EntityWrapper& e) const;
explicit operator EntityID() const; explicit operator EntityID() const;
private: private:
EntityWrapper firstChildByNameRecursive(const std::string& name, EntityID parent); EntityWrapper firstChildByNameRecursive(const std::string& name, EntityID parent);
EntityWrapper cloneRecursive(EntityWrapper entity, EntityWrapper parent);
void childrenWithComponentRecursive(const std::string& componentType, EntityWrapper& entity, std::vector<EntityWrapper>& childrenWithComponent);
}; };
namespace std namespace std
+164
View File
@@ -0,0 +1,164 @@
#ifndef EntityXMLFile_h__
#define EntityXMLFile_h__
#include <stack>
#include <boost/lexical_cast.hpp>
#include <xercesc/util/XercesDefs.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/sax2/SAX2XMLReader.hpp>
#include <xercesc/sax2/XMLReaderFactory.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/sax2/Attributes.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/XMLChar.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/framework/XMLDocumentHandler.hpp>
#include <xercesc/framework/psvi/XSElementDeclaration.hpp>
#include <xercesc/framework/psvi/XSComplexTypeDefinition.hpp>
#include <xercesc/framework/psvi/XSParticle.hpp>
#include <xercesc/framework/psvi/XSModelGroup.hpp>
#include <xercesc/framework/psvi/XSAnnotation.hpp>
#include <xercesc/framework/psvi/XSValue.hpp>
#include <xercesc/framework/XMLGrammarPoolImpl.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMLSInput.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include "../GLM.h"
#include "Util/XercesString.h"
#include "ResourceManager.h"
#include "Entity.h"
#include "ComponentInfo.h"
class EntityFileHandler
{
friend class EntityFileSAXHandler;
public:
// @param EntityID The entity found
// @param EntityID The parent of the entity
typedef std::function<void(EntityID, EntityID, const std::string&)> OnStartEntityCallback;
void SetStartEntityCallback(OnStartEntityCallback c) { m_OnStartEntityCallback = c; }
// @param EntityID The entity the component corresponds to
// @param std::string Type name of the component
typedef std::function<void(EntityID, const std::string&)> OnStartComponentCallback;
void SetStartComponentCallback(OnStartComponentCallback c) { m_OnStartComponentCallback = c; }
// @param EntityID Entity
// @param std::string Component name
// @param std::string Field name
// @param std::map<std::string, std::string> Field attribute names and values
typedef std::function<void(EntityID, const std::string&, const std::string&, const std::map<std::string, std::string>&)> OnStartFieldCallback;
void SetStartFieldCallback(OnStartFieldCallback c) { m_OnStartFieldCallback = c; }
// @param EntityID Entity
// @param std::string Component name
// @param std::string Field name
// @param char* Field data
typedef std::function<void(EntityID, const std::string&, const std::string&, const char*)> OnStartFieldDataCallback;
void SetStartFieldDataCallback(OnStartFieldDataCallback c) { m_OnStartFieldDataCallback = c; }
private:
OnStartEntityCallback m_OnStartEntityCallback = nullptr;
OnStartComponentCallback m_OnStartComponentCallback = nullptr;
OnStartFieldCallback m_OnStartFieldCallback = nullptr;
OnStartFieldDataCallback m_OnStartFieldDataCallback = nullptr;
};
class EntityFileSAXHandler : public xercesc::DefaultHandler
{
public:
enum class State
{
Unknown,
Entity,
Component,
ComponentField
};
EntityFileSAXHandler(const EntityFileHandler* handler, xercesc::SAX2XMLReader* reader);
void startElement(const XMLCh* const _uri, const XMLCh* const _localName, const XMLCh* const _qname, const xercesc::Attributes& attrs) override;
void characters(const XMLCh* const chars, const XMLSize_t length) override;
void endElement(const XMLCh* const _uri, const XMLCh* const _localName, const XMLCh* const _qname) override;
void warning(const xercesc::SAXParseException& e);
void error(const xercesc::SAXParseException& e);
void fatalError(const xercesc::SAXParseException& e);
private:
const EntityFileHandler* m_Handler;
xercesc::XMLGrammarPool* m_GrammarPool;
xercesc::SAX2XMLReader* m_Reader;
//State m_CurrentScope = State::Unknown;
std::stack<State> m_StateStack;
unsigned int m_NextEntityID = 0;
std::stack<EntityID> m_EntityStack;
std::string m_CurrentComponent;
std::string m_CurrentField;
std::map<std::string, std::string> m_CurrentAttributes;
void onStartEntity(const xercesc::Attributes& attrs);
void onEndEntity();
void onStartEntityRef(const xercesc::Attributes& attrs);
void onStartComponent(const std::string& name);
void onEndComponent(const std::string& name);
void onStartComponentField(const std::string& field, const xercesc::Attributes& attrs);
void onEndComponentField(const std::string& field);
void onFieldData(char* data);
};
class EntityFileXMLErrorHandler : public xercesc::ErrorHandler
{
public:
void warning(const xercesc::SAXParseException& e) override
{
reportParseException("Warning", e);
}
void error(const xercesc::SAXParseException& e) override
{
reportParseException("Error", e);
}
void fatalError(const xercesc::SAXParseException& e) override
{
reportParseException("FATAL ERROR", e);
}
void resetErrors() override { }
private:
void reportParseException(std::string type, const xercesc::SAXParseException& e)
{
char* message = xercesc::XMLString::transcode(e.getMessage());
char* systemID = xercesc::XMLString::transcode(e.getSystemId());
std::cerr << systemID << ":" << e.getLineNumber() << ":" << e.getColumnNumber() << std::endl;
std::cerr << type << ": " << message << std::endl;
xercesc::XMLString::release(&systemID);
xercesc::XMLString::release(&message);
}
};
class EntityXMLFile : public Resource
{
friend class ResourceManager;
friend class EntityFileSAXHandler;
private:
EntityXMLFile(boost::filesystem::path path);
~EntityXMLFile();
public:
static unsigned int GetTypeStride(std::string typeName);
static void WriteAttributeData(char* outData, const ComponentInfo::Field_t& field, const std::map<std::string, std::string>& attributes);
static void WriteValueData(char* outData, const ComponentInfo::Field_t& field, const char* valueData);
xercesc::XMLGrammarPool* GrammarPool() const { return m_GrammarPool; }
void Parse(const EntityFileHandler* handler) const;
private:
boost::filesystem::path m_FilePath;
xercesc::XMLGrammarPool* m_GrammarPool;
xercesc::SAX2XMLReader* m_SAX2XMLReader;
//std::map<std::string, ::ComponentInfo> m_ComponentInfo;
//std::vector<std::string> m_EntityReferences;
static void setReaderFeatures(xercesc::SAX2XMLReader* reader);
};
#endif
@@ -1,18 +1,19 @@
#ifndef EntityFileParser_h__ #ifndef EntityXMLFileParser_h__
#define EntityFileParser_h__ #define EntityXMLFileParser_h__
#include "EntityFile.h" #include "EntityXMLFile.h"
#include "World.h" #include "World.h"
class EntityFileParser class EntityXMLFileParser
{ {
friend class EntityFile;
public: public:
EntityFileParser(const EntityFile* entityFile); EntityXMLFileParser(const EntityXMLFile* entityFile);
EntityID MergeEntities(World* world, EntityID baseParent = EntityID_Invalid);
private: private:
const EntityFile* m_EntityFile; EntityID MergeEntities(World* world, EntityID baseParent = EntityID_Invalid);
const EntityXMLFile* m_EntityFile;
EntityFileHandler m_Handler; EntityFileHandler m_Handler;
World* m_World = nullptr; World* m_World = nullptr;
EntityID m_FirstEntity = EntityID_Invalid; EntityID m_FirstEntity = EntityID_Invalid;
@@ -1,5 +1,5 @@
#ifndef EntityFilePreprocessor_h__ #ifndef EntityXMLFilePreprocessor_h__
#define EntityFilePreprocessor_h__ #define EntityXMLFilePreprocessor_h__
#include <xercesc/framework/psvi/XSElementDeclaration.hpp> #include <xercesc/framework/psvi/XSElementDeclaration.hpp>
#include <xercesc/framework/psvi/XSComplexTypeDefinition.hpp> #include <xercesc/framework/psvi/XSComplexTypeDefinition.hpp>
@@ -17,17 +17,18 @@
#include "Util/XercesString.h" #include "Util/XercesString.h"
#include "ResourceManager.h" #include "ResourceManager.h"
#include "World.h" #include "World.h"
#include "EntityFile.h" #include "EntityXMLFile.h"
class EntityFilePreprocessor class EntityXMLFilePreprocessor
{ {
friend class EntityFile;
public: public:
EntityFilePreprocessor(const EntityFile* entityFile); EntityXMLFilePreprocessor(const EntityXMLFile* entityFile);
void RegisterComponents(World* world);
private: private:
const EntityFile* m_EntityFile; void RegisterComponents(World* world);
const EntityXMLFile* m_EntityFile;
std::map<std::string, unsigned int> m_ComponentCounts; std::map<std::string, unsigned int> m_ComponentCounts;
std::map<std::string, ComponentInfo> m_ComponentInfo; std::map<std::string, ComponentInfo> m_ComponentInfo;
@@ -1,5 +1,5 @@
#ifndef EntityFileWriter_h__ #ifndef EntityXMLFileWriter_h__
#define EntityFileWriter_h__ #define EntityXMLFileWriter_h__
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#include <xercesc/dom/DOM.hpp> #include <xercesc/dom/DOM.hpp>
@@ -8,13 +8,13 @@
#include <xercesc/framework/LocalFileFormatTarget.hpp> #include <xercesc/framework/LocalFileFormatTarget.hpp>
#include "Util/XercesString.h" #include "Util/XercesString.h"
#include "EntityFile.h" #include "EntityXMLFile.h"
#include "World.h" #include "World.h"
class EntityFileWriter class EntityXMLFileWriter
{ {
public: public:
EntityFileWriter(boost::filesystem::path file) EntityXMLFileWriter(boost::filesystem::path file)
: m_FilePath(file) : m_FilePath(file)
{ {
using namespace xercesc; using namespace xercesc;
-3
View File
@@ -118,9 +118,6 @@ public:
else { else {
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) {
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
@@ -68,7 +68,7 @@ protected:
const std::string m_ComponentType; const std::string m_ComponentType;
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cPlayer, double dt) = 0; virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& scoreScreen, double dt) = 0;
}; };
class ImpureSystem : public virtual System class ImpureSystem : public virtual System
+1 -1
View File
@@ -81,7 +81,7 @@ public:
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 = m_World->GetComponents(componentName); ComponentPool* pool = m_World->GetComponents(componentName);
if (pool == nullptr) { if (pool == nullptr) {
continue; continue;
} }
+11 -4
View File
@@ -6,6 +6,7 @@
#include "ObjectPool.h" #include "ObjectPool.h"
#include "ComponentPool.h" #include "ComponentPool.h"
#include "EventBroker.h" #include "EventBroker.h"
struct EntityWrapper;
class World class World
{ {
@@ -18,13 +19,13 @@ public:
World(const World& other); World(const World& other);
// Create empty entity // Create empty entity
EntityID CreateEntity(EntityID parent = 0); EntityID CreateEntity(EntityID parent = EntityID_Invalid);
// Delete entity and all components within // Delete entity and all components within
void DeleteEntity(EntityID entity); void DeleteEntity(EntityID entity);
// Check if an entity exists // Check if an entity exists
bool ValidEntity(EntityID entity) const; bool ValidEntity(EntityID entity) const;
// Register a component type and allocate space for it // Register a component type and allocate space for it
void RegisterComponent(ComponentInfo& ci); void RegisterComponent(const ComponentInfo& ci);
// Attach a component to an entity and fill it with default values // Attach a component to an entity and fill it with default values
ComponentWrapper AttachComponent(EntityID entity, const std::string& componentType); ComponentWrapper AttachComponent(EntityID entity, const std::string& componentType);
// Check if an entity has a component // Check if an entity has a component
@@ -34,13 +35,13 @@ public:
// Delete a component off an entity // Delete a component off an entity
void DeleteComponent(EntityID entity, const std::string& componentType); void DeleteComponent(EntityID entity, const std::string& componentType);
// Get all components of the specified type // Get all components of the specified type
const ComponentPool* GetComponents(const std::string& componentType); ComponentPool* GetComponents(const std::string& componentType);
// Get entity parent // Get entity parent
EntityID GetParent(EntityID entity); EntityID GetParent(EntityID entity);
// Change the parent of an entity // Change the parent of an entity
void SetParent(EntityID entity, EntityID parent); void SetParent(EntityID entity, EntityID parent);
// Get children of an entity // Get children of an entity
const std::pair<std::unordered_multimap<EntityID, EntityID>::const_iterator, std::unordered_multimap<EntityID, EntityID>::const_iterator> GetChildren(EntityID entity); const std::pair<std::unordered_multimap<EntityID, EntityID>::const_iterator, std::unordered_multimap<EntityID, EntityID>::const_iterator> GetDirectChildren(EntityID entity);
// Get all component pools // Get all component pools
const std::unordered_map<std::string, ComponentPool*>& GetComponentPools() const { return m_ComponentPools; } const std::unordered_map<std::string, ComponentPool*>& GetComponentPools() const { return m_ComponentPools; }
// Get the entity children map // Get the entity children map
@@ -49,6 +50,12 @@ public:
void SetName(EntityID entity, const std::string& name); void SetName(EntityID entity, const std::string& name);
// Get the textual name of an entity // Get the textual name of an entity
std::string GetName(EntityID entity) const; std::string GetName(EntityID entity) const;
// Get the first entity in the world with the name.
EntityWrapper GetFirstEntityByName(const std::string& name);
// Merge another world into this one
// Returns a map that maps entities from the other world to their copies in this one
std::unordered_map<EntityID, EntityID> Merge(const World* other);
private: private:
EventBroker* m_EventBroker = nullptr; EventBroker* m_EventBroker = nullptr;
@@ -12,8 +12,8 @@ template <typename EventContext>
class EditorCameraInputController : public FirstPersonInputController<EventContext> class EditorCameraInputController : public FirstPersonInputController<EventContext>
{ {
public: public:
EditorCameraInputController(EventBroker* eventBroker, unsigned int playerID) EditorCameraInputController(EventBroker* eventBroker, unsigned int playerID, EntityWrapper playerEntity)
: FirstPersonInputController(eventBroker, playerID) : FirstPersonInputController(eventBroker, playerID, playerEntity)
{ {
EVENT_SUBSCRIBE_MEMBER(m_EMousePress, &EditorCameraInputController::OnMousePress); EVENT_SUBSCRIBE_MEMBER(m_EMousePress, &EditorCameraInputController::OnMousePress);
EVENT_SUBSCRIBE_MEMBER(m_EMouseRelease, &EditorCameraInputController::OnMouseRelease); EVENT_SUBSCRIBE_MEMBER(m_EMouseRelease, &EditorCameraInputController::OnMouseRelease);
@@ -104,6 +104,11 @@ protected:
if (!m_Enabled) { if (!m_Enabled) {
return false; return false;
} }
ImGuiIO& io = ImGui::GetIO();
if (io.WantCaptureMouse || io.WantCaptureKeyboard) {
return false;
}
m_SpeedMultiplier += e.DeltaY * (0.1 * m_SpeedMultiplier); m_SpeedMultiplier += e.DeltaY * (0.1 * m_SpeedMultiplier);
m_Config->Set("Editor.CameraSpeed", m_SpeedMultiplier); m_Config->Set("Editor.CameraSpeed", m_SpeedMultiplier);
+9
View File
@@ -22,6 +22,7 @@
#include "../Core/ELockMouse.h" #include "../Core/ELockMouse.h"
#include "../Core/EFileDropped.h" #include "../Core/EFileDropped.h"
#include "../Rendering/Texture.h" #include "../Rendering/Texture.h"
#include "Game/Events/ESpawnerSpawn.h"
class EditorGUI class EditorGUI
{ {
@@ -73,6 +74,12 @@ public:
// Called when the user means to rename an entity. // Called when the user means to rename an entity.
typedef std::function<void(EntityWrapper, const std::string&)> OnEntityChangeName_t; typedef std::function<void(EntityWrapper, const std::string&)> OnEntityChangeName_t;
void SetEntityChangeNameCallback(OnEntityChangeName_t f) { m_OnEntityChangeName = f; } void SetEntityChangeNameCallback(OnEntityChangeName_t f) { m_OnEntityChangeName = f; }
// Called when the user pastes an entity previously "copied"
// @param EntityWrapper The entity to copy
// @param EntityWrapper The entity to parent the new copy to
// @return The new copy of the entity
typedef std::function<EntityWrapper(EntityWrapper, EntityWrapper)> OnEntityPaste_t;
void SetEntityPasteCallback(OnEntityPaste_t f) { m_OnEntityPaste = f; }
// Called when the user means to attach a new component to an entity. // Called when the user means to attach a new component to an entity.
typedef std::function<void(EntityWrapper, const std::string&)> OnComponentAttach_t; typedef std::function<void(EntityWrapper, const std::string&)> OnComponentAttach_t;
void SetComponentAttachCallback(OnComponentAttach_t f) { m_OnComponentAttach = f; } void SetComponentAttachCallback(OnComponentAttach_t f) { m_OnComponentAttach = f; }
@@ -111,6 +118,7 @@ private:
std::string m_DroppedFile = ""; std::string m_DroppedFile = "";
bool m_Paused = false; bool m_Paused = false;
bool m_MouseLocked = false; bool m_MouseLocked = false;
EntityWrapper m_CopyTarget = EntityWrapper::Invalid;
// Callbacks // Callbacks
OnEntitySelectedCallback_t m_OnEntitySelected = nullptr; OnEntitySelectedCallback_t m_OnEntitySelected = nullptr;
@@ -124,6 +132,7 @@ private:
OnComponentDelete_t m_OnComponentDelete = nullptr; OnComponentDelete_t m_OnComponentDelete = nullptr;
OnWidgetMode_t m_OnWidgetMode = nullptr; OnWidgetMode_t m_OnWidgetMode = nullptr;
OnWidgetSpace_t m_OnWidgetSpace = nullptr; OnWidgetSpace_t m_OnWidgetSpace = nullptr;
OnEntityPaste_t m_OnEntityPaste = nullptr;
// Events // Events
EventRelay<EditorGUI, Events::KeyDown> m_EKeyDown; EventRelay<EditorGUI, Events::KeyDown> m_EKeyDown;
+3 -3
View File
@@ -5,9 +5,8 @@
#include "../Core/World.h" #include "../Core/World.h"
#include "../Core/SystemPipeline.h" #include "../Core/SystemPipeline.h"
#include "../Core/ResourceManager.h" #include "../Core/ResourceManager.h"
#include "../Core/EntityFilePreprocessor.h" #include "../Core/EntityFile.h"
#include "../Core/EntityFileParser.h" #include "../Core/EntityXMLFileWriter.h"
#include "../Core/EntityFileWriter.h"
#include "../Core/EMousePress.h" #include "../Core/EMousePress.h"
#include "../Input/EInputCommand.h" #include "../Input/EInputCommand.h"
#include "EditorGUI.h" #include "EditorGUI.h"
@@ -56,6 +55,7 @@ private:
void OnEntityDelete(EntityWrapper entity); void OnEntityDelete(EntityWrapper entity);
void OnEntityChangeParent(EntityWrapper entity, EntityWrapper parent); void OnEntityChangeParent(EntityWrapper entity, EntityWrapper parent);
void OnEntityChangeName(EntityWrapper entity, const std::string& name); void OnEntityChangeName(EntityWrapper entity, const std::string& name);
EntityWrapper OnEntityPaste(EntityWrapper entityToCopy, EntityWrapper parent);
void OnComponentAttach(EntityWrapper entity, const std::string& componentType); void OnComponentAttach(EntityWrapper entity, const std::string& componentType);
void OnComponentDelete(EntityWrapper entity, const std::string& componentType); void OnComponentDelete(EntityWrapper entity, const std::string& componentType);
void OnWidgetSpace(EditorGUI::WidgetSpace widgetSpace); void OnWidgetSpace(EditorGUI::WidgetSpace widgetSpace);
+132 -26
View File
@@ -6,12 +6,13 @@
#include "../Core/ELockMouse.h" #include "../Core/ELockMouse.h"
#include "../Game/Events/EDashAbility.h" #include "../Game/Events/EDashAbility.h"
#include "InputHandler.h" #include "InputHandler.h"
#include "Rendering/EAutoAnimationBlend.h"
template <typename EventContext> template <typename EventContext>
class FirstPersonInputController : public InputController<EventContext> class FirstPersonInputController : public InputController<EventContext>
{ {
public: public:
FirstPersonInputController(EventBroker* eventBroker, int playerID); FirstPersonInputController(EventBroker* eventBroker, int playerID, EntityWrapper playerEntity);
virtual const glm::vec3 Movement() const { return m_Movement; } virtual const glm::vec3 Movement() const { return m_Movement; }
virtual const glm::vec3 Rotation() const { return m_Rotation; } virtual const glm::vec3 Rotation() const { return m_Rotation; }
@@ -27,12 +28,15 @@ public:
virtual bool OnCommand(const Events::InputCommand& e) override; virtual bool OnCommand(const Events::InputCommand& e) override;
virtual void Reset(); virtual void Reset();
void AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer); void AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, Field<double> assaultDashCoolDownTimer, EntityID playerID);
virtual bool AssaultDashDoubleTapped() const { return m_AssaultDashDoubleTapped; } virtual bool AssaultDashDoubleTapped() const { return m_AssaultDashDoubleTapped; }
virtual bool PlayerIsDashing() const { return m_PlayerIsDashing; } virtual bool PlayerIsDashing() const { return m_PlayerIsDashing; }
bool SpecialAbilityKeyDown() const { return m_SpecialAbilityKeyDown; }
protected: protected:
const int m_PlayerID; const int m_PlayerID;
EntityWrapper m_PlayerEntity;
bool m_MouseLocked = false; bool m_MouseLocked = false;
glm::vec3 m_Rotation; glm::vec3 m_Rotation;
glm::vec3 m_Movement; glm::vec3 m_Movement;
@@ -41,7 +45,7 @@ protected:
bool m_Crouching = false; bool m_Crouching = false;
//assault dash membervariables - needed to calculate the doubletap- and dashlogic //assault dash membervariables - needed to calculate the doubletap- and dashlogic
double m_AssaultDashDoubleTapDeltaTime = 0.0; double m_AssaultDashDoubleTapDeltaTime = 0.0;
double m_AssaultDashCoolDownTimer = 0.0; double m_DashEffectResetTimer = 0.0;
//i will let m_AssaultDashDoubleTapSensitivityTimer stay hardcoded, its not really a gamevariable (more an inputvariable), //i will let m_AssaultDashDoubleTapSensitivityTimer stay hardcoded, its not really a gamevariable (more an inputvariable),
//and its very unlikely that someone wants to change that value //and its very unlikely that someone wants to change that value
const float m_AssaultDashDoubleTapSensitivityTimer = 0.25f; const float m_AssaultDashDoubleTapSensitivityTimer = 0.25f;
@@ -52,7 +56,7 @@ protected:
bool m_ShiftDashing = false; bool m_ShiftDashing = false;
bool m_ValidDoubleTap = false; bool m_ValidDoubleTap = false;
//specialabilitys //specialabilities
bool m_MovementKeyDown = false; bool m_MovementKeyDown = false;
bool m_SpecialAbilityKeyDown = false; bool m_SpecialAbilityKeyDown = false;
int m_NumberOfMovementKeysDown = 0; int m_NumberOfMovementKeysDown = 0;
@@ -64,9 +68,10 @@ protected:
}; };
template <typename EventContext> template <typename EventContext>
FirstPersonInputController<EventContext>::FirstPersonInputController(EventBroker* eventBroker, int playerID) FirstPersonInputController<EventContext>::FirstPersonInputController(EventBroker* eventBroker, int playerID, EntityWrapper playerEntity)
: InputController(eventBroker) : InputController(eventBroker)
, m_PlayerID(playerID) , m_PlayerID(playerID)
, m_PlayerEntity(playerEntity)
{ {
EVENT_SUBSCRIBE_MEMBER(m_ELockMouse, &FirstPersonInputController::OnLockMouse); EVENT_SUBSCRIBE_MEMBER(m_ELockMouse, &FirstPersonInputController::OnLockMouse);
EVENT_SUBSCRIBE_MEMBER(m_EUnlockMouse, &FirstPersonInputController::OnUnlockMouse); EVENT_SUBSCRIBE_MEMBER(m_EUnlockMouse, &FirstPersonInputController::OnUnlockMouse);
@@ -117,13 +122,84 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
if (e.Command == "Forward") { if (e.Command == "Forward") {
float val = glm::clamp(e.Value, -1.f, 1.f); float val = glm::clamp(e.Value, -1.f, 1.f);
m_Movement.z = -val; m_Movement.z = -val;
if (m_PlayerEntity.Valid()) {
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
if (playerModel.Valid()) {
if (val > 0) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
if(m_Crouching) {
aeb.NodeName = "Walk";
} else {
aeb.NodeName = "Run";
}
aeb.RootNode = playerModel;
aeb.Start = true;
m_EventBroker->Publish(aeb);
} else if (val < 0) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
if (m_Crouching) {
aeb.NodeName = "Walk";
} else {
aeb.NodeName = "Run";
}
aeb.RootNode = playerModel;
aeb.Start = true;
aeb.Reverse = true;
m_EventBroker->Publish(aeb);
} else {
}
}
}
} }
if (e.Command == "Right") { if (e.Command == "Right") {
float val = glm::clamp(e.Value, -1.f, 1.f); float val = glm::clamp(e.Value, -1.f, 1.f);
m_Movement.x = val; m_Movement.x = val;
if (m_PlayerEntity.Valid()) {
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
if (playerModel.Valid()) {
if (val > 0) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "Right";
aeb.RootNode = playerModel;
aeb.Start = true;
m_EventBroker->Publish(aeb);
} else if (val < 0) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "Left";
aeb.RootNode = playerModel;
aeb.Start = true;
m_EventBroker->Publish(aeb);
} else {
}
}
}
} }
if (glm::length2(m_Movement) > 0) { if (glm::length2(m_Movement) > 0) {
m_Movement = glm::normalize(m_Movement); m_Movement = glm::normalize(m_Movement);
} else {
if (m_PlayerEntity.Valid()) {
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
if (playerModel.Valid()) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "Idle";
aeb.RootNode = playerModel;
m_EventBroker->Publish(aeb);
}
}
} }
} }
@@ -145,10 +221,10 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
if (m_NumberOfMovementKeysDown == 0) { if (m_NumberOfMovementKeysDown == 0) {
m_MovementKeyDown = false; m_MovementKeyDown = false;
} }
//you have just released the key, store what key it was and reset the doubletap-sensitivity-timer //you have just released the key, store what key it was and reset the doubletap-sensitivity-timer
m_AssaultDashTapDirection = m_CurrentDirectionVector; m_AssaultDashTapDirection = m_CurrentDirectionVector;
m_AssaultDashDoubleTapDeltaTime = 0.f; m_AssaultDashDoubleTapDeltaTime = 0.f;
} }
} }
@@ -158,21 +234,40 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
if (e.Command == "Crouch") { if (e.Command == "Crouch") {
m_Crouching = e.Value > 0; m_Crouching = e.Value > 0;
if (m_PlayerEntity.Valid()) {
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
if (playerModel.Valid()) {
if (e.Value == 0.f) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.3;
aeb.NodeName = "StandMovement";
aeb.RootNode = playerModel;
aeb.Start = true;
aeb.Restart = true;
aeb.SingleLevelBlend = true;
m_EventBroker->Publish(aeb);
} else if(e.Value == 1.0f) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.3;
aeb.NodeName = "CrouchMovement";
aeb.RootNode = playerModel;
aeb.Start = true;
aeb.Restart = true;
aeb.SingleLevelBlend = true;
m_EventBroker->Publish(aeb);
}
}
}
} }
if (e.Command == "SpecialAbility") { if (e.Command == "SpecialAbility") {
if (e.Value > 0) { m_SpecialAbilityKeyDown = e.Value > 0;
m_SpecialAbilityKeyDown = true;
} else {
m_SpecialAbilityKeyDown = false;
}
}
if (m_SpecialAbilityKeyDown && m_MovementKeyDown) {
m_ShiftDashing = true;
} else {
m_ShiftDashing = false;
} }
m_ShiftDashing = m_SpecialAbilityKeyDown && m_MovementKeyDown;
return true; return true;
} }
@@ -191,23 +286,33 @@ bool FirstPersonInputController<EventContext>::OnLockMouse(const Events::LockMou
} }
template <typename EventContext> template <typename EventContext>
void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer) { void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, Field<double> assaultDashCoolDownTimer, EntityID playerID) {
m_AssaultDashDoubleTapDeltaTime += dt; m_AssaultDashDoubleTapDeltaTime += dt;
m_AssaultDashCoolDownTimer -= dt; m_DashEffectResetTimer += dt;
assaultDashCoolDownTimer -= dt;
//cooldown = assaultDashCoolDownMaxTimer sec, pretend the dash lasts 0.25 sec (for friction to do its work) //cooldown = assaultDashCoolDownMaxTimer sec, pretend the dash lasts 0.25 sec (for friction to do its work)
if (m_AssaultDashCoolDownTimer > (assaultDashCoolDownMaxTimer - 0.25f)) { if (assaultDashCoolDownTimer > (assaultDashCoolDownMaxTimer - 0.25f)) {
m_PlayerIsDashing = true; m_PlayerIsDashing = true;
if (m_DashEffectResetTimer > 0.05) {
Events::DashAbility e;
e.Player = playerID;
m_EventBroker->Publish(e);
m_DashEffectResetTimer = 0.0;
}
} else { } else {
m_PlayerIsDashing = false; m_PlayerIsDashing = false;
} }
//dashing with shift //dashing with shift
if (m_ShiftDashing && m_AssaultDashCoolDownTimer <= 0.0f) { if (m_ShiftDashing && assaultDashCoolDownTimer <= 0.0f) {
//player is dashing with shift //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! //the wanted-direction is set in playermovement already so we dont need to check what direction we want to dash in!
m_AssaultDashCoolDownTimer = assaultDashCoolDownMaxTimer; assaultDashCoolDownTimer = assaultDashCoolDownMaxTimer;
m_AssaultDashDoubleTapped = true; m_AssaultDashDoubleTapped = true;
m_AssaultDashDoubleTapDeltaTime = 0.f; m_AssaultDashDoubleTapDeltaTime = 0.f;
Events::DashAbility e;
e.Player = playerID;
m_EventBroker->Publish(e);
return; return;
} }
@@ -227,7 +332,7 @@ void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool
} }
m_ValidDoubleTap = false; m_ValidDoubleTap = false;
if (!(m_AssaultDashCoolDownTimer <= 0.0f)) { if (!(assaultDashCoolDownTimer <= 0.0f)) {
//if we cant dash at the moment, then just reset the tap-sensitivity-timer //if we cant dash at the moment, then just reset the tap-sensitivity-timer
m_AssaultDashDoubleTapDeltaTime = 0.f; m_AssaultDashDoubleTapDeltaTime = 0.f;
return; return;
@@ -235,9 +340,10 @@ void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool
//ok, we have a valid tap, lets do it //ok, we have a valid tap, lets do it
m_AssaultDashDoubleTapped = true; m_AssaultDashDoubleTapped = true;
m_AssaultDashDoubleTapDeltaTime = 0.f; m_AssaultDashDoubleTapDeltaTime = 0.f;
m_AssaultDashCoolDownTimer = assaultDashCoolDownMaxTimer; assaultDashCoolDownTimer = assaultDashCoolDownMaxTimer;
Events::DashAbility e; Events::DashAbility e;
e.Player = playerID;
m_EventBroker->Publish(e); m_EventBroker->Publish(e);
} }
+39 -6
View File
@@ -19,11 +19,28 @@
#include "Core/World.h" #include "Core/World.h"
#include "Core/EventBroker.h" #include "Core/EventBroker.h"
#include "Core/ConfigFile.h" #include "Core/ConfigFile.h"
#include "Core/EPlayerDeath.h"
#include "Input/EInputCommand.h" #include "Input/EInputCommand.h"
#include "Core/EPlayerDamage.h" #include "Core/EPlayerDamage.h"
#include "../Game/Events/EDoubleJump.h"
#include "Network/EInterpolate.h" #include "Network/EInterpolate.h"
#include "Network/SnapshotFilter.h" #include "Network/SnapshotFilter.h"
#include "Core/EPlayerSpawned.h" #include "Core/EPlayerSpawned.h"
#include "Core/EAmmoPickup.h"
#include "Network/ESearchForServers.h"
#include "../Game/Events/EDashAbility.h"
struct ServerInfo
{
ServerInfo(std::string a, int b, std::string c, int d)
{
Address = a; Port = b; Name = c; PlayersConnected = d;
}
std::string Address = "";
int Port = 0;
std::string Name = "";
int PlayersConnected = 0;
};
class Client : public Network class Client : public Network
{ {
@@ -34,7 +51,9 @@ public:
void Connect(std::string address, int port); void Connect(std::string address, int port);
void Update() override; void Update() override;
private:
//UDPClient m_Unreliable;
TCPClient m_Reliable;
std::vector<Events::PlayerSpawned> m_PlayerSpawnEvents; std::vector<Events::PlayerSpawned> m_PlayerSpawnEvents;
void parseSpawnEvents(); void parseSpawnEvents();
// Save for children // Save for children
@@ -82,11 +101,16 @@ public:
void parseTCPConnect(Packet& packet); void parseTCPConnect(Packet& packet);
void parsePlayerConnected(Packet& packet); void parsePlayerConnected(Packet& packet);
void parsePing(); void parsePing();
void parseServerlist(Packet& packet);
void parseKick(); void parseKick();
void parsePlayersSpawned(Packet& packet); void parsePlayersSpawned(Packet& packet);
void parseEntityDeletion(Packet& packet); void parseEntityDeletion(Packet& packet);
void parsePlayerDamage(Packet& packet);
void parseComponentDeletion(Packet& packet); void parseComponentDeletion(Packet& packet);
void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType); void parseDoubleJump(Packet& packet);
void parseDashEffect(Packet& packet);
void parseAmmoPickup(Packet& packet);
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();
void hasServerTimedOut(); void hasServerTimedOut();
@@ -94,6 +118,7 @@ public:
void sendInputCommands(); void sendInputCommands();
void sendLocalPlayerTransform(); void sendLocalPlayerTransform();
void becomePlayer(); void becomePlayer();
void displayServerlist();
// Mapping Logic // Mapping Logic
// Returns if local EntityID exist in map // Returns if local EntityID exist in map
bool clientServerMapsHasEntity(EntityID clientEntityID); bool clientServerMapsHasEntity(EntityID clientEntityID);
@@ -109,10 +134,18 @@ public:
bool OnPlayerDamage(const Events::PlayerDamage& e); bool OnPlayerDamage(const Events::PlayerDamage& e);
EventRelay<Client, Events::PlayerSpawned> m_EPlayerSpawned; EventRelay<Client, Events::PlayerSpawned> m_EPlayerSpawned;
bool OnPlayerSpawned(const Events::PlayerSpawned& e); bool OnPlayerSpawned(const Events::PlayerSpawned& e);
void parsePlayerDamage(Packet& packet); EventRelay< Client, Events::SearchForServers> m_ESearchForServers;
private: EventRelay<Client, Events::DoubleJump> m_EDoubleJump;
UDPClient m_Unreliable; bool OnDoubleJump(Events::DoubleJump & e);
TCPClient m_Reliable; EventRelay<Client, Events::DashAbility> m_EDashAbility;
bool OnDashAbility(const Events::DashAbility& e);
bool OnSearchForServers(const Events::SearchForServers& e);
UDPClient m_ServerlistRequest;
std::vector<ServerInfo> m_Serverlist;
bool m_SearchingForServers = false;
std::clock_t m_StartSearchTime;
double m_SearchingTime = 2000; // Config I guess
}; };
#endif #endif
+19
View File
@@ -0,0 +1,19 @@
#ifndef Events_KillDeath_h__
#define Events_KillDeath_h__
#include "Core/EventBroker.h"
typedef unsigned int PlayerID;
namespace Events
{
struct KillDeath : public Event
{
PlayerID Casualty = -1;
PlayerID Killer = -1;
};
}
#endif
+17
View File
@@ -0,0 +1,17 @@
#ifndef Events_PlayerConnected
#define Events_PlayerConnected
#include "Core/EventBroker.h"
namespace Events
{
struct PlayerConnected : public Event
{
std::string PlayerName = "";
int PlayerID = -1;
};
}
#endif // !Events_PlayerConnected
@@ -0,0 +1,12 @@
#ifndef Events_SearchForServers_h__
#define Events_SearchForServers_h__
#include "Core/Event.h"
namespace Events
{
struct SearchForServers : public Event { };
}
#endif
-13
View File
@@ -1,13 +0,0 @@
#ifndef HybridClient_h__
#define HybridClient_h__
class HybridClient
{
public:
HybridClient();
~HybridClient();
private:
};
#endif
-12
View File
@@ -1,12 +0,0 @@
#ifndef HybridServer_h__
#define HybridServer_h__
class HybridServer
{
public:
HybridServer();
~HybridServer();
private:
};
#endif
+4
View File
@@ -19,6 +19,10 @@ enum class MessageType
EntityDeleted, EntityDeleted,
ComponentDeleted, ComponentDeleted,
PlayerTransform, PlayerTransform,
OnDoubleJump,
OnDashEffect,
ServerlistRequest,
AmmoPickup,
Invalid Invalid
}; };
+4 -1
View File
@@ -9,13 +9,16 @@ typedef unsigned int PacketID;
class NetworkClient class NetworkClient
{ {
public: public:
NetworkClient();
virtual ~NetworkClient();
virtual void Connect(std::string playerName, std::string address, int port) = 0; virtual void Connect(std::string playerName, std::string address, int port) = 0;
virtual void Disconnect() = 0; virtual void Disconnect() = 0;
virtual void Receive(Packet& packet) = 0; virtual void Receive(Packet& packet) = 0;
virtual void Send(Packet & packet) = 0; virtual void Send(Packet & packet) = 0;
virtual bool IsSocketAvailable() = 0; virtual bool IsSocketAvailable() = 0;
protected: protected:
char m_ReadBuffer[BUFFERSIZE] = { 0 }; char* m_ReadBuffer;
unsigned int m_BufferSize = BUFFERSIZE;
}; };
#endif #endif
+4 -1
View File
@@ -10,12 +10,15 @@ typedef unsigned int PacketID;
class NetworkServer class NetworkServer
{ {
public: public:
NetworkServer();
virtual ~NetworkServer();
virtual void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers) = 0; virtual void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers) = 0;
virtual void Receive(Packet & packet, PlayerDefinition & playerDefinition) = 0; virtual void Receive(Packet & packet, PlayerDefinition & playerDefinition) = 0;
virtual void Send(Packet & packet, PlayerDefinition & playerDefinition) = 0; virtual void Send(Packet & packet, PlayerDefinition & playerDefinition) = 0;
virtual void Send(Packet & packet) = 0; virtual void Send(Packet & packet) = 0;
protected: protected:
char m_ReadBuffer[BUFFERSIZE] = { 0 }; char* m_ReadBuffer;
unsigned int m_BufferSize = BUFFERSIZE;
}; };
#endif #endif
+3 -1
View File
@@ -24,7 +24,9 @@ public:
{ {
// Check if we are trying to add more than the package can fit. // Check if we are trying to add more than the package can fit.
if (m_MaxPacketSize < m_Offset + sizeof(T)) { if (m_MaxPacketSize < m_Offset + sizeof(T)) {
LOG_WARNING("Packet AddPrimitive(): You are trying to add more than we have allocated for! New size is %i bytes\n", m_MaxPacketSize*2); if (m_MaxPacketSize >= 32000) {
LOG_WARNING("Package::WritePrimitive(): New size is huge %i bytes\n", m_MaxPacketSize*2);
}
resizeData(); resizeData();
} }
memcpy(m_Data + m_Offset, &val, sizeof(T)); memcpy(m_Data + m_Offset, &val, sizeof(T));
+22 -7
View File
@@ -17,8 +17,13 @@
#include "Core/EPlayerDamage.h" #include "Core/EPlayerDamage.h"
#include "Network/EPlayerDisconnected.h" #include "Network/EPlayerDisconnected.h"
#include "Core/EPlayerSpawned.h" #include "Core/EPlayerSpawned.h"
#include "../Game/Events/EDoubleJump.h"
#include "Core/EEntityDeleted.h" #include "Core/EEntityDeleted.h"
#include "Core/EComponentDeleted.h" #include "Core/EComponentDeleted.h"
#include "Core/EAmmoPickup.h"
#include "Core/EPlayerDeath.h"
#include "Network/EPlayerConnected.h"
#include "Network/EKillDeath.h"
class Server : public Network class Server : public Network
{ {
@@ -31,7 +36,8 @@ public:
private: private:
// Network channels // Network channels
TCPServer m_Reliable; TCPServer m_Reliable;
UDPServer m_Unreliable; //UDPServer m_Unreliable;
UDPServer m_ServerlistRequest;
// dont forget to set these in the childrens receive logic // dont forget to set these in the childrens receive logic
boost::asio::ip::address m_Address; boost::asio::ip::address m_Address;
int m_Port = 27666; int m_Port = 27666;
@@ -54,7 +60,7 @@ private:
std::vector<Events::InputCommand> m_InputCommandsToBroadcast; std::vector<Events::InputCommand> m_InputCommandsToBroadcast;
//Timers //Timers
std::clock_t m_StartPingTime; std::clock_t m_StartPingTime;
// Packet loss logic // Packet loss logic
PacketID m_PacketID = 0; PacketID m_PacketID = 0;
PacketID m_PreviousPacketID = 0; PacketID m_PreviousPacketID = 0;
@@ -64,6 +70,7 @@ private:
void reliableBroadcast(Packet& packet); void reliableBroadcast(Packet& packet);
void unreliableBroadcast(Packet& packet); void unreliableBroadcast(Packet& packet);
void sendSnapshot(); void sendSnapshot();
void addPlayersToPacket(Packet& packet, EntityID entityID);
void addChildrenToPacket(Packet& packet, EntityID entityID); void addChildrenToPacket(Packet& packet, EntityID entityID);
void addInputCommandsToPacket(Packet& packet); void addInputCommandsToPacket(Packet& packet);
void sendPing(); void sendPing();
@@ -73,17 +80,21 @@ private:
void parseOnPlayerDamage(Packet& packet); void parseOnPlayerDamage(Packet& packet);
void identifyPacketLoss(); void identifyPacketLoss();
void kick(PlayerID player); void kick(PlayerID player);
PlayerID GetPlayerIDFromEndpoint(); PlayerID getPlayerIDFromEndpoint();
PlayerID getPlayerIDFromEntityID(EntityID entityID);
void parsePlayerTransform(Packet& packet); void parsePlayerTransform(Packet& packet);
void parseOnInputCommand(Packet& packet); void parseOnInputCommand(Packet& packet);
void parseClientPing(); void parseClientPing();
void parsePing(); void parsePing();
void parseUDPConnect(Packet & packet); bool parseDoubleJump(Packet& packet);
void parseTCPConnect(Packet & packet); void parseDashEffect(Packet& packet);
void parseUDPConnect(Packet& packet);
void parseTCPConnect(Packet& packet);
void parseDisconnect(); void parseDisconnect();
void parseServerlistRequest(boost::asio::ip::udp::endpoint endpoint);
bool shouldSendToClient(EntityWrapper childEntity); bool shouldSendToClient(EntityWrapper childEntity);
// Debug event // Events
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; EventRelay<Server, Events::PlayerSpawned> m_EPlayerSpawned;
@@ -94,6 +105,10 @@ private:
bool OnComponentDeleted(const Events::ComponentDeleted& e); bool OnComponentDeleted(const Events::ComponentDeleted& e);
EventRelay<Server, Events::PlayerDamage> m_EPlayerDamage; EventRelay<Server, Events::PlayerDamage> m_EPlayerDamage;
bool OnPlayerDamage(const Events::PlayerDamage& e); bool OnPlayerDamage(const Events::PlayerDamage& e);
EventRelay<Server, Events::AmmoPickup> m_EAmmoPickup;
bool OnAmmoPickup(const Events::AmmoPickup& e);
EventRelay<Server, Events::PlayerDeath> m_EPlayerDeath;
bool OnPlayerDeath(const Events::PlayerDeath& e);
}; };
#endif #endif
+1 -1
View File
@@ -20,7 +20,7 @@ private:
boost::asio::ip::tcp::endpoint m_Endpoint; boost::asio::ip::tcp::endpoint m_Endpoint;
boost::asio::io_service m_IOService; boost::asio::io_service m_IOService;
std::unique_ptr<boost::asio::ip::tcp::socket> m_Socket; std::unique_ptr<boost::asio::ip::tcp::socket> m_Socket;
size_t readBuffer(char* data); size_t readBuffer();
PacketID m_SendPacketID = 0; PacketID m_SendPacketID = 0;
bool m_IsConnected = false; bool m_IsConnected = false;
}; };
+10 -4
View File
@@ -16,16 +16,22 @@ public:
void Send(Packet & packet, PlayerDefinition & playerDefinition); void Send(Packet & packet, PlayerDefinition & playerDefinition);
void Send(Packet & packet); void Send(Packet & packet);
void Disconnect(); void Disconnect();
int Port() { return m_Port; }
std::string Address() { return m_Address; }
private: private:
// TCP logic // TCP logic
boost::asio::io_service m_IOService; boost::asio::io_service m_IOService;
std::unique_ptr<boost::asio::ip::tcp::acceptor> acceptor; std::unique_ptr<boost::asio::ip::tcp::acceptor> acceptor;
boost::shared_ptr<boost::asio::ip::tcp::socket> lastReceivedSocket; boost::shared_ptr<boost::asio::ip::tcp::socket> lastReceivedSocket;
void handle_accept(boost::shared_ptr<boost::asio::ip::tcp::socket> socket, int readBuffer(PlayerDefinition& playerDefinition);
int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers, PlayerID getPlayerIDFromEndpoint(const std::map<PlayerID, PlayerDefinition>& connectedPlayers,
const boost::system::error_code& error); boost::asio::ip::address address, unsigned short port);
int readBuffer(char* data, PlayerDefinition& playerDefinition); int GetPort();
std::string GetAddress();
int m_Port = 0;
std::string m_Address = "";
}; };
#endif #endif
+2 -1
View File
@@ -14,13 +14,14 @@ public:
void Disconnect(); void Disconnect();
void Receive(Packet& packet); void Receive(Packet& packet);
void Send(Packet & packet); void Send(Packet & packet);
void Broadcast(Packet& packet, int port);
bool IsSocketAvailable(); bool IsSocketAvailable();
private: private:
// Assio UDP logic // Assio UDP logic
boost::asio::io_service m_IOService; boost::asio::io_service m_IOService;
boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::asio::ip::udp::endpoint m_ReceiverEndpoint;
boost::shared_ptr<boost::asio::ip::udp::socket> m_Socket; boost::shared_ptr<boost::asio::ip::udp::socket> m_Socket;
int readBuffer(char* data); int readBuffer();
PacketID m_SendPacketID = 0; PacketID m_SendPacketID = 0;
}; };
+5 -2
View File
@@ -8,18 +8,21 @@ class UDPServer : public NetworkServer
{ {
public: public:
UDPServer(); UDPServer();
UDPServer(int port);
~UDPServer(); ~UDPServer();
void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers); void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers);
void Receive(Packet & packet, PlayerDefinition & playerDefinition); void Receive(Packet & packet, PlayerDefinition & playerDefinition);
void Send(Packet & packet, PlayerDefinition & playerDefinition); void Send(Packet & packet, PlayerDefinition & playerDefinition);
void Send(Packet & packet); void Send(Packet & packet);
void Send(Packet & packet, boost::asio::ip::udp::endpoint endpoint);
void Broadcast(Packet & packet, int port);
bool IsSocketAvailable(); bool IsSocketAvailable();
private: private:
// UDP logic // UDP logic
boost::asio::io_service m_IOService; boost::asio::io_service m_IOService;
boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::asio::ip::udp::endpoint m_ReceiverEndpoint;
std::unique_ptr<boost::asio::ip::udp::socket> m_Socket; std::unique_ptr<boost::asio::ip::udp::socket> m_Socket;
int readBuffer(char* data); int readBuffer();
}; };
#endif #endif
+18 -13
View File
@@ -3,27 +3,32 @@
#include "GLM.h" #include "GLM.h"
#include "Common.h" #include "../Common.h"
#include "Core/System.h" #include "../Core/System.h"
#include "Core/ResourceManager.h" #include "../Core/ResourceManager.h"
#include "Rendering/Model.h" #include "Rendering/Model.h"
#include "Rendering/EAnimationComplete.h"
#include "Rendering/Skeleton.h" #include "Rendering/Skeleton.h"
#include <imgui/imgui.h> #include "Rendering/BlendTree.h"
#include "Rendering/EAutoAnimationBlend.h"
#include "../Core/EntityWrapper.h"
#include "Rendering/AutoBlendQueue.h"
#include "../Input/EInputCommand.h"
#include "imgui/imgui.h"
class AnimationSystem : public PureSystem class AnimationSystem : public ImpureSystem
{ {
public: public:
AnimationSystem(SystemParams params) AnimationSystem(SystemParams params);
: System(params)
, PureSystem("Animation")
{
}
~AnimationSystem() { } ~AnimationSystem() { }
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& animationComponent, double dt) override; virtual void Update(double dt) override;
private: private:
void CreateBlendTrees();
void UpdateAnimations(double dt);
void UpdateWeights(double dt);
EventRelay<AnimationSystem, Events::AutoAnimationBlend> m_EAutoAnimationBlend;
bool OnAutoAnimationBlend(Events::AutoAnimationBlend& e);
std::unordered_map<EntityWrapper, AutoBlendQueue> m_AutoBlendQueues;
}; };
#endif #endif
+46
View File
@@ -0,0 +1,46 @@
#ifndef AutoBlendQueue_h__
#define AutoBlendQueue_h__
#include "../Core/ResourceManager.h"
#include "Skeleton.h"
#include "Model.h"
#include "BlendTree.h"
#include "../Core/EntityWrapper.h"
class AutoBlendQueue
{
public:
struct AutoBlendJob
{
EntityWrapper RootNode = EntityWrapper::Invalid;
double Duration;
double CurrentTime = 0.0;
double Delay = 0.0;
EntityWrapper AnimationEntity = EntityWrapper::Invalid;
BlendTree::AutoBlendInfo BlendInfo;
};
struct AutoblendNode
{
AutoBlendJob BlendJob;
double StartTime;
double EndTime;
};
AutoBlendQueue() { };
void Insert(AutoBlendJob autoBlendJob);
void UpdateTime(double dt);
void PrintQueue();
bool HasActiveBlendJob();
std::shared_ptr<BlendTree> GetBlendTree();
AutoBlendQueue::AutoBlendJob& GetActiveBlendJob();
private:
std::list<AutoblendNode> m_BlendQueue;
};
#endif
+101
View File
@@ -0,0 +1,101 @@
#ifndef BlendTree_h__
#define BlendTree_h__
#include "Common.h"
#include "../GLM.h"
#include "Skeleton.h"
#include "../Core/EntityWrapper.h"
#include "../Core/World.h"
#include <stack>
class BlendTree
{
public:
enum class NodeType
{
Additive,
Blend,
Override,
Animation,
};
struct Node
{
std::string Name;
EntityWrapper Entity;
Node* Parent = nullptr;
Node* Child[2] = { nullptr, nullptr };
NodeType Type;
std::map<int, Skeleton::PoseData> Pose;
bool SubTreeRoot = false;
double Weight = 0.0;
Node* Next() {
Node* next = this;
if (next->Child[1] == nullptr) {
// Node has no right child
next = this;
while (next->Parent != nullptr && next == next->Parent->Child[1]) {
next = next->Parent;
}
next = next->Parent;
} else {
// Find the leftmost node in the right subtree
next = next->Child[1];
while (next->Child[0] != nullptr) {
next = next->Child[0];
}
}
return next;
}
};
struct AutoBlendInfo
{
std::string NodeName;
double progress;
bool Start;
bool SingleBlend;
double Weight;
std::unordered_map<EntityWrapper, double> StartWeights;
};
BlendTree(EntityWrapper ModelEntity, Skeleton* skeleton);
~BlendTree();
std::vector<glm::mat4> GetFinalPose() { return m_FinalPose; }
glm::mat4 GetBoneTransform(int boneID);
bool IsValid() { return (m_Root == nullptr ? false : true); }
void PrintTree();
BlendTree::AutoBlendInfo AutoBlendStep(AutoBlendInfo blendInfo);
BlendTree::Node* GetCommonParent(std::string NodeName1, std::string NodeName2);
BlendTree::Node* FirstCommonParent(Node* node1, Node* node2);
EntityWrapper GetSubTreeRoot(std::string nodeName);
private:
Skeleton* m_Skeleton = nullptr;
Node* m_Root = nullptr;
std::vector<glm::mat4> m_FinalPose;
std::map<int, glm::mat4> m_FinalBoneTransforms;
std::vector<glm::mat4> AccumulateFinalPose();
BlendTree::Node* FillTreeByName(Node* parentNode, std::string name, EntityWrapper parentEntity);
std::vector<BlendTree::Node*> FindNodesByName(std::string name);
void Blend(std::map<int, Skeleton::PoseData>& pose);
};
#endif
@@ -8,6 +8,7 @@
#include "Core/ResourceManager.h" #include "Core/ResourceManager.h"
#include "Rendering/Model.h" #include "Rendering/Model.h"
#include "Rendering/Skeleton.h" #include "Rendering/Skeleton.h"
#include "Rendering/BlendTree.h"
//Needs to be a higher orderlevel than AnimationSystem //Needs to be a higher orderlevel than AnimationSystem
class BoneAttachmentSystem : public PureSystem class BoneAttachmentSystem : public PureSystem
+27
View File
@@ -0,0 +1,27 @@
#ifndef CubeMapPass_h__
#define CubeMapPass_h__
#include "IRenderer.h"
#include "ShaderProgram.h"
class CubeMapPass
{
public:
CubeMapPass(IRenderer* renderer);
~CubeMapPass() { }
void LoadTextures(std::string input);
void FillCubeMap(glm::vec3 originPosition);
void GenerateCubeMapTexture();
//GLuint CubeMapTexture() const { return m_CubeMapTexture; }
GLuint m_CubeMapTexture = -1;
private:
IRenderer* m_Renderer;
std::string m_PreviusCubeMapTexture;
std::vector<Texture*> m_CubeMapTextures;
};
#endif
+15 -8
View File
@@ -12,7 +12,7 @@
class DrawBloomPass class DrawBloomPass
{ {
public: public:
DrawBloomPass(IRenderer* renderer /* ,Texture or finalpass*/ ); DrawBloomPass(IRenderer* renderer, ConfigFile* config);
~DrawBloomPass() { } ~DrawBloomPass() { }
void InitializeTextures(); void InitializeTextures();
void InitializeFrameBuffers(); void InitializeFrameBuffers();
@@ -23,26 +23,33 @@ public:
void FillGaussianBuffer(FrameBuffer* fb); void FillGaussianBuffer(FrameBuffer* fb);
void Draw(GLuint texture); void Draw(GLuint texture);
void ChangeQuality(int quality);
void OnWindowResize(); void OnWindowResize();
//Getters //Getters
//Return the blurred result of the texture that was sent into draw //Return the blurred result of the texture that was sent into draw
GLuint GaussianTexture() const { return m_GaussianTexture_vert; } GLuint GaussianTexture() const {
if (m_Quality == 0) {
return m_BlackTexture->m_Texture;
} else {
return m_GaussianTexture_vert;
}
}
private: private:
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const; Texture* m_BlackTexture;
Texture* m_WhiteTexture;
Model* m_ScreenQuad; Model* m_ScreenQuad;
const IRenderer* m_Renderer; const IRenderer* m_Renderer;
ConfigFile* m_Config;
//const LightCullingPass* m_LightCullingPass //const LightCullingPass* m_LightCullingPass
GLuint m_iterations = 9; int m_Iterations;
int m_Quality = 0;
GLuint m_GaussianTexture_horiz; GLuint m_GaussianTexture_horiz = 0;
GLuint m_GaussianTexture_vert; GLuint m_GaussianTexture_vert = 0;
FrameBuffer m_GaussianFrameBuffer_horiz; FrameBuffer m_GaussianFrameBuffer_horiz;
FrameBuffer m_GaussianFrameBuffer_vert; FrameBuffer m_GaussianFrameBuffer_vert;
@@ -17,7 +17,7 @@ public:
void InitializeFrameBuffers(); void InitializeFrameBuffers();
void InitializeShaderPrograms(); void InitializeShaderPrograms();
void Draw(GLuint sceneTexture, GLuint bloomTexture, GLuint sceneTextureLowRes, GLuint bloomTextureLowRes, GLfloat gamma, GLfloat exposure); void Draw(GLuint sceneTexture, GLuint bloomTexture, GLfloat gamma, GLfloat exposure);
private: private:
const IRenderer* m_Renderer; const IRenderer* m_Renderer;
+27 -19
View File
@@ -4,6 +4,8 @@
#include "IRenderer.h" #include "IRenderer.h"
#include "DrawFinalPassState.h" #include "DrawFinalPassState.h"
#include "LightCullingPass.h" #include "LightCullingPass.h"
#include "CubeMapPass.h"
#include "SSAOPass.h"
#include "FrameBuffer.h" #include "FrameBuffer.h"
#include "ShaderProgram.h" #include "ShaderProgram.h"
#include "Util/UnorderedMapVec2.h" #include "Util/UnorderedMapVec2.h"
@@ -13,34 +15,28 @@
class DrawFinalPass class DrawFinalPass
{ {
public: public:
DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass); DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass);
~DrawFinalPass() { } ~DrawFinalPass() { }
void InitializeTextures(); void InitializeTextures();
void InitializeFrameBuffers(); void InitializeFrameBuffers();
void InitializeShaderPrograms(); void InitializeShaderPrograms();
void Draw(RenderScene& scene, GLuint SSAOTexture); void Draw(RenderScene& scene);
void ClearBuffer(); void ClearBuffer();
void OnWindowResize(); void OnWindowResize();
//Return the texture that is used in later stages to apply the bloom effect //Return the texture that is used in later stages to apply the bloom effect
GLuint BloomTexture() const { return m_BloomTexture; } GLuint BloomTexture() const { return m_BloomTexture; }
GLuint BloomTextureLowRes() const { return m_BloomTextureLowRes; }
//Return the texture with diffuse and lighting of the scene. //Return the texture with diffuse and lighting of the scene.
GLuint SceneTexture() const { return m_SceneTexture; } GLuint SceneTexture() const { return m_SceneTexture; }
GLuint SceneTextureLowRes() const { return m_SceneTextureLowRes; }
//Return the framebuffer used in the scene rendering stage. //Return the framebuffer used in the scene rendering stage.
FrameBuffer* FinalPassFrameBuffer() { return &m_FinalPassFrameBuffer; } FrameBuffer* FinalPassFrameBuffer() { return &m_FinalPassFrameBuffer; }
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 GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint format, GLenum type, GLint numMipMaps) const;
void DrawSprites(std::list<std::shared_ptr<RenderJob>>&jobs, RenderScene& scene); void DrawSprites(std::list<std::shared_ptr<RenderJob>>&jobs, RenderScene& scene);
void DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene, GLuint SSAOTexture); void DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene);
void DrawShieldToStencilBuffer(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene); void DrawModelRenderQueuesWithShieldCheck(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene);
void DrawShieldedModelRenderQueue(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 DrawToDepthStencilBuffer(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene);
void BindExplosionUniforms(GLuint shaderHandle, std::shared_ptr<ExplosionEffectJob>& job, 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 BindModelUniforms(GLuint shaderHandle, std::shared_ptr<ModelJob>& job, RenderScene& scene);
@@ -55,35 +51,47 @@ private:
Texture* m_ErrorTexture; Texture* m_ErrorTexture;
FrameBuffer m_FinalPassFrameBuffer; FrameBuffer m_FinalPassFrameBuffer;
FrameBuffer m_FinalPassFrameBufferLowRes; FrameBuffer m_ShieldDepthFrameBuffer;
GLuint m_BloomTexture; GLuint m_BloomTexture;
GLuint m_SceneTexture; GLuint m_SceneTexture;
GLuint m_BloomTextureLowRes;
GLuint m_SceneTextureLowRes;
GLuint m_DepthBuffer; GLuint m_DepthBuffer;
GLuint m_DepthBufferLowRes; GLuint m_ShieldBuffer;
GLuint m_CubeMapTexture;
//maqke this component based i guess? //maqke this component based i guess?
GLuint m_ShieldPixelRate = 16; GLuint m_ShieldPixelRate = 16;
const IRenderer* m_Renderer; const IRenderer* m_Renderer;
const LightCullingPass* m_LightCullingPass; const LightCullingPass* m_LightCullingPass;
const CubeMapPass* m_CubeMapPass;
const SSAOPass* m_SSAOPass;
ShaderProgram* m_ForwardPlusProgram; ShaderProgram* m_ForwardPlusProgram;
ShaderProgram* m_ExplosionEffectProgram; ShaderProgram* m_ExplosionEffectProgram;
ShaderProgram* m_ExplosionEffectSplatMapProgram; ShaderProgram* m_ExplosionEffectSplatMapProgram;
ShaderProgram* m_SpriteProgram; ShaderProgram* m_SpriteProgram;
ShaderProgram* m_ForwardPlusSplatMapProgram; ShaderProgram* m_ForwardPlusSplatMapProgram;
ShaderProgram* m_ShieldToStencilProgram; ShaderProgram* m_FillDepthStencilBufferProgram;
ShaderProgram* m_FillDepthBufferProgram;
ShaderProgram* m_ForwardPlusShieldCheckProgram;
ShaderProgram* m_ExplosionEffectShieldCheckProgram;
ShaderProgram* m_ExplosionEffectSplatMapShieldCheckProgram;
ShaderProgram* m_SpriteShieldCheckProgram;
ShaderProgram* m_ForwardPlusSplatMapShieldCheckProgram;
ShaderProgram* m_ForwardPlusSkinnedProgram; ShaderProgram* m_ForwardPlusSkinnedProgram;
ShaderProgram* m_ExplosionEffectSkinnedProgram; ShaderProgram* m_ExplosionEffectSkinnedProgram;
ShaderProgram* m_ExplosionEffectSplatMapSkinnedProgram; ShaderProgram* m_ExplosionEffectSplatMapSkinnedProgram;
ShaderProgram* m_ForwardPlusSplatMapSkinnedProgram; ShaderProgram* m_ForwardPlusSplatMapSkinnedProgram;
ShaderProgram* m_ShieldToStencilSkinnedProgram; ShaderProgram* m_FillDepthStencilBufferSkinnedProgram;
ShaderProgram* m_FillDepthBufferSkinnedProgram;
ShaderProgram* m_ForwardPlusSkinnedShieldCheckProgram;
ShaderProgram* m_ExplosionEffectSkinnedShieldCheckProgram;
ShaderProgram* m_ExplosionEffectSplatMapSkinnedShieldCheckProgram;
ShaderProgram* m_ForwardPlusSplatMapSkinnedShieldCheckProgram;
ShaderProgram* m_FillDepthBufferSkinnedShieldCheckProgram;
}; };
#endif #endif
@@ -0,0 +1,29 @@
#ifndef Events_AutoAnimationBlend_h__
#define Events_AutoAnimationBlend_h__
#include "../Core/EventBroker.h"
#include "../Core/EntityWrapper.h"
namespace Events
{
struct AutoAnimationBlend : Event
{
EntityWrapper RootNode = EntityWrapper::Invalid;
std::string NodeName;
double Duration = 0.0;
double Delay = 0.0;
bool Start = false;
bool Reverse = false;
bool Restart = false;
bool SingleLevelBlend = false;
double Weight = -1.0;
EntityWrapper AnimationEntity = EntityWrapper::Invalid;
};
}
#endif
+11 -11
View File
@@ -15,18 +15,18 @@
struct ExplosionEffectJob : ModelJob struct ExplosionEffectJob : ModelJob
{ {
ExplosionEffectJob(ComponentWrapper explosionEffectComponent, ::Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matGroup, ComponentWrapper modelComponent, ::World* world, glm::vec4 fillColor, float fillPercentage) ExplosionEffectJob(ComponentWrapper explosionEffectComponent, ::Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matGroup, ComponentWrapper modelComponent, ::World* world, glm::vec4 fillColor, float fillPercentage, bool isShielded)
: ModelJob(model, camera, matrix, matGroup, modelComponent, world, fillColor, fillPercentage) : ModelJob(model, camera, matrix, matGroup, modelComponent, world, fillColor, fillPercentage, isShielded)
{ {
ExplosionOrigin = (glm::vec3)explosionEffectComponent["ExplosionOrigin"]; ExplosionOrigin = (Field<glm::vec3>)explosionEffectComponent["ExplosionOrigin"];
TimeSinceDeath = (double)explosionEffectComponent["TimeSinceDeath"]; TimeSinceDeath = (Field<double>)explosionEffectComponent["TimeSinceDeath"];
ExplosionDuration = (double)explosionEffectComponent["ExplosionDuration"]; ExplosionDuration = (Field<double>)explosionEffectComponent["ExplosionDuration"];
EndColor = (glm::vec4)explosionEffectComponent["EndColor"]; EndColor = (Field<glm::vec4>)explosionEffectComponent["EndColor"];
Randomness = (bool)explosionEffectComponent["Randomness"]; Randomness = (Field<bool>)explosionEffectComponent["Randomness"];
RandomnessScalar = (double)explosionEffectComponent["RandomnessScalar"]; RandomnessScalar = (Field<double>)explosionEffectComponent["RandomnessScalar"];
Velocity = (glm::vec2)explosionEffectComponent["Velocity"]; Velocity = (Field<glm::vec2>)explosionEffectComponent["Velocity"];
ColorByDistance = (bool)explosionEffectComponent["ColorByDistance"]; ColorByDistance = (Field<bool>)explosionEffectComponent["ColorByDistance"];
ExponentialAccelaration = (bool)explosionEffectComponent["ExponentialAccelaration"]; ExponentialAccelaration = (Field<bool>)explosionEffectComponent["ExponentialAccelaration"];
}; };
glm::vec3 ExplosionOrigin; glm::vec3 ExplosionOrigin;
+2
View File
@@ -5,11 +5,13 @@
#include "../OpenGL.h" #include "../OpenGL.h"
#include "../GLM.h" #include "../GLM.h"
#include "../Core/Util/Rectangle.h" #include "../Core/Util/Rectangle.h"
#include "../Core/ConfigFile.h"
#include "Util/ScreenCoords.h" #include "Util/ScreenCoords.h"
#include "Camera.h" #include "Camera.h"
#include "RenderQueue.h" #include "RenderQueue.h"
#include "Model.h" #include "Model.h"
#include "../Core/World.h" //So temp #include "../Core/World.h" //So temp
#include "Util/CommonFunctions.h"
struct PickData struct PickData
+10 -30
View File
@@ -15,10 +15,11 @@
#include "../Core/Transform.h" #include "../Core/Transform.h"
#include "Skeleton.h" #include "Skeleton.h"
#include "ShaderProgram.h" #include "ShaderProgram.h"
#include "BlendTree.h"
struct ModelJob : RenderJob struct ModelJob : RenderJob
{ {
ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matProp, ComponentWrapper modelComponent, World* world, glm::vec4 fillColor, float fillPercentage) ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matProp, ComponentWrapper modelComponent, World* world, glm::vec4 fillColor, float fillPercentage, bool isShielded)
: RenderJob() : RenderJob()
{ {
Model = model; Model = model;
@@ -117,38 +118,20 @@ struct ModelJob : RenderJob
FillColor = fillColor; FillColor = fillColor;
FillPercentage = fillPercentage; FillPercentage = fillPercentage;
IsShielded = isShielded;
if (model->IsSkinned()) { if (model->IsSkinned()) {
Skeleton = Model->m_RawModel->m_Skeleton; Skeleton = Model->m_RawModel->m_Skeleton;
if (Skeleton != nullptr) { if (Skeleton != nullptr) {
if (world->HasComponent(Entity, "Animation")) {
auto animationComponent = world->GetComponent(Entity, "Animation"); EntityWrapper entityWrapper = EntityWrapper(world, modelComponent.EntityID);
for (int i = 1; i <= 3; i++) { if(Skeleton->BlendTrees.find(entityWrapper) != Skeleton->BlendTrees.end()) {
::Skeleton::AnimationData animationData; BlendTree = Skeleton->BlendTrees.at(entityWrapper);
animationData.animation = model->m_RawModel->m_Skeleton->GetAnimation(animationComponent["AnimationName" + std::to_string(i)]);
if (animationData.animation == nullptr) {
continue;
}
animationData.time = (double)animationComponent["Time" + std::to_string(i)];
animationData.weight = (double)animationComponent["Weight" + std::to_string(i)];
Animations.push_back(animationData);
}
}
if (world->HasComponent(Entity, "AnimationOffset")) {
auto animationOffsetComponent = world->GetComponent(Entity, "AnimationOffset");
AnimationOffset.animation = model->m_RawModel->m_Skeleton->GetAnimation(animationOffsetComponent["AnimationName"]);
AnimationOffset.time = (double)animationOffsetComponent["Time"];
} else {
AnimationOffset.animation = nullptr;
} }
} }
} }
}; };
unsigned int TextureID; unsigned int TextureID;
@@ -167,10 +150,7 @@ struct ModelJob : RenderJob
glm::vec4 Color; glm::vec4 Color;
const ::Model* Model = nullptr; const ::Model* Model = nullptr;
::Skeleton* Skeleton = nullptr; ::Skeleton* Skeleton = nullptr;
std::vector<::Skeleton::AnimationData> Animations; std::shared_ptr<::BlendTree> BlendTree = nullptr;
::Skeleton::AnimationOffset AnimationOffset;
float GlowIntensity = 8.0; float GlowIntensity = 8.0;
glm::vec4 DiffuseColor; glm::vec4 DiffuseColor;
glm::vec4 SpecularColor; glm::vec4 SpecularColor;
@@ -181,10 +161,10 @@ struct ModelJob : RenderJob
glm::vec4 FillColor = glm::vec4(0); glm::vec4 FillColor = glm::vec4(0);
float FillPercentage = 0.0; float FillPercentage = 0.0;
bool IsShielded;
void CalculateHash() override void CalculateHash() override
{ {
Hash = TextureID + ModelID << 10 + ShaderID << 20; Hash = ShaderID << 20 + ModelID << 10 + TextureID;
} }
}; };
+1 -3
View File
@@ -28,15 +28,13 @@ public:
const ShaderProgram& PickingProgram() const { return *m_PickingProgram; } const ShaderProgram& PickingProgram() const { return *m_PickingProgram; }
//const std::unordered_map<glm::ivec2, EntityID>& PickingColorsToEntity() const { return m_PickingColorsToEntity; } //const std::unordered_map<glm::ivec2, EntityID>& PickingColorsToEntity() const { return m_PickingColorsToEntity; }
GLuint PickingTexture() const { return m_PickingTexture; } GLuint PickingTexture() const { return m_PickingTexture; }
GLuint DepthBuffer() const { return m_DepthBuffer; } GLuint* DepthBuffer() { return &m_DepthBuffer; }
const FrameBuffer& PickingBuffer() const { return m_PickingBuffer; } const FrameBuffer& PickingBuffer() const { return m_PickingBuffer; }
PickData Pick(glm::vec2 screenCoord); PickData Pick(glm::vec2 screenCoord);
private: private:
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
EventBroker* m_EventBroker; EventBroker* m_EventBroker;
const IRenderer* m_Renderer; const IRenderer* m_Renderer;
-2
View File
@@ -24,7 +24,6 @@ struct RenderScene
std::list<std::shared_ptr<RenderJob>> OpaqueObjects; std::list<std::shared_ptr<RenderJob>> OpaqueObjects;
std::list<std::shared_ptr<RenderJob>> TransparentObjects; std::list<std::shared_ptr<RenderJob>> TransparentObjects;
std::list<std::shared_ptr<RenderJob>> OpaqueShieldedObjects; 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>> ShieldObjects;
std::list<std::shared_ptr<RenderJob>> SpriteJob; std::list<std::shared_ptr<RenderJob>> SpriteJob;
std::list<std::shared_ptr<RenderJob>> PointLight; std::list<std::shared_ptr<RenderJob>> PointLight;
@@ -41,7 +40,6 @@ struct RenderScene
Jobs.OpaqueObjects.clear(); Jobs.OpaqueObjects.clear();
Jobs.TransparentObjects.clear(); Jobs.TransparentObjects.clear();
Jobs.OpaqueShieldedObjects.clear(); Jobs.OpaqueShieldedObjects.clear();
Jobs.TransparentShieldedObjects.clear();
Jobs.ShieldObjects.clear(); Jobs.ShieldObjects.clear();
Jobs.SpriteJob.clear(); Jobs.SpriteJob.clear();
Jobs.DirectionalLight.clear(); Jobs.DirectionalLight.clear();
+2
View File
@@ -24,6 +24,8 @@ public:
bool StencilFunc(GLenum func, GLint ref, GLuint mask); bool StencilFunc(GLenum func, GLint ref, GLuint mask);
bool StencilMask(GLuint mask); bool StencilMask(GLuint mask);
bool DepthMask(GLboolean flag); bool DepthMask(GLboolean flag);
bool DepthFunc(GLenum func);
bool AlphaFunc(GLenum func, GLclampf thresholder);
private: private:
std::vector<std::function<void(void)>> m_ResetFunctions; std::vector<std::function<void(void)>> m_ResetFunctions;
+9 -8
View File
@@ -17,6 +17,7 @@
#include "DrawBloomPass.h" #include "DrawBloomPass.h"
#include "DrawColorCorrectionPass.h" #include "DrawColorCorrectionPass.h"
#include "SSAOPass.h" #include "SSAOPass.h"
#include "CubeMapPass.h"
#include "../Core/EventBroker.h" #include "../Core/EventBroker.h"
#include "ImGuiRenderPass.h" #include "ImGuiRenderPass.h"
#include "Camera.h" #include "Camera.h"
@@ -31,8 +32,9 @@ class Renderer : public IRenderer
static void glfwFrameBufferCallback(GLFWwindow* window, int width, int height); static void glfwFrameBufferCallback(GLFWwindow* window, int width, int height);
public: public:
Renderer(EventBroker* eventBroker) Renderer(EventBroker* eventBroker, ConfigFile* config)
: m_EventBroker(eventBroker) : m_EventBroker(eventBroker)
, m_Config(config)
{ } { }
virtual void Initialize() override; virtual void Initialize() override;
@@ -46,6 +48,7 @@ private:
//----------------------Variables----------------------// //----------------------Variables----------------------//
static std::unordered_map <GLFWwindow*, Renderer*> m_WindowToRenderer; static std::unordered_map <GLFWwindow*, Renderer*> m_WindowToRenderer;
ConfigFile* m_Config;
EventBroker* m_EventBroker; EventBroker* m_EventBroker;
TextPass* m_TextPass; TextPass* m_TextPass;
@@ -58,13 +61,10 @@ private:
Model* m_UnitSphere; Model* m_UnitSphere;
int m_DebugTextureToDraw = 0; int m_DebugTextureToDraw = 0;
int m_CubeMapTexture = 0;
bool m_ResizeWindow = false; bool m_ResizeWindow = false;
float m_SSAO_Radius = 1.0f; int m_SSAO_Quality = 0;
float m_SSAO_Bias = 0.05f; int m_GLOW_Quality = 2;
float m_SSAO_Contrast = 1.5f;
float m_SSAO_IntensityScale = 1.0f;
int m_SSAO_NumOfSamples = 24;
int m_SSAO_NumOfTurns = 7;
PickingPass* m_PickingPass; PickingPass* m_PickingPass;
LightCullingPass* m_LightCullingPass; LightCullingPass* m_LightCullingPass;
@@ -74,6 +74,7 @@ private:
DrawBloomPass* m_DrawBloomPass; DrawBloomPass* m_DrawBloomPass;
DrawColorCorrectionPass* m_DrawColorCorrectionPass; DrawColorCorrectionPass* m_DrawColorCorrectionPass;
SSAOPass* m_SSAOPass; SSAOPass* m_SSAOPass;
CubeMapPass* m_CubeMapPass;
//----------------------Functions----------------------// //----------------------Functions----------------------//
void InitializeWindow(); void InitializeWindow();
+36 -12
View File
@@ -13,18 +13,32 @@
class SSAOPass class SSAOPass
{ {
public: public:
SSAOPass(IRenderer* rendere); SSAOPass(IRenderer* renderer, ConfigFile* config);
~SSAOPass() { ~SSAOPass() { };
delete m_DrawBloomPass;
}; void ChangeQuality(int quality);
void Draw(GLuint depthBuffer, Camera* camera); void Draw(GLuint depthBuffer, Camera* camera);
void Setting(float radius, float bias, float contrast, float intensityScale, int numOfSamples, int NumOfTurns); void Setting(float radius, float bias, float contrast, float intensityScale, int numOfSamples, int numOfTurns, int iterations, int quality);
void ClearBuffer(); void ClearBuffer();
void OnWindowResize(); void OnWindowResize();
//Return the SSAO of the texture sent to Draw //Return the SSAO of the texture sent to Draw
GLuint SSAOTexture() const { return m_DrawBloomPass->GaussianTexture(); } GLuint SSAOTexture() const {
if (m_Quality == 0) {
return m_WhiteTexture->m_Texture;
} else {
return m_Gaussian_vert;
}
}
int TextureQuality() const {
if (m_Quality == 0) {
return 13;
} else {
return m_TextureQuality;
}
}
private: private:
void InitializeTexture(); void InitializeTexture();
@@ -32,14 +46,13 @@ private:
void InitializeShaderProgram(); void InitializeShaderProgram();
void InitializeBuffer(); void InitializeBuffer();
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
//void blurHorizontal(GLuint depthBuffer); //void blurHorizontal(GLuint depthBuffer);
//void blurVertical(GLuint depthBuffer); //void blurVertical(GLuint depthBuffer);
Model* m_ScreenQuad; Model* m_ScreenQuad;
const IRenderer* m_Renderer; const IRenderer* m_Renderer;
ConfigFile* m_Config;
float m_Radius; float m_Radius;
float m_Bias; float m_Bias;
@@ -47,17 +60,28 @@ private:
float m_IntensityScale; float m_IntensityScale;
int m_NumOfSamples; int m_NumOfSamples;
int m_NumOfTurns; int m_NumOfTurns;
int m_Iterations;
int m_TextureQuality;
int m_Quality = 0;
GLuint m_SSAOTexture; Texture* m_WhiteTexture;
GLuint m_SSAOTexture = 0;
FrameBuffer m_SSAOFramBuffer; FrameBuffer m_SSAOFramBuffer;
GLuint m_SSAOViewSpaceZTexture; GLuint m_SSAOViewSpaceZTexture = 0;
FrameBuffer m_SSAOViewSpaceZFramBuffer; FrameBuffer m_SSAOViewSpaceZFramBuffer;
GLuint m_Gaussian_horiz = 0;
GLuint m_Gaussian_vert = 0;
FrameBuffer m_GaussianFrameBuffer_horiz;
FrameBuffer m_GaussianFrameBuffer_vert;
ShaderProgram* m_SSAOProgram; ShaderProgram* m_SSAOProgram;
ShaderProgram* m_SSAOViewSpaceZProgram; ShaderProgram* m_SSAOViewSpaceZProgram;
ShaderProgram* m_GaussianProgram_horiz;
DrawBloomPass* m_DrawBloomPass; ShaderProgram* m_GaussianProgram_vert;
}; };
#endif #endif
+22 -55
View File
@@ -6,27 +6,9 @@
#include "../GLM.h" #include "../GLM.h"
#include <glm/gtx/matrix_decompose.hpp> #include <glm/gtx/matrix_decompose.hpp>
#include <imgui/imgui.h> #include <imgui/imgui.h>
#include "../Core/EntityWrapper.h"
//struct Bone class BlendTree;
//{
// Bone(std::string name, glm::mat4 offsetMatrix)
// : Name(name)
// , OffsetMatrix(offsetMatrix)
// { }
//
// ~Bone()
// {
// for (auto kv : Children) {
// delete kv.second;
// }
// }
//
// std::string Name;
// glm::mat4 OffsetMatrix;
// glm::mat4 LocalMatrix;
//
// std::map<std::string, Bone*> Children;
//};
class Skeleton class Skeleton
{ {
@@ -68,58 +50,43 @@ public:
std::map<int, std::vector<Keyframe>> JointAnimations; std::map<int, std::vector<Keyframe>> JointAnimations;
}; };
struct AnimationData struct PoseData {
{ glm::vec3 Translation;
const Animation* animation; glm::quat Orientation;
float time; glm::vec3 Scale;
float weight;
};
struct JointFrameTransform {
glm::vec3 PositionInterp = glm::vec3(0);
glm::quat RotationInterp = glm::quat();
glm::vec3 ScaleInterp = glm::vec3(0);
float Weight;
};
struct AnimationOffset {
const Animation* animation;
float time;
}; };
Skeleton() { } Skeleton() { }
~Skeleton(); ~Skeleton();
Bone* RootBone; Bone* RootBone;
std::map<int, Bone*> Bones; std::map<int, Bone*> Bones;
std::unordered_map<EntityWrapper, std::shared_ptr<BlendTree>> BlendTrees;
// Attach a new bone to the skeleton // Attach a new bone to the skeleton
// Returns: New bone index // Returns: New bone index
int CreateBone(int ID, int parentID, std::string name, glm::mat4 offsetMatrix); int CreateBone(int ID, int parentID, std::string name, glm::mat4 offsetMatrix);
int GetBoneID(std::string name); int GetBoneID(std::string name);
std::vector<glm::mat4> GetFrameBones(std::vector<AnimationData> animations, AnimationOffset animationOffset, bool noRootMotion = false);
std::vector<glm::mat4> GetFrameBones(std::vector<AnimationData> animations, bool noRootMotion = false);
const Animation* GetAnimation(std::string name); const Animation* GetAnimation(std::string name);
void AccumulateBoneTransforms(bool noRootMotion, std::vector<AnimationData> animations, std::map<int, glm::mat4>& frameBones, const Bone* bone, glm::mat4 parentMatrix); std::map<int, Skeleton::PoseData> GetFrameBones(const Animation* animation, double time, bool additive, bool noRootMotion = false);
void AccumulateBoneTransforms(bool noRootMotion, std::vector<AnimationData> animations, AnimationOffset animationOffset, std::map<int, glm::mat4>& frameBones, const Bone* bone, glm::mat4 parentMatrix);
std::map<int, Skeleton::PoseData> BlendPoses(const std::map<int, PoseData>& pose1, const std::map<int, PoseData>& pose2, double weight);
std::map<int, Skeleton::PoseData> OverridePose(const std::map<int, PoseData>& overridePose, const std::map<int, PoseData>& targetPose);
std::map<int, Skeleton::PoseData> BlendPoseAdditive(const std::map<int, PoseData>& additivePose, const std::map<int, PoseData>& targetPose);
void GetFinalPose(std::map<int, Skeleton::PoseData>& boneMatrices, std::vector<glm::mat4>& finalPose, std::map<int, glm::mat4>& boneTransforms);
std::vector<glm::mat4> GetTPose();
void PrintSkeleton();
void PrintSkeleton(const Bone* parent, int depthCount);
std::map<std::string, Animation> Animations;
glm::mat4 GetBoneTransform(const Bone* bone, const Animation* animation, float time, glm::mat4 childMatrix);
glm::mat4 GetBoneTransform(bool noRootMotion, const Bone* bone, std::vector<AnimationData> animations, AnimationOffset animationOffset, glm::mat4 childMatrix);
glm::mat4 GetBoneTransform(bool noRootMotion, const Bone* bone, std::vector<AnimationData> animations, glm::mat4 childMatrix);
int GetKeyframe(const Animation& animation, double time);
std::map<std::string, Animation> Animations;
private: private:
Skeleton::PoseData GetAdditiveBonePose(const Bone* bone, const Animation* animation, double time);
glm::mat4 GetOffsetTransform(const Bone* bone, AnimationOffset animationOffset);
void AccumulateFinalPose(std::map<int, glm::mat4>& boneMatrices, std::map<int, Skeleton::PoseData>& poseDatas, std::map<int, glm::mat4>& boneTransforms, const Bone* bone, glm::mat4 parentMatrix);
void AdditiveBoneTransforms(const Animation* animation, double time, std::map<int, PoseData>& boneMatrices, const Bone* bone);
void AccumulateBoneTransforms(bool noRootMotion, const Animation* animation, double time, std::map<int, PoseData>& boneMatrices, const Bone* bone);
std::map<std::string, Bone*> m_BonesByName; std::map<std::string, Bone*> m_BonesByName;
+6 -3
View File
@@ -17,7 +17,7 @@
struct SpriteJob : RenderJob struct SpriteJob : RenderJob
{ {
SpriteJob(ComponentWrapper cSprite, Camera* camera, glm::mat4 matrix, World* world, glm::vec4 fillColor, float fillPercentage, bool depthSorted) SpriteJob(ComponentWrapper cSprite, Camera* camera, glm::mat4 matrix, World* world, glm::vec4 fillColor, float fillPercentage, bool depthSorted, bool isIndicator)
: RenderJob() : RenderJob()
{ {
Model = ResourceManager::Load<::Model>("Models/Core/UnitQuad.mesh"); Model = ResourceManager::Load<::Model>("Models/Core/UnitQuad.mesh");
@@ -30,7 +30,7 @@ struct SpriteJob : RenderJob
StartIndex = matProp.material->StartIndex; StartIndex = matProp.material->StartIndex;
EndIndex = matProp.material->EndIndex; EndIndex = matProp.material->EndIndex;
Matrix = matrix; Matrix = matrix;
Color = cSprite["Color"]; Color = cSprite["Color"];
Entity = cSprite.EntityID; Entity = cSprite.EntityID;
Position = Transform::AbsolutePosition(world, cSprite.EntityID); Position = Transform::AbsolutePosition(world, cSprite.EntityID);
@@ -41,7 +41,8 @@ struct SpriteJob : RenderJob
} }
World = world; World = world;
Pickable = world->HasComponent(cSprite.EntityID, "Button"); Pickable = world->HasComponent(cSprite.EntityID, "Button");
IsIndicator = isIndicator;
FillColor = fillColor; FillColor = fillColor;
FillPercentage = fillPercentage; FillPercentage = fillPercentage;
}; };
@@ -61,7 +62,9 @@ struct SpriteJob : RenderJob
unsigned int StartIndex = 0; unsigned int StartIndex = 0;
unsigned int EndIndex = 0; unsigned int EndIndex = 0;
World* World; World* World;
bool Pickable; bool Pickable;
bool IsIndicator = false;
glm::vec4 FillColor = glm::vec4(0); glm::vec4 FillColor = glm::vec4(0);
float FillPercentage = 0.0; float FillPercentage = 0.0;
+2 -2
View File
@@ -17,8 +17,8 @@ struct TextJob : RenderJob
: RenderJob() : RenderJob()
{ {
Matrix = matrix; Matrix = matrix;
Color = (glm::vec4)textComponent["Color"]; Color = (const glm::vec4&)textComponent["Color"];
Content = (std::string)textComponent["Content"]; Content = (const std::string&)textComponent["Content"];
Resource = font; Resource = font;
if ((int)textComponent["Alignment"] == textComponent["Alignment"].Enum("Left")) { if ((int)textComponent["Alignment"] == textComponent["Alignment"].Enum("Left")) {
+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;
unsigned char* Data = nullptr;
}; };
@@ -9,6 +9,10 @@
namespace CommonFunctions namespace CommonFunctions
{ {
Texture* LoadTexture(std::string path, bool threaded); Texture* LoadTexture(std::string path, bool threaded);
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
void GenerateMultiSampleTexture(GLuint* texture, int numSamples, glm::vec2 dimensions, GLint internalFormat);
void GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint format, GLenum type, GLint numMipMaps);
void DeleteTexture(GLuint* texture);
}; };
#endif #endif
+5 -1
View File
@@ -2,11 +2,15 @@
#define Events_DashAbility_h__ #define Events_DashAbility_h__
#include "Core/Event.h" #include "Core/Event.h"
#include "Core/EntityWrapper.h"
namespace Events namespace Events
{ {
struct DashAbility : public Event { }; struct DashAbility : public Event
{
EntityID Player;
};
} }
+1 -1
View File
@@ -8,7 +8,7 @@ namespace Events
struct DoubleJump : public Event struct DoubleJump : public Event
{ {
EntityID entityID;
}; };
} }
+3 -3
View File
@@ -13,13 +13,13 @@
#include "Input/KeyboardInputHandler.h" #include "Input/KeyboardInputHandler.h"
#include "Input/MouseInputHandler.h" #include "Input/MouseInputHandler.h"
#include "Core/EKeyDown.h" #include "Core/EKeyDown.h"
#include "Core/EntityFilePreprocessor.h" #include "Core/EntityXMLFilePreprocessor.h"
#include "Core/SystemPipeline.h" #include "Core/SystemPipeline.h"
#include "Systems/ExplosionEffectSystem.h" #include "Systems/ExplosionEffectSystem.h"
#include "Editor/EditorSystem.h" #include "Editor/EditorSystem.h"
#include "Core/EntityFile.h" #include "Core/EntityXMLFile.h"
#include "Rendering/RenderSystem.h" #include "Rendering/RenderSystem.h"
#include "Core/EntityFileParser.h" #include "Core/EntityXMLFileParser.h"
#include "Core/Octree.h" #include "Core/Octree.h"
#include "Rendering/Font.h" #include "Rendering/Font.h"
#include "Systems/InterpolationSystem.h" #include "Systems/InterpolationSystem.h"
@@ -0,0 +1,18 @@
#ifndef AbilityCooldownHUDSystem_h__
#define AbilityCooldownHUDSystem_h__
#include "../../Engine/Core/System.h"
#include "../../Engine/GLM.h"
class AbilityCooldownHUDSystem : public ImpureSystem
{
public:
AbilityCooldownHUDSystem(SystemParams params)
: System(params)
{ }
virtual void Update(double dt) override;
private:
};
#endif
+13 -1
View File
@@ -4,7 +4,7 @@
#include "Core/System.h" #include "Core/System.h"
#include "Core/Transform.h" #include "Core/Transform.h"
#include "Core/ResourceManager.h" #include "Core/ResourceManager.h"
#include "Core/EntityFileParser.h" #include "Core/EntityFile.h"
#include "Core/EPickupSpawned.h" #include "Core/EPickupSpawned.h"
#include "Core/EAmmoPickup.h" #include "Core/EAmmoPickup.h"
#include "Engine/Collision/ETrigger.h" #include "Engine/Collision/ETrigger.h"
@@ -20,13 +20,25 @@ public:
private: private:
EventRelay<AmmoPickupSystem, Events::TriggerTouch> m_ETriggerTouch; EventRelay<AmmoPickupSystem, Events::TriggerTouch> m_ETriggerTouch;
bool OnTriggerTouch(Events::TriggerTouch& e); bool OnTriggerTouch(Events::TriggerTouch& e);
EventRelay<AmmoPickupSystem, Events::TriggerLeave> m_ETriggerLeave;
bool OnTriggerLeave(Events::TriggerLeave& e);
EventRelay<AmmoPickupSystem, Events::AmmoPickup> m_EAmmoPickup;
bool OnAmmoPickup(Events::AmmoPickup& e);
struct NewAmmoPickup { struct NewAmmoPickup {
glm::vec3 Pos; glm::vec3 Pos;
double AmmoGain; double AmmoGain;
double RespawnTimer; double RespawnTimer;
double DecreaseThisRespawnTimer; double DecreaseThisRespawnTimer;
EntityID parentID;
}; };
std::vector<NewAmmoPickup> m_ETriggerTouchVector; std::vector<NewAmmoPickup> m_ETriggerTouchVector;
struct EntityAtMaxValuePickupStruct {
EntityWrapper player;
EntityWrapper trigger;
};
std::vector<EntityAtMaxValuePickupStruct> m_PickupAtMaximum;
void DoPickup(EntityWrapper &player, EntityWrapper &trigger);
}; };
#endif #endif
@@ -1,17 +0,0 @@
#ifndef AmmunitionHUDSystem_h__
#define AmmunitionHUDSystem_h__
#include "../../Engine/Core/System.h"
#include "../../Engine/GLM.h"
class AmmunitionHUDSystem : public ImpureSystem
{
public:
AmmunitionHUDSystem(SystemParams params)
: System(params)
{ }
virtual void Update(double dt) override;
};
#endif
@@ -0,0 +1,19 @@
#ifndef BoostIconsHUDSystem_h__
#define BoostIconsHUDSystem_h__
#include "../../Engine/Core/System.h"
#include "../../Engine/GLM.h"
class BoostIconsHUDSystem : public PureSystem
{
public:
BoostIconsHUDSystem(SystemParams params)
: System(params)
, PureSystem("BoostIconsHUD")
{ }
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& capturePoint, double dt) override;
};
#endif
+21
View File
@@ -0,0 +1,21 @@
#ifndef BoostSystem_h__
#define BoostSystem_h__
#include "Core/System.h"
#include "Core/ResourceManager.h"
#include "Core/EntityFile.h"
#include "Core/EPlayerDamage.h"
#include "Common.h"
class BoostSystem : public System
{
public:
BoostSystem(SystemParams params);
private:
EventRelay<BoostSystem, Events::PlayerDamage> m_EPlayerDamage;
bool OnPlayerDamage(Events::PlayerDamage& e);
std::string DetermineClass(EntityWrapper player);
};
#endif
@@ -0,0 +1,30 @@
#ifndef CapturePointArrowHUDSystem_h__
#define CapturePointArrowHUDSystem_h__
#include <GLFW/glfw3.h>
#include <glm/common.hpp>
#include <glm/gtx/vector_angle.hpp>
#include "Common.h"
#include "Core/System.h"
#include "Core/Transform.h"
#include "Core/ECaptured.h"
class CapturePointArrowHUDSystem : public ImpureSystem
{
public:
CapturePointArrowHUDSystem(SystemParams params);
virtual void Update(double dt) override;
private:
EventRelay<CapturePointArrowHUDSystem, Events::Captured> m_ECapturedEvent;
bool OnCapturePointCaptured(Events::Captured& e);
bool m_InitialtargetsSet = false;
glm::vec3 m_RedTeamCurrentTarget;
glm::vec3 m_BlueTeamCurrentTarget;
};
#endif
+1 -1
View File
@@ -7,7 +7,7 @@
#include "Common.h" #include "Common.h"
#include "Core/System.h" #include "Core/System.h"
#include "Engine/Collision/ETrigger.h" #include "Collision/ETrigger.h"
class CapturePointHUDSystem : public ImpureSystem class CapturePointHUDSystem : public ImpureSystem
{ {
+2 -2
View File
@@ -42,9 +42,9 @@ private:
int m_NumberOfCapturePoints = 0; int m_NumberOfCapturePoints = 0;
std::map<int, EntityWrapper> m_CapturePointNumberToEntityMap; std::map<int, EntityWrapper> m_CapturePointNumberToEntityMap;
//std::vector<ComponentWrapper>
bool m_ResetTimers = false; bool m_ResetTimers = false;
bool m_RecentlyCapturedNeedNextCapturePointNow = false;
Events::Captured m_CapturedEvent;
//vectors which will keep track of enter/leave changes //vectors which will keep track of enter/leave changes
std::vector<std::tuple<EntityWrapper, EntityWrapper>> m_ETriggerTouchVector; std::vector<std::tuple<EntityWrapper, EntityWrapper>> m_ETriggerTouchVector;
+18 -2
View File
@@ -4,7 +4,7 @@
#include "Core/System.h" #include "Core/System.h"
#include "Core/Transform.h" #include "Core/Transform.h"
#include "Core/ResourceManager.h" #include "Core/ResourceManager.h"
#include "Core/EntityFileParser.h" #include "Core/EntityFile.h"
#include "Core/EPlayerDamage.h" #include "Core/EPlayerDamage.h"
#include "Common.h" #include "Common.h"
#include <tuple> #include <tuple>
@@ -14,11 +14,13 @@
#include <glm/gtx/vector_angle.hpp> #include <glm/gtx/vector_angle.hpp>
#include "Rendering/Util/CommonFunctions.h" #include "Rendering/Util/CommonFunctions.h"
//#define INDICATOR_TEST
class DamageIndicatorSystem : public System class DamageIndicatorSystem : public ImpureSystem
{ {
public: public:
DamageIndicatorSystem(SystemParams params); DamageIndicatorSystem(SystemParams params);
virtual void Update(double dt) override;
private: private:
EventRelay<DamageIndicatorSystem, Events::PlayerDamage> m_EPlayerDamage; EventRelay<DamageIndicatorSystem, Events::PlayerDamage> m_EPlayerDamage;
@@ -28,6 +30,20 @@ private:
bool OnSetCamera(const Events::SetCamera& e); bool OnSetCamera(const Events::SetCamera& e);
EntityID m_CurrentCamera = -1; EntityID m_CurrentCamera = -1;
struct DamageIndicatorStruct {
EntityWrapper spriteEntity;
glm::vec3 enemyPosition;
DamageIndicatorStruct(EntityWrapper sprite, glm::vec3 pos)
: spriteEntity(sprite)
, enemyPosition(pos) {}
};
std::vector<DamageIndicatorStruct> updateDamageIndicatorVector;
float CalculateAngle(EntityWrapper player, glm::vec3 enemyPos);
//for tests
#ifdef INDICATOR_TEST
glm::vec3 DamageIndicatorTest(EntityWrapper player);
int m_TestVar = 0;
#endif
}; };
#endif #endif
@@ -0,0 +1,19 @@
#include "Common.h"
#include "Core/System.h"
class FloatingEffectSystem : public PureSystem
{
public:
FloatingEffectSystem(SystemParams params)
: System(params)
, PureSystem("FloatingEffect")
{ }
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override
{
ComponentWrapper& transform = m_World->GetComponent(component.EntityID, "Transform");
(Field<double>)component["Time"] += dt;
(Field<glm::vec3>)transform["Position"] = (float)(double)component["Amplitude"] * glm::sin((glm::two_pi<float>() / (float)(double)component["Period"]) * (float)(double)component["Time"]) * (glm::vec3)component["Axis"];
}
};
+1 -1
View File
@@ -10,7 +10,7 @@ public:
: System(params) : System(params)
, PureSystem("Lifetime") , PureSystem("Lifetime")
{ {
LOG_INFO("ASDASDASSA");
} }
virtual void Update(double dt) override; virtual void Update(double dt) override;
+10 -2
View File
@@ -4,12 +4,11 @@
#include "Core/System.h" #include "Core/System.h"
#include "Core/Transform.h" #include "Core/Transform.h"
#include "Core/ResourceManager.h" #include "Core/ResourceManager.h"
#include "Core/EntityFileParser.h" #include "Core/EntityFile.h"
#include "Core/EPickupSpawned.h" #include "Core/EPickupSpawned.h"
#include "Core/EPlayerHealthPickup.h" #include "Core/EPlayerHealthPickup.h"
#include "Engine/Collision/ETrigger.h" #include "Engine/Collision/ETrigger.h"
#include "Common.h" #include "Common.h"
#include <tuple>
class PickupSpawnSystem : public ImpureSystem class PickupSpawnSystem : public ImpureSystem
{ {
@@ -21,13 +20,22 @@ public:
private: private:
EventRelay<PickupSpawnSystem, Events::TriggerTouch> m_ETriggerTouch; EventRelay<PickupSpawnSystem, Events::TriggerTouch> m_ETriggerTouch;
bool OnTriggerTouch(Events::TriggerTouch& e); bool OnTriggerTouch(Events::TriggerTouch& e);
EventRelay<PickupSpawnSystem, Events::TriggerLeave> m_ETriggerLeave;
bool OnTriggerLeave(Events::TriggerLeave& e);
struct NewHealthPickup { struct NewHealthPickup {
glm::vec3 Pos; glm::vec3 Pos;
double HealthGain; double HealthGain;
double RespawnTimer; double RespawnTimer;
double DecreaseThisRespawnTimer; double DecreaseThisRespawnTimer;
EntityID parentID;
}; };
std::vector<NewHealthPickup> m_ETriggerTouchVector; std::vector<NewHealthPickup> m_ETriggerTouchVector;
struct EntityAtMaxValuePickupStruct {
EntityWrapper player;
EntityWrapper trigger;
};
std::vector<EntityAtMaxValuePickupStruct> m_PickupAtMaximum;
void DoPickup(EntityWrapper &player, EntityWrapper &trigger);
}; };
#endif #endif
+5 -3
View File
@@ -6,11 +6,9 @@
#include "GLM.h" #include "GLM.h"
#include "Rendering/ESetCamera.h" #include "Rendering/ESetCamera.h"
#include "Core/ConfigFile.h" #include "Core/ConfigFile.h"
#include "Core/EntityFile.h" #include "Core/EntityFile.h"
#include "Core/EntityFileParser.h"
#include "Core/EPlayerDeath.h" #include "Core/EPlayerDeath.h"
#include "Core/EEntityDeleted.h"
class PlayerDeathSystem : public ImpureSystem class PlayerDeathSystem : public ImpureSystem
{ {
@@ -20,8 +18,12 @@ public:
virtual void Update(double dt) override; virtual void Update(double dt) override;
private: private:
EntityWrapper m_LocalPlayerDeathEffect;
EventRelay<PlayerDeathSystem, Events::PlayerDeath> m_OnPlayerDeath; EventRelay<PlayerDeathSystem, Events::PlayerDeath> m_OnPlayerDeath;
bool OnPlayerDeath(Events::PlayerDeath& e); bool OnPlayerDeath(Events::PlayerDeath& e);
EventRelay<PlayerDeathSystem, Events::EntityDeleted> m_EEntityDeleted;
bool OnEntityDeleted(Events::EntityDeleted& e);
void createDeathEffect(EntityWrapper player); void createDeathEffect(EntityWrapper player);
+9 -3
View File
@@ -6,9 +6,7 @@
#include <imgui/imgui.h> #include <imgui/imgui.h>
#include "Events/EDoubleJump.h" #include "Events/EDoubleJump.h"
#include "../Engine/Sound/EPlaySoundOnEntity.h" #include "../Engine/Sound/EPlaySoundOnEntity.h"
#include "Core/EntityFile.h" #include "Core/EntityFile.h"
#include "Core/EntityFileParser.h"
class PlayerMovementSystem : public ImpureSystem class PlayerMovementSystem : public ImpureSystem
{ {
@@ -32,12 +30,20 @@ private:
bool m_LeftFoot = false; bool m_LeftFoot = false;
// To get a difference when calculating the walking state. // To get a difference when calculating the walking state.
glm::vec3 m_LastPosition = glm::vec3(); glm::vec3 m_LastPosition = glm::vec3();
// Used to track afterimages for sprint effect.
float m_SprintEffectTimer;
// The logic for making the sound play when player is moving // The logic for making the sound play when player is moving
void playerStep(double dt); void playerStep(double dt);
// Spawn a hexagon at origin of an Entity
void spawnHexagon(EntityWrapper target);
EventRelay<PlayerMovementSystem, Events::PlayerSpawned> m_EPlayerSpawned; EventRelay<PlayerMovementSystem, Events::PlayerSpawned> m_EPlayerSpawned;
bool OnPlayerSpawned(Events::PlayerSpawned& e); bool OnPlayerSpawned(Events::PlayerSpawned& e);
EventRelay<PlayerMovementSystem, Events::DoubleJump> m_EDoubleJump;
bool PlayerMovementSystem::OnDoubleJump(Events::DoubleJump & e);
EventRelay<PlayerMovementSystem, Events::DashAbility> m_EDashAbility;
bool PlayerMovementSystem::OnDashAbility(Events::DashAbility & e);
void updateMovementControllers(double dt); void updateMovementControllers(double dt);
void updateVelocity(double dt); void updateVelocity(EntityWrapper player, double dt);
}; };
+2 -4
View File
@@ -13,8 +13,6 @@ public:
PlayerSpawnSystem(SystemParams params); PlayerSpawnSystem(SystemParams params);
virtual void Update(double dt) override; virtual void Update(double dt) override;
static void SetRespawnTime(float respawnTime) { m_RespawnTime = respawnTime; };
private: private:
struct SpawnRequest struct SpawnRequest
@@ -31,8 +29,8 @@ private:
//EntityWrapper ID -> Player ID. //EntityWrapper ID -> Player ID.
std::map<EntityID, int> m_PlayerIDs; std::map<EntityID, int> m_PlayerIDs;
static float m_RespawnTime; float m_ForcedRespawnTime;
float m_Timer; bool m_DbgConfigForceRespawn;
EventRelay<PlayerSpawnSystem, Events::InputCommand> m_OnInputCommand; EventRelay<PlayerSpawnSystem, Events::InputCommand> m_OnInputCommand;
bool OnInputCommand(Events::InputCommand& e); bool OnInputCommand(Events::InputCommand& e);
+24 -3
View File
@@ -1,6 +1,25 @@
#include "Common.h" #include "Common.h"
#include "Core/System.h" #include "Core/System.h"
//struct FSubscriptProxy
// {
// friend struct ComponentWrapper;
// FSubscriptProxy(ComponentWrapper* component, std::string fieldName)
// : m_Component(component)
// , m_FieldName(fieldName)
// { }
// ComponentWrapper* m_Component;
// std::string m_FieldName;
// public:
// template <typename T>
// operator Field<T>() { return Field<T>(m_Component->Field<T>(m_FieldName)); }
// };
class RaptorCopterSystem : public PureSystem class RaptorCopterSystem : public PureSystem
{ {
public: public:
@@ -9,9 +28,11 @@ public:
, PureSystem("RaptorCopter") , PureSystem("RaptorCopter")
{ } { }
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cRaptorCopter, double dt) override
{ {
ComponentWrapper& transform = m_World->GetComponent(component.EntityID, "Transform"); ComponentWrapper& cTransform = entity["Transform"];
(glm::vec3&)transform["Orientation"] += (float)(double)component["Speed"] * (float)dt * (glm::vec3)component["Axis"]; //FSubscriptProxy subOri(&cTransform, "Orientation");
//Field<glm::vec3> orientation = subOri;
(Field<glm::vec3>)cTransform["Orientation"] += (float)(const double&)cRaptorCopter["Speed"] * (float)dt * (glm::vec3)cRaptorCopter["Axis"];
} }
}; };
+44
View File
@@ -0,0 +1,44 @@
#ifndef ScoreScreenSystem_h__
#define ScoreScreenSystem_h__
#include "Core/System.h"
#include "Core/ResourceManager.h"
#include "Core/EntityFile.h"
#include "Network/EKillDeath.h"
#include "Core/EPlayerSpawned.h"
#include "Network/EPlayerConnected.h"
#include "Network/EPlayerDisconnected.h"
#include "GLM.h"
class ScoreScreenSystem : public PureSystem
{
public:
ScoreScreenSystem(SystemParams params);
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& scoreScreen, double dt) override;
EventRelay<ScoreScreenSystem, Events::KillDeath> m_EPlayerDeath;
bool OnPlayerDeath(const Events::KillDeath& e);
EventRelay<ScoreScreenSystem, Events::PlayerSpawned> m_EPlayerSpawned;
bool OnPlayerSpawn(const Events::PlayerSpawned& e);
EventRelay<ScoreScreenSystem, Events::PlayerConnected> m_EPlayerConnected;
bool OnPlayerConnected(const Events::PlayerConnected& e);
EventRelay<ScoreScreenSystem, Events::PlayerDisconnected> m_EPlayerDisconnected;
bool OnPlayerDisconnected(const Events::PlayerDisconnected& e);
private:
struct PlayerData {
int ID = -1;
std::string Name = "";
int Team = 1;
int Kills = 0;
int Deaths = 0;
EntityWrapper Player = EntityWrapper::Invalid;
};
std::vector<int> m_DisconnectedIdentities;
int m_PlayerCounter = 0;
std::unordered_map<int, PlayerData> m_PlayerIdentities;
};
#endif
+1 -2
View File
@@ -7,8 +7,7 @@
#include "Core/System.h" #include "Core/System.h"
#include "Events/ESpawnerSpawn.h" #include "Events/ESpawnerSpawn.h"
#include "Core/Transform.h" #include "Core/Transform.h"
#include "Core/ResourceManager.h" #include "Core/EntityFile.h"
#include "Core/EntityFileParser.h"
class SpawnerSystem : public System class SpawnerSystem : public System
{ {
+21
View File
@@ -0,0 +1,21 @@
#ifndef AmmunitionHUDSystem_h__
#define AmmunitionHUDSystem_h__
#include <boost/lexical_cast.hpp>
#include <sstream>
#include <iomanip>
#include "../../Engine/Core/System.h"
#include "../../Engine/GLM.h"
class TextFieldReader : public PureSystem
{
public:
TextFieldReader(SystemParams params)
: System(params)
, PureSystem("TextFieldReader")
{ }
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cTextFieldReader, double dt) override;
};
#endif
@@ -1,49 +1,42 @@
#include "Sound/EPlaySoundOnEntity.h" #ifndef AssaultWeaponBehaviour_h__
#include "Collision/Collision.h" #define AssaultWeaponBehaviour_h__
#include "Rendering/AnimationSystem.h"
#include "Core/ConfigFile.h"
#include "WeaponBehaviour.h" #include "WeaponBehaviour.h"
#include "../SpawnerSystem.h" #include "Collision/Collision.h"
#include "Core/EPlayerDamage.h" #include "Core/EPlayerDamage.h"
#include "Core/EShoot.h" #include "Sound/EPlaySoundOnEntity.h"
#include "Rendering/EAutoAnimationBlend.h"
class AssaultWeaponBehaviour : public WeaponBehaviour<AssaultWeaponBehaviour>
class AssaultWeaponBehaviour : public WeaponBehaviour
{ {
public: public:
AssaultWeaponBehaviour(SystemParams systemParams, IRenderer* renderer, Octree<EntityAABB>* collisionOctree, EntityWrapper weaponEntity); AssaultWeaponBehaviour(SystemParams systemParams, IRenderer* renderer, Octree<EntityAABB>* collisionOctree)
: System(systemParams)
virtual void Fire() override; , WeaponBehaviour(systemParams, "AssaultWeapon", renderer, collisionOctree)
virtual void CeaseFire() override; , m_RandomEngine(m_RandomDevice())
virtual void Reload() override; { }
virtual void Update(double dt) override; void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cWeapon, double dt) override;
void UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) override;
void OnPrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnCeasePrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnEquip(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) override;
//bool OnInputCommand(ComponentWrapper cWeapon, WeaponInfo& wi, const Events::InputCommand& e) override;
private: private:
EntityWrapper m_FirstPersonModel; std::random_device m_RandomDevice;
EntityWrapper m_ThirdPersonModel; std::mt19937 m_RandomEngine;
// State
bool m_Firing = false;
bool m_Reloading = false;
double m_ReloadTimer = 0.0;
EntityWrapper m_FirstPersonReloadImpersonator;
EntityWrapper m_ThirdPersonReloadImpersonator;
double m_TimeSinceLastFire = 0.0;
EventRelay<WeaponBehaviour, Events::AnimationComplete> m_EAnimationComplete; // Weapon functions
bool OnAnimationComplete(Events::AnimationComplete& e); void fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi);
//void dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, glm::vec3 direction, double damage);
bool canFire(ComponentWrapper cWeapon, WeaponInfo& wi);
bool dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi);
bool hasAmmo(); // Utility
void fireRound(); //Camera cameraFromEntity(EntityWrapper camera);
void spawnTracer();
float traceRayDistance(glm::vec3 origin, glm::vec3 direction);
void playFireSound();
void playEmptySound();
void viewPunch();
void finishReload();
void playShootAnimation();
void playIdleAnimation();
void playReloadAnimation();
bool shoot(double damage);
void showHitMarker();
}; };
#endif
@@ -0,0 +1,39 @@
#ifndef DefenderWeaponBehaviour_h__
#define DefenderWeaponBehaviour_h__
#include "WeaponBehaviour.h"
#include "Collision/Collision.h"
#include "Core/EPlayerDamage.h"
#include "Sound/EPlaySoundOnEntity.h"
class DefenderWeaponBehaviour : public WeaponBehaviour<DefenderWeaponBehaviour>
{
public:
DefenderWeaponBehaviour(SystemParams systemParams, IRenderer* renderer, Octree<EntityAABB>* collisionOctree)
: System(systemParams)
, WeaponBehaviour(systemParams, "DefenderWeapon", renderer, collisionOctree)
, m_RandomEngine(m_RandomDevice())
{ }
void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cWeapon, double dt) override;
void UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) override;
void OnPrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnCeasePrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) override;
bool OnInputCommand(ComponentWrapper cWeapon, WeaponInfo& wi, const Events::InputCommand& e) override;
private:
std::random_device m_RandomDevice;
std::mt19937 m_RandomEngine;
// Weapon functions
void fireShell(ComponentWrapper cWeapon, WeaponInfo& wi);
void dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, glm::vec3 direction, double damage);
bool canFire(ComponentWrapper cWeapon, WeaponInfo& wi);
// Utility
Camera cameraFromEntity(EntityWrapper camera);
};
#endif
@@ -0,0 +1,38 @@
#ifndef SidearmWeaponBehaviour_h__
#define SidearmWeaponBehaviour_h__
#include "WeaponBehaviour.h"
#include "Collision/Collision.h"
#include "Core/EPlayerDamage.h"
class SidearmWeaponBehaviour : public WeaponBehaviour<SidearmWeaponBehaviour>
{
public:
SidearmWeaponBehaviour(SystemParams systemParams, IRenderer* renderer, Octree<EntityAABB>* collisionOctree)
: System(systemParams)
, WeaponBehaviour(systemParams, "SidearmWeapon", renderer, collisionOctree)
, m_RandomEngine(m_RandomDevice())
{ }
void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cWeapon, double dt) override;
void UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) override;
void OnPrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnCeasePrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnEquip(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) override;
private:
std::random_device m_RandomDevice;
std::mt19937 m_RandomEngine;
// Weapon functions
void fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi);
//void dealDamage(WeaponInfo& wi, glm::vec3 direction, double damage);
// Utility
bool canFire(ComponentWrapper cWeapon);
bool playerInFirstPerson(EntityWrapper player);
//float traceRayDistance(glm::vec3 origin, glm::vec3 direction);
};
#endif
+311 -12
View File
@@ -5,30 +5,329 @@
#include "Rendering/IRenderer.h" #include "Rendering/IRenderer.h"
#include "Core/Octree.h" #include "Core/Octree.h"
#include "Collision/EntityAABB.h" #include "Collision/EntityAABB.h"
#include "Input/EInputCommand.h"
#include "Systems/SpawnerSystem.h"
#include "Rendering/ESetCamera.h"
#include "Core/ConfigFile.h"
#include "Rendering/EAutoAnimationBlend.h"
class WeaponBehaviour : public System template <typename ETYPE>
class WeaponBehaviour : public PureSystem
{ {
friend class WeaponSystem;
public: public:
WeaponBehaviour(SystemParams systemParams, IRenderer* renderer, Octree<EntityAABB>* collisionOctree, EntityWrapper player) WeaponBehaviour(SystemParams params, std::string componentType, IRenderer* renderer, Octree<EntityAABB>* collisionOctree)
: System(systemParams) : System(params)
, PureSystem(componentType)
, m_Renderer(renderer) , m_Renderer(renderer)
, m_CollisionOctree(collisionOctree) , m_CollisionOctree(collisionOctree)
, m_Player(player) {
{ } EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &WeaponBehaviour::_OnInputCommand);
EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &WeaponBehaviour::_OnSetCamera);
auto config = ResourceManager::Load<ConfigFile>("Config.ini");
m_ConfigAutoReload = config->Get<bool>("Gameplay.AutoReload", true);
}
virtual ~WeaponBehaviour() = default; virtual ~WeaponBehaviour() = default;
WeaponBehaviour(const WeaponBehaviour&) = delete; virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cWeapon, double dt) override
WeaponBehaviour& operator=(const WeaponBehaviour &) = delete; {
EntityWrapper firstPersonWeapon = entity.FirstChildByName("Hands").FirstChildByName("AssaultWeapon");
EntityWrapper thirdPersonWeapon = entity.FirstChildByName("PlayerModel").FirstChildByName("AssaultWeapon");
if (IsClient && (firstPersonWeapon.Valid() || thirdPersonWeapon.Valid())) {
if (m_ActiveWeapons.count(entity) == 0) {
virtual void Fire() = 0; WeaponInfo& wi = m_ActiveWeapons[entity];
virtual void CeaseFire() { } wi.Player = entity;
virtual void Reload() { } wi.WeaponEntity = entity;
virtual void Update(double dt) { } wi.FirstPersonEntity = firstPersonWeapon;
wi.ThirdPersonEntity = thirdPersonWeapon;
OnEquip(cWeapon, wi);
}
}
auto weapon = getActiveWeapon(entity);
if (!weapon) {
return;
} else {
UpdateWeapon(cWeapon, *weapon, dt);
}
}
protected: protected:
struct WeaponInfo
{
EntityWrapper Player;
EntityWrapper WeaponEntity;
EntityWrapper FirstPersonEntity;
EntityWrapper ThirdPersonEntity;
};
IRenderer* m_Renderer; IRenderer* m_Renderer;
EntityWrapper m_CurrentCamera;
Octree<EntityAABB>* m_CollisionOctree; Octree<EntityAABB>* m_CollisionOctree;
EntityWrapper m_Player; std::unordered_map<EntityWrapper, WeaponInfo> m_ActiveWeapons;
bool m_ConfigAutoReload;
virtual void UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) { }
virtual void OnPrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) { }
virtual void OnCeasePrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) { }
virtual void OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) { }
virtual void OnEquip(ComponentWrapper cWeapon, WeaponInfo& wi) { }
virtual void OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) { }
virtual bool OnInputCommand(ComponentWrapper cWeapon, WeaponInfo& wi, const Events::InputCommand& e) { return false; }
bool isPlayerInFirstPerson(EntityWrapper player)
{
if (!m_CurrentCamera.Valid()) {
return false;
} else {
return m_CurrentCamera == player || m_CurrentCamera.IsChildOf(player);
}
}
// Returns wi.FirstPersonEntity or wi.ThirdPersonEntity depending on
// if the player is in first person mode or not.
EntityWrapper getRelevantWeaponModelEntity(WeaponInfo& wi)
{
if (isPlayerInFirstPerson(wi.Player)) {
return wi.FirstPersonEntity;
} else {
return wi.ThirdPersonEntity;
}
}
float traceRayDistance(glm::vec3 origin, glm::vec3 direction)
{
float distance;
glm::vec3 pos;
auto entity = Collision::EntityFirstHitByRay(Ray(origin, direction), m_CollisionOctree, distance, pos);
if (entity) {
return distance;
} else {
return 100.f;
}
}
void playAnimation(EntityWrapper weaponModelEntity, const std::string& subTreeName, const std::string& animationNodeName)
{
EntityWrapper root = weaponModelEntity.FirstParentWithComponent("Model");
if (!root.Valid()) {
return;
}
EntityWrapper subTree = root.FirstChildByName(subTreeName);
if (!subTree.Valid()) {
return;
}
EntityWrapper animationNode = subTree.FirstChildByName(animationNodeName);
if (!animationNode.Valid()) {
return;
}
Events::AutoAnimationBlend eFireBlend;
eFireBlend.RootNode = root;
eFireBlend.NodeName = animationNodeName;
eFireBlend.Restart = true;
eFireBlend.Start = true;
m_EventBroker->Publish(eFireBlend);
}
void playAnimationAndReturn(EntityWrapper weaponModelEntity, const std::string& subTreeName, const std::string& animationNodeName)
{
EntityWrapper root = weaponModelEntity.FirstParentWithComponent("Model");
if (!root.Valid()) {
return;
}
EntityWrapper subTree = root.FirstChildByName(subTreeName);
if (!subTree.Valid()) {
return;
}
EntityWrapper animationNode = subTree.FirstChildByName(animationNodeName);
if (!animationNode.Valid()) {
return;
}
Events::AutoAnimationBlend eFireBlend;
eFireBlend.RootNode = root;
eFireBlend.NodeName = animationNodeName;
eFireBlend.Restart = true;
eFireBlend.Start = true;
m_EventBroker->Publish(eFireBlend);
Events::AutoAnimationBlend eIdleBlend;
eIdleBlend.RootNode = root;
eIdleBlend.NodeName = "Idle";
eIdleBlend.AnimationEntity = animationNode;
eIdleBlend.Delay = -0.2;
eIdleBlend.Duration = 0.2;
m_EventBroker->Publish(eIdleBlend);
}
private:
EventRelay<ETYPE, Events::SetCamera> m_ESetCamera;
bool _OnSetCamera(const Events::SetCamera& e)
{
m_CurrentCamera = e.CameraEntity;
return true;
}
EventRelay<ETYPE, Events::InputCommand> m_EInputCommand;
bool _OnInputCommand(const Events::InputCommand& e)
{
EntityWrapper player = e.Player;
if (e.PlayerID == -1) {
player = LocalPlayer;
}
// Make sure the player is alive
if (!player.Valid()) {
return false;
}
// Make sure the player has this weapon
auto cWeapon = getWeaponComponent(player);
if (!cWeapon) {
return false;
}
// Weapon selection
if (e.Command == "SelectWeapon") {
if (e.Value > 0) {
if (static_cast<ComponentInfo::EnumType>(e.Value) == static_cast<ComponentInfo::EnumType>((*cWeapon)["Slot"])) {
selectWeapon(*cWeapon, player);
} else {
holsterWeapon(*cWeapon, player);
}
}
}
// Only handle weapon actions if the weapon is active
auto activeWeapon = getActiveWeapon(player);
if (!activeWeapon) {
return false;
}
// Fire
if (e.Command == "PrimaryFire") {
if (e.Value > 0) {
OnPrimaryFire(*cWeapon, *activeWeapon);
} else {
OnCeasePrimaryFire(*cWeapon, *activeWeapon);
}
}
// Reload
if (e.Command == "Reload" && e.Value != 0) {
OnReload(*cWeapon, *activeWeapon);
}
return OnInputCommand(*cWeapon, *activeWeapon, e);
}
boost::optional<ComponentWrapper> getWeaponComponent(EntityWrapper player)
{
if (!player.HasComponent(m_ComponentType)) {
return boost::none;
}
return player[m_ComponentType];
}
boost::optional<WeaponInfo&> getActiveWeapon(EntityWrapper player)
{
auto it = m_ActiveWeapons.find(player);
if (it == m_ActiveWeapons.end()) {
return boost::none;
}
WeaponInfo& activeWeapon = it->second;
if (!activeWeapon.FirstPersonEntity.Valid() && !activeWeapon.ThirdPersonEntity.Valid()) {
return boost::none;
}
return activeWeapon;
}
void selectWeapon(ComponentWrapper cWeapon, EntityWrapper player)
{
if (!IsServer) {
return;
}
// Don't reselect weapon if it's already active
if (getActiveWeapon(player)) {
return;
}
// Find the weapon attachments matching the weapon type
std::vector<EntityWrapper> weaponAttachments = player.ChildrenWithComponent("WeaponAttachment");
EntityWrapper firstPersonAttachment;
EntityWrapper thirdPersonAttachment;
for (auto& attachment : weaponAttachments) {
ComponentWrapper cWeaponAttachment = attachment["WeaponAttachment"];
Field<std::string> weaponType = cWeaponAttachment["Weapon"];
if (*weaponType == m_ComponentType) {
ComponentWrapper::SubscriptProxy person = cWeaponAttachment["Person"];
if ((ComponentInfo::EnumType)person == person.Enum("FirstPerson")) {
firstPersonAttachment = attachment;
} else if ((ComponentInfo::EnumType)person == person.Enum("ThirdPerson")) {
thirdPersonAttachment = attachment;
}
}
}
if (!firstPersonAttachment.Valid() && !thirdPersonAttachment.Valid()) {
LOG_WARNING("No weapon attachment found for %s of player #%i", m_ComponentType.c_str(), player.ID);
return;
}
// Spawn the weapon(s)
EntityWrapper firstPersonWeapon;
EntityWrapper thirdPersonWeapon;
//if (IsClient) {
if (firstPersonAttachment.Valid()) {
firstPersonWeapon = SpawnerSystem::Spawn(firstPersonAttachment, firstPersonAttachment);
}
//}
if (thirdPersonAttachment.Valid()) {
thirdPersonWeapon = SpawnerSystem::Spawn(thirdPersonAttachment, thirdPersonAttachment);
}
WeaponInfo& wi = m_ActiveWeapons[player];
wi.Player = player;
wi.WeaponEntity = player;
wi.FirstPersonEntity = firstPersonWeapon;
wi.ThirdPersonEntity = thirdPersonWeapon;
OnEquip(cWeapon, wi);
}
void holsterWeapon(ComponentWrapper cWeapon, EntityWrapper player)
{
auto activeWeapon = getActiveWeapon(player);
if (!activeWeapon) {
return;
}
WeaponInfo& wi = *activeWeapon;
// Send holster event
OnHolster(cWeapon, wi);
// Delete weapon entities
if (wi.FirstPersonEntity.Valid()) {
m_World->DeleteEntity(wi.FirstPersonEntity.ID);
}
if (wi.ThirdPersonEntity.Valid()) {
m_World->DeleteEntity(wi.ThirdPersonEntity.ID);
}
// Make weapon inactive
m_ActiveWeapons.erase(player);
}
}; };
#endif #endif
+2 -2
View File
@@ -9,8 +9,8 @@
#include "Core/EShoot.h" #include "Core/EShoot.h"
#include "Core/EPlayerSpawned.h" #include "Core/EPlayerSpawned.h"
#include "Input/EInputCommand.h" #include "Input/EInputCommand.h"
#include "Core/EntityFile.h" #include "Core/EntityXMLFile.h"
#include "Core/EntityFileParser.h" #include "Core/EntityXMLFileParser.h"
#include "Core/Octree.h" #include "Core/Octree.h"
#include "Collision/EntityAABB.h" #include "Collision/EntityAABB.h"
#include "Systems/SpawnerSystem.h" #include "Systems/SpawnerSystem.h"
+50 -2
View File
@@ -1,10 +1,13 @@
[Gameplay]
AutoReload=true
[Debug] [Debug]
LogLevel=1 LogLevel=1
LoadMap= LoadMap=
; if true -> Pool allocation is not used when calling Allocate/Free, just use regular dynamic allocation. ; if true -> Pool allocation is not used when calling Allocate/Free, just use regular dynamic allocation.
; if false -> Use pool allocation. ; if false -> Use pool allocation.
DisableMemoryPool=false DisableMemoryPool=false
RespawnTime = 8.0 RespawnTime = -1.0
EditorEnabled=false EditorEnabled=false
OutOfBodyExperience=false OutOfBodyExperience=false
@@ -36,4 +39,49 @@ ResourceLoading=true
[Sound] [Sound]
BGMVolume=1.0 BGMVolume=1.0
SFXVolume=1.0 SFXVolume=1.0
Announcer=female Announcer=female
[SSAO]
Quality=0
[SSAO1]
Radius=1.0
Bias=0.02
Contrast=1.5
Intensity=1.0
NumSamples=8
NumTurns=3
NumIterations=5
TextureQuality=2
[SSAO2]
Radius=1.0
Bias=0.02
Contrast=1.5
Intensity=1.0
NumSamples=16
NumTurns=13
NumIterations=9
TextureQuality=1
[SSAO3]
Radius=1.0
Bias=0.02
Contrast=1.5
Intensity=1.0
NumSamples=24
NumTurns=17
NumIterations=9
TextureQuality=0
[GLOW]
Quality=3
[GLOW1]
NumIterations=5
[GLOW2]
NumIterations=9
[GLOW3]
NumIterations=13
+2 -1
View File
@@ -27,4 +27,5 @@ M=SwitchToClient
P=SwitchToPlayer P=SwitchToPlayer
K=TakeDamage,1500 K=TakeDamage,1500
F2=PerformanceTimingResetAllTimers F2=PerformanceTimingResetAllTimers
F3=PerformanceTimingCreateExcelData F3=PerformanceTimingCreateExcelData
F4=SwapToClassPick
+22 -2
View File
@@ -33,16 +33,36 @@
<xs:include schemaLocation="Components/HiddenForLocalPlayer.xsd"/> <xs:include schemaLocation="Components/HiddenForLocalPlayer.xsd"/>
<xs:include schemaLocation="Components/HealthPickup.xsd"/> <xs:include schemaLocation="Components/HealthPickup.xsd"/>
<xs:include schemaLocation="Components/AmmoPickup.xsd"/> <xs:include schemaLocation="Components/AmmoPickup.xsd"/>
<xs:include schemaLocation="Components/AnimationOffset.xsd"/>
<xs:include schemaLocation="Components/DashAbility.xsd"/> <xs:include schemaLocation="Components/DashAbility.xsd"/>
<xs:include schemaLocation="Components/ShieldAbility.xsd"/>
<xs:include schemaLocation="Components/SprintAbility.xsd"/>
<xs:include schemaLocation="Components/AssaultWeapon.xsd"/> <xs:include schemaLocation="Components/AssaultWeapon.xsd"/>
<xs:include schemaLocation="Components/BoostAssault.xsd"/>
<xs:include schemaLocation="Components/BoostDefender.xsd"/>
<xs:include schemaLocation="Components/BoostSniper.xsd"/>
<xs:include schemaLocation="Components/Shield.xsd"/> <xs:include schemaLocation="Components/Shield.xsd"/>
<xs:include schemaLocation="Components/Sprite.xsd"/> <xs:include schemaLocation="Components/Sprite.xsd"/>
<xs:include schemaLocation="Components/Shielded.xsd"/> <xs:include schemaLocation="Components/Shielded.xsd"/>
<xs:include schemaLocation="Components/CapturePointHUD.xsd"/> <xs:include schemaLocation="Components/CapturePointHUD.xsd"/>
<xs:include schemaLocation="Components/AmmunitionHUD.xsd"/> <xs:include schemaLocation="Components/TextFieldReader.xsd"/>
<xs:include schemaLocation="Components/Menu.xsd"/> <xs:include schemaLocation="Components/Menu.xsd"/>
<xs:include schemaLocation="Components/KillFeed.xsd"/> <xs:include schemaLocation="Components/KillFeed.xsd"/>
<xs:include schemaLocation="Components/BlendOverride.xsd"/>
<xs:include schemaLocation="Components/Blend.xsd"/>
<xs:include schemaLocation="Components/BlendAdditive.xsd"/>
<xs:include schemaLocation="Components/Page.xsd"/> <xs:include schemaLocation="Components/Page.xsd"/>
<xs:include schemaLocation="Components/SpriteIndicator.xsd"/>
<xs:include schemaLocation="Components/Button.xsd"/> <xs:include schemaLocation="Components/Button.xsd"/>
<xs:include schemaLocation="Components/AbilityCooldownHUD.xsd"/>
<xs:include schemaLocation="Components/DoubleJump.xsd"/>
<xs:include schemaLocation="Components/WeaponAttachment.xsd"/>
<xs:include schemaLocation="Components/DefenderWeapon.xsd"/>
<xs:include schemaLocation="Components/SidearmWeapon.xsd"/>
<xs:include schemaLocation="Components/CapturePointGameMode.xsd"/>
<xs:include schemaLocation="Components/CapturePointArrowHUD.xsd"/>
<xs:include schemaLocation="Components/FloatingEffect.xsd"/>
<xs:include schemaLocation="Components/BoostIconsHUD.xsd"/>
<xs:include schemaLocation="Components/InputCmdButton.xsd"/>
<xs:include schemaLocation="Components/ScoreScreen.xsd"/>
<xs:include schemaLocation="Components/ScoreIdentity.xsd"/>
</xs:schema> </xs:schema>
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<AbilityCooldownHUD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="AbilityCooldownHUD.xsd">
</AbilityCooldownHUD>
@@ -0,0 +1,9 @@
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
<xs:element name="AbilityCooldownHUD">
<xs:annotation>
<xs:documentation>HUD element for tracking ability cooldown. If it has a sprite and fill component it will fill the sprite with chosen color depending on the cooldown.\n A child with text component named "Cooldown"</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
@@ -1,3 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<AmmunitionHUD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="AmmunitionHUD.xsd">
</AmmunitionHUD>
@@ -1,10 +0,0 @@
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
<xs:include schemaLocation="../Types/TeamEnum.xsd"/>
<xs:element name="AmmunitionHUD">
<xs:annotation>
<xs:documentation>Hud element for tracking ammunition from parent with AssaultWeapon component. Child with the name "MagazineAmmo" tracks clip ammunition. Child with the name "Ammo" tracks ammo.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
+7 -15
View File
@@ -1,18 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Animation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Animation.xsd"> <Animation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Animation.xsd">
<AnimationName1></AnimationName1> <AnimationName></AnimationName>
<Weight1>1.0</Weight1> <Time>0</Time>
<Time1>0</Time1> <Play>false</Play>
<Speed1>0</Speed1> <Reverse>false</Reverse>
<Loop1>true</Loop1> <Speed>0</Speed>
<AnimationName2></AnimationName2> <Loop>true</Loop>
<Weight2>1.0</Weight2> <Additive>false</Additive>
<Time2>0</Time2>
<Speed2>0</Speed2>
<Loop2>true</Loop2>
<AnimationName3></AnimationName3>
<Weight3>1.0</Weight3>
<Time3>0</Time3>
<Speed3>0</Speed3>
<Loop3>true</Loop3>
</Animation> </Animation>
+7 -17
View File
@@ -2,27 +2,17 @@
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types"> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
<xs:import schemaLocation="../Types.xsd" namespace="types"/> <xs:import schemaLocation="../Types.xsd" namespace="types"/>
<xs:element name="Animation"> <xs:element name="Animation">
<xs:complexType> <xs:complexType>
<xs:all> <xs:all>
<xs:element name="AnimationName1" type="t:string" minOccurs="0"/> <xs:element name="AnimationName" type="t:string" minOccurs="0"/>
<xs:element name="Weight1" type="t:double" minOccurs="0"/> <xs:element name="Time" type="t:double" minOccurs="0"/>
<xs:element name="Time1" type="t:double" minOccurs="0"/> <xs:element name="Speed" type="t:double" minOccurs="0"/>
<xs:element name="Speed1" type="t:double" minOccurs="0"/> <xs:element name="Play" type="t:bool" minOccurs="0"/>
<xs:element name="Loop1" type="t:bool" minOccurs="0"/> <xs:element name="Reverse" type="t:bool" minOccurs="0"/>
<xs:element name="AnimationName2" type="t:string" minOccurs="0"/> <xs:element name="Loop" type="t:bool" minOccurs="0"/>
<xs:element name="Weight2" type="t:double" minOccurs="0"/> <xs:element name="Additive" type="t:bool" minOccurs="0"/>
<xs:element name="Time2" type="t:double" minOccurs="0"/>
<xs:element name="Speed2" type="t:double" minOccurs="0"/>
<xs:element name="Loop2" type="t:bool" minOccurs="0"/>
<xs:element name="AnimationName3" type="t:string" minOccurs="0"/>
<xs:element name="Weight3" type="t:double" minOccurs="0"/>
<xs:element name="Time3" type="t:double" minOccurs="0"/>
<xs:element name="Speed3" type="t:double" minOccurs="0"/>
<xs:element name="Loop3" type="t:bool" minOccurs="0"/>
</xs:all> </xs:all>
<xs:attribute name="replicated" type="xs:boolean" fixed="true"/>
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
</xs:schema> </xs:schema>
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<AnimationOffset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="AnimationOffset.xsd">
<AnimationName></AnimationName>
<Time>0</Time>
</AnimationOffset>
+17 -6
View File
@@ -1,11 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<AssaultWeapon xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="AssaultWeapon.xsd"> <AssaultWeapon xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="AssaultWeapon.xsd">
<Slot><Primary/></Slot>
<MagazineAmmo>32</MagazineAmmo> <MagazineAmmo>32</MagazineAmmo>
<MagazineSize>32</MagazineSize> <MagazineSize>32</MagazineSize>
<Ammo>360</Ammo> <Ammo>320</Ammo>
<MaxAmmo>360</MaxAmmo> <MaxAmmo>320</MaxAmmo>
<BaseDamage>5</BaseDamage> <BaseDamage>15</BaseDamage>
<RPM>120</RPM> <SpreadAngle>0.174533</SpreadAngle> <!-- 0.174533 = 10 degrees -->
<ViewPunch>0.01</ViewPunch> <MaxTravelAngle>0.10</MaxTravelAngle> <!-- 0.174533 = 10 degrees -->
<ReloadTime>2</ReloadTime> <RPM>420</RPM>
<ViewPunch>0.03</ViewPunch>
<ViewReturnSpeed>0.18</ViewReturnSpeed>
<ReloadTime>1.65</ReloadTime>
<EquipTime>0.5</EquipTime>
<TriggerHeld>false</TriggerHeld>
<FireCooldown>0</FireCooldown>
<ReloadQueued>false</ReloadQueued>
<IsReloading>false</IsReloading>
<ReloadTimer>0</ReloadTimer>
<CurrentTravel>0</CurrentTravel>
</AssaultWeapon> </AssaultWeapon>
+22 -2
View File
@@ -2,10 +2,12 @@
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types"> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
<xs:import schemaLocation="../Types.xsd" namespace="types"/> <xs:import schemaLocation="../Types.xsd" namespace="types"/>
<xs:include schemaLocation="../Types/WeaponSlotEnum.xsd"/>
<xs:element name="AssaultWeapon"> <xs:element name="AssaultWeapon">
<xs:complexType> <xs:complexType>
<xs:all> <xs:all>
<xs:element name="Slot" type="WeaponSlotEnum" minOccurs="0"/>
<xs:element name="MagazineAmmo" type="t:int" minOccurs="0"> <xs:element name="MagazineAmmo" type="t:int" minOccurs="0">
<xs:annotation><xs:documentation>Ammo currently loaded into the magazine</xs:documentation></xs:annotation> <xs:annotation><xs:documentation>Ammo currently loaded into the magazine</xs:documentation></xs:annotation>
</xs:element> </xs:element>
@@ -19,15 +21,33 @@
<xs:annotation><xs:documentation>Maximum ammo able to be carried</xs:documentation></xs:annotation> <xs:annotation><xs:documentation>Maximum ammo able to be carried</xs:documentation></xs:annotation>
</xs:element> </xs:element>
<xs:element name="BaseDamage" type="t:double" minOccurs="0"/> <xs:element name="BaseDamage" type="t:double" minOccurs="0"/>
<xs:element name="SpreadAngle" type="t:float" minOccurs="0">
<xs:annotation><xs:documentation>Spread angle in radians</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="MaxTravelAngle" type="t:float" minOccurs="0">
<xs:annotation><xs:documentation>Maximum vertical aim travel angle in radians</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="RPM" type="t:double" minOccurs="0"> <xs:element name="RPM" type="t:double" minOccurs="0">
<xs:annotation><xs:documentation>Rate of fire in rounds per minute</xs:documentation></xs:annotation> <xs:annotation><xs:documentation>Rate of fire in rounds per minute</xs:documentation></xs:annotation>
</xs:element> </xs:element>
<xs:element name="ViewPunch" type="t:float" minOccurs="0"> <xs:element name="ViewPunch" type="t:float" minOccurs="0">
<xs:annotation><xs:documentation>View punch in radians for each bullet fired</xs:documentation></xs:annotation> <xs:annotation><xs:documentation>View punch in radians for each shell fired</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="ViewReturnSpeed" type="t:float" minOccurs="0">
<xs:annotation><xs:documentation>The speed in radians per second the view returns to its original position after being punched</xs:documentation></xs:annotation>
</xs:element> </xs:element>
<xs:element name="ReloadTime" type="t:double" minOccurs="0"> <xs:element name="ReloadTime" type="t:double" minOccurs="0">
<xs:annotation><xs:documentation>Time it takes to reload the weapon in seconds</xs:documentation></xs:annotation> <xs:annotation><xs:documentation>Time it takes to load ONE SHELL into the weapon in seconds</xs:documentation></xs:annotation>
</xs:element> </xs:element>
<xs:element name="EquipTime" type="t:double" minOccurs="0">
<xs:annotation><xs:documentation>Time it takes from selecting the weapon until it's ready to fire</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="TriggerHeld" type="t:bool" minOccurs="0"/>
<xs:element name="FireCooldown" type="t:double" minOccurs="0"/>
<xs:element name="ReloadQueued" type="t:bool" minOccurs="0"/>
<xs:element name="IsReloading" type="t:bool" minOccurs="0"/>
<xs:element name="ReloadTimer" type="t:double" minOccurs="0"/>
<xs:element name="CurrentTravel" type="t:float" minOccurs="0"/>
</xs:all> </xs:all>
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Blend xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Blend.xsd">
<Pose1></Pose1>
<Pose2></Pose2>
<Weight>0.5</Weight>
<SubTreeRoot>false</SubTreeRoot>
</Blend>
+15
View File
@@ -0,0 +1,15 @@
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
<xs:element name="Blend">
<xs:complexType>
<xs:all>
<xs:element name="Pose1" type="t:string" minOccurs="0"/>
<xs:element name="Pose2" type="t:string" minOccurs="0"/>
<xs:element name="Weight" type="t:double" minOccurs="0"/>
<xs:element name="SubTreeRoot" type="t:bool" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>

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