Compare commits

...

291 Commits

Author SHA1 Message Date
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
Tleety b3038ef713 Includes are now supported in shader with the key #GLSL 2016-02-26 16:33:55 +01:00
Jace f161fce719 Merge pull request #138 from teamfisk/PlayerAtOriginFix
Teleporting to origin on spawn fixed.
2016-02-25 17:55:03 +01:00
William Moberg 89d0d5753f Fix for player teleporting to (0,0,0). Saves player previous position in CollisionSystem instead of Physics component so it won't be saved when editing Players. 2016-02-25 16:16:24 +01:00
Adam Byléhn 748a178801 Merge pull request #136 from teamfisk/FixNetworkBugs
Fix network bugs
2016-02-25 16:09:08 +01:00
Jocke eac9a9daf6 Pull request #136 Merge remote-tracking branch 'origin/master' into FixNetworkBugs
# Conflicts:
#	src/Engine/Network/Client.cpp
2016-02-25 16:07:06 +01:00
Jocke 059fe5c6c0 Fixed typo m_EPDoubleJump to m_EDoubleJump. 2016-02-25 16:04:27 +01:00
Joachim Pettersson fb465ede81 Merge pull request #134 from teamfisk/HUDDesync
Good job! 👍
2016-02-25 15:53:07 +01:00
Jocke f66fa7a183 Merge remote-tracking branch 'origin/master' into FixNetworkBugs
# Conflicts:
#	include/Engine/Network/Client.h
#	include/Engine/Network/MessageType.h
#	include/Engine/Network/Server.h
#	include/Engine/Network/TCPServer.h
#	src/Engine/Network/Client.cpp
#	src/Engine/Network/TCPServer.cpp
2016-02-25 15:13:11 +01:00
Jocke 508d8a6f00 Fixed memory leak in TCPServer::AcceptNewConnections caused by acceptor->async_accept().
Fixed some formating and comments.
2016-02-25 14:24:38 +01:00
stiffly 8ce6308649 In snapshot: now sends player information and also CP information. Now it is no longer true that they will arrive in pre order. Appropriate actions were therefor implemented. 2016-02-25 11:56:40 +01:00
stiffly f10958c268 Capturepoint logic is now purely done on the serverside. 2016-02-25 11:50:29 +01:00
William Moberg da1c7b3093 Merge pull request #133 from teamfisk/AndersTest
Ammo,HealthPickup now takes in account for possible parenting/childin…
2016-02-25 09:58:14 +01:00
verysecrethero ef87102d1f Ammo,HealthPickup now takes in account for possible parenting/childing of the pickup. Also saved the xml files with the new scaling 2016-02-24 17:53:37 +01:00
Jace 9a41bda4cf Merge pull request #132 from teamfisk/CubeMap
Cube map
2016-02-24 16:03:49 +01:00
Tleety fc18932068 Merge remote-tracking branch 'origin/master' into CubeMap
# Conflicts:
#	src/Engine/Rendering/Renderer.cpp
2016-02-24 15:45:30 +01:00
Tobias Dahl b874ea8641 Merge pull request #131 from teamfisk/ResizeWindowFixFromSSAOMerge
Have fix the resizing errors
2016-02-24 15:22:12 +01:00
Tobias Dahl 2609a0253d Merge pull request #129 from teamfisk/HUDDesync
Networking improvements
2016-02-24 15:22:01 +01:00
William Moberg de309d3b9d Merge pull request #130 from teamfisk/AndersTest
CapturePointSystem fix, DamageIndicatorSystem fix
2016-02-24 15:17:36 +01:00
Tobias Dahl f7ef6707a7 Merge pull request #116 from teamfisk/SeeTeamMates
See team mates
2016-02-24 15:05:19 +01:00
Tleety feeff5b164 Debug tool for different CubeMap
changed cubemap influence.
2016-02-24 14:47:47 +01:00
stiffly 7394436e7a Removed unnecessary comment. 2016-02-24 14:23:54 +01:00
Tleety f41e0b29be assets 2016-02-24 14:21:48 +01:00
Tleety 607e83134d Cubemaps working 2016-02-24 14:16:49 +01:00
verysecrethero 5af4f9d8e7 Removed a comment originating from HUDDesynch branch 2016-02-24 14:06:41 +01:00
verysecrethero af68236e71 now using a define INDICATOR_TEST to activate the DamageIndicatorSystem test. 2016-02-24 13:58:05 +01:00
Tleety 6f9ce8a0c1 WIP 2016-02-24 13:57:54 +01:00
Teejoon 6465fe6ed6 Have fix the resizing errors 2016-02-24 13:22:41 +01:00
Jocke fa13c1d065 Double jump is now working. 2016-02-23 18:24:46 +01:00
verysecrethero e2831c5593 CapturePointSystem fix, DamageIndicatorSystem fix 2016-02-23 17:29:33 +01:00
Tleety 8d23c531af Cubemaps kinda functioning, still somthing wierd with the vectors. 2016-02-23 17:17:50 +01:00
Tleety 91b0ac5fbd Some groundwork for cubemaps. 2016-02-23 16:00:43 +01:00
stiffly d77119bb2d Fixed print for serverlist. 2016-02-23 11:47:44 +01:00
stiffly 27669b7383 Merge remote-tracking branch 'origin/master' into HUDDesync 2016-02-23 11:09:44 +01:00
stiffly fc7d62a5ad Various clean ups. 2016-02-23 11:07:56 +01:00
stiffly c42e1e0967 SoundSystem Fix. Now subscribes to an event that was thought to be listened to. 2016-02-23 11:07:41 +01:00
stiffly fe9dbf0b0f Serverlist fix. 2016-02-23 10:33:20 +01:00
Tleety 4ffb03fdd5 Merge remote-tracking branch 'origin/master' into SmallFixes-Tobias
# Conflicts:
#	src/Engine/Rendering/DrawFinalPass.cpp
2016-02-23 10:02:53 +01:00
Teejoon fe3e0bac5b Changed SpritIndicator values on player 2016-02-22 18:45:02 +01:00
Teejoon fa4f007604 Changed name from Indicator to SpriteIndicator. Can now be an indicator for a single team or every one 2016-02-22 18:35:00 +01:00
stiffly e5ff88d3c9 SoundSystem bug fix 2016-02-22 17:41:14 +01:00
stiffly 845a30ed0f Merge remote-tracking branch 'origin/DynamicPacketBuffer' into HUDDesync
# Conflicts:
#	include/Engine/Network/TCPServer.h
#	src/Engine/Network/TCPServer.cpp
2016-02-22 17:39:48 +01:00
Jocke 34a71b0767 Fixed linking issue. 2016-02-22 17:24:35 +01:00
stiffly 833006744a WIP 2016-02-22 17:00:25 +01:00
Jocke b2d8cddfb7 WE now send the map on connect after that only player information. 2016-02-22 16:46:31 +01:00
Teejoon 6fab971734 Merge branch 'master' of https://github.com/teamfisk/TacticalZ into SeeTeamMates
Conflicts:
	include/Engine/Rendering/SpriteJob.h
	resources/Schema/Components.xsd
	resources/Schema/Entities/Player.xml
	resources/Schema/Entities/PlayerRed.xml
2016-02-22 16:43:18 +01:00
Viktor Ljung 2c18068059 Merge pull request #126 from teamfisk/SSAO
SSAO
2016-02-22 16:40:11 +01:00
Teejoon 09aec08d0e Pull request fixes 2016-02-22 16:38:20 +01:00
Jocke ed9149fe63 Network buffer should now dynamically increase when needed. 2016-02-22 16:04:27 +01:00
Teejoon 4cf8c3d8d7 Fixed PerformanceTimer start and stop in Renderer.cpp since I have changed a little code there 2016-02-22 15:02:20 +01:00
Teejoon 37414ce124 Merge branch 'master' of https://github.com/teamfisk/TacticalZ into SSAO
Conflicts:
	include/Engine/Rendering/Renderer.h
	src/Engine/Rendering/Renderer.cpp
2016-02-22 14:51:42 +01:00
Teejoon adceccf402 SSAO now working. Changed in DrawFinalePass so that th AOTexture is on texture position 0 and only get binded once.
Changed so that the picking pass get drawn once in the beginning so that the AO shatde could calculate AO from the depthbuffer generated during pthe pickingpass.

