Compare commits

..

335 Commits

Author SHA1 Message Date
FakeShemp e25c9ee690 Merge remote-tracking branch 'origin/master' into Shadows
# Conflicts:
#	include/Engine/Rendering/DrawFinalPass.h
#	include/Engine/Rendering/Renderer.h
#	resources/Shaders/ForwardPlus.vert.glsl
#	resources/Shaders/ForwardPlusSkinned.vert.glsl
#	src/Engine/Rendering/Renderer.cpp
2016-03-09 19:38:55 +01:00
Jace fce6e90f3c First person assault weapon idle animation now correct 2016-03-09 19:07:02 +01:00
antc13 07d85bacf6 Added file extension to CP_Rocky2 & moved spawn points on the Y axis. 2016-03-09 18:57:45 +01:00
antc13 15c1b238ef Merge branch 'master' of https://github.com/teamfisk/TacticalZ 2016-03-09 18:46:43 +01:00
antc13 b8839551a4 Created the map CP_Rocky2 but beware, it's still WIP. 2016-03-09 18:46:26 +01:00
Jace ce58fac6ba Merge pull request #192 from teamfisk/Movement
Movement
2016-03-09 18:37:56 +01:00
viktorljung 1bfd0cce5e Idel 2016-03-09 18:36:53 +01:00
viktorljung 60ff53112e Merge remote-tracking branch 'origin/master' into Movement 2016-03-09 18:27:36 +01:00
viktorljung d42d886dcc 3rd person animations synced with 1st person animations 2016-03-09 18:27:09 +01:00
Jace 1f14087734 Merge branch 'master' of github.com:teamfisk/TacticalZ 2016-03-09 18:02:11 +01:00
Jace 0b58f32f32 Fixed third person animations over network 2016-03-09 18:01:32 +01:00
Tobias Dahl 48d9463bd3 Merge pull request #190 from teamfisk/RendererBugFixes
Renderer bug fixes
2016-03-09 18:01:02 +01:00
Teejoon 974d9101bd Merge remote-tracking branch 'origin/master' into RendererBugFixes
Conflicts:
	assets
2016-03-09 17:50:42 +01:00
Tobias Dahl 07cb025de3 Merge pull request #188 from teamfisk/FriendlyHost/Join
User friendly server join
2016-03-09 17:49:39 +01:00
stiffly fdc37a9fe9 Loads the correct menu 2016-03-09 17:49:04 +01:00
stiffly 99ccca6273 Merge remote-tracking branch 'origin/master' into FriendlyHost/Join 2016-03-09 17:38:37 +01:00
Adam Byléhn e9717c68bd Merge pull request #191 from teamfisk/Menu
Menu
2016-03-09 17:38:18 +01:00
Tleety d093284569 Rename variable 2016-03-09 17:37:40 +01:00
Teejoon 85e63acda0 removed standarduniforms 2016-03-09 17:36:30 +01:00
Tleety 7e7d98eaae Merge remote-tracking branch 'origin/master' into Menu 2016-03-09 17:24:41 +01:00
Tleety 1104166039 TextureSprite Resource that use GL_NEAREST for sampling aswell as some StartMenu changes 2016-03-09 17:24:21 +01:00
Teejoon fad93ca5aa Merge remote-tracking branch 'origin/master' into RendererBugFixes
Conflicts:
	include/Engine/Rendering/DrawFinalPass.h
2016-03-09 16:54:26 +01:00
Teejoon 91cad561a4 Some more optimization and fixed sorting of render job objects in RenderSystem 2016-03-09 16:51:24 +01:00
Jace 3ea1177425 Merge pull request #189 from teamfisk/Weapons
Basically complete Assault Weapon
2016-03-09 16:17:00 +01:00
viktorljung 7141756992 Merge remote-tracking branch 'origin/Weapons' into Movement
# Conflicts:
#	resources/Schema/Entities/Player.xml
#	resources/Schema/Entities/PlayerAssaultBlue.xml
#	resources/Schema/Entities/PlayerAssaultFallbackBlue.xml
#	resources/Schema/Entities/PlayerAssaultFallbackRed.xml
#	resources/Schema/Entities/PlayerAssaultRed.xml
#	resources/Schema/Entities/aaaatestremoveme.xml
#	resources/Schema/Entities/aim_rays.xml
2016-03-09 15:59:36 +01:00
viktorljung de125663fd Merge remote-tracking branch 'origin/master' into Movement
# Conflicts:
#	assets
#	resources/Schema/Entities/Player.xml
#	resources/Schema/Entities/PlayerAssaultFallbackBlue.xml
#	resources/Schema/Entities/PlayerAssaultFallbackRed.xml
#	resources/Schema/Entities/PlayerAssaultRed.xml
#	resources/Schema/Entities/aaaatestremoveme.xml
#	resources/Schema/Entities/aim_rays.xml
#	src/Engine/Rendering/BoneAttachmentSystem.cpp
2016-03-09 15:54:00 +01:00
Jace 34e551663f Merge remote-tracking branch 'origin/master' into Weapons
# Conflicts:
#	assets
#	resources/Schema/Entities/Player.xml
#	resources/Schema/Entities/PlayerAssaultFallbackBlue.xml
#	resources/Schema/Entities/PlayerAssaultFallbackRed.xml
#	resources/Schema/Entities/PlayerAssaultRed.xml
#	resources/Schema/Entities/aaaatestremoveme.xml
#	resources/Schema/Entities/aim_rays.xml
2016-03-09 15:52:13 +01:00
stiffly fa0b52caec When you disconnect you will delete the world and return to the menu. 2016-03-09 15:49:42 +01:00
Jace 9d368348d5 Updated 3rd person and 1st person animation trees for assault to allow for third person weapon animations 2016-03-09 15:48:57 +01:00
Tleety 49040e9c4b StartMenu system now sets the main menu camera to active as long as it exists. 2016-03-09 15:29:42 +01:00
Tleety a76a04260f StartSystem skeleton and some changes to the StartMenu 2016-03-09 15:10:54 +01:00
stiffly 1211888ce1 The world is deleted upon connection to a server. 2016-03-09 15:10:32 +01:00
stiffly 877defdfee Merge remote-tracking branch 'origin/master' into FriendlyHost/Join 2016-03-09 14:47:24 +01:00
stiffly 6f69b52358 Merge remote-tracking branch 'origin/Menu' into FriendlyHost/Join 2016-03-09 14:34:41 +01:00
Tleety 500ebfa08c Menu should now show the correct server IP instead of default.
Start of a StartMenu entity that will show when the game is started.
2016-03-09 14:34:02 +01:00
stiffly 09171a1a18 WIP connect from menu 2016-03-09 14:33:20 +01:00
Jace ee4db3c12f Merge pull request #187 from teamfisk/BoneAttachmentFix
Inverse seems to be the same as -w
2016-03-09 14:32:27 +01:00
viktorljung ddde50b690 Inverse seems to be the same as -w 2016-03-09 14:27:50 +01:00
Jace 4c184b8f44 Merge pull request #186 from teamfisk/BoneAttachmentFix
BoneAttachments now working perfectly
2016-03-09 13:51:51 +01:00
viktorljung 555b19c41d BoneAttachments now working perfectly 2016-03-09 13:49:28 +01:00
William Moberg 4ae39dcc36 Merge pull request #182 from teamfisk/DamageIndicator
Friendly fire gives no DamageIndicator
2016-03-09 13:26:57 +01:00
stiffly 67ccb5bee5 Merge remote-tracking branch 'origin/master' into FriendlyHost/Join 2016-03-09 13:23:31 +01:00
viktorljung 70ec075887 3rd person aim improvements 2016-03-09 13:19:56 +01:00
Adam Byléhn 31ed606ef9 Merge pull request #183 from teamfisk/Menu
Menu
2016-03-09 12:33:36 +01:00
Tleety c9c462f695 The console now print some info when you are trying to connect to server 2016-03-09 12:31:37 +01:00
Tleety 704242597a Merge remote-tracking branch 'origin/master' into Menu
# Conflicts:
#	resources/Schema/Components.xsd
#	resources/Schema/Entities/NewMapWSpectatorCam.xml
#	resources/Schema/Types/Entity.xsd
#	src/Game/Game.cpp
2016-03-09 11:49:42 +01:00
Tobias Dahl 00478b4f12 Merge pull request #184 from teamfisk/TeamPickCamera
Tiny compiler bug fix.
2016-03-09 11:46:30 +01:00
William Moberg f24a5a36b4 Tiny compiler bug fix. 2016-03-09 11:44:07 +01:00
Tobias Dahl 697da620d3 Merge pull request #179 from teamfisk/TeamPickCamera
Spectator camera system
2016-03-09 11:41:05 +01:00
William Moberg 534d6639e5 Class enum instead of hardcoded ints.
Removed superfluous .Valid() checks.

