Compare commits

..

149 Commits

Author SHA1 Message Date
Jace 0516794db6 Separating RawModel from Model 2016-03-13 14:47:11 +01:00
Jace 4bd2e7995a fixup! Cheeki breeki 2016-03-13 01:32:29 +01:00
Jace 799fd31844 Merge pull request #212 from teamfisk/Dirtybit
Dirtybit
2016-03-13 01:26:54 +01:00
Jace 45bfc374de Cheeki breeki 2016-03-13 01:25:13 +01:00
Jace 95f9065037 Merge branch 'master' into Dirtybit
# Conflicts:
#	include/Engine/Sound/SoundManager.h
2016-03-13 01:07:17 +01:00
Jace 993e56ec59 Disabled final model matrix caching for now, since it doesn't seem to work in all cases. (CP_Rocky2 pickup platforms and ceiling doens't get updated for some reason?!?) 2016-03-13 00:57:54 +01:00
Jace a1fda82d3a Turned the Transform namespace into TransformSystem so it would be able to subscribe to EntityDeleted and clean up after itself 2016-03-13 00:57:00 +01:00
Jace f6113b9d9c EEntityDeleted now provides an EntityWrapper instead of just an ID 2016-03-13 00:16:07 +01:00
Jace 7ea90bede7 Merge branch 'master' of github.com:teamfisk/TacticalZ 2016-03-12 23:49:44 +01:00
Jace 2bfbd72189 EntityWrapper::Clone should no longer cause freezes 2016-03-12 23:44:28 +01:00
Jace 1e7f6941ba Merge pull request #208 from teamfisk/Kill-streak-sounds
Various sound improvements/additions
2016-03-12 23:06:57 +01:00
William Moberg 8c90c39680 Merge pull request #209 from teamfisk/MemoryOptimization
Fixed texture freeing, memory usage way down.
2016-03-12 21:59:51 +01:00
William Moberg 91bad517d3 AbsolutePosition should be calculating correctly now, third time. 2016-03-12 19:59:37 +01:00
Jace ba93ebbe88 Go away crap maps. 2016-03-12 18:21:36 +01:00
William Moberg a3b3351e55 Merge branch 'master' into Dirtybit
# Conflicts:
#	include/Engine/Rendering/ExplosionEffectJob.h
#	src/Game/Systems/ExplosionEffectSystem.cpp
2016-03-12 17:59:50 +01:00
Jace ce0d3b9fbe Fixed texture freeing. Destructor was never called because base destructors weren't virtual. 2016-03-12 17:53:34 +01:00
William Moberg 674604d0df Merge branch 'Dirtybit' of github.com:teamfisk/TacticalZ into Dirtybit 2016-03-12 17:51:55 +01:00
stiffly 8e9ddc7b9d playerJump is only done for local player. 2016-03-12 17:51:06 +01:00
William Moberg 36b84f7cc3 Fixed so calculating absolute positions, etc. works. Sets the field of all children to dirty if a transform field is altered. Will also set Position to dirty if Scale or Orientation is altered.
Moved some methods in ComponentWrapper to a .cpp.
2016-03-12 17:51:03 +01:00
antc13 beee2db5fb Merge branch 'master' of https://github.com/teamfisk/TacticalZ 2016-03-12 17:08:21 +01:00
antc13 1bc4b89a53 Added new models with textures to the map. Every model on the map should now be using a texture. 2016-03-12 17:08:07 +01:00
stiffly cc10e5500b 2x jump now only plays for local player 2016-03-12 15:31:44 +01:00
Jace 068e151741 Merge pull request #173 from teamfisk/ExplosionEffectV2
Explosion effect v2
2016-03-12 15:25:12 +01:00
Jace e7a3793486 Merge pull request #207 from teamfisk/SomeTests
Resolution should now use a dropdown
2016-03-12 15:23:29 +01:00
stiffly 9bac141a6b WIP fixing pull request 2016-03-12 15:14:36 +01:00
Jace eb5fcd6d19 Rendering back to normal 2016-03-12 14:28:17 +01:00
stiffly 9942747d41 WIP pull request fixes 2016-03-12 14:26:09 +01:00
Jace 24bb05ec67 Editor should now set dirty flag when component field changes 2016-03-12 05:17:56 +01:00
Jace df7b4faf24 Now caching resulting absolute model matrices as well 2016-03-12 04:10:14 +01:00
Jace 01db8e0615 Merge remote-tracking branch 'origin/master' into Dirtybit
# Conflicts:
#	src/Engine/Collision/CollisionSystem.cpp
#	src/Engine/Core/Transform.cpp
#	src/Engine/Editor/EditorSystem.cpp
#	src/Engine/Rendering/AnimationSystem.cpp
#	src/Engine/Rendering/BoneAttachmentSystem.cpp
#	src/Game/Systems/CapturePointSystem.cpp
#	src/Game/Systems/ExplosionEffectSystem.cpp
#	src/Game/Systems/PlayerMovementSystem.cpp
2016-03-12 04:09:53 +01:00
Jace 5baac926aa Perfectly working abs pos caching using dirty flags! :D 2016-03-12 03:29:41 +01:00
Jace ee5c13d463 Merge branch 'Dirtybit-imon' into Dirtybit
# Conflicts:
#	src/Engine/Core/Transform.cpp
2016-03-12 01:32:09 +01:00
Jace 671079764e Merge branch 'Dirtybit' of github.com:teamfisk/TacticalZ into Dirtybit 2016-03-12 01:26:56 +01:00
Jace 9b98bbbea8 Fields are now set to dirty when they're changed! 2016-03-12 01:26:03 +01:00
Jace 80649ce51d Updated the ENTIRE CODEBASE TO MATCH 2016-03-12 00:38:33 +01:00
Jace a4b0b108d4 Created a wrapper for field types that is able to detect changes to set dirty flags in the future 2016-03-12 00:38:26 +01:00
stiffly 28d576bfc0 Now the bgm should loop again. 2016-03-11 21:04:33 +01:00
stiffly 66d0f9fa47 Added menu music 2016-03-11 20:28:09 +01:00
Tleety dc09ba9158 Resolution should now use a dropdown 2016-03-11 20:02:25 +01:00
stiffly 157a54e845 Merge remote-tracking branch 'origin/master' into Kill-streak-sounds 2016-03-11 18:19:22 +01:00
Tleety 7759af2c5a Log remove 2016-03-11 15:52:47 +01:00
antc13 ac096bbf77 Merge branch 'master' of https://github.com/teamfisk/TacticalZ
# Conflicts:
#	resources/Schema/Entities/CP_Rocky2.xml
2016-03-11 15:46:39 +01:00
antc13 81634578d9 Updated CP_Rocky2, added a point light to pickups and created 3 different versions of the Floating Crystals above Capture Points. 2016-03-11 15:43:20 +01:00
Tobias Dahl 2f61171d16 Merge pull request #185 from teamfisk/TextColor
Text that handles color, alpha and icon parsing
2016-03-11 15:25:06 +01:00
Tobias Dahl aa16a15693 Merge pull request #205 from teamfisk/Menu
Menu
2016-03-11 15:23:13 +01:00
Tleety 26337ff243 Merge remote-tracking branch 'origin/master' into Menu 2016-03-11 15:07:52 +01:00
FakeShemp 7bdb0d410f Merge branch 'master' of github.com:teamfisk/TacticalZ 2016-03-11 15:04:52 +01:00
FakeShemp 172fb8dfc2 MuzzleFlash entities 2016-03-11 15:04:44 +01:00
Tleety 0ca627eb8b Merge remote-tracking branch 'origin/master' into Menu 2016-03-11 14:57:59 +01:00
Tobias Dahl 530c0fd9b0 Merge pull request #204 from teamfisk/RendererBugFixes
Getting ShaderID fewer times
2016-03-11 14:57:36 +01:00
FakeShemp 4df936ca70 imon's fix to rule them all
might have solved dt anormalities
2016-03-11 14:57:02 +01:00
William Moberg f036817c0c Merge pull request #203 from teamfisk/SplitSnapshots
Split snapshots
2016-03-11 14:35:18 +01:00
Jocke e45d0e8232 fix. 2016-03-11 14:32:55 +01:00
William Moberg 8ebf818c19 Merge pull request #206 from teamfisk/CapturePointFixBranch
CapturePointSystem now sets all children visible/not visible for each
2016-03-11 14:26:45 +01:00
Jocke 62d1cb9a69 fixed request. 2016-03-11 14:24:59 +01:00
Tobias Dahl edb305b307 Merge pull request #175 from teamfisk/EntitiesWithoutTransform
No crash on missing transform in editor system.
2016-03-11 14:20:23 +01:00
verysecrethero 0aedeb61b4 CapturePointSystem now sets all children visible/not visible for each red/blue/spectator 2016-03-11 14:15:46 +01:00
Tleety 44398eac58 Options now has some different resolutions. 2016-03-11 14:11:58 +01:00
Jocke 06bddd9d54 Fixed requests. 2016-03-11 14:07:03 +01:00
Tleety 4937bee46a Unresolved externals shit 2016-03-11 13:38:48 +01:00
Tleety bb0531a459 WIP 2016-03-11 13:10:08 +01:00
Tleety 8bd38bc465 Merge branch 'Menu' of github.com:teamfisk/TacticalZ into Menu 2016-03-11 13:00:43 +01:00
Tleety 8ceaae995d Options menu started working on 2016-03-11 13:00:34 +01:00
Jocke 5f959ded89 Did changes upon pull request's request. 2016-03-11 12:54:59 +01:00
Jocke 0fbc482f9c Changed getters to return reinterpret_casted data. 2016-03-11 12:22:55 +01:00
Jocke 2eb863757b renamed variabels 2016-03-11 11:55:16 +01:00
Teejoon 91aedcbb14 Merge branch 'Menu' of https://github.com/teamfisk/TacticalZ into Menu 2016-03-11 11:41:11 +01:00
Teejoon cac0522ae7 Fixed glow on window resize 2016-03-11 11:41:02 +01:00
Tleety 26dde21e3d Merge branch 'Menu' of github.com:teamfisk/TacticalZ into Menu 2016-03-11 11:32:18 +01:00
Tleety 23e6a15c7f Fixed the fill on sprites, added some config button components, started work on option menu 2016-03-11 11:31:53 +01:00
Teejoon e96ad44e44 BlurHUDPass now works correct when resizing window. 2016-03-11 11:23:23 +01:00
stiffly a3ab844cc4 Makes sure m_CurrentSelection is valid before using it. 2016-03-11 11:12:49 +01:00
stiffly 03493df213 Merge remote-tracking branch 'origin/master' into EntitiesWithoutTransform 2016-03-11 11:06:23 +01:00
Jocke 7febb7681c Merge remote-tracking branch 'origin/master' into SplitSnapshots 2016-03-11 11:05:41 +01:00
Teejoon e000408593 Getting ShaderID one time per material in total instead of one time every frame 2016-03-11 11:03:09 +01:00
Jocke 33627f917c removed debug info. 2016-03-11 11:01:10 +01:00
verysecrethero 0869afd529 Merge pull request #193 from teamfisk/BoxModelCollision
Removed collision jittering effects
2016-03-11 10:48:25 +01:00
Adam Byléhn 56a13d03fc Merge pull request #197 from teamfisk/SpectatorCamera
Properly unlocked mouse
2016-03-11 10:43:29 +01:00
Adam Byléhn dad18a200f Merge pull request #202 from teamfisk/Trigger
Triggersystem updated for the capturepoints
2016-03-11 10:38:20 +01:00
Tleety dab58e09a0 Merge branch 'master' into Menu 2016-03-11 10:20:25 +01:00
Tleety cd6967b310 Merge 2016-03-11 10:20:13 +01:00
FakeShemp 937bf823f3 Merge branch 'master' of github.com:teamfisk/TacticalZ 2016-03-10 21:59:23 +01:00
FakeShemp e35b09cc68 Add alpha clipping
Tobbe sa att jag fick pusha direkt
2016-03-10 21:59:01 +01:00
William Moberg b172526e62 Merge pull request #199 from teamfisk/CapturePointTake
The children of the CapturePointModels now also get their visibility changed
2016-03-10 16:37:53 +01:00
Tleety ab70aed840 WIP 2016-03-10 16:15:57 +01:00
William Moberg d6e3a47182 Merge branch 'master' into Trigger 2016-03-10 16:14:17 +01:00
William Moberg 038a706e28 Don't collide against disabled (invisible) models. Triggers uses model vs. box instead of only box vs. box. 2016-03-10 16:05:30 +01:00
Tleety f9808a61f7 Changed sprite text 2016-03-10 16:02:03 +01:00
Jocke a8a4b5d2a2 Disconnect on udp 2016-03-10 15:59:55 +01:00
FakeShemp b094b9feca Merge branch 'master' of github.com:teamfisk/TacticalZ 2016-03-10 15:01:27 +01:00
Jocke 67dfbfff01 Fixed multiply connections 2016-03-10 14:44:06 +01:00
William Moberg bdcb33d992 Mouse always unlocked on game start and on disconnecting (i.e when menu shows). 2016-03-10 12:46:06 +01:00
FakeShemp 6c072aae45 Merge remote-tracking branch 'origin/master' into ExplosionEffectV2
# Conflicts:
#	resources/Schema/Components/ExplosionEffect.xml
#	resources/Shaders/ExplosionEffect.geom.glsl
#	src/Game/Systems/ExplosionEffectSystem.cpp
2016-03-10 11:49:51 +01:00
FakeShemp 68634126e5 Add moar optimization thingies and some xml clarifications 2016-03-10 11:43:11 +01:00
Jocke a0d60160dd Increased size of socket buffer 2016-03-10 10:58:26 +01:00
Jocke 15c54d2be6 Merge remote-tracking branch 'origin/master' into SplitSnapshots 2016-03-10 10:52:51 +01:00
stiffly e444a86ec5 Merge remote-tracking branch 'origin/master' into Kill-streak-sounds 2016-03-10 10:36:20 +01:00
William Moberg 8a8c375d3a Merge remote-tracking branch 'origin/master' into BoxModelCollision 2016-03-10 09:57:33 +01:00
FakeShemp 981dc3467e Baggu fixed again
+Bonus document formatted
2016-03-09 22:11:17 +01:00
FakeShemp 42af029a26 fix baggu 2016-03-09 21:25:51 +01:00
Jocke 37355b1afc Hot fix 2016-03-09 20:12:08 +01:00
FakeShemp 2e5dfc609a support headshot icons 2016-03-09 19:51:57 +01:00
William Moberg 8936b3d6c3 Probably fixed all the jittering, won't need the jitter guard anymore. 2016-03-09 19:45:26 +01:00
Jocke ad49af2f8c Merge remote-tracking branch 'origin/master' into SplitSnapshots 2016-03-09 19:43:48 +01:00
Jocke 5a7034dfcd popped the right amount of the header 2016-03-09 19:43:18 +01:00
Jocke 9721cb6a7d Merge remote-tracking branch 'origin/master' into SplitSnapshots
# Conflicts:
#	include/Engine/Network/Client.h
#	src/Engine/Network/Client.cpp
2016-03-09 19:14:10 +01:00
Jocke c36c7d1ea6 Merge remote-tracking branch 'origin/master' into SplitSnapshots
# Conflicts:
#	src/Engine/Network/Server.cpp
2016-03-09 18:41:01 +01:00
Jocke 3209e36176 We can now send more data with UDP than previously, the splitting seems to work fine but receiving has some problems. 2016-03-09 18:26:33 +01:00
William Moberg 8a3564ad49 Merge remote-tracking branch 'origin/master' into BoxModelCollision 2016-03-09 18:03:39 +01:00
William Moberg 9581e9ac84 Don't set the player to previous position when uncrouching. 2016-03-09 17:51:26 +01:00
FakeShemp ba6d2b758d Add killstreak icon 2016-03-09 12:34:09 +01:00
FakeShemp 12dd1d21de Text now handles color, alpha and icon parsing 2016-03-09 12:11:26 +01:00
stiffly e0de91cce3 WIP 2016-03-09 09:57:32 +01:00
Jace b7d93058b1 Added base work for dity bits in components 2016-03-08 21:11:59 +01:00
William Moberg ab2b28264f Caching absolute positions, etc. Has not been tested yet. 2016-03-08 18:10:36 +01:00
FakeShemp 7ced9e6767 Merge branch 'master' of github.com:teamfisk/TacticalZ 2016-03-08 17:25:03 +01:00
Jace 5d53fc74cb Merge branch 'Dirtybit' of github.com:teamfisk/TacticalZ into Dirtybit 2016-03-08 15:46:21 +01:00
Jace ecc8d998cf Added ComponentInfo::Field_t::Index 2016-03-08 15:46:14 +01:00
William Moberg e3c0fb2178 Added SetDirty function. 2016-03-08 15:44:02 +01:00
William Moberg 090bd806ce Added DirtyBit enum to Dirty getter in ComponentWrapper. 2016-03-08 15:39:16 +01:00
Jocke 3828616b60 Made it easier to maintain changes in packet header, prepared for reliable UDP packets. 2016-03-08 14:44:35 +01:00
Jocke 9cbc582be2 Kinda works like before 2016-03-08 11:29:47 +01:00
stiffly ec3ed1f46f Merge remote-tracking branch 'origin/master' into Kill-streak-sounds
# Conflicts:
#	include/Game/Systems/Weapon/DefenderWeaponBehaviour.h
2016-03-08 10:39:52 +01:00
Jocke 68a88ed756 We are now using udp again 2016-03-07 16:07:54 +01:00
FakeShemp ee99821164 Add reverse and scalar for ColorByDistance 2016-03-07 15:45:06 +01:00
stiffly 9cc8124847 Renamed IsAnyParentMissingTransform -> isAnyParentMissingTransform (member function). 2016-03-07 14:34:45 +01:00
Jocke 078d6eb712 Added sequnceNumber and totalNumberOfPackets to packet for packet splitting. 2016-03-07 14:22:09 +01:00
stiffly a369c26a28 Blend tree nodes can now exist without transform components, without the game crashing. 2016-03-07 14:19:22 +01:00
FakeShemp 53ea5bd37d comment out currently unused thing 2016-03-07 14:15:17 +01:00
FakeShemp 243276707a Merge remote-tracking branch 'origin/master' into ExplosionEffectV2 2016-03-07 13:52:29 +01:00
stiffly 16124b7aa7 Crash fix 2016-03-04 03:31:51 +01:00
stiffly a7c57da2c9 WIP 2016-03-04 03:03:38 +01:00
stiffly 1227a795d7 WIP 2016-03-03 21:23:53 +01:00
stiffly 1cc92f4800 Merge remote-tracking branch 'origin/master' into Kill-streak-sounds 2016-03-03 20:25:43 +01:00
stiffly 3613d66d32 The EPlaySoundOnEntity event now has support to set the gain on the sound. It now also uses EntityWrapper instead of EntityID. 2016-03-03 20:24:48 +01:00
stiffly 20c6caa408 Merge remote-tracking branch 'origin/master' into Kill-streak-sounds
# Conflicts:
#	resources/DefaultConfig.ini
2016-03-03 17:32:04 +01:00
stiffly b7fac7103d More reasonable distance to hear sounds by other players. Modeified by rolloff factor. 2016-03-02 11:26:06 +01:00
FakeShemp 0cf92e99ff wip 2016-03-02 10:17:49 +01:00
FakeShemp 3ba73b8206 Pulsate system implemented. 2016-03-01 23:05:27 +01:00
stiffly d3ffb9768b Sets velocity to 0, does not make use of doppler effect atm 2016-03-01 14:48:07 +01:00
FakeShemp fcf5117952 Merge remote-tracking branch 'origin/master' into ExplosionEffectV2 2016-03-01 13:35:07 +01:00
stiffly 2c56b03b2b Merge remote-tracking branch 'origin/master' into Kill-streak-sounds 2016-02-29 16:41:46 +01:00
stiffly 4fd578c764 Removed logic that's no longer needed. 2016-02-29 16:26:09 +01:00
stiffly 67dffafe5a Drumloop will now play when a team is about to win 2016-02-26 16:44:08 +01:00
stiffly 7dbb9e452b Added a announcer volume channel. 2016-02-24 15:08:39 +01:00
stiffly cf3d1b5b00 Changed the default reference distance for emitters. Should be heard all over the map 2016-02-24 14:19:38 +01:00
stiffly 9783f9c650 Added an event to change the background music. 2016-02-24 14:18:42 +01:00
stiffly f72dea3852 Added a system that will handle BGM. Created specific logic for sounds to loop like Petter wants. 2016-02-24 11:51:06 +01:00
FakeShemp fb80d088e4 Redid many a thing for the sake of efficiency 2016-02-23 10:06:21 +01:00
158 changed files with 23173 additions and 19365 deletions
+1 -1
Submodule assets updated: 007b54bd67...bc6e7df04c
+18 -6
View File
@@ -12,7 +12,7 @@
#include "../Core/AABB.h"
#include "Rendering/RawModelCustom.h"
//#include "Rendering/RawModelAssimp.h"
#include "../Core/Transform.h"
#include "../Core/TransformSystem.h"
#include "../Core/Entity.h"
#include "../Core/EntityWrapper.h"
#include "EntityAABB.h"
@@ -48,13 +48,13 @@ bool RayVsTriangle(const Ray& ray,
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 RawModel::Vertex* modelVertices,
const std::vector<glm::vec3>& 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 RawModel::Vertex* modelVertices,
const std::vector<glm::vec3>& modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix,
glm::vec3& outHitPosition);
@@ -62,7 +62,7 @@ bool RayVsModel(const Ray& ray,
//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 RawModel::Vertex* modelVertices,
const std::vector<glm::vec3>& modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix,
float& outDistance,
@@ -70,7 +70,7 @@ bool RayVsModel(const Ray& ray,
float& outVCoord);
bool AABBvsTriangles(const AABB& box,
const RawModel::Vertex* modelVertices,
const std::vector<glm::vec3>& modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix,
glm::vec3& boxVelocity,
@@ -80,7 +80,19 @@ bool AABBvsTriangles(const AABB& box,
//Detects collision, but does not resolve.
bool AABBvsTriangles(const AABB& box,
const RawModel::Vertex* modelVertices,
const std::vector<glm::vec3>& modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix);
enum Output
{
OutContained,
OutSeparated,
OutIntersecting
};
//Detects intersection and containment.
Output AABBvsTrianglesWContainment(const AABB& box,
const std::vector<glm::vec3>& modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix);
+12
View File
@@ -2,6 +2,7 @@
#define ComponentInfo_h__
#include "../Common.h"
#include "Entity.h"
#include <boost/shared_array.hpp>
struct ComponentInfo
@@ -21,6 +22,7 @@ struct ComponentInfo
{
std::string Name;
std::string Type;
unsigned char Index;
unsigned int Offset;
unsigned int Stride;
};
@@ -32,6 +34,16 @@ struct ComponentInfo
unsigned int Stride = 0;
boost::shared_array<char> Defaults = nullptr;
std::shared_ptr<Meta_t> Meta = nullptr;
std::size_t GetHeaderSize() const
{
std::size_t size = 0;
// A component block starts with an entity ID
size += sizeof(EntityID);
return size;
}
};
template<>
+13 -9
View File
@@ -5,16 +5,15 @@
#include "MemoryPool.h"
#include "ComponentInfo.h"
#include "ComponentWrapper.h"
#include "DirtySet.h"
class ComponentPool;
class ComponentPoolForwardIterator
: public std::iterator<std::forward_iterator_tag, ComponentWrapper>
{
public:
ComponentPoolForwardIterator(const ComponentInfo& componentInfo, const MemoryPool<char>::iterator begin, const MemoryPool<char>::iterator end)
: m_ComponentInfo(componentInfo)
, m_MemoryPoolIterator(begin)
, m_MemoryPoolEnd(end)
{ }
ComponentPoolForwardIterator(ComponentPool* pool, const MemoryPool<char>::iterator begin, const MemoryPool<char>::iterator end);
ComponentPoolForwardIterator(const ComponentPoolForwardIterator& other) = default;
ComponentPoolForwardIterator(ComponentPoolForwardIterator&& other) = default;
@@ -27,6 +26,7 @@ public:
ComponentWrapper operator*() const;
private:
ComponentPool* m_ComponentPool;
const ComponentInfo& m_ComponentInfo;
MemoryPool<char>::iterator m_MemoryPoolIterator;
const MemoryPool<char>::iterator m_MemoryPoolEnd;
@@ -34,6 +34,7 @@ private:
class ComponentPool
{
friend class ComponentPoolForwardIterator;
public:
typedef ComponentPoolForwardIterator iterator;
typedef ptrdiff_t difference_type;
@@ -42,9 +43,10 @@ public:
typedef ComponentWrapper* pointer;
typedef ComponentWrapper& reference;
ComponentPool(const ::ComponentInfo& ci)
ComponentPool(const ::ComponentInfo& ci, World* world)
: m_ComponentInfo(ci)
, m_Pool(ci.Meta->Allocation, sizeof(EntityID) + ci.Stride)
, m_Pool(ci.Meta->Allocation, ci.GetHeaderSize() + ci.Stride)
, m_World(world)
{ }
~ComponentPool();
ComponentPool(const ComponentPool& other);
@@ -61,8 +63,8 @@ public:
// Delete a component and free its memory
void Delete(ComponentWrapper& wrapper);
iterator begin() const;
iterator end() const;
iterator begin();
iterator end();
size_t size() const;
//Dumps information about what the pool memory looks like right now
@@ -80,6 +82,8 @@ private:
::ComponentInfo m_ComponentInfo;
MemoryPool<char> m_Pool;
std::unordered_map<EntityID, char*> m_EntityToComponent;
DirtySet m_DirtySet;
World* m_World;
};
#endif
+155 -44
View File
@@ -4,46 +4,32 @@
#include <boost/shared_array.hpp>
#include <boost/any.hpp>
#include "../Common.h"
#include "../GLM.h"
#include "Entity.h"
#include "ComponentInfo.h"
#include "DirtySet.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; }
};
class World;
struct ComponentWrapper
{
ComponentWrapper(const ComponentInfo& componentInfo, char* data)
: Info(componentInfo)
, EntityID(*reinterpret_cast<::EntityID*>(data))
, Data(data + sizeof(::EntityID))
{ }
ComponentWrapper(const ComponentInfo& componentInfo, char* data, ::DirtyBitField* dirtyBitField, World* world);
World* m_World;
const ComponentInfo& Info;
const ::EntityID EntityID;
char* Data;
::DirtyBitField* DirtyBitField = nullptr;
ComponentInfo::EnumType Enum(const char* fieldName, const char* enumKey)
{
return Info.Meta->FieldEnumDefinitions.at(fieldName).at(enumKey);
}
ComponentInfo::EnumType Enum(const char* fieldName, const char* enumKey);
bool Dirty(DirtySetType type, const std::string& fieldName);
void SetDirty(DirtySetType type, const std::string& fieldName, bool dirty = true);
void SetAllDirty(const std::string& fieldName, bool dirty = true);
template <typename T>
T& Field(std::string name)
T& Field(const std::string& name)
{
const ComponentInfo::Field_t& field = Info.Fields.at(name);
if (sizeof(T) > field.Stride) {
@@ -55,13 +41,15 @@ struct ComponentWrapper
}
template <typename T>
void SetField(std::string name, const T value) { Field<T>(name) = value; }
//template <typename T>
//void SetField(std::string name, T& value) { Field<T>(name) = value; }
void SetField(const std::string& name, const T& value)
{
Field<T>(name) = value;
SetAllDirty(name);
}
// Specialization for string literals
template <std::size_t N>
void SetField(std::string name, const char(&value)[N]) { Field<std::string>(name) = std::string(value); }
void SetField(const std::string& name, const char(&value)[N]) { SetField(name, std::string(value)); }
void Copy(ComponentWrapper& destination)
{
@@ -95,40 +83,163 @@ struct ComponentWrapper
struct SubscriptProxy
{
friend struct ComponentWrapper;
private:
SubscriptProxy(ComponentWrapper* component, std::string propertyName)
public:
SubscriptProxy(ComponentWrapper* component, std::string fieldName)
: m_Component(component)
, m_PropertyName(propertyName)
, m_FieldName(fieldName)
{ }
ComponentWrapper* m_Component;
std::string m_PropertyName;
std::string m_FieldName;
public:
// Return the integer value of an enum type key for this field
ComponentInfo::EnumType Enum(const char* enumKey) { return m_Component->Enum(m_PropertyName.c_str(), enumKey); }
ComponentInfo::EnumType Enum(const char* enumKey) { return m_Component->Enum(m_FieldName.c_str(), enumKey); }
bool Dirty(DirtySetType type) { return m_Component->Dirty(type, m_FieldName); }
void SetDirty(DirtySetType type, bool dirty = true) { m_Component->SetDirty(type, m_FieldName, dirty); }
void SetAllDirty(bool dirty = true) { m_Component->SetAllDirty(m_FieldName, dirty); }
template <typename T>
operator T&() { return m_Component->Field<T>(m_PropertyName); }
operator const double&() { return m_Component->Field<double>(m_FieldName); }
operator const float&() { return m_Component->Field<float>(m_FieldName); }
operator const int&() { return m_Component->Field<int>(m_FieldName); }
operator const glm::vec3&() { return m_Component->Field<glm::vec3>(m_FieldName); }
operator const glm::vec4&() { return m_Component->Field<glm::vec4>(m_FieldName); }
operator const glm::quat&() { return m_Component->Field<glm::quat>(m_FieldName); }
operator const bool&() { return m_Component->Field<bool>(m_FieldName); }
operator const std::string&() { return m_Component->Field<std::string>(m_FieldName); }
// Don't allow non-const references
// If this wasn't deleted, the above overloads would still get called for some reason...
template <
typename T,
typename = typename std::enable_if<!std::is_base_of<::FIELDLOL, T>::value>::type
>
//operator T&() = delete;
operator T&() { static_assert(constexpr(false), "https://github.com/teamfisk/TacticalZ/pull/212"); }
// Value assignment
template <typename T>
void operator=(const T val) { m_Component->SetField<T>(m_PropertyName, val); }
// TODO: Pass by reference and rvalue (universal reference?)
//template <typename T>
//void operator=(T& val) { m_Component->SetField<T>(m_PropertyName, val); }
void operator=(const T& val) { m_Component->SetField<T>(m_FieldName, val); }
// Specialization for string literals
template <std::size_t N>
void operator=(const char(&val)[N]) { m_Component->SetField<N>(m_PropertyName, val); }
void operator=(const char(&val)[N]) { m_Component->SetField<N>(m_FieldName, val); }
};
SubscriptProxy operator[](std::string propertyName) { return SubscriptProxy(this, propertyName); }
SubscriptProxy operator[](const std::string& propertyName) { return SubscriptProxy(this, propertyName); }
};
struct FIELDLOL { }; // lol
template <typename T>
struct FieldBase : FIELDLOL
{
FieldBase(ComponentWrapper::SubscriptProxy& Proxy)
: Proxy(Proxy)
, Data(Proxy.m_Component->Field<T>(Proxy.m_FieldName))
{ }
void SetAllDirty() { Proxy.SetAllDirty(); }
FieldBase& operator=(const FieldBase& rhs) { Data = rhs.Data; SetAllDirty(); return *this; }
FieldBase& operator=(const T& rhs) { Data = rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator+=(const T2& rhs) { Data += rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator-=(const T2& rhs) { Data -= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator*=(const T2& rhs) { Data *= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator/=(const T2& rhs) { Data /= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator%=(const T2& rhs) { Data %= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator&=(const T2& rhs) { Data &= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator|=(const T2& rhs) { Data |= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator^=(const T2& rhs) { Data ^= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator<<=(const T2& rhs) { Data <<= rhs; SetAllDirty(); return *this; }
template <typename T2> FieldBase& operator>>=(const T2& rhs) { Data >>= rhs; SetAllDirty(); return *this; }
T operator+() const { return +Data; }
T operator-() const { return -Data; }
T operator~() const { return ~Data; }
FieldBase& operator++() { Data++; SetAllDirty(); return *this; }
T operator++(int) { T tmp = Data; operator++(); return tmp; }
FieldBase& operator--() { Data--; SetAllDirty(); return *this; }
T operator--(int) { T tmp = Data; operator--(); return tmp; }
operator const T&() const { return Data; }
const T& operator*() const { return operator const T&(); }
protected:
ComponentWrapper::SubscriptProxy Proxy;
T& Data;
};
template <typename T>
struct Field : FieldBase<T>
{
using FieldBase<T>::FieldBase;
using FieldBase<T>::operator=;
};
template <>
struct Field<glm::vec3> : FieldBase<glm::vec3>
{
using FieldBase<glm::vec3>::FieldBase;
using FieldBase<glm::vec3>::operator=;
glm::vec3::value_type x() const { return Data.x; }
void x(glm::vec3::value_type val) { Data.x = val; SetAllDirty(); }
glm::vec3::value_type y() const { return Data.y; }
void y(glm::vec3::value_type val) { Data.y = val; SetAllDirty(); }
glm::vec3::value_type z() const { return Data.z; }
void z(glm::vec3::value_type val) { Data.z = val; SetAllDirty(); }
template <typename T> friend glm::vec3 operator+(const Field<glm::vec3>& lhs, const T& rhs) { return static_cast<glm::vec3>(lhs) + glm::vec3(rhs); }
template <typename T> friend glm::vec3 operator-(const Field<glm::vec3>& lhs, const T& rhs) { return static_cast<glm::vec3>(lhs) - glm::vec3(rhs); }
template <typename T> friend glm::vec3 operator*(const Field<glm::vec3>& lhs, const T& rhs) { return static_cast<glm::vec3>(lhs) * glm::vec3(rhs); }
template <typename T> friend glm::vec3 operator/(const Field<glm::vec3>& lhs, const T& rhs) { return static_cast<glm::vec3>(lhs) / glm::vec3(rhs); }
template <typename T> friend glm::vec3 operator+(const T& lhs, const Field<glm::vec3>& rhs) { return glm::vec3(lhs) + static_cast<glm::vec3>(rhs); }
template <typename T> friend glm::vec3 operator-(const T& lhs, const Field<glm::vec3>& rhs) { return glm::vec3(lhs) - static_cast<glm::vec3>(rhs); }
template <typename T> friend glm::vec3 operator*(const T& lhs, const Field<glm::vec3>& rhs) { return glm::vec3(lhs) * static_cast<glm::vec3>(rhs); }
template <typename T> friend glm::vec3 operator/(const T& lhs, const Field<glm::vec3>& rhs) { return glm::vec3(lhs) / static_cast<glm::vec3>(rhs); }
friend glm::vec3& operator+=(glm::vec3& lhs, const Field<glm::vec3>& rhs) { lhs += *rhs; return lhs; }
};
template <>
struct Field<glm::vec4> : FieldBase<glm::vec4>
{
//Field(glm::vec4& Data)
// : FieldBase(Data)
//{ }
using FieldBase<glm::vec4>::FieldBase;
using FieldBase<glm::vec4>::operator=;
glm::vec4::value_type x() const { return Data.x; }
void x(glm::vec4::value_type val) { Data.x = val; SetAllDirty(); }
glm::vec4::value_type y() const { return Data.y; }
void y(glm::vec4::value_type val) { Data.y = val; SetAllDirty(); }
glm::vec4::value_type z() const { return Data.z; }
void z(glm::vec4::value_type val) { Data.z = val; SetAllDirty(); }
glm::vec4::value_type w() const { return Data.w; }
void w(glm::vec4::value_type val) { Data.w = val; SetAllDirty(); }
template <typename T> friend glm::vec4 operator+(const Field<glm::vec4>& lhs, const T& rhs) { return static_cast<glm::vec4>(lhs) + glm::vec4(rhs); }
template <typename T> friend glm::vec4 operator-(const Field<glm::vec4>& lhs, const T& rhs) { return static_cast<glm::vec4>(lhs) - glm::vec4(rhs); }
template <typename T> friend glm::vec4 operator*(const Field<glm::vec4>& lhs, const T& rhs) { return static_cast<glm::vec4>(lhs) * glm::vec4(rhs); }
template <typename T> friend glm::vec4 operator/(const Field<glm::vec4>& lhs, const T& rhs) { return static_cast<glm::vec4>(lhs) / glm::vec4(rhs); }
template <typename T> friend glm::vec4 operator+(const T& lhs, const Field<glm::vec4>& rhs) { return glm::vec4(lhs) + static_cast<glm::vec4>(rhs); }
template <typename T> friend glm::vec4 operator-(const T& lhs, const Field<glm::vec4>& rhs) { return glm::vec4(lhs) - static_cast<glm::vec4>(rhs); }
template <typename T> friend glm::vec4 operator*(const T& lhs, const Field<glm::vec4>& rhs) { return glm::vec4(lhs) * static_cast<glm::vec4>(rhs); }
template <typename T> friend glm::vec4 operator/(const T& lhs, const Field<glm::vec4>& rhs) { return glm::vec4(lhs) / static_cast<glm::vec4>(rhs); }
friend glm::vec4& operator+=(glm::vec4& lhs, const Field<glm::vec4>& rhs) { lhs += *rhs; return lhs; }
};
// A component wrapper that "owns" its data through a shared pointer
struct SharedComponentWrapper : ComponentWrapper
{
SharedComponentWrapper(const ComponentInfo& componentInfo, boost::shared_array<char> data)
: ComponentWrapper(componentInfo, data.get())
: ComponentWrapper(componentInfo, data.get(), nullptr, nullptr)
, m_DataReference(data)
{ }
+16
View File
@@ -0,0 +1,16 @@
#ifndef DirtySet_h__
#define DirtySet_h__
#include <set>
#include "ComponentInfo.h"
enum class DirtySetType
{
Transform,
Network
};
typedef std::unordered_map<DirtySetType, std::set<decltype(ComponentInfo::Field_t::Index)>> DirtyBitField;
typedef std::unordered_map<EntityID, DirtyBitField> DirtySet;
#endif
+2 -2
View File
@@ -2,14 +2,14 @@
#define EEntityDeleted_h__
#include "Event.h"
#include "Entity.h"
#include "EntityWrapper.h"
namespace Events
{
struct EntityDeleted : Event
{
EntityID DeletedEntity;
EntityWrapper DeletedEntity;
// True if the entity deletion was triggered because the entity's parent was deleted before it
bool Cascaded;
};
+2 -1
View File
@@ -45,8 +45,9 @@ struct EntityWrapper
private:
EntityWrapper firstChildByNameRecursive(const std::string& name, EntityID parent);
EntityWrapper cloneRecursive(EntityWrapper entity, EntityWrapper parent);
void childrenWithComponentRecursive(const std::string& componentType, EntityWrapper& entity, std::vector<EntityWrapper>& childrenWithComponent);
static void fillRelationships(std::unordered_multimap<EntityWrapper, EntityWrapper>& relationMap, EntityWrapper entity);
static void recreateRelationships(const std::unordered_multimap<EntityWrapper, EntityWrapper>& relationMap, EntityWrapper templateEntity, EntityWrapper parent = EntityWrapper::Invalid);
};
namespace std
+1
View File
@@ -19,6 +19,7 @@ class Resource
protected:
Resource() { }
virtual ~Resource() = default;
public:
//Should be thrown in a Resource's constructor if it cannot complete because another resource is still loading.
+1 -1
View File
@@ -81,7 +81,7 @@ public:
for (auto& pair : group.PureSystems) {
const std::string& componentName = pair.first;
auto& systems = pair.second;
const ComponentPool* pool = m_World->GetComponents(componentName);
ComponentPool* pool = m_World->GetComponents(componentName);
if (pool == nullptr) {
continue;
}
-25
View File
@@ -1,25 +0,0 @@
#ifndef Transform_h__
#define Transform_h__
#include "../GLM.h"
#include "World.h"
#include "EntityWrapper.h"
namespace Transform
{
glm::mat4 AbsoluteTransformation(EntityWrapper entity);
glm::vec3 AbsolutePosition(EntityWrapper entity);
glm::vec3 AbsolutePosition(World* world, EntityID entity);
glm::vec3 AbsoluteOrientationEuler(EntityWrapper entity);
glm::quat AbsoluteOrientation(EntityWrapper entity);
glm::quat AbsoluteOrientation(World* world, EntityID entity);
glm::vec3 AbsoluteScale(EntityWrapper entity);
glm::vec3 AbsoluteScale(World* world, EntityID entity);
glm::mat4 ModelMatrix(EntityWrapper entity);
glm::mat4 ModelMatrix(EntityID entity, World* world);
glm::vec3 TransformPoint(const glm::vec3& point, const glm::mat4& matrix);
}
#endif
+39
View File
@@ -0,0 +1,39 @@
#ifndef Transform_h__
#define Transform_h__
#include "../GLM.h"
#include "System.h"
#include "EEntityDeleted.h"
class TransformSystem : public System
{
public:
TransformSystem(SystemParams params);
//glm::mat4 AbsoluteTransformation(EntityWrapper entity);
static glm::vec3 AbsolutePosition(EntityWrapper entity);
static glm::vec3 AbsolutePosition(World* world, EntityID entity);
static glm::vec3 AbsoluteOrientationEuler(EntityWrapper entity);
static glm::quat AbsoluteOrientation(EntityWrapper entity);
static glm::quat AbsoluteOrientation(World* world, EntityID entity);
static glm::vec3 AbsoluteScale(EntityWrapper entity);
static glm::vec3 AbsoluteScale(World* world, EntityID entity);
static glm::mat4 ModelMatrix(EntityWrapper entity);
static glm::mat4 ModelMatrix(EntityID entity, World* world);
static glm::vec3 TransformPoint(const glm::vec3& point, const glm::mat4& matrix);
static int RecalculatedPositions;
static int RecalculatedOrientations;
static int RecalculatedScales;
private:
static std::unordered_map<EntityWrapper, glm::vec3> PositionCache;
static std::unordered_map<EntityWrapper, glm::quat> OrientationCache;
static std::unordered_map<EntityWrapper, glm::vec3> ScaleCache;
static std::unordered_map<EntityWrapper, glm::mat4> MatrixCache;
EventRelay<TransformSystem, Events::EntityDeleted> m_EEntityDeleted;
bool OnEntityDeleted(const Events::EntityDeleted& e);
};
#endif
+1 -1
View File
@@ -35,7 +35,7 @@ public:
// Delete a component off an entity
void DeleteComponent(EntityID entity, const std::string& componentType);
// Get all components of the specified type
const ComponentPool* GetComponents(const std::string& componentType);
ComponentPool* GetComponents(const std::string& componentType);
// Get entity parent
EntityID GetParent(EntityID entity);
// Change the parent of an entity
+1
View File
@@ -47,6 +47,7 @@ private:
// Utility functions
EntityWrapper importEntity(EntityWrapper parent, boost::filesystem::path filePath);
void setWidgetMode(EditorGUI::WidgetMode mode);
bool isAnyParentMissingTransform(EntityID entityID);
// GUI callbacks
void OnEntitySelected(EntityWrapper entity);
@@ -19,6 +19,7 @@ public:
virtual const glm::vec3 Rotation() const { return m_Rotation; }
virtual bool Jumping() const { return m_Jumping; }
virtual bool Crouching() const { return m_Crouching; }
virtual bool CrouchingLastFrame() const { return m_CrouchingLastFrame; }
virtual bool DoubleJumping() const { return m_DoubleJumping; }
virtual void SetDoubleJumping(bool isDoubleJumping) {
m_DoubleJumping = isDoubleJumping;
@@ -29,7 +30,7 @@ public:
virtual bool OnCommand(const Events::InputCommand& e) override;
virtual void Reset();
void AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, double& assaultDashCoolDownTimer, EntityID playerID);
void AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, Field<double> assaultDashCoolDownTimer, EntityID playerID);
virtual bool AssaultDashDoubleTapped() const { return m_AssaultDashDoubleTapped; }
virtual bool PlayerIsDashing() const { return m_PlayerIsDashing; }
bool SpecialAbilityKeyDown() const { return m_SpecialAbilityKeyDown; }
@@ -44,6 +45,7 @@ protected:
bool m_Jumping = false;
bool m_DoubleJumping = false;
bool m_Crouching = false;
bool m_CrouchingLastFrame = false;
//assault dash membervariables - needed to calculate the doubletap- and dashlogic
double m_AssaultDashDoubleTapDeltaTime = 0.0;
//i will let m_AssaultDashDoubleTapSensitivityTimer stay hardcoded, its not really a gamevariable (more an inputvariable),
@@ -82,6 +84,7 @@ void FirstPersonInputController<EventContext>::Reset()
{
m_Rotation = glm::vec3(0.f, 0.f, 0.f);
m_Jumping = false;
m_CrouchingLastFrame = m_Crouching;
}
template <typename EventContext>
@@ -355,7 +358,7 @@ bool FirstPersonInputController<EventContext>::OnLockMouse(const Events::LockMou
}
template <typename EventContext>
void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, double& assaultDashCoolDownTimer, EntityID playerID) {
void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, Field<double> assaultDashCoolDownTimer, EntityID playerID) {
m_AssaultDashDoubleTapDeltaTime += dt;
assaultDashCoolDownTimer -= dt;
//cooldown = assaultDashCoolDownMaxTimer sec, pretend the dash lasts 0.25 sec (for friction to do its work)
+3 -3
View File
@@ -42,7 +42,7 @@ public:
void Connect(std::string address, int port);
void Update() override;
private:
//UDPClient m_Unreliable;
UDPClient m_Unreliable;
TCPClient m_Reliable;
std::vector<Events::PlayerSpawned> m_PlayerSpawnEvents;
void parseSpawnEvents();
@@ -81,7 +81,7 @@ private:
std::vector<Events::InputCommand> m_InputCommandBuffer;
// Private member functions
size_t receive(char* data);
size_t receive(char* data);
void disconnect();
void parseMessageType(Packet& packet);
void updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID);
@@ -139,7 +139,7 @@ private:
std::vector<ServerInfo> m_Serverlist;
bool m_SearchingForServers = false;
std::clock_t m_StartSearchTime;
double m_SearchingTime = 2000; // Config I guess
double m_SearchingTime = 200; // Config I guess
};
#endif
+1
View File
@@ -39,6 +39,7 @@ protected:
void logReceivedData(int bytesReceived);
void saveToFile();
void updateNetworkData();
void popNetworkSegmentOfHeader(Packet& packet);
};
#endif
+19 -3
View File
@@ -16,7 +16,9 @@ public:
Packet(char* data, const size_t sizeOfPacket);
Packet(MessageType type);
~Packet();
void Init(MessageType type, unsigned int& packetID);
void Init(MessageType type, unsigned int& packetID,
int groupIndex, int groupSize,
int packetGroup);
// Add primitive types like int, float, char...
template<typename T>
@@ -25,7 +27,8 @@ public:
// Check if we are trying to add more than the package can fit.
if (m_MaxPacketSize < m_Offset + sizeof(T)) {
if (m_MaxPacketSize >= 32000) {
LOG_WARNING("Package::WritePrimitive(): New size is huge %i bytes\n", m_MaxPacketSize*2);
// This will spam couse 8 players are over 100 000 bytes
//LOG_WARNING("Package::WritePrimitive(): New size is huge %i bytes\n", m_MaxPacketSize*2);
}
resizeData();
}
@@ -57,13 +60,19 @@ public:
void UpdateSize();
char* ReadData(int SizeOfData);
void ChangePacketID(unsigned int& packetID);
void ChangeGroupIndex(int groupIndex);
void ChangeGroupSize(int groupSize);
void ChangeGroup(int group);
size_t Size() { return m_Offset; };
char* Data() { return m_Data; };
MessageType GetMessageType();
size_t Group();
size_t DataReadSize() { return m_ReturnDataOffset; }
size_t MaxSize() { return m_MaxPacketSize; }
size_t HeaderSize() { return m_HeaderSize; }
size_t GroupIndex();
size_t GroupSize();
size_t PacketID();
private:
char* m_Data;
size_t m_ReturnDataOffset = 0;
@@ -72,6 +81,13 @@ private:
size_t m_HeaderSize = 0;
void resizeData();
void resizeData(int size);
size_t packetSizeOffset = 0;
size_t groupOffset = 0;
size_t groupIndexOffset = 0;
size_t groupSizeOffset = 0;
size_t messageTypeOffset = 0;
size_t packetIDOffset = 0;
};
#endif
@@ -14,6 +14,7 @@ struct PlayerDefinition {
unsigned short TCPPort;
// use for tcp connections
boost::shared_ptr<boost::asio::ip::tcp::socket> TCPSocket;
int PacketGroup = 1;
};
#endif
+1 -1
View File
@@ -36,7 +36,7 @@ public:
private:
// Network channels
TCPServer m_Reliable;
//UDPServer m_Unreliable;
UDPServer m_Unreliable;
UDPServer m_ServerlistRequest;
// dont forget to set these in the childrens receive logic
boost::asio::ip::address m_Address;
+14 -1
View File
@@ -1,5 +1,7 @@
#ifndef UDPClient_h__
#define UDPClient_h__
#include <map>
#include <algorithm>
#include <boost/asio.hpp>
#include "Network/NetworkClient.h"
@@ -13,16 +15,27 @@ public:
bool Connect(std::string playerName, std::string address, int port);
void Disconnect();
void Receive(Packet& packet);
void Send(Packet & packet);
void ReceivePackets();
void Send(Packet& packet);
void Broadcast(Packet& packet, int port);
bool IsSocketAvailable();
// Returns false if no packets are available
bool GetNextPacket(Packet& packet);
private:
typedef std::map<unsigned int, std::vector<std::pair<int, boost::shared_ptr<char>>>> PacketMap;
// 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 m_LastReceivedSnapshotGroup = 0;
int readBuffer();
void readPartOfPacket();
PacketID m_SendPacketID = 0;
//map:(packetGroup, vector:(pair:(groupIndex, packetData)))
PacketMap m_PacketSegmentMap;
bool hasReceivedPacket(int packetGroup, int groupIndex);
// 2^19
const int m_SizeOfSocketBuffer = 524288;
};
#endif
+2
View File
@@ -3,6 +3,7 @@
#include "NetworkServer.h"
#include <boost/asio/ip/udp.hpp>
#define MAXPACKETSIZE 64000
class UDPServer : public NetworkServer
{
@@ -13,6 +14,7 @@ public:
void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers);
void Receive(Packet & packet, PlayerDefinition & playerDefinition);
void Send(Packet & packet, PlayerDefinition & playerDefinition);
void SendToConnectedPlayers(Packet & packet, std::map<PlayerID, PlayerDefinition>& playersTosendTo);
void Send(Packet & packet);
void Send(Packet & packet, boost::asio::ip::udp::endpoint endpoint);
void Broadcast(Packet & packet, int port);
+2 -1
View File
@@ -3,6 +3,7 @@
#include "IRenderer.h"
#include "ShaderProgram.h"
#include "PNG.h"
class CubeMapPass
{
@@ -21,7 +22,7 @@ private:
IRenderer* m_Renderer;
std::string m_PreviusCubeMapTexture;
std::vector<Texture*> m_CubeMapTextures;
std::vector<std::string> m_CubeMapTextures;
};
#endif
@@ -7,7 +7,7 @@
#include "../GLM.h"
#include "../Core/ComponentWrapper.h"
#include "RenderJob.h"
#include "../Core/Transform.h"
#include "../Core/TransformSystem.h"
#include "../Core/World.h"
struct DirectionalLightJob : RenderJob
@@ -16,7 +16,7 @@ struct DirectionalLightJob : RenderJob
: RenderJob()
{
Direction = glm::vec4(0,0,-1,0) * glm::inverse(Transform::AbsoluteOrientation(m_World, transformComponent.EntityID));
Direction = glm::vec4(0,0,-1,0) * glm::inverse(TransformSystem::AbsoluteOrientation(m_World, transformComponent.EntityID));
//Direction = glm::vec4((glm::vec3)directionalLightComponent["Direction"], 0.f);
Color = (glm::vec4)directionalLightComponent["Color"];
Intensity = (double)directionalLightComponent["Intensity"];
+14 -10
View File
@@ -18,15 +18,17 @@ struct ExplosionEffectJob : ModelJob
ExplosionEffectJob(ComponentWrapper explosionEffectComponent, ::Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matGroup, ComponentWrapper modelComponent, ::World* world, glm::vec4 fillColor, float fillPercentage, bool isShielded, bool shadow)
: ModelJob(model, camera, matrix, matGroup, modelComponent, world, fillColor, fillPercentage, isShielded, shadow)
{
ExplosionOrigin = (glm::vec3)explosionEffectComponent["ExplosionOrigin"];
TimeSinceDeath = (double)explosionEffectComponent["TimeSinceDeath"];
ExplosionDuration = (double)explosionEffectComponent["ExplosionDuration"];
EndColor = (glm::vec4)explosionEffectComponent["EndColor"];
Randomness = (bool)explosionEffectComponent["Randomness"];
RandomnessScalar = (double)explosionEffectComponent["RandomnessScalar"];
Velocity = (glm::vec2)explosionEffectComponent["Velocity"];
ColorByDistance = (bool)explosionEffectComponent["ColorByDistance"];
ExponentialAccelaration = (bool)explosionEffectComponent["ExponentialAccelaration"];
ExplosionOrigin = (Field<glm::vec3>)explosionEffectComponent["ExplosionOrigin"];
TimeSinceDeath = (Field<double>)explosionEffectComponent["TimeSinceDeath"];
ExplosionDuration = (Field<double>)explosionEffectComponent["ExplosionDuration"];
EndColor = (Field<glm::vec4>)explosionEffectComponent["EndColor"];
Randomness = (Field<bool>)explosionEffectComponent["Randomness"];
RandomnessScalar = (Field<double>)explosionEffectComponent["RandomnessScalar"];
Velocity = (Field<glm::vec2>)explosionEffectComponent["Velocity"];
ColorByDistance = (Field<bool>)explosionEffectComponent["ColorByDistance"];
ExponentialAccelaration = (Field<bool>)explosionEffectComponent["ExponentialAccelaration"];
Reverse = (Field<bool>)explosionEffectComponent["Reverse"];Reverse = (bool)explosionEffectComponent["Reverse"];
ColorDistanceScalar = (Field<double>)explosionEffectComponent["ColorDistanceScalar"];ColorDistanceScalar = (double)explosionEffectComponent["ColorDistanceScalar"];
};
glm::vec3 ExplosionOrigin;
@@ -38,12 +40,14 @@ struct ExplosionEffectJob : ModelJob
glm::vec4 EndColor;
bool Randomness = false;
float RandomnessScalar = 1.f;
double RandomnessScalar = 1.f;
glm::vec2 Velocity;
bool ColorByDistance = false;
//bool ReverseAnimation = false;
//bool Wireframe = false;
bool ExponentialAccelaration = false;
bool Reverse = false;
double ColorDistanceScalar = 1.f;
std::array<float, 50> RandomNumbers = {
0.3257552917701f,
+2
View File
@@ -3,6 +3,8 @@
struct Image
{
virtual ~Image() = default;
enum class ImageFormat
{
Unknown,
+12 -6
View File
@@ -16,15 +16,18 @@ private:
public:
~Model();
const std::vector<RawModel::MaterialProperties>& MaterialGroups() const { return m_RawModel->m_Materials; }
const glm::mat4& Matrix() const { return m_RawModel->m_Matrix; }
const RawModel::Vertex* Vertices() const { return m_RawModel->Vertices(); }
unsigned int NumberOfVertices() const { return m_RawModel->NumVertices(); }
const std::vector<RawModel::MaterialProperties>& MaterialGroups() const { return m_Materials; }
//const RawModel::Vertex* Vertices() const { return m_RawModel->Vertices(); }
unsigned int NumberOfVertices() const { return m_Vertices.size(); }
const AABB& Box() const { return m_Box; }
bool IsSkinned() const { return m_RawModel->IsSkinned(); }
bool IsSkinned() const { return m_IsSkinned; }
GLuint VAO;
GLuint ElementBuffer;
RawModel* m_RawModel;
//RawModel* m_RawModel;
Skeleton* m_Skeleton = nullptr;
std::vector<glm::vec3> m_Vertices;
std::vector<unsigned int> m_Indices;
private:
AABB m_Box;
@@ -34,6 +37,9 @@ private:
GLuint TangentNormalsBuffer;
GLuint BiTangentNormalsBuffer;
GLuint TextureCoordBuffer;
std::vector<RawModel::MaterialProperties> m_Materials;
bool m_IsSkinned;
};
#endif
+3 -20
View File
@@ -12,7 +12,7 @@
#include "../Core/ResourceManager.h"
#include "Camera.h"
#include "../Core/World.h"
#include "../Core/Transform.h"
#include "../Core/TransformSystem.h"
#include "Skeleton.h"
#include "ShaderProgram.h"
#include "BlendTree.h"
@@ -26,24 +26,13 @@ struct ModelJob : RenderJob
ModelID = model->ResourceID;
Type = matProp.type;
::RawModel::MaterialBasic* matGroup = matProp.material;
ShaderID = matProp.ShaderID;
switch(matProp.type){
case ::RawModel::MaterialType::Basic:
if (Model->IsSkinned()) {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSkinnedProgram")->ResourceID;
}
else {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusProgram")->ResourceID;
}
TextureID = 0;
break;
case ::RawModel::MaterialType::SingleTextures:
{
if (Model->IsSkinned()) {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSkinnedProgram")->ResourceID;
}
else {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusProgram")->ResourceID;
}
::RawModel::MaterialSingleTextures* singleTextures = static_cast<::RawModel::MaterialSingleTextures*>(matProp.material);
TextureID = (singleTextures->ColorMap.Texture) ? singleTextures->ColorMap.Texture->ResourceID : 0;
if (modelComponent["DiffuseTexture"]) {
@@ -65,12 +54,6 @@ struct ModelJob : RenderJob
break;
case ::RawModel::MaterialType::SplatMapping:
{
if (Model->IsSkinned()) {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSplatMapSkinnedProgram")->ResourceID;
}
else {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSplatMapProgram")->ResourceID;
}
::RawModel::MaterialSplatMapping* SplatTextures = static_cast<::RawModel::MaterialSplatMapping*>(matProp.material);
SplatMap = &SplatTextures->SplatMap;
@@ -122,7 +105,7 @@ struct ModelJob : RenderJob
IsShielded = isShielded;
if (model->IsSkinned()) {
Skeleton = Model->m_RawModel->m_Skeleton;
Skeleton = Model->m_Skeleton;
if (Skeleton != nullptr) {
+2 -2
View File
@@ -7,7 +7,7 @@
#include "../GLM.h"
#include "../Core/ComponentWrapper.h"
#include "RenderJob.h"
#include "../Core/Transform.h"
#include "../Core/TransformSystem.h"
#include "../Core/World.h"
struct PointLightJob : RenderJob
@@ -16,7 +16,7 @@ struct PointLightJob : RenderJob
: RenderJob()
{
Position = glm::vec4((glm::vec3)transformComponent["Position"], 1.0f);
Position = glm::vec4(Transform::AbsolutePosition(m_World, transformComponent.EntityID), 1.f);
Position = glm::vec4(TransformSystem::AbsolutePosition(m_World, transformComponent.EntityID), 1.f);
Color = (glm::vec4)pointLightComponent["Color"];
Radius = (double)pointLightComponent["Radius"];
Intensity = (double)pointLightComponent["Intensity"];
+4 -5
View File
@@ -13,20 +13,18 @@
#include <boost/filesystem/path.hpp>
#include <boost/endian/buffers.hpp>
#include "../Common.h"
#include "../GLM.h"
#include "../Core/ResourceManager.h"
#include "Texture.h"
#include "Skeleton.h"
#include "boost\endian\buffers.hpp"
#include "ShaderProgram.h"
class RawModelCustom : public Resource
{
friend class ResourceManager;
friend class Model;
protected:
RawModelCustom(std::string fileName);
@@ -87,6 +85,7 @@ public:
struct MaterialProperties {
MaterialType type;
MaterialBasic* material;
unsigned int ShaderID = 0;
};
const Vertex* Vertices() const {
+1 -1
View File
@@ -14,7 +14,7 @@
#include "ModelJob.h"
#include "Renderer.h"
#include "PointLightJob.h"
#include "../Core/Transform.h"
#include "../Core/TransformSystem.h"
#include "../Core/EPlayerSpawned.h"
#include "../Core/Octree.h"
#include "../Collision/EntityAABB.h"
+1 -1
View File
@@ -22,7 +22,7 @@
#include "../Core/EventBroker.h"
#include "ImGuiRenderPass.h"
#include "Camera.h"
#include "../Core/Transform.h"
#include "../Core/TransformSystem.h"
#include "imgui/imgui.h"
#include "TextPass.h"
#include "Util/CommonFunctions.h"
+3 -3
View File
@@ -13,7 +13,7 @@
#include "../Core/ResourceManager.h"
#include "Camera.h"
#include "../Core/World.h"
#include "../Core/Transform.h"
#include "../Core/TransformSystem.h"
#include "Skeleton.h"
struct SpriteJob : RenderJob
@@ -37,7 +37,7 @@ struct SpriteJob : RenderJob
BlurBackground = (bool)cSprite["BlurBackground"];
Entity = cSprite.EntityID;
Position = Transform::AbsolutePosition(world, cSprite.EntityID);
Position = TransformSystem::AbsolutePosition(world, cSprite.EntityID);
Depth = 0;
if (depthSorted) {
glm::vec3 viewpos = glm::vec3(camera->ViewMatrix() * glm::vec4(Position, 1));
@@ -50,7 +50,7 @@ struct SpriteJob : RenderJob
FillColor = fillColor;
FillPercentage = fillPercentage;
glm::vec3 scale = Transform::AbsoluteScale(world, cSprite.EntityID);
glm::vec3 scale = TransformSystem::AbsoluteScale(world, cSprite.EntityID);
if((bool)cSprite["KeepRatio"] == true) {
if(scale.y >= scale.x) {
+2 -2
View File
@@ -17,8 +17,8 @@ struct TextJob : RenderJob
: RenderJob()
{
Matrix = matrix;
Color = (glm::vec4)textComponent["Color"];
Content = (std::string)textComponent["Content"];
Color = (const glm::vec4&)textComponent["Color"];
Content = (const std::string&)textComponent["Content"];
Resource = font;
if ((int)textComponent["Alignment"] == textComponent["Alignment"].Enum("Left")) {
+1
View File
@@ -23,6 +23,7 @@ public:
private:
void renderText(std::string text, Font* font, TextJob::AlignmentEnum alignment, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix);
std::string parseColors(std::string text, std::map<int, glm::vec4>& colorChanges, glm::vec4 originalColor);
Font* font;
GLuint VAO, VBO;
-2
View File
@@ -14,8 +14,6 @@ protected:
TextureSprite(std::string path);
public:
~TextureSprite();
void Bind(GLenum textureUnit = GL_TEXTURE0);
GLuint m_Texture = 0;
+16
View File
@@ -0,0 +1,16 @@
#ifndef Events_ChangeBGM_h__
#define Events_ChangeBGM_h__
#include <string>
#include "../Engine/Core/EventBroker.h"
namespace Events
{
struct ChangeBGM : Event
{
std::string FilePath = "";
};
}
#endif // Events_ChangeBGM_h__
@@ -0,0 +1,17 @@
#ifndef Events_PlayAnnouncerVoice_h__
#define Events_PlayAnnouncerVoice_h__
#include <string>
#include "../Engine/Core/EventBroker.h"
namespace Events
{
struct PlayAnonuncerVoice : public Event
{
std::string FilePath = "";
};
}
#endif
+2 -1
View File
@@ -12,7 +12,8 @@ namespace Events
// Sound behavior is thereby specified in the SoundEmitter component.
struct PlaySoundOnEntity : public Event
{
EntityID EmitterID = 0;
EntityWrapper Emitter = EntityWrapper::Invalid;
float Gain = 1.f;
std::string FilePath = "";
};
+16
View File
@@ -0,0 +1,16 @@
#ifndef Events_SetAnnouncerGain_h__
#define Events_SetAnnouncerGain_h__
#include "../Engine/Core/EventBroker.h"
namespace Events
{
struct SetAnnouncerGain : public Event
{
float Gain = 1;
};
}
#endif //
+35 -18
View File
@@ -9,32 +9,35 @@
#include "OpenAL/al.h"
#include "OpenAL/alc.h"
#include "imgui/imgui.h"
#include "Core/World.h"
#include "Core/EventBroker.h"
#include "../Engine/Core/World.h"
#include "../Engine/Core/EventBroker.h"
#include "../Engine/Core/ResourceManager.h"
#include "../Engine/Core/ConfigFile.h"
#include "Core/Transform.h" // Absolute transform
#include "Sound/Sound.h"
#include "../Engine/Core/TransformSystem.h"
#include "../Engine/Sound/Sound.h"
#include "../Engine/Sound/EPlayQueueOnEntity.h"
#include "Sound/EPlaySoundOnEntity.h"
#include "Sound/EPlaySoundOnPosition.h"
#include "Sound/EPlayBackgroundMusic.h"
#include "Sound/EPauseSound.h"
#include "Sound/EContinueSound.h"
#include "Sound/EStopSound.h"
#include "Sound/ESetBGMGain.h"
#include "Sound/ESetSFXGain.h"
#include "Core/EPause.h"
#include "Core/EComponentAttached.h"
#include "../Engine/Sound/EPlaySoundOnEntity.h"
#include "../Engine/Sound/EPlaySoundOnPosition.h"
#include "../Engine/Sound/EPlayBackgroundMusic.h"
#include "../Engine/Sound/EPlayAnnouncerVoice.h"
#include "../Engine/Sound/EPauseSound.h"
#include "../Engine/Sound/EContinueSound.h"
#include "../Engine/Sound/EStopSound.h"
#include "../Engine/Sound/ESetBGMGain.h"
#include "../Engine/Sound/ESetSFXGain.h"
#include "../Engine/Sound/ESetAnnouncerGain.h"
#include "../Engine/Sound/EChangeBGM.h"
#include "../Engine/Core/EPause.h"
#include "../Engine/Core/EComponentAttached.h"
#include "../Core/EPlayerSpawned.h"
typedef std::pair<ALuint, std::vector<ALuint>> QueuedBuffers;
enum class SoundType {
SFX,
BGM
BGM,
Announcer
};
struct Source
@@ -43,6 +46,7 @@ struct Source
Sound* SoundResource = nullptr;
ALuint ALsource;
SoundType Type;
float Duration;
};
class SoundManager
@@ -74,14 +78,20 @@ private:
ALenum getSourceState(ALuint source);
void setGain(Source* source, float gain);
void setSoundProperties(Source* source, ComponentWrapper* soundComponent);
float getDurationSeconds(Source* source);
float getTimeOffsetSeconds(Source* source);
// Specific logic
void playSound(Source* source);
// Need to be the same format (sample rate etc)
// Needs to be the same format (sample rate etc)
void playQueue(QueuedBuffers qb);
void stopSound(Source* source);
Source* createSource(std::string filePath);
std::unordered_map<EntityID, Source*> m_Sources;
void matchBGMLoop();
Source* m_CurrentBGM = nullptr;
Source* m_CurrentBGMCombo = nullptr;
bool m_DrumLoopHasBeenStarted = false;
// Logic
World* m_World = nullptr;
@@ -93,6 +103,7 @@ private:
float m_BGMVolumeChannel = 1.0f;
float m_SFXVolumeChannel = 1.0f;
float m_AnnouncerVolumeChannel = 1.0f;
EntityWrapper m_LocalPlayer = EntityWrapper();
// Events
@@ -102,6 +113,8 @@ private:
bool OnPlaySoundOnPosition(const Events::PlaySoundOnPosition &e);
EventRelay<SoundManager, Events::PlayBackgroundMusic> m_EPlayBackgroundMusic;
bool OnPlayBackgroundMusic(const Events::PlayBackgroundMusic &e);
EventRelay<SoundManager, Events::PlayAnonuncerVoice> m_EPlayAnnouncerVoice;
bool OnPlayAnnouncerVoice(const Events::PlayAnonuncerVoice& e);
EventRelay<SoundManager, Events::PauseSound> m_EPauseSound;
bool OnPauseSound(const Events::PauseSound &e);
EventRelay<SoundManager, Events::StopSound> m_EStopSound;
@@ -112,6 +125,8 @@ private:
bool OnSetBGMGain(const Events::SetBGMGain &e);
EventRelay<SoundManager, Events::SetSFXGain> m_ESetSFXGain;
bool OnSetSFXGain(const Events::SetSFXGain &e);
EventRelay<SoundManager, Events::SetAnnouncerGain> m_ESetAnnouncerGain;
bool OnSetAnnouncerGain(const Events::SetAnnouncerGain& e);
EventRelay<SoundManager, Events::ComponentAttached> m_EComponentAttached;
bool OnComponentAttached(const Events::ComponentAttached &e);
EventRelay<SoundManager, Events::Pause> m_EPause;
@@ -122,6 +137,8 @@ private:
bool OnPlayerSpawned(const Events::PlayerSpawned &e);
EventRelay<SoundManager, Events::PlayQueueOnEntity> m_EPlayQueueOnEntity;
bool OnPlayQueueOnEntity(const Events::PlayQueueOnEntity &e);
EventRelay<SoundManager, Events::ChangeBGM> m_EChangeBGM;
bool OnChangeBGM(const Events::ChangeBGM &e);
};
+1 -1
View File
@@ -2,7 +2,7 @@
#define AmmoPickupSystem_h__
#include "Core/System.h"
#include "Core/Transform.h"
#include "Core/TransformSystem.h"
#include "Core/ResourceManager.h"
#include "Core/EntityFile.h"
#include "Core/EPickupSpawned.h"
@@ -7,7 +7,7 @@
#include "Common.h"
#include "Core/System.h"
#include "Core/Transform.h"
#include "Core/TransformSystem.h"
#include "Core/ECaptured.h"
+1 -1
View File
@@ -2,7 +2,7 @@
#define DamageIndicatorSystem_h__
#include "Core/System.h"
#include "Core/Transform.h"
#include "Core/TransformSystem.h"
#include "Core/ResourceManager.h"
#include "Core/EntityFile.h"
#include "Core/EPlayerDamage.h"
@@ -3,6 +3,7 @@
#include "Common.h"
#include "Core/System.h"
#include "Engine/GLM.h"
class ExplosionEffectSystem : public PureSystem
{
+2 -2
View File
@@ -12,8 +12,8 @@ public:
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override
{
ComponentWrapper& transform = m_World->GetComponent(component.EntityID, "Transform");
(double&)component["Time"] += dt;
(glm::vec3&)transform["Position"] = (float)(double)component["Amplitude"] * glm::sin((glm::two_pi<float>() / (float)(double)component["Period"]) * (float)(double)component["Time"]) * (glm::vec3)component["Axis"];
(Field<double>)component["Time"] += dt;
(Field<glm::vec3>)transform["Position"] = (float)(double)component["Amplitude"] * glm::sin((glm::two_pi<float>() / (float)(double)component["Period"]) * (float)(double)component["Time"]) * (glm::vec3)component["Axis"];
}
};
+3 -1
View File
@@ -7,7 +7,6 @@
#include "Core/Event.h"
#include "Systems/SpawnerSystem.h"
#include "GUI/EButtonClicked.h"
#include "GUI/EButtonPressed.h"
#include "GUI/EButtonReleased.h"
@@ -24,6 +23,8 @@ public:
private:
IRenderer* m_Renderer;
void OpenSubMenu(const Events::InputCommand& e);
void OpenDropDown(const Events::InputCommand& e);
EventRelay<MainMenuSystem, Events::ButtonClicked> m_EClicked;
bool OnButtonClick(const Events::ButtonClicked& e);
@@ -36,6 +37,7 @@ private:
std::string m_CurrentCommand = "";
EntityWrapper m_OpenSubMenu = EntityWrapper::Invalid;
EntityWrapper m_DropDown = EntityWrapper::Invalid;
};
+1 -1
View File
@@ -2,7 +2,7 @@
#define PickupSpawnSystem_h__
#include "Core/System.h"
#include "Core/Transform.h"
#include "Core/TransformSystem.h"
#include "Core/ResourceManager.h"
#include "Core/EntityFile.h"
#include "Core/EPickupSpawned.h"
+1 -1
View File
@@ -33,7 +33,7 @@ private:
// Used to track afterimages for sprint effect.
float m_SprintEffectTimer;
// The logic for making the sound play when player is moving
void playerStep(double dt);
void playerStep(double dt, EntityWrapper player);
// Spawn a hexagon at origin of an Entity
void spawnHexagon(EntityWrapper target);
+24 -3
View File
@@ -1,6 +1,25 @@
#include "Common.h"
#include "Core/System.h"
//struct FSubscriptProxy
// {
// friend struct ComponentWrapper;
// FSubscriptProxy(ComponentWrapper* component, std::string fieldName)
// : m_Component(component)
// , m_FieldName(fieldName)
// { }
// ComponentWrapper* m_Component;
// std::string m_FieldName;
// public:
// template <typename T>
// operator Field<T>() { return Field<T>(m_Component->Field<T>(m_FieldName)); }
// };
class RaptorCopterSystem : public PureSystem
{
public:
@@ -9,9 +28,11 @@ public:
, PureSystem("RaptorCopter")
{ }
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cRaptorCopter, double dt) override
{
ComponentWrapper& transform = m_World->GetComponent(component.EntityID, "Transform");
(glm::vec3&)transform["Orientation"] += (float)(double)component["Speed"] * (float)dt * (glm::vec3)component["Axis"];
ComponentWrapper& cTransform = entity["Transform"];
//FSubscriptProxy subOri(&cTransform, "Orientation");
//Field<glm::vec3> orientation = subOri;
(Field<glm::vec3>)cTransform["Orientation"] += (float)(const double&)cRaptorCopter["Speed"] * (float)dt * (glm::vec3)cRaptorCopter["Axis"];
}
};
+6 -12
View File
@@ -2,6 +2,7 @@
#define Systems_SoundSystem_h__
#include <random>
#include <chrono>
#include "../Engine/Core/System.h"
#include "../Engine/Core/ResourceManager.h"
@@ -20,9 +21,10 @@
#include "../Engine/Collision/ETrigger.h"
#include "../Engine/Sound/EPlaySoundOnEntity.h"
#include "../Engine/Sound/EPlayBackgroundMusic.h"
#include "../Engine/Sound/EPlayAnnouncerVoice.h"
#include "../Game/Events/EDoubleJump.h"
#include "../Game/Events/EDashAbility.h"
#include "../Engine/Sound/EChangeBGM.h"
class SoundSystem : public PureSystem, ImpureSystem
{
@@ -33,14 +35,10 @@ public:
private:
std::string m_Announcer = "";
// Logic for playing a sound when a player jumps
void playerJumps();
// Temporary solution for play test.
bool m_DrumsIsPlaying = false;
double m_DrumTimer = 0.0;
bool drumTimer(double dt);
void playerJumps(EntityWrapper player);
std::default_random_engine generator;
std::default_random_engine m_RandomGenerator;
std::uniform_int_distribution<int> m_RandIntDistribution;
EventRelay<SoundSystem, Events::PlayerSpawned> m_EPlayerSpawned;
bool OnPlayerSpawned(const Events::PlayerSpawned &e);
@@ -48,10 +46,6 @@ private:
bool OnInputCommand(const Events::InputCommand &e);
EventRelay<SoundSystem, Events::DoubleJump> m_EDoubleJump;
bool OnDoubleJump(const Events::DoubleJump &e);
EventRelay<SoundSystem, Events::DashAbility> m_EDashAbility;
bool OnDashAbility(const Events::DashAbility &e);
EventRelay<SoundSystem, Events::TriggerTouch> m_ETriggerTouch;
bool OnTriggerTouch(const Events::TriggerTouch &e);
EventRelay<SoundSystem, Events::Captured> m_ECaptured;
bool OnCaptured(const Events::Captured &e);
EventRelay<SoundSystem, Events::PlayerDamage> m_EPlayerDamage;
+2 -1
View File
@@ -6,8 +6,9 @@
#include "GLM.h"
#include "Core/System.h"
#include "Events/ESpawnerSpawn.h"
#include "Core/Transform.h"
#include "Core/TransformSystem.h"
#include "Core/EntityFile.h"
#include "Rendering/Model.h"
class SpawnerSystem : public System
{
@@ -3,6 +3,7 @@
#include "Core/System.h"
#include "Input/EInputCommand.h"
#include "Network/EPlayerDisconnected.h"
class SpectatorCameraSystem : public ImpureSystem
{
@@ -17,6 +18,8 @@ private:
EventRelay<SpectatorCameraSystem, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(const Events::InputCommand& e);
EventRelay<SpectatorCameraSystem, Events::PlayerDisconnected> m_EDisconnect;
bool OnDisconnect(const Events::PlayerDisconnected& e);
};
#endif
@@ -5,6 +5,7 @@
#include "Collision/Collision.h"
#include "Core/EPlayerDamage.h"
#include "Sound/EPlaySoundOnEntity.h"
#include "Sound/EPlaySoundOnEntity.h"
class DefenderWeaponBehaviour : public WeaponBehaviour<DefenderWeaponBehaviour>
{
@@ -270,7 +270,8 @@ private:
EntityWrapper thirdPersonAttachment;
for (auto& attachment : weaponAttachments) {
ComponentWrapper cWeaponAttachment = attachment["WeaponAttachment"];
if ((std::string&)cWeaponAttachment["Weapon"] == m_ComponentType) {
Field<std::string> weaponType = cWeaponAttachment["Weapon"];
if (*weaponType == m_ComponentType) {
ComponentWrapper::SubscriptProxy person = cWeaponAttachment["Person"];
if ((ComponentInfo::EnumType)person == person.Enum("FirstPerson")) {
firstPersonAttachment = attachment;
+1
View File
@@ -39,6 +39,7 @@ ResourceLoading=true
[Sound]
BGMVolume=1.0
SFXVolume=1.0
AnnouncerVolume=1.0
Announcer=female
[SSAO]
+3 -1
View File
@@ -29,4 +29,6 @@ K=TakeDamage,1500
F2=PerformanceTimingResetAllTimers
F3=PerformanceTimingCreateExcelData
Comma=SwapToClassPick
Period=SwapToTeamPick
Period=SwapToTeamPick
Enter=PickClass,1
F5=DisconnectFromServer
+2
View File
@@ -68,4 +68,6 @@
<xs:include schemaLocation="Components/NetworkComponent.xsd"/>
<xs:include schemaLocation="Components/ServerIdentity.xsd"/>
<xs:include schemaLocation="Components/ServerList.xsd"/>
<xs:include schemaLocation="Components/ConfigBtnResolution.xsd"/>
<xs:include schemaLocation="Components/ConfigBtnFloat.xsd"/>
</xs:schema>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ConfigBtnFloat xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ConfigBtnFloat.xsd">
<Header></Header>
<Field></Field>
<PressValue></PressValue>
</ConfigBtnFloat>
@@ -0,0 +1,22 @@
<?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="ConfigBtnFloat">
<xs:annotation><xs:documentation>Used with a Button component, this button will change a variable in the config file.</xs:documentation></xs:annotation>
<xs:complexType>
<xs:all>
<xs:element name="Header" type="t:string" minOccurs="0">
<xs:annotation><xs:documentation>The header of the section in config.</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="Field" type="t:string" minOccurs="0">
<xs:annotation><xs:documentation>The name of the field to be changed in the config.</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="PressValue" type="t:float" minOccurs="0">
<xs:annotation><xs:documentation>The value to give the field.</xs:documentation></xs:annotation>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ConfigBtnResolution xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ConfigBtnResolution.xsd">
<Header></Header>
<Field></Field>
<PressValue></PressValue>
</ConfigBtnResolution>
@@ -0,0 +1,17 @@
<?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="ConfigBtnResolution">
<xs:annotation><xs:documentation>Used with a Button component, this button will change a variable in the config file.</xs:documentation></xs:annotation>
<xs:complexType>
<xs:all>
<xs:element name="Width" type="t:int" minOccurs="0">
<xs:annotation><xs:documentation>Value of the resolution width.</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="Height" type="t:int" minOccurs="0">
<xs:annotation><xs:documentation>Value of the resolution height.</xs:documentation></xs:annotation>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
@@ -1,19 +1,21 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ExplosionEffect xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ExplosionEffect.xsd">
<ExplosionOrigin X="0" Y="0" Z="0"/>
<TimeSinceDeath>0</TimeSinceDeath>
<ExplosionDuration>2</ExplosionDuration>
<TimeSinceDeath>0.0</TimeSinceDeath>
<ExplosionDuration>2.0</ExplosionDuration>
<Speed>1</Speed>
<Delay>0</Delay>
<!--<Gravity>1</Gravity>-->
<!--<GravityForce>1</GravityForce>-->
<!--<ObjectRadius>2</ObjectRadius>-->
<EndColor R="0" G="0" B="0" A="0"/>
<Randomness>0</Randomness>
<RandomnessScalar>1</RandomnessScalar>
<Randomness>false</Randomness>
<RandomnessScalar>1.0</RandomnessScalar>
<Velocity X="2" Y="2"/>
<ColorByDistance>0</ColorByDistance>
<!--<ReverseAnimation>0</ReverseAnimation>-->
<ColorByDistance>false</ColorByDistance>
<!--<Wireframe>0</Wireframe>-->
<ExponentialAccelaration>0</ExponentialAccelaration>
<ExponentialAccelaration>false</ExponentialAccelaration>
<Pulsate>false</Pulsate>
<Reverse>false</Reverse>
<ColorDistanceScalar>1.0</ColorDistanceScalar>
</ExplosionEffect>
@@ -44,15 +44,21 @@
<xs:element name="ColorByDistance" type="t:bool" minOccurs="0">
<xs:annotation><xs:documentation>Change the color by its moved distance instead of by its time</xs:documentation></xs:annotation>
</xs:element>
<!--<xs:element name="ReverseAnimation" type="t:bool" minOccurs="0">
<xs:annotation><xs:documentation>Implosions are cooler</xs:documentation></xs:annotation>
</xs:element>-->
<!--<xs:element name="Wireframe" type="t:bool" minOccurs="0">
<xs:annotation><xs:documentation>Enable/disable wireframe</xs:documentation></xs:annotation>
</xs:element>-->
<xs:element name="ExponentialAccelaration" type="t:bool" minOccurs="0">
<xs:annotation><xs:documentation>Linear/Exponential accelaration</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="Pulsate" type="t:bool" minOccurs="0">
<xs:annotation><xs:documentation>Pulsate the effect</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="Reverse" type="t:bool" minOccurs="0">
<xs:annotation><xs:documentation>Reverse the effect</xs:documentation></xs:annotation>
</xs:element>
<xs:element name="ColorDistanceScalar" type="t:double" minOccurs="0">
<xs:annotation><xs:documentation>Scale the distance of the color change</xs:documentation></xs:annotation>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
+2 -2
View File
@@ -4,7 +4,7 @@
<Gain>1.0</Gain>
<Pitch>1.0</Pitch>
<Loop>false</Loop>
<MaxDistance>20.0</MaxDistance>
<RollOffFactor>1.0</RollOffFactor>
<MaxDistance>220.0</MaxDistance>
<RollOffFactor>10</RollOffFactor>
<ReferenceDistance>1.0</ReferenceDistance>
</SoundEmitter>
+1 -1
View File
@@ -9,6 +9,6 @@
<KeepRatioX>false</KeepRatioX>
<KeepRatioY>false</KeepRatioY>
<KeepRatio>false</KeepRatio>
<Linear>false</Linear>
<Linear>true</Linear>
<BlurBackground>false</BlurBackground>
</Sprite>
+12 -7
View File
@@ -2,21 +2,26 @@
<Entity xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:NetworkComponent/>
<c:AmmoPickup/>
<c:Model>
<Resource>Models/Props/PickUps/AmmoPickUp.mesh</Resource>
</c:Model>
<c:Trigger/>
<c:RaptorCopter>
<Speed>8</Speed>
<Axis X="0" Y="0.100000001" Z="0"/>
</c:RaptorCopter>
<c:Model>
<Resource>Models/Props/PickUps/AmmoPickUp.mesh</Resource>
</c:Model>
<c:NetworkComponent/>
<c:PointLight>
<Color A="1" B="1" G="0.0823529437" R="1"/>
<Radius>1.5</Radius>
<Intensity>3</Intensity>
</c:PointLight>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Position X="0" Y="2.36784196" Z="-0.0281207096"/>
<Orientation X="0" Y="18843.5469" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
<Orientation X="0" Y="18717.9453" Z="0"/>
</c:Transform>
<c:Trigger/>
</Components>
<Children/>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,169 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Entity name="Origin" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:Transform/>
</Components>
<Children>
<Entity name="Anchor1">
<Components>
<c:RaptorCopter>
<Speed>0.30000001192092896</Speed>
<Axis X="0" Y="1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>30</Period>
<Time>342.91836260588383</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>3.5</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="0" Y="1.47803104" Z="0"/>
<Orientation X="0" Y="220.263962" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CrystalsLayer1.mesh</Resource>
<Color A="1" B="1" G="0.392156869" R="0"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Anchor2">
<Components>
<c:RaptorCopter>
<Speed>0.5</Speed>
<Axis X="0" Y="1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>20</Period>
<Time>448.85134971162591</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>3</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="0" Y="1.05921149" Z="0"/>
<Orientation X="0" Y="360.699402" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CrystalsLayer2.mesh</Resource>
<Color A="1" B="1" G="0.392156869" R="0"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Anchor0">
<Components>
<c:RaptorCopter>
<Speed>0.10000000149011612</Speed>
<Axis X="0" Y="-1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>10</Period>
<Time>495.36799589902654</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>0.5</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="-0" Y="-0.11458683" Z="-0"/>
<Orientation X="0" Y="-68.9721527" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CenterCrystal.mesh</Resource>
<Color A="1" B="1" G="0.392156869" R="0"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="LightOrigin1">
<Components>
<c:RaptorCopter>
<Speed>1</Speed>
<Axis X="0.400000006" Y="1" Z="0"/>
</c:RaptorCopter>
<c:Transform>
<Orientation X="16.781414" Y="41.9535484" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="1" G="0.588235319" R="0"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="1.1234858" Y="0.720658064" Z="3.40589333"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="1" G="0.588235319" R="0"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="0.4723185" Y="0" Z="-4.12240839"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="1" G="0.588235319" R="0"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="-2.91954184" Y="1.54033804" Z="-0.0577439293"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="1" G="0.588235319" R="0"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="1.48998797" Y="-3.06706786" Z="-1.78805089"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
@@ -0,0 +1,174 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Entity name="Origin" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:Transform>
<Position X="0" Y="14.8518229" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity name="Anchor1">
<Components>
<c:RaptorCopter>
<Speed>0.30000001192092896</Speed>
<Axis X="0" Y="1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>30</Period>
<Time>1125.9779108477385</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>3.5</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="-0" Y="-0.711852849" Z="-0"/>
<Orientation X="0" Y="455.182343" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CrystalsLayer1.mesh</Resource>
<Color A="1" B="2" G="0.784313738" R="0"/>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Anchor2">
<Components>
<c:RaptorCopter>
<Speed>0.5</Speed>
<Axis X="0" Y="1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>20</Period>
<Time>1231.9108979534806</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>3</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="-0" Y="-1.69476664" Z="-0"/>
<Orientation X="0" Y="752.229553" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CrystalsLayer2.mesh</Resource>
<Color A="1" B="2" G="0.784313738" R="0"/>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Anchor0">
<Components>
<c:RaptorCopter>
<Speed>0.10000000149011612</Speed>
<Axis X="0" Y="-1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>10</Period>
<Time>1278.4275441408811</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>0.5</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="-0" Y="-0.417467505" Z="-0"/>
<Orientation X="0" Y="-147.27742" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CenterCrystal.mesh</Resource>
<Color A="1" B="2" G="0.784313738" R="0"/>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="LightOrigin1">
<Components>
<c:RaptorCopter>
<Speed>1</Speed>
<Axis X="0.400000006" Y="1" Z="0"/>
</c:RaptorCopter>
<c:Transform>
<Orientation X="330.00589" Y="825.014587" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="1" G="0.588235319" R="0"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="1.1234858" Y="0.720658064" Z="3.40589333"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="1" G="0.588235319" R="0"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="0.4723185" Y="0" Z="-4.12240839"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="1" G="0.588235319" R="0"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="-2.91954184" Y="1.54033804" Z="-0.0577439293"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="1" G="0.588235319" R="0"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="1.48998797" Y="-3.06706786" Z="-1.78805089"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
@@ -0,0 +1,173 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Entity name="Origin" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:Transform>
<Position X="0" Y="14.8518229" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity name="Anchor1">
<Components>
<c:RaptorCopter>
<Speed>0.30000001192092896</Speed>
<Axis X="0" Y="1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>30</Period>
<Time>1816.9423460293749</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>3.5</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="-0" Y="-1.38488328" Z="-0"/>
<Orientation X="0" Y="662.475891" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CrystalsLayer1.mesh</Resource>
<Color A="1" B="0" G="0.235294119" R="1.09803927"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Anchor2">
<Components>
<c:RaptorCopter>
<Speed>0.5</Speed>
<Axis X="0" Y="1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>20</Period>
<Time>1922.875333135117</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>3</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="0" Y="2.35616231" Z="0"/>
<Orientation X="0" Y="1097.71094" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CrystalsLayer2.mesh</Resource>
<Color A="1" B="0" G="0.235294119" R="1.09803927"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Anchor0">
<Components>
<c:RaptorCopter>
<Speed>0.10000000149011612</Speed>
<Axis X="0" Y="-1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>10</Period>
<Time>1969.3919793225175</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>0.5</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="-0" Y="-0.186382934" Z="-0"/>
<Orientation X="0" Y="-216.374603" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CenterCrystal.mesh</Resource>
<Color A="1" B="0" G="0.235294119" R="1.09803927"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform>
<Position X="-0" Y="-0" Z="-0"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="LightOrigin1">
<Components>
<c:RaptorCopter>
<Speed>1</Speed>
<Axis X="0.400000006" Y="1" Z="0"/>
</c:RaptorCopter>
<c:Transform>
<Orientation X="606.394653" Y="1515.97461" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="0" G="0" R="1"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="1.1234858" Y="0.720658064" Z="3.40589333"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="0" G="0" R="1"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="0.4723185" Y="0" Z="-4.12240839"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="0" G="0" R="1"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="-2.91954184" Y="1.54033804" Z="-0.0577439293"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="0" G="0" R="1"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="1.48998797" Y="-3.06706786" Z="-1.78805089"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
@@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Entity name="Origin" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:Transform>
<Position X="0" Y="14.8518229" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity name="Anchor1">
<Components>
<c:RaptorCopter>
<Speed>0.30000001192092896</Speed>
<Axis X="0" Y="1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>30</Period>
<Time>1622.3711487379048</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>3.5</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="0" Y="1.66753078" Z="0"/>
<Orientation X="0" Y="604.103943" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CrystalsLayer1.mesh</Resource>
<Shadow>false</Shadow>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Anchor2">
<Components>
<c:RaptorCopter>
<Speed>0.5</Speed>
<Axis X="0" Y="1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>20</Period>
<Time>1728.3041358436469</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>3</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="0" Y="1.5237397" Z="0"/>
<Orientation X="0" Y="1000.42615" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CrystalsLayer2.mesh</Resource>
<Shadow>false</Shadow>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Anchor0">
<Components>
<c:RaptorCopter>
<Speed>0.10000000149011612</Speed>
<Axis X="0" Y="-1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>10</Period>
<Time>1774.8207820310474</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>0.5</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="0" Y="0.0561612286" Z="0"/>
<Orientation X="0" Y="-196.917053" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CenterCrystal.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform>
<Position X="-0" Y="-0" Z="-0"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="LightOrigin1">
<Components>
<c:RaptorCopter>
<Speed>1</Speed>
<Axis X="0.400000006" Y="1" Z="0"/>
</c:RaptorCopter>
<c:Transform>
<Orientation X="528.564453" Y="1321.40454" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:PointLight>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="1.1234858" Y="0.720658064" Z="3.40589333"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="0.4723185" Y="0" Z="-4.12240839"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="-2.91954184" Y="1.54033804" Z="-0.0577439293"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="1.48998797" Y="-3.06706786" Z="-1.78805089"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Entity name="Origin" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:Transform>
<Position X="0" Y="7.3052454" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity name="Anchor0">
<Components>
<c:RaptorCopter>
<Speed>0.20000000298023224</Speed>
<Axis X="0" Y="-1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>10</Period>
<Time>1323.7395571102679</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>0.5</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="0" Y="0.355862439" Z="0"/>
<Orientation X="0" Y="-363.932587" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CenterCrystalBlue.mesh</Resource>
<Color A="1" B="0" G="0" R="0"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="LightOrigin1">
<Components>
<c:RaptorCopter>
<Speed>1</Speed>
<Axis X="0.400000006" Y="1" Z="0"/>
</c:RaptorCopter>
<c:Transform>
<Orientation X="348.130463" Y="870.325134" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="1" G="1" R="0"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="1.1234858" Y="0.720658064" Z="3.40589333"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="1" G="1" R="0"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="0.4723185" Y="0" Z="-4.12240839"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="1" G="1" R="0"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="-2.91954184" Y="1.54033804" Z="-0.0577439293"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight>
<Color A="1" B="1" G="1" R="0"/>
<Radius>4.5</Radius>
<Falloff>0.5</Falloff>
</c:PointLight>
<c:Transform>
<Position X="1.48998797" Y="-3.06706786" Z="-1.78805089"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
<Entity name="Anchor1">
<Components>
<c:RaptorCopter>
<Speed>0.5</Speed>
<Axis X="0" Y="1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>30</Period>
<Time>1171.2899238171258</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>3.5</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="0" Y="0.93411696" Z="0"/>
<Orientation X="0" Y="1483.0957" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CrystalsLayer1Blue.mesh</Resource>
<Color A="1" B="0" G="0" R="0"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Anchor2">
<Components>
<c:RaptorCopter>
<Speed>0.5</Speed>
<Axis X="0" Y="1" Z="0"/>
</c:RaptorCopter>
<c:FloatingEffect>
<Period>20</Period>
<Time>1277.2229109228683</Time>
<Axis X="0" Y="1" Z="0"/>
<Amplitude>3</Amplitude>
</c:FloatingEffect>
<c:Transform>
<Position X="-0" Y="-2.29767179" Z="-0"/>
<Orientation X="0" Y="2074.16089" Z="0"/>
</c:Transform>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource>Models/Props/CapturePoint/CrystalsLayer2Blue.mesh</Resource>
<Color A="1" B="0" G="0" R="0"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
+12 -7
View File
@@ -2,21 +2,26 @@
<Entity xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:NetworkComponent/>
<c:HealthPickup/>
<c:Model>
<Resource>Models/Props/PickUps/HealthPickUp.mesh</Resource>
</c:Model>
<c:Trigger/>
<c:RaptorCopter>
<Speed>8</Speed>
<Axis X="0" Y="0.100000001" Z="0"/>
</c:RaptorCopter>
<c:Model>
<Resource>Models/Props/PickUps/HealthPickUp.mesh</Resource>
</c:Model>
<c:NetworkComponent/>
<c:PointLight>
<Color A="1" B="0" G="1" R="1"/>
<Radius>1.5</Radius>
<Intensity>3</Intensity>
</c:PointLight>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Position X="0" Y="2.36800003" Z="0"/>
<Orientation X="0" Y="19005.3867" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
<Orientation X="0" Y="18767.0273" Z="0"/>
</c:Transform>
<c:Trigger/>
</Components>
<Children/>
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Entity name="MuzzleFlashBlue" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:Lifetime>
<Lifetime>0.039999999105930328</Lifetime>
</c:Lifetime>
<c:Transform/>
</Components>
<Children>
<Entity name="PlaneRight">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Blue/PlaneRight.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone1Outside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Blue/Cone1Outside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone1Inside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Blue/Cone1Inside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone2Outside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Blue/Cone2Outside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone2Inside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Blue/Cone2Inside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="PlaneUp">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Blue/PlaneUp.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="PlaneDown">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Blue/PlaneDown.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="PlaneLeft">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Blue/PlaneLeft.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Entity name="MuzzleFlashFire" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:Lifetime>
<Lifetime>0.039999999105930328</Lifetime>
</c:Lifetime>
<c:Transform/>
</Components>
<Children>
<Entity name="PlaneRight">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Fire/PlaneRight.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone1Outside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Fire/Cone1Outside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone1Inside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Fire/Cone1Inside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone2Outside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Fire/Cone2Outside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone2Inside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Fire/Cone2Inside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="PlaneUp">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Fire/PlaneUp.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="PlaneDown">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Fire/PlaneDown.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="PlaneLeft">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Fire/PlaneLeft.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Entity name="MuzzleFlashGay" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:Lifetime>
<Lifetime>0.039999999105930328</Lifetime>
</c:Lifetime>
<c:Transform/>
</Components>
<Children>
<Entity name="PlaneRight">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Rainbow/PlaneRight.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone1Outside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Rainbow/Cone1Outside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone1Inside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Rainbow/Cone1Inside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone2Outside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Rainbow/Cone2Outside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone2Inside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Rainbow/Cone2Inside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="PlaneUp">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Rainbow/PlaneUp.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="PlaneDown">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Rainbow/PlaneDown.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="PlaneLeft">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Rainbow/PlaneLeft.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Entity name="MuzzleFlashRed" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:Lifetime>
<Lifetime>0.039999999105930328</Lifetime>
</c:Lifetime>
<c:Transform/>
</Components>
<Children>
<Entity name="PlaneRight">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Red/PlaneRight.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone1Outside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Red/Cone1Outside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone1Inside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Red/Cone1Inside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone2Outside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Red/Cone2Outside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="Cone2Inside">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Red/Cone2Inside.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="PlaneUp">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Red/PlaneUp.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="PlaneDown">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Red/PlaneDown.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
<Entity name="PlaneLeft">
<Components>
<c:Model>
<Resource>Models/Effects/MuzzleFlash/Red/PlaneLeft.mesh</Resource>
<Shadow>false</Shadow>
<Transparent>true</Transparent>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
+141
View File
@@ -0,0 +1,141 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Entity name="Options" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:Transform/>
</Components>
<Children>
<Entity name="Background_Origin">
<Components>
<c:Transform/>
</Components>
<Children>
<Entity name="Background">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<Color A="0.196078435" B="0" G="0" R="0"/>
</c:Sprite>
<c:Transform>
<Scale X="0.300000012" Y="0.5" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="Title_Origin">
<Components>
<c:Transform/>
</Components>
<Children>
<Entity name="UnderLine">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<Visible>false</Visible>
</c:Sprite>
<c:Transform>
<Position X="0.00500000035" Y="0.198000014" Z="0.0199999996"/>
<Scale X="0.270000011" Y="0.00100000005" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="Text">
<Components>
<c:Text>
<Content>Options</Content>
<Resource>Fonts/DroidSans.ttf,64</Resource>
<Alignment>
<Left/>
</Alignment>
</c:Text>
<c:Transform>
<Position X="-0.131999999" Y="0.202000007" Z="0.0199999996"/>
<Scale X="0.0320000015" Y="0.0310000014" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
<Entity name="Buttons_anchor">
<Components>
<c:Transform>
<Position X="0" Y="0.168000013" Z="0.0199999996"/>
</c:Transform>
</Components>
<Children>
<Entity name="Resolution">
<Components>
<c:Transform>
<Scale X="0.100000001" Y="0.100000001" Z="1"/>
</c:Transform>
</Components>
<Children>
<Entity name="Sprite">
<Components>
<c:Button/>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<Color A="0.392156869" B="1" G="1" R="1"/>
</c:Sprite>
<c:InputCmdButton>
<Command>Resolution</Command>
<PressValue>1</PressValue>
</c:InputCmdButton>
<c:Transform>
<Scale X="2.5999999" Y="0.300000012" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="TextAndCorner_Origin">
<Components>
<c:Transform/>
</Components>
<Children>
<Entity name="Text">
<Components>
<c:Text>
<Content>Resolution</Content>
<Resource>Fonts/DroidSans.ttf,64</Resource>
<Color A="1" B="0" G="0" R="0"/>
<Alignment>
<Right/>
</Alignment>
</c:Text>
<c:Transform>
<Position X="-0.180000007" Y="-0.116000004" Z="0.00500000035"/>
<Scale X="0.219000012" Y="0.150000006" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
<Entity name="ResolutionSpawner">
<Components>
<c:Spawner>
<EntityFile>Schema/Entities/Resolution_Options.xml</EntityFile>
</c:Spawner>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
@@ -0,0 +1,128 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Entity name="Resolution_Options" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:Transform/>
</Components>
<Children>
<Entity name="Res1080">
<Components>
<c:Button/>
<c:ConfigBtnResolution>
<Width>1920</Width>
<Height>1080</Height>
</c:ConfigBtnResolution>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<Color A="0.392156869" B="1" G="1" R="1"/>
</c:Sprite>
<c:Transform>
<Position X="-0.088000007" Y="-0.0350000001" Z="0"/>
<Scale X="0.0820000023" Y="0.0299999993" Z="1"/>
</c:Transform>
</Components>
<Children>
<Entity name="Text">
<Components>
<c:Text>
<Content>1920x1080</Content>
<Resource>Fonts/DroidSans.ttf,64</Resource>
<Color A="1" B="0" G="0" R="0"/>
<Alignment>
<Left/>
</Alignment>
</c:Text>
<c:Transform>
<Position X="-0.361000031" Y="-0.562000036" Z="0.0199999996"/>
<Scale X="0.180000007" Y="0.469000012" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Res768">
<Components>
<c:Button/>
<c:ConfigBtnResolution>
<Width>1366</Width>
<Height>768</Height>
</c:ConfigBtnResolution>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<Color A="0.392156869" B="1" G="1" R="1"/>
</c:Sprite>
<c:Transform>
<Position X="0" Y="-0.0350000001" Z="0"/>
<Scale X="0.0820000023" Y="0.0299999993" Z="1"/>
</c:Transform>
</Components>
<Children>
<Entity name="Text">
<Components>
<c:Text>
<Content>1366x768</Content>
<Resource>Fonts/DroidSans.ttf,64</Resource>
<Color A="1" B="0" G="0" R="0"/>
<Alignment>
<Left/>
</Alignment>
</c:Text>
<c:Transform>
<Position X="-0.380000025" Y="-0.561999977" Z="0.0199999996"/>
<Scale X="0.180000007" Y="0.469000012" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Res720">
<Components>
<c:Button/>
<c:ConfigBtnResolution>
<Width>1280</Width>
<Height>720</Height>
</c:ConfigBtnResolution>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<Color A="0.392156869" B="1" G="1" R="1"/>
</c:Sprite>
<c:Transform>
<Position X="0.088000007" Y="-0.0350000001" Z="0"/>
<Scale X="0.0820000023" Y="0.0299999993" Z="1"/>
</c:Transform>
</Components>
<Children>
<Entity name="Text">
<Components>
<c:Text>
<Content>1280x720</Content>
<Resource>Fonts/DroidSans.ttf,64</Resource>
<Color A="1" B="0" G="0" R="0"/>
<Alignment>
<Left/>
</Alignment>
</c:Text>
<c:Transform>
<Position X="-0.387000024" Y="-0.561999977" Z="0.0199999996"/>
<Scale X="0.180000007" Y="0.469000012" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
@@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Entity name="Resolution_Options" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:Transform>
<Position X="0" Y="0" Z="0.0180000011"/>
</c:Transform>
</Components>
<Children>
<Entity name="Background">
<Components>
<c:Sprite>
<DepthSort>false</DepthSort>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<Color A="1" B="0.117647059" G="0.117647059" R="0.117647059"/>
</c:Sprite>
<c:Transform>
<Position X="-0.00700000022" Y="-0.0310000014" Z="-0.0270000007"/>
<Scale X="0.292000026" Y="0.064000003" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="Res1080">
<Components>
<c:Button/>
<c:ConfigBtnResolution>
<Width>1920</Width>
<Height>1080</Height>
</c:ConfigBtnResolution>
<c:Sprite>
<DepthSort>false</DepthSort>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<Color A="0.392156869" B="1" G="1" R="1"/>
</c:Sprite>
<c:Transform>
<Position X="-0.088000007" Y="-0.0350000001" Z="0"/>
<Scale X="0.0820000023" Y="0.0299999993" Z="1"/>
</c:Transform>
</Components>
<Children>
<Entity name="Text">
<Components>
<c:Text>
<Content>1920x1080</Content>
<Resource>Fonts/DroidSans.ttf,64</Resource>
<Color A="1" B="0" G="0" R="0"/>
<Alignment>
<Left/>
</Alignment>
</c:Text>
<c:Transform>
<Position X="-0.361000031" Y="-0.562000036" Z="0.0199999996"/>
<Scale X="0.180000007" Y="0.469000012" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Res768">
<Components>
<c:Button/>
<c:ConfigBtnResolution>
<Width>1366</Width>
<Height>768</Height>
</c:ConfigBtnResolution>
<c:Sprite>
<DepthSort>false</DepthSort>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<Color A="0.392156869" B="1" G="1" R="1"/>
</c:Sprite>
<c:Transform>
<Position X="0" Y="-0.0350000001" Z="0"/>
<Scale X="0.0820000023" Y="0.0299999993" Z="1"/>
</c:Transform>
</Components>
<Children>
<Entity name="Text">
<Components>
<c:Text>
<Content>1366x768</Content>
<Resource>Fonts/DroidSans.ttf,64</Resource>
<Color A="1" B="0" G="0" R="0"/>
<Alignment>
<Left/>
</Alignment>
</c:Text>
<c:Transform>
<Position X="-0.380000025" Y="-0.561999977" Z="0.0199999996"/>
<Scale X="0.180000007" Y="0.469000012" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Res720">
<Components>
<c:Button/>
<c:ConfigBtnResolution>
<Width>1280</Width>
<Height>720</Height>
</c:ConfigBtnResolution>
<c:Sprite>
<DepthSort>false</DepthSort>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<Color A="0.392156869" B="1" G="1" R="1"/>
</c:Sprite>
<c:Transform>
<Position X="0.088000007" Y="-0.0350000001" Z="0"/>
<Scale X="0.0820000023" Y="0.0299999993" Z="1"/>
</c:Transform>
</Components>
<Children>
<Entity name="Text">
<Components>
<c:Text>
<Content>1280x720</Content>
<Resource>Fonts/DroidSans.ttf,64</Resource>
<Color A="1" B="0" G="0" R="0"/>
<Alignment>
<Left/>
</Alignment>
</c:Text>
<c:Transform>
<Position X="-0.387000024" Y="-0.561999977" Z="0.0199999996"/>
<Scale X="0.180000007" Y="0.469000012" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
+78 -12
View File
@@ -17,7 +17,6 @@
<c:Text>
<Content>123.123.123.123</Content>
<Resource>Fonts/DroidSans.ttf,64</Resource>
<Color A="1" B="0" G="0" R="0"/>
<Alignment>
<Left/>
</Alignment>
@@ -28,7 +27,7 @@
<Field>IP</Field>
</c:TextFieldReader>
<c:Transform>
<Position X="-0.200000003" Y="-0.100000001" Z="0"/>
<Position X="-0.200000003" Y="-0.100000001" Z="0.00700000022"/>
<Scale X="0.649999976" Y="0.649999976" Z="1"/>
</c:Transform>
</Components>
@@ -39,7 +38,6 @@
<c:Text>
<Content>65999</Content>
<Resource>Fonts/DroidSans.ttf,64</Resource>
<Color A="1" B="0" G="0" R="0"/>
<Alignment>
<Left/>
</Alignment>
@@ -50,7 +48,7 @@
<Field>Port</Field>
</c:TextFieldReader>
<c:Transform>
<Position X="4.70000029" Y="-0.100000001" Z="0"/>
<Position X="4.70000029" Y="-0.100000001" Z="0.00700000022"/>
<Scale X="0.649999976" Y="0.649999976" Z="1"/>
</c:Transform>
</Components>
@@ -61,7 +59,6 @@
<c:Text>
<Content>UnkownServer</Content>
<Resource>Fonts/DroidSans.ttf,64</Resource>
<Color A="1" B="0" G="0" R="0"/>
<Alignment>
<Left/>
</Alignment>
@@ -72,7 +69,7 @@
<Field>ServerName</Field>
</c:TextFieldReader>
<c:Transform>
<Position X="-8.60000038" Y="-0.100000001" Z="0"/>
<Position X="-8.60000038" Y="-0.100000001" Z="0.00700000022"/>
</c:Transform>
</Components>
<Children/>
@@ -82,7 +79,6 @@
<c:Text>
<Content>0</Content>
<Resource>Fonts/DroidSans.ttf,64</Resource>
<Color A="1" B="0" G="0" R="0"/>
<Alignment>
<Left/>
</Alignment>
@@ -93,7 +89,7 @@
<Field>PlayersConnected</Field>
</c:TextFieldReader>
<c:Transform>
<Position X="7.80000019" Y="0" Z="0"/>
<Position X="7.80000019" Y="0" Z="0.00700000022"/>
</c:Transform>
</Components>
<Children/>
@@ -102,14 +98,15 @@
<Components>
<c:Button/>
<c:Sprite>
<DepthSort>false</DepthSort>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<GlowMap></GlowMap>
<DepthSort>false</DepthSort>
<Color A="0.588235319" B="1" G="1" R="1"/>
<Color A="0.392156869" B="0.392156869" G="0.392156869" R="0.392156869"/>
</c:Sprite>
<c:Transform>
<Position X="0.100000001" Y="0.496000022" Z="0"/>
<Position X="0.100000001" Y="0.496000022" Z="0.00700000022"/>
<Scale X="18.1000004" Y="2" Z="1"/>
</c:Transform>
</Components>
@@ -117,6 +114,75 @@
</Entity>
</Children>
</Entity>
<Entity name="Corners">
<Components>
<c:Transform>
<Position X="0" Y="0" Z="0.00700000022"/>
<Scale X="0.200000003" Y="0.200000003" Z="1"/>
</c:Transform>
</Components>
<Children>
<Entity name="TopLeft">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="-43.9590034" Y="6.70000029" Z="0"/>
<Orientation X="0" Y="0" Z="1.57079637"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="BottomLeft">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="-43.9589996" Y="-1.75600004" Z="0"/>
<Orientation X="0" Y="0" Z="3.14499998"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="BottomRight">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="44.8320007" Y="-1.75600004" Z="0"/>
<Orientation X="0" Y="0" Z="4.71218538"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="TopRight">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="44.8320007" Y="6.69999981" Z="0"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
+135 -18
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Entity name="ServerList" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Entity name="Play" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
<Components>
<c:ServerList>
@@ -12,7 +12,7 @@
<Entity name="Identities_Origin">
<Components>
<c:Transform>
<Position X="0" Y="0.181182757" Z="0"/>
<Position X="0" Y="0.172000006" Z="0"/>
</c:Transform>
</Components>
<Children>
@@ -30,27 +30,14 @@
</Entity>
</Children>
</Entity>
<Entity name="Background">
<Components>
<c:Sprite>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<GlowMap></GlowMap>
<Color A="0.196078435" B="0" G="0" R="0"/>
</c:Sprite>
<c:Transform>
<Scale X="0.300000012" Y="0.5" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="RefreshButton">
<Components>
<c:Button/>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<GlowMap></GlowMap>
<Color A="0.588235319" B="1" G="1" R="1"/>
</c:Sprite>
<c:InputCmdButton>
@@ -66,8 +53,9 @@
<Entity name="RefreshIcon">
<Components>
<c:Sprite>
<DiffuseTexture>Textures/Icons/rotate.png</DiffuseTexture>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Icons/rotate.png</DiffuseTexture>
<Color A="1" B="1" G="0" R="1"/>
</c:Sprite>
<c:Transform>
@@ -79,6 +67,135 @@
</Entity>
</Children>
</Entity>
<Entity name="Title_Origin">
<Components>
<c:Transform/>
</Components>
<Children>
<Entity name="Text">
<Components>
<c:Text>
<Content>Servers</Content>
<Resource>Fonts/DroidSans.ttf,64</Resource>
<Alignment>
<Left/>
</Alignment>
</c:Text>
<c:Transform>
<Position X="-0.131999999" Y="0.202000007" Z="0.0199999996"/>
<Scale X="0.0320000015" Y="0.0310000014" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="UnderLine">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<Visible>false</Visible>
</c:Sprite>
<c:Transform>
<Position X="0.00500000035" Y="0.198000014" Z="0.0199999996"/>
<Scale X="0.270000011" Y="0.00100000005" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Background_Origin">
<Components>
<c:Transform/>
</Components>
<Children>
<Entity name="Background">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<Color A="0.196078435" B="0" G="0" R="0"/>
</c:Sprite>
<c:Transform>
<Scale X="0.300000012" Y="0.5" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="Corners">
<Components>
<c:Transform>
<Position X="0" Y="0" Z="0.0100000007"/>
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
</c:Transform>
</Components>
<Children>
<Entity name="TopLeft">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="-29.0360012" Y="49.0510025" Z="0"/>
<Orientation X="0" Y="0" Z="1.57079637"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="BottomLeft">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="-29.0050011" Y="-48.927002" Z="0"/>
<Orientation X="0" Y="0" Z="3.14499998"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="BottomRight">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="29.0750008" Y="-48.9350014" Z="0"/>
<Orientation X="0" Y="0" Z="4.71218538"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="TopRight">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="29.0750008" Y="49.0650024" Z="0"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
+135 -102
View File
@@ -22,7 +22,7 @@
<Entity>
<Components>
<c:CapturePointGameMode>
<RespawnTime>7.0999304984909202</RespawnTime>
<RespawnTime>0.53338721940212963</RespawnTime>
</c:CapturePointGameMode>
<c:Transform/>
</Components>
@@ -2828,7 +2828,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Orientation X="0" Y="25992.9746" Z="0"/>
<Orientation X="0" Y="26060.2324" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -2870,7 +2870,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Orientation X="0" Y="90523.6719" Z="0"/>
<Orientation X="0" Y="90593.4219" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -2912,7 +2912,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Orientation X="0" Y="90461.8125" Z="0"/>
<Orientation X="0" Y="90531.5625" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -2954,7 +2954,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36800003" Z="0"/>
<Orientation X="0" Y="71578.0156" Z="0"/>
<Orientation X="0" Y="71647.7656" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -2996,7 +2996,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36800003" Z="0"/>
<Orientation X="0" Y="25923.3281" Z="0"/>
<Orientation X="0" Y="25990.5859" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -3038,7 +3038,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Orientation X="0" Y="81128.9531" Z="0"/>
<Orientation X="0" Y="81198.7031" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -3080,7 +3080,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Orientation X="0" Y="78866.125" Z="0"/>
<Orientation X="0" Y="78935.875" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -3122,7 +3122,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Orientation X="0" Y="90523.6719" Z="0"/>
<Orientation X="0" Y="90593.4219" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -3164,7 +3164,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Orientation X="0" Y="78866.125" Z="0"/>
<Orientation X="0" Y="78935.875" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -5261,7 +5261,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36800003" Z="0"/>
<Orientation X="0" Y="71424.8125" Z="0"/>
<Orientation X="0" Y="71494.5625" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -5303,7 +5303,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Orientation X="0" Y="47480.0781" Z="0"/>
<Orientation X="0" Y="47550.7578" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -6869,7 +6869,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36800003" Z="0"/>
<Orientation X="0" Y="71548.5938" Z="0"/>
<Orientation X="0" Y="71618.3438" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -6911,7 +6911,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Orientation X="0" Y="90490.5469" Z="0"/>
<Orientation X="0" Y="90560.2969" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -6953,7 +6953,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Orientation X="0" Y="78833" Z="0"/>
<Orientation X="0" Y="78902.75" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -6995,7 +6995,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Orientation X="0" Y="81095.8281" Z="0"/>
<Orientation X="0" Y="81165.5781" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -7037,7 +7037,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Orientation X="0" Y="90428.6875" Z="0"/>
<Orientation X="0" Y="90498.4375" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -7079,7 +7079,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Orientation X="0" Y="25960.2227" Z="0"/>
<Orientation X="0" Y="26027.4805" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -7121,7 +7121,7 @@
</c:Model>
<c:Transform>
<Position X="0" Y="2.36784196" Z="0"/>
<Orientation X="0" Y="90490.5469" Z="0"/>
<Orientation X="0" Y="90560.2969" Z="0"/>
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
</c:Transform>
</Components>
@@ -8796,7 +8796,7 @@
<Axis X="0" Y="1" Z="0"/>
</c:RaptorCopter>
<c:Transform>
<Orientation X="0" Y="97.568718" Z="0"/>
<Orientation X="0" Y="165.48909" Z="0"/>
</c:Transform>
</Components>
<Children>
@@ -8808,7 +8808,7 @@
</c:RaptorCopter>
<c:Transform>
<Position X="0" Y="26" Z="40"/>
<Orientation X="0" Y="-112.035805" Z="0"/>
<Orientation X="0" Y="-247.882935" Z="0"/>
</c:Transform>
</Components>
<Children>
@@ -8858,10 +8858,11 @@
<Components>
<c:Button/>
<c:Sprite>
<DepthSort>false</DepthSort>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<GlowMap></GlowMap>
<DepthSort>false</DepthSort>
<Color A="0.392156869" B="0" G="0" R="0"/>
</c:Sprite>
<c:InputCmdButton>
@@ -8874,6 +8875,44 @@
</Components>
<Children/>
</Entity>
<Entity name="ButtonCorner_Origin">
<Components>
<c:Transform/>
</Components>
<Children>
<Entity name="BottomRight">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="0.0970000029" Y="-0.0219999999" Z="0.00499999989"/>
<Orientation X="0" Y="0" Z="4.71199989"/>
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="TopRight">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="0.0970000029" Y="0.0220000017" Z="0.00499999989"/>
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Text">
<Components>
<c:Text>
@@ -8890,40 +8929,6 @@
</Components>
<Children/>
</Entity>
<Entity name="ButtonCorner_Origin">
<Components>
<c:Transform/>
</Components>
<Children>
<Entity name="TopRight">
<Components>
<c:Sprite>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<GlowMap></GlowMap>
</c:Sprite>
<c:Transform>
<Position X="0.0970000029" Y="0.0220000017" Z="0.00499999989"/>
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="BottomRight">
<Components>
<c:Sprite>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<GlowMap></GlowMap>
</c:Sprite>
<c:Transform>
<Position X="0.0970000029" Y="-0.0219999999" Z="0.00499999989"/>
<Orientation X="0" Y="0" Z="4.71199989"/>
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
<Entity name="ButtonPos_3">
@@ -8937,10 +8942,11 @@
<Components>
<c:Button/>
<c:Sprite>
<DepthSort>false</DepthSort>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<GlowMap></GlowMap>
<DepthSort>false</DepthSort>
<Color A="0.392156869" B="0" G="0" R="0"/>
</c:Sprite>
<c:Transform>
@@ -8973,8 +8979,10 @@
<Entity name="TopRight">
<Components>
<c:Sprite>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="0.0970000029" Y="0.0220000017" Z="0.00499999989"/>
@@ -8986,8 +8994,10 @@
<Entity name="BottomRight">
<Components>
<c:Sprite>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="0.0970000029" Y="-0.0219999999" Z="0.00499999989"/>
@@ -9008,16 +9018,59 @@
</c:Transform>
</Components>
<Children>
<Entity name="ButtonCorner_Origin">
<Components>
<c:Transform/>
</Components>
<Children>
<Entity name="BottomRight">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="0.0970000029" Y="-0.0219999999" Z="0.00499999989"/>
<Orientation X="0" Y="0" Z="4.71199989"/>
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="TopRight">
<Components>
<c:Sprite>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="0.0970000029" Y="0.0220000017" Z="0.00499999989"/>
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Button_2">
<Components>
<c:Button/>
<c:Sprite>
<DepthSort>false</DepthSort>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<GlowMap></GlowMap>
<DepthSort>false</DepthSort>
<Color A="0.392156869" B="0" G="0" R="0"/>
</c:Sprite>
<c:InputCmdButton>
<Command>Options</Command>
<PressValue>1</PressValue>
</c:InputCmdButton>
<c:Transform>
<Scale X="0.200000003" Y="0.0500000007" Z="1"/>
</c:Transform>
@@ -9027,7 +9080,7 @@
<Entity name="Text">
<Components>
<c:Text>
<Content>Option</Content>
<Content>Options</Content>
<Resource>Fonts/DroidSans.ttf,64</Resource>
<Alignment>
<Right/>
@@ -9040,40 +9093,6 @@
</Components>
<Children/>
</Entity>
<Entity name="ButtonCorner_Origin">
<Components>
<c:Transform/>
</Components>
<Children>
<Entity name="TopRight">
<Components>
<c:Sprite>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<GlowMap></GlowMap>
</c:Sprite>
<c:Transform>
<Position X="0.0970000029" Y="0.0220000017" Z="0.00499999989"/>
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
<Entity name="BottomRight">
<Components>
<c:Sprite>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<GlowMap></GlowMap>
</c:Sprite>
<c:Transform>
<Position X="0.0970000029" Y="-0.0219999999" Z="0.00499999989"/>
<Orientation X="0" Y="0" Z="4.71199989"/>
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
</c:Transform>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
<Entity name="ButtonPos_4">
@@ -9087,10 +9106,11 @@
<Components>
<c:Button/>
<c:Sprite>
<DepthSort>false</DepthSort>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
<BlurBackground>true</BlurBackground>
<GlowMap></GlowMap>
<DepthSort>false</DepthSort>
<Color A="0.392156869" B="0" G="0" R="0"/>
</c:Sprite>
<c:Transform>
@@ -9123,8 +9143,10 @@
<Entity name="TopRight">
<Components>
<c:Sprite>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="0.0970000029" Y="0.0220000017" Z="0.00499999989"/>
@@ -9136,8 +9158,10 @@
<Entity name="BottomRight">
<Components>
<c:Sprite>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Model>Models/Core/UnitQuad.mesh</Model>
<GlowMap></GlowMap>
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
<Linear>false</Linear>
</c:Sprite>
<c:Transform>
<Position X="0.0970000029" Y="-0.0219999999" Z="0.00499999989"/>
@@ -9169,6 +9193,15 @@
</Components>
<Children/>
</Entity>
<Entity name="OptionsSpawner">
<Components>
<c:Spawner>
<EntityFile>Schema/Entities/OptionMenu.xml</EntityFile>
</c:Spawner>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
@@ -13,6 +13,7 @@
<c:Model>
<Resource>models/core/unitcube.mesh</Resource>
<Color A="1" B="0.980392158" G="1" R="1"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform>
<Position X="-0.100000001" Y="0" Z="0"/>
@@ -28,6 +29,7 @@
<c:Model>
<Resource>models/core/unitcube.mesh</Resource>
<Color A="1" B="0" G="0" R="1"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform>
<Position X="-14.500001" Y="1.50000012" Z="16.9222012"/>
@@ -52,6 +54,7 @@
<c:Model>
<Resource>models/core/unitcube.mesh</Resource>
<Color A="1" B="1" G="0" R="0"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform>
<Position X="-14.500001" Y="1.50000012" Z="-17.6888409"/>
@@ -67,6 +70,7 @@
<c:Model>
<Resource>models/core/unitcube.mesh</Resource>
<Color A="1" B="0" G="0" R="1"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform>
<Position X="12.1000004" Y="1.50000012" Z="16.9222012"/>
@@ -82,6 +86,7 @@
<c:Model>
<Resource>models/core/unitcube.mesh</Resource>
<Color A="1" B="1" G="0" R="0"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform>
<Position X="12.1228638" Y="1.50000012" Z="-17.9642811"/>
@@ -198,6 +203,7 @@
<c:Model>
<Resource>models/core/unitcube.mesh</Resource>
<Color A="1" B="39.2156868" G="0" R="3.13725495"/>
<Shadow>false</Shadow>
</c:Model>
<c:Transform>
<Scale X="-70" Y="-70" Z="-70"/>
@@ -210,7 +216,7 @@
<c:Transform/>
</Components>
<Children>
<Entity name="-">
<Entity name="CapP">
<Components>
<c:AABB/>
<c:CapturePoint>
@@ -254,6 +260,13 @@
</Components>
<Children/>
</Entity>
<Entity>
<Components>
<c:PointLight/>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
<Entity name="Blue">
@@ -265,7 +278,25 @@
<Scale X="3.4000001" Y="4.70000029" Z="0.700000048"/>
</c:Transform>
</Components>
<Children/>
<Children>
<Entity>
<Components>
<c:Model>
<Resource></Resource>
</c:Model>
<c:Transform/>
</Components>
<Children>
<Entity>
<Components>
<c:PointLight/>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
<Entity name="Spectator">
<Components>
@@ -276,7 +307,43 @@
<Scale X="1" Y="5.70000029" Z="1"/>
</c:Transform>
</Components>
<Children/>
<Children>
<Entity>
<Components>
<c:PointLight/>
<c:Transform/>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource></Resource>
</c:Model>
<c:Transform/>
</Components>
<Children>
<Entity>
<Components>
<c:PointLight/>
<c:Transform/>
</Components>
<Children>
<Entity>
<Components>
<c:Model>
<Resource></Resource>
</c:Model>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
@@ -287,11 +354,11 @@
<c:Transform/>
</Components>
<Children>
<Entity name="-">
<Entity name="CapP">
<Components>
<c:AABB/>
<c:CapturePoint>
<CaptureTimer>-15</CaptureTimer>
<CaptureTimer>12</CaptureTimer>
<HomePointForTeam>
<Blue/>
</HomePointForTeam>
@@ -317,7 +384,38 @@
<Scale X="4.4000001" Y="2" Z="3.70000029"/>
</c:Transform>
</Components>
<Children/>
<Children>
<Entity>
<Components>
<c:Model>
<Resource></Resource>
</c:Model>
<c:Transform/>
</Components>
<Children>
<Entity>
<Components>
<c:Transform/>
</Components>
<Children>
<Entity>
<Components>
<c:Transform/>
</Components>
<Children>
<Entity>
<Components>
<c:Transform/>
</Components>
<Children/>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
</Children>
</Entity>
<Entity name="Blue">
<Components>
+2
View File
@@ -71,6 +71,8 @@
<xs:element ref="c:NetworkComponent" minOccurs="0"/>
<xs:element ref="c:ServerIdentity" minOccurs="0"/>
<xs:element ref="c:ServerList" minOccurs="0"/>
<xs:element ref="c:ConfigBtnResolution" minOccurs="0"/>
<xs:element ref="c:ConfigBtnFloat" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
+94 -122
View File
@@ -15,6 +15,11 @@ uniform float RandomnessScalar;
uniform vec2 Velocity;
uniform bool ColorByDistance;
uniform bool ExponentialAccelaration;
uniform bool Reverse;
uniform float ColorDistanceScalar;
//uniform bool Gravity;
//uniform bool Rotation;
//uniform bool MaxRadius;
in VertexData{
vec3 Position;
@@ -41,169 +46,136 @@ out VertexData{
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
float EqualTo(float x, float y) {
return 1.0 - abs(sign(x - y));
}
float NotEqualTo(float x, float y) {
return abs(sign(x - y));
}
float GreaterThan(float x, float y) {
return max(sign(x - y), 0.0);
}
float LessThan(float x, float y) {
return max(sign(y - x), 0.0);
}
float GreaterEqualTo(float x, float y) {
return 1.0 - LessThan(x, y);
}
float LessEqualTo(float x, float y) {
return 1.0 - GreaterThan(x, y);
}
// returns a "random" number based on input parameter
float GetRandomNumber(int polygon_index)
{
int randomIndex = int(mod(polygon_index, 50));
return RandomNumbers[randomIndex];
return RandomNumbers[int(mod(polygon_index, 50))];
}
float randomNumber = 0.0;
float randomDistance = 0.0;
void main()
vec3 CalcCenterOfTriangle(vec3 vertex0, vec3 vertex1, vec3 vertex2)
{
// calculate middle of vectors
vec3 v1 = Input[1].Position - Input[0].Position;
vec3 v2 = Input[2].Position - Input[0].Position;
vec3 v3 = Input[2].Position - (v1 / 2);
vec3 v4 = Input[1].Position - (v2 / 2);
vec3 dir1 = normalize(vertex1 - vertex0);
vec3 dir2 = normalize(vertex2 - vertex0);
// calculate intersection
// normalize direction
vec3 dir1 = normalize(v1);
vec3 dir2 = normalize(v2);
vec3 vecA = Input[2].Position - Input[1].Position; //o2 - o1
vec3 vecA = vertex2 - vertex1; //o2 - o1
vec3 vecB = cross(dir1, dir2);
mat3 matrisA = mat3(vecA, dir2, vecB);
float lengthA = length(vecB);
lengthA = lengthA * lengthA;
float s = determinant(matrisA) / lengthA;
// center position of triangle
vec3 centerOfTriangle = Input[1].Position + (s * dir1);
return vertex1 + (s * dir1);
}
void PassThingsThrough(int index)
{
// pass through vertex data
Output.Normal = Input[index].Normal;
Output.Position = Input[index].Position;
Output.TextureCoordinate = Input[index].TextureCoordinate;
Output.Tangent = Input[index].Tangent;
Output.BiTangent = Input[index].BiTangent;
Output.ExplosionColor = EndColor;
}
void main()
{
vec3 centerOfTriangle = CalcCenterOfTriangle(Input[0].Position, Input[1].Position, Input[2].Position);
// center position of triangle to origin vector
vec3 origin2TriangleCenterVector = centerOfTriangle - ExplosionOrigin;
vec3 normalizedOrigin2TriangleCenterVector = normalize(origin2TriangleCenterVector);
// distance between origin and the center of the current triangle
float origin2TriangleCenterDistance = length(origin2TriangleCenterVector);
// time percentage until end of explosion (0.0-1.0)
float timePercetage = TimeSinceDeath / ExplosionDuration;
// get a random number if randomness is enabled, otherwise the random number will be zero and won't affect the other algorithms
if (Randomness == true)
{
randomDistance = GetRandomNumber(gl_PrimitiveIDIn) * RandomnessScalar;
}
// get a random number if randomness is enabled, otherwise the random distance will be zero and won't affect the other algorithms
float randomDistance = float(Randomness) * GetRandomNumber(gl_PrimitiveIDIn) * RandomnessScalar;
vec2 randomVelocity = Velocity * (randomDistance + 1.0);
// accelaration to use on current frame. is a interpolation between start and end value
float currentVelocity = mix(randomVelocity.x, randomVelocity.y, timePercetage);
if (ExponentialAccelaration == true)
{
currentVelocity = pow(currentVelocity, 2) / 2.0;
}
// if the accelaration should be exponential
currentVelocity = currentVelocity * max(currentVelocity * float(ExponentialAccelaration), 1.0);
// distance between origin and the center of the current triangle
float origin2TriangleCenterDistance = length(origin2TriangleCenterVector);
// the distance the blast has moved since the beginning, i.e. its radius
float blastWave = TimeSinceDeath * currentVelocity;
// the distance from origin to the triangle center with eventual randomness added
float fullDistanceWithRandomness = origin2TriangleCenterDistance + randomDistance;
// vector from the triangle center to the explosion's shockwave
vec3 triangleCenter2ExplosionRadius = (normalizedOrigin2TriangleCenterVector * (TimeSinceDeath * currentVelocity)) - (normalizedOrigin2TriangleCenterVector * fullDistanceWithRandomness);
float origin2TriangleCenterDistanceWithRandomness = origin2TriangleCenterDistance + randomDistance;
// if the triangle is inside the blast radius...
if (fullDistanceWithRandomness <= (TimeSinceDeath * currentVelocity))
vec3 triangleCenter2ExplosionRadius = (normalizedOrigin2TriangleCenterVector * blastWave) - (normalizedOrigin2TriangleCenterVector * origin2TriangleCenterDistanceWithRandomness);
// if the triangle is inside the blast's radius...
float isInsideBlastRadius = LessEqualTo(origin2TriangleCenterDistanceWithRandomness, blastWave);
// calculate the max distance (s) the triangle will move
float accelaration = (randomVelocity.y - randomVelocity.x) / ExplosionDuration;
float maxDistance = (randomVelocity.x * ExplosionDuration) + (0.5 * accelaration * ExplosionDuration * ExplosionDuration);
// if explosion color should be affected by distance instead of time...
if (ColorByDistance == true)
{
float maxRadius = max(TimeSinceDeath * currentVelocity, (ExplosionDuration * currentVelocity));
float a = (randomVelocity.y - randomVelocity.x) / ExplosionDuration;
//float t = sqrt((2 * origin2TriangleCenterDistance) / a);
// if explosion color should be affected by distance instead of time...
if (ColorByDistance == true)
{
// calculate the max distance (s) the triangle will move
float s = (randomVelocity.x * ExplosionDuration) + (0.5 * a * pow(ExplosionDuration, 2));
float te = (length(triangleCenter2ExplosionRadius) / s);
Output.ExplosionColor = EndColor;
Output.ExplosionPercentageElapsed = te;
}
else
{
Output.ExplosionColor = EndColor;
Output.ExplosionPercentageElapsed = timePercetage;
}
// for every vertex on the triangle...
for (int i = 0; i < gl_in.length(); i++)
{
// move the triangle to the blast radius
vec3 ExplodedPosition = Input[i].Position + triangleCenter2ExplosionRadius;
// pass through vertex data
Output.Normal = Input[i].Normal;
Output.Position = Input[i].Position;
Output.TextureCoordinate = Input[i].TextureCoordinate;
Output.Tangent = Input[i].Tangent;
Output.BiTangent = Input[i].BiTangent;
for (int j = 0; j < MAX_SPLITS; j++)
{
Output.PositionLightSpace[j] = Input[i].PositionLightSpace[j];
}
// convert to model space for the gravity to always be in -y
vec4 ExplodedPositionInModelSpace = M * vec4(ExplodedPosition, 1.0);
// if there is gravity, apply it
//if (Gravity == true)
//{
// // ---DO THIS----> //ExplodedPositionInModelSpace.y = ExplodedPositionInModelSpace.y - TimeSinceHit;
//
// ExplodedPositionInModelSpace.y = ExplodedPositionInModelSpace.y - pow(TimeSinceDeath, 2);
//}
// convert to screen space
gl_Position = P*V * ExplodedPositionInModelSpace;
EmitVertex();
}
Output.ExplosionPercentageElapsed = (length(triangleCenter2ExplosionRadius) / maxDistance) * isInsideBlastRadius * ColorDistanceScalar;
}
else
{
// if explosion color should be affected by distance instead of time...
if (ColorByDistance == true)
{
Output.ExplosionColor = EndColor;
Output.ExplosionPercentageElapsed = 0.0;
}
else
{
Output.ExplosionColor = EndColor;
Output.ExplosionPercentageElapsed = timePercetage;
Output.ExplosionPercentageElapsed = timePercetage;
}
vec3 ExplodedPosition;
for (int i = 0; i < gl_in.length(); i++)
{
// move the triangle to the blast radius
ExplodedPosition = Input[i].Position + (triangleCenter2ExplosionRadius * isInsideBlastRadius);
}
// for every vertex on the triangle...
for(int i = 0; i < gl_in.length(); i++)
{
// pass through vertex data
Output.Normal = Input[i].Normal;
Output.Position = Input[i].Position;
Output.TextureCoordinate = Input[i].TextureCoordinate;
Output.Tangent = Input[i].Tangent;
Output.BiTangent = Input[i].BiTangent;
// pass through vertex data
PassThingsThrough(i);
for (int j = 0; j < MAX_SPLITS; j++)
{
Output.PositionLightSpace[j] = Input[i].PositionLightSpace[j];
}
// no change in position, pass through vertex
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
for (int j = 0; j < MAX_SPLITS; j++)
{
Output.PositionLightSpace[j] = Input[i].PositionLightSpace[j];
}
// convert to window space
gl_Position = P * V * M * vec4(ExplodedPosition, 1.0);
EmitVertex();
}
//EndPrimitive();
}
}
+3 -2
View File
@@ -29,9 +29,10 @@ void main()
vec4 color_result = Color * diffuseTexel;
float pos = ((P * vec4(Input.Position, 1)).y + 1.0)/2.0;
float fillResult = floor(pos*FillPercentage);
color_result = FillColor*diffuseTexel.a*fillResult + color_result*(1-fillResult);
if(pos <= FillPercentage) {
color_result = FillColor*diffuseTexel.a;
}
sceneColor = vec4(color_result.xyz, clamp(color_result.a, 0, 1));
+71 -35
View File
@@ -146,14 +146,14 @@ bool RayVsTriangle(const Ray& ray,
}
bool RayVsModel(const Ray& ray,
const RawModel::Vertex* modelVertices,
const std::vector<glm::vec3>& modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix)
{
for (int i = 0; i < modelIndices.size();) {
glm::vec3 v0 = Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
glm::vec3 v1 = Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
glm::vec3 v2 = Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
glm::vec3 v0 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
glm::vec3 v1 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
glm::vec3 v2 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
if (RayVsTriangle(ray, v0, v1, v2)) {
return true;
}
@@ -194,7 +194,7 @@ bool RayVsTriangle(const Ray& ray,
}
bool RayVsModel(const Ray& ray,
const RawModel::Vertex* modelVertices,
const std::vector<glm::vec3>& modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix,
float& outDistance,
@@ -204,9 +204,9 @@ bool RayVsModel(const Ray& ray,
outDistance = INFINITY;
bool hit = false;
for (int i = 0; i < modelIndices.size();) {
glm::vec3 v0 = Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
glm::vec3 v1 = Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
glm::vec3 v2 = Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
glm::vec3 v0 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
glm::vec3 v1 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
glm::vec3 v2 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
float dist = outDistance;
float u;
float v;
@@ -221,7 +221,7 @@ bool RayVsModel(const Ray& ray,
}
bool RayVsModel(const Ray& ray,
const RawModel::Vertex* modelVertices,
const std::vector<glm::vec3>& modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix,
glm::vec3& outHitPosition)
@@ -360,7 +360,14 @@ constexpr bool FaceIsGround(float faceNormalY)
//An array containing 3 int pairs { 0, 2 }, { 0, 1 }, { 1, 2 }
constexpr std::array<std::pair<int, int>, 3> dimensionPairs({ std::pair<int, int>(0, 2), std::pair<int, int>(0, 1), std::pair<int, int>(1, 2) });
bool AABBvsTriangle(const AABB& box,
enum class BoxTriRes
{
Front,
Behind,
Intersect
};
BoxTriRes AABBvsTriangle(const AABB& box,
const std::array<glm::vec3, 3>& triPos,
const glm::vec3& originalBoxVelocity,
float verticalStepHeight,
@@ -374,7 +381,7 @@ bool AABBvsTriangle(const AABB& box,
//Less checks, and we should be able to walk out from models if we are trapped inside.
glm::vec3 triNormal = glm::cross(triPos[1] - triPos[0], triPos[2] - triPos[0]);
if (!vectorHasLength(triNormal) || (glm::dot(triNormal, originalBoxVelocity) > 0)) {
return false;
return BoxTriRes::Behind;
}
triNormal = glm::normalize(triNormal);
@@ -409,6 +416,9 @@ bool AABBvsTriangle(const AABB& box,
const glm::vec3& min = box.MinCorner();
const glm::vec3& max = box.MaxCorner();
// If there is no intersection, whether the box center is in front of or behind the triangle.
BoxTriRes noIntersection = glm::dot(triNormal, origin - triPos[0]) > 0 ? BoxTriRes::Front : BoxTriRes::Behind;
//For each projection in xy-, xz-, and yx-planes.
for (std::pair<int, int> dim : dimensionPairs) {
//2D Triangle.
@@ -426,7 +436,7 @@ bool AABBvsTriangle(const AABB& box,
bool pushedFromTriangleLine;
//if projections don't overlap, return false.
if (!rectangleVsTriangle(boxMin, boxMax, t2D, resolutionVector, resolutionDist, pushedFromTriangleLine)) {
return false;
return noIntersection;
} else if (resolveCollision) {
//Overwrite the smallest resolution if this is smaller.
if (resolutionDist < resolveShortest.DistanceSq) {
@@ -462,14 +472,15 @@ bool AABBvsTriangle(const AABB& box,
float t = glm::dot(triNormal, triPos[0] - origin) / glm::dot(triNormal, diagonal);
//If intersection point between plane and diagonal is within the box.
if (glm::abs(t) > 1) {
return false;
return noIntersection;
}
if (!resolveCollision) {
return true;
return BoxTriRes::Intersect;
}
glm::vec3 cornerResolution = (1+t) * diagonal;
cornerResolution = glm::dot(cornerResolution, triNormal) * triNormal;
//Overwrite the smallest resolution if cornerResolution is smaller.
float lenSq = glm::length2(cornerResolution);
if (lenSq < resolveShortest.DistanceSq) {
@@ -498,7 +509,7 @@ bool AABBvsTriangle(const AABB& box,
case ResolveDimZ:
//If we get here, the resolution is along one coordinate axis.
//set velocity to 0 in y if it is along y-axis.
return true;
return BoxTriRes::Intersect;
case Line:
projNorm = glm::normalize(outResolution);
break;
@@ -533,11 +544,11 @@ bool AABBvsTriangle(const AABB& box,
boxVelocity = boxVelocity - glm::dot(boxVelocity, projNorm) * projNorm;
}
}
return true;
return BoxTriRes::Intersect;
}
bool AABBvsTriangles(const AABB& box,
const RawModel::Vertex* modelVertices,
Output AABBvsTriangles(const AABB& box,
const std::vector<glm::vec3>& modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix,
glm::vec3& boxVelocity,
@@ -546,38 +557,45 @@ bool AABBvsTriangles(const AABB& box,
glm::vec3& outResolutionVector,
bool resolveCollision)
{
bool hit = false;
bool intersect = false;
Output out = Output::OutContained;
bool everHitTheGround = false;
AABB newBox = box;
outResolutionVector = glm::vec3(0.f);
glm::vec3 originalBoxVelocity(boxVelocity);
for (int i = 0; i < modelIndices.size(); ) {
std::array<glm::vec3, 3> triVertices = {
Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix),
Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix),
Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix)
TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix),
TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix),
TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix)
};
glm::vec3 outVec;
bool collideWithGround = isOnGround;
if (AABBvsTriangle(newBox, triVertices, originalBoxVelocity, verticalStepHeight, collideWithGround, boxVelocity, outVec, resolveCollision)) {
hit = true;
switch (AABBvsTriangle(newBox, triVertices, originalBoxVelocity, verticalStepHeight, collideWithGround, boxVelocity, outVec, resolveCollision)) {
case Collision::BoxTriRes::Front:
out = Output::OutSeparated;
break;
case Collision::BoxTriRes::Intersect:
intersect = true;
outResolutionVector += outVec;
newBox = AABB::FromOriginSize(newBox.Origin() + outVec, newBox.Size());
if (collideWithGround) {
everHitTheGround = isOnGround = true;
}
break;
default:
break;
}
}
if (!everHitTheGround) {
isOnGround = false;
}
return hit;
return intersect ? Output::OutIntersecting : out;
}
bool AABBvsTriangles(const AABB& box,
const RawModel::Vertex* modelVertices,
const std::vector<glm::vec3>& modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix,
glm::vec3& boxVelocity,
@@ -593,11 +611,29 @@ bool AABBvsTriangles(const AABB& box,
verticalStepHeight,
isOnGround,
outResolutionVector,
true);
true) == Output::OutIntersecting;
}
bool AABBvsTriangles(const AABB& box,
const RawModel::Vertex* modelVertices,
const std::vector<glm::vec3>& modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix)
{
glm::vec3 vel, outres;
bool g;
return AABBvsTriangles(box,
modelVertices,
modelIndices,
modelMatrix,
vel,
0.f,
g,
outres,
false) == Output::OutIntersecting;
}
Output AABBvsTrianglesWContainment(const AABB& box,
const std::vector<glm::vec3>& modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix)
{
@@ -619,9 +655,9 @@ boost::optional<EntityAABB> EntityAbsoluteAABB(EntityWrapper& entity, bool takeM
AABB modelSpaceBox;
if (entity.HasComponent("AABB") && !takeModelBox) {
ComponentWrapper& cAABB = entity["AABB"];
modelSpaceBox = EntityAABB::FromOriginSize((glm::vec3)cAABB["Origin"], (glm::vec3)cAABB["Size"]);
modelSpaceBox = EntityAABB::FromOriginSize((const glm::vec3&)cAABB["Origin"], (const glm::vec3&)cAABB["Size"]);
} else if (entity.HasComponent("Model")) {
std::string res = entity["Model"]["Resource"];
const std::string& res = entity["Model"]["Resource"];
if (res.empty()) {
return boost::none;
}
@@ -638,7 +674,7 @@ boost::optional<EntityAABB> EntityAbsoluteAABB(EntityWrapper& entity, bool takeM
return boost::none;
}
glm::mat4 modelMat = Transform::AbsoluteTransformation(entity);
glm::mat4 modelMat = TransformSystem::ModelMatrix(entity);
glm::vec3 mini(INFINITY);
glm::vec3 maxi(-INFINITY);
glm::vec3 maxCorner = modelSpaceBox.MaxCorner();
@@ -649,7 +685,7 @@ boost::optional<EntityAABB> EntityAbsoluteAABB(EntityWrapper& entity, bool takeM
corner.x = bits.test(0) ? maxCorner.x : minCorner.x;
corner.y = bits.test(1) ? maxCorner.y : minCorner.y;
corner.z = bits.test(2) ? maxCorner.z : minCorner.z;
corner = Transform::TransformPoint(corner, modelMat);
corner = TransformSystem::TransformPoint(corner, modelMat);
mini = glm::min(mini, corner);
maxi = glm::max(maxi, corner);
}
@@ -667,7 +703,7 @@ boost::optional<EntityAABB> AbsoluteAABBExplosionEffect(EntityWrapper& entity)
if (!modelBox) {
return boost::none;
}
bool isRandom = (bool)entity["ExplosionEffect"]["Randomness"];
Field<bool> isRandom = entity["ExplosionEffect"]["Randomness"];
float random = isRandom ? (float)(double)entity["ExplosionEffect"]["RandomnessScalar"] : 0;
glm::vec3 origin = (glm::vec3)entity["ExplosionEffect"]["ExplosionOrigin"];
glm::vec3 randomVel = (glm::vec3)entity["ExplosionEffect"]["Velocity"];
@@ -705,7 +741,7 @@ boost::optional<EntityAABB> EntityFirstHitByRay(const Ray& ray, std::vector<Enti
continue;
}
float u, v;
if (RayVsModel(ray, model->Vertices(), model->m_RawModel->m_Indices, Transform::ModelMatrix(entityBox.Entity), outDistance, u, v)) {
if (RayVsModel(ray, model->m_Vertices, model->m_Indices, TransformSystem::ModelMatrix(entityBox.Entity), outDistance, u, v)) {
outIntersectPos = ray.Origin() + outDistance * ray.Direction();
return entityBox;
}
+22 -15
View File
@@ -37,15 +37,19 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
bool hit;
float dist;
if (boxB.Entity.HasComponent("Model")) {
RawModel* model;
if (!((bool)boxB.Entity["Model"]["Visible"])) {
// Don't collide against invisible models.
continue;
}
Model* model;
std::string res = (std::string)boxB.Entity["Model"]["Resource"];
try {
model = ResourceManager::Load<RawModel, true>(res);
model = ResourceManager::Load<Model, true>(res);
} catch (const std::exception&) {
continue;
}
float u, v;
hit = Collision::RayVsModel(ray, model->Vertices(), model->m_Indices, Transform::ModelMatrix(boxB.Entity), dist, u, v);
hit = Collision::RayVsModel(ray, model->m_Vertices, model->m_Indices, TransformSystem::ModelMatrix(boxB.Entity), dist, u, v);
} else {
hit = Collision::RayVsAABB(ray, boxB, dist);
}
@@ -54,12 +58,12 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
//TODO: Perhaps this should be done slightly more properly.
glm::vec3 newOriginPos = ray.Origin() + (dist - 0.707107f*diameter) * ray.Direction();
glm::vec3 resolve = newOriginPos - boxA.Origin();
(glm::vec3&)cTransform["Position"] += resolve;
(Field<glm::vec3>)cTransform["Position"] += resolve;
boxA = *Collision::EntityAbsoluteAABB(entity);
if (resolve.y > 0) {
everHitTheGround = true;
(bool)cPhysics["IsOnGround"] = true;
((glm::vec3&)cPhysics["Velocity"]).y = 0.f;
cPhysics["IsOnGround"] = true;
((Field<glm::vec3>)cPhysics["Velocity"]).y(0.f);
}
break;
}
@@ -77,23 +81,26 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
}
if (boxB.Entity.HasComponent("Model") && Collision::AABBVsAABB(boxA, boxB)) {
//Here we know boxB is a entity with Collideable, AABB, and Model.
RawModel* model;
// Here we know boxB is a entity with Collideable, AABB, and Model.
if (!((const bool&)boxB.Entity["Model"]["Visible"])) {
// Don't collide against invisible models.
continue;
}
Model* model;
try {
model = ResourceManager::Load<RawModel, true>(boxB.Entity["Model"]["Resource"]);
model = ResourceManager::Load<Model, true>(boxB.Entity["Model"]["Resource"]);
} catch (const std::exception&) {
continue;
}
glm::mat4 modelMatrix = Transform::ModelMatrix(boxB.Entity);
glm::mat4 modelMatrix = TransformSystem::ModelMatrix(boxB.Entity);
glm::vec3 inOutVelocity = (glm::vec3)cPhysics["Velocity"];
bool notMovingxz = glm::all(glm::lessThan(glm::abs(glm::vec2(inOutVelocity.x, inOutVelocity.z)), glm::vec2(0.01f))) && prevPosIt != m_PrevPositions.end();
bool isOnGround = (bool)cPhysics["IsOnGround"];
float verticalStepHeight = (float)(double)cPhysics["VerticalStepHeight"];
if (Collision::AABBvsTriangles(boxA, model->Vertices(), model->m_Indices, modelMatrix, inOutVelocity, verticalStepHeight, isOnGround, resolutionVector)) {
if (Collision::AABBvsTriangles(boxA, model->m_Vertices, model->m_Indices, modelMatrix, inOutVelocity, verticalStepHeight, isOnGround, resolutionVector)) {
//Move the position to previous position if it is not moving in the xz-plane, else resolve with the resolution vector.
(glm::vec3&)cTransform["Position"] += notMovingxz ? prevPosIt->second - boxA.Origin() : resolutionVector;
(Field<glm::vec3>)cTransform["Position"] += resolutionVector;
boxA = *Collision::EntityAbsoluteAABB(entity);
cPhysics["Velocity"] = inOutVelocity;
if (isOnGround) {
@@ -103,12 +110,12 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
}
} else if (Collision::AABBVsAABB(boxA, boxB, resolutionVector)) {
//Enter here if boxB has no Model.
(glm::vec3&)cTransform["Position"] += resolutionVector;
(Field<glm::vec3>)cTransform["Position"] += resolutionVector;
boxA = *Collision::EntityAbsoluteAABB(entity);
if (resolutionVector.y > 0) {
everHitTheGround = true;
(bool)cPhysics["IsOnGround"] = true;
((glm::vec3&)cPhysics["Velocity"]).y = 0.f;
((Field<glm::vec3>)cPhysics["Velocity"]).y(0.f);
}
}
}
+31 -10
View File
@@ -10,6 +10,16 @@ void TriggerSystem::UpdateComponent(EntityWrapper& triggerEntity, ComponentWrapp
return;
}
Model* triggerModel = nullptr;
glm::mat4 triggerModelMat;
if (triggerEntity.HasComponent("Model")) {
try {
triggerModel = ResourceManager::Load<Model, true>(triggerEntity["Model"]["Resource"]);
triggerModelMat = TransformSystem::ModelMatrix(triggerEntity);
} catch (const std::exception&) {
}
}
m_OctreeOut.clear();
m_Octree->ObjectsInSameRegion(*triggerBox, m_OctreeOut);
@@ -22,7 +32,17 @@ void TriggerSystem::UpdateComponent(EntityWrapper& triggerEntity, ComponentWrapp
if (colliderFitsInTrigger) {
completelyInsideBox = AABB::FromOriginSize((*triggerBox).Origin(), (*triggerBox).Size() - 2.0f * colliderBox.Size());
}
if (colliderFitsInTrigger && Collision::AABBVsAABB(completelyInsideBox, colliderBox)) {
// We know the entity is inside the trigger box, but perhaps not the model yet.
Collision::Output out = triggerModel == nullptr
? Collision::Output::OutContained
: Collision::AABBvsTrianglesWContainment(
colliderBox,
triggerModel->m_Vertices,
triggerModel->m_Indices,
triggerModelMat);
if (colliderFitsInTrigger && Collision::AABBVsAABB(completelyInsideBox, colliderBox) && out == Collision::Output::OutContained) {
// Entity is completely inside the trigger.
// If it was only touching before, it is erased.
m_EntitiesTouchingTrigger[triggerEntity].erase(colliderEntity);
@@ -32,7 +52,8 @@ void TriggerSystem::UpdateComponent(EntityWrapper& triggerEntity, ComponentWrapp
completeSet.insert(colliderEntity);
publish<Events::TriggerEnter>(colliderEntity, triggerEntity);
}
} else {
continue;
} else if (out != Collision::Output::OutSeparated) {
// Entity is only touching the trigger.
auto& touchSet = m_EntitiesTouchingTrigger[triggerEntity];
auto& completeSet = m_EntitiesCompletelyInTrigger[triggerEntity];
@@ -47,17 +68,17 @@ void TriggerSystem::UpdateComponent(EntityWrapper& triggerEntity, ComponentWrapp
touchSet.insert(colliderEntity);
}
// Else, it was touching the trigger last frame too and nothing is done.
}
} else {
// Entity is not touching the trigger,
// Throw event if it was previously.
if (throwLeaveIfWasInTrigger(m_EntitiesTouchingTrigger[triggerEntity], colliderEntity, triggerEntity)) {
continue;
}
// This only occurs if the entity was completely inside the trigger one frame,
// then completely outside the trigger, e.g. when dying and respawning.
throwLeaveIfWasInTrigger(m_EntitiesCompletelyInTrigger[triggerEntity], colliderEntity, triggerEntity);
}
// Only get here if entity is not touching the trigger,
// throw event if it was touching previously.
if (throwLeaveIfWasInTrigger(m_EntitiesTouchingTrigger[triggerEntity], colliderEntity, triggerEntity)) {
continue;
}
// This only occurs if the entity was completely inside the trigger one frame,
// then completely outside the trigger, e.g. when dying and respawning.
throwLeaveIfWasInTrigger(m_EntitiesCompletelyInTrigger[triggerEntity], colliderEntity, triggerEntity);
}
}
+19 -8
View File
@@ -1,9 +1,17 @@
#include "Core/ComponentPool.h"
ComponentPoolForwardIterator::ComponentPoolForwardIterator(ComponentPool* pool, const MemoryPool<char>::iterator begin, const MemoryPool<char>::iterator end)
: m_ComponentPool(pool)
, m_ComponentInfo(pool->m_ComponentInfo)
, m_MemoryPoolIterator(begin)
, m_MemoryPoolEnd(end)
{ }
ComponentWrapper ComponentPoolForwardIterator::operator*() const
{
char* data = &(*m_MemoryPoolIterator);
ComponentWrapper wrapper(m_ComponentInfo, data);
EntityID entity = *reinterpret_cast<EntityID*>(data);
ComponentWrapper wrapper(m_ComponentInfo, data, &m_ComponentPool->m_DirtySet[entity], m_ComponentPool->m_World);
return wrapper;
}
@@ -44,7 +52,7 @@ ComponentPool::ComponentPool(const ComponentPool& other)
// Duplicate strings
for (auto& name : m_ComponentInfo.StringFields) {
for (auto& c : *this) {
std::string& val = c[name];
Field<std::string> val = c[name];
ComponentWrapper::SolidifyStrings(c);
}
}
@@ -71,7 +79,7 @@ ComponentWrapper ComponentPool::Allocate(EntityID entity)
memcpy(data, &entity, sizeof(EntityID));
m_EntityToComponent[entity] = data;
ComponentWrapper component(m_ComponentInfo, data);
ComponentWrapper component(m_ComponentInfo, data, &m_DirtySet[entity], m_World);
// Copy defaults
memcpy(component.Data, m_ComponentInfo.Defaults.get(), m_ComponentInfo.Stride);
@@ -82,7 +90,9 @@ ComponentWrapper ComponentPool::Allocate(EntityID entity)
ComponentWrapper ComponentPool::GetByEntity(EntityID ent)
{
return ComponentWrapper(m_ComponentInfo, m_EntityToComponent.at(ent));
auto data = m_EntityToComponent.at(ent);
auto bitField = &m_DirtySet[ent];
return ComponentWrapper(m_ComponentInfo, data, bitField, m_World);
}
bool ComponentPool::KnowsEntity(EntityID ent)
@@ -95,16 +105,17 @@ void ComponentPool::Delete(ComponentWrapper& wrapper)
ComponentWrapper::Destroy(wrapper.Info, wrapper.Data);
m_EntityToComponent.erase(wrapper.EntityID);
m_Pool.Free(wrapper.Data - sizeof(EntityID));
m_DirtySet.erase(wrapper.EntityID);
}
ComponentPool::iterator ComponentPool::begin() const
ComponentPool::iterator ComponentPool::begin()
{
return iterator(m_ComponentInfo, m_Pool.begin(), m_Pool.end());
return iterator(this, m_Pool.begin(), m_Pool.end());
}
ComponentPool::iterator ComponentPool::end() const
ComponentPool::iterator ComponentPool::end()
{
return iterator(m_ComponentInfo, m_Pool.end(), m_Pool.end());
return iterator(this, m_Pool.end(), m_Pool.end());
}
size_t ComponentPool::size() const
+59
View File
@@ -0,0 +1,59 @@
#include "Core/World.h"
#include "Core/ComponentWrapper.h"
ComponentWrapper::ComponentWrapper(const ComponentInfo& componentInfo, char* data, ::DirtyBitField* dirtyBitField, World* world)
: Info(componentInfo)
, EntityID(*reinterpret_cast<::EntityID*>(data))
, Data(data + componentInfo.GetHeaderSize())
, DirtyBitField(dirtyBitField)
, m_World(world)
{}
ComponentInfo::EnumType ComponentWrapper::Enum(const char* fieldName, const char* enumKey)
{
return Info.Meta->FieldEnumDefinitions.at(fieldName).at(enumKey);
}
bool ComponentWrapper::Dirty(DirtySetType type, const std::string& fieldName)
{
if (DirtyBitField == nullptr) {
return true;
} else {
auto& field = Info.Fields.at(fieldName);
return DirtyBitField->operator[](type).count(field.Index) == 1;
}
}
void ComponentWrapper::SetDirty(DirtySetType type, const std::string& fieldName, bool dirty /* = true */)
{
if (DirtyBitField == nullptr) {
return;
}
auto& field = Info.Fields.at(fieldName);
if (dirty) {
DirtyBitField->operator[](type).insert(field.Index);
// Because parents affects children when altered, we also need to flag all children as dirty.
if (type == DirtySetType::Transform && m_World != nullptr) {
auto children = m_World->GetDirectChildren(EntityID);
for (auto kv = children.first; kv != children.second; ++kv) {
const auto& child = kv->second;
if (m_World->HasComponent(child, Info.Name)) {
m_World->GetComponent(child, Info.Name).SetDirty(DirtySetType::Transform, fieldName, true);
if (fieldName == "Orientation" || fieldName == "Scale") {
m_World->GetComponent(child, Info.Name).SetDirty(DirtySetType::Transform, "Position", true);
}
}
}
}
} else {
DirtyBitField->operator[](type).erase(field.Index);
}
}
void ComponentWrapper::SetAllDirty(const std::string& fieldName, bool dirty /* = true */)
{
for (auto& kv : *DirtyBitField) {
SetDirty(kv.first, fieldName);
}
}
+56 -26
View File
@@ -94,8 +94,30 @@ EntityWrapper EntityWrapper::Clone(EntityWrapper parent /*= Invalid*/)
return EntityWrapper::Invalid;
}
EntityWrapper clone = cloneRecursive(*this, EntityWrapper::Invalid);
this->World->SetParent(clone.ID, parent.ID);
// Create a relationship map of children of this entity
std::unordered_multimap<EntityWrapper, EntityWrapper> relationships;
fillRelationships(relationships, *this);
::World* targetWorld = this->World;
if (parent.Valid()) {
targetWorld = parent.World;
}
// Create root entity
EntityWrapper clone(targetWorld, targetWorld->CreateEntity(parent.ID));
// Copy name
clone.World->SetName(clone.ID, this->Name());
// Clone components
for (auto& kv : this->World->GetComponentPools()) {
if (kv.second->KnowsEntity(this->ID)) {
ComponentWrapper c1 = kv.second->GetByEntity(this->ID);
ComponentWrapper c2 = clone.World->AttachComponent(clone.ID, kv.first);
c1.Copy(c2);
}
}
// Recreate entity tree
recreateRelationships(relationships, *this, clone);
return clone;
}
@@ -207,30 +229,6 @@ EntityWrapper EntityWrapper::firstChildByNameRecursive(const std::string& name,
return EntityWrapper::Invalid;
}
EntityWrapper EntityWrapper::cloneRecursive(EntityWrapper entity, EntityWrapper parent)
{
EntityWrapper clone = EntityWrapper(entity.World, entity.World->CreateEntity(parent.ID));
entity.World->SetName(clone.ID, entity.Name());
// Clone components
for (auto& kv : entity.World->GetComponentPools()) {
if (kv.second->KnowsEntity(entity.ID)) {
ComponentWrapper c1 = kv.second->GetByEntity(entity.ID);
ComponentWrapper c2 = entity.World->AttachComponent(clone.ID, kv.first);
c1.Copy(c2);
}
}
// Clone children
auto children = entity.World->GetDirectChildren(entity.ID);
for (auto it = children.first; it != children.second; ++it) {
EntityWrapper child(entity.World, it->second);
cloneRecursive(child, clone);
}
return clone;
}
void EntityWrapper::childrenWithComponentRecursive(const std::string& componentType, EntityWrapper& entity, std::vector<EntityWrapper>& childrenWithComponent)
{
auto itPair = this->World->GetDirectChildren(entity.ID);
@@ -246,3 +244,35 @@ void EntityWrapper::childrenWithComponentRecursive(const std::string& componentT
childrenWithComponentRecursive(componentType, child, childrenWithComponent);
}
}
void EntityWrapper::fillRelationships(std::unordered_multimap<EntityWrapper, EntityWrapper>& relationMap, EntityWrapper entity)
{
auto children = entity.World->GetDirectChildren(entity.ID);
for (auto it = children.first; it != children.second; ++it) {
EntityWrapper child(entity.World, it->second);
relationMap.insert(std::make_pair(entity, child));
fillRelationships(relationMap, child);
}
}
void EntityWrapper::recreateRelationships(const std::unordered_multimap<EntityWrapper, EntityWrapper>& relationMap, EntityWrapper templateEntity, EntityWrapper parent /*= EntityWrapper::Invalid*/)
{
// Recursively create children
auto children = relationMap.equal_range(templateEntity);
for (auto it = children.first; it != children.second; ++it) {
EntityWrapper child = it->second;
// Create clone entity
EntityWrapper clone(parent.World, parent.World->CreateEntity(parent.ID));
// Copy name
clone.World->SetName(clone.ID, child.Name());
// Clone components
for (auto& kv : child.World->GetComponentPools()) {
if (kv.second->KnowsEntity(child.ID)) {
ComponentWrapper c1 = kv.second->GetByEntity(child.ID);
ComponentWrapper c2 = clone.World->AttachComponent(clone.ID, kv.first);
c1.Copy(c2);
}
}
recreateRelationships(relationMap, child, clone);
}
}
@@ -125,6 +125,7 @@ void EntityXMLFilePreprocessor::parseComponentInfo()
auto modelGroup = modelGroupParticle->getModelGroupTerm();
// <xs:element...
unsigned char fieldIndex = 0;
unsigned int fieldOffset = 0;
auto particles = modelGroup->getParticles();
for (unsigned int i = 0; i < particles->size(); ++i) {
@@ -182,12 +183,14 @@ void EntityXMLFilePreprocessor::parseComponentInfo()
auto& field = compInfo.Fields[name];
field.Name = name;
field.Type = effectiveType;
field.Index = fieldIndex;
field.Offset = fieldOffset;
field.Stride = stride;
compInfo.FieldsInOrder.push_back(name);
if (field.Type == "string") {
compInfo.StringFields.push_back(name);
}
fieldIndex += 1;
fieldOffset += stride;
}
+118 -59
View File
@@ -1,103 +1,162 @@
#include "Core/Transform.h"
#include "Core/TransformSystem.h"
glm::mat4 Transform::AbsoluteTransformation(EntityWrapper entity)
std::unordered_map<EntityWrapper, glm::vec3> TransformSystem::PositionCache;
std::unordered_map<EntityWrapper, glm::quat> TransformSystem::OrientationCache;
std::unordered_map<EntityWrapper, glm::vec3> TransformSystem::ScaleCache;
std::unordered_map<EntityWrapper, glm::mat4> TransformSystem::MatrixCache;
int TransformSystem::RecalculatedPositions = 0;
int TransformSystem::RecalculatedOrientations = 0;
int TransformSystem::RecalculatedScales = 0;
TransformSystem::TransformSystem(SystemParams params)
: System(params)
{
glm::mat4 t = glm::mat4(1.f);
EVENT_SUBSCRIBE_MEMBER(m_EEntityDeleted, &TransformSystem::OnEntityDeleted);
}
while (entity.Valid()) {
t = glm::translate((glm::vec3&)entity["Transform"]["Position"]) * glm::toMat4(glm::quat((glm::vec3&)entity["Transform"]["Orientation"])) * glm::scale((glm::vec3&)entity["Transform"]["Scale"]) * t;
entity = entity.Parent();
bool TransformSystem::OnEntityDeleted(const Events::EntityDeleted& e)
{
// Clean up deleted entity
PositionCache.erase(e.DeletedEntity);
OrientationCache.erase(e.DeletedEntity);
ScaleCache.erase(e.DeletedEntity);
MatrixCache.erase(e.DeletedEntity);
return true;
}
//glm::mat4 Transform::AbsoluteTransformation(EntityWrapper entity)
//{
// glm::mat4 t = glm::mat4(1.f);
//
// while (entity.Valid()) {
// t = glm::translate((const glm::vec3&)entity["Transform"]["Position"]) * glm::toMat4(glm::quat((const glm::vec3&)entity["Transform"]["Orientation"])) * glm::scale((const glm::vec3&)entity["Transform"]["Scale"]) * t;
// entity = entity.Parent();
// }
//
// return t;
//}
glm::vec3 TransformSystem::AbsolutePosition(World* world, EntityID entity)
{
return TransformSystem::AbsolutePosition(EntityWrapper(world, entity));
}
glm::vec3 TransformSystem::AbsolutePosition(EntityWrapper entity)
{
if (!entity.Valid()) {
return glm::vec3();
}
return t;
}
glm::vec3 Transform::AbsolutePosition(EntityWrapper entity)
{
return AbsolutePosition(entity.World, entity.ID);
}
glm::vec3 Transform::AbsolutePosition(World* world, EntityID entity)
{
glm::vec3 position;
while (entity != EntityID_Invalid) {
ComponentWrapper transform = world->GetComponent(entity, "Transform");
EntityID parent = world->GetParent(entity);
position += Transform::AbsoluteScale(world, parent) * (Transform::AbsoluteOrientation(world, parent) * (glm::vec3)transform["Position"]);
entity = parent;
auto cacheIt = PositionCache.find(entity);
ComponentWrapper cTransform = entity["Transform"];
ComponentWrapper::SubscriptProxy cTransformPosition = cTransform["Position"];
if (cacheIt != PositionCache.end() && !cTransformPosition.Dirty(DirtySetType::Transform)) {
return cacheIt->second;
} else {
EntityWrapper parent = entity.Parent();
// Calculate position
glm::vec3 position = AbsolutePosition(parent) + TransformSystem::AbsoluteOrientation(parent) * (TransformSystem::AbsoluteScale(parent) * (const glm::vec3&)cTransformPosition);
// Cache it
PositionCache[entity] = position;
RecalculatedPositions++;
// Unset dirty flag
cTransformPosition.SetDirty(DirtySetType::Transform, false);
return position;
}
return position;
}
glm::vec3 Transform::AbsoluteOrientationEuler(EntityWrapper entity)
glm::vec3 TransformSystem::AbsoluteOrientationEuler(EntityWrapper entity)
{
glm::vec3 orientation;
while (entity.Valid()) {
ComponentWrapper transform = entity["Transform"];
orientation += (glm::vec3)transform["Orientation"];
orientation += (Field<glm::vec3>)transform["Orientation"];
entity = entity.Parent();
}
return orientation;
}
glm::quat Transform::AbsoluteOrientation(EntityWrapper entity)
glm::quat TransformSystem::AbsoluteOrientation(World* world, EntityID entity)
{
return AbsoluteOrientation(entity.World, entity.ID);
return TransformSystem::AbsoluteOrientation(EntityWrapper(world, entity));
}
glm::quat Transform::AbsoluteOrientation(World* world, EntityID entity)
glm::quat TransformSystem::AbsoluteOrientation(EntityWrapper entity)
{
glm::quat orientation;
while (entity != EntityID_Invalid) {
ComponentWrapper transform = world->GetComponent(entity, "Transform");
orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation;
entity = world->GetParent(entity);
if (!entity.Valid()) {
return glm::quat();
}
return orientation;
auto cacheIt = OrientationCache.find(entity);
ComponentWrapper cTransform = entity["Transform"];
ComponentWrapper::SubscriptProxy cTransformOrientation = cTransform["Orientation"];
if (cacheIt != OrientationCache.end() && !cTransformOrientation.Dirty(DirtySetType::Transform)) {
return cacheIt->second;
} else {
EntityWrapper parent = entity.Parent();
// Calculate orientation
glm::quat orientation = AbsoluteOrientation(parent) * glm::quat((const glm::vec3&)cTransformOrientation);
// Cache it
OrientationCache[entity] = orientation;
RecalculatedOrientations++;
// Unset dirty flag
cTransformOrientation.SetDirty(DirtySetType::Transform, false);
return orientation;
}
}
glm::vec3 Transform::AbsoluteScale(EntityWrapper entity)
glm::vec3 TransformSystem::AbsoluteScale(World* world, EntityID entity)
{
return AbsoluteScale(entity.World, entity.ID);
return TransformSystem::AbsoluteScale(EntityWrapper(world, entity));
}
glm::vec3 Transform::AbsoluteScale(World* world, EntityID entity)
glm::vec3 TransformSystem::AbsoluteScale(EntityWrapper entity)
{
glm::vec3 scale(1.f);
while (entity != EntityID_Invalid) {
ComponentWrapper transform = world->GetComponent(entity, "Transform");
scale *= (glm::vec3)transform["Scale"];
entity = world->GetParent(entity);
if (!entity.Valid()) {
return glm::vec3(1.f);
}
return scale;
auto cacheIt = ScaleCache.find(entity);
ComponentWrapper cTransform = entity["Transform"];
ComponentWrapper::SubscriptProxy cTransformScale = cTransform["Scale"];
if (cacheIt != ScaleCache.end() && !cTransformScale.Dirty(DirtySetType::Transform)) {
return cacheIt->second;
} else {
EntityWrapper parent = entity.Parent();
// Calculate scale
glm::vec3 scale = AbsoluteScale(parent) * (const glm::vec3&)cTransformScale;
// Cache it
ScaleCache[entity] = scale;
RecalculatedPositions++;
// Unset dirty flag
cTransformScale.SetDirty(DirtySetType::Transform, false);
return scale;
}
}
glm::mat4 Transform::ModelMatrix(EntityWrapper entity)
glm::mat4 TransformSystem::ModelMatrix(EntityID entityID, World* world)
{
return ModelMatrix(entity.ID, entity.World);
return ModelMatrix(EntityWrapper(world, entityID));
}
glm::mat4 Transform::ModelMatrix(EntityID entity, World* world)
glm::mat4 TransformSystem::ModelMatrix(EntityWrapper entity)
{
return AbsoluteTransformation(EntityWrapper(world, entity));
//glm::vec3 position = Transform::AbsolutePosition(world, entity);
//glm::quat orientation = Transform::AbsoluteOrientation(world, entity);
//glm::vec3 scale = Transform::AbsoluteScale(world, entity);
//glm::mat4 modelMatrix = glm::translate(glm::mat4(), position) * glm::toMat4(orientation) * glm::scale(scale);
//return modelMatrix;
auto cacheIt = MatrixCache.find(entity);
ComponentWrapper cTransform = entity["Transform"];
bool isDirty = cTransform["Position"].Dirty(DirtySetType::Transform) || cTransform["Orientation"].Dirty(DirtySetType::Transform) || cTransform["Scale"].Dirty(DirtySetType::Transform);
if (cacheIt != MatrixCache.end() && !isDirty) {
return cacheIt->second;
} else {
glm::mat4 matrix = glm::translate(AbsolutePosition(entity)) * glm::toMat4(AbsoluteOrientation(entity)) * glm::scale(AbsoluteScale(entity));
MatrixCache[entity] = matrix;
return matrix;
}
}
glm::vec3 Transform::TransformPoint(const glm::vec3& point, const glm::mat4& matrix)
glm::vec3 TransformSystem::TransformPoint(const glm::vec3& point, const glm::mat4& matrix)
{
return glm::vec3(matrix * glm::vec4(point.x, point.y, point.z, 1));
}
+162
View File
@@ -0,0 +1,162 @@
#include "Core/TransformSystem.h"
std::unordered_map<EntityWrapper, glm::vec3> TransformSystem::PositionCache;
std::unordered_map<EntityWrapper, glm::quat> TransformSystem::OrientationCache;
std::unordered_map<EntityWrapper, glm::vec3> TransformSystem::ScaleCache;
std::unordered_map<EntityWrapper, glm::mat4> TransformSystem::MatrixCache;
int TransformSystem::RecalculatedPositions = 0;
int TransformSystem::RecalculatedOrientations = 0;
int TransformSystem::RecalculatedScales = 0;
TransformSystem::TransformSystem(SystemParams params)
: System(params)
{
EVENT_SUBSCRIBE_MEMBER(m_EEntityDeleted, &TransformSystem::OnEntityDeleted);
}
bool TransformSystem::OnEntityDeleted(const Events::EntityDeleted& e)
{
// Clean up deleted entity
PositionCache.erase(e.DeletedEntity);
OrientationCache.erase(e.DeletedEntity);
ScaleCache.erase(e.DeletedEntity);
MatrixCache.erase(e.DeletedEntity);
return true;
}
//glm::mat4 Transform::AbsoluteTransformation(EntityWrapper entity)
//{
// glm::mat4 t = glm::mat4(1.f);
//
// while (entity.Valid()) {
// t = glm::translate((const glm::vec3&)entity["Transform"]["Position"]) * glm::toMat4(glm::quat((const glm::vec3&)entity["Transform"]["Orientation"])) * glm::scale((const glm::vec3&)entity["Transform"]["Scale"]) * t;
// entity = entity.Parent();
// }
//
// return t;
//}
glm::vec3 TransformSystem::AbsolutePosition(World* world, EntityID entity)
{
return TransformSystem::AbsolutePosition(EntityWrapper(world, entity));
}
glm::vec3 TransformSystem::AbsolutePosition(EntityWrapper entity)
{
if (!entity.Valid()) {
return glm::vec3();
}
auto cacheIt = PositionCache.find(entity);
ComponentWrapper cTransform = entity["Transform"];
ComponentWrapper::SubscriptProxy cTransformPosition = cTransform["Position"];
if (cacheIt != PositionCache.end() && !cTransformPosition.Dirty(DirtySetType::Transform)) {
return cacheIt->second;
} else {
EntityWrapper parent = entity.Parent();
// Calculate position
glm::vec3 position = AbsolutePosition(parent) + TransformSystem::AbsoluteOrientation(parent) * (TransformSystem::AbsoluteScale(parent) * (const glm::vec3&)cTransformPosition);
// Cache it
PositionCache[entity] = position;
RecalculatedPositions++;
// Unset dirty flag
cTransformPosition.SetDirty(DirtySetType::Transform, false);
return position;
}
}
glm::vec3 TransformSystem::AbsoluteOrientationEuler(EntityWrapper entity)
{
glm::vec3 orientation;
while (entity.Valid()) {
ComponentWrapper transform = entity["Transform"];
orientation += (Field<glm::vec3>)transform["Orientation"];
entity = entity.Parent();
}
return orientation;
}
glm::quat TransformSystem::AbsoluteOrientation(World* world, EntityID entity)
{
return TransformSystem::AbsoluteOrientation(EntityWrapper(world, entity));
}
glm::quat TransformSystem::AbsoluteOrientation(EntityWrapper entity)
{
if (!entity.Valid()) {
return glm::quat();
}
auto cacheIt = OrientationCache.find(entity);
ComponentWrapper cTransform = entity["Transform"];
ComponentWrapper::SubscriptProxy cTransformOrientation = cTransform["Orientation"];
if (cacheIt != OrientationCache.end() && !cTransformOrientation.Dirty(DirtySetType::Transform)) {
return cacheIt->second;
} else {
EntityWrapper parent = entity.Parent();
// Calculate orientation
glm::quat orientation = AbsoluteOrientation(parent) * glm::quat((const glm::vec3&)cTransformOrientation);
// Cache it
OrientationCache[entity] = orientation;
RecalculatedOrientations++;
// Unset dirty flag
cTransformOrientation.SetDirty(DirtySetType::Transform, false);
return orientation;
}
}
glm::vec3 TransformSystem::AbsoluteScale(World* world, EntityID entity)
{
return TransformSystem::AbsoluteScale(EntityWrapper(world, entity));
}
glm::vec3 TransformSystem::AbsoluteScale(EntityWrapper entity)
{
if (!entity.Valid()) {
return glm::vec3(1.f);
}
auto cacheIt = ScaleCache.find(entity);
ComponentWrapper cTransform = entity["Transform"];
ComponentWrapper::SubscriptProxy cTransformScale = cTransform["Scale"];
if (cacheIt != ScaleCache.end() && !cTransformScale.Dirty(DirtySetType::Transform)) {
return cacheIt->second;
} else {
EntityWrapper parent = entity.Parent();
// Calculate scale
glm::vec3 scale = AbsoluteScale(parent) * (const glm::vec3&)cTransformScale;
// Cache it
ScaleCache[entity] = scale;
RecalculatedPositions++;
// Unset dirty flag
cTransformScale.SetDirty(DirtySetType::Transform, false);
return scale;
}
}
glm::mat4 TransformSystem::ModelMatrix(EntityID entityID, World* world)
{
return ModelMatrix(EntityWrapper(world, entityID));
}
glm::mat4 TransformSystem::ModelMatrix(EntityWrapper entity)
{
//auto cacheIt = MatrixCache.find(entity);
//ComponentWrapper cTransform = entity["Transform"];
//bool isDirty = cTransform["Position"].Dirty(DirtySetType::Transform) || cTransform["Orientation"].Dirty(DirtySetType::Transform) || cTransform["Scale"].Dirty(DirtySetType::Transform);
//if (cacheIt != MatrixCache.end() && !isDirty && false) {
// return cacheIt->second;
//} else {
glm::mat4 matrix = glm::translate(AbsolutePosition(entity)) * glm::toMat4(AbsoluteOrientation(entity)) * glm::scale(AbsoluteScale(entity));
// MatrixCache[entity] = matrix;
return matrix;
//}
}
glm::vec3 TransformSystem::TransformPoint(const glm::vec3& point, const glm::mat4& matrix)
{
return glm::vec3(matrix * glm::vec4(point.x, point.y, point.z, 1));
}
+2 -2
View File
@@ -13,8 +13,8 @@ void UniformScaleSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper
return;
}
float distance = glm::length((glm::vec3)entity["Transform"]["Position"] - (glm::vec3&)m_Camera["Transform"]["Position"]);
entity["Transform"]["Scale"] = (glm::vec3&)cUniformScale["Scale"] * distance;
float distance = glm::length((glm::vec3)entity["Transform"]["Position"] - (const glm::vec3&)m_Camera["Transform"]["Position"]);
entity["Transform"]["Scale"] = (const glm::vec3&)cUniformScale["Scale"] * distance;
}
bool UniformScaleSystem::OnSetCamera(const Events::SetCamera& e)

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