In the ImGUI debugg window there is now sliders to change the behavior of the AO shader. Only the minimum ambient lightning is HardCoded in to the frowardPlus fragmentshaders with a define in the begining.
2016-02-22 14:48:20 +01:00
stiffly 4c1a284636 Server now does Capture point logic too. 2016-02-22 11:30:31 +01:00
stiffly 23dc8e07b2 Will this do the trick? Now tells the server to send HUD entities too. 2016-02-22 10:41:37 +01:00
stiffly c7d31cac2d Merge remote-tracking branch 'origin/master' into FriendlyHost/Join
# Conflicts:
#	src/Engine/Network/Client.cpp
2016-02-22 10:19:48 +01:00
stiffly a1e932d261 Merge remote-tracking branch 'origin/master' into FriendlyHost/Join 2016-02-22 10:06:51 +01:00
stiffly 070f1bd394 Merge remote-tracking branch 'origin/FriendlyHost/Join' into FriendlyHost/Join
# Conflicts:
#	src/Engine/Network/Client.cpp
2016-02-22 10:06:25 +01:00
stiffly 993d804cef Added an event to search for servers.
Client now broadcasts a serverlistrequest.
An active server will then answer the request and send info about the server.
The client saves this data to a list and presents it to the user.
2016-02-22 10:05:47 +01:00
Teejoon 201480b17f SSAO is working, but is kinda crappy. You can change shade variables in the debug window. 2016-02-19 16:50:04 +01:00
William Moberg bac23f6e8c Merge pull request #124 from teamfisk/FixNetworkBugs
Test text here. Good work Jocke.
2016-02-19 16:47:34 +01:00
Jocke 68f2d5327d added extra check in HealthSystem 2016-02-19 16:37:26 +01:00
Jocke 2263fd2ad6 Fixed crash in Client::parsePlayerDamage. 2016-02-19 16:18:16 +01:00
stiffly 2f259c3773 Added an event to search for servers.
Client now broadcasts a serverlistrequest.
An active server will then answer the request and send info about the server.
The client saves this data to a list and presents it to the user.
2016-02-19 15:38:09 +01:00
William Moberg 8cc928b5f4 Merge pull request #122 from teamfisk/WorldSnapshots
World snapshots
2016-02-19 15:12:31 +01:00
Jace 881ce7b02f Proper string handling without nasty memory leaks. PHEW. 2016-02-19 15:11:10 +01:00
Jace c130fdda5e Merge pull request #123 from teamfisk/BoxModelCollision
Falling through ground + dash fix.
2016-02-19 14:53:37 +01:00
Tleety 97fcdb342d Bloom should now show behind transparent objects. 2016-02-19 14:23:40 +01:00
William Moberg 4c87ca10b9 Merge branch 'master' into BoxModelCollision 2016-02-19 14:17:17 +01:00
William Moberg 22664848dc You should not be able to fall through ground or dash thru walls. Very thin objects may still be possible to go through, e.g. the grid border walls in GameMap.xml. 2016-02-19 14:16:22 +01:00
Tleety d135ea2da6 Small fix 2016-02-19 13:53:43 +01:00
Tleety 949ee76f55 Fallow and name fix 2016-02-19 13:52:16 +01:00
Jace 844825813b Merge pull request #121 from teamfisk/ResolutionChange
Resolution change
2016-02-19 13:31:06 +01:00
Tleety 722b795d37 Fixed spelling 2016-02-19 13:30:41 +01:00
Tleety cf2bf4e14d Merge remote-tracking branch 'origin/master' into ResolutionChange 2016-02-19 13:17:31 +01:00
Jace 2ac584bafb Merge pull request #113 from teamfisk/Menu-Tobias
Menu tobias
2016-02-19 13:16:50 +01:00
Tleety 6e5335a266 Release now return name and entity of the entity that was previously klicked. 2016-02-19 13:16:26 +01:00
Tleety fc5d054cb2 Entity is now sent with the click events.
Fixed small things
2016-02-19 12:49:07 +01:00
Tleety 8c9f4bb84b Resize should now be working correctly. 2016-02-19 11:42:52 +01:00
Tleety e15a7b9485 You can now change resolution without any apparent bugs. 2016-02-18 18:00:26 +01:00
William Moberg a141da3d8c Merge pull request #118 from teamfisk/AndersTest
Test fixes
2016-02-18 15:29:33 +01:00
Jace ca907b912e Copy constructor for deep copy of World. 2016-02-18 13:54:32 +01:00
Jace 97499f1c28 Made ComponentPool copyable by making sure string fields are handled properly 2016-02-18 11:37:03 +01:00
verysecrethero 64610e3c03 Fixed so some of the tests are working again. Also removed the test errors 2016-02-18 11:27:07 +01:00
Jace 5dd85d2748 Merge pull request #110 from teamfisk/PerformanceTiming
Performance timing
2016-02-18 10:33:24 +01:00
Jace 261c2e021e Merge pull request #115 from teamfisk/Respawning
Spawn blocking fix
2016-02-18 10:26:08 +01:00
William Moberg 581a7b470c Merge pull request #94 from teamfisk/AndersTest
Added 3 PickupSpawnSystem test
2016-02-18 10:21:37 +01:00
Teejoon c4d3c515e4 Marge with Master 2016-02-17 18:04:49 +01:00
Teejoon 7cc58dc94c Merge branch 'master' of https://github.com/teamfisk/TacticalZ into SeeTeamMates 2016-02-17 18:00:30 +01:00
Teejoon 5e3af7ac5d Player Indicator now working OK. Scaling depending on how far away you are makes the Indicator to hide players head behind it. Shields are making indicators to disappear. 2016-02-17 17:58:01 +01:00
Tleety 3e7936ef00 You can now change resolution by pressing buttons. 2016-02-17 17:44:33 +01:00
stiffly 46987beefb Updated the serverlist, now prints adress and port of the server. 2016-02-17 17:05:10 +01:00
verysecrethero 8845054965 Merge remote-tracking branch 'origin/master' into PerformanceTiming
# Conflicts:
#	resources/Schema/Entities/NewMap.xml
2016-02-17 16:59:26 +01:00
Tleety 7dfd68467e Merge branch 'Menu-Tobias' into ResolutionChange 2016-02-17 16:54:06 +01:00
Teejoon 4fd0108443 Working billbording 2016-02-17 16:50:24 +01:00
William Moberg 52355a63e2 Merge branch 'master' into Respawning 2016-02-17 16:08:00 +01:00
William Moberg 72db672dbf Ray will not hit objects in octree if they are transparent or invisible. 2016-02-17 16:06:35 +01:00
stiffly 950ecba1c0 Merge remote-tracking branch 'origin/master' into FriendlyHost/Join 2016-02-17 15:52:58 +01:00
stiffly fdc8f753cb Implemented primitive server "heartbeat" logic, which sends server info from server to client without being connected. 2016-02-17 15:51:26 +01:00
Tobias Dahl 0d665c10fe Merge pull request #114 from teamfisk/HealthPickup
The rotation of the Pickups are now also included in the AmmoPickup.x…
2016-02-17 14:56:45 +01:00
William Moberg 23bb1a6405 Cannot respawn inside other players, unless all are blocked. 2016-02-17 14:54:59 +01:00
verysecrethero b8222c7b2e The rotation of the Pickups are now also included in the AmmoPickup.xml, HealthPickup.xml 2016-02-17 14:54:42 +01:00
Tobias Dahl 43bbc063cf Merge pull request #111 from teamfisk/HealthPickup
Fixed RespawnModel of Pickups
2016-02-17 14:39:09 +01:00
verysecrethero 3e4b87da7c Merge remote-tracking branch 'origin/master' into HealthPickup
# Conflicts:
#	resources/Schema/Entities/NewMap.xml
2016-02-17 14:32:59 +01:00
verysecrethero ac9ce8ea83 Merge remote-tracking branch 'origin/master' into HealthPickup 2016-02-17 14:30:31 +01:00
Tobias Dahl 99643fd748 Merge pull request #112 from teamfisk/AssaultDash
You can now AssaultDash in the air
2016-02-17 14:24:58 +01:00
Tleety a6c30100af FrameWork for menu buttons 2016-02-17 14:16:17 +01:00
verysecrethero 833015f45e Small code cleanup for PerformanceTimer 2016-02-17 13:44:41 +01:00
Tleety 657125b469 Moved menu code into GUI
Button events are now sent when you click.
2016-02-17 13:44:11 +01:00
verysecrethero 8f28c760dd You can now AssaultDash in the air 2016-02-17 11:47:10 +01:00
verysecrethero b13362360a Fixed RespawnModel of Pickups 2016-02-17 11:22:42 +01:00
Jace 0af9edc6e5 Editor is properly disabled when disabled in config 2016-02-17 10:53:20 +01:00
verysecrethero ec10ef3ffc Merge remote-tracking branch 'origin/master' into HealthPickup 2016-02-17 10:32:35 +01:00
Jocke 4432891437 Fixed crash in Client::parsePlayerDamage. 2016-02-17 10:21:50 +01:00
verysecrethero b2a437731e Small cleanup in the code 2016-02-16 17:58:27 +01:00
verysecrethero 42b49f9dba Added more timers to Rendering. 2016-02-16 17:51:39 +01:00
verysecrethero 4b8f1d95a3 Added static class PerformanceTimer. Changed CMakeLists for engine to include boost timer. Added F2,F3 functions in editor. Added some timing, more to be added 2016-02-16 16:57:46 +01:00
Tleety 8f84a5ddd6 Buttons are now clickable 2016-02-16 16:28:19 +01:00
Jocke a006db9e63 WIP Fix dsync 2016-02-16 16:06:17 +01:00
Teejoon 17da9a8036 WIP 2016-02-16 15:56:58 +01:00
Tleety 6bc7131290 Glow Intencity can now be changed in the model component. 2016-02-16 14:57:21 +01:00
Tleety 4214bf10a1 Components for menu/buttons 2016-02-16 14:05:57 +01:00
Jocke 717af2c4a4 Fixed bug in Client::parsePlayerDamage() 2016-02-16 10:22:15 +00:00
Jace 969e7cb0d5 Merge remote-tracking branch 'origin/FixNetworkToPlayTest' 2016-02-12 09:18:32 +01:00
Jace 47a365a8fc Inverted capture point numbers to fix HUD 2016-02-12 09:17:39 +01:00
Jace 71c03326aa Debug.EditorEnabled 2016-02-12 09:17:28 +01:00
Jocke ba69c79821 Fixed bug in Server. 2016-02-12 09:13:43 +01:00
Jace 0a31fa3dfd Merge branch 'master' of github.com:teamfisk/TacticalZ 2016-02-12 09:08:17 +01:00
Jace ca457d9c00 Player names 2016-02-12 09:07:59 +01:00
antc13 a08e54a147 Blocked up a path in the Spawns a bit more. 2016-02-12 08:44:40 +01:00
Jocke 2c3122bbdb increased Network buffer size, fixed 2 crashes and re-added the ability to kill oneself with the use of a key bound to TakeDamage,Value. 2016-02-12 08:39:20 +01:00
Jace 10846be820 Merge pull request #109 from teamfisk/Sound
Added weapon sounds.
2016-02-12 08:23:30 +01:00
stiffly 9df7b32ca1 Merge remote-tracking branch 'origin/master' into Sound 2016-02-12 08:20:01 +01:00
stiffly 3d4a7de59d MiniDump.cpp was not added to CMakeLists.txt. 2016-02-12 08:19:47 +01:00
stiffly 1cdcbf9b32 Merge remote-tracking branch 'origin/master' into Sound
# Conflicts:
#	src/Game/Systems/PlayerSpawnSystem.cpp
#	src/Game/Systems/Weapon/AssaultWeaponBehaviour.cpp
2016-02-12 08:19:29 +01:00
antc13 9e8d2b99df Merge branch 'master' of https://github.com/teamfisk/TacticalZ 2016-02-12 08:16:23 +01:00
antc13 ba4877c3f7 Moved Spawn locations and added ammo/health pickups around the map. 2016-02-12 08:16:12 +01:00
stiffly af39b892cd Now plays a "Empty sound", "reload sound" and "hit mark sound" on appropriate occasions. 2016-02-12 08:05:35 +01:00
Jace 1ed5107d9b Merge pull request #108 from teamfisk/MiniDump
Minidump on crash
2016-02-12 08:04:25 +01:00
antc13 2ce7179d19 Merge branch 'master' of https://github.com/teamfisk/TacticalZ 2016-02-12 07:49:58 +01:00
Jace eb7b22c757 Latest assets 2016-02-12 07:48:26 +01:00
Jace b48d491ad7 Complete blue and red player entities 2016-02-12 07:45:51 +01:00
Jocke 7d732c75ca Server now removes players that have disconnected. 2016-02-12 07:42:01 +01:00
Jace 47f4711b85 Merge remote-tracking branch 'origin/Menu' into WeaponSystem
# Conflicts:
#	resources/Schema/Entities/Player.xml
#	resources/Schema/Types/Entity.xsd
#	src/Game/Systems/PlayerSpawnSystem.cpp
2016-02-12 07:18:20 +01:00
Jace 78e318c032 Proper snapshot filtering 2016-02-12 07:14:36 +01:00
Jace bb66f95d43 Enabled server broadcasting PlayerDamage events to other players to make damage indicators work 2016-02-12 07:03:14 +01:00
Jace cc422cf73a Fixed PlayerDeath being fired multiple times per frame on the server, causing multiple spawns and other weirdness 2016-02-12 06:30:19 +01:00
Jace 2e5ee633ce Fixed bug when client would recieve input command from an entity that the client didn't know about 2016-02-12 06:10:20 +01:00
Tleety 1e04244590 Fixed network bug sorta 2016-02-12 06:00:42 +01:00
viktorljung f146971db0 Fixed size 2016-02-12 05:45:17 +01:00
viktorljung 60b2c9bc9b KillFeed 2016-02-12 05:41:05 +01:00
Tleety d357e365cb Merge remote-tracking branch 'origin/TCPConnections' into WeaponSystem
# Conflicts:
#	include/Engine/Network/Server.h
#	src/Engine/Network/Client.cpp
#	src/Engine/Network/Server.cpp
2016-02-12 05:21:00 +01:00
Tleety a8a3366e8a Hopeless attempts to fix network bugs 2016-02-12 05:17:09 +01:00
Jocke 7de76376cf Merge remote-tracking branch 'origin/master' into TCPConnections
# Conflicts:
#	src/Engine/Network/Client.cpp
#	src/Engine/Network/Server.cpp
#	src/Engine/Rendering/PickingPass.cpp
#	src/Game/Systems/PlayerSpawnSystem.cpp
2016-02-12 05:16:30 +01:00
William Moberg 422bedb844 MiniDump name now depends on time e.g. TacticalZ Fri 04-20-49. 2016-02-12 04:22:11 +01:00
stiffly 1da432ba23 WIP sounds 2016-02-12 04:03:35 +01:00
Jace 787eecce26 WIP 2016-02-12 04:03:22 +01:00
William Moberg 215b1b1aa4 On crash, takes minidump, then show MessageBox, and exit app. 2016-02-12 03:32:42 +01:00
antc13 f49cacf167 Merge branch 'master' of https://github.com/teamfisk/TacticalZ 2016-02-12 02:47:50 +01:00
Jace a15e01596a Merge branch 'master' of github.com:teamfisk/TacticalZ 2016-02-12 02:47:12 +01:00
antc13 a5168bd1c2 Merge branch 'master' of https://github.com/teamfisk/TacticalZ 2016-02-12 02:46:52 +01:00
antc13 784e1eb69b Changed Colors on some materials and changed bridges to red and blue bridges. 2016-02-12 02:46:44 +01:00
Jace b5e372896f Added spawner? 2016-02-12 02:46:42 +01:00
Jace a54156fab3 Added HUD elements to player 2016-02-12 02:46:16 +01:00
Tobias Dahl a20707739e Merge pull request #107 from teamfisk/CapturePointColorFix
ColorFix
2016-02-12 02:39:21 +01:00
Tleety 4f7a17ff62 ColorFix 2016-02-12 02:38:36 +01:00
viktorljung 987dafb44a Fixed Health text color 2016-02-12 02:38:11 +01:00
Jace 47053285c8 Merge remote-tracking branch 'origin/Menu' into WeaponSystem
# Conflicts:
#	resources/Schema/Entities/Player.xml
#	resources/Schema/Types/Entity.xsd
2016-02-12 02:30:38 +01:00
Jace bee0630a26 Merge remote-tracking branch 'origin/master' into WeaponSystem 2016-02-12 02:27:44 +01:00
Jace 1dc3756533 Fixed respawn crash when a player died that had never spawned 2016-02-12 02:23:13 +01:00
Tobias Dahl 196469299f Merge pull request #106 from teamfisk/Transparancyfix
asdfsdaferf
2016-02-12 02:22:42 +01:00
Tleety e1196204eb asdfsdaferf 2016-02-12 02:20:40 +01:00
Jace b9ea314232 Merge remote-tracking branch 'origin/master' into WeaponSystem
# Conflicts:
#	resources/Schema/Entities/NewMap.xml
2016-02-12 02:11:11 +01:00
Jace 71533b52ae Map fix 2016-02-12 02:10:42 +01:00
viktorljung 6442254575 Merge remote-tracking branch 'origin/master' into Menu
# Conflicts:
#	src/Game/Game.cpp
2016-02-12 02:09:14 +01:00
Jace 9f8b0f7aa9 Merge pull request #104 from teamfisk/AmmoPickup
Added AmmoPickupSystem with Component, Entity.
2016-02-12 02:08:29 +01:00
viktorljung 021c4e36d7 New HUD XML files 2016-02-12 02:08:24 +01:00
Jace 02253ea6e1 Merge pull request #105 from teamfisk/Respawning
Automatic respawning
2016-02-12 02:07:36 +01:00
antc13 2417175914 New Map with Meshes WIP. Probably final for Playtest. 2016-02-12 02:06:52 +01:00
viktorljung fb5164221f HealthHUD redesigned 2016-02-12 01:57:53 +01:00
Jace 88c7c57671 Merge remote-tracking branch 'origin/master' into WeaponSystem 2016-02-12 01:46:45 +01:00
Jace 5295133311 Hack to sync ammo over network until we have input replaying + Reload effect from all views 2016-02-12 01:45:54 +01:00
antc13 baff8301b3 Merge branch 'master' of https://github.com/teamfisk/TacticalZ
# Conflicts:
#	resources/Schema/Entities/NewMap.xml
2016-02-12 01:43:52 +01:00
antc13 3e42c067ab New Map with meshes WIP Update. 2016-02-12 01:43:20 +01:00
Jocke 3b42f5dbf4 Fixed server so it now deletes. 2016-02-12 01:33:45 +01:00
William Moberg 40ae2b8cbb DefaultInput key 'K' to kill player, since we can't respawn when alive. Also moved TakeDamage InputCommand to HealthSystem. 2016-02-12 00:52:58 +01:00
William Moberg f1c2413cf9 Respawning and team picking seems to be working well. 2016-02-12 00:39:27 +01:00
William Moberg 11af6a3078 Merge branch 'master' into Respawning
# Conflicts:
#	resources/DefaultConfig.ini
#	resources/Schema/Entities/MovementTest.xml
#	src/Game/Systems/SoundSystem.cpp
2016-02-12 00:29:51 +01:00
viktorljung 0370775820 Merge remote-tracking branch 'origin/master' into Menu
# Conflicts:
#	resources/Schema/Entities/Player.xml
2016-02-12 00:28:24 +01:00
viktorljung a36ed76a4e AmmunitionHUDSystem now really working 2016-02-12 00:26:59 +01:00
verysecrethero af30e51564 Added AmmoPickupSystem with Component, Entity. Changed so PlayerDeathSystem gets updated after Health/Ammo systems, credits to William. 2016-02-11 23:56:40 +01:00
stiffly e24a84c52d Server now deletes the player on a new player spawn. 2016-02-11 23:52:55 +01:00
Viktor Ljung 04f77da6f1 Merge pull request #101 from teamfisk/Animations
Animations
2016-02-11 23:52:44 +01:00
Jace 30f454e6a4 Entity fixes 2016-02-11 23:50:57 +01:00
viktorljung 648d864d6e Merge remote-tracking branch 'origin/master' into Animations 2016-02-11 23:48:30 +01:00
Jace e473194671 Merge branch 'WeaponSystem' 2016-02-11 23:46:23 +01:00
Jace b761439c84 Added config flag Debug.OutOfBodyExperience that allows you to spawn and view a player from a third person perspective, without the active camera being changed. 2016-02-11 23:45:30 +01:00
Jace 44a73ef883 fixup! Merge remote-tracking branch 'origin/master' into WeaponSystem 2016-02-11 23:44:20 +01:00
viktorljung c1860ae383 AmmunitionHUD now working 2016-02-11 23:38:25 +01:00
Jace c4c53944d9 Merge pull request #103 from teamfisk/WeaponSystem
Working weapon system
2016-02-11 23:16:44 +01:00
Tobias Dahl bdec4f9d16 Merge pull request #100 from teamfisk/Importer
Splatmap only using RGB channel and an importer bug fix
2016-02-11 23:13:10 +01:00
Jace 7cae84d4ee Merge remote-tracking branch 'origin/master' into WeaponSystem
# Conflicts:
#	include/Engine/Core/EPlayerDamage.h
#	src/Game/Game.cpp
#	src/Game/Systems/Weapon/WeaponSystem.cpp
2016-02-11 22:52:51 +01:00
Teejoon 4964e732ca Merge branch 'master' of https://github.com/teamfisk/TacticalZ into Importer 2016-02-11 22:51:52 +01:00
Teejoon 1bb1a1445e Commit assets 2016-02-11 22:51:39 +01:00
Jace d1213f9f59 Working damage dealing, a super cool reload effect and hit markers! 2016-02-11 22:50:44 +01:00
William Moberg dd131e7652 Respawning may work, not been tested over network yet. 2016-02-11 22:49:31 +01:00
stiffly 70f4002d70 Merge remote-tracking branch 'origin/Animations' into TCPConnections 2016-02-11 22:15:59 +01:00
stiffly b66e3d3630 WIP trying to hot fix 2016-02-11 22:15:47 +01:00
William Moberg 06f614b3bb Merge pull request #102 from teamfisk/AssaultDash
AirFriction changed to 2.0 to fix the dash ability in the air
2016-02-11 21:46:30 +01:00
verysecrethero 4a17e3c8f3 airFriction changed to 2.0 to fix the dash ability in the air 2016-02-11 21:42:29 +01:00
verysecrethero 22e35489d7 Merge remote-tracking branch 'origin/master' into AssaultDash 2016-02-11 21:31:33 +01:00
stiffly 055f6517a1 Merge remote-tracking branch 'origin/master' into TCPConnections 2016-02-11 21:24:16 +01:00
stiffly afd9e24df6 Reverted last commit. Also testing to delay OnPlayerSpawn event for clients. No progress... 2016-02-11 21:23:53 +01:00
viktorljung 851418b1de Merge remote-tracking branch 'origin/master' into Menu 2016-02-11 21:16:31 +01:00
viktorljung fee50ba3b6 Crash fix 2016-02-11 21:16:10 +01:00
Tobias Dahl 5bcadd5b1a Merge pull request #95 from teamfisk/CapturePointTake
Fixed CapturePointTimer,Color
2016-02-11 21:10:30 +01:00
Tobias Dahl 42d810b198 Merge pull request #84 from teamfisk/DamageIndicator
Damage indicator
2016-02-11 21:08:59 +01:00
verysecrethero 3a15550b57 maybe a good commit 2016-02-11 21:07:47 +01:00
verysecrethero 8f500965d4 Changed DamageIndicator.xml to not use a glowmap and not a depthsort. 2016-02-11 20:34:25 +01:00
viktorljung bd385a0d59 new assets 2016-02-11 20:15:56 +01:00
Jace 5e05e51309 Fixed EntityFirstHitByRay not returning outDistance properly 2016-02-11 20:01:23 +01:00
Jace fee1ed6d6d FIXME: Temporarily removed glow from sprite shader to prevent transparent sprite from occluding other glow 2016-02-11 20:00:59 +01:00
Teejoon f79649cf9a Fixed material file reading bug 2016-02-11 19:38:43 +01:00
Teejoon 2096779eb6 Merge branch 'master' of https://github.com/teamfisk/TacticalZ into Importer 2016-02-11 18:48:21 +01:00
Teejoon 99747c518e commit assets 2016-02-11 18:48:07 +01:00
Teejoon f088aa1d85 Commit the files now.... 2016-02-11 18:45:48 +01:00
Teejoon 0af337bf39 Merge branch 'Importer' of https://github.com/teamfisk/TacticalZ into Importer 2016-02-11 18:30:24 +01:00
Teejoon 6caa7e94a4 RGB is now the only channels thats beeing usesed in splatmap 2016-02-11 18:28:33 +01:00
Jace e2a8605101 Merge remote-tracking branch 'origin/master' into WeaponSystem 2016-02-11 17:25:37 +01:00
Jace c8c4879554 Merge pull request #93 from teamfisk/OctreeRaycasting
Entity in octree hit by ray
2016-02-11 17:25:02 +01:00
William Moberg 14054ad898 WIP respawning. 2016-02-11 17:08:45 +01:00
Jace e47201ff61 First person shoot animations 2016-02-11 17:06:34 +01:00
antc13 1d14094e90 NewMap Updated. Still WIP 2016-02-11 16:52:10 +01:00
verysecrethero 3301f66ad1 Merge remote-tracking branch 'origin/master' into DamageIndicator
# Conflicts:
#	resources/Shaders/Sprite.vert.glsl
2016-02-11 16:36:48 +01:00
Jocke 49d4a45ef8 Client crashed when connecting, this was a hot fix. 2016-02-11 16:27:33 +01:00
Jocke e0c3a32e66 Merge branch 'master' into TCPConnections
# Conflicts:
#	include/Engine/Network/Client.h
#	include/Engine/Network/Server.h
#	include/Game/Game.h
#	src/Engine/Network/Client.cpp
#	src/Engine/Network/Server.cpp
#	src/Game/Game.cpp
2016-02-11 16:26:42 +01:00
William Moberg 97b915f130 Merge branch 'master' into Respawning
# Conflicts:
#	src/Game/Game.cpp
#	src/Game/Systems/PlayerSpawnSystem.cpp
#	src/Game/Systems/SoundSystem.cpp
2016-02-11 16:15:47 +01:00
verysecrethero c9f815fd42 Merge remote-tracking branch 'origin/master' into CapturePointTake
# Conflicts:
#	src/Game/Systems/CapturePointSystem.cpp
2016-02-11 16:09:05 +01:00
William Moberg 8eea0c8395 WIP respawning. 2016-02-11 16:08:19 +01:00
verysecrethero 38a3e88999 Merge pull request #87 from teamfisk/DoubleJumpEffect
Spawned DoubleJumpHexagon  as the player doublejumps
2016-02-11 16:00:09 +01:00
Adam Byléhn 89cbc70177 Merge pull request #99 from teamfisk/Menu
Menu
2016-02-11 15:44:17 +01:00
Tleety 51e0b852d2 Adamfix 2016-02-11 15:43:41 +01:00
Tleety 7ccaf5b040 Removed commeted code 2016-02-11 15:42:27 +01:00
Tleety 66e20c3fd9 Merge remote-tracking branch 'origin/master' into Menu 2016-02-11 15:38:18 +01:00
Tleety 6ba1e95da7 Fixed depth sorting for HUD elements. 2016-02-11 15:27:07 +01:00
Adam Byléhn bef50ef96a Merge pull request #97 from teamfisk/Menu
Menu
2016-02-11 15:13:12 +01:00
Tleety 9f657ada4e merge fixes 2016-02-11 14:52:52 +01:00
Tleety f0ae365401 Merge remote-tracking branch 'origin/master' into Menu
# Conflicts:
#	src/Engine/Rendering/Texture.cpp
#	src/Game/Game.cpp
2016-02-11 14:43:30 +01:00
viktorljung 7d4a4ed7cf Merge remote-tracking branch 'origin/master' into Animations
# Conflicts:
#	src/Engine/Rendering/Skeleton.cpp
2016-02-11 14:38:23 +01:00
Jocke fa2e556ab2 fixed some error handling in TCPClient. 2016-02-11 14:07:51 +01:00
viktorljung 97de31be65 Fixed BoneAttachment component 2016-02-11 13:36:27 +01:00
antc13 2f640d224c New Map with Meshes WIP 2016-02-11 12:23:20 +01:00
verysecrethero f11bd24d53 Added CapturePointMaxTimer in CapturePointComponent. Removed next-capturepoint Color. Modified captureTimer to +-captureTimeToTakeOver after a capture. 2016-02-11 11:46:34 +01:00
Tleety 350effd8eb New assets and some QA map stuff 2016-02-11 11:32:51 +01:00
viktorljung 607150189c Different animations can now be played on multiple meshes, AnimationOffset seems to make the lighting buggy 2016-02-11 10:51:11 +01:00
Teejoon ecc473d520 Merge branch 'Importer' of https://github.com/teamfisk/TacticalZ into Importer 2016-02-11 10:30:40 +01:00
Tleety 35e4935497 Some assets and HUD stuff 2016-02-11 10:01:11 +01:00
William Moberg 73f59b89cc Added method EntityFirstHitByRay, takes an Octree or a vector of sorted entities and outputs the frist entity hit by a ray. 2016-02-11 00:11:37 +01:00
antc13 92e7d3ecf7 Merge remote-tracking branch 'origin/master' into Importer
# Conflicts:
#	assets
2016-02-11 00:08:17 +01:00
antc13 4b8f4981a3 New Map with Meshes, WIP. 2016-02-11 00:05:27 +01:00
Tleety 447f41dbff HUD for capture points now update with Capture point data. 2016-02-10 23:59:13 +01:00
Jocke eb244f87c4 Added disconnect functionality and removed some warnings. 2016-02-10 23:27:46 +01:00
Tleety 64a2354b24 WIP with CapturePointHUDSystem 2016-02-10 22:22:09 +01:00
Teejoon 675a80e905 Merge branch 'master' of https://github.com/teamfisk/TacticalZ into Importer 2016-02-10 22:18:42 +01:00
Jocke ec54b1298d Reconnect is now possible. 2016-02-10 21:02:46 +01:00
Tleety f5de267f25 Merge fixes and CapturePointHUD component skeleton added. 2016-02-10 20:58:10 +01:00
Jocke 95fa1f4bbd Connect Fix for TCP Client 2016-02-10 20:10:20 +01:00
Tleety 2cae4e3fb2 Merge remote-tracking branch 'origin/master' into Menu
# Conflicts:
#	include/Engine/Rendering/DrawFinalPass.h
#	include/Engine/Rendering/RenderQueue.h
#	resources/Schema/Components.xsd
#	resources/Schema/Entities/QualityAssurance.xml
#	resources/Schema/Entities/RenderingWorld.xml
#	resources/Shaders/Sprite.vert.glsl
#	src/Engine/Rendering/DrawFinalPass.cpp
#	src/Engine/Rendering/Model.cpp
#	src/Engine/Rendering/RenderSystem.cpp
#	src/Engine/Rendering/Renderer.cpp
#	src/Game/Game.cpp
2016-02-10 19:52:42 +01:00
Tleety 53265bbc90 PNG is now a resource.
You can now load textures threaded.
PNG will now throw exceptions when errors happend
SpriteComponent is now working without billboarding.
2016-02-10 17:50:17 +01:00
Jocke 7cbdc33f84 Updated submodules 2016-02-10 17:39:23 +01:00
Jocke 9645169797 Merge remote-tracking branch 'origin/master' into TCPConnections
# Conflicts:
#	include/Engine/Network/Client.h
#	include/Engine/Network/Network.h
#	include/Engine/Network/Packet.h
#	include/Engine/Network/Server.h
#	src/Engine/Network/Client.cpp
#	src/Engine/Network/Packet.cpp
#	src/Engine/Network/Server.cpp
#	src/Tests/HealthSystemTest.cpp
2016-02-10 17:05:07 +01:00
verysecrethero 02cd822cf1 Tiny test refactoring 2016-02-10 17:04:05 +01:00
verysecrethero f7756ff60f Tiny refactoring of PickupSpawnTest. Updated and fixed HealthSystemTest. 2016-02-10 16:51:00 +01:00
verysecrethero 2d5f71e442 Added 3 PickupSpawnSystem tests. 2016-02-10 16:25:47 +01:00
Jocke 4f2ad3ad00 Reliable message should now be working, further testing is to be done. 2016-02-10 16:16:56 +01:00
Tleety 04c23be136 Merge remote-tracking branch 'origin/master' into Menu 2016-02-10 15:01:51 +01:00
Jocke 2ec30fd2b2 Cleaned up code and fixed crash when closing client before server when using udp. 2016-02-10 11:28:03 +01:00
Jocke d2ed293183 Network is now working as udp or tcp. Next step is making the hybrid. 2016-02-09 19:14:56 +01:00
verysecrethero e9f5a3d263 Renamed some files from temporary filenames to DamageIndicator filenames 2016-02-09 16:28:43 +01:00
verysecrethero 8bdf87da12 Some cleanup of the code 2016-02-09 16:15:19 +01:00
verysecrethero 971fee4a0c DamageIndicatorSystem code looking good. Test working well. Sprite display fixed by Viktor 2016-02-09 15:38:21 +01:00
Jocke fccd8c64e7 WIP Clients are working properly, servers are not. 2016-02-09 11:43:16 +01:00
verysecrethero 0e9fb16399 Work started on DamageIndicatorSystem. Made some initial tests and test calculations 2016-02-08 17:58:07 +01:00
verysecrethero db5301ff2c Merge remote-tracking branch 'origin/Menu' into DamageIndicator 2016-02-08 15:03:45 +01:00
Jocke ba9419b342 Moved UDP logic from Hybrid server/client to UDP server/client. fixed bug in Server::CheckForTimeOuts. 2016-02-08 14:32:00 +01:00
verysecrethero 503613907e Merge remote-tracking branch 'origin/master' into HealthPickup 2016-02-08 11:39:05 +01:00
Jocke 88d7b79cd3 TCP and UDP Client are working for 1 connected player, more players are not tested yet 2016-02-05 18:30:31 +01:00
viktorljung 8034b42c87 spriteComponent WIP 2016-02-05 16:43:57 +01:00
Jocke 9232b24a7b WIP Reliable message 2016-02-04 15:49:04 +01:00
verysecrethero 774e17ffc9 Merge remote-tracking branch 'origin/master' into AssaultDash 2016-02-04 11:42:14 +01:00
Jocke 7bf4f5c30e Merge remote-tracking branch 'origin/master' into TCPConnections 2016-02-03 10:29:36 +01:00
Jocke e133791369 WIP Reliable Message 2016-02-03 10:28:15 +01:00
227 changed files with 18660 additions and 2716 deletions
+1 -1
Submodule assets updated: c56f6380ab...10a611659d
+27 -6
View File
@@ -20,6 +20,9 @@
class World;
struct ComponentWrapper;
template<typename T>
class Octree;
namespace Collision
{
//Return true if the ray hits the box.
@@ -44,21 +47,24 @@ bool RayVsTriangle(const Ray& ray,
float& outVCoord,
bool trueOnNegativeDistance = false);
//Return true if the ray hits any of the triangles in the model. Stops checking when a hit is detected.
bool RayVsModel(const Ray& ray,
const std::vector<RawModel::Vertex>& modelVertices,
const std::vector<unsigned int>& modelIndices);
bool RayVsModel(const Ray& ray,
const RawModel::Vertex* modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix);
//Return true if the ray hits any of the triangles in the model.
//Also returns the position of the intersection point. Will loop through all the whole model indices.
bool RayVsModel(const Ray& ray,
const std::vector<RawModel::Vertex>& modelVertices,
const RawModel::Vertex* modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix,
glm::vec3& outHitPosition);
//Return true if the ray hits any of the triangles in the model.
//Also returns the distance from the ray origin to the closest
//intersection point, and the barycentric u,v-coordinates. Will loop through all the whole model indices.
bool RayVsModel(const Ray& ray,
const std::vector<RawModel::Vertex>& modelVertices,
const RawModel::Vertex* modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix,
float& outDistance,
float& outUCoord,
float& outVCoord);
@@ -72,15 +78,30 @@ bool AABBvsTriangles(const AABB& box,
bool& isOnGround,
glm::vec3& outResolutionVector);
//Detects collision, but does not resolve.
bool AABBvsTriangles(const AABB& box,
const RawModel::Vertex* modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix);
//Return true if the boxes are intersecting.
bool AABBVsAABB(const AABB& a, const AABB& b);
//Return true if the boxes are intersecting.
//Also outputs the minimum translation that box [a] would need in order to resolve collision.
bool AABBVsAABB(const AABB& a, const AABB& b, glm::vec3& minimumTranslation);
// Calculates an absolute AABB from an entity AABB component
// Calculates an absolute AABB from an entity AABB component or Model component.
// if takeModelBox is true, the AABB component will be ignored and box is calculated from Model.
// if takeModelBox is false, the AABB component will be prefered, if it exists.
boost::optional<EntityAABB> EntityAbsoluteAABB(EntityWrapper& entity, bool takeModelBox = false);
boost::optional<EntityAABB> AbsoluteAABBExplosionEffect(EntityWrapper& entity);
//Returns the first entity hit by the input ray. entitiesPotentiallyHitSorted needs to be sorted
//by their distance to the ray, e.g. result from Octree<EntityAABB>::ObjectsPossiblyHitByRay.
//Returns boost::none if none was hit. outDistance will be the distance to the intersection point if the ray intersects.
boost::optional<EntityAABB> EntityFirstHitByRay(const Ray& ray, std::vector<EntityAABB> entitiesPotentiallyHitSorted, float& outDistance, glm::vec3& outIntersectPos);
//Returns the first entity hit by the input ray that exists in the octree.
//outDistance will be the distance to the intersection point if the ray intersects.
boost::optional<EntityAABB> EntityFirstHitByRay(const Ray& ray, Octree<EntityAABB>* octree, float& outDistance, glm::vec3& outIntersectPos);
}
+3 -2
View File
@@ -15,15 +15,16 @@ class CollisionSystem : public PureSystem
public:
CollisionSystem(SystemParams params, Octree<EntityAABB>* octree)
: System(params)
, PureSystem("Collidable")
, PureSystem("Physics")
, m_Octree(octree)
{ }
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override;
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cPhysics, double dt) override;
private:
Octree<EntityAABB>* m_Octree;
std::vector<EntityAABB> m_OctreeResult;
std::unordered_map<EntityWrapper, glm::vec3> m_PrevPositions;
};
#endif
+3 -1
View File
@@ -2,6 +2,7 @@
#define ComponentInfo_h__
#include "../Common.h"
#include <boost/shared_array.hpp>
struct ComponentInfo
{
@@ -27,8 +28,9 @@ struct ComponentInfo
std::string Name;
std::unordered_map<std::string, Field_t> Fields;
std::vector<std::string> FieldsInOrder;
std::vector<std::string> StringFields;
unsigned int Stride = 0;
std::shared_ptr<char> Defaults = nullptr;
boost::shared_array<char> Defaults = nullptr;
std::shared_ptr<Meta_t> Meta = nullptr;
};
+3 -1
View File
@@ -1,6 +1,7 @@
#ifndef ComponentPool_h__
#define ComponentPool_h__
#include <set>
#include "MemoryPool.h"
#include "ComponentInfo.h"
#include "ComponentWrapper.h"
@@ -45,7 +46,8 @@ public:
: m_ComponentInfo(ci)
, m_Pool(ci.Meta->Allocation, sizeof(EntityID) + ci.Stride)
{ }
ComponentPool(const ComponentPool& other) = delete;
~ComponentPool();
ComponentPool(const ComponentPool& other);
ComponentPool(const ComponentPool&& other) = delete;
const ::ComponentInfo& ComponentInfo() const { return m_ComponentInfo; }
+65 -11
View File
@@ -2,11 +2,29 @@
#define ComponentWrapper_h__
#include <boost/shared_array.hpp>
#include <boost/any.hpp>
#include "../Common.h"
#include "Entity.h"
#include "ComponentInfo.h"
#include "Util/Any.h"
template <typename T, typename Enable = void>
struct ComponentField { };
template <typename T>
struct ComponentField<T, typename std::enable_if<std::is_trivially_copyable<T>::value>::type>
{
static T& Get(const ComponentInfo::Field_t& info, char* data) { return *reinterpret_cast<T*>(data); }
static void Set(const ComponentInfo::Field_t& info, char* data, const T& value) { Get(data) = value; }
};
template <>
struct ComponentField<std::string, void>
{
static std::string& Get(const ComponentInfo::Field_t& info, char* data) { return **reinterpret_cast<std::string**>(data); }
static void Set(const ComponentInfo::Field_t& info, char* data, const std::string& value) { Get(info, data) = value; }
};
struct ComponentWrapper
{
ComponentWrapper(const ComponentInfo& componentInfo, char* data)
@@ -47,7 +65,31 @@ struct ComponentWrapper
void Copy(ComponentWrapper& destination)
{
memcpy(destination.Data, this->Data, Info.Stride);
// Copy trivial data
memcpy(destination.Data, Data, Info.Stride);
// Duplicate strings
SolidifyStrings(destination);
}
// When component data has been copied, strings need to be reconstructed or they'll refer to the same data!
static void SolidifyStrings(ComponentWrapper& component)
{
for (auto& name : component.Info.StringFields) {
std::size_t offset = component.Info.Fields.at(name).Offset;
std::string value = *reinterpret_cast<const std::string*>(component.Data + offset);
new (component.Data + offset) std::string(value);
}
}
// This needs to be called to properly free component data, because strings.
static void Destroy(ComponentInfo info, char* data)
{
// Call std::string destructors
for (auto& name : info.StringFields) {
std::size_t offset = info.Fields.at(name).Offset;
auto field = reinterpret_cast<std::string*>(data + offset);
field->~basic_string();
}
}
struct SubscriptProxy
@@ -102,26 +144,38 @@ public:
ComponentWrapperFactory(std::string componentTypeName, unsigned int allocation = 0)
{
m_ComponentInfo.Name = componentTypeName;
m_ComponentInfo.Meta = std::make_shared<ComponentInfo::Meta_t>();
m_ComponentInfo.Meta->Allocation = allocation;
}
template <typename T>
void AddProperty(std::string fieldName, T defaultValue)
{
m_DefaultValues.push_back(defaultValue);
m_ComponentInfo.Fields[fieldName].Type = typeid(T).name();
m_ComponentInfo.Fields[fieldName].Offset = m_ComponentInfo.Stride;
m_ComponentInfo.Fields[fieldName].Stride = sizeof(T);
auto& field = m_ComponentInfo.Fields[fieldName];
field.Name = fieldName;
field.Type = typeid(T).name();
field.Offset = m_ComponentInfo.Stride;
field.Stride = sizeof(T);
m_ComponentInfo.FieldsInOrder.push_back(field.Name);
if (field.Type == typeid(std::string).name()) {
field.Type = "string";
m_ComponentInfo.StringFields.push_back(field.Name);
}
m_ComponentInfo.Stride += sizeof(T);
m_DefaultValues.push_back(std::make_pair(field, defaultValue));
}
ComponentInfo& Finalize()
{
m_ComponentInfo.Defaults = std::shared_ptr<char>(new char[m_ComponentInfo.Stride]);
m_ComponentInfo.Defaults = boost::shared_array<char>(new char[m_ComponentInfo.Stride]);
std::size_t offset = 0;
for (auto& val : m_DefaultValues) {
memcpy(m_ComponentInfo.Defaults.get() + offset, val.Data.get(), val.Size);
offset += val.Size;
for (auto& pair : m_DefaultValues) {
if (pair.first.Type == "string") {
new (m_ComponentInfo.Defaults.get() + offset) std::string(*reinterpret_cast<std::string*>(pair.second.Data.get()));
} else {
memcpy(m_ComponentInfo.Defaults.get() + offset, pair.second.Data.get(), pair.second.Size);
}
offset += pair.second.Size;
}
return m_ComponentInfo;
@@ -131,7 +185,7 @@ public:
private:
ComponentInfo m_ComponentInfo;
std::vector<Any> m_DefaultValues;
std::vector<std::pair<ComponentInfo::Field_t, Any>> m_DefaultValues;
};
#endif
+18
View File
@@ -0,0 +1,18 @@
#ifndef EAmmoPickup_h__
#define EAmmoPickup_h__
#include "EventBroker.h"
#include "../Core/EntityWrapper.h"
namespace Events
{
struct AmmoPickup : Event
{
EntityWrapper Player;
int AmmoGain;
};
}
#endif
+2 -2
View File
@@ -9,8 +9,8 @@ namespace Events
struct PlayerDamage : Event
{
//NOTE: this struct is missing information on what the damageSource is
EntityWrapper Player;
EntityWrapper Inflictor;
EntityWrapper Victim;
double Damage;
};
+2 -1
View File
@@ -9,7 +9,8 @@ namespace Events
struct Shoot : Event
{
EntityWrapper Player;
EntityWrapper Inflictor;
double Damage;
};
}
+22 -5
View File
@@ -66,9 +66,25 @@ public:
, m_LowestAllocatedSlot(m_NumSlots)
{ }
//We may get problems with memory being released
//prematurely, etc. if we allow copies.
MemoryPool(const MemoryPool<T>& other) = delete;
MemoryPool(const MemoryPool<T>& other)
: m_StartAddress(new char[other.m_NumSlots*other.m_Stride])
, m_SlotIsAllocated(other.m_SlotIsAllocated)
, m_ExtraMemory()
, m_NumSlots(other.m_NumSlots)
, m_LowestAllocatedSlot(other.m_LowestAllocatedSlot)
, m_NumAllocatedSlots(other.m_NumAllocatedSlots)
, m_Stride(other.m_Stride)
, m_CurrentAllocSlot(other.m_CurrentAllocSlot)
{
// Copy statically allocated pool
memcpy(m_StartAddress, other.m_StartAddress, m_NumSlots*m_Stride);
// Copy dynamically allocated memory
for (char* otherAddr : other.m_ExtraMemory) {
char* addr = (char*)malloc(m_Stride);
memcpy(addr, otherAddr, m_Stride);
m_ExtraMemory.push_back(addr);
}
}
MemoryPool(const MemoryPool<T>&& other) = delete;
//Free all memory that has been allocated.
@@ -78,8 +94,9 @@ public:
delete[] m_StartAddress;
m_StartAddress = nullptr;
}
for (char* addr : m_ExtraMemory)
free(addr);
for (char* addr : m_ExtraMemory) {
free(addr);
}
m_ExtraMemory.clear();
}
+75
View File
@@ -41,6 +41,8 @@ public:
void ObjectsInSameRegion(const Box& box, std::vector<T>& outObjects);
//Get the objects that are inside the frustum, the objects are put in outObjects.
void ObjectsInFrustum(const Frustum& frustum, std::vector<T>& outObjects);
//Get objects, which AABB the input ray intersects, the objects are put in outObjects.
void ObjectsPossiblyHitByRay(const Ray& ray, std::vector<T>& outObjects);
//Empty the tree of all objects, static and dynamic.
void ClearObjects();
//Empty the tree of all dynamic objects. Static objects remain in the tree.
@@ -100,6 +102,8 @@ struct Child
void ObjectsInSameRegion(const Box& box, std::vector<T>& outObjects) const;
template<typename T>
void ObjectsInFrustum(const Frustum& frustum, std::vector<T>& outObjects, bool takeAllDontTest) const;
template<typename T>
void ObjectsPossiblyHitByRay(const Ray& ray, std::vector<T>& outObjects) const;
void ClearObjects();
void ClearDynamicObjects();
bool RayCollides(const Ray& ray, Output& data) const;
@@ -119,6 +123,15 @@ struct Child
std::vector<int> childIndicesContainingBox(const AABB& box) const;
};
//To be able to sort child nodes and contained objects based on distance to ray origin.
struct RaySorterInfo
{
int Index;
float Distance;
};
bool isFirstLower(const RaySorterInfo& first, const RaySorterInfo& second);
}
template<typename T>
@@ -164,6 +177,13 @@ void Octree<T>::ObjectsInFrustum(const Frustum& frustum, std::vector<T>& outObje
m_Root->ObjectsInFrustum(frustum, outObjects, false);
}
template<typename T>
void Octree<T>::ObjectsPossiblyHitByRay(const Ray& ray, std::vector<T>& outObjects)
{
falsifyObjectChecks();
m_Root->ObjectsPossiblyHitByRay(ray, outObjects);
}
template<typename T>
void Octree<T>::ClearObjects()
{
@@ -282,4 +302,59 @@ void OctSpace::Child::ObjectsInFrustum(const Frustum& frustum, std::vector<T>& o
}
}
template<typename T>
void OctSpace::Child::ObjectsPossiblyHitByRay(const Ray& ray, std::vector<T>& outObjects) const
{
//If the node AABB is missed, everything it contains is missed.
if (Collision::RayAABBIntr(ray, m_Box)) {
//If the ray shoots the tree, and it is a parent.
if (hasChildren()) {
//Sort children according to their distance from the ray origin.
std::vector<RaySorterInfo> childInfos;
childInfos.resize(8);
for (int i = 0; i < 8; ++i) {
childInfos[i] = { i, glm::distance(ray.Origin(), m_Children[i]->m_Box.Origin()) };
}
std::sort(childInfos.begin(), childInfos.end(), isFirstLower);
//Loop through the children, starting with the one closest to the ray origin. I.e the first to be hit.
for (const RaySorterInfo& info : childInfos) {
m_Children[info.Index]->ObjectsPossiblyHitByRay(ray, outObjects);
}
} else {
//Check against boxes in the node.
bool intersected = false;
float dist;
//Sort all contained objects according to the distance from the ray origin to
//the intersection, if they are intersecting.
std::vector<RaySorterInfo> objectHitInfos;
objectHitInfos.reserve(m_StaticObjIndices.size() + m_DynamicObjIndices.size());
for (int i : m_StaticObjIndices) {
//If we haven't tested against this object before, and the ray hits.
if (!m_StaticObjectsRef[i].Checked &&
Collision::RayVsAABB(ray, *m_StaticObjectsRef[i].Box, dist)) {
objectHitInfos.push_back({ i, dist });
}
m_StaticObjectsRef[i].Checked = true;
}
for (int i : m_DynamicObjIndices) {
//If we haven't tested against this object before, and the ray hits.
if (!m_DynamicObjectsRef[i].Checked &&
Collision::RayVsAABB(ray, *m_DynamicObjectsRef[i].Box, dist)) {
objectHitInfos.push_back({ i + (int)m_StaticObjIndices.size(), dist });
}
m_DynamicObjectsRef[i].Checked = true;
}
std::sort(objectHitInfos.begin(), objectHitInfos.end(), isFirstLower);
int startSize = (int)outObjects.size();
outObjects.resize(startSize + objectHitInfos.size());
for (int i = 0; i < objectHitInfos.size(); ++i) {
outObjects[startSize + i] = (objectHitInfos[i].Index < m_StaticObjIndices.size()) ?
*static_cast<T*>(m_StaticObjectsRef[objectHitInfos[i].Index].Box.get()) :
*static_cast<T*>(m_DynamicObjectsRef[objectHitInfos[i].Index - m_StaticObjIndices.size()].Box.get());
}
}
}
}
#endif
+25
View File
@@ -0,0 +1,25 @@
#ifndef PerformanceTimer_h__
#define PerformanceTimer_h__
#include "../Common.h"
#include <boost/timer/timer.hpp>
using boost::timer::cpu_timer;
class PerformanceTimer
{
public:
static void StartTimer(std::string nameOfTimer);
static void StartTimerAndStopPrevious(std::string nameOfTimer);
static void StopTimer(std::string nameOfTimer);
static void SetFrameNumber(int frameNumber);
static void ResetAllTimers();
static void CreateExcelData();
private:
static std::map<std::string, cpu_timer> timers;
static cpu_timer m_Timer;
static std::string currentTimerRunning;
};
#endif
+10 -3
View File
@@ -6,6 +6,7 @@
#include "System.h"
#include "World.h"
#include "EPause.h"
#include "PerformanceTimer.h"
class SystemPipeline
{
@@ -72,7 +73,10 @@ public:
// Update
for (auto& system : group.ImpureSystems) {
auto className = (std::string)typeid(*system).name();
PerformanceTimer::StartTimer(className);
system->Update(dt);
PerformanceTimer::StopTimer(className);
}
for (auto& pair : group.PureSystems) {
const std::string& componentName = pair.first;
@@ -83,7 +87,10 @@ public:
}
for (auto& component : *pool) {
for (auto& system : systems) {
auto className = (std::string)typeid(*system).name();
PerformanceTimer::StartTimer(className);
system->UpdateComponent(EntityWrapper(m_World, component.EntityID), component, dt);
PerformanceTimer::StopTimer(className);
}
}
}
@@ -106,9 +113,9 @@ private:
std::vector<UnorderedSystems> m_OrderedSystemGroups;
EventRelay<SystemPipeline, Events::Pause> m_EPause;
bool OnPause(const Events::Pause& e) {
if (e.World == m_World) {
m_Paused = true;
bool OnPause(const Events::Pause& e) {
if (e.World == m_World) {
m_Paused = true;
}
return true;
}
+4 -3
View File
@@ -2,6 +2,7 @@
#define Util_Any_h__
#include <memory>
#include <boost/shared_array.hpp>
struct Any
{
@@ -10,7 +11,7 @@ struct Any
template <typename T>
Any(const T& value)
{
Data = std::shared_ptr<char>(new char[sizeof(T)]);
Data = boost::shared_array<char>(new char[sizeof(T)]);
Size = sizeof(T);
memcpy(Data.get(), &value, Size);
}
@@ -18,7 +19,7 @@ struct Any
template <typename T>
Any(T&& value)
{
Data = std::shared_ptr<char>(new char[sizeof(T)]);
Data = boost::shared_array<char>(new char[sizeof(T)]);
Size = sizeof(T);
memcpy(Data.get(), &value, Size);
}
@@ -35,7 +36,7 @@ struct Any
return Any(value);
}
std::shared_ptr<char> Data = nullptr;
boost::shared_array<char> Data = nullptr;
std::size_t Size = 0;
};
+1
View File
@@ -15,6 +15,7 @@ public:
: m_EventBroker(eventBroker)
{ }
~World();
World(const World& other);
// Create empty entity
EntityID CreateEntity(EntityID parent = 0);
-165
View File
@@ -1,165 +0,0 @@
#ifndef GUI_BUTTON_H__
#define GUI_BUTTON_H__
#include "GUI/TextureFrame.h"
#include "GUI/EButtonEnter.h"
#include "GUI/EButtonLeave.h"
#include "GUI/EButtonPress.h"
#include "GUI/EButtonRelease.h"
#include "Core/EMouseMove.h"
#include "Core/EMousePress.h"
#include "Core/EMouseRelease.h"
namespace dd
{
namespace GUI
{
class Button : public TextureFrame
{
public:
Button(Frame* parent, std::string name)
: TextureFrame(parent, name)
{
EVENT_SUBSCRIBE_MEMBER(m_EMouseMove, &Button::OnMouseMove);
EVENT_SUBSCRIBE_MEMBER(m_EMousePress, &Button::OnMousePress);
EVENT_SUBSCRIBE_MEMBER(m_EMouseRelease, &Button::OnMouseRelease);
}
void SetTextureHover(std::string resourceName)
{
m_TextureHover = resourceName;
}
void SetTextureReleased(std::string resourceName)
{
m_TextureReleased = resourceName;
SetTexture(resourceName);
}
void SetTexturePressed(std::string resourceName)
{
m_TexturePressed = resourceName;
}
void Draw(RenderScene& rq) override
{
if (m_Texture == nullptr && !m_TextureReleased.empty()) {
SetTexture(m_TextureReleased);
}
TextureFrame::Draw(rq);
}
virtual void OnEnter() { }
virtual void OnLeave() { }
virtual void OnPress() { }
virtual void OnRelease() { }
protected:
bool m_MouseIsOver = false;
bool m_IsDown = false;
virtual bool OnMouseMove(const Events::MouseMove& event)
{
if (Hidden()) {
return false;
}
bool isOver = Rectangle::Intersects(AbsoluteRectangle(), Rectangle(event.X, event.Y, 1, 1));
if (isOver && !m_MouseIsOver) { // Enter
if (!m_IsDown) {
if (!m_TextureHover.empty()) {
SetTexture(m_TextureHover);
}
}
OnEnter();
Events::ButtonEnter e;
e.FrameName = m_Name;
EventBroker->Publish(e);
Events::PlaySound soundEvent;
soundEvent.FilePath = "Sounds/GUI/hover-n.wav";
EventBroker->Publish(soundEvent);
} else if (!isOver && m_MouseIsOver) { // Leave
if (!m_IsDown) {
if (!m_TextureReleased.empty()) {
SetTexture(m_TextureReleased);
}
}
OnLeave();
Events::ButtonLeave e;
e.FrameName = m_Name;
EventBroker->Publish(e);
}
m_MouseIsOver = isOver;
return true;
}
virtual bool OnMousePress(const Events::MousePress& event)
{
if (Hidden()) {
//LOG_DEBUG("Pressed hidden button");
return false;
}
if (!Rectangle::Intersects(AbsoluteRectangle(), Rectangle(event.X, event.Y, 1, 1))) {
return false;
}
if (!m_TexturePressed.empty()) {
SetTexture(m_TexturePressed);
}
m_IsDown = true;
OnPress();
Events::ButtonPress e;
e.FrameName = m_Name;
e.Button = this;
EventBroker->Publish(e);
return true;
}
virtual bool OnMouseRelease(const Events::MouseRelease& event)
{
if (Hidden()) {
//LOG_DEBUG("Released hidden button");
return false;
}
bool isOver = Rectangle::Intersects(AbsoluteRectangle(), Rectangle(event.X, event.Y, 1, 1));
if (!isOver && !m_IsDown) {
return false;
}
if (m_MouseIsOver) {
if (!m_TextureHover.empty()) {
SetTexture(m_TextureHover);
}
} else {
if (!m_TextureReleased.empty()) {
SetTexture(m_TextureReleased);
}
}
m_IsDown = false;
OnRelease();
Events::ButtonRelease e;
e.FrameName = m_Name;
e.Button = this;
EventBroker->Publish(e);
return true;
}
private:
EventRelay<Frame, Events::MouseMove> m_EMouseMove;
EventRelay<Frame, Events::MousePress> m_EMousePress;
EventRelay<Frame, Events::MouseRelease> m_EMouseRelease;
std::string m_TextureHover;
std::string m_TexturePressed;
std::string m_TextureReleased;
};
}
}
#endif
+44
View File
@@ -0,0 +1,44 @@
#ifndef ButtonSystem_h__
#define ButtonSystem_h__
#include "../Rendering/IRenderer.h"
#include "../Core/ConfigFile.h"
#include "../Rendering/PickingPass.h"
#include "../Core/ResourceManager.h"
#include "../Core/System.h"
#include "../Core/Event.h"
#include "../Core/EMousePress.h"
#include "../Core/EMouseRelease.h"
#include "../Core/ELockMouse.h"
#include "EButtonPressed.h"
#include "EButtonReleased.h"
#include "EButtonClicked.h"
class ButtonSystem : public PureSystem
{
public:
ButtonSystem(SystemParams params, IRenderer* renderer);
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override;
private:
IRenderer* m_Renderer;
bool m_MouseIsLocked = false;
EntityWrapper m_PickEntity = EntityWrapper::Invalid;
PickData m_PickData;
EventRelay<ButtonSystem, Events::LockMouse> m_EMouseLock;
bool OnMouseLock(const Events::LockMouse& e);
EventRelay<ButtonSystem, Events::UnlockMouse> m_EMouseUnlock;
bool OnMouseUnlock(const Events::UnlockMouse& e);
EventRelay<ButtonSystem, Events::MousePress> m_EMousePress;
bool OnMousePress(const Events::MousePress& e);
EventRelay<ButtonSystem, Events::MouseRelease> m_EMouseRelease;
bool OnMouseRelease(const Events::MouseRelease& e);
};
#endif
+16
View File
@@ -0,0 +1,16 @@
#ifndef Events_ButtonClicked_h__
#define Events_ButtonClicked_h__
#include "Core/Event.h"
namespace Events
{
struct ButtonClicked : public Event {
std::string EntityName;
EntityWrapper Entity;
};
}
#endif
-17
View File
@@ -1,17 +0,0 @@
#ifndef Events_ButtonEnter_h__
#define Events_ButtonEnter_h__
#include "../Core/EventBroker.h"
namespace Events
{
/** Thrown on GUI button hover. */
struct ButtonEnter : Event
{
std::string FrameName;
};
}
#endif
-17
View File
@@ -1,17 +0,0 @@
#ifndef Events_ButtonLeave_h__
#define Events_ButtonLeave_h__
#include "../Core/EventBroker.h"
namespace Events
{
/** Thrown on GUI button hover. */
struct ButtonLeave : Event
{
std::string FrameName;
};
}
#endif
-20
View File
@@ -1,20 +0,0 @@
#ifndef Events_ButtonPress_h__
#define Events_ButtonPress_h__
#include "../Core/EventBroker.h"
namespace GUI { class Button; }
namespace Events
{
/** Thrown on GUI button press. */
struct ButtonPress : Event
{
std::string FrameName;
GUI::Button* Button;
};
}
#endif
+16
View File
@@ -0,0 +1,16 @@
#ifndef Events_ButtonPressed_h__
#define Events_ButtonPressed_h__
#include "Core/Event.h"
namespace Events
{
struct ButtonPressed : public Event {
std::string EntityName;
EntityWrapper Entity;
};
}
#endif
-20
View File
@@ -1,20 +0,0 @@
#ifndef Events_ButtonRelease_h__
#define Events_ButtonRelease_h__
#include "../Core/EventBroker.h"
namespace GUI { class Button; }
namespace Events
{
/** Thrown on GUI button release. */
struct ButtonRelease : Event
{
std::string FrameName;
GUI::Button* Button;
};
}
#endif
+16
View File
@@ -0,0 +1,16 @@
#ifndef Events_ButtonReleased_h__
#define Events_ButtonReleased_h__
#include "Core/Event.h"
namespace Events
{
struct ButtonReleased : public Event {
std::string EntityName;
EntityWrapper Entity;
};
}
#endif
-261
View File
@@ -1,261 +0,0 @@
#ifndef GUI_Frame_h__
#define GUI_Frame_h__
#include "../Common.h"
#include "../Core/Util/Rectangle.h"
#include "../Core/EventBroker.h"
#include "../Core/EKeyDown.h"
#include "../Core/EKeyUp.h"
#include "../Core/ResourceManager.h"
#include "../Rendering/RenderQueue.h"
#include "../Rendering/Texture.h"
#include "../Input/EInputCommand.h"
namespace GUI
{
class Frame : public Rectangle
{
public:
enum class Anchor
{
Left,
Right,
Top,
Bottom
};
static const int BaseWidth = 1280;
static const int BaseHeight = 720;
// Set up a base frame with an event broker
Frame(EventBroker* eventBroker)
: m_EventBroker(eventBroker)
, BaseFrame(this)
, m_Name("UIParent")
, Rectangle() { }
// Create a frame as a child
Frame(Frame* parent, std::string name)
: m_Name(name)
{
SetParent(parent);
Width = parent->Width;
Height = parent->Height;
EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &Frame::OnKeyDown);
EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &Frame::OnKeyUp);
EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &Frame::OnCommand);
}
~Frame()
{
/*for (auto layer : m_Children)
{
for (auto child : layer.second)
{
delete child.second;
}
}
if (m_Parent)
{
m_Parent->RemoveChild(this);
}*/
}
Frame* Parent() const { return m_Parent; }
void SetParent(Frame* parent)
{
if (parent == nullptr) {
LOG_ERROR("Failed to parent frame \"%s\": Invalid parent", m_Name.c_str());
return;
}
m_Layer = parent->Layer() + 1;
parent->AddChild(this);
m_Parent = parent;
m_EventBroker = parent->m_EventBroker;
BaseFrame = parent->BaseFrame;
}
void AddChild(Frame* child)
{
m_Children[child->m_Layer].insert(std::make_pair(child->Name(), child));
if (m_Parent) {
m_Parent->AddChild(child);
}
}
void RemoveChild(Frame* child)
{
auto it = m_Children.find(child->m_Layer);
if (it != m_Children.end()) {
m_Children.erase(it);
}
if (m_Parent) {
m_Parent->RemoveChild(child);
}
}
std::string Name() const { return m_Name; }
void SetName(std::string val) { m_Name = val; }
int Layer() const { return m_Layer; }
bool Hidden() const
{
if (m_Parent)
return m_Parent->Hidden() || m_Hidden;
else
return m_Hidden;
}
bool Visible() const
{
return !Hidden();
}
virtual void Hide() { m_Hidden = true; }
virtual void Show() { m_Hidden = false; }
int Left() const override
{
if (m_Parent)
return m_Parent->Left() + X;
else
return X;
}
void SetLeft(int absLeft) override
{
if (m_Parent) {
X = absLeft - m_Parent->Left();
} else {
X = absLeft;
}
}
int Right() const override
{
return Left() + Width;
}
void SetRight(int absRight) override
{
if (m_Parent) {
X = absRight - Width - m_Parent->Left();
} else {
X = absRight - Width;
}
}
int Top() const override
{
if (m_Parent)
return m_Parent->Top() + Y;
else
return Y;
}
void SetTop(int absTop) override
{
if (m_Parent) {
Y = absTop - m_Parent->Top();
} else {
Y = absTop;
}
}
int Bottom() const override
{
return Top() + Height;
}
void SetBottom(int absBottom) override
{
if (m_Parent) {
Y = absBottom - Height - m_Parent->Top();
} else {
Y = absBottom - Height;
}
}
glm::vec2 Scale()
{
if (m_Parent)
return m_Parent->Scale();
else
return glm::vec2(Width, Height) / glm::vec2(BaseWidth, BaseHeight);
}
Rectangle AbsoluteRectangle()
{
int left = Left();
if (m_Parent)
left = std::max(left, m_Parent->Left());
int top = Top();
if (m_Parent)
top = std::max(top, m_Parent->Top());
int width = Right() - left;
int height = Bottom() - top;
return Rectangle(left, top, width, height);
}
void UpdateLayered(double dt)
{
// Update ourselves
this->Update(dt);
// Update children
for (auto& pairLayer : m_Children) {
auto children = pairLayer.second;
for (auto& pairChild : children) {
auto child = pairChild.second;
child->Update(dt);
}
}
}
virtual void Update(double dt) { }
void DrawLayered(RenderScene& rq)
{
if (this->Hidden())
return;
// Draw ourselves
this->Draw(rq);
// Draw children
for (auto& pairLayer : m_Children) {
auto children = pairLayer.second;
for (auto& pairChild : children) {
auto child = pairChild.second;
if (child->Hidden())
continue;
child->Draw(rq);
}
}
}
virtual void Draw(RenderScene& rq) { }
protected:
::EventBroker* m_EventBroker;
Frame* BaseFrame = nullptr;
std::string m_Name = "Unnamed";
int m_Layer = 0;
bool m_Hidden = false;
Frame* m_Parent = nullptr;
typedef std::multimap<std::string, Frame*> Children_t; // name -> frame
std::map<int, Children_t> m_Children; // layer -> Children_t
virtual bool OnKeyDown(const Events::KeyDown& event) { return false; }
virtual bool OnKeyUp(const Events::KeyUp& event) { return false; }
virtual bool OnCommand(const Events::InputCommand& event) { return false; }
private:
EventRelay<Frame, Events::KeyDown> m_EKeyDown;
EventRelay<Frame, Events::KeyUp> m_EKeyUp;
EventRelay<Frame, Events::InputCommand> m_EInputCommand;
};
}
#endif
+33
View File
@@ -0,0 +1,33 @@
#ifndef MainMenuSystem_h__
#define MainMenuSystem_h__
#include "../Core/System.h"
#include "../Rendering/IRenderer.h"
#include "../Core/ResourceManager.h"
#include "../Core/Event.h"
#include "EButtonClicked.h"
#include "EButtonPressed.h"
#include "EButtonReleased.h"
class MainMenuSystem : public ImpureSystem
{
public:
MainMenuSystem(SystemParams params, IRenderer* renderer);
virtual void Update(double dt) override;
private:
IRenderer* m_Renderer;
EventRelay<MainMenuSystem, Events::ButtonClicked> m_EClicked;
bool OnButtonClick(const Events::ButtonClicked& e);
EventRelay<MainMenuSystem, Events::ButtonReleased> m_EReleased;
bool OnButtonRelease(const Events::ButtonReleased& e);
EventRelay<MainMenuSystem, Events::ButtonPressed> m_EPressed;
bool OnButtonPress(const Events::ButtonPressed& e);
};
#endif
-111
View File
@@ -1,111 +0,0 @@
#ifndef GUI_TextureFrame_h__
#define GUI_TextureFrame_h__
#include "Frame.h"
#include "../Rendering/Texture.h"
namespace GUI
{
class TextureFrame : public Frame
{
public:
TextureFrame(Frame* parent, std::string name)
: Frame(parent, name) { }
void EnableScissor() { m_ScissorEnabled = true; }
void DisableScissor() { m_ScissorEnabled = false; }
void Draw(RenderScene& rq) override
{
if (m_Texture == nullptr)
return;
// Texture while fading
if (m_FadeTexture && m_CurrentFade < 1) {
FrameJob job;
job.Scissor = (m_ScissorEnabled) ? m_Parent->AbsoluteRectangle() : Rectangle();
job.Viewport = Rectangle(Left(), Top(), Width, Height);
job.TextureID = m_FadeTexture->ResourceID;
job.DiffuseTexture = m_FadeTexture;
job.Color = glm::vec4(m_Color.r, m_Color.g, m_Color.b, m_Color.a);
job.Name = Name();
rq.GUI.Add(job);
}
// Main texture
{
FrameJob job;
job.Scissor = (m_ScissorEnabled) ? m_Parent->AbsoluteRectangle() : Rectangle();
job.Viewport = Rectangle(Left(), Top(), Width, Height);
job.TextureID = m_Texture->ResourceID;
job.DiffuseTexture = m_Texture;
job.Color = glm::vec4(m_Color.r, m_Color.g, m_Color.b, m_Color.a * m_CurrentFade);
job.Name = Name();
rq.GUI.Add(job);
}
}
std::string Texture() const { return m_TextureName; }
void SetTexture(std::string resourceName)
{
if (resourceName.empty()) {
m_Texture = nullptr;
return;
}
m_Texture = ResourceManager::Load<Texture>(resourceName);
m_TextureName = resourceName;
if (m_Texture == nullptr) {
m_Texture = ResourceManager::Load<Texture>("Textures/Core/ErrorTexture.png");
}
SizeToTexture();
}
void SizeToTexture()
{
if (m_Texture != nullptr) {
this->Width = m_Texture->Width;
this->Height = m_Texture->Height;
}
}
void FadeToTexture(std::string resourceName, double duration)
{
m_FadeTexture = m_Texture;
SetTexture(resourceName);
m_FadeDuration = duration;
m_CurrentFade = 0.f;
}
void Update(double dt) override
{
if (m_CurrentFade < 1) {
m_CurrentFade += dt / m_FadeDuration;
if (m_CurrentFade > 1) {
m_FadeTexture = nullptr;
m_CurrentFade = 1;
m_FadeDuration = 0;
}
}
}
glm::vec4 Color() const { return m_Color; }
void SetColor(glm::vec4 val) { m_Color = val; }
protected:
bool m_ScissorEnabled = true;
Texture* m_Texture = nullptr;
std::string m_TextureName;
Texture* m_FadeTexture = nullptr;
glm::vec4 m_Color = glm::vec4(1.f, 1.f, 1.f, 1.f);
float m_FadeDuration = 0.f;
float m_CurrentFade = 1.f;
};
}
#endif
@@ -202,7 +202,7 @@ void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool
}
//dashing with shift
if (m_ShiftDashing && m_AssaultDashCoolDownTimer <= 0.0f && !isJumping) {
if (m_ShiftDashing && m_AssaultDashCoolDownTimer <= 0.0f) {
//player is dashing with shift
//the wanted-direction is set in playermovement already so we dont need to check what direction we want to dash in!
m_AssaultDashCoolDownTimer = assaultDashCoolDownMaxTimer;
@@ -227,7 +227,7 @@ void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool
}
m_ValidDoubleTap = false;
if (!(m_AssaultDashCoolDownTimer <= 0.0f && !isJumping)) {
if (!(m_AssaultDashCoolDownTimer <= 0.0f)) {
//if we cant dash at the moment, then just reset the tap-sensitivity-timer
m_AssaultDashDoubleTapDeltaTime = 0.f;
return;
+39 -12
View File
@@ -13,15 +13,31 @@
#include "Network/Network.h"
#include "Network/MessageType.h"
#include "Network/PlayerDefinition.h"
#include "Network/UDPClient.h"
#include "Network/TCPClient.h"
#include "Network/SnapshotDefinitions.h"
#include "Core/World.h"
#include "Core/EventBroker.h"
#include "Core/ConfigFile.h"
#include "Input/EInputCommand.h"
#include "Core/EPlayerDamage.h"
#include "../Game/Events/EDoubleJump.h"
#include "Network/EInterpolate.h"
#include "Network/SnapshotFilter.h"
#include "Core/EPlayerSpawned.h"
#include "Network/ESearchForServers.h"
struct ServerInfo
{
ServerInfo(std::string a, int b, std::string c, int d)
{
Address = a; Port = b; Name = c; PlayersConnected = d;
}
std::string Address = "";
int Port = 0;
std::string Name = "";
int PlayersConnected = 0;
};
class Client : public Network
{
@@ -32,18 +48,18 @@ public:
void Connect(std::string address, int port);
void Update() override;
private:
UDPClient m_Unreliable;
TCPClient m_Reliable;
std::vector<Events::PlayerSpawned> m_PlayerSpawnEvents;
void parseSpawnEvents();
// Save for children
std::unique_ptr<SnapshotFilter> m_SnapshotFilter = nullptr;
// Assio UDP logic
boost::asio::ip::udp::endpoint m_ReceiverEndpoint;
boost::asio::io_service m_IOService;
boost::asio::ip::udp::socket m_Socket;
std::string m_Address;
int m_Port = 0;
// Sending message to server logic
size_t bytesRead = 0;
char readBuf[INPUTSIZE] = { 0 };
// Packet loss logic
PacketID m_PacketID = 0;
@@ -72,30 +88,32 @@ private:
std::vector<Events::InputCommand> m_InputCommandBuffer;
// Private member functions
void readFromServer();
size_t receive(char* data);
void send(Packet& packet);
void connect();
void disconnect();
void parseMessageType(Packet& packet);
void updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID);
SharedComponentWrapper createSharedComponent(Packet& packet, EntityID entityID, const ComponentInfo& componentInfo);
void ignoreFields(Packet& packet, const ComponentInfo& componentInfo);
void parseConnect(Packet& packet);
void parseUDPConnect(Packet& packet);
void parseTCPConnect(Packet& packet);
void parsePlayerConnected(Packet& packet);
void parsePing();
void parseServerlist(Packet& packet);
void parseKick();
void parsePlayersSpawned(Packet& packet);
void parseEntityDeletion(Packet& packet);
void parsePlayerDamage(Packet& packet);
void parseComponentDeletion(Packet& packet);
void parseDoubleJump(Packet& packet);
void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType);
void parseSnapshot(Packet& packet);
void identifyPacketLoss();
bool hasServerTimedOut();
void hasServerTimedOut();
EntityID createPlayer();
void sendInputCommands();
void sendLocalPlayerTransform();
void becomePlayer();
void displayServerlist();
// Mapping Logic
// Returns if local EntityID exist in map
bool clientServerMapsHasEntity(EntityID clientEntityID);
@@ -111,6 +129,15 @@ private:
bool OnPlayerDamage(const Events::PlayerDamage& e);
EventRelay<Client, Events::PlayerSpawned> m_EPlayerSpawned;
bool OnPlayerSpawned(const Events::PlayerSpawned& e);
EventRelay< Client, Events::SearchForServers> m_ESearchForServers;
EventRelay<Client, Events::DoubleJump> m_EDoubleJump;
bool OnDoubleJump(Events::DoubleJump & e);
bool OnSearchForServers(const Events::SearchForServers& e);
UDPClient m_ServerlistRequest;
std::vector<ServerInfo> m_Serverlist;
bool m_SearchingForServers = false;
std::clock_t m_StartSearchTime;
double m_SearchingTime = 2000; // Config I guess
};
#endif
@@ -0,0 +1,12 @@
#ifndef Events_SearchForServers_h__
#define Events_SearchForServers_h__
#include "Core/Event.h"
namespace Events
{
struct SearchForServers : public Event { };
}
#endif
+4 -1
View File
@@ -18,7 +18,10 @@ enum class MessageType
OnPlayerSpawned,
EntityDeleted,
ComponentDeleted,
PlayerTransform
PlayerTransform,
OnDoubleJump,
ServerlistRequest,
Invalid
};
#endif
+3 -1
View File
@@ -12,7 +12,7 @@
#include <fstream>
#include <iostream>
#define INPUTSIZE 32000
#define BUFFERSIZE 32000
typedef unsigned int PlayerID;
typedef unsigned int PacketID;
@@ -35,6 +35,8 @@ protected:
std::clock_t m_SaveDataTimer;
unsigned int m_MaxConnections;
double m_TimeoutMs;
void logSentData(int bytesSent);
void logReceivedData(int bytesReceived);
void saveToFile();
void updateNetworkData();
};
+24
View File
@@ -0,0 +1,24 @@
#ifndef NetworkClient_h__
#define NetworkClient_h__
#include "Network/Packet.h"
#define BUFFERSIZE 64000
typedef unsigned int PlayerID;
typedef unsigned int PacketID;
class NetworkClient
{
public:
NetworkClient();
virtual ~NetworkClient();
virtual void 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;
virtual bool IsSocketAvailable() = 0;
protected:
char* m_ReadBuffer;
unsigned int m_BufferSize = BUFFERSIZE;
};
#endif
+24
View File
@@ -0,0 +1,24 @@
#ifndef NetworkServer_h__
#define NetworkServer_h__
#include <boost/asio.hpp>
#include "Network/Packet.h"
#include "Network/PlayerDefinition.h"
#define BUFFERSIZE 64000
typedef unsigned int PlayerID;
typedef unsigned int PacketID;
class NetworkServer
{
public:
NetworkServer();
virtual ~NetworkServer();
virtual void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers) = 0;
virtual void Receive(Packet & packet, PlayerDefinition & playerDefinition) = 0;
virtual void Send(Packet & packet, PlayerDefinition & playerDefinition) = 0;
virtual void Send(Packet & packet) = 0;
protected:
char* m_ReadBuffer;
unsigned int m_BufferSize = BUFFERSIZE;
};
#endif
+6
View File
@@ -49,10 +49,15 @@ public:
void WriteData(char* data, int sizeOfData);
// Pops the first element as if it was a string.
std::string ReadString();
// Construct a packet
void ReconstructFromData(char* data, size_t SizeOfData);
// Update size of packet variable in header
void UpdateSize();
char* ReadData(int SizeOfData);
void ChangePacketID(unsigned int& packetID);
size_t Size() { return m_Offset; };
char* Data() { return m_Data; };
MessageType GetMessageType();
size_t DataReadSize() { return m_ReturnDataOffset; }
size_t MaxSize() { return m_MaxPacketSize; }
size_t HeaderSize() { return m_HeaderSize; }
@@ -64,6 +69,7 @@ private:
size_t m_MaxPacketSize = 512;
size_t m_HeaderSize = 0;
void resizeData();
void resizeData(int size);
};
#endif
@@ -2,6 +2,7 @@
#define PlayerDefinition_h__
#include <string>
#include "../Core/Entity.h"
#include <boost/asio.hpp>
struct PlayerDefinition {
::EntityID EntityID = EntityID_Invalid;
@@ -9,6 +10,10 @@ struct PlayerDefinition {
boost::asio::ip::udp::endpoint Endpoint;
unsigned int PacketID;
std::clock_t StopTime;
boost::asio::ip::address TCPAddress;
unsigned short TCPPort;
// use for tcp connections
boost::shared_ptr<boost::asio::ip::tcp::socket> TCPSocket;
};
#endif
+31 -21
View File
@@ -5,8 +5,9 @@
#include <ctime>
#include <glm/common.hpp>
#include <boost/asio/ip/udp.hpp>
#include "Network/TCPServer.h"
#include "Network/UDPServer.h"
#include "Network/MessageType.h"
#include "Network/PlayerDefinition.h"
#include "Core/World.h"
@@ -16,6 +17,7 @@
#include "Core/EPlayerDamage.h"
#include "Network/EPlayerDisconnected.h"
#include "Core/EPlayerSpawned.h"
#include "../Game/Events/EDoubleJump.h"
#include "Core/EEntityDeleted.h"
#include "Core/EComponentDeleted.h"
@@ -28,57 +30,64 @@ public:
void Update() override;
private:
// Network channels
TCPServer m_Reliable;
UDPServer m_Unreliable;
UDPServer m_ServerlistRequest;
// dont forget to set these in the childrens receive logic
boost::asio::ip::address m_Address;
int m_Port = 27666;
// UDP logic
boost::asio::ip::udp::endpoint m_ReceiverEndpoint;
boost::asio::io_service m_IOService;
std::unique_ptr<boost::asio::ip::udp::socket> m_Socket;
// Sending messages to client logic
std::map<PlayerID, PlayerDefinition> m_ConnectedPlayers;
std::vector<PlayerID> m_PlayersToDisconnect;
// HACK: Fix INPUTSIZE
char readBuffer[INPUTSIZE] = { 0 };
char readBuffer[BUFFERSIZE] = { 0 };
size_t bytesRead = 0;
// time for previouse message
std::clock_t previousePingMessage = std::clock();
std::clock_t previousSnapshotMessage = std::clock();
std::clock_t timOutTimer = std::clock();
// How often we send messages (milliseconds)
float pingIntervalMs;
float snapshotInterval;
int checkTimeOutInterval = 100;
int m_NextPlayerID = 0;
std::vector<Events::InputCommand> m_InputCommandsToBroadcast;
//Timers
std::clock_t m_StartPingTime;
// Packet loss logic
PacketID m_PacketID = 0;
PacketID m_PreviousPacketID = 0;
// Private member functions
size_t receive(char* data);
void readFromClients();
void send(PlayerID player, Packet& packet);
void send(Packet& packet);
void broadcast(Packet& packet);
//int receive(char* data);
void reliableBroadcast(Packet& packet);
void unreliableBroadcast(Packet& packet);
void sendSnapshot();
void addPlayersToPacket(Packet& packet, EntityID entityID);
void addChildrenToPacket(Packet& packet, EntityID entityID);
void addInputCommandsToPacket(Packet& packet);
void sendPing();
void checkForTimeOuts();
void disconnect(PlayerID playerID);
void parseMessageType(Packet& packet);
void parseOnInputCommand(Packet& packet);
void parseOnPlayerDamage(Packet& packet);
void parseConnect(Packet& packet);
void parseDisconnect();
void parseClientPing();
void parsePing();
void identifyPacketLoss();
void kick(PlayerID player);
PlayerID GetPlayerIDFromEndpoint(boost::asio::ip::udp::endpoint endpoint);
PlayerID GetPlayerIDFromEndpoint();
void parsePlayerTransform(Packet& packet);
void parseOnInputCommand(Packet& packet);
void parseClientPing();
void parsePing();
bool parseDoubleJump(Packet& packet);
void parseUDPConnect(Packet& packet);
void parseTCPConnect(Packet& packet);
void parseDisconnect();
void parseServerlistRequest(boost::asio::ip::udp::endpoint endpoint);
bool shouldSendToClient(EntityWrapper childEntity);
// Debug event
EventRelay<Server, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(const Events::InputCommand& e);
@@ -88,7 +97,8 @@ private:
bool OnEntityDeleted(const Events::EntityDeleted& e);
EventRelay<Server, Events::ComponentDeleted> m_EComponentDeleted;
bool OnComponentDeleted(const Events::ComponentDeleted& e);
void parsePlayerTransform(Packet& packet);
EventRelay<Server, Events::PlayerDamage> m_EPlayerDamage;
bool OnPlayerDamage(const Events::PlayerDamage& e);
};
#endif
+28
View File
@@ -0,0 +1,28 @@
#ifndef TCPClient_h__
#define TCPClient_h__
#include <boost/asio.hpp>
#include "NetworkClient.h"
class TCPClient : public NetworkClient
{
public:
TCPClient();
~TCPClient();
void Connect(std::string playerName, std::string address, int port);
void Disconnect();
void Receive(Packet& packet);
void Send(Packet & packet);
bool IsSocketAvailable();
private:
// Assio TCP logic
boost::asio::ip::tcp::endpoint m_Endpoint;
boost::asio::io_service m_IOService;
std::unique_ptr<boost::asio::ip::tcp::socket> m_Socket;
size_t readBuffer();
PacketID m_SendPacketID = 0;
bool m_IsConnected = false;
};
#endif
+37
View File
@@ -0,0 +1,37 @@
#ifndef TCPServer_h__
#define TCPServer_h__
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <map>
#include "NetworkServer.h"
class TCPServer : public NetworkServer
{
public:
TCPServer();
~TCPServer();
void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers);
void Receive(Packet & packet, PlayerDefinition & playerDefinition);
void Send(Packet & packet, PlayerDefinition & playerDefinition);
void Send(Packet & packet);
void Disconnect();
int Port() { return m_Port; }
std::string Address() { return m_Address; }
private:
// TCP logic
boost::asio::io_service m_IOService;
std::unique_ptr<boost::asio::ip::tcp::acceptor> acceptor;
boost::shared_ptr<boost::asio::ip::tcp::socket> lastReceivedSocket;
int readBuffer(PlayerDefinition& playerDefinition);
PlayerID getPlayerIDFromEndpoint(const std::map<PlayerID, PlayerDefinition>& connectedPlayers,
boost::asio::ip::address address, unsigned short port);
int GetPort();
std::string GetAddress();
int m_Port = 0;
std::string m_Address = "";
};
#endif
+28
View File
@@ -0,0 +1,28 @@
#ifndef UDPClient_h__
#define UDPClient_h__
#include <boost/asio.hpp>
#include "Network/NetworkClient.h"
class UDPClient : public NetworkClient
{
public:
UDPClient();
~UDPClient();
void Connect(std::string playerName, std::string address, int port);
void Disconnect();
void Receive(Packet& packet);
void Send(Packet & packet);
void Broadcast(Packet& packet, int port);
bool IsSocketAvailable();
private:
// Assio UDP logic
boost::asio::io_service m_IOService;
boost::asio::ip::udp::endpoint m_ReceiverEndpoint;
boost::shared_ptr<boost::asio::ip::udp::socket> m_Socket;
int readBuffer();
PacketID m_SendPacketID = 0;
};
#endif
+28
View File
@@ -0,0 +1,28 @@
#ifndef UDPServer_h__
#define UDPServer_h__
#include "NetworkServer.h"
#include <boost/asio/ip/udp.hpp>
class UDPServer : public NetworkServer
{
public:
UDPServer();
UDPServer(int port);
~UDPServer();
void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers);
void Receive(Packet & packet, PlayerDefinition & playerDefinition);
void Send(Packet & packet, PlayerDefinition & playerDefinition);
void Send(Packet & packet);
void Send(Packet & packet, boost::asio::ip::udp::endpoint endpoint);
void Broadcast(Packet & packet, int port);
bool IsSocketAvailable();
private:
// UDP logic
boost::asio::io_service m_IOService;
boost::asio::ip::udp::endpoint m_ReceiverEndpoint;
std::unique_ptr<boost::asio::ip::udp::socket> m_Socket;
int readBuffer();
};
#endif
+2
View File
@@ -33,6 +33,8 @@ public:
glm::mat4 ViewMatrix() const { return m_ViewMatrix; }
void SetViewMatrix(glm::mat4 val);
glm::mat4 BillboardMatrix();
float AspectRatio() const { return m_AspectRatio; }
void SetAspectRatio(float val);
+27
View File
@@ -0,0 +1,27 @@
#ifndef CubeMapPass_h__
#define CubeMapPass_h__
#include "IRenderer.h"
#include "ShaderProgram.h"
class CubeMapPass
{
public:
CubeMapPass(IRenderer* renderer);
~CubeMapPass() { }
void LoadTextures(std::string input);
void FillCubeMap(glm::vec3 originPosition);
void GenerateCubeMapTexture();
//GLuint CubeMapTexture() const { return m_CubeMapTexture; }
GLuint m_CubeMapTexture = -1;
private:
IRenderer* m_Renderer;
std::string m_PreviusCubeMapTexture;
std::vector<Texture*> m_CubeMapTextures;
};
#endif
+2
View File
@@ -24,6 +24,8 @@ public:
void Draw(GLuint texture);
void OnWindowResize();
//Getters
//Return the blurred result of the texture that was sent into draw
GLuint GaussianTexture() const { return m_GaussianTexture_vert; }
+11 -4
View File
@@ -4,21 +4,24 @@
#include "IRenderer.h"
#include "DrawFinalPassState.h"
#include "LightCullingPass.h"
#include "CubeMapPass.h"
#include "FrameBuffer.h"
#include "ShaderProgram.h"
#include "Util/UnorderedMapVec2.h"
#include "Util/CommonFunctions.h"
#include "Texture.h"
class DrawFinalPass
{
public:
DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass);
DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass);
~DrawFinalPass() { }
void InitializeTextures();
void InitializeFrameBuffers();
void InitializeShaderPrograms();
void Draw(RenderScene& scene);
void Draw(RenderScene& scene, GLuint SSAOTexture);
void ClearBuffer();
void OnWindowResize();
//Return the texture that is used in later stages to apply the bloom effect
GLuint BloomTexture() const { return m_BloomTexture; }
@@ -30,12 +33,12 @@ public:
FrameBuffer* FinalPassFrameBuffer() { return &m_FinalPassFrameBuffer; }
FrameBuffer* FinalPassFrameBufferLowRes() { return &m_FinalPassFrameBufferLowRes; }
private:
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
void GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint format, GLenum type, GLint numMipMaps) const;
void DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene);
void DrawSprites(std::list<std::shared_ptr<RenderJob>>&jobs, RenderScene& scene);
void DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene, GLuint SSAOTexture);
void DrawShieldToStencilBuffer(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene);
void DrawShieldedModelRenderQueue(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene);
void DrawToDepthBuffer(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene);
@@ -50,6 +53,7 @@ private:
Texture* m_BlackTexture;
Texture* m_NeutralNormalTexture;
Texture* m_GreyTexture;
Texture* m_ErrorTexture;
FrameBuffer m_FinalPassFrameBuffer;
FrameBuffer m_FinalPassFrameBufferLowRes;
@@ -59,16 +63,19 @@ private:
GLuint m_SceneTextureLowRes;
GLuint m_DepthBuffer;
GLuint m_DepthBufferLowRes;
GLuint m_CubeMapTexture;
//maqke this component based i guess?
GLuint m_ShieldPixelRate = 16;
const IRenderer* m_Renderer;
const LightCullingPass* m_LightCullingPass;
const CubeMapPass* m_CubeMapPass;
ShaderProgram* m_ForwardPlusProgram;
ShaderProgram* m_ExplosionEffectProgram;
ShaderProgram* m_ExplosionEffectSplatMapProgram;
ShaderProgram* m_SpriteProgram;
ShaderProgram* m_ForwardPlusSplatMapProgram;
ShaderProgram* m_ShieldToStencilProgram;
ShaderProgram* m_FillDepthBufferProgram;
@@ -21,6 +21,7 @@ public:
void SetSSBOSizes();
void CullLights(RenderScene& scene);
void FillLightList(RenderScene& scene);
void OnWindowResize();
GLuint FrustumSSBO() const { return m_FrustumSSBO; }
GLuint LightSSBO() const { return m_LightSSBO; }
+1
View File
@@ -2,6 +2,7 @@
#define Model_h__
#include "Rendering/RawModelCustom.h"
#include "Util/CommonFunctions.h"
//#include "Rendering/RawModelAssimp.h"
#include "../OpenGL.h"
#include "Core/AABB.h"
+31 -4
View File
@@ -108,6 +108,7 @@ struct ModelJob : RenderJob
EndIndex = matGroup->EndIndex;
Matrix = matrix;
Color = modelComponent["Color"];
GlowIntensity = ((double)modelComponent["GlowIntensity"]);
Entity = modelComponent.EntityID;
glm::vec3 abspos = Transform::AbsolutePosition(world, modelComponent.EntityID);
glm::vec3 worldpos = glm::vec3(camera->ViewMatrix() * glm::vec4(abspos, 1));
@@ -120,6 +121,32 @@ struct ModelJob : RenderJob
if (model->IsSkinned()) {
Skeleton = Model->m_RawModel->m_Skeleton;
if (Skeleton != nullptr) {
if (world->HasComponent(Entity, "Animation")) {
auto animationComponent = world->GetComponent(Entity, "Animation");
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;
}
}
}
};
@@ -140,11 +167,11 @@ struct ModelJob : RenderJob
glm::vec4 Color;
const ::Model* Model = nullptr;
::Skeleton* Skeleton = nullptr;
// const ::Skeleton::Animation* Animation = nullptr;
std::vector<::Skeleton::AnimationData> Animations;
::Skeleton::AnimationOffset AnimationOffset;
float GlowIntensity = 8.0;
glm::vec4 DiffuseColor;
glm::vec4 SpecularColor;
glm::vec4 IncandescenceColor;
@@ -157,7 +184,7 @@ struct ModelJob : RenderJob
void CalculateHash() override
{
Hash = TextureID + ModelID << 10 + ShaderID << 20;
Hash = ShaderID << 20 + ModelID << 10 + TextureID;
}
};
+2 -1
View File
@@ -6,9 +6,10 @@
#include <png.h>
#include "../Common.h"
#include "../Core/ResourceManager.h"
#include "Image.h"
class PNG : public Image
class PNG : public Image, public Resource
{
public:
PNG(std::string path);
+3 -1
View File
@@ -22,6 +22,8 @@ public:
void Draw(RenderScene& scene);
void ClearPicking();
void OnWindowResize();
//Getters
const ShaderProgram& PickingProgram() const { return *m_PickingProgram; }
//const std::unordered_map<glm::ivec2, EntityID>& PickingColorsToEntity() const { return m_PickingColorsToEntity; }
@@ -40,7 +42,7 @@ private:
const IRenderer* m_Renderer;
ShaderProgram* m_PickingProgram;
ShaderProgram* m_PickingSkinnedProgram;
ShaderProgram* m_PickingSkinnedProgram;
Camera* m_Camera;
struct PickingInfo
+1 -1
View File
@@ -50,7 +50,7 @@ public:
struct TextureProperties {
std::string TexturePath;
glm::vec2 UVRepeat;
std::shared_ptr<::Texture> Texture;
Texture* Texture;
};
struct MaterialBasic
+3 -1
View File
@@ -15,6 +15,7 @@
#include "PointLightJob.h"
#include "DirectionalLightJob.h"
#include "ExplosionEffectJob.h"
#include "SpriteJob.h"
struct RenderScene
{
@@ -25,6 +26,7 @@ struct RenderScene
std::list<std::shared_ptr<RenderJob>> OpaqueShieldedObjects;
std::list<std::shared_ptr<RenderJob>> TransparentShieldedObjects;
std::list<std::shared_ptr<RenderJob>> ShieldObjects;
std::list<std::shared_ptr<RenderJob>> SpriteJob;
std::list<std::shared_ptr<RenderJob>> PointLight;
std::list<std::shared_ptr<RenderJob>> Text;
std::list<std::shared_ptr<RenderJob>> DirectionalLight;
@@ -41,7 +43,7 @@ struct RenderScene
Jobs.OpaqueShieldedObjects.clear();
Jobs.TransparentShieldedObjects.clear();
Jobs.ShieldObjects.clear();
Jobs.Text.clear();
Jobs.SpriteJob.clear();
Jobs.DirectionalLight.clear();
}
};
+5
View File
@@ -18,6 +18,7 @@
#include "../Core/EPlayerSpawned.h"
#include "../Core/Octree.h"
#include "../Collision/EntityAABB.h"
#include "../Core/ConfigFile.h"
class RenderSystem : public ImpureSystem
{
@@ -47,6 +48,10 @@ private:
void fillPointLights(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
void fillDirectionalLights(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
void fillLight(std::list<std::shared_ptr<RenderJob>>& jobs);
void fillSprites(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
bool isEntityVisible(EntityWrapper& entity);
bool isChildOfACamera(EntityWrapper entity);
bool isChildOfCurrentCamera(EntityWrapper entity);
};
+20
View File
@@ -16,15 +16,21 @@
#include "DrawScreenQuadPass.h"
#include "DrawBloomPass.h"
#include "DrawColorCorrectionPass.h"
#include "SSAOPass.h"
#include "CubeMapPass.h"
#include "../Core/EventBroker.h"
#include "ImGuiRenderPass.h"
#include "Camera.h"
#include "../Core/Transform.h"
#include "imgui/imgui.h"
#include "TextPass.h"
#include "Util/CommonFunctions.h"
#include "Core/PerformanceTimer.h"
class Renderer : public IRenderer
{
static void glfwFrameBufferCallback(GLFWwindow* window, int width, int height);
public:
Renderer(EventBroker* eventBroker)
: m_EventBroker(eventBroker)
@@ -36,8 +42,12 @@ public:
virtual PickData Pick(glm::vec2 screenCoord) override;
private:
//----------------------Variables----------------------//
static std::unordered_map <GLFWwindow*, Renderer*> m_WindowToRenderer;
EventBroker* m_EventBroker;
TextPass* m_TextPass;
@@ -49,6 +59,14 @@ private:
Model* m_UnitSphere;
int m_DebugTextureToDraw = 0;
int m_CubeMapTexture = 0;
bool m_ResizeWindow = false;
float m_SSAO_Radius = 1.0f;
float m_SSAO_Bias = 0.05f;
float m_SSAO_Contrast = 1.5f;
float m_SSAO_IntensityScale = 1.0f;
int m_SSAO_NumOfSamples = 24;
int m_SSAO_NumOfTurns = 7;
PickingPass* m_PickingPass;
LightCullingPass* m_LightCullingPass;
@@ -57,6 +75,8 @@ private:
DrawScreenQuadPass* m_DrawScreenQuadPass;
DrawBloomPass* m_DrawBloomPass;
DrawColorCorrectionPass* m_DrawColorCorrectionPass;
SSAOPass* m_SSAOPass;
CubeMapPass* m_CubeMapPass;
//----------------------Functions----------------------//
void InitializeWindow();
+63
View File
@@ -0,0 +1,63 @@
#ifndef SSAOPass_h__
#define SSAOPass_h__
#include "IRenderer.h"
#include "SSAOPassState.h"
//#include "LightCullingPass.h" Finalpass om den skall skickas in
#include "FrameBuffer.h"
#include "ShaderProgram.h"
#include "DrawBloomPass.h"
//#include "Util/UnorderedMapVec2.h"
#include "Texture.h"
class SSAOPass
{
public:
SSAOPass(IRenderer* rendere);
~SSAOPass() {
delete m_DrawBloomPass;
};
void Draw(GLuint depthBuffer, Camera* camera);
void Setting(float radius, float bias, float contrast, float intensityScale, int numOfSamples, int NumOfTurns);
void ClearBuffer();
void OnWindowResize();
//Return the SSAO of the texture sent to Draw
GLuint SSAOTexture() const { return m_DrawBloomPass->GaussianTexture(); }
private:
void InitializeTexture();
void InitializeFrameBuffer();
void InitializeShaderProgram();
void InitializeBuffer();
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
//void blurHorizontal(GLuint depthBuffer);
//void blurVertical(GLuint depthBuffer);
Model* m_ScreenQuad;
const IRenderer* m_Renderer;
float m_Radius;
float m_Bias;
float m_Contrast;
float m_IntensityScale;
int m_NumOfSamples;
int m_NumOfTurns;
GLuint m_SSAOTexture;
FrameBuffer m_SSAOFramBuffer;
GLuint m_SSAOViewSpaceZTexture;
FrameBuffer m_SSAOViewSpaceZFramBuffer;
ShaderProgram* m_SSAOProgram;
ShaderProgram* m_SSAOViewSpaceZProgram;
DrawBloomPass* m_DrawBloomPass;
};
#endif
+15
View File
@@ -0,0 +1,15 @@
#ifndef SSAOPassState_h__
#define SSAOPassState_h__
#include "Rendering/RenderState.h"
class SSAOPassState : public RenderState
{
public:
SSAOPassState();
~SSAOPassState();
private:
};
#endif
+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;
+7 -28
View File
@@ -100,50 +100,29 @@ public:
int GetBoneID(std::string name);
void CalculateFrameBones(std::vector<AnimationData> animations, AnimationOffset animationOffset, bool noRootMotion = false);
void CalculateFrameBones(std::vector<AnimationData> animations, bool noRootMotion = false);
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, const Bone* bone, glm::mat4 parentMatrix);
void AccumulateBoneTransforms(bool noRootMotion, std::vector<AnimationData> animations, AnimationOffset animationOffset, const Bone* bone, glm::mat4 parentMatrix);
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);
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::vector<glm::mat4> GetBones()
{
std::vector<glm::mat4> finalMatrices;
for (auto &kv : m_BoneLocalTransforms) {
finalMatrices.push_back(kv.second);
}
return finalMatrices;;
}
glm::mat4 GetBoneTransformSuper(int boneID)
{
if(m_BoneTransforms.find(boneID) != m_BoneTransforms.end()) {
return m_BoneTransforms.at(boneID);
} else {
return glm::mat4(1);
}
}
private:
glm::mat4 GetOffsetTransform(const Bone* bone, AnimationOffset animationOffset);
std::map<std::string, Bone*> m_BonesByName;
float aim = 0.f;
std::map<int, glm::mat4> m_BoneLocalTransforms;
std::map<int, glm::mat4> m_BoneTransforms;
};
#endif
+78
View File
@@ -0,0 +1,78 @@
#ifndef SpriteJob_h__
#define SpriteJob_h__
#include <cstdint>
#include "../Common.h"
#include "../GLM.h"
#include "../Core/ComponentWrapper.h"
#include "Texture.h"
#include "Model.h"
#include "RenderJob.h"
#include "../Core/ResourceManager.h"
#include "Camera.h"
#include "../Core/World.h"
#include "../Core/Transform.h"
#include "Skeleton.h"
struct SpriteJob : RenderJob
{
SpriteJob(ComponentWrapper cSprite, Camera* camera, glm::mat4 matrix, World* world, glm::vec4 fillColor, float fillPercentage, bool depthSorted, bool isIndicator)
: RenderJob()
{
Model = ResourceManager::Load<::Model>("Models/Core/UnitQuad.mesh");
::RawModel::MaterialProperties matProp = Model->MaterialGroups().front();
TextureID = 0;
DiffuseTexture = CommonFunctions::LoadTexture(cSprite["DiffuseTexture"], true);
IncandescenceTexture = CommonFunctions::LoadTexture(cSprite["GlowMap"], true);
StartIndex = matProp.material->StartIndex;
EndIndex = matProp.material->EndIndex;
Matrix = matrix;
Color = cSprite["Color"];
Entity = cSprite.EntityID;
Position = Transform::AbsolutePosition(world, cSprite.EntityID);
Depth = 0;
if (depthSorted) {
glm::vec3 viewpos = glm::vec3(camera->ViewMatrix() * glm::vec4(Position, 1));
Depth = viewpos.z;
}
World = world;
Pickable = world->HasComponent(cSprite.EntityID, "Button");
IsIndicator = isIndicator;
FillColor = fillColor;
FillPercentage = fillPercentage;
};
unsigned int TextureID;
EntityID Entity;
glm::mat4 Matrix;
const Texture* DiffuseTexture;
const Texture* NormalTexture;
const Texture* SpecularTexture;
const Texture* IncandescenceTexture;
float Shininess = 0.f;
glm::vec4 Color;
glm::vec3 Position;
const ::Model* Model = nullptr;
unsigned int StartIndex = 0;
unsigned int EndIndex = 0;
World* World;
bool Pickable;
bool IsIndicator = false;
glm::vec4 FillColor = glm::vec4(0);
float FillPercentage = 0.0;
void CalculateHash() override
{
Hash = TextureID;
}
};
#endif
+1
View File
@@ -18,6 +18,7 @@ public:
void Bind(GLenum textureUnit = GL_TEXTURE0);
GLuint m_Texture = 0;
unsigned char* Data = nullptr;
};
@@ -4,14 +4,11 @@
#include "../../Common.h"
#include "../../OpenGL.h"
#include "../../GLM.h"
#include "../Texture.h"
class CommonFuntions
{
public:
CommonFuntions() = delete;
private:
namespace CommonFunctions
{
Texture* LoadTexture(std::string path, bool threaded);
};
#endif
+1 -1
View File
@@ -8,7 +8,7 @@ namespace Events
struct DoubleJump : public Event
{
EntityID entityID;
};
}
+3 -2
View File
@@ -8,7 +8,6 @@
#include "Core/EventBroker.h"
#include "Rendering/Renderer.h"
#include "Core/InputManager.h"
#include "GUI/Frame.h"
#include "Core/World.h"
#include "Input/InputProxy.h"
#include "Input/KeyboardInputHandler.h"
@@ -35,6 +34,9 @@
#include "Sound/SoundManager.h"
#include "Systems/SoundSystem.h"
//Performance
#include "Core/PerformanceTimer.h"
class Game
{
public:
@@ -53,7 +55,6 @@ private:
IRenderer* m_Renderer;
InputManager* m_InputManager;
InputProxy* m_InputProxy;
GUI::Frame* m_FrameStack;
World* m_World;
Octree<EntityAABB>* m_OctreeCollision;
Octree<EntityAABB>* m_OctreeTrigger;
+8
View File
@@ -0,0 +1,8 @@
#ifndef MiniDump_h__
#define MiniDump_h__
#include <Windows.h>
void WINAPI Create_Dump(PEXCEPTION_POINTERS pException, BOOL File_Flag, BOOL Show_Flag);
#endif
+33
View File
@@ -0,0 +1,33 @@
#ifndef AmmoPickupSystem_h__
#define AmmoPickupSystem_h__
#include "Core/System.h"
#include "Core/Transform.h"
#include "Core/ResourceManager.h"
#include "Core/EntityFileParser.h"
#include "Core/EPickupSpawned.h"
#include "Core/EAmmoPickup.h"
#include "Engine/Collision/ETrigger.h"
#include "Common.h"
class AmmoPickupSystem : public ImpureSystem
{
public:
AmmoPickupSystem(SystemParams params);
virtual void Update(double dt) override;
private:
EventRelay<AmmoPickupSystem, Events::TriggerTouch> m_ETriggerTouch;
bool OnTriggerTouch(Events::TriggerTouch& e);
struct NewAmmoPickup {
glm::vec3 Pos;
double AmmoGain;
double RespawnTimer;
double DecreaseThisRespawnTimer;
EntityID parentID;
};
std::vector<NewAmmoPickup> m_ETriggerTouchVector;
};
#endif
@@ -0,0 +1,17 @@
#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,22 @@
#ifndef CapturePointHUDSystem_h__
#define CapturePointHUDSystem_h__
#include <GLFW/glfw3.h>
#include <glm/common.hpp>
#include <glm/gtc/quaternion.hpp>
#include "Common.h"
#include "Core/System.h"
#include "Engine/Collision/ETrigger.h"
class CapturePointHUDSystem : public ImpureSystem
{
public:
CapturePointHUDSystem(SystemParams params);
virtual void Update(double dt) override;
private:
};
#endif
@@ -44,7 +44,6 @@ private:
//std::vector<ComponentWrapper>
const double m_CaptureTimeToTakeOver = 15.0;
bool m_ResetTimers = false;
//vectors which will keep track of enter/leave changes
@@ -0,0 +1,49 @@
#ifndef DamageIndicatorSystem_h__
#define DamageIndicatorSystem_h__
#include "Core/System.h"
#include "Core/Transform.h"
#include "Core/ResourceManager.h"
#include "Core/EntityFileParser.h"
#include "Core/EPlayerDamage.h"
#include "Common.h"
#include <tuple>
#include "Rendering/ESetCamera.h"
#include <glm/gtc/quaternion.hpp>
#include <glm/gtx/vector_angle.hpp>
#include "Rendering/Util/CommonFunctions.h"
//#define INDICATOR_TEST
class DamageIndicatorSystem : public ImpureSystem
{
public:
DamageIndicatorSystem(SystemParams params);
virtual void Update(double dt) override;
private:
EventRelay<DamageIndicatorSystem, Events::PlayerDamage> m_EPlayerDamage;
bool OnPlayerDamage(Events::PlayerDamage& e);
EventRelay<DamageIndicatorSystem, Events::SetCamera> m_ESetCamera;
bool OnSetCamera(const Events::SetCamera& e);
EntityID m_CurrentCamera = -1;
struct DamageIndicatorStruct {
EntityWrapper spriteEntity;
glm::vec3 enemyPosition;
DamageIndicatorStruct(EntityWrapper sprite, glm::vec3 pos)
: spriteEntity(sprite)
, enemyPosition(pos) {}
};
std::vector<DamageIndicatorStruct> updateDamageIndicatorVector;
float CalculateAngle(EntityWrapper player, glm::vec3 enemyPos);
//for tests
#ifdef INDICATOR_TEST
glm::vec3 DamageIndicatorTest(EntityWrapper player);
int m_TestVar = 0;
#endif
};
#endif
@@ -3,13 +3,11 @@
#include "../../Engine/Core/System.h"
#include "../../Engine/GLM.h"
#include "../../Engine/Rendering/ESetCamera.h"
#include <imgui/imgui.h>
class PlayerHUDSystem : public ImpureSystem
class HealthHUDSystem : public ImpureSystem
{
public:
PlayerHUDSystem(SystemParams params)
HealthHUDSystem(SystemParams params)
: System(params)
{ }
+7 -2
View File
@@ -9,6 +9,8 @@
#include "Core/EPlayerDamage.h"
#include "Core/EPlayerHealthPickup.h"
#include "Core/EPlayerDeath.h"
#include "Core/ConfigFile.h"
#include "Input/EInputCommand.h"
#include <tuple>
#include <vector>
@@ -23,15 +25,18 @@ public:
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override;
private:
//methods which will take care of specific events
bool m_NetworkEnabled;
// methods which will take care of specific events
EventRelay<HealthSystem, Events::PlayerDamage> m_EPlayerDamage;
bool HealthSystem::OnPlayerDamaged(Events::PlayerDamage& e);
EventRelay<HealthSystem, Events::PlayerHealthPickup> m_EPlayerHealthPickup;
bool HealthSystem::OnPlayerHealthPickup(Events::PlayerHealthPickup& e);
EventRelay<HealthSystem, Events::InputCommand> m_InputCommand;
bool HealthSystem::OnInputCommand(Events::InputCommand& e);
//vector which will keep track of health changes
std::vector<std::tuple<EntityID, double>> m_DeltaHealthVector;
};
#endif
+39
View File
@@ -0,0 +1,39 @@
#ifndef KillFeedSystem_h__
#define KillFeedSystem_h__
#include "../../Engine/Core/System.h"
#include "../../Engine/GLM.h"
#include "Core/EPlayerDeath.h"
class KillFeedSystem : public ImpureSystem
{
public:
KillFeedSystem(SystemParams params)
: System(params)
{
EVENT_SUBSCRIBE_MEMBER(m_EPlayerDeath, &KillFeedSystem::OnPlayerDeath);
}
virtual void Update(double dt) override;
private:
EventRelay<KillFeedSystem, Events::PlayerDeath> m_EPlayerDeath;
bool KillFeedSystem::OnPlayerDeath(Events::PlayerDeath& e);
struct KillFeedInfo
{
std::string Content;
glm::vec4 Color;
float TimeToLive = 5.f;
};
std::list<KillFeedInfo> m_DeathQueue;
};
#endif
+1
View File
@@ -27,6 +27,7 @@ private:
double HealthGain;
double RespawnTimer;
double DecreaseThisRespawnTimer;
EntityID parentID;
};
std::vector<NewHealthPickup> m_ETriggerTouchVector;
};
+5 -1
View File
@@ -34,10 +34,14 @@ private:
glm::vec3 m_LastPosition = glm::vec3();
// The logic for making the sound play when player is moving
void playerStep(double dt);
// Spawn a hexagon at origin of an Entity
void spawnHexagon(EntityWrapper target);
EventRelay<PlayerMovementSystem, Events::PlayerSpawned> m_EPlayerSpawned;
bool OnPlayerSpawned(Events::PlayerSpawned& e);
EventRelay<PlayerMovementSystem, Events::DoubleJump> m_EDoubleJump;
bool PlayerMovementSystem::OnDoubleJump(Events::DoubleJump & e);
void updateMovementControllers(double dt);
void updateVelocity(double dt);
void updateVelocity(EntityWrapper player, double dt);
};
+12 -1
View File
@@ -13,6 +13,8 @@ public:
PlayerSpawnSystem(SystemParams params);
virtual void Update(double dt) override;
static void SetRespawnTime(float respawnTime) { m_RespawnTime = respawnTime; };
private:
struct SpawnRequest
@@ -23,10 +25,19 @@ private:
bool m_NetworkEnabled = false;
std::vector<SpawnRequest> m_SpawnRequests;
//Player ID -> EntityWrapper.
std::map<int, EntityWrapper> m_PlayerEntities;
//EntityWrapper ID -> Player ID.
std::map<EntityID, int> m_PlayerIDs;
static float m_RespawnTime;
float m_Timer;
EventRelay<PlayerSpawnSystem, Events::InputCommand> m_OnInputCommand;
bool OnInputCommand(const Events::InputCommand& e);
bool OnInputCommand(Events::InputCommand& e);
EventRelay<PlayerSpawnSystem, Events::PlayerSpawned> m_OnPlayerSpawnerd;
bool OnPlayerSpawned(Events::PlayerSpawned& e);
EventRelay<PlayerSpawnSystem, Events::PlayerDeath> m_OnPlayerDeath;
bool OnPlayerDeath(Events::PlayerDeath& e);
};
+6 -1
View File
@@ -15,11 +15,16 @@ class SpawnerSystem : public System
public:
SpawnerSystem(SystemParams params);
static EntityWrapper Spawn(EntityWrapper spawner, EntityWrapper parent = EntityWrapper::Invalid);
// If dontCollideComponent is set, to e.g. "Player", then all the spawner
// will try to pick a spawn location so that the spawned entity doesn't
// collide with anything that has that component and is collidable.
static EntityWrapper Spawn(EntityWrapper spawner, EntityWrapper parent = EntityWrapper::Invalid, const std::string& dontCollideComponent = "");
private:
EventRelay<SpawnerSystem, Events::SpawnerSpawn> m_OnSpawnerSpawn;
bool OnSpawnerSpawn(Events::SpawnerSpawn& e);
static void transformEntityToSpawnPoint(EntityWrapper spawnedEntity, EntityWrapper spawnPoint);
static bool spawnedEntityIsColliding(EntityWrapper spawnedEntity, EntityWrapper spawnPoint, const std::string& dontCollideComponent);
};
#endif
@@ -0,0 +1,49 @@
#include "Sound/EPlaySoundOnEntity.h"
#include "Collision/Collision.h"
#include "Rendering/AnimationSystem.h"
#include "Core/ConfigFile.h"
#include "WeaponBehaviour.h"
#include "../SpawnerSystem.h"
#include "Core/EPlayerDamage.h"
#include "Core/EShoot.h"
class AssaultWeaponBehaviour : public WeaponBehaviour
{
public:
AssaultWeaponBehaviour(SystemParams systemParams, IRenderer* renderer, Octree<EntityAABB>* collisionOctree, EntityWrapper weaponEntity);
virtual void Fire() override;
virtual void CeaseFire() override;
virtual void Reload() override;
virtual void Update(double dt) override;
private:
EntityWrapper m_FirstPersonModel;
EntityWrapper m_ThirdPersonModel;
// State
bool m_Firing = false;
bool m_Reloading = false;
double m_ReloadTimer = 0.0;
EntityWrapper m_FirstPersonReloadImpersonator;
EntityWrapper m_ThirdPersonReloadImpersonator;
double m_TimeSinceLastFire = 0.0;
EventRelay<WeaponBehaviour, Events::AnimationComplete> m_EAnimationComplete;
bool OnAnimationComplete(Events::AnimationComplete& e);
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();
};
@@ -0,0 +1,34 @@
#ifndef WeaponBehaviour_h__
#define WeaponBehaviour_h__
#include "Core/System.h"
#include "Rendering/IRenderer.h"
#include "Core/Octree.h"
#include "Collision/EntityAABB.h"
class WeaponBehaviour : public System
{
public:
WeaponBehaviour(SystemParams systemParams, IRenderer* renderer, Octree<EntityAABB>* collisionOctree, EntityWrapper player)
: System(systemParams)
, m_Renderer(renderer)
, m_CollisionOctree(collisionOctree)
, m_Player(player)
{ }
virtual ~WeaponBehaviour() = default;
WeaponBehaviour(const WeaponBehaviour&) = delete;
WeaponBehaviour& operator=(const WeaponBehaviour &) = delete;
virtual void Fire() = 0;
virtual void CeaseFire() { }
virtual void Reload() { }
virtual void Update(double dt) { }
protected:
IRenderer* m_Renderer;
Octree<EntityAABB>* m_CollisionOctree;
EntityWrapper m_Player;
};
#endif
@@ -0,0 +1,44 @@
#ifndef WeaponSystem_h__
#define WeaponSystem_h__
#include "Rendering/IRenderer.h"
#include "Common.h"
#include "Core/System.h"
#include "Core/EPlayerDamage.h"
#include "Core/EShoot.h"
#include "Core/EPlayerSpawned.h"
#include "Input/EInputCommand.h"
#include "Core/EntityFile.h"
#include "Core/EntityFileParser.h"
#include "Core/Octree.h"
#include "Collision/EntityAABB.h"
#include "Systems/SpawnerSystem.h"
#include "Sound/EPlaySoundOnEntity.h"
#include "AssaultWeaponBehaviour.h"
class WeaponSystem : public PureSystem, ImpureSystem
{
public:
WeaponSystem(SystemParams params, IRenderer* renderer, Octree<EntityAABB>* collisionOctree);
virtual void Update(double dt) override;
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cPlayer, double dt) override;
private:
SystemParams m_SystemParams;
IRenderer* m_Renderer;
Octree<EntityAABB>* m_CollisionOctree;
std::unordered_map<EntityWrapper, std::shared_ptr<WeaponBehaviour>> m_ActiveWeapons;
// Events
EventRelay<WeaponSystem, Events::PlayerSpawned> m_EPlayerSpawned;
bool OnPlayerSpawned(Events::PlayerSpawned& e);
EventRelay<WeaponSystem, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(Events::InputCommand& e);
void selectWeapon(EntityWrapper player, ComponentInfo::EnumType slot);
};
#endif
-192
View File
@@ -1,192 +0,0 @@
#ifndef WeaponSystem_h__
#define WeaponSystem_h__
//#include <GLFW/glfw3.h>
//#include <glm/common.hpp>
#include "Rendering/IRenderer.h"
#include "Common.h"
#include "Core/System.h"
#include "Core/EPlayerDamage.h"
#include "Core/EShoot.h"
#include "Core/EPlayerSpawned.h"
#include "Input/EInputCommand.h"
#include "Core/EntityFile.h"
#include "Core/EntityFileParser.h"
#include "Core/Octree.h"
#include "Collision/EntityAABB.h"
#include "Systems/SpawnerSystem.h"
#include "Sound/EPlaySoundOnEntity.h"
class WeaponBehaviour;
class WeaponSystem : public PureSystem, ImpureSystem
{
public:
WeaponSystem(SystemParams params, IRenderer* renderer, Octree<EntityAABB>* collisionOctree);
virtual void Update(double dt) override;
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cPlayer, double dt) override;
private:
SystemParams m_SystemParams;
IRenderer* m_Renderer;
Octree<EntityAABB>* m_CollisionOctree;
std::unordered_map<EntityWrapper, std::shared_ptr<WeaponBehaviour>> m_ActiveWeapons;
// Events
EventRelay<WeaponSystem, Events::PlayerSpawned> m_EPlayerSpawned;
bool OnPlayerSpawned(Events::PlayerSpawned& e);
EventRelay<WeaponSystem, Events::Shoot> m_EShoot;
bool OnShoot(Events::Shoot& e);
EventRelay<WeaponSystem, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(Events::InputCommand& e);
void selectWeapon(EntityWrapper player, ComponentInfo::EnumType slot);
};
class WeaponBehaviour : public System
{
public:
WeaponBehaviour(SystemParams systemParams, Octree<EntityAABB>* collisionOctree, EntityWrapper weaponEntity)
: System(systemParams)
, m_CollisionOctree(collisionOctree)
, m_Entity(weaponEntity)
{ }
virtual ~WeaponBehaviour() = default;
WeaponBehaviour(const WeaponBehaviour&) = delete;
WeaponBehaviour& operator=(const WeaponBehaviour &) = delete;
virtual void Fire() = 0;
virtual void CeaseFire() { }
virtual void Reload() { }
virtual void Update(double dt) { }
protected:
Octree<EntityAABB>* m_CollisionOctree;
EntityWrapper m_Entity;
};
class AssaultWeaponBehaviour : public WeaponBehaviour
{
public:
AssaultWeaponBehaviour(SystemParams systemParams, Octree<EntityAABB>* collisionOctree, EntityWrapper weaponEntity)
: WeaponBehaviour(systemParams, collisionOctree, weaponEntity)
{ }
virtual void Fire() override
{
m_TimeSinceLastFire = 0.0;
m_Firing = true;
fireRound();
}
virtual void CeaseFire() override
{
m_Firing = false;
}
virtual void Reload() override
{
ComponentWrapper& cAssaultWeapon = m_Entity["AssaultWeapon"];
int& magAmmo = cAssaultWeapon["MagazineAmmo"];
int magSize = cAssaultWeapon["MagazineSize"];
int& ammo = cAssaultWeapon["Ammo"];
// Don't reload if we're already fully loaded
if (magAmmo == magSize) {
return;
}
// Throw away rounds in magazine to incentivise ammo sharing
int toLoad = glm::min(magSize, ammo);
magAmmo = toLoad;
ammo -= toLoad;
}
virtual void Update(double dt) override
{
if (!m_Firing) {
return;
}
m_TimeSinceLastFire += dt;
ComponentWrapper& cAssaultWeapon = m_Entity["AssaultWeapon"];
if (m_TimeSinceLastFire >= 1.0 / ((double)cAssaultWeapon["RPM"] / 60.0)) {
fireRound();
}
}
private:
bool m_Firing = false;
double m_TimeSinceLastFire = 0.0;
EntityFile* m_RayRed = nullptr;
EntityFile* m_RayBlue = nullptr;
void fireRound()
{
ComponentWrapper& cAssaultWeapon = m_Entity["AssaultWeapon"];
int& magAmmo = cAssaultWeapon["MagazineAmmo"];
int ammo = cAssaultWeapon["Ammo"];
// Reload if our magazine is empty
if (magAmmo <= 0) {
Reload();
return;
}
// Fire
magAmmo -= 1;
spawnTracer();
playSound();
m_TimeSinceLastFire = 0.0;
}
void spawnTracer()
{
if (!IsClient) {
return;
}
EntityWrapper spawner;
if (m_Entity == LocalPlayer) {
spawner = m_Entity.FirstChildByName("WeaponMuzzle");
} else {
spawner = m_Entity.FirstChildByName("ThirdPersonWeaponMuzzle");
}
if (!spawner.Valid()) {
return;
}
Events::SpawnerSpawn e;
e.Spawner = spawner;
m_EventBroker->Publish(e);
}
float traceRayDistance(glm::vec3 origin, glm::vec3 direction)
{
// TODO: Cast a ray and size tracer appropriately
return 100.f;
}
void playSound()
{
if (!IsClient) {
return;
}
Events::PlaySoundOnEntity e;
e.EmitterID = m_Entity.ID;
e.FilePath = "Audio/laser/laser1.wav";
m_EventBroker->Publish(e);
}
};
#endif
+4 -1
View File
@@ -4,6 +4,9 @@ LoadMap=
; if true -> Pool allocation is not used when calling Allocate/Free, just use regular dynamic allocation.
; if false -> Use pool allocation.
DisableMemoryPool=false
RespawnTime = 8.0
EditorEnabled=false
OutOfBodyExperience=false
[Editor]
CameraSpeed=3
@@ -20,7 +23,7 @@ StartNetwork=false
IsServer=false
Name=Bob
Address=127.0.0.1
Port=13
Port=27666
MaxConnections=8
SnapshotInterval=0.05
SendInputIntervalMs=33
+4 -1
View File
@@ -24,4 +24,7 @@ F1=ToggleEditor
C=ConnectToServer
N=SwitchToServer
M=SwitchToClient
P=SwitchToPlayer
P=SwitchToPlayer
K=TakeDamage,1500
F2=PerformanceTimingResetAllTimers
F3=PerformanceTimingCreateExcelData
+9
View File
@@ -32,9 +32,18 @@
<xs:include schemaLocation="Components/Lifetime.xsd"/>
<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/AssaultWeapon.xsd"/>
<xs:include schemaLocation="Components/Shield.xsd"/>
<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/Menu.xsd"/>
<xs:include schemaLocation="Components/KillFeed.xsd"/>
<xs:include schemaLocation="Components/Page.xsd"/>
<xs:include schemaLocation="Components/SpriteIndicator.xsd"/>
<xs:include schemaLocation="Components/Button.xsd"/>
</xs:schema>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<AmmoPickup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="AmmoPickup.xsd">
<RespawnTimer>3</RespawnTimer>
<AmmoGain>30</AmmoGain>
</AmmoPickup>
@@ -0,0 +1,21 @@
<?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="AmmoPickup">
<xs:annotation>
<xs:documentation>An Ammo Pickup</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:all>
<xs:element name="RespawnTimer" type="t:double" minOccurs="0">
<xs:annotation><xs:documentation>The respawn timer for a ammo pickup</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="AmmoGain" type="t:double" minOccurs="0">
<xs:annotation><xs:documentation>How much percent ammo gain the player will get</xs:documentation></xs:annotation>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<AmmunitionHUD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="AmmunitionHUD.xsd">
</AmmunitionHUD>
@@ -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: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>
@@ -6,4 +6,6 @@
<MaxAmmo>360</MaxAmmo>
<BaseDamage>5</BaseDamage>
<RPM>120</RPM>
<ViewPunch>0.01</ViewPunch>
<ReloadTime>2</ReloadTime>
</AssaultWeapon>
@@ -22,6 +22,12 @@
<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: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:element>
</xs:all>
</xs:complexType>
</xs:element>
+3
View File
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Button xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Button.xsd">
</Button>
+10
View File
@@ -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="Button">
<xs:annotation>
<xs:documentation>Makes sprites klickable.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
@@ -2,5 +2,6 @@
<CapturePoint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="CapturePoint.xsd">
<CapturePointNumber>0</CapturePointNumber>
<CaptureTimer>0</CaptureTimer>
<CapturePointMaxTimer>15</CapturePointMaxTimer>
<HomePointForTeam><Spectator/></HomePointForTeam>
</CapturePoint>
+5 -1
View File
@@ -20,7 +20,11 @@
<xs:documentation>CapturePointNumber specify an int number for this</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="CapturePointMaxTimer" type="t:double" minOccurs="0">
<xs:annotation>
<xs:documentation>The time needed to take over a Capture Point</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="HomePointForTeam" type="TeamEnum" minOccurs="0">
<xs:annotation>
<xs:documentation>Specify if this is a HomePoint for either team</xs:documentation>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<CapturePointHUD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="CapturePointHUD.xsd">
<CapturePointNumber>0</CapturePointNumber>
<Owner><Spectator/></Owner>
</CapturePointHUD>
@@ -0,0 +1,24 @@
<?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="CapturePointHUD">
<xs:annotation>
<xs:documentation>Hud element for tracking capture points.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:all>
<xs:element name="CapturePointNumber" type="t:int" minOccurs="0">
<xs:annotation>
<xs:documentation>Corresponds to the number on the capture point it should track.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Owner" type="TeamEnum" minOccurs="0">
<xs:annotation>
<xs:documentation>Specify the team that own this capturePoint.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
+3
View File
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<KillFeed xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="KillFeed.xsd">
</KillFeed>
+9
View File
@@ -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="KillFeed">
<xs:annotation>
<xs:documentation>HUD element for tracking the 3 last kills, printed on the children with the names "KillFeed1", "KillFeed2", "KillFeed3"</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
+3
View File
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Menu xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Menu.xsd">
</Menu>
+9
View File
@@ -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="Menu">
<xs:annotation>
<xs:documentation>Attach this to the center point of a menu that uses several pages.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
+1
View File
@@ -8,4 +8,5 @@
<NormalMap>true</NormalMap>
<SpecularMap>true</SpecularMap>
<GlowMap>true</GlowMap>
<GlowIntensity>3.0</GlowIntensity>
</Model>

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