Check for spectator spawnrequest in case they somehow has a class, so we don't get "x players were supposed to be spawned but failed" if it happens.
2016-03-09 11:35:32 +01:00
William Moberg b782e73556 Falsified DepthSort for SpectatorCamera buttons and CP-HUD elements. 2016-03-09 10:56:05 +01:00
verysecrethero 6456df8ce1 DamageIndicator is now disabled for Friendly fire 2016-03-09 10:44:08 +01:00
stiffly c1f38a71ba Merge remote-tracking branch 'origin/master' into FriendlyHost/Join 2016-03-09 10:12:57 +01:00
stiffly d7c30450dc Should now read servername from config. 2016-03-09 10:08:23 +01:00
Tobias Dahl 30e1c2c247 Merge pull request #178 from teamfisk/NetworkComponent
Network component
2016-03-09 10:04:40 +01:00
stiffly 4abe73eae7 Merge remote-tracking branch 'origin/master' into FriendlyHost/Join 2016-03-09 10:00:44 +01:00
Tleety 95f68cc888 ConnectRequest event and some other shit 2016-03-08 22:24:32 +01:00
William Moberg 6c673db2f4 Merge branch 'TeamPickCamera' of github.com:teamfisk/TacticalZ into TeamPickCamera 2016-03-08 19:24:55 +01:00
William Moberg 7bc3c9f7b1 Don't force to spectator camera if player presses pickTeam/Class prematurely. Players team should be remembered after picked, spawn request is not erased anymore. 2016-03-08 18:26:17 +01:00
Tleety 3394d65055 Servers now show up in the server list. 2016-03-08 18:13:21 +01:00
verysecrethero 7ee4ea637b Merge remote-tracking branch 'origin/master' into TeamPickCamera 2016-03-08 17:30:22 +01:00
William Moberg e5dba6604b Merge pull request #181 from teamfisk/AmmoPickup
AmmoPickupSystem should now be able to give ammo to all classtypes
2016-03-08 17:09:37 +01:00
Tleety 280de0e984 Merge remote-tracking branch 'origin/FriendlyHost/Join' into Menu
# Conflicts:
#	include/Game/Systems/MainMenuSystem.h
#	src/Engine/GUI/MainMenuSystem.cpp
2016-03-08 17:03:50 +01:00
stiffly 17e2ebeaa7 Merge remote-tracking branch 'origin/master' into FriendlyHost/Join
# Conflicts:
#	include/Engine/Network/Client.h
2016-03-08 16:59:24 +01:00
Tleety 1d8b5abfde Fuck aff 2016-03-08 16:53:35 +01:00
Tleety ba9208085b WIP 2016-03-08 16:52:56 +01:00
verysecrethero 52d3cb3ebf GetPlayerAmmo is now a SetPlayerAmmo instead to fix some potential problems if the player has no weapon at all 2016-03-08 16:33:08 +01:00
Teejoon d51bea798a Merge remote-tracking branch 'origin/Render_Optimization' into RendererBugFixes 2016-03-08 16:20:23 +01:00
Teejoon 155d700a44 WIP 2016-03-08 16:19:56 +01:00
Tleety f8ab52c72c WIP 2016-03-08 16:15:54 +01:00
verysecrethero e43a7be7db DamageIndicatorSystem now works for singleplayer again. Friendly fire DamageIndicator is now black color. 2016-03-08 15:55:51 +01:00
viktorljung f934f972e8 Merge remote-tracking branch 'origin/Weapons' into Movement
# Conflicts:
#	resources/Schema/Entities/PlayerDefenderBlue.xml
2016-03-08 14:34:21 +01:00
viktorljung 8d1877321a Fixed BoneAttachment offset rotation 2016-03-08 14:32:50 +01:00
Tleety a0ca4df3be Some server list components and entities. 2016-03-08 13:29:21 +01:00
viktorljung f77a610519 Dash now looking good 2016-03-08 13:26:01 +01:00
William Moberg d7f09b1a8f Added clickable buttons to switch to class/team screens, as a better alternative to Comma/Period on the keyboard. 2016-03-08 11:59:15 +01:00
verysecrethero 68b0175b3d Merge remote-tracking branch 'origin/master' into AmmoPickup 2016-03-08 11:54:57 +01:00
verysecrethero 0e0a486c01 AmmoPickupSystem should now be able to give ammo to all classtypes 2016-03-08 11:48:54 +01:00
viktorljung 2ba245368b Improved movement animaitons
Added a SetBlendWeight event that sets the weight for all nodes with a name.
2016-03-08 11:21:40 +01:00
Teejoon 82a7ff2ec3 Merge remote-tracking branch 'origin/master' into RendererBugFixes 2016-03-08 11:18:25 +01:00
Teejoon e902110d4b Commiting the files since they didn't get commited 2016-03-08 11:16:56 +01:00
Teejoon 13aa476656 Sets most texture to 0 when variable is initialized 2016-03-08 11:16:20 +01:00
Tleety 01f29b6d4e Blur behind buttons/sprites should now be working as intended. 2016-03-08 11:14:09 +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
Tleety 6b7f598c4d WIP 2016-03-07 23:35:58 +01:00
Tleety 5c0d9070c7 WIP 2016-03-07 23:25:06 +01:00
Jace 77b9112f55 Since I overwrote the assets I was sent with a now reverted commit, Defender weapon reload animations won't work until it's exported properly 2016-03-07 20:04:22 +01:00
Jace 7b0f887332 fixup! fixup! Disabled InputCommand processing while you fiddle with editor UI elements 2016-03-07 19:59:57 +01:00
FakeShemp e494f6a495 Merge branch 'master' into Shadows 2016-03-07 19:46:04 +01:00
FakeShemp 2049d630e9 Revert "Revert "Shadows""
This reverts commit 73b8bff1f3.
2016-03-07 19:45:46 +01:00
Jace 3fda25b604 Working first person animations for AssaultWeapon and DefenderWeapon and reload effect for AssaultWeapon 2016-03-07 19:38:49 +01:00
Jace 67ce6c5ae6 Added Speed and Delay fields to explosion effect. 2016-03-07 19:38:02 +01:00
Jace 1a403b9b88 TextFieldReader now loops through parents if the entity field was empty and the current entity didn't have a component of that type. 2016-03-07 17:55:00 +01:00
Jace f923872e51 fixup! Disabled InputCommand processing while you fiddle with editor UI elements 2016-03-07 17:54:01 +01:00
Jace abc447b937 Updated snapshot filter to ignore the new animation components 2016-03-07 17:53:47 +01:00
Jace 8bcb15a128 Disabled InputCommand processing while you fiddle with editor UI elements 2016-03-07 17:53:32 +01:00
Jace b000bb2597 Cleaned up old entities 2016-03-07 17:53:11 +01:00
Teejoon fd994ca93d Deleting texture thats getting rended too. 2016-03-07 17:52:47 +01:00
William Moberg fcf87104c3 Replaced test textures for class picking with more proper icons. 2016-03-07 17:50:03 +01:00
William Moberg 1516ed8e2d Removed debug logging. PlayerID in InputCommands from buttons is corrected. 2016-03-07 17:35:01 +01:00
stiffly 9e8df340b3 Merge remote-tracking branch 'origin/master' into NetworkComponent
# Conflicts:
#	src/Engine/Network/Server.cpp
2016-03-07 17:21:24 +01:00
verysecrethero 2cfbe0f785 Merge remote-tracking branch 'origin/master' into AmmoPickup 2016-03-07 17:17:51 +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
stiffly b629ed5e2b Updated some known xml entities that should be send in snapshots. 2016-03-07 17:15:56 +01:00
stiffly f00fb836fb Oops. 2016-03-07 17:10:13 +01:00
stiffly 13c3bcb290 Now only entities with NetworkComponent will be send in Snapshots. 2016-03-07 16:52:51 +01:00
Tleety 7de95d4cb5 Mainmenu entity 2016-03-07 16:34:56 +01:00
stiffly f585f9ada9 Created the NetworkComponent xml file 2016-03-07 16:11:19 +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
William Moberg 962521fa59 Merge branch 'master' into TeamPickCamera
# Conflicts:
#	src/Game/Systems/PlayerDeathSystem.cpp
2016-03-07 15:20:46 +01:00
Adam Byléhn 9c3fa25834 Merge pull request #176 from teamfisk/PlayerHUD
Player hud
2016-03-07 15:14:37 +01:00
William Moberg 282e0bf7c4 Only set spectator camera if player haven't spawned already. Don't spawn player if they switch to class pick screen. 2016-03-07 15:05: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
Teejoon b38ebbe676 Shadows now working on NVIDIA cards too 2016-03-07 14:00:08 +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
William Moberg 0dfe00b406 Unlocks mouse when changing to SpectatorCamera and locking when respawning. 2016-03-04 09:49:27 +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
William Moberg 7a2f1ac9fd Merge branch 'Weapons' into TeamPickCamera 2016-03-04 08:34:27 +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
William Moberg 03843774d7 Moved buttons and fixed so you can't spawn with no class. 2016-03-04 07:01:47 +01:00
William Moberg 2ecc53ecca Merge branch 'master' into TeamPickCamera
# Conflicts:
#	src/Game/Game.cpp
2016-03-04 05:58:49 +01:00
William Moberg 06614aa907 SpectatorCameraSystem handles the overwatch cameras. Set camera to a class pick screen when connecting. Cannot spawn until both team and class has been picked.
Preparations for class aware PlayerSpawnSystem.
2016-03-04 05:41:29 +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
FakeShemp 315eac1af9 try not to assume things. 2016-03-03 15:10:27 +01:00
FakeShemp 4ee52b74bf Fix broken shader in. 2016-03-03 15:04:10 +01:00
FakeShemp d2f47e754f Remove shitty commented out thingie causing an error 2016-03-03 14:46:01 +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 a0f2f2bf5f Merge remote-tracking branch 'origin/master' into Shadows 2016-03-03 03:30:01 +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
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
viktorljung e9bbb5ed2a Fixed BlendTree crash when animation nodes are null 2016-03-02 17:42:55 +01:00
Tleety 8b66d29adc Skeleton system for Boost icons 2016-03-02 17:32:45 +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
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
Tleety cdbc348cfa AbilityCooldownHUD should now correctly track cooldown for dash ability. 2016-03-02 14:46:37 +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
viktorljung 8422742a9e Merge remote-tracking branch 'origin/master' into Animations
# Conflicts:
#	src/Engine/Rendering/DrawFinalPass.cpp
2016-03-02 13:50:08 +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
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
FakeShemp 1ae2f3f5f3 Begin clean-up 2016-03-01 19:10:13 +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
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
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
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
viktorljung 5bc0483f49 Removed AnimationOffset and improved BlendTree 2016-02-29 15:51:37 +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
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
Tleety b1a59e0ed2 Includes now use the key #include. Fixed a bug where it would crash if the file is not found. Fixed a bug where null terminators where included from the included file, causing it to stop reading after the first included file. 2016-02-26 17:46:18 +01:00
FakeShemp 22c391df54 Initial work on texture arrays 2016-02-26 17:40:35 +01:00
Tleety b3038ef713 Includes are now supported in shader with the key #GLSL 2016-02-26 16:33:55 +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
antc13 d9afb527a4 Merge branch 'master' of https://github.com/teamfisk/TacticalZ 2016-02-25 16:06: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
viktorljung 606a9bf94f BlendTree now working but has some memory leaks 2016-02-23 17:06:41 +01:00
stiffly 8a04e87494 The serverlist is displayed when pressing connect button. 2016-02-23 14:31:35 +01:00
viktorljung 127edb4e60 Fixed some memory leaks 2016-02-22 17:47:30 +01:00
viktorljung abd36c81f8 Added BlendTree that stores and blends multiple animations 2016-02-22 15:58:38 +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
FakeShemp 178402e964 cascade shadow wip 2016-02-18 10:08:29 +01:00
viktorljung debb1881bf BoneAttachment working 2016-02-17 15:48:45 +01:00
viktorljung db8bc612bd AdditiveBlend now working, needs cleanup 2016-02-17 14:55:02 +01:00
viktorljung e7118ce8e5 WIP 2016-02-17 10:52:50 +01: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
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
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
281 changed files with 76631 additions and 8846 deletions
+1 -1
Submodule assets updated: 72530423ad...3af64d8b1f
+3 -2
View File
@@ -10,8 +10,9 @@ namespace Events
struct PlayerDeath : Event
{
//KilledBy,KilledByWhat is optional for now. It might be used later in the playerlog-system
EntityWrapper Player;
std::string KilledByWhat;
EntityWrapper Player = EntityWrapper::Invalid;
EntityWrapper Killer = EntityWrapper::Invalid;
std::string KilledByWhat = "";
};
}
+3 -1
View File
@@ -23,11 +23,13 @@ struct EntityWrapper
static const EntityWrapper Invalid;
const std::string Name();
const std::string Name() const;
bool HasComponent(const std::string& componentType);
void AttachComponent(const char* componentName);
EntityWrapper Parent();
EntityWrapper FirstParentByName(const std::string& parentEntityName);
EntityWrapper FirstChildByName(const std::string& name);
EntityWrapper FirstLevelChildByName(const std::string& name);
EntityWrapper FirstParentWithComponent(const std::string& componentType);
EntityWrapper Clone(EntityWrapper parent = EntityWrapper::Invalid);
std::vector<EntityWrapper> ChildrenWithComponent(const std::string& componentType);
+1 -1
View File
@@ -68,7 +68,7 @@ protected:
const std::string m_ComponentType;
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) = 0;
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& scoreScreen, double dt) = 0;
};
class ImpureSystem : public virtual System
@@ -12,8 +12,8 @@ template <typename EventContext>
class EditorCameraInputController : public FirstPersonInputController<EventContext>
{
public:
EditorCameraInputController(EventBroker* eventBroker, unsigned int playerID)
: FirstPersonInputController(eventBroker, playerID)
EditorCameraInputController(EventBroker* eventBroker, unsigned int playerID, EntityWrapper playerEntity)
: FirstPersonInputController(eventBroker, playerID, playerEntity)
{
EVENT_SUBSCRIBE_MEMBER(m_EMousePress, &EditorCameraInputController::OnMousePress);
EVENT_SUBSCRIBE_MEMBER(m_EMouseRelease, &EditorCameraInputController::OnMouseRelease);
+1
View File
@@ -22,6 +22,7 @@
#include "../Core/ELockMouse.h"
#include "../Core/EFileDropped.h"
#include "../Rendering/Texture.h"
#include "Game/Events/ESpawnerSpawn.h"
class EditorGUI
{
+6 -3
View File
@@ -1,3 +1,6 @@
#ifndef EditorRenderSystem_h__
#define EditorRenderSystem_h__
#include "../Core/System.h"
#include "../Rendering/IRenderer.h"
#include "../Rendering/ModelJob.h"
@@ -14,11 +17,11 @@ public:
private:
IRenderer* m_Renderer;
RenderFrame* m_RenderFrame;
Camera* m_Camera;
Camera* m_EditorCamera;
EntityWrapper m_CurrentCamera = EntityWrapper::Invalid;
EventRelay<EditorRenderSystem, Events::SetCamera> m_ESetCamera;
bool OnSetCamera(Events::SetCamera& e);
};
void enqueueModel(RenderScene& scene, EntityWrapper entity, const glm::mat4& modelMatrix, const std::string& modelResource, ComponentWrapper cModel, bool wireframe);
};
#endif
@@ -1,27 +0,0 @@
#ifndef EditorWidgetRenderSystem_h__
#define EditorWidgetRenderSystem_h__
#include "../Core/System.h"
#include "../Rendering/IRenderer.h"
#include "../Rendering/ModelJob.h"
#include "../Rendering/Camera.h"
#include "../Rendering/ESetCamera.h"
class EditorWidgetRenderSystem : public ImpureSystem
{
public:
EditorWidgetRenderSystem(SystemParams params, IRenderer* renderer, RenderFrame* renderFrame);
virtual void Update(double dt) override;
private:
IRenderer* m_Renderer;
RenderFrame* m_RenderFrame;
Camera* m_EditorCamera;
EntityWrapper m_CurrentCamera = EntityWrapper::Invalid;
EventRelay<EditorWidgetRenderSystem, Events::SetCamera> m_ESetCamera;
bool OnSetCamera(Events::SetCamera& e);
};
#endif
+186 -28
View File
@@ -6,12 +6,14 @@
#include "../Core/ELockMouse.h"
#include "../Game/Events/EDashAbility.h"
#include "InputHandler.h"
#include "Rendering/EAutoAnimationBlend.h"
#include "Rendering/ESetBlendWeight.h"
template <typename EventContext>
class FirstPersonInputController : public InputController<EventContext>
{
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 Rotation() const { return m_Rotation; }
@@ -30,9 +32,12 @@ public:
void AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, double& assaultDashCoolDownTimer, EntityID playerID);
virtual bool AssaultDashDoubleTapped() const { return m_AssaultDashDoubleTapped; }
virtual bool PlayerIsDashing() const { return m_PlayerIsDashing; }
bool SpecialAbilityKeyDown() const { return m_SpecialAbilityKeyDown; }
protected:
const int m_PlayerID;
EntityWrapper m_PlayerEntity;
bool m_MouseLocked = false;
glm::vec3 m_Rotation;
glm::vec3 m_Movement;
@@ -41,7 +46,6 @@ protected:
bool m_Crouching = false;
//assault dash membervariables - needed to calculate the doubletap- and dashlogic
double m_AssaultDashDoubleTapDeltaTime = 0.0;
double m_DashEffectResetTimer = 0.0;
//i will let m_AssaultDashDoubleTapSensitivityTimer stay hardcoded, its not really a gamevariable (more an inputvariable),
//and its very unlikely that someone wants to change that value
const float m_AssaultDashDoubleTapSensitivityTimer = 0.25f;
@@ -64,9 +68,10 @@ protected:
};
template <typename EventContext>
FirstPersonInputController<EventContext>::FirstPersonInputController(EventBroker* eventBroker, int playerID)
FirstPersonInputController<EventContext>::FirstPersonInputController(EventBroker* eventBroker, int playerID, EntityWrapper playerEntity)
: InputController(eventBroker)
, m_PlayerID(playerID)
, m_PlayerEntity(playerEntity)
{
EVENT_SUBSCRIBE_MEMBER(m_ELockMouse, &FirstPersonInputController::OnLockMouse);
EVENT_SUBSCRIBE_MEMBER(m_EUnlockMouse, &FirstPersonInputController::OnUnlockMouse);
@@ -105,7 +110,6 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
if (e.Command == "Pitch") {
float val = glm::radians(e.Value);
m_Rotation.x += -val;
//m_Rotation.x = glm::clamp(m_Rotation.x, -glm::half_pi<float>(), glm::half_pi<float>());
}
if (e.Command == "Yaw") {
@@ -117,16 +121,155 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
if (e.Command == "Forward") {
float val = glm::clamp(e.Value, -1.f, 1.f);
m_Movement.z = -val;
//Animation
if (m_PlayerEntity.Valid()) {
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
if (playerModel.Valid()) {
if (val > 0) { // Walk/Run
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
if (m_Crouching) {
aeb.NodeName = "Walk";
} else {
aeb.NodeName = "Run";
}
aeb.RootNode = playerModel;
aeb.Start = true;
aeb.SingleLevelBlend = true;
m_EventBroker->Publish(aeb);
} else if (val < 0) { // Walk/run Backwards
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
if (m_Crouching) {
aeb.NodeName = "Walk";
} else {
aeb.NodeName = "Run";
}
aeb.RootNode = playerModel;
aeb.Start = true;
aeb.SingleLevelBlend = true;
aeb.Reverse = true;
m_EventBroker->Publish(aeb);
}
}
EntityWrapper firstPersonModel = m_PlayerEntity.FirstChildByName("Hands");
if (firstPersonModel.Valid()) {
if (val > 0) { // Walk/Run
if (!m_Crouching) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "Run";
aeb.RootNode = firstPersonModel;
aeb.Start = true;
m_EventBroker->Publish(aeb);
}
} else if (val < 0) { // Walk/run Backwards
if (!m_Crouching) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "Run";
aeb.RootNode = firstPersonModel;
aeb.Start = true;
aeb.Reverse = true;
m_EventBroker->Publish(aeb);
}
}
}
}
}
if (e.Command == "Right") {
float val = glm::clamp(e.Value, -1.f, 1.f);
m_Movement.x = val;
}
if (glm::length2(m_Movement) > 0) {
m_Movement = glm::normalize(m_Movement);
//Animation
if (m_PlayerEntity.Valid()) {
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
if (playerModel.Valid()) { //Right Strafe
if (val > 0) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "Right";
aeb.RootNode = playerModel;
aeb.SingleLevelBlend = true;
aeb.Start = true;
m_EventBroker->Publish(aeb);
} else if (val < 0) { //LeftStrafe
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "Left";
aeb.RootNode = playerModel;
aeb.SingleLevelBlend = true;
aeb.Start = true;
m_EventBroker->Publish(aeb);
}
}
}
}
}
//Animation
if (glm::length2(m_Movement) < 0.25f) {
//Blend to Idle
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;
aeb.Start = true;
m_EventBroker->Publish(aeb);
}
EntityWrapper firstPersonModel = m_PlayerEntity.FirstChildByName("Hands");
if (firstPersonModel.Valid()) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "Idle";
aeb.RootNode = firstPersonModel;
aeb.Start = true;
m_EventBroker->Publish(aeb);
}
}
} else {
//Blend to movement
if (m_PlayerEntity.Valid()) {
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
if (playerModel.Valid()) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "DirectionBlend";
aeb.RootNode = playerModel;
m_EventBroker->Publish(aeb);
}
}
}
if (glm::length2(m_Movement) > 0) {
m_Movement = glm::normalize(m_Movement);
//Animation
// movement direction blend
if (m_PlayerEntity.Valid()) {
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
if (playerModel.Valid()) {
glm::vec2 direction = glm::normalize(glm::vec2(m_Movement.x, m_Movement.z));
double weight = glm::abs(glm::dot(glm::vec2(1, 0), direction));
Events::SetBlendWeight sbw;
sbw.NodeName = "DirectionBlend";
sbw.Weight = weight;
sbw.RootNode = playerModel;
m_EventBroker->Publish(sbw);
}
}
}
if (e.Command == "Forward" || e.Command == "Right") {
if (e.Value != 0) {
m_CurrentDirectionVector = e.Command == "Right" ? (e.Value > 0 ? "Right" : "Left") : (e.Value > 0 ? "Forward" : "Backward");
@@ -145,10 +288,10 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
if (m_NumberOfMovementKeysDown == 0) {
m_MovementKeyDown = false;
}
//you have just released the key, store what key it was and reset the doubletap-sensitivity-timer
m_AssaultDashTapDirection = m_CurrentDirectionVector;
m_AssaultDashDoubleTapDeltaTime = 0.f;
//you have just released the key, store what key it was and reset the doubletap-sensitivity-timer
m_AssaultDashTapDirection = m_CurrentDirectionVector;
m_AssaultDashDoubleTapDeltaTime = 0.f;
}
}
@@ -158,21 +301,42 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
if (e.Command == "Crouch") {
m_Crouching = e.Value > 0;
//Animation
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.Value > 0) {
m_SpecialAbilityKeyDown = true;
} else {
m_SpecialAbilityKeyDown = false;
}
}
if (m_SpecialAbilityKeyDown && m_MovementKeyDown) {
m_ShiftDashing = true;
} else {
m_ShiftDashing = false;
m_SpecialAbilityKeyDown = e.Value > 0;
}
m_ShiftDashing = m_SpecialAbilityKeyDown && m_MovementKeyDown;
return true;
}
@@ -193,17 +357,10 @@ bool FirstPersonInputController<EventContext>::OnLockMouse(const Events::LockMou
template <typename EventContext>
void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, double& assaultDashCoolDownTimer, EntityID playerID) {
m_AssaultDashDoubleTapDeltaTime += dt;
m_DashEffectResetTimer += dt;
assaultDashCoolDownTimer -= dt;
//cooldown = assaultDashCoolDownMaxTimer sec, pretend the dash lasts 0.25 sec (for friction to do its work)
if (assaultDashCoolDownTimer > (assaultDashCoolDownMaxTimer - 0.25f)) {
m_PlayerIsDashing = true;
if (m_DashEffectResetTimer > 0.05) {
Events::DashAbility e;
e.Player = playerID;
m_EventBroker->Publish(e);
m_DashEffectResetTimer = 0.0;
}
} else {
m_PlayerIsDashing = false;
}
@@ -215,6 +372,7 @@ void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool
assaultDashCoolDownTimer = assaultDashCoolDownMaxTimer;
m_AssaultDashDoubleTapped = true;
m_AssaultDashDoubleTapDeltaTime = 0.f;
Events::DashAbility e;
e.Player = playerID;
m_EventBroker->Publish(e);
+1 -1
View File
@@ -18,7 +18,7 @@ public:
void LoadBindings(std::string file);
void Update(double dt);
void Process();
void Process(bool suppressNewEvents = false);
template <typename T>
void AddHandler();
void Publish(const Events::InputCommand& e);
+8 -14
View File
@@ -17,6 +17,7 @@
#include "Network/TCPClient.h"
#include "Network/SnapshotDefinitions.h"
#include "Core/World.h"
#include "Core/EntityFile.h"
#include "Core/EventBroker.h"
#include "Core/ConfigFile.h"
#include "Core/EPlayerDeath.h"
@@ -29,19 +30,8 @@
#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;
};
#include "Network/EDisplayServerlist.h"
#include "Network/EConnectRequest.h"
class Client : public Network
{
public:
@@ -52,7 +42,7 @@ public:
void Connect(std::string address, int port);
void Update() override;
private:
UDPClient m_Unreliable;
//UDPClient m_Unreliable;
TCPClient m_Reliable;
std::vector<Events::PlayerSpawned> m_PlayerSpawnEvents;
void parseSpawnEvents();
@@ -119,6 +109,8 @@ private:
void sendLocalPlayerTransform();
void becomePlayer();
void displayServerlist();
void removeWorld();
void createMainMenu();
// Mapping Logic
// Returns if local EntityID exist in map
bool clientServerMapsHasEntity(EntityID clientEntityID);
@@ -139,6 +131,8 @@ private:
bool OnDoubleJump(Events::DoubleJump & e);
EventRelay<Client, Events::DashAbility> m_EDashAbility;
bool OnDashAbility(const Events::DashAbility& e);
EventRelay<Client, Events::ConnectRequest> m_EConnectRequest;
bool OnConnectRequest(const Events::ConnectRequest& e);
bool OnSearchForServers(const Events::SearchForServers& e);
UDPClient m_ServerlistRequest;
+17
View File
@@ -0,0 +1,17 @@
#ifndef Events_ConnectRequest_h__
#define Events_ConnectRequest_h__
#include "Core/EventBroker.h"
namespace Events
{
struct ConnectRequest : public Event
{
std::string IP = "";
int Port = 0;
};
}
#endif
@@ -0,0 +1,29 @@
#ifndef Events_DisplayServerlist_h__
#define Events_DisplayServerlist_h__
#include <string>
#include <vector>
#include "Core/Event.h"
struct ServerInfo
{
ServerInfo(std::string address, int port, std::string name, int players)
{
Address = address; Port = port; Name = name; PlayersConnected = players;
}
std::string Address = "";
int Port = 0;
std::string Name = "";
int PlayersConnected = 0;
};
namespace Events
{
struct DisplayServerlist : public Event
{
std::vector<ServerInfo> Serverlist;
};
}
#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
+1 -1
View File
@@ -11,7 +11,7 @@ class NetworkClient
public:
NetworkClient();
virtual ~NetworkClient();
virtual void Connect(std::string playerName, std::string address, int port) = 0;
virtual bool Connect(std::string playerName, std::string address, int port) = 0;
virtual void Disconnect() = 0;
virtual void Receive(Packet& packet) = 0;
virtual void Send(Packet & packet) = 0;
+3 -1
View File
@@ -24,7 +24,9 @@ public:
{
// Check if we are trying to add more than the package can fit.
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();
}
memcpy(m_Data + m_Offset, &val, sizeof(T));
+9 -2
View File
@@ -21,6 +21,9 @@
#include "Core/EEntityDeleted.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
{
@@ -33,7 +36,7 @@ public:
private:
// Network channels
TCPServer m_Reliable;
UDPServer m_Unreliable;
//UDPServer m_Unreliable;
UDPServer m_ServerlistRequest;
// dont forget to set these in the childrens receive logic
boost::asio::ip::address m_Address;
@@ -57,6 +60,7 @@ private:
std::vector<Events::InputCommand> m_InputCommandsToBroadcast;
//Timers
std::clock_t m_StartPingTime;
std::string m_ServerName = "";
// Packet loss logic
PacketID m_PacketID = 0;
@@ -77,7 +81,8 @@ private:
void parseOnPlayerDamage(Packet& packet);
void identifyPacketLoss();
void kick(PlayerID player);
PlayerID GetPlayerIDFromEndpoint();
PlayerID getPlayerIDFromEndpoint();
PlayerID getPlayerIDFromEntityID(EntityID entityID);
void parsePlayerTransform(Packet& packet);
void parseOnInputCommand(Packet& packet);
void parseClientPing();
@@ -103,6 +108,8 @@ private:
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
+1 -1
View File
@@ -10,7 +10,7 @@ public:
TCPClient();
~TCPClient();
void Connect(std::string playerName, std::string address, int port);
bool Connect(std::string playerName, std::string address, int port);
void Disconnect();
void Receive(Packet& packet);
void Send(Packet & packet);
+1 -1
View File
@@ -10,7 +10,7 @@ public:
UDPClient();
~UDPClient();
void Connect(std::string playerName, std::string address, int port);
bool Connect(std::string playerName, std::string address, int port);
void Disconnect();
void Receive(Packet& packet);
void Send(Packet & packet);
+27 -13
View File
@@ -3,27 +3,41 @@
#include "GLM.h"
#include "Common.h"
#include "Core/System.h"
#include "Core/ResourceManager.h"
#include "../Common.h"
#include "../Core/System.h"
#include "../Core/ResourceManager.h"
#include "Rendering/Model.h"
#include "Rendering/EAnimationComplete.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 "../Core/EEntityDeleted.h"
#include "Rendering/ESetBlendWeight.h"
#include "imgui/imgui.h"
class AnimationSystem : public PureSystem
class AnimationSystem : public ImpureSystem
{
public:
AnimationSystem(SystemParams params)
: System(params)
, PureSystem("Animation")
{
}
AnimationSystem(SystemParams params);
~AnimationSystem() { }
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& animationComponent, double dt) override;
virtual void Update(double dt) override;
private:
void CreateBlendTrees();
void UpdateAnimations(double dt);
void UpdateWeights(double dt);
EventRelay<AnimationSystem, Events::AutoAnimationBlend> m_EAutoAnimationBlend;
bool OnAutoAnimationBlend(Events::AutoAnimationBlend& e);
EventRelay<AnimationSystem, Events::EntityDeleted> m_EEntityDeleted;
bool OnEntityDeleted(Events::EntityDeleted& e);
EventRelay<AnimationSystem, Events::SetBlendWeight> m_ESetBlendWeight;
bool OnSetBlendWeight(Events::SetBlendWeight& e);
std::unordered_map<EntityWrapper, AutoBlendQueue> m_AutoBlendQueues;
};
#endif
+48
View File
@@ -0,0 +1,48 @@
#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();
bool Empty() { return m_BlendQueue.empty(); }
private:
std::list<AutoblendNode> m_BlendQueue;
};
#endif
+104
View File
@@ -0,0 +1,104 @@
#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);
std::vector<EntityWrapper> GetSingleLevelRoots(std::string name);
std::vector<EntityWrapper> GetEntitesByName(std::string name);
void SetWeightByName(std::string name, double weight);
private:
Skeleton* m_Skeleton = nullptr;
Node* m_Root = nullptr;
std::vector<glm::mat4> m_FinalPose;
std::map<int, glm::mat4> m_FinalBoneTransforms;
std::vector<BlendTree::Node*> FindNodesByName(std::string name);
std::vector<glm::mat4> AccumulateFinalPose();
BlendTree::Node* FillTreeByName(Node* parentNode, std::string name, EntityWrapper parentEntity);
void Blend(std::map<int, Skeleton::PoseData>& pose);
};
#endif
+70
View File
@@ -0,0 +1,70 @@
#ifndef BlurHUD_h__
#define BlurHUD_h__
#include "IRenderer.h"
#include "DrawBloomPassState.h"
//#include "LightCullingPass.h" Finalpass om den skall skickas in
#include "FrameBuffer.h"
#include "ShaderProgram.h"
//#include "Util/UnorderedMapVec2.h"
#include "Texture.h"
class BlurHUD
{
public:
BlurHUD(IRenderer* renderer);
~BlurHUD() { }
void InitializeTextures();
void InitializeFrameBuffers();
void InitializeShaderPrograms();
void InitializeBuffers();
void ClearBuffer();
void FillGaussianBuffer(FrameBuffer* fb);
GLuint Draw(GLuint texture, RenderScene& scene);
void OnWindowResize();
void FillStencil(RenderScene& scene);
GLuint CombineTextures(GLuint texture1, GLuint texture2);
//Getters
//Return the blurred result of the texture that was sent into draw
GLuint GaussianTexture() const {
if (m_Quality == 0) {
return m_BlackTexture->m_Texture;
} else {
return m_GaussianTexture_vert;
}
}
private:
Texture* m_BlackTexture;
Model* m_ScreenQuad;
const IRenderer* m_Renderer;
ConfigFile* m_Config;
//const LightCullingPass* m_LightCullingPass
int m_Iterations = 3;
int m_Quality = 0;
float m_BlurQuality = 4.f;
GLuint m_GaussianTexture_horiz = 0;
GLuint m_GaussianTexture_vert = 0;
GLuint m_DepthStencil_horiz = 0;
GLuint m_DepthStencil_vert = 0;
GLuint m_CombinedTexture = 0;
FrameBuffer m_GaussianFrameBuffer_horiz;
FrameBuffer m_GaussianFrameBuffer_vert;
FrameBuffer m_CombinedTextureBuffer;
ShaderProgram* m_GaussianProgram_horiz;
ShaderProgram* m_GaussianProgram_vert;
ShaderProgram* m_FillDepthStencilProgram;
ShaderProgram* m_CombineTexturesProgram;
};
#endif
@@ -8,6 +8,7 @@
#include "Core/ResourceManager.h"
#include "Rendering/Model.h"
#include "Rendering/Skeleton.h"
#include "Rendering/BlendTree.h"
//Needs to be a higher orderlevel than AnimationSystem
class BoneAttachmentSystem : public PureSystem
+1 -1
View File
@@ -15,7 +15,7 @@ public:
void GenerateCubeMapTexture();
//GLuint CubeMapTexture() const { return m_CubeMapTexture; }
GLuint m_CubeMapTexture = -1;
GLuint m_CubeMapTexture = 0;
private:
IRenderer* m_Renderer;
+1 -1
View File
@@ -13,7 +13,7 @@ class DrawBloomPass
{
public:
DrawBloomPass(IRenderer* renderer, ConfigFile* config);
~DrawBloomPass() { }
~DrawBloomPass();
void InitializeTextures();
void InitializeFrameBuffers();
void InitializeShaderPrograms();
+17 -8
View File
@@ -11,16 +11,18 @@
#include "Util/UnorderedMapVec2.h"
#include "Util/CommonFunctions.h"
#include "Texture.h"
#include "ShadowPass.h"
#include "BlurHUD.h"
class DrawFinalPass
{
public:
DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass);
~DrawFinalPass() { }
DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass);
~DrawFinalPass();
void InitializeTextures();
void InitializeFrameBuffers();
void InitializeShaderPrograms();
void Draw(RenderScene& scene);
void Draw(RenderScene& scene, BlurHUD* blurHUDPass);
void ClearBuffer();
void OnWindowResize();
@@ -28,6 +30,10 @@ public:
GLuint BloomTexture() const { return m_BloomTexture; }
//Return the texture with diffuse and lighting of the scene.
GLuint SceneTexture() const { return m_SceneTexture; }
//Return the SceneTexture with the blurred HUD bits.
GLuint CombinedSceneTexture() const { return m_CombinedTexture; }
//Return the blurred scene texture.
GLuint FullBlurredTexture() const { return m_FullBlurredTexture; }
//Return the framebuffer used in the scene rendering stage.
FrameBuffer* FinalPassFrameBuffer() { return &m_FinalPassFrameBuffer; }
@@ -52,11 +58,13 @@ private:
FrameBuffer m_FinalPassFrameBuffer;
FrameBuffer m_ShieldDepthFrameBuffer;
GLuint m_BloomTexture;
GLuint m_SceneTexture;
GLuint m_DepthBuffer;
GLuint m_ShieldBuffer;
GLuint m_CubeMapTexture;
GLuint m_BloomTexture = 0;
GLuint m_SceneTexture = 0;
GLuint m_DepthBuffer = 0;
GLuint m_ShieldBuffer = 0;
GLuint m_CubeMapTexture = 0;
GLuint m_FullBlurredTexture;
GLuint m_CombinedTexture; //This can be removed for less memory usage, just set m_sceneTexture to the return from m_BlurHUDPass.CombineTextures
//maqke this component based i guess?
GLuint m_ShieldPixelRate = 16;
@@ -65,6 +73,7 @@ private:
const LightCullingPass* m_LightCullingPass;
const CubeMapPass* m_CubeMapPass;
const SSAOPass* m_SSAOPass;
const ShadowPass* m_ShadowPass;
ShaderProgram* m_ForwardPlusProgram;
ShaderProgram* m_ExplosionEffectProgram;
@@ -0,0 +1,28 @@
#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
@@ -0,0 +1,20 @@
#ifndef Events_SetBlendWeight_h__
#define Events_SetBlendWeight_h__
#include "../Core/EventBroker.h"
#include "../Core/EntityWrapper.h"
namespace Events
{
//Sets the blend weight for all nodes with "NodeName"
struct SetBlendWeight : Event
{
EntityWrapper RootNode = EntityWrapper::Invalid;
std::string NodeName;
double Weight;
};
}
#endif
@@ -15,8 +15,8 @@
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, bool isShielded)
: ModelJob(model, camera, matrix, matGroup, modelComponent, world, fillColor, fillPercentage, isShielded)
ExplosionEffectJob(ComponentWrapper explosionEffectComponent, ::Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matGroup, ComponentWrapper modelComponent, ::World* world, glm::vec4 fillColor, float fillPercentage, bool isShielded, bool shadow)
: ModelJob(model, camera, matrix, matGroup, modelComponent, world, fillColor, fillPercentage, isShielded, shadow)
{
ExplosionOrigin = (glm::vec3)explosionEffectComponent["ExplosionOrigin"];
TimeSinceDeath = (double)explosionEffectComponent["TimeSinceDeath"];
+10
View File
@@ -43,6 +43,16 @@ public:
~RenderBuffer();
};
class Texture2DArray : public ResourceType<GL_TEXTURE_2D_ARRAY>
{
public:
Texture2DArray(GLuint* resourceHandle, GLenum attachment)
: ResourceType(resourceHandle, attachment)
{ };
~Texture2DArray();
};
class FrameBuffer
{
public:
+15 -31
View File
@@ -15,10 +15,11 @@
#include "../Core/Transform.h"
#include "Skeleton.h"
#include "ShaderProgram.h"
#include "BlendTree.h"
struct ModelJob : RenderJob
{
ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matProp, ComponentWrapper modelComponent, World* world, glm::vec4 fillColor, float fillPercentage, bool isShielded)
ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matProp, ComponentWrapper modelComponent, World* world, glm::vec4 fillColor, float fillPercentage, bool isShielded, bool shadow)
: RenderJob()
{
Model = model;
@@ -110,10 +111,11 @@ struct ModelJob : RenderJob
Color = modelComponent["Color"];
GlowIntensity = ((double)modelComponent["GlowIntensity"]);
Entity = modelComponent.EntityID;
glm::vec3 abspos = Transform::AbsolutePosition(world, modelComponent.EntityID);
glm::vec3 abspos = glm::vec3(matrix[3][0], matrix[3][1], matrix[3][2]);
glm::vec3 worldpos = glm::vec3(camera->ViewMatrix() * glm::vec4(abspos, 1));
Depth = worldpos.z;
World = world;
Shadow = shadow;
FillColor = fillColor;
FillPercentage = fillPercentage;
@@ -123,32 +125,14 @@ struct ModelJob : RenderJob
Skeleton = Model->m_RawModel->m_Skeleton;
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++) {
::Skeleton::AnimationData animationData;
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;
if(Skeleton->BlendTrees.find(entityWrapper) != Skeleton->BlendTrees.end()) {
BlendTree = Skeleton->BlendTrees.at(entityWrapper);
}
}
}
};
unsigned int TextureID;
@@ -164,13 +148,10 @@ struct ModelJob : RenderJob
std::vector<const ::RawModel::TextureProperties*> SpecularTexture;
std::vector<const ::RawModel::TextureProperties*> IncandescenceTexture;
float Shininess = 0.f;
glm::vec4 Color = glm::vec4(1.f, 1.f, 1.f, 1.f);
glm::vec4 Color;
const ::Model* Model = nullptr;
::Skeleton* Skeleton = nullptr;
std::vector<::Skeleton::AnimationData> Animations;
::Skeleton::AnimationOffset AnimationOffset;
std::shared_ptr<::BlendTree> BlendTree = nullptr;
float GlowIntensity = 8.0;
glm::vec4 DiffuseColor;
glm::vec4 SpecularColor;
@@ -182,10 +163,13 @@ struct ModelJob : RenderJob
glm::vec4 FillColor = glm::vec4(0);
float FillPercentage = 0.0;
bool IsShielded;
bool Wireframe = false;
bool Shadow;
void CalculateHash() override
{
Hash = ShaderID << 20 + ModelID << 10 + TextureID;
Hash = TextureID;
Hash += ModelID << 10;
Hash += ShaderID << 20;
}
};
+2 -2
View File
@@ -52,8 +52,8 @@ private:
std::unordered_map<glm::ivec2, PickingInfo> m_PickingColorsToEntity;
GLuint m_PickingTexture;
GLuint m_DepthBuffer;
GLuint m_PickingTexture = 0;
GLuint m_DepthBuffer = 0;
FrameBuffer m_PickingBuffer;
+5 -6
View File
@@ -16,16 +16,15 @@ struct RenderJob
public:
float Depth;
bool operator<(const RenderJob& rhs)
{
return this->Hash < rhs.Hash;
}
protected:
uint64_t Hash;
virtual void CalculateHash() = 0;
bool operator<(const RenderJob& rhs)
{
return this->Hash < rhs.Hash;
}
};
#endif
+1
View File
@@ -33,6 +33,7 @@ struct RenderScene
Rectangle Viewport;
bool ClearDepth = false;
bool ShouldBlur = false;
glm::vec4 AmbientColor;
void Clear()
-1
View File
@@ -25,7 +25,6 @@ public:
bool StencilMask(GLuint mask);
bool DepthMask(GLboolean flag);
bool DepthFunc(GLenum func);
bool PolygonMode(GLenum face, GLenum mode);
bool AlphaFunc(GLenum func, GLclampf thresholder);
private:
+5
View File
@@ -18,6 +18,7 @@
#include "DrawColorCorrectionPass.h"
#include "SSAOPass.h"
#include "CubeMapPass.h"
#include "BlurHUD.h"
#include "../Core/EventBroker.h"
#include "ImGuiRenderPass.h"
#include "Camera.h"
@@ -26,6 +27,7 @@
#include "TextPass.h"
#include "Util/CommonFunctions.h"
#include "Core/PerformanceTimer.h"
#include "ShadowPass.h"
class Renderer : public IRenderer
{
@@ -36,6 +38,7 @@ public:
: m_EventBroker(eventBroker)
, m_Config(config)
{ }
~Renderer();
virtual void Initialize() override;
virtual void Update(double dt) override;
@@ -75,6 +78,8 @@ private:
DrawColorCorrectionPass* m_DrawColorCorrectionPass;
SSAOPass* m_SSAOPass;
CubeMapPass* m_CubeMapPass;
ShadowPass* m_ShadowPass;
BlurHUD* m_BlurHUDPass;
//----------------------Functions----------------------//
void InitializeWindow();
+1 -1
View File
@@ -14,7 +14,7 @@ class SSAOPass
{
public:
SSAOPass(IRenderer* renderer, ConfigFile* config);
~SSAOPass() { };
~SSAOPass();
void ChangeQuality(int quality);
+2
View File
@@ -21,6 +21,8 @@ public:
std::string GetFileName() const;
GLuint GetHandle() const;
bool IsCompiled() const;
static std::string ReadFile(std::string fileName);
private:
protected:
GLenum m_ShaderType;
std::string m_FileName;
+87
View File
@@ -0,0 +1,87 @@
#ifndef ShadowPass_h__
#define ShadowPass_h__
#include "IRenderer.h"
#include "FrameBuffer.h"
#include "ShaderProgram.h"
#include "../Core/EventBroker.h"
#include "../Core/World.h"
#include "ShadowPassState.h"
#include "imgui/imgui.h"
#define MAX_SPLITS 4
enum NearFar { NEAR = 0, FAR = 1 };
enum LRBT { LEFT = 0, RIGHT = 1, BOTTOM = 2, TOP = 3 };
struct ShadowFrustum
{
float NearClip;
float FarClip;
float FOV;
float AspectRatio;
glm::vec3 MiddlePoint;
float Radius;
std::array<float, 4> LRBT;
std::array<glm::vec3, 8> CornerPoint;
};
class ShadowPass
{
public:
ShadowPass(IRenderer* renderer);
ShadowPass(IRenderer * renderer, int ShadowResX, int ShadowResY);
~ShadowPass();
void InitializeFrameBuffers();
void InitializeShaderPrograms();
void ClearBuffer();
void Draw(RenderScene& scene);
void DebugGUI();
GLuint DepthMap() const { return m_DepthMap; }
std::array<glm::mat4, MAX_SPLITS> LightP() const { return m_LightProjection; }
std::array<glm::mat4, MAX_SPLITS> LightV() const { return m_LightView; }
std::array<float, MAX_SPLITS> FarDistance() const { std::array<float, MAX_SPLITS> f; for (int i = 0; i < MAX_SPLITS; i++) f[i] = m_shadowFrusta[i].FarClip; return f; }
int CurrentNrOfSplits() const { return m_CurrentNrOfSplits; }
void SetSplitWeight(float split_weight) { m_SplitWeight = split_weight; };
private:
void InitializeCameras(RenderScene & scene);
void UpdateSplitDist(std::array<ShadowFrustum, MAX_SPLITS>& frusta, float near_distance, float far_distance);
void UpdateFrustumPoints(ShadowFrustum& frustum, glm::vec3 camera_position, glm::vec3 view_dir);
void UpdateFrustumPoints(ShadowFrustum& frustum, glm::mat4 p, glm::mat4 v);
void PointsToLightspace(ShadowFrustum& frustum, glm::mat4 v);
float FindRadius(ShadowFrustum& frustum);
void RadiusToLightspace(ShadowFrustum& frustum);
EventBroker* m_EventBroker;
const IRenderer* m_Renderer;
GLuint m_DepthMap;
FrameBuffer m_DepthBuffer;
ShaderProgram* m_ShadowProgram;
std::array<glm::mat4, MAX_SPLITS> m_LightProjection;
std::array<glm::mat4, MAX_SPLITS> m_LightView;
GLfloat m_NearFarPlane[2] = { -34.f, 27.f };
GLuint m_ResolutionSizeWidth = 1024 * 2;
GLuint m_ResolutionSizeHeight = 1024 * 2;
bool m_TransparentObjects = false;
bool m_TexturedShadows = false;
bool m_EnableShadows = true;
int m_CurrentNrOfSplits = 4;
float m_SplitWeight = 0.962f;
std::array<ShadowFrustum, MAX_SPLITS> m_shadowFrusta;
Texture* m_WhiteTexture = ResourceManager::Load<Texture>("Textures/Core/White.png");
};
#endif
@@ -0,0 +1,15 @@
#ifndef ShadowPassState_h_
#define ShadowPassState_h_
#include "Rendering/RenderState.h"
class ShadowPassState : public RenderState
{
public:
ShadowPassState(GLuint frameBuffer);
~ShadowPassState();
private:
};
#endif
+22 -55
View File
@@ -6,27 +6,9 @@
#include "../GLM.h"
#include <glm/gtx/matrix_decompose.hpp>
#include <imgui/imgui.h>
#include "../Core/EntityWrapper.h"
//struct Bone
//{
// 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 BlendTree;
class Skeleton
{
@@ -68,58 +50,43 @@ public:
std::map<int, std::vector<Keyframe>> JointAnimations;
};
struct AnimationData
{
const Animation* animation;
float time;
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;
struct PoseData {
glm::vec3 Translation;
glm::quat Orientation;
glm::vec3 Scale;
};
Skeleton() { }
~Skeleton();
Bone* RootBone;
std::map<int, Bone*> Bones;
std::unordered_map<EntityWrapper, std::shared_ptr<BlendTree>> BlendTrees;
// Attach a new bone to the skeleton
// Returns: New bone index
int CreateBone(int ID, int parentID, std::string name, glm::mat4 offsetMatrix);
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);
void AccumulateBoneTransforms(bool noRootMotion, std::vector<AnimationData> animations, std::map<int, glm::mat4>& frameBones, const Bone* bone, glm::mat4 parentMatrix);
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> GetFrameBones(const Animation* animation, double time, bool additive, bool noRootMotion = false);
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:
glm::mat4 GetOffsetTransform(const Bone* bone, AnimationOffset animationOffset);
Skeleton::PoseData GetAdditiveBonePose(const Bone* bone, const Animation* animation, double time);
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;
+6 -2
View File
@@ -7,6 +7,7 @@
#include "../GLM.h"
#include "../Core/ComponentWrapper.h"
#include "Texture.h"
#include "TextureSprite.h"
#include "Model.h"
#include "RenderJob.h"
#include "../Core/ResourceManager.h"
@@ -24,14 +25,16 @@ struct SpriteJob : RenderJob
::RawModel::MaterialProperties matProp = Model->MaterialGroups().front();
TextureID = 0;
DiffuseTexture = CommonFunctions::LoadTexture(cSprite["DiffuseTexture"], true);
DiffuseTexture = CommonFunctions::TryLoadResource<TextureSprite, true>(cSprite["DiffuseTexture"]);
IncandescenceTexture = CommonFunctions::LoadTexture(cSprite["GlowMap"], true);
IncandescenceTexture = CommonFunctions::TryLoadResource<TextureSprite, true>(cSprite["GlowMap"]);
StartIndex = matProp.material->StartIndex;
EndIndex = matProp.material->EndIndex;
Matrix = matrix;
Color = cSprite["Color"];
BlurBackground = (bool)cSprite["BlurBackground"];
Entity = cSprite.EntityID;
Position = Transform::AbsolutePosition(world, cSprite.EntityID);
Depth = 0;
@@ -65,6 +68,7 @@ struct SpriteJob : RenderJob
bool Pickable;
bool IsIndicator = false;
bool BlurBackground = false;
glm::vec4 FillColor = glm::vec4(0);
float FillPercentage = 0.0;
+1 -1
View File
@@ -9,7 +9,7 @@ class Texture : public BaseTexture
{
friend class ResourceManager;
private:
protected:
Texture(std::string path);
public:
+26
View File
@@ -0,0 +1,26 @@
#ifndef TextureSprite_h__
#define TextureSprite_h__
#include "../OpenGL.h"
#include "BaseTexture.h"
#include "Texture.h"
#include "PNG.h"
class TextureSprite : public Texture
{
friend class ResourceManager;
protected:
TextureSprite(std::string path);
public:
~TextureSprite();
void Bind(GLenum textureUnit = GL_TEXTURE0);
GLuint m_Texture = 0;
unsigned char* Data = nullptr;
};
#endif
@@ -8,7 +8,23 @@
namespace CommonFunctions
{
Texture* LoadTexture(std::string path, bool threaded);
//Loads Texture/SpriteTexture and return null if it fails
template <typename T, bool threaded>
Texture* TryLoadResource(std::string path)
{
Texture* img;
try {
img = ResourceManager::Load<T, threaded>(path);
} catch (const Resource::StillLoadingException&) {
img = ResourceManager::Load<T>("Textures/Core/ErrorTexture.png");
} catch (const std::exception&) {
img = nullptr;
}
return img;
}
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);
@@ -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
+12
View File
@@ -40,5 +40,17 @@ private:
};
std::vector<EntityAtMaxValuePickupStruct> m_PickupAtMaximum;
void DoPickup(EntityWrapper &player, EntityWrapper &trigger);
//class
enum class PlayerClass {
Assault,
Defender,
Sniper,
None
};
//helper methods
bool DoesPlayerHaveMaxAmmo(EntityWrapper &player);
PlayerClass DetermineClass(EntityWrapper &player);
void SetPlayerAmmo(EntityWrapper &player, int ammoGain);
int GetPlayerMaxAmmo(EntityWrapper &player);
};
#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
@@ -15,6 +15,7 @@
#include "Rendering/Util/CommonFunctions.h"
//#define INDICATOR_TEST
#include "Core/ConfigFile.h"
class DamageIndicatorSystem : public ImpureSystem
{
@@ -40,6 +41,8 @@ private:
std::vector<DamageIndicatorStruct> updateDamageIndicatorVector;
float CalculateAngle(EntityWrapper player, glm::vec3 enemyPos);
bool m_NetworkEnabled;
//for tests
#ifdef INDICATOR_TEST
glm::vec3 DamageIndicatorTest(EntityWrapper player);
+1 -1
View File
@@ -10,7 +10,7 @@ public:
: System(params)
, PureSystem("Lifetime")
{
LOG_INFO("ASDASDASSA");
}
virtual void Update(double dt) override;
@@ -1,15 +1,19 @@
#ifndef MainMenuSystem_h__
#define MainMenuSystem_h__
#include "../Core/System.h"
#include "../Rendering/IRenderer.h"
#include "../Core/ResourceManager.h"
#include "../Core/Event.h"
#include "Core/System.h"
#include "Rendering/IRenderer.h"
#include "Core/ResourceManager.h"
#include "Core/Event.h"
#include "Systems/SpawnerSystem.h"
#include "EButtonClicked.h"
#include "EButtonPressed.h"
#include "EButtonReleased.h"
#include "GUI/EButtonClicked.h"
#include "GUI/EButtonPressed.h"
#include "GUI/EButtonReleased.h"
#include "Input/EInputCommand.h"
#include "Network/ESearchForServers.h"
#include "Network/EConnectRequest.h"
class MainMenuSystem : public ImpureSystem
@@ -27,6 +31,11 @@ private:
bool OnButtonRelease(const Events::ButtonReleased& e);
EventRelay<MainMenuSystem, Events::ButtonPressed> m_EPressed;
bool OnButtonPress(const Events::ButtonPressed& e);
EventRelay<MainMenuSystem, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(const Events::InputCommand& e);
std::string m_CurrentCommand = "";
EntityWrapper m_OpenSubMenu = EntityWrapper::Invalid;
};
+3
View File
@@ -24,7 +24,10 @@ private:
bool OnPlayerDeath(Events::PlayerDeath& e);
EventRelay<PlayerDeathSystem, Events::EntityDeleted> m_EEntityDeleted;
bool OnEntityDeleted(Events::EntityDeleted& e);
EventRelay<PlayerDeathSystem, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(Events::InputCommand& e);
void setSpectatorCamera();
void createDeathEffect(EntityWrapper player);
};
@@ -30,6 +30,8 @@ private:
bool m_LeftFoot = false;
// To get a difference when calculating the walking state.
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
void playerStep(double dt);
// Spawn a hexagon at origin of an Entity
+9
View File
@@ -15,10 +15,19 @@ public:
virtual void Update(double dt) override;
private:
// This enum must correspond to the command values for PickTeam buttons.
enum class PlayerClass
{
None = 0,
Assault,
Defender,
Sniper
};
struct SpawnRequest
{
int PlayerID;
ComponentInfo::EnumType Team;
PlayerClass Class;
};
bool m_NetworkEnabled = false;
+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
+29
View File
@@ -0,0 +1,29 @@
#ifndef ServerListSystem_h__
#define ServerListSystem_h__
#include "Core/System.h"
#include "Rendering/IRenderer.h"
#include "Core/ResourceManager.h"
#include "Core/Event.h"
#include "Systems/SpawnerSystem.h"
#include "Core/EventBroker.h"
#include "Network/ESearchForServers.h"
#include "Network/EDisplayServerlist.h"
class ServerListSystem : public PureSystem
{
public:
ServerListSystem(SystemParams params, IRenderer* renderer);
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cServerList, double dt) override;
void RefreshList();
private:
IRenderer* m_Renderer;
EventRelay<ServerListSystem, Events::DisplayServerlist> m_EServerListRecieved;
bool OnServerListRecieved(const Events::DisplayServerlist& e);
};
#endif
@@ -0,0 +1,22 @@
#ifndef SpectatorCameraSystem_h__
#define SpectatorCameraSystem_h__
#include "Core/System.h"
#include "Input/EInputCommand.h"
class SpectatorCameraSystem : public ImpureSystem
{
public:
SpectatorCameraSystem(SystemParams params);
virtual void Update(double dt) override;
private:
int m_PickedTeam;
bool m_CamSetToTeamPick;
EventRelay<SpectatorCameraSystem, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(const Events::InputCommand& e);
};
#endif
+23
View File
@@ -0,0 +1,23 @@
#ifndef StartSystem_h__
#define StartSystem_h__
#include "Core/System.h"
#include "Core/ResourceManager.h"
#include "Core/Event.h"
#include "Core/EventBroker.h"
#include "Rendering/ESetCamera.h"
class StartSystem : public ImpureSystem
{
public:
StartSystem(SystemParams params);
virtual void Update(double dt) override;
private:
EntityWrapper m_ActiveCamera = EntityWrapper::Invalid;
EventRelay<StartSystem, Events::SetCamera> m_ECameraActivated;
bool OnCameraActivated(const Events::SetCamera& e);
};
#endif
+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,47 +1,42 @@
#ifndef AssaultWeaponBehaviour_h__
#define AssaultWeaponBehaviour_h__
#include "Sound/EPlaySoundOnEntity.h"
#include "Collision/Collision.h"
#include "Core/ConfigFile.h"
#include "WeaponBehaviour.h"
#include "../SpawnerSystem.h"
#include "Collision/Collision.h"
#include "Core/EPlayerDamage.h"
#include "Core/EShoot.h"
#include "Sound/EPlaySoundOnEntity.h"
#include "Rendering/EAutoAnimationBlend.h"
class AssaultWeaponBehaviour : public WeaponBehaviour<AssaultWeaponBehaviour>
{
public:
AssaultWeaponBehaviour(SystemParams systemParams, IRenderer* renderer, Octree<EntityAABB>* collisionOctree)
: WeaponBehaviour(systemParams, "AssaultWeapon", renderer, collisionOctree)
: System(systemParams)
, WeaponBehaviour(systemParams, "AssaultWeapon", renderer, collisionOctree)
, m_RandomEngine(m_RandomDevice())
{ }
protected:
virtual void OnPrimaryFire(WeaponInfo& wi) override;
virtual void OnCeasePrimaryFire(WeaponInfo& wi) override;
virtual void OnReload(WeaponInfo& wi) 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:
// State
bool m_Firing = false;
bool m_Reloading = false;
double m_ReloadTimer = 0.0;
double m_TimeSinceLastFire = 0.0;
EntityWrapper m_FirstPersonReloadImpostor;
std::random_device m_RandomDevice;
std::mt19937 m_RandomEngine;
bool hasAmmo();
void fireRound();
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();
// Weapon functions
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);
// Utility
//Camera cameraFromEntity(EntityWrapper camera);
};
#endif
@@ -1,7 +1,10 @@
#ifndef DefenderWeaponBehaviour_h__
#define DefenderWeaponBehaviour_h__
#include "WeaponBehaviour.h"
#include "Collision/Collision.h"
#include "Core/EPlayerDamage.h"
#include "Rendering/ESetCamera.h"
#include "Sound/EPlaySoundOnEntity.h"
class DefenderWeaponBehaviour : public WeaponBehaviour<DefenderWeaponBehaviour>
{
@@ -10,29 +13,27 @@ public:
: System(systemParams)
, WeaponBehaviour(systemParams, "DefenderWeapon", renderer, collisionOctree)
, m_RandomEngine(m_RandomDevice())
{
EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &DefenderWeaponBehaviour::OnSetCamera);
}
{ }
void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cWeapon, double dt) override;
void UpdateWeapon(WeaponInfo& wi, double dt) override;
void OnPrimaryFire(WeaponInfo& wi) override;
void OnCeasePrimaryFire(WeaponInfo& wi) override;
bool OnInputCommand(WeaponInfo& wi, const Events::InputCommand& e) 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;
EntityWrapper m_CurrentCamera;
EventRelay<DefenderWeaponBehaviour, Events::SetCamera> m_ESetCamera;
bool OnSetCamera(const Events::SetCamera& e);
// Weapon functions
void fireShell(WeaponInfo& wi);
void dealDamage(WeaponInfo& wi, glm::vec3 direction, double damage);
void fireShell(ComponentWrapper cWeapon, WeaponInfo& wi);
void dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, glm::vec3 direction, double damage);
bool canFire(ComponentWrapper cWeapon, WeaponInfo& wi);
// Utility
float traceRayDistance(glm::vec3 origin, glm::vec3 direction);
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
+188 -34
View File
@@ -7,6 +7,9 @@
#include "Collision/EntityAABB.h"
#include "Input/EInputCommand.h"
#include "Systems/SpawnerSystem.h"
#include "Rendering/ESetCamera.h"
#include "Core/ConfigFile.h"
#include "Rendering/EAutoAnimationBlend.h"
template <typename ETYPE>
class WeaponBehaviour : public PureSystem
@@ -20,42 +23,159 @@ public:
, m_Renderer(renderer)
, m_CollisionOctree(collisionOctree)
{
EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &WeaponBehaviour::_OnInputCommand)
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 void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cWeapon, double dt) override
{
/* 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) {
WeaponInfo& wi = m_ActiveWeapons[entity];
wi.Player = entity;
wi.WeaponEntity = entity;
wi.FirstPersonEntity = firstPersonWeapon;
wi.ThirdPersonEntity = thirdPersonWeapon;
OnEquip(cWeapon, wi);
}
}*/
auto weapon = getActiveWeapon(entity);
if (!weapon) {
return;
} else {
UpdateWeapon(*weapon, dt);
UpdateWeapon(cWeapon, *weapon, dt);
}
}
protected:
struct WeaponInfo
{
std::string WeaponComponent;
EntityWrapper Player;
EntityWrapper WeaponEntity;
EntityWrapper FirstPersonEntity;
EntityWrapper FirstPersonPlayerModel;
EntityWrapper ThirdPersonEntity;
ComponentWrapper GetComponent() { return WeaponEntity[WeaponComponent]; }
EntityWrapper ThirdPersonPlayerModel;
};
IRenderer* m_Renderer;
EntityWrapper m_CurrentCamera;
Octree<EntityAABB>* m_CollisionOctree;
std::unordered_map<EntityWrapper, WeaponInfo> m_ActiveWeapons;
bool m_ConfigAutoReload;
virtual void UpdateWeapon(WeaponInfo& wi, double dt) { }
virtual void OnPrimaryFire(WeaponInfo& wi) { }
virtual void OnCeasePrimaryFire(WeaponInfo& wi) { }
virtual void OnReload(WeaponInfo& wi) { }
virtual bool OnInputCommand(WeaponInfo& wi, const Events::InputCommand& e) { return false; }
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 getRelevantWeaponEntity(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;
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)
{
@@ -70,15 +190,19 @@ private:
}
// Make sure the player has this weapon
auto weapon = getWeaponComponent(player);
if (!weapon) {
auto cWeapon = getWeaponComponent(player);
if (!cWeapon) {
return false;
}
// Weapon selection
if (e.Command == "SelectWeapon") {
if (static_cast<ComponentInfo::EnumType>(e.Value) == static_cast<ComponentInfo::EnumType>((*weapon)["Slot"])) {
selectWeapon(player);
if (e.Value > 0) {
if (static_cast<ComponentInfo::EnumType>(e.Value) == static_cast<ComponentInfo::EnumType>((*cWeapon)["Slot"])) {
selectWeapon(*cWeapon, player);
} else {
holsterWeapon(*cWeapon, player);
}
}
}
@@ -91,18 +215,18 @@ private:
// Fire
if (e.Command == "PrimaryFire") {
if (e.Value > 0) {
OnPrimaryFire(*activeWeapon);
OnPrimaryFire(*cWeapon, *activeWeapon);
} else {
OnCeasePrimaryFire(*activeWeapon);
OnCeasePrimaryFire(*cWeapon, *activeWeapon);
}
}
// Reload
if (e.Command == "Reload" && e.Value != 0) {
OnReload(*activeWeapon);
OnReload(*cWeapon, *activeWeapon);
}
return OnInputCommand(*activeWeapon, e);
return OnInputCommand(*cWeapon, *activeWeapon, e);
}
boost::optional<ComponentWrapper> getWeaponComponent(EntityWrapper player)
@@ -129,8 +253,17 @@ private:
return activeWeapon;
}
void selectWeapon(EntityWrapper player)
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;
@@ -152,29 +285,50 @@ private:
return;
}
// Purge other weapon entities
for (auto& attachment : weaponAttachments) {
//if (attachment == firstPersonAttachment || attachment == thirdPersonAttachment) {
// continue;
//}
attachment.DeleteChildren();
}
// Spawn the weapon(s)
EntityWrapper firstPersonWeapon;
EntityWrapper thirdPersonWeapon;
if (firstPersonAttachment.Valid()) {
firstPersonWeapon = SpawnerSystem::Spawn(firstPersonAttachment, firstPersonAttachment);
if (IsClient) {
if (firstPersonAttachment.Valid()) {
firstPersonWeapon = SpawnerSystem::Spawn(firstPersonAttachment, firstPersonAttachment);
}
}
if (thirdPersonAttachment.Valid()) {
thirdPersonWeapon = SpawnerSystem::Spawn(thirdPersonAttachment, thirdPersonAttachment);
}
m_ActiveWeapons[player].WeaponComponent = m_ComponentType;
m_ActiveWeapons[player].Player = player;
m_ActiveWeapons[player].WeaponEntity = player;
m_ActiveWeapons[player].FirstPersonEntity = firstPersonWeapon;
m_ActiveWeapons[player].ThirdPersonEntity = thirdPersonWeapon;
WeaponInfo& wi = m_ActiveWeapons[player];
wi.Player = player;
wi.WeaponEntity = player;
wi.FirstPersonEntity = firstPersonWeapon;
wi.FirstPersonPlayerModel = firstPersonWeapon;
wi.ThirdPersonEntity = thirdPersonWeapon;
wi.ThirdPersonPlayerModel = thirdPersonWeapon.FirstParentWithComponent("Model");
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);
}
};
+4 -1
View File
@@ -1,3 +1,6 @@
[Gameplay]
AutoReload=true
[Debug]
LogLevel=1
LoadMap=
@@ -72,7 +75,7 @@ NumIterations=9
TextureQuality=0
[GLOW]
Quality=3;
Quality=3
[GLOW1]
NumIterations=5
+3 -1
View File
@@ -27,4 +27,6 @@ M=SwitchToClient
P=SwitchToPlayer
K=TakeDamage,1500
F2=PerformanceTimingResetAllTimers
F3=PerformanceTimingCreateExcelData
F3=PerformanceTimingCreateExcelData
Comma=SwapToClassPick
Period=SwapToTeamPick
+13 -2
View File
@@ -33,7 +33,6 @@
<xs:include schemaLocation="Components/HiddenForLocalPlayer.xsd"/>
<xs:include schemaLocation="Components/HealthPickup.xsd"/>
<xs:include schemaLocation="Components/AmmoPickup.xsd"/>
<xs:include schemaLocation="Components/AnimationOffset.xsd"/>
<xs:include schemaLocation="Components/DashAbility.xsd"/>
<xs:include schemaLocation="Components/ShieldAbility.xsd"/>
<xs:include schemaLocation="Components/SprintAbility.xsd"/>
@@ -45,16 +44,28 @@
<xs:include schemaLocation="Components/Sprite.xsd"/>
<xs:include schemaLocation="Components/Shielded.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/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/SpriteIndicator.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:include schemaLocation="Components/NetworkComponent.xsd"/>
<xs:include schemaLocation="Components/ServerIdentity.xsd"/>
<xs:include schemaLocation="Components/ServerList.xsd"/>
</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" ?>
<Animation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Animation.xsd">
<AnimationName1></AnimationName1>
<Weight1>1.0</Weight1>
<Time1>0</Time1>
<Speed1>0</Speed1>
<Loop1>true</Loop1>
<AnimationName2></AnimationName2>
<Weight2>1.0</Weight2>
<Time2>0</Time2>
<Speed2>0</Speed2>
<Loop2>true</Loop2>
<AnimationName3></AnimationName3>
<Weight3>1.0</Weight3>
<Time3>0</Time3>
<Speed3>0</Speed3>
<Loop3>true</Loop3>
<AnimationName></AnimationName>
<Time>0</Time>
<Play>false</Play>
<Reverse>false</Reverse>
<Speed>1</Speed>
<Loop>true</Loop>
<Additive>false</Additive>
</Animation>
+7 -17
View File
@@ -2,27 +2,17 @@
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
<xs:element name="Animation">
<xs:complexType>
<xs:all>
<xs:element name="AnimationName1" type="t:string" minOccurs="0"/>
<xs:element name="Weight1" type="t:double" minOccurs="0"/>
<xs:element name="Time1" type="t:double" minOccurs="0"/>
<xs:element name="Speed1" type="t:double" minOccurs="0"/>
<xs:element name="Loop1" type="t:bool" minOccurs="0"/>
<xs:element name="AnimationName2" type="t:string" minOccurs="0"/>
<xs:element name="Weight2" type="t:double" 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:element name="AnimationName" type="t:string" minOccurs="0"/>
<xs:element name="Time" type="t:double" minOccurs="0"/>
<xs:element name="Speed" type="t:double" minOccurs="0"/>
<xs:element name="Play" type="t:bool" minOccurs="0"/>
<xs:element name="Reverse" type="t:bool" minOccurs="0"/>
<xs:element name="Loop" type="t:bool" minOccurs="0"/>
<xs:element name="Additive" type="t:bool" minOccurs="0"/>
</xs:all>
<xs:attribute name="replicated" type="xs:boolean" fixed="true"/>
</xs:complexType>
</xs:element>
</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>
@@ -1,17 +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:element name="AnimationOffset">
<xs:annotation>
<xs:documentation>Aim animation offset for the skeleton</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:all>
<xs:element name="AnimationName" type="t:string" minOccurs="0"/>
<xs:element name="Time" type="t:double" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
+17 -7
View File
@@ -1,12 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<AssaultWeapon xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="AssaultWeapon.xsd">
<Slot><Primary/></Slot>
<MagazineAmmo>32</MagazineAmmo>
<MagazineSize>32</MagazineSize>
<Ammo>360</Ammo>
<MaxAmmo>360</MaxAmmo>
<BaseDamage>5</BaseDamage>
<RPM>120</RPM>
<ViewPunch>0.01</ViewPunch>
<ReloadTime>2</ReloadTime>
<Slot><Primary/></Slot>
<Ammo>320</Ammo>
<MaxAmmo>320</MaxAmmo>
<BaseDamage>15</BaseDamage>
<SpreadAngle>0.174533</SpreadAngle> <!-- 0.174533 = 10 degrees -->
<MaxTravelAngle>0.10</MaxTravelAngle> <!-- 0.174533 = 10 degrees -->
<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>
+21 -3
View File
@@ -7,6 +7,7 @@
<xs:element name="AssaultWeapon">
<xs:complexType>
<xs:all>
<xs:element name="Slot" type="WeaponSlotEnum" 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:element>
@@ -20,16 +21,33 @@
<xs:annotation><xs:documentation>Maximum ammo able to be carried</xs:documentation></xs:annotation>
</xs:element>
<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:annotation><xs:documentation>Rate of fire in rounds per minute</xs:documentation></xs:annotation>
</xs:element>
<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 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 name="Slot" type="WeaponSlotEnum" minOccurs="0"/>
<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:complexType>
</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>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<BlendAdditive xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="BlendAdditive.xsd">
<Adder></Adder>
<Receiver></Receiver>
</BlendAdditive>
@@ -0,0 +1,13 @@
<?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="BlendAdditive">
<xs:complexType>
<xs:all>
<xs:element name="Adder" type="t:string" minOccurs="0"/>
<xs:element name="Receiver" type="t:string" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<BlendOverride xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="BlendOverride.xsd">
<Master></Master>
<Slave></Slave>
</BlendOverride>
@@ -0,0 +1,13 @@
<?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="BlendOverride">
<xs:complexType>
<xs:all>
<xs:element name="Master" type="t:string" minOccurs="0"/>
<xs:element name="Slave" type="t:string" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<BoostIconsHUD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="BoostIconsHUD.xsd"/>
@@ -0,0 +1,10 @@
<?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="BoostIconsHUD">
<xs:annotation>
<xs:documentation>Origin for the 3 boost states. Create 3 children with Sprite and Fill components, name them "Sprint", "Defender", "Assault"</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
@@ -1,16 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<DefenderWeapon xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="DefenderWeapon.xsd">
<Slot><Primary/></Slot>
<MagazineAmmo>8</MagazineAmmo>
<MagazineSize>8</MagazineSize>
<Ammo>64</Ammo>
<MaxAmmo>64</MaxAmmo>
<BaseDamage>90</BaseDamage>
<SpreadAngle>0.174533</SpreadAngle> <!-- 0.174533 = 10 degrees -->
<MaxTravelAngle>0.174533</MaxTravelAngle> <!-- 0.174533 = 10 degrees -->
<NumPellets>10</NumPellets>
<RPM>120</RPM>
<ViewPunch>0.01</ViewPunch>
<ViewPunch>0.03</ViewPunch>
<ViewReturnSpeed>0.2</ViewReturnSpeed>
<ReloadTime>0.5</ReloadTime>
<Slot><Primary/></Slot>
<IsFiring>false</IsFiring>
<TimeSinceLastFire>0</TimeSinceLastFire>
<TriggerHeld>false</TriggerHeld>
<FireCooldown>0</FireCooldown>
<IsReloading>false</IsReloading>
<ReloadTimer>0</ReloadTimer>
<CurrentTravel>0</CurrentTravel>
</DefenderWeapon>
+24 -3
View File
@@ -4,9 +4,22 @@
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
<xs:include schemaLocation="../Types/WeaponSlotEnum.xsd"/>
<xs:complexType name="WeaponStateEnum" mixed="true">
<xs:complexContent>
<xs:extension base="t:enum">
<xs:choice>
<xs:element name="Idle" type="t:int" fixed="0" minOccurs="0"/>
<xs:element name="Firing" type="t:int" fixed="1" minOccurs="0"/>
<xs:element name="Reloading" type="t:int" fixed="2" minOccurs="0"/>
</xs:choice>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="DefenderWeapon">
<xs:complexType>
<xs:all>
<xs:element name="Slot" type="WeaponSlotEnum" 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:element>
@@ -25,6 +38,9 @@
<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="NumPellets" type="t:int" 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>
@@ -32,12 +48,17 @@
<xs:element name="ViewPunch" type="t:float" minOccurs="0">
<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 name="ReloadTime" type="t:double" minOccurs="0">
<xs:annotation><xs:documentation>Time it takes to load ONE SHELL into the weapon in seconds</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="Slot" type="WeaponSlotEnum" minOccurs="0"/>
<xs:element name="IsFiring" type="t:bool" minOccurs="0"/>
<xs:element name="TimeSinceLastFire" type="t:double" minOccurs="0"/>
<xs:element name="TriggerHeld" type="t:bool" minOccurs="0"/>
<xs:element name="FireCooldown" type="t:double" 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:complexType>
</xs:element>
@@ -3,6 +3,8 @@
<ExplosionOrigin X="0" Y="0" Z="0"/>
<TimeSinceDeath>0</TimeSinceDeath>
<ExplosionDuration>2</ExplosionDuration>
<Speed>1</Speed>
<Delay>0</Delay>
<!--<Gravity>1</Gravity>-->
<!--<GravityForce>1</GravityForce>-->
<!--<ObjectRadius>2</ObjectRadius>-->
@@ -18,6 +18,8 @@
<xs:element name="ExplosionDuration" type="t:double" minOccurs="0">
<xs:annotation><xs:documentation>How many seconds the death animation should be</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="Speed" type="t:double" minOccurs="0"/>
<xs:element name="Delay" type="t:double" minOccurs="0"/>
<!--<xs:element name="Gravity" type="t:bool" minOccurs="0">
<xs:annotation><xs:documentation>Enable/disable gravity</xs:documentation></xs:annotation>
</xs:element>-->
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<InputCmdButton xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="InputCmdButton.xsd">
<Command></Command>
<PressValue>0.0</PressValue>
</InputCmdButton>
@@ -0,0 +1,19 @@
<?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="InputCmdButton">
<xs:annotation><xs:documentation>Used with a Button component, the button will send an inputCommand event instead of ButtonPressed/Released event.</xs:documentation></xs:annotation>
<xs:complexType>
<xs:all>
<xs:element name="Command" type="t:string" minOccurs="0">
<xs:annotation><xs:documentation>The command name for the inputCommand.</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="PressValue" type="t:float" minOccurs="0">
<xs:annotation><xs:documentation>The value in inputCommand.Value that will be sent on button press.</xs:documentation></xs:annotation>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
+1
View File
@@ -8,5 +8,6 @@
<NormalMap>true</NormalMap>
<SpecularMap>true</SpecularMap>
<GlowMap>true</GlowMap>
<Shadow>true</Shadow>
<GlowIntensity>3.0</GlowIntensity>
</Model>
+3
View File
@@ -36,6 +36,9 @@
<xs:element name="GlowIntensity" type="t:double" minOccurs="0">
<xs:annotation><xs:documentation>Intensity of the glow map</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="Shadow" type="t:bool" minOccurs="0">
<xs:annotation><xs:documentation>Whether the object cast/recieve shadows or not</xs:documentation></xs:annotation>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<NetworkComponent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="NetworkComponent.xsd">
</NetworkComponent>
@@ -0,0 +1,10 @@
<?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="NetworkComponent">
<xs:annotation>
<xs:documentation>If an entity has this component, it will be broadcasted to clients in a snapshot.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ScoreIdentity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ScoreIdentity.xsd">
<Name></Name>
<ID>-1</ID>
<KD>0.0</KD>
<Kills>0</Kills>
<Deaths>0</Deaths>
<Ping>0</Ping>
<Connected>true</Connected>
</ScoreIdentity>
@@ -0,0 +1,32 @@
<?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="ScoreIdentity">
<xs:annotation><xs:documentation>A component tracking data for the score of a player.</xs:documentation></xs:annotation>
<xs:complexType>
<xs:all>
<xs:element name="Name" type="t:string" minOccurs="0">
<xs:annotation><xs:documentation>A name for tracking score identities, this should be unique.</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="ID" type="t:int" minOccurs="0">
<xs:annotation><xs:documentation>An id for tracking identities</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="KD" type="t:double" minOccurs="0">
<xs:annotation><xs:documentation>The Kills per death score.</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="Kills" type="t:int" minOccurs="0">
<xs:annotation><xs:documentation>The amount of kills.</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="Deaths" type="t:int" minOccurs="0">
<xs:annotation><xs:documentation>The amount of deaths.</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="Ping" type="t:int" minOccurs="0">
<xs:annotation><xs:documentation>Ping of a player.</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="Connected" type="t:bool" minOccurs="0">
<xs:annotation><xs:documentation>If the player is currently connected or not</xs:documentation></xs:annotation>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ScoreScreen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ScoreScreen.xsd">
<TotalIdentities>0</TotalIdentities>
<NextPosition>0</NextPosition>
<Offset X="0.0" Y="0.0" Z="0.0"/>
</ScoreScreen>

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