From a369c26a280d2226b82f4ae510701c823aec69e6 Mon Sep 17 00:00:00 2001 From: stiffly Date: Mon, 7 Mar 2016 14:19:22 +0100 Subject: [PATCH 01/65] Blend tree nodes can now exist without transform components, without the game crashing. --- include/Engine/Editor/EditorSystem.h | 1 + src/Engine/Editor/EditorSystem.cpp | 24 +++++++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/include/Engine/Editor/EditorSystem.h b/include/Engine/Editor/EditorSystem.h index 655ac9b9..a6d3e759 100644 --- a/include/Engine/Editor/EditorSystem.h +++ b/include/Engine/Editor/EditorSystem.h @@ -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); diff --git a/src/Engine/Editor/EditorSystem.cpp b/src/Engine/Editor/EditorSystem.cpp index f9cdde0b..f66cd01c 100644 --- a/src/Engine/Editor/EditorSystem.cpp +++ b/src/Engine/Editor/EditorSystem.cpp @@ -4,7 +4,7 @@ #include "Editor/EditorWidgetSystem.h" #include "Core/EntityFile.h" -EditorSystem::EditorSystem(SystemParams params, IRenderer* renderer, RenderFrame* renderFrame) +EditorSystem::EditorSystem(SystemParams params, IRenderer* renderer, RenderFrame* renderFrame) : System(params) , m_Renderer(renderer) , m_RenderFrame(renderFrame) @@ -14,7 +14,7 @@ EditorSystem::EditorSystem(SystemParams params, IRenderer* renderer, RenderFrame m_EditorWorldSystemPipeline->AddSystem(0); m_EditorWorldSystemPipeline->AddSystem(0, m_Renderer); m_EditorWorldSystemPipeline->AddSystem(1, m_Renderer, m_RenderFrame); - + m_EditorCamera = importEntity(EntityWrapper(m_EditorWorld, EntityID_Invalid), "Schema/Entities/Empty.xml"); m_ActualCamera = m_EditorCamera; m_EditorWorld->AttachComponent(m_EditorCamera.ID, "Transform"); @@ -70,7 +70,11 @@ void EditorSystem::Update(double dt) m_EditorGUI->Draw(); m_EditorStats->Draw(actualDelta); + if (IsAnyParentMissingTransform(m_CurrentSelection.ID)) { + return; + } if (m_CurrentSelection.Valid() && m_Widget.Valid()) { + (glm::vec3&)m_Widget["Transform"]["Position"] = Transform::AbsolutePosition(m_CurrentSelection); if (m_WidgetSpace == EditorGUI::WidgetSpace::Local) { (glm::vec3&)m_Widget["Transform"]["Orientation"] = Transform::AbsoluteOrientationEuler(m_CurrentSelection); @@ -78,7 +82,6 @@ void EditorSystem::Update(double dt) (glm::vec3&)m_Widget["Transform"]["Orientation"] = glm::vec3(0, 0, 0); } } - m_EditorWorldSystemPipeline->Update(actualDelta); ComponentWrapper& cameraTransform = m_EditorCamera["Transform"]; @@ -202,6 +205,9 @@ bool EditorSystem::OnMousePress(const Events::MousePress& e) bool EditorSystem::OnWidgetDelta(const Events::WidgetDelta& e) { if (m_CurrentSelection.Valid()) { + if (IsAnyParentMissingTransform(m_CurrentSelection.ID)) { + return false; + } if (m_WidgetSpace == EditorGUI::WidgetSpace::Global) { glm::quat parentOrientation; EntityWrapper parent = m_CurrentSelection.Parent(); @@ -301,3 +307,15 @@ void EditorSystem::setWidgetMode(EditorGUI::WidgetMode mode) m_Widget["Transform"]["Position"] = Transform::AbsolutePosition(m_CurrentSelection.World, m_CurrentSelection.ID); } + +bool EditorSystem::IsAnyParentMissingTransform(EntityID entityID) +{ + EntityWrapper entity(m_World, entityID); + while (entity.Parent().Valid()) { + if (!entity.HasComponent("Transform")) { + return true; + } + entity = entity.Parent(); + } + return false; +} From 078d6eb712937545f40b590919a3894e333efdf5 Mon Sep 17 00:00:00 2001 From: Jocke Date: Mon, 7 Mar 2016 14:22:09 +0100 Subject: [PATCH 02/65] Added sequnceNumber and totalNumberOfPackets to packet for packet splitting. --- include/Engine/Network/Packet.h | 3 ++- src/Engine/Network/Client.cpp | 17 ++++++++++++----- src/Engine/Network/Packet.cpp | 14 +++++++++----- src/Engine/Network/Server.cpp | 15 +++++++++++---- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/include/Engine/Network/Packet.h b/include/Engine/Network/Packet.h index e7444d9d..658c4862 100644 --- a/include/Engine/Network/Packet.h +++ b/include/Engine/Network/Packet.h @@ -16,7 +16,8 @@ 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 sequenceNumber, int totalAmountOfPackets); // Add primitive types like int, float, char... template diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index e29c4755..d8a8ae2b 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -102,8 +102,12 @@ void Client::Update() void Client::parseMessageType(Packet& packet) { - // Pop packetSize + // Pop packetSize, sequenceNumber and packetsInSequence. + // create a packet of the correct size packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); + int messageType = packet.ReadPrimitive(); if (messageType == -1) return; @@ -164,8 +168,11 @@ void Client::parseUDPConnect(Packet& packet) void Client::parseTCPConnect(Packet& packet) { LOG_INFO("Received TCP connect from server"); - // Pop size of message int + // Pop packetSize, sequenceNumber and packetsInSequence. packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); + int messageType = packet.ReadPrimitive(); // Read packet ID m_PreviousPacketID = m_PacketID; // Set previous packet id @@ -177,8 +184,8 @@ void Client::parseTCPConnect(Packet& packet) Packet UnreliablePacket(MessageType::Connect, m_SendPacketID); // Add player id and other stuff packet.WritePrimitive(m_PlayerID); - // m_Unreliable.Send(packet); - // LOG_INFO("Sent UDP Connect Server"); + // m_Unreliable.Send(packet); + // LOG_INFO("Sent UDP Connect Server"); } void Client::parsePlayerConnected(Packet & packet) @@ -476,7 +483,7 @@ bool Client::OnInputCommand(const Events::InputCommand & e) if (e.Command == "ConnectToServer") { // Connect for now if (e.Value > 0) { m_Reliable.Connect(m_PlayerName, m_Address, m_Port); - // m_Unreliable.Connect(m_PlayerName, m_Address, m_Port); + // m_Unreliable.Connect(m_PlayerName, m_Address, m_Port); } //LOG_DEBUG("Client::OnInputCommand: Command is %s. Value is %f. PlayerID is %i.", e.Command.c_str(), e.Value, e.PlayerID); return true; diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index 6a4d0098..db9c61f4 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -3,7 +3,7 @@ Packet::Packet(MessageType type, unsigned int& packetID) { m_Data = new char[m_MaxPacketSize]; - Init(type, packetID); + Init(type, packetID, 1, 1); } // Create message @@ -21,7 +21,7 @@ Packet::Packet(MessageType type) { m_Data = new char[m_MaxPacketSize]; unsigned int dummy = 0; - Init(type, dummy); + Init(type, dummy, 1, 1); } Packet::~Packet() @@ -29,13 +29,17 @@ Packet::~Packet() delete[] m_Data; } -void Packet::Init(MessageType type, unsigned int & packetID) +void Packet::Init(MessageType type, unsigned int & packetID, + int sequenceNumber, int totalAmountOfPackets) { m_ReturnDataOffset = 0; m_Offset = 0; // Create message header - // allocate memory for size of packet(only used in tcp) + // allocate memory for size of packet, sequenceNumber and totalPacketesInSequence WritePrimitive(0); + WritePrimitive(sequenceNumber); + WritePrimitive(totalAmountOfPackets); + // If you add things before here be sure to change in GetMessageType() // Add message type int messageType = static_cast(type); WritePrimitive(messageType); @@ -129,7 +133,7 @@ void Packet::ChangePacketID(unsigned int & packetID) MessageType Packet::GetMessageType() { MessageType messagType; - memcpy(&messagType, m_Data + sizeof(int), sizeof(int)); + memcpy(&messagType, m_Data + 3 * sizeof(int), sizeof(int)); return messagType; } diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 5bfb4000..92cfbedb 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -107,9 +107,11 @@ void Server::Update() void Server::parseMessageType(Packet& packet) { - // Pop packetSize which is used by TCP Client to + // Pop packetSize, sequenceNumber and packetsInSequence. // create a packet of the correct size packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); int messageType = packet.ReadPrimitive(); // Read what type off message was sent from server // Read packet ID @@ -322,8 +324,10 @@ void Server::checkForTimeOuts() //void Server::parseUDPConnect(Packet & packet) //{ -// // Pop size of message int -// packet.ReadPrimitive(); +// Pop packetSize, sequenceNumber and packetsInSequence. +//packet.ReadPrimitive(); +//packet.ReadPrimitive(); +//packet.ReadPrimitive(); // int messageType = packet.ReadPrimitive(); // // Read packet ID // m_PreviousPacketID = m_PacketID; // Set previous packet id @@ -345,8 +349,11 @@ void Server::checkForTimeOuts() void Server::parseTCPConnect(Packet & packet) { - // Pop size of message int + // Pop packetSize, sequenceNumber and packetsInSequence. packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); + int messageType = packet.ReadPrimitive(); // Read packet ID m_PreviousPacketID = m_PacketID; // Set previous packet id From 9cc812484760a5077141976fbb02fe1a84b5ba06 Mon Sep 17 00:00:00 2001 From: stiffly Date: Mon, 7 Mar 2016 14:34:45 +0100 Subject: [PATCH 03/65] Renamed IsAnyParentMissingTransform -> isAnyParentMissingTransform (member function). --- include/Engine/Editor/EditorSystem.h | 2 +- src/Engine/Editor/EditorSystem.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/Engine/Editor/EditorSystem.h b/include/Engine/Editor/EditorSystem.h index a6d3e759..7fe8ce6f 100644 --- a/include/Engine/Editor/EditorSystem.h +++ b/include/Engine/Editor/EditorSystem.h @@ -47,7 +47,7 @@ private: // Utility functions EntityWrapper importEntity(EntityWrapper parent, boost::filesystem::path filePath); void setWidgetMode(EditorGUI::WidgetMode mode); - bool IsAnyParentMissingTransform(EntityID entityID); + bool isAnyParentMissingTransform(EntityID entityID); // GUI callbacks void OnEntitySelected(EntityWrapper entity); diff --git a/src/Engine/Editor/EditorSystem.cpp b/src/Engine/Editor/EditorSystem.cpp index f66cd01c..f8438db6 100644 --- a/src/Engine/Editor/EditorSystem.cpp +++ b/src/Engine/Editor/EditorSystem.cpp @@ -70,7 +70,7 @@ void EditorSystem::Update(double dt) m_EditorGUI->Draw(); m_EditorStats->Draw(actualDelta); - if (IsAnyParentMissingTransform(m_CurrentSelection.ID)) { + if (isAnyParentMissingTransform(m_CurrentSelection.ID)) { return; } if (m_CurrentSelection.Valid() && m_Widget.Valid()) { @@ -205,7 +205,7 @@ bool EditorSystem::OnMousePress(const Events::MousePress& e) bool EditorSystem::OnWidgetDelta(const Events::WidgetDelta& e) { if (m_CurrentSelection.Valid()) { - if (IsAnyParentMissingTransform(m_CurrentSelection.ID)) { + if (isAnyParentMissingTransform(m_CurrentSelection.ID)) { return false; } if (m_WidgetSpace == EditorGUI::WidgetSpace::Global) { @@ -308,7 +308,7 @@ void EditorSystem::setWidgetMode(EditorGUI::WidgetMode mode) m_Widget["Transform"]["Position"] = Transform::AbsolutePosition(m_CurrentSelection.World, m_CurrentSelection.ID); } -bool EditorSystem::IsAnyParentMissingTransform(EntityID entityID) +bool EditorSystem::isAnyParentMissingTransform(EntityID entityID) { EntityWrapper entity(m_World, entityID); while (entity.Parent().Valid()) { From 68a88ed7564f00656db63d370485f8896179c020 Mon Sep 17 00:00:00 2001 From: Jocke Date: Mon, 7 Mar 2016 16:06:10 +0100 Subject: [PATCH 04/65] We are now using udp again --- include/Engine/Network/Client.h | 2 +- include/Engine/Network/Server.h | 2 +- src/Engine/Network/Client.cpp | 30 ++++++------ src/Engine/Network/Server.cpp | 84 ++++++++++++++++----------------- 4 files changed, 60 insertions(+), 58 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 2fa81549..4ee071d2 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -52,7 +52,7 @@ public: void Connect(std::string address, int port); void Update() override; private: - //UDPClient m_Unreliable; + UDPClient m_Unreliable; TCPClient m_Reliable; std::vector m_PlayerSpawnEvents; void parseSpawnEvents(); diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 48b7bcfa..395c80c7 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -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; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index d8a8ae2b..d05e1541 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -49,16 +49,17 @@ void Client::Connect(std::string address, int port) void Client::Update() { m_EventBroker->Process(); - //while (m_Unreliable.IsSocketAvailable()) { - // // Packet will get real data in receive - // Packet packet(MessageType::Invalid); - // m_Unreliable.Receive(packet); - // if (packet.GetMessageType() == MessageType::Connect) { - // parseUDPConnect(packet); - // } else { - // parseMessageType(packet); - // } - //} + while (m_Unreliable.IsSocketAvailable()) { + // Packet will get real data in receive + Packet packet(MessageType::Invalid); + m_Unreliable.Receive(packet); + if (packet.GetMessageType() == MessageType::Connect) { + parseUDPConnect(packet); + } else { + parseMessageType(packet); + } + } + while (m_Reliable.IsSocketAvailable()) { // Packet will get real data in receive Packet packet(MessageType::Invalid); @@ -162,6 +163,7 @@ void Client::parseMessageType(Packet& packet) void Client::parseUDPConnect(Packet& packet) { // Map ServerEntityID and your PlayerID + // TODO: If this is not received send a new connect message. LOG_INFO("I be connected PogChamp"); } @@ -179,12 +181,12 @@ void Client::parseTCPConnect(Packet& packet) m_PacketID = packet.ReadPrimitive(); //Read new packet id // parse player id and other stuff m_PlayerID = packet.ReadPrimitive(); - m_PlayerID = packet.ReadPrimitive(); LOG_INFO("A Player connected"); + // TODO: If this is not received send a new connect message. Packet UnreliablePacket(MessageType::Connect, m_SendPacketID); // Add player id and other stuff packet.WritePrimitive(m_PlayerID); - // m_Unreliable.Send(packet); + m_Unreliable.Send(packet); // LOG_INFO("Sent UDP Connect Server"); } @@ -483,7 +485,7 @@ bool Client::OnInputCommand(const Events::InputCommand & e) if (e.Command == "ConnectToServer") { // Connect for now if (e.Value > 0) { m_Reliable.Connect(m_PlayerName, m_Address, m_Port); - // m_Unreliable.Connect(m_PlayerName, m_Address, m_Port); + m_Unreliable.Connect(m_PlayerName, m_Address, m_Port); } //LOG_DEBUG("Client::OnInputCommand: Command is %s. Value is %f. PlayerID is %i.", e.Command.c_str(), e.Value, e.PlayerID); return true; @@ -620,7 +622,7 @@ void Client::sendLocalPlayerTransform() packet.WritePrimitive((int)cAssaultWeapon["Ammo"]); } - m_Reliable.Send(packet); + m_Unreliable.Send(packet); } void Client::identifyPacketLoss() diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 92cfbedb..27f0a0cb 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -47,19 +47,19 @@ void Server::Update() } } - //PlayerDefinition pd; - //while (m_Unreliable.IsSocketAvailable()) { - // // Packet will get real data in receive - // Packet packet(MessageType::Invalid); - // m_Unreliable.Receive(packet, pd); - // m_Address = pd.Endpoint.address(); - // m_Port = pd.Endpoint.port(); - // if (packet.GetMessageType() == MessageType::Connect) { - // parseUDPConnect(packet); - // } else { - // parseMessageType(packet); - // } - //} + PlayerDefinition pd; + while (m_Unreliable.IsSocketAvailable()) { + // Packet will get real data in receive + Packet packet(MessageType::Invalid); + m_Unreliable.Receive(packet, pd); + m_Address = pd.Endpoint.address(); + m_Port = pd.Endpoint.port(); + if (packet.GetMessageType() == MessageType::Connect) { + parseUDPConnect(packet); + } else { + parseMessageType(packet); + } + } while (m_ServerlistRequest.IsSocketAvailable()) { Packet packet(MessageType::Invalid); @@ -164,7 +164,7 @@ void Server::unreliableBroadcast(Packet& packet) { for (auto& kv : m_ConnectedPlayers) { packet.ChangePacketID(kv.second.PacketID); -// m_Unreliable.Send(packet, kv.second); + m_Unreliable.Send(packet, kv.second); } } @@ -174,7 +174,7 @@ void Server::sendSnapshot() Packet packet(MessageType::Snapshot); addInputCommandsToPacket(packet); addPlayersToPacket(packet, EntityID_Invalid); - reliableBroadcast(packet); + unreliableBroadcast(packet); } void Server::addInputCommandsToPacket(Packet& packet) @@ -322,30 +322,30 @@ void Server::checkForTimeOuts() } } -//void Server::parseUDPConnect(Packet & packet) -//{ -// Pop packetSize, sequenceNumber and packetsInSequence. -//packet.ReadPrimitive(); -//packet.ReadPrimitive(); -//packet.ReadPrimitive(); -// int messageType = packet.ReadPrimitive(); -// // Read packet ID -// m_PreviousPacketID = m_PacketID; // Set previous packet id -// m_PacketID = packet.ReadPrimitive(); //Read new packet id -// // parse player id and other stuff -// PlayerID playerID = packet.ReadPrimitive(); -// if (!EntityWrapper(m_World, playerID).Valid()) { -// -// } -// // Do something here? -// boost::asio::ip::udp::endpoint endpoint(m_Address, m_Port); -// m_ConnectedPlayers.at(playerID).Endpoint = endpoint; -// LOG_INFO("parseUDPConnect: Spectator \"%s\" connected on IP: %s", m_ConnectedPlayers.at(playerID).Name.c_str(), m_ConnectedPlayers.at(playerID).Endpoint.address().to_string().c_str()); -// // Send a message to the player that connected -// Packet connnectPacket(MessageType::Connect, m_ConnectedPlayers.at(playerID).PacketID); -// m_Unreliable.Send(connnectPacket); -// LOG_INFO("UDP Connect sent to client"); -//} +void Server::parseUDPConnect(Packet & packet) +{ + //Pop packetSize, sequenceNumber and packetsInSequence. + packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); + int messageType = packet.ReadPrimitive(); + // Read packet ID + m_PreviousPacketID = m_PacketID; // Set previous packet id + m_PacketID = packet.ReadPrimitive(); //Read new packet id + // parse player id and other stuff + PlayerID playerID = packet.ReadPrimitive(); + if (!EntityWrapper(m_World, playerID).Valid()) { + + } + // Do something here? + boost::asio::ip::udp::endpoint endpoint(m_Address, m_Port); + m_ConnectedPlayers.at(playerID).Endpoint = endpoint; + LOG_INFO("parseUDPConnect: Spectator \"%s\" connected on IP: %s", m_ConnectedPlayers.at(playerID).Name.c_str(), m_ConnectedPlayers.at(playerID).Endpoint.address().to_string().c_str()); + // Send a message to the player that connected + Packet connnectPacket(MessageType::Connect, m_ConnectedPlayers.at(playerID).PacketID); + m_Unreliable.Send(connnectPacket); + LOG_INFO("UDP Connect sent to client"); +} void Server::parseTCPConnect(Packet & packet) { @@ -656,9 +656,9 @@ bool Server::shouldSendToClient(EntityWrapper childEntity) return true; } } - return childEntity.HasComponent("Player") + return childEntity.HasComponent("Player") || childEntity.FirstParentWithComponent("Player").Valid() - || childEntity.HasComponent("CapturePoint") + || childEntity.HasComponent("CapturePoint") || childEntity.HasComponent("HealthPickup") || childEntity.HasComponent("AmmoPickup") || childEntity.HasComponent("ScoreScreen") @@ -681,7 +681,7 @@ PlayerID Server::getPlayerIDFromEndpoint() PlayerID Server::getPlayerIDFromEntityID(EntityID entityID) { - for(auto& kv : m_ConnectedPlayers) { + for (auto& kv : m_ConnectedPlayers) { if (entityID == kv.second.EntityID) { return kv.first; } From 9cbc582be282f4a3024b4358420cd62a1911a701 Mon Sep 17 00:00:00 2001 From: Jocke Date: Tue, 8 Mar 2016 11:29:47 +0100 Subject: [PATCH 05/65] Kinda works like before --- include/Engine/Network/Packet.h | 3 ++ include/Engine/Network/UDPClient.h | 3 ++ include/Engine/Network/UDPServer.h | 1 + src/Engine/Network/Packet.cpp | 29 ++++++++++++++-- src/Engine/Network/TCPServer.cpp | 1 + src/Engine/Network/UDPClient.cpp | 10 ++---- src/Engine/Network/UDPServer.cpp | 53 +++++++++++++++++++++--------- 7 files changed, 76 insertions(+), 24 deletions(-) diff --git a/include/Engine/Network/Packet.h b/include/Engine/Network/Packet.h index 658c4862..a08fff64 100644 --- a/include/Engine/Network/Packet.h +++ b/include/Engine/Network/Packet.h @@ -58,12 +58,15 @@ public: void UpdateSize(); char* ReadData(int SizeOfData); void ChangePacketID(unsigned int& packetID); + void ChangeSequenceNumber(int sequenceNumber, int sequenceLength); size_t Size() { return m_Offset; }; char* Data() { return m_Data; }; MessageType GetMessageType(); size_t DataReadSize() { return m_ReturnDataOffset; } size_t MaxSize() { return m_MaxPacketSize; } size_t HeaderSize() { return m_HeaderSize; } + size_t SequenceNumber(); + size_t SequenceLength(); private: char* m_Data; diff --git a/include/Engine/Network/UDPClient.h b/include/Engine/Network/UDPClient.h index 42c27783..f662f945 100644 --- a/include/Engine/Network/UDPClient.h +++ b/include/Engine/Network/UDPClient.h @@ -1,11 +1,13 @@ #ifndef UDPClient_h__ #define UDPClient_h__ +#include #include #include "Network/NetworkClient.h" class UDPClient : public NetworkClient { + // TODO: add packets to map. public: UDPClient(); ~UDPClient(); @@ -23,6 +25,7 @@ private: boost::shared_ptr m_Socket; int readBuffer(); PacketID m_SendPacketID = 0; + std::unordered_map> packetSegmentMap; }; #endif \ No newline at end of file diff --git a/include/Engine/Network/UDPServer.h b/include/Engine/Network/UDPServer.h index 54f4e327..6b6b7d33 100644 --- a/include/Engine/Network/UDPServer.h +++ b/include/Engine/Network/UDPServer.h @@ -3,6 +3,7 @@ #include "NetworkServer.h" #include +#define MAXPACKETSIZE 32000 class UDPServer : public NetworkServer { diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index db9c61f4..0838cdf4 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -35,11 +35,13 @@ void Packet::Init(MessageType type, unsigned int & packetID, m_ReturnDataOffset = 0; m_Offset = 0; // Create message header + // If you add things before here be sure to change in GetMessageType() + // SequenceNumber(), SequenceLength(), ChangePacketID() // allocate memory for size of packet, sequenceNumber and totalPacketesInSequence WritePrimitive(0); + // SequenceNumber and totalAmountOfPackets position in array is hard coded WritePrimitive(sequenceNumber); WritePrimitive(totalAmountOfPackets); - // If you add things before here be sure to change in GetMessageType() // Add message type int messageType = static_cast(type); WritePrimitive(messageType); @@ -127,7 +129,13 @@ void Packet::ChangePacketID(unsigned int & packetID) { packetID = packetID + 1; // Overwrite old PacketID - memcpy(m_Data + 2*sizeof(int), &packetID, sizeof(int)); + memcpy(m_Data + 4 * sizeof(int), &packetID, sizeof(int)); +} + +void Packet::ChangeSequenceNumber(int sequenceNumber, int sequenceLength) +{ + memcpy(&sequenceNumber, m_Data + sizeof(int), sizeof(int)); + memcpy(&sequenceLength, m_Data + 2 * sizeof(int), sizeof(int)); } MessageType Packet::GetMessageType() @@ -137,6 +145,23 @@ MessageType Packet::GetMessageType() return messagType; } +//WritePrimitive(sequenceNumber); +//WritePrimitive(totalAmountOfPackets); + +size_t Packet::SequenceNumber() +{ + size_t sequenceNumber; + memcpy(&sequenceNumber, m_Data + sizeof(int), sizeof(int)); + return sequenceNumber; +} + +size_t Packet::SequenceLength() +{ + size_t sequenceLength; + memcpy(&sequenceLength, m_Data + 2 * sizeof(int), sizeof(int)); + return sequenceLength; +} + void Packet::resizeData() { resizeData(m_MaxPacketSize * 2); diff --git a/src/Engine/Network/TCPServer.cpp b/src/Engine/Network/TCPServer.cpp index ff35aa91..eddd679c 100644 --- a/src/Engine/Network/TCPServer.cpp +++ b/src/Engine/Network/TCPServer.cpp @@ -48,6 +48,7 @@ void TCPServer::Send(Packet & packet, PlayerDefinition & playerDefinition) { packet.UpdateSize(); try { + // Crashed once TCPSocket was NULL int bytesSent = playerDefinition.TCPSocket->send( boost::asio::buffer(packet.Data(), packet.Size()), 0); diff --git a/src/Engine/Network/UDPClient.cpp b/src/Engine/Network/UDPClient.cpp index 1d71c155..6c839652 100644 --- a/src/Engine/Network/UDPClient.cpp +++ b/src/Engine/Network/UDPClient.cpp @@ -39,7 +39,7 @@ int UDPClient::readBuffer() return 0; } boost::system::error_code error; - // Read size of packet + // Peek size of packet m_Socket->receive(boost ::asio::buffer((void*)m_ReadBuffer, sizeof(int)), boost::asio::ip::udp::socket::message_peek, error); @@ -47,7 +47,7 @@ int UDPClient::readBuffer() memcpy(&sizeOfPacket, m_ReadBuffer, sizeof(int)); if (sizeOfPacket > m_Socket->available()) { LOG_WARNING("UDPClient::readBuffer(): We haven't got the whole packet yet."); - //return 0; + // return; } // if the buffer is to small increase the size of it if (sizeOfPacket > m_BufferSize) { @@ -55,9 +55,7 @@ int UDPClient::readBuffer() m_ReadBuffer = new char[sizeOfPacket]; m_BufferSize = sizeOfPacket; } - - size_t availableData = m_Socket->available(); - // Read the rest of the message + // Read the message size_t bytesReceived = m_Socket->receive_from(boost ::asio::buffer((void*)(m_ReadBuffer), sizeOfPacket), @@ -65,8 +63,6 @@ int UDPClient::readBuffer() if (error) { //LOG_ERROR("receive: %s", error.message().c_str()); } - if (sizeOfPacket > 1000000) - LOG_WARNING("The packets received are bigger than 1MB"); return bytesReceived; } diff --git a/src/Engine/Network/UDPServer.cpp b/src/Engine/Network/UDPServer.cpp index bfa27d69..3ec5a558 100644 --- a/src/Engine/Network/UDPServer.cpp +++ b/src/Engine/Network/UDPServer.cpp @@ -17,11 +17,34 @@ void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) { packet.UpdateSize(); try { - int bytesSent = m_Socket->send_to( - boost::asio::buffer(packet.Data(), packet.Size()), - playerDefinition.Endpoint, - 0); - LOG_INFO("Size of packet is %i", bytesSent); + // Remove header from packet. + packet.ReadData(packet.HeaderSize()); + int bytesSent = 0; + int sequenceNumber = 1; + int totalMessages = std::ceil(packet.Size() / MAXPACKETSIZE); + int packetDataSent = 0; + int packetDataSize = packet.Size() - packet.HeaderSize(); + while (packetDataSize > packetDataSent) { + + Packet splitPacket(packet.GetMessageType(), playerDefinition.PacketID); + splitPacket.ChangeSequenceNumber(sequenceNumber, totalMessages); + int amountToSend = packetDataSize - packetDataSent; + if (amountToSend > MAXPACKETSIZE) { + amountToSend = MAXPACKETSIZE; + } + splitPacket.WriteData(packet.ReadData(amountToSend), amountToSend); + splitPacket.UpdateSize(); + // Remove header size from bytes sent soo that we only + // count data in the packet + + bytesSent += m_Socket->send_to( + boost::asio::buffer(splitPacket.Data() + bytesSent, splitPacket.Size()), + playerDefinition.Endpoint, + 0); + packetDataSent = bytesSent - splitPacket.HeaderSize(); + ++sequenceNumber; + int sizeasdasd = splitPacket.ReadPrimitive(); + } } catch (const boost::system::system_error& e) { LOG_INFO(e.what()); // TODO: Clean up invalid endpoints out of m_ConnectedPlayers later @@ -33,13 +56,13 @@ void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) void UDPServer::Send(Packet & packet) { packet.UpdateSize(); - size_t bytesSent = m_Socket->send_to( + size_t bytesSent = m_Socket->send_to( boost::asio::buffer( packet.Data(), packet.Size()), m_ReceiverEndpoint, 0); - LOG_INFO("Size of packet is %i", bytesSent); + LOG_INFO("Size of packet is %i", bytesSent); } // Broadcasting respond specific logic @@ -64,7 +87,7 @@ void UDPServer::Broadcast(Packet & packet, int port) boost::asio::buffer( packet.Data(), packet.Size()), - boost::asio::ip::udp::endpoint(boost::asio::ip::address_v4().broadcast(),port), + boost::asio::ip::udp::endpoint(boost::asio::ip::address_v4().broadcast(), port), 0); m_Socket->set_option(boost::asio::socket_base::broadcast(false)); } @@ -91,7 +114,7 @@ int UDPServer::readBuffer() int addasdasd = m_Socket->available(); boost::system::error_code error; // Read size of packet - m_Socket->receive_from(boost + m_Socket->receive_from(boost ::asio::buffer((void*)m_ReadBuffer, sizeof(int)), m_ReceiverEndpoint, boost::asio::ip::udp::socket::message_peek, error); unsigned int sizeOfPacket = 0; @@ -114,13 +137,13 @@ int UDPServer::readBuffer() ::asio::buffer((void*)(m_ReadBuffer), sizeOfPacket), m_ReceiverEndpoint, 0, error); - if (error) { - //LOG_ERROR("receive: %s", error.message().c_str()); - } - if (sizeOfPacket > 1000000) - LOG_WARNING("The packets received are bigger than 1MB"); + if (error) { + //LOG_ERROR("receive: %s", error.message().c_str()); + } + if (sizeOfPacket > 1000000) + LOG_WARNING("The packets received are bigger than 1MB"); - return bytesReceived; + return bytesReceived; } void UDPServer::AcceptNewConnections(int& nextPlayerID, std::map& connectedPlayers) From 3828616b60db10c54851eaa188b9f53ccef4607a Mon Sep 17 00:00:00 2001 From: Jocke Date: Tue, 8 Mar 2016 14:44:35 +0100 Subject: [PATCH 06/65] Made it easier to maintain changes in packet header, prepared for reliable UDP packets. --- include/Engine/Network/Client.h | 1 + include/Engine/Network/Packet.h | 16 ++++++-- include/Engine/Network/Server.h | 1 + include/Engine/Network/UDPClient.h | 5 ++- src/Engine/Network/Client.cpp | 26 +++++++------ src/Engine/Network/Packet.cpp | 60 ++++++++++++++++++------------ src/Engine/Network/Server.cpp | 22 ++++++----- src/Engine/Network/UDPClient.cpp | 9 +++-- src/Engine/Network/UDPServer.cpp | 7 +++- 9 files changed, 91 insertions(+), 56 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 4ee071d2..4efa6e28 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -119,6 +119,7 @@ private: void sendLocalPlayerTransform(); void becomePlayer(); void displayServerlist(); + void popNetworkSegmentOfHeader(Packet& packet); // Mapping Logic // Returns if local EntityID exist in map bool clientServerMapsHasEntity(EntityID clientEntityID); diff --git a/include/Engine/Network/Packet.h b/include/Engine/Network/Packet.h index a08fff64..6095e6a6 100644 --- a/include/Engine/Network/Packet.h +++ b/include/Engine/Network/Packet.h @@ -17,7 +17,8 @@ public: Packet(MessageType type); ~Packet(); void Init(MessageType type, unsigned int& packetID, - int sequenceNumber, int totalAmountOfPackets); + int sequenceNumber, int totalAmountOfPackets, + int packetGroup); // Add primitive types like int, float, char... template @@ -65,9 +66,9 @@ public: size_t DataReadSize() { return m_ReturnDataOffset; } size_t MaxSize() { return m_MaxPacketSize; } size_t HeaderSize() { return m_HeaderSize; } - size_t SequenceNumber(); - size_t SequenceLength(); - + size_t GroupIndex(); + size_t GroupSize(); + size_t PacketID(); private: char* m_Data; size_t m_ReturnDataOffset = 0; @@ -76,6 +77,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 \ No newline at end of file diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 395c80c7..5d4cac51 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -82,6 +82,7 @@ private: void kick(PlayerID player); PlayerID getPlayerIDFromEndpoint(); PlayerID getPlayerIDFromEntityID(EntityID entityID); + void popNetworkSegmentOfHeader(Packet & packet); void parsePlayerTransform(Packet& packet); void parseOnInputCommand(Packet& packet); void parseClientPing(); diff --git a/include/Engine/Network/UDPClient.h b/include/Engine/Network/UDPClient.h index f662f945..94b23080 100644 --- a/include/Engine/Network/UDPClient.h +++ b/include/Engine/Network/UDPClient.h @@ -1,6 +1,6 @@ #ifndef UDPClient_h__ #define UDPClient_h__ -#include +#include #include #include "Network/NetworkClient.h" @@ -25,7 +25,8 @@ private: boost::shared_ptr m_Socket; int readBuffer(); PacketID m_SendPacketID = 0; - std::unordered_map> packetSegmentMap; + //map:(packetGroup, vector:(pair:(groupIndex, packetData))) + std::map>>> packetSegmentMap; }; #endif \ No newline at end of file diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index d05e1541..2bda83db 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -104,10 +104,7 @@ void Client::Update() void Client::parseMessageType(Packet& packet) { // Pop packetSize, sequenceNumber and packetsInSequence. - // create a packet of the correct size - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); + popNetworkSegmentOfHeader(packet); int messageType = packet.ReadPrimitive(); if (messageType == -1) @@ -170,10 +167,8 @@ void Client::parseUDPConnect(Packet& packet) void Client::parseTCPConnect(Packet& packet) { LOG_INFO("Received TCP connect from server"); - // Pop packetSize, sequenceNumber and packetsInSequence. - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); + // Pop packetSize, group, groupIndex and groupSize. + popNetworkSegmentOfHeader(packet); int messageType = packet.ReadPrimitive(); // Read packet ID @@ -213,10 +208,8 @@ void Client::parsePing() void Client::parseServerlist(Packet& packet) { - // Pop size, message type, and ID - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); + // Pop packetSize, group, groupIndex and groupSize. + popNetworkSegmentOfHeader(packet); std::string address = packet.ReadString(); int port = packet.ReadPrimitive(); std::string serverName = packet.ReadString(); @@ -684,6 +677,15 @@ void Client::displayServerlist() } } +void Client::popNetworkSegmentOfHeader(Packet & packet) +{ + // Pop packetSize, group, groupIndex and groupSize. + packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); +} + bool Client::clientServerMapsHasEntity(EntityID clientEntityID) { if (m_ClientIDToServerID.find(clientEntityID) != m_ClientIDToServerID.end()) { diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index 0838cdf4..75b69bd7 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -3,7 +3,7 @@ Packet::Packet(MessageType type, unsigned int& packetID) { m_Data = new char[m_MaxPacketSize]; - Init(type, packetID, 1, 1); + Init(type, packetID, 1, 1 , -1); } // Create message @@ -21,7 +21,7 @@ Packet::Packet(MessageType type) { m_Data = new char[m_MaxPacketSize]; unsigned int dummy = 0; - Init(type, dummy, 1, 1); + Init(type, dummy, 1, 1, -1); } Packet::~Packet() @@ -30,21 +30,29 @@ Packet::~Packet() } void Packet::Init(MessageType type, unsigned int & packetID, - int sequenceNumber, int totalAmountOfPackets) + int groupIndex, int packetGroupSize, int packetGroup) { m_ReturnDataOffset = 0; m_Offset = 0; // Create message header - // If you add things before here be sure to change in GetMessageType() - // SequenceNumber(), SequenceLength(), ChangePacketID() // allocate memory for size of packet, sequenceNumber and totalPacketesInSequence + packetSizeOffset = m_Offset; WritePrimitive(0); - // SequenceNumber and totalAmountOfPackets position in array is hard coded - WritePrimitive(sequenceNumber); - WritePrimitive(totalAmountOfPackets); + // packetGroup is the gorup the packet is in + groupOffset = m_Offset; + WritePrimitive(packetGroup); + // What index the packet has in the packetGroup + groupIndexOffset = m_Offset; + WritePrimitive(groupIndex); + // The total amount of packets in a packetGroup + groupSizeOffset = m_Offset; + WritePrimitive(packetGroupSize); // Add message type int messageType = static_cast(type); + messageTypeOffset = m_Offset; WritePrimitive(messageType); + // Packet ID + packetIDOffset = m_Offset; WritePrimitive(packetID); packetID++; m_HeaderSize = m_Offset; @@ -129,37 +137,41 @@ void Packet::ChangePacketID(unsigned int & packetID) { packetID = packetID + 1; // Overwrite old PacketID - memcpy(m_Data + 4 * sizeof(int), &packetID, sizeof(int)); + memcpy(m_Data + packetIDOffset, &packetID, sizeof(int)); } -void Packet::ChangeSequenceNumber(int sequenceNumber, int sequenceLength) +void Packet::ChangeSequenceNumber(int groupIndex, int groupSize) { - memcpy(&sequenceNumber, m_Data + sizeof(int), sizeof(int)); - memcpy(&sequenceLength, m_Data + 2 * sizeof(int), sizeof(int)); + memcpy(&groupIndex, m_Data + groupIndexOffset, sizeof(int)); + memcpy(&groupSize, m_Data + groupSizeOffset, sizeof(int)); } MessageType Packet::GetMessageType() { MessageType messagType; - memcpy(&messagType, m_Data + 3 * sizeof(int), sizeof(int)); + memcpy(&messagType, m_Data + messageTypeOffset, sizeof(int)); return messagType; } -//WritePrimitive(sequenceNumber); -//WritePrimitive(totalAmountOfPackets); - -size_t Packet::SequenceNumber() +size_t Packet::GroupIndex() { - size_t sequenceNumber; - memcpy(&sequenceNumber, m_Data + sizeof(int), sizeof(int)); - return sequenceNumber; + size_t groupIndex; + memcpy(&groupIndex, m_Data + groupIndexOffset, sizeof(int)); + return groupIndex; } -size_t Packet::SequenceLength() +size_t Packet::GroupSize() { - size_t sequenceLength; - memcpy(&sequenceLength, m_Data + 2 * sizeof(int), sizeof(int)); - return sequenceLength; + size_t groupSize; + memcpy(&groupSize, m_Data + groupSizeOffset, sizeof(int)); + return groupSize; +} + +size_t Packet::PacketID() +{ + size_t packetID; + memcpy(&packetID, m_Data + packetIDOffset, sizeof(int)); + return packetID; } void Packet::resizeData() diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 27f0a0cb..7a2d58a8 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -109,9 +109,7 @@ void Server::parseMessageType(Packet& packet) { // Pop packetSize, sequenceNumber and packetsInSequence. // create a packet of the correct size - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); + popNetworkSegmentOfHeader(packet); int messageType = packet.ReadPrimitive(); // Read what type off message was sent from server // Read packet ID @@ -163,7 +161,6 @@ void Server::reliableBroadcast(Packet& packet) void Server::unreliableBroadcast(Packet& packet) { for (auto& kv : m_ConnectedPlayers) { - packet.ChangePacketID(kv.second.PacketID); m_Unreliable.Send(packet, kv.second); } } @@ -325,9 +322,7 @@ void Server::checkForTimeOuts() void Server::parseUDPConnect(Packet & packet) { //Pop packetSize, sequenceNumber and packetsInSequence. - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); + popNetworkSegmentOfHeader(packet); int messageType = packet.ReadPrimitive(); // Read packet ID m_PreviousPacketID = m_PacketID; // Set previous packet id @@ -350,9 +345,7 @@ void Server::parseUDPConnect(Packet & packet) void Server::parseTCPConnect(Packet & packet) { // Pop packetSize, sequenceNumber and packetsInSequence. - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); + popNetworkSegmentOfHeader(packet); int messageType = packet.ReadPrimitive(); // Read packet ID @@ -688,3 +681,12 @@ PlayerID Server::getPlayerIDFromEntityID(EntityID entityID) } return -1; } + +void Server::popNetworkSegmentOfHeader(Packet & packet) +{ + // Pop packetSize, group, groupIndex and groupSize. + packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); +} \ No newline at end of file diff --git a/src/Engine/Network/UDPClient.cpp b/src/Engine/Network/UDPClient.cpp index 6c839652..30690757 100644 --- a/src/Engine/Network/UDPClient.cpp +++ b/src/Engine/Network/UDPClient.cpp @@ -39,12 +39,15 @@ int UDPClient::readBuffer() return 0; } boost::system::error_code error; - // Peek size of packet + // Peek header m_Socket->receive(boost - ::asio::buffer((void*)m_ReadBuffer, sizeof(int)), + ::asio::buffer((void*)m_ReadBuffer, 5 * sizeof(int)), boost::asio::ip::udp::socket::message_peek, error); int sizeOfPacket = 0; memcpy(&sizeOfPacket, m_ReadBuffer, sizeof(int)); + int packetID = 0; + memcpy(&packetID, m_ReadBuffer + 4 * sizeof(int), sizeof(int)); + if (sizeOfPacket > m_Socket->available()) { LOG_WARNING("UDPClient::readBuffer(): We haven't got the whole packet yet."); // return; @@ -63,7 +66,7 @@ int UDPClient::readBuffer() if (error) { //LOG_ERROR("receive: %s", error.message().c_str()); } - + // new char [sizeOfPacket] save in map with packetID as key return bytesReceived; } diff --git a/src/Engine/Network/UDPServer.cpp b/src/Engine/Network/UDPServer.cpp index 3ec5a558..6ed95fe0 100644 --- a/src/Engine/Network/UDPServer.cpp +++ b/src/Engine/Network/UDPServer.cpp @@ -43,7 +43,12 @@ void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) 0); packetDataSent = bytesSent - splitPacket.HeaderSize(); ++sequenceNumber; - int sizeasdasd = splitPacket.ReadPrimitive(); + int packetsise = splitPacket.ReadPrimitive(); + int groopOffset = splitPacket.ReadPrimitive(); + int groopIndes = splitPacket.ReadPrimitive(); + int groopSiseOffset = splitPacket.ReadPrimitive(); + int mezzagetype = splitPacket.ReadPrimitive(); + int pakketIDOffset = splitPacket.ReadPrimitive(); } } catch (const boost::system::system_error& e) { LOG_INFO(e.what()); From 12dd1d21de0f6edd0868f0dd60d6ea40493ecbe3 Mon Sep 17 00:00:00 2001 From: FakeShemp Date: Wed, 9 Mar 2016 12:11:26 +0100 Subject: [PATCH 07/65] Text now handles color, alpha and icon parsing --- include/Engine/Rendering/TextPass.h | 1 + src/Engine/Rendering/TextPass.cpp | 98 +++++++++++++++++++++++++++-- 2 files changed, 93 insertions(+), 6 deletions(-) diff --git a/include/Engine/Rendering/TextPass.h b/include/Engine/Rendering/TextPass.h index 8fbb3df0..bb11e5b7 100644 --- a/include/Engine/Rendering/TextPass.h +++ b/include/Engine/Rendering/TextPass.h @@ -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& colorChanges, glm::vec4 originalColor); Font* font; GLuint VAO, VBO; diff --git a/src/Engine/Rendering/TextPass.cpp b/src/Engine/Rendering/TextPass.cpp index 9583fcfd..71a1c405 100644 --- a/src/Engine/Rendering/TextPass.cpp +++ b/src/Engine/Rendering/TextPass.cpp @@ -16,7 +16,7 @@ void TextPass::Initialize() glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), 0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); - + m_TextProgram = ResourceManager::Load("#TextProgram"); m_TextProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/Text.vert.glsl"))); m_TextProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/Text.frag.glsl"))); @@ -46,6 +46,83 @@ void TextPass::Draw(RenderScene& scene, FrameBuffer& frameBuffer) delete state; } +std::string TextPass::parseColors(std::string text, std::map& colorChanges, glm::vec4 originalColor) +{ + std::string parsedString = text; + glm::vec4 newColor = originalColor; + bool colorChange = false; + + for (std::string::const_iterator c = parsedString.begin(); c != parsedString.end(); c++) { + if (*c == char(92)) { // Backlash + if (*(c + 1) == char('C')) { // C for Color + bool hasCorrectFormat = true; + + for (std::string::const_iterator colorC = c + 2; colorC != c + 8; colorC++) { + if (*colorC < '0' || *colorC > 'F') { + hasCorrectFormat = false; + break; + } + } + + if (hasCorrectFormat == true) { + colorChange = true; + + std::array hexToInt = { + std::stoi(std::string(c + 2, c + 4), 0, 16), + std::stoi(std::string(c + 4, c + 6), 0, 16), + std::stoi(std::string(c + 6, c + 8), 0, 16) + }; + + newColor = glm::vec4( + float(hexToInt[0]) / 255.f, + float(hexToInt[1]) / 255.f, + float(hexToInt[2]) / 255.f, + newColor.a); + + parsedString.erase(c, (c + 8)); + } + } + + if (*(c + 1) == char('A')) { // A for Alpha + bool hasCorrectFormat = true; + + for (std::string::const_iterator colorC = c + 2; colorC != c + 4; colorC++) { + if (*colorC < '0' || *colorC > 'F') { + hasCorrectFormat = false; + break; + } + + if (hasCorrectFormat == true) { + colorChange = true; + + int hexToInt = std::stoi(std::string(c + 2, c + 4), 0, 16); + + newColor = glm::vec4( + newColor.r, + newColor.g, + newColor.b, + float(hexToInt) / 255.f); + + parsedString.erase(c, (c + 4)); + } + } + } + + if (*(c + 1) > '0' && *(c + 1) < '9') { // Icons + parsedString.replace(c, (c + 2), 1, (*(c + 1) - 48)); + } + + if (colorChange) { + colorChanges[c - parsedString.begin()] = newColor; + } + } + } + + + + return parsedString; +} + void TextPass::renderText(std::string text, Font* font, TextJob::AlignmentEnum alignment, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix) { GLfloat penX = 0; @@ -54,10 +131,13 @@ void TextPass::renderText(std::string text, Font* font, TextJob::AlignmentEnum a GLfloat stringWidth = 0.f; - for (std::string::const_iterator c = text.begin(); c != text.end(); c++) { - Font::Character ch = font->m_Characters[*c]; - stringWidth += (ch.Advance >> 6) * scale; - } + std::map colorChanges; + std::string parsedText = parseColors(text, colorChanges, color); + + for (std::string::const_iterator c = parsedText.begin(); c != parsedText.end(); c++) { + Font::Character ch = font->m_Characters[*c]; + stringWidth += (ch.Advance >> 6) * scale; + } if(alignment == TextJob::AlignmentEnum::Center) { penX = -stringWidth/2.f; @@ -78,7 +158,13 @@ void TextPass::renderText(std::string text, Font* font, TextJob::AlignmentEnum a glBindVertexArray(VAO); - for (std::string::const_iterator c = text.begin(); c != text.end(); c++) { + for (std::string::const_iterator c = parsedText.begin(); c != parsedText.end(); c++) { + + auto it = colorChanges.find(c - parsedText.begin()); + if (it != colorChanges.end()) { + glUniform4fv(glGetUniformLocation(m_TextProgram->GetHandle(), "textColor"), 1, glm::value_ptr(it->second)); + } + Font::Character ch = font->m_Characters[*c]; GLfloat xpos = penX + ch.Bearing.x * scale; From ba6d2b758dfdac3554069d6eea668548fcef5bc7 Mon Sep 17 00:00:00 2001 From: FakeShemp Date: Wed, 9 Mar 2016 12:34:09 +0100 Subject: [PATCH 08/65] Add killstreak icon --- src/Engine/Rendering/TextPass.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Engine/Rendering/TextPass.cpp b/src/Engine/Rendering/TextPass.cpp index 71a1c405..a38fe4d1 100644 --- a/src/Engine/Rendering/TextPass.cpp +++ b/src/Engine/Rendering/TextPass.cpp @@ -108,7 +108,7 @@ std::string TextPass::parseColors(std::string text, std::map& co } } - if (*(c + 1) > '0' && *(c + 1) < '9') { // Icons + if (*(c + 1) >= '1' && *(c + 1) <= '9') { // Icons parsedString.replace(c, (c + 2), 1, (*(c + 1) - 48)); } From 9581e9ac84ce6ff1d3a4bb8faa2f4f5178b3dfea Mon Sep 17 00:00:00 2001 From: William Moberg Date: Wed, 9 Mar 2016 17:51:26 +0100 Subject: [PATCH 09/65] Don't set the player to previous position when uncrouching. --- include/Engine/Input/FirstPersonInputController.h | 3 +++ resources/Schema/Components/Collidable.xml | 1 + resources/Schema/Components/Collidable.xsd | 5 +++++ src/Engine/Collision/CollisionSystem.cpp | 5 +++-- src/Game/Systems/PlayerMovementSystem.cpp | 9 +++++++++ 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/include/Engine/Input/FirstPersonInputController.h b/include/Engine/Input/FirstPersonInputController.h index 00f36ac7..f91db610 100644 --- a/include/Engine/Input/FirstPersonInputController.h +++ b/include/Engine/Input/FirstPersonInputController.h @@ -18,6 +18,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; @@ -43,6 +44,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; double m_DashEffectResetTimer = 0.0; @@ -82,6 +84,7 @@ void FirstPersonInputController::Reset() { m_Rotation = glm::vec3(0.f, 0.f, 0.f); m_Jumping = false; + m_CrouchingLastFrame = m_Crouching; } template diff --git a/resources/Schema/Components/Collidable.xml b/resources/Schema/Components/Collidable.xml index 9046ea99..7bd60939 100644 --- a/resources/Schema/Components/Collidable.xml +++ b/resources/Schema/Components/Collidable.xml @@ -1,3 +1,4 @@ + true \ No newline at end of file diff --git a/resources/Schema/Components/Collidable.xsd b/resources/Schema/Components/Collidable.xsd index 93f7ac24..2dd49a20 100644 --- a/resources/Schema/Components/Collidable.xsd +++ b/resources/Schema/Components/Collidable.xsd @@ -7,5 +7,10 @@ Needs a Model or AABB component to work, uses AABB if both are attached. + + + + + \ No newline at end of file diff --git a/src/Engine/Collision/CollisionSystem.cpp b/src/Engine/Collision/CollisionSystem.cpp index 53cabfac..8333a9ae 100644 --- a/src/Engine/Collision/CollisionSystem.cpp +++ b/src/Engine/Collision/CollisionSystem.cpp @@ -66,7 +66,7 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c } } } - + bool& jitterGuard = (bool&)entity["Collidable"]["JitterGuard"]; // Collide against octree items m_OctreeResult.clear(); m_Octree->ObjectsInSameRegion(*boundingBox, m_OctreeResult); @@ -93,7 +93,7 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c float verticalStepHeight = (float)(double)cPhysics["VerticalStepHeight"]; if (Collision::AABBvsTriangles(boxA, model->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; + (glm::vec3&)cTransform["Position"] += jitterGuard && notMovingxz ? prevPosIt->second - boxA.Origin() : resolutionVector; boxA = *Collision::EntityAbsoluteAABB(entity); cPhysics["Velocity"] = inOutVelocity; if (isOnGround) { @@ -118,6 +118,7 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c (bool)cPhysics["IsOnGround"] = false; } + jitterGuard = true; m_PrevPositions[entity] = boxA.Origin(); } } diff --git a/src/Game/Systems/PlayerMovementSystem.cpp b/src/Game/Systems/PlayerMovementSystem.cpp index b927856a..b0ad37ea 100644 --- a/src/Game/Systems/PlayerMovementSystem.cpp +++ b/src/Game/Systems/PlayerMovementSystem.cpp @@ -273,6 +273,15 @@ void PlayerMovementSystem::updateMovementControllers(double dt) size = glm::vec3(1.f, 1.f, 1.f); } else { size = glm::vec3(1.f, 1.6f, 1.f); + if (controller->CrouchingLastFrame() && player.HasComponent("Collidable")) { + // Disable jitter guard so player doesn't get stuck in the ground. + (bool&)player["Collidable"]["JitterGuard"] = false; + if (isOnGround) { + // The collision should resolve this anyway, but + // this is more reliable, since the box gets larger. + ((glm::vec3&)cTransform["Position"]).y += 0.3f; + } + } } } From 3209e361761f2e9941095d43f31609fcd06d78ec Mon Sep 17 00:00:00 2001 From: Jocke Date: Wed, 9 Mar 2016 18:26:33 +0100 Subject: [PATCH 10/65] We can now send more data with UDP than previously, the splitting seems to work fine but receiving has some problems. --- include/Engine/Network/Packet.h | 3 +- include/Engine/Network/PlayerDefinition.h | 1 + include/Engine/Network/UDPClient.h | 10 +- include/Engine/Network/UDPServer.h | 2 +- src/Engine/Network/Client.cpp | 14 ++- src/Engine/Network/Packet.cpp | 24 +++- src/Engine/Network/Server.cpp | 1 + src/Engine/Network/UDPClient.cpp | 129 ++++++++++++++++++---- src/Engine/Network/UDPServer.cpp | 31 +++--- 9 files changed, 161 insertions(+), 54 deletions(-) diff --git a/include/Engine/Network/Packet.h b/include/Engine/Network/Packet.h index 6095e6a6..11a1a4bf 100644 --- a/include/Engine/Network/Packet.h +++ b/include/Engine/Network/Packet.h @@ -59,10 +59,11 @@ public: void UpdateSize(); char* ReadData(int SizeOfData); void ChangePacketID(unsigned int& packetID); - void ChangeSequenceNumber(int sequenceNumber, int sequenceLength); + void ChangeSequenceNumber(int sequenceNumber, int sequenceLength, int groupNumber); 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; } diff --git a/include/Engine/Network/PlayerDefinition.h b/include/Engine/Network/PlayerDefinition.h index afd5d889..6ccd1034 100644 --- a/include/Engine/Network/PlayerDefinition.h +++ b/include/Engine/Network/PlayerDefinition.h @@ -14,6 +14,7 @@ struct PlayerDefinition { unsigned short TCPPort; // use for tcp connections boost::shared_ptr TCPSocket; + int PacketGroup = 1; }; #endif diff --git a/include/Engine/Network/UDPClient.h b/include/Engine/Network/UDPClient.h index 94b23080..b2b156e4 100644 --- a/include/Engine/Network/UDPClient.h +++ b/include/Engine/Network/UDPClient.h @@ -1,6 +1,7 @@ #ifndef UDPClient_h__ #define UDPClient_h__ #include +#include #include #include "Network/NetworkClient.h" @@ -15,18 +16,23 @@ public: void 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: // Assio UDP logic boost::asio::io_service m_IOService; boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::shared_ptr m_Socket; + int lastReceivedSnapshotGroup = 0; int readBuffer(); PacketID m_SendPacketID = 0; //map:(packetGroup, vector:(pair:(groupIndex, packetData))) - std::map>>> packetSegmentMap; + std::map>>> m_PacketSegmentMap; + bool hasReceivedPacket(int packetGroup, int groupIndex); }; #endif \ No newline at end of file diff --git a/include/Engine/Network/UDPServer.h b/include/Engine/Network/UDPServer.h index 6b6b7d33..1d37f642 100644 --- a/include/Engine/Network/UDPServer.h +++ b/include/Engine/Network/UDPServer.h @@ -3,7 +3,7 @@ #include "NetworkServer.h" #include -#define MAXPACKETSIZE 32000 +#define MAXPACKETSIZE 64000 class UDPServer : public NetworkServer { diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 2bda83db..9c494cae 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -50,13 +50,15 @@ void Client::Update() { m_EventBroker->Process(); while (m_Unreliable.IsSocketAvailable()) { - // Packet will get real data in receive - Packet packet(MessageType::Invalid); - m_Unreliable.Receive(packet); - if (packet.GetMessageType() == MessageType::Connect) { - parseUDPConnect(packet); + m_Unreliable.ReceivePackets(); + } + // Packet will get real data in GetNextPacket() + Packet parsedPacket(MessageType::Invalid); + while (m_Unreliable.GetNextPacket(parsedPacket)) { + if (parsedPacket.GetMessageType() == MessageType::Connect) { + parseUDPConnect(parsedPacket); } else { - parseMessageType(packet); + parseMessageType(parsedPacket); } } diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index 75b69bd7..3e4bf043 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -3,16 +3,22 @@ Packet::Packet(MessageType type, unsigned int& packetID) { m_Data = new char[m_MaxPacketSize]; - Init(type, packetID, 1, 1 , -1); + Init(type, packetID, 1, 1, -1); } // Create message Packet::Packet(char* data, const size_t sizeOfPacket) { + // Create message header + // allocate memory for size of packet, sequenceNumber and totalPacketesInSequence + m_ReturnDataOffset = 0; + m_Offset = 0; // Resize message m_MaxPacketSize = sizeOfPacket; // Copy data newly allocated memory m_Data = new char[sizeOfPacket]; + unsigned int dummy = 0; + Init(MessageType::Invalid, dummy, 0, 0, 0); memcpy(m_Data, data, sizeOfPacket); m_Offset = sizeOfPacket; } @@ -119,7 +125,7 @@ void Packet::ReconstructFromData(char * data, size_t sizeOfData) void Packet::UpdateSize() { int whatisoffset = m_Offset; - memcpy(m_Data, &m_Offset, sizeof(int)); + memcpy(m_Data + packetSizeOffset, &m_Offset, sizeof(int)); } char * Packet::ReadData(int sizeOfData) @@ -140,10 +146,11 @@ void Packet::ChangePacketID(unsigned int & packetID) memcpy(m_Data + packetIDOffset, &packetID, sizeof(int)); } -void Packet::ChangeSequenceNumber(int groupIndex, int groupSize) +void Packet::ChangeSequenceNumber(int groupIndex, int groupSize, int groupNumber) { - memcpy(&groupIndex, m_Data + groupIndexOffset, sizeof(int)); - memcpy(&groupSize, m_Data + groupSizeOffset, sizeof(int)); + memcpy(m_Data + groupIndexOffset, &groupIndex, sizeof(int)); + memcpy(m_Data + groupSizeOffset, &groupSize, sizeof(int)); + memcpy(m_Data + groupOffset, &groupNumber, sizeof(int)); } MessageType Packet::GetMessageType() @@ -153,6 +160,13 @@ MessageType Packet::GetMessageType() return messagType; } +size_t Packet::Group() +{ + size_t groupNumber; + memcpy(&groupNumber, m_Data + groupOffset, sizeof(int)); + return groupNumber; +} + size_t Packet::GroupIndex() { size_t groupIndex; diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 7a2d58a8..f81e0443 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -171,6 +171,7 @@ void Server::sendSnapshot() Packet packet(MessageType::Snapshot); addInputCommandsToPacket(packet); addPlayersToPacket(packet, EntityID_Invalid); + //addChildrenToPacket(packet, EntityID_Invalid); unreliableBroadcast(packet); } diff --git a/src/Engine/Network/UDPClient.cpp b/src/Engine/Network/UDPClient.cpp index 30690757..dbc4d979 100644 --- a/src/Engine/Network/UDPClient.cpp +++ b/src/Engine/Network/UDPClient.cpp @@ -3,12 +3,10 @@ using namespace boost::asio::ip; UDPClient::UDPClient() -{ -} +{ } UDPClient::~UDPClient() -{ -} +{ } void UDPClient::Connect(std::string playerName, std::string address, int port) { @@ -27,12 +25,18 @@ void UDPClient::Disconnect() void UDPClient::Receive(Packet& packet) { - int bytesRead = readBuffer(); - if (bytesRead > 0) { - packet.ReconstructFromData(m_ReadBuffer, bytesRead); - } + // int bytesRead = readBuffer(); + //if (bytesRead > 0) { + // packet.ReconstructFromData(m_ReadBuffer, bytesRead); + //} } +void UDPClient::ReceivePackets() +{ + readBuffer(); +} + + int UDPClient::readBuffer() { if (!m_Socket) { @@ -40,36 +44,67 @@ int UDPClient::readBuffer() } boost::system::error_code error; // Peek header - m_Socket->receive(boost + m_Socket->receive(boost ::asio::buffer((void*)m_ReadBuffer, 5 * sizeof(int)), - boost::asio::ip::udp::socket::message_peek, error); + boost::asio::ip::udp::socket::message_peek, error); + int sizeOfPacket = 0; memcpy(&sizeOfPacket, m_ReadBuffer, sizeof(int)); - int packetID = 0; - memcpy(&packetID, m_ReadBuffer + 4 * sizeof(int), sizeof(int)); + if (sizeOfPacket == 0) { + return 0; + } + int packetGroup = 0; + memcpy(&packetGroup, m_ReadBuffer + sizeof(int), sizeof(int)); + int packetGroupIndex = 0; + memcpy(&packetGroupIndex, m_ReadBuffer + 2 * sizeof(int), sizeof(int)); + int packetGroupSize = 0; + memcpy(&packetGroupSize, m_ReadBuffer + 3 * sizeof(int), sizeof(int)); + //LOG_INFO("Packet group: %i. Group index: %i. Group size: %i", packetGroup, packetGroupIndex, packetGroupSize); + //LOG_INFO("Packet size: %i.", sizeOfPacket); if (sizeOfPacket > m_Socket->available()) { LOG_WARNING("UDPClient::readBuffer(): We haven't got the whole packet yet."); // return; } // if the buffer is to small increase the size of it - if (sizeOfPacket > m_BufferSize) { - delete[] m_ReadBuffer; - m_ReadBuffer = new char[sizeOfPacket]; - m_BufferSize = sizeOfPacket; - } + boost::shared_ptr packetData(new char[sizeOfPacket]); + // Read the message size_t bytesReceived = m_Socket->receive_from(boost - ::asio::buffer((void*)(m_ReadBuffer), + ::asio::buffer((void*)(packetData.get()), sizeOfPacket), m_ReceiverEndpoint, 0, error); if (error) { - //LOG_ERROR("receive: %s", error.message().c_str()); + LOG_ERROR("receive: %s", error.message().c_str()); + } + // Might want to do this earlier when i figure out a good way to + // remove data from network buffer. + if (hasReceivedPacket(packetGroup, packetGroupIndex)) { + return 0; + } + //std::map>>> packetSegmentMap; + // If group exists + if (m_PacketSegmentMap.find(packetGroup) != m_PacketSegmentMap.end()) { + m_PacketSegmentMap.at(packetGroup).push_back(std::make_pair(packetGroupIndex, std::move(packetData))); + } else { // Create group and add element + m_PacketSegmentMap[packetGroup].push_back(std::make_pair(packetGroupIndex, std::move(packetData))); } - // new char [sizeOfPacket] save in map with packetID as key return bytesReceived; } +bool UDPClient::hasReceivedPacket(int packetGroup, int groupIndex) +{ + if (m_PacketSegmentMap.find(packetGroup) != m_PacketSegmentMap.end()) { + const std::vector>>& loopPacketGroup = m_PacketSegmentMap.at(packetGroup); + for (size_t i = 0; i < loopPacketGroup.size(); i++) { + if (loopPacketGroup.at(i).first == groupIndex) { + return true; + } + } + } + return false; +} + void UDPClient::Send(Packet& packet) { packet.UpdateSize(); @@ -77,7 +112,7 @@ void UDPClient::Send(Packet& packet) packet.Data(), packet.Size()), m_ReceiverEndpoint, 0); -} +} void UDPClient::Broadcast(Packet& packet, int port) { @@ -93,8 +128,56 @@ void UDPClient::Broadcast(Packet& packet, int port) bool UDPClient::IsSocketAvailable() { - if (!m_Socket) { + if (!m_Socket) { return false; } return m_Socket->available(); -} \ No newline at end of file +} + +bool UDPClient::GetNextPacket(Packet & packet) +{ + // A duplicate packet should not be present in the vector! + // Soo we will assume that this is true and only look if size + // of vector is correct. + std::map>>>::iterator it = m_PacketSegmentMap.begin(); + while (it != m_PacketSegmentMap.end()) { + // pair(Group index, packetData) + std::vector>>& currentVector = it->second; + Packet headerInfoPacket(currentVector.at(0).second.get(), packet.HeaderSize()); + int groupSize = headerInfoPacket.GroupSize(); + //LOG_INFO("UDPClient::GetNextPacket: Packet group : %i.Group index : %i.Group size : %i. lastReceivedSnapshotGroup: %i. MessageType(Ples 4): %i", headerInfoPacket.Group(), headerInfoPacket.GroupIndex(), groupSize, lastReceivedSnapshotGroup, headerInfoPacket.GetMessageType()); + //LOG_INFO("UDPClient::GetNextPacket: Packet group : %i.lastReceivedSnapshotGroup: %i. MessageType(Ples 4): %i", headerInfoPacket.Group(), lastReceivedSnapshotGroup, headerInfoPacket.GetMessageType()); + int mapSize = m_PacketSegmentMap.size(); + if (mapSize > 5) { + it = m_PacketSegmentMap.erase(it); + LOG_INFO("The map is increasing in size, size is %i", mapSize); + continue; + } + if (headerInfoPacket.GetMessageType() == MessageType::Snapshot && lastReceivedSnapshotGroup > headerInfoPacket.Group()) { + it = m_PacketSegmentMap.erase(it); + continue; + //LOG_INFO("Deleted old entry"); + } + if (currentVector.size() == groupSize) { + std::sort(currentVector.begin(), currentVector.end()); + // Add the first packet in vector + packet.ReconstructFromData(currentVector.at(0).second.get(), packet.HeaderSize()); + // Add the rest of the packets. + int sizeOfData = 0; + for (size_t i = 0; i < currentVector.size(); i++) { + memcpy(&sizeOfData, currentVector.at(i).second.get(), sizeof(int)); + packet.WriteData(currentVector.at(i).second.get() + packet.HeaderSize(), sizeOfData - packet.HeaderSize()); + } + if (headerInfoPacket.GetMessageType() == MessageType::Snapshot) { + lastReceivedSnapshotGroup = packet.Group(); + } + // No need to get next it as we are returning. + //LOG_INFO("Packet parsed"); + m_PacketSegmentMap.erase(it); + return true; + } else { + ++it; + } + } + return false; +} diff --git a/src/Engine/Network/UDPServer.cpp b/src/Engine/Network/UDPServer.cpp index 6ed95fe0..cf6844d9 100644 --- a/src/Engine/Network/UDPServer.cpp +++ b/src/Engine/Network/UDPServer.cpp @@ -12,22 +12,25 @@ UDPServer::UDPServer(int port) UDPServer::~UDPServer() { } - +// TODO: Fix correct groups void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) { packet.UpdateSize(); try { + //Debug + int debugTheSixeOfpacket = packet.Size(); + //Debug end // Remove header from packet. packet.ReadData(packet.HeaderSize()); - int bytesSent = 0; + int totalBytesSent = 0; int sequenceNumber = 1; - int totalMessages = std::ceil(packet.Size() / MAXPACKETSIZE); + int totalMessages = std::ceil((float)packet.Size() / MAXPACKETSIZE); int packetDataSent = 0; int packetDataSize = packet.Size() - packet.HeaderSize(); + while (packetDataSize > packetDataSent) { - Packet splitPacket(packet.GetMessageType(), playerDefinition.PacketID); - splitPacket.ChangeSequenceNumber(sequenceNumber, totalMessages); + splitPacket.ChangeSequenceNumber(sequenceNumber, totalMessages, playerDefinition.PacketGroup); int amountToSend = packetDataSize - packetDataSent; if (amountToSend > MAXPACKETSIZE) { amountToSend = MAXPACKETSIZE; @@ -36,26 +39,22 @@ void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) splitPacket.UpdateSize(); // Remove header size from bytes sent soo that we only // count data in the packet - - bytesSent += m_Socket->send_to( - boost::asio::buffer(splitPacket.Data() + bytesSent, splitPacket.Size()), + int bytesSent = 0; + bytesSent = m_Socket->send_to( + boost::asio::buffer(splitPacket.Data(), splitPacket.Size()), playerDefinition.Endpoint, 0); - packetDataSent = bytesSent - splitPacket.HeaderSize(); + packetDataSent += bytesSent - splitPacket.HeaderSize(); + totalBytesSent += bytesSent; + // LOG_INFO("bytesSent size %i, groupIndex: %i. Number of packets: %i", bytesSent, sequenceNumber, totalMessages); ++sequenceNumber; - int packetsise = splitPacket.ReadPrimitive(); - int groopOffset = splitPacket.ReadPrimitive(); - int groopIndes = splitPacket.ReadPrimitive(); - int groopSiseOffset = splitPacket.ReadPrimitive(); - int mezzagetype = splitPacket.ReadPrimitive(); - int pakketIDOffset = splitPacket.ReadPrimitive(); } + playerDefinition.PacketGroup++; } catch (const boost::system::system_error& e) { LOG_INFO(e.what()); // TODO: Clean up invalid endpoints out of m_ConnectedPlayers later playerDefinition.Endpoint = boost::asio::ip::udp::endpoint(); } - } // Send back to endpoint of received packet void UDPServer::Send(Packet & packet) From 90b2c702157adc03f20ece999b7e03c469c6e9d6 Mon Sep 17 00:00:00 2001 From: Tleety Date: Wed, 9 Mar 2016 19:12:06 +0100 Subject: [PATCH 11/65] Some sprite fixes --- src/Engine/Rendering/BlurHUD.cpp | 10 +++++++--- src/Engine/Rendering/DrawFinalPass.cpp | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Engine/Rendering/BlurHUD.cpp b/src/Engine/Rendering/BlurHUD.cpp index 8fdb7f1a..d9af3085 100644 --- a/src/Engine/Rendering/BlurHUD.cpp +++ b/src/Engine/Rendering/BlurHUD.cpp @@ -97,14 +97,14 @@ void BlurHUD::ClearBuffer() glClearStencil(0x00); glStencilMask(~0); glDisable(GL_SCISSOR_TEST); - glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); m_GaussianFrameBuffer_horiz.Unbind(); m_GaussianFrameBuffer_vert.Bind(); glClearColor(0.f, 0.f, 0.f, 0.f); glClearStencil(0x00); glStencilMask(~0); glDisable(GL_SCISSOR_TEST); - glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); m_GaussianFrameBuffer_vert.Unbind(); m_CombinedTextureBuffer.Bind(); @@ -211,12 +211,16 @@ void BlurHUD::FillStencil(RenderScene& scene) RenderState state; state.BindFramebuffer(m_GaussianFrameBuffer_horiz.GetHandle()); - state.Disable(GL_DEPTH_TEST); + state.Enable(GL_DEPTH_TEST); state.Enable(GL_CULL_FACE); state.Enable(GL_STENCIL_TEST); state.StencilFunc(GL_ALWAYS, 1, 0xFF); state.StencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); state.StencilMask(0xFF); + + state.AlphaFunc(GL_GEQUAL, 0.95f); + state.Enable(GL_ALPHA_TEST); + glViewport(0, 0, m_Renderer->GetViewportSize().Width/m_BlurQuality, m_Renderer->GetViewportSize().Height/m_BlurQuality); m_FillDepthStencilProgram->Bind(); diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index dce4ea05..c57ff1c9 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -302,6 +302,8 @@ void DrawFinalPass::Draw(RenderScene& scene, BlurHUD* blurHUDPass) GLERROR("TransparentObjects"); //state->BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); stateSprite->Enable(GL_DEPTH_TEST); + stateSprite->AlphaFunc(GL_GEQUAL, 0.05f); + stateSprite->Enable(GL_ALPHA_TEST); DrawSprites(scene.Jobs.SpriteJob, scene); GLERROR("SpriteJobs"); From 5a7034dfcdc47a468206f3a0396c0846ed723355 Mon Sep 17 00:00:00 2001 From: Jocke Date: Wed, 9 Mar 2016 19:43:18 +0100 Subject: [PATCH 12/65] popped the right amount of the header --- src/Engine/Network/Client.cpp | 7 ++++++- src/Engine/Network/Server.cpp | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 9caabdab..05141302 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -188,6 +188,7 @@ void Client::parseTCPConnect(Packet& packet) // Add player id and other stuff packet.WritePrimitive(m_PlayerID); m_Unreliable.Send(packet); + // LOG_INFO("Sent UDP Connect Server"); } @@ -216,6 +217,9 @@ void Client::parseServerlist(Packet& packet) { // Pop packetSize, group, groupIndex and groupSize. popNetworkSegmentOfHeader(packet); + packet.ReadPrimitive(); + packet.ReadPrimitive(); + std::string address = packet.ReadString(); int port = packet.ReadPrimitive(); std::string serverName = packet.ReadString(); @@ -479,7 +483,7 @@ bool Client::OnInputCommand(const Events::InputCommand & e) if (e.Command == "ConnectToServer") { // Connect for now if (e.Value > 0) { - //m_Reliable.Connect(m_PlayerName, m_Address, m_Port); + m_Reliable.Connect(m_PlayerName, m_Address, m_Port); m_Unreliable.Connect(m_PlayerName, m_Address, m_Port); } //LOG_DEBUG("Client::OnInputCommand: Command is %s. Value is %f. PlayerID is %i.", e.Command.c_str(), e.Value, e.PlayerID); @@ -557,6 +561,7 @@ bool Client::OnConnectRequest(const Events::ConnectRequest& e) { removeWorld(); if (m_Reliable.Connect(m_PlayerName, e.IP, e.Port)) { + m_Unreliable.Connect(m_PlayerName, m_Address, m_Port); // The client sent a successful connect message return true; diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index ce96427b..ba5295b7 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -69,7 +69,11 @@ void Server::Update() localArea.Endpoint = boost::asio::ip::udp::endpoint(); m_ServerlistRequest.Receive(packet, localArea); if (packet.GetMessageType() == MessageType::ServerlistRequest) { + // Pop header popNetworkSegmentOfHeader(packet); + packet.ReadPrimitive(); + packet.ReadPrimitive(); + int port = packet.ReadPrimitive(); std::string address = localArea.Endpoint.address().to_string(); parseServerlistRequest(boost::asio::ip::udp::endpoint(boost::asio::ip::address().from_string(address), port)); From 8936b3d6c3af82f8f2f0b018fb550048d274e84b Mon Sep 17 00:00:00 2001 From: William Moberg Date: Wed, 9 Mar 2016 19:45:26 +0100 Subject: [PATCH 13/65] Probably fixed all the jittering, won't need the jitter guard anymore. --- resources/Schema/Components/Collidable.xml | 1 - resources/Schema/Components/Collidable.xsd | 5 ----- src/Engine/Collision/Collision.cpp | 1 + src/Engine/Collision/CollisionSystem.cpp | 6 ++---- src/Game/Systems/PlayerMovementSystem.cpp | 12 ++++-------- 5 files changed, 7 insertions(+), 18 deletions(-) diff --git a/resources/Schema/Components/Collidable.xml b/resources/Schema/Components/Collidable.xml index 7bd60939..9046ea99 100644 --- a/resources/Schema/Components/Collidable.xml +++ b/resources/Schema/Components/Collidable.xml @@ -1,4 +1,3 @@ - true \ No newline at end of file diff --git a/resources/Schema/Components/Collidable.xsd b/resources/Schema/Components/Collidable.xsd index 2dd49a20..93f7ac24 100644 --- a/resources/Schema/Components/Collidable.xsd +++ b/resources/Schema/Components/Collidable.xsd @@ -7,10 +7,5 @@ Needs a Model or AABB component to work, uses AABB if both are attached. - - - - - \ No newline at end of file diff --git a/src/Engine/Collision/Collision.cpp b/src/Engine/Collision/Collision.cpp index 68d99d92..31768efd 100644 --- a/src/Engine/Collision/Collision.cpp +++ b/src/Engine/Collision/Collision.cpp @@ -470,6 +470,7 @@ bool AABBvsTriangle(const AABB& box, } 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) { diff --git a/src/Engine/Collision/CollisionSystem.cpp b/src/Engine/Collision/CollisionSystem.cpp index 8333a9ae..1c52209f 100644 --- a/src/Engine/Collision/CollisionSystem.cpp +++ b/src/Engine/Collision/CollisionSystem.cpp @@ -66,7 +66,7 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c } } } - bool& jitterGuard = (bool&)entity["Collidable"]["JitterGuard"]; + // Collide against octree items m_OctreeResult.clear(); m_Octree->ObjectsInSameRegion(*boundingBox, m_OctreeResult); @@ -88,12 +88,11 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c glm::mat4 modelMatrix = Transform::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)) { //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"] += jitterGuard && notMovingxz ? prevPosIt->second - boxA.Origin() : resolutionVector; + (glm::vec3&)cTransform["Position"] += resolutionVector; boxA = *Collision::EntityAbsoluteAABB(entity); cPhysics["Velocity"] = inOutVelocity; if (isOnGround) { @@ -118,7 +117,6 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c (bool)cPhysics["IsOnGround"] = false; } - jitterGuard = true; m_PrevPositions[entity] = boxA.Origin(); } } diff --git a/src/Game/Systems/PlayerMovementSystem.cpp b/src/Game/Systems/PlayerMovementSystem.cpp index b0ad37ea..743a8af2 100644 --- a/src/Game/Systems/PlayerMovementSystem.cpp +++ b/src/Game/Systems/PlayerMovementSystem.cpp @@ -273,14 +273,10 @@ void PlayerMovementSystem::updateMovementControllers(double dt) size = glm::vec3(1.f, 1.f, 1.f); } else { size = glm::vec3(1.f, 1.6f, 1.f); - if (controller->CrouchingLastFrame() && player.HasComponent("Collidable")) { - // Disable jitter guard so player doesn't get stuck in the ground. - (bool&)player["Collidable"]["JitterGuard"] = false; - if (isOnGround) { - // The collision should resolve this anyway, but - // this is more reliable, since the box gets larger. - ((glm::vec3&)cTransform["Position"]).y += 0.3f; - } + if (controller->CrouchingLastFrame() && isOnGround) { + // The collision should resolve this anyway, but + // this is more reliable, since the box gets larger. + ((glm::vec3&)cTransform["Position"]).y += 0.3f; } } } From 2e5dfc609a114ac0eafc235289d92c514af46f15 Mon Sep 17 00:00:00 2001 From: FakeShemp Date: Wed, 9 Mar 2016 19:51:57 +0100 Subject: [PATCH 14/65] support headshot icons --- src/Engine/Rendering/TextPass.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Engine/Rendering/TextPass.cpp b/src/Engine/Rendering/TextPass.cpp index a38fe4d1..705f0ab6 100644 --- a/src/Engine/Rendering/TextPass.cpp +++ b/src/Engine/Rendering/TextPass.cpp @@ -108,8 +108,12 @@ std::string TextPass::parseColors(std::string text, std::map& co } } - if (*(c + 1) >= '1' && *(c + 1) <= '9') { // Icons - parsedString.replace(c, (c + 2), 1, (*(c + 1) - 48)); + if ((*(c + 1) >= '1' && *(c + 1) <= '9') || *(c + 1) <= 'B' || *(c + 1) <= 'E' || *(c + 1) <= 'F') { // Icons + if (*(c + 1) >= '1' && *(c + 1) <= '9') { + parsedString.replace(c, (c + 2), 1, (*(c + 1) - 48)); + } else { + parsedString.replace(c, (c + 2), 1, (*(c + 1) - 55)); + } } if (colorChange) { From 37355b1afc44bfb0e4e5cb6965751df9d3a71e93 Mon Sep 17 00:00:00 2001 From: Jocke Date: Wed, 9 Mar 2016 20:12:08 +0100 Subject: [PATCH 15/65] Hot fix --- src/Engine/Network/Client.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 05141302..62fee514 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -561,7 +561,7 @@ bool Client::OnConnectRequest(const Events::ConnectRequest& e) { removeWorld(); if (m_Reliable.Connect(m_PlayerName, e.IP, e.Port)) { - m_Unreliable.Connect(m_PlayerName, m_Address, m_Port); + m_Unreliable.Connect(m_PlayerName, e.IP, e.Port); // The client sent a successful connect message return true; From 42af029a265241a30d2a3e4e808a03066263e995 Mon Sep 17 00:00:00 2001 From: FakeShemp Date: Wed, 9 Mar 2016 21:25:51 +0100 Subject: [PATCH 16/65] fix baggu --- src/Engine/Rendering/TextPass.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Engine/Rendering/TextPass.cpp b/src/Engine/Rendering/TextPass.cpp index 705f0ab6..fb177ed6 100644 --- a/src/Engine/Rendering/TextPass.cpp +++ b/src/Engine/Rendering/TextPass.cpp @@ -108,7 +108,7 @@ std::string TextPass::parseColors(std::string text, std::map& co } } - if ((*(c + 1) >= '1' && *(c + 1) <= '9') || *(c + 1) <= 'B' || *(c + 1) <= 'E' || *(c + 1) <= 'F') { // Icons + if ((*(c + 1) >= '1' && *(c + 1) <= '9') || *(c + 1) == 'B' || *(c + 1) == 'E' || *(c + 1) == 'F') { // Icons if (*(c + 1) >= '1' && *(c + 1) <= '9') { parsedString.replace(c, (c + 2), 1, (*(c + 1) - 48)); } else { From 981dc3467e8be2e21309ed5af81c8683bdcbd235 Mon Sep 17 00:00:00 2001 From: FakeShemp Date: Wed, 9 Mar 2016 22:11:17 +0100 Subject: [PATCH 17/65] Baggu fixed again +Bonus document formatted --- src/Engine/Rendering/TextPass.cpp | 253 ++++++++++++++++-------------- 1 file changed, 131 insertions(+), 122 deletions(-) diff --git a/src/Engine/Rendering/TextPass.cpp b/src/Engine/Rendering/TextPass.cpp index fb177ed6..cb21e01d 100644 --- a/src/Engine/Rendering/TextPass.cpp +++ b/src/Engine/Rendering/TextPass.cpp @@ -7,23 +7,23 @@ TextPass::TextPass() void TextPass::Initialize() { - glGenVertexArrays(1, &VAO); - glGenBuffers(1, &VBO); - glBindVertexArray(VAO); - glBindBuffer(GL_ARRAY_BUFFER, VBO); - glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 6 * 4, NULL, GL_DYNAMIC_DRAW); - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), 0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); - - m_TextProgram = ResourceManager::Load("#TextProgram"); - m_TextProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/Text.vert.glsl"))); - m_TextProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/Text.frag.glsl"))); - m_TextProgram->Compile(); - m_TextProgram->BindFragDataLocation(0, "sceneColor"); - m_TextProgram->BindFragDataLocation(1, "bloomColor"); - m_TextProgram->Link(); + glGenVertexArrays(1, &VAO); + glGenBuffers(1, &VBO); + glBindVertexArray(VAO); + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 6 * 4, NULL, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + + m_TextProgram = ResourceManager::Load("#TextProgram"); + m_TextProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/Text.vert.glsl"))); + m_TextProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/Text.frag.glsl"))); + m_TextProgram->Compile(); + m_TextProgram->BindFragDataLocation(0, "sceneColor"); + m_TextProgram->BindFragDataLocation(1, "bloomColor"); + m_TextProgram->Link(); } void TextPass::Update() @@ -33,17 +33,17 @@ void TextPass::Update() void TextPass::Draw(RenderScene& scene, FrameBuffer& frameBuffer) { - GLERROR("Derp1"); - TextPassState* state = new TextPassState(frameBuffer.GetHandle()); - for (auto &job : scene.Jobs.Text) { - auto textJob = std::dynamic_pointer_cast(job); - if (textJob) { + GLERROR("Derp1"); + TextPassState* state = new TextPassState(frameBuffer.GetHandle()); + for (auto &job : scene.Jobs.Text) { + auto textJob = std::dynamic_pointer_cast(job); + if (textJob) { - renderText(textJob->Content, textJob->Resource, textJob->Alignment, textJob->Color, textJob->Matrix, scene.Camera->ProjectionMatrix(), scene.Camera->ViewMatrix()); - } - } - GLERROR("Derp2"); - delete state; + renderText(textJob->Content, textJob->Resource, textJob->Alignment, textJob->Color, textJob->Matrix, scene.Camera->ProjectionMatrix(), scene.Camera->ViewMatrix()); + } + } + GLERROR("Derp2"); + delete state; } std::string TextPass::parseColors(std::string text, std::map& colorChanges, glm::vec4 originalColor) @@ -54,70 +54,77 @@ std::string TextPass::parseColors(std::string text, std::map& co for (std::string::const_iterator c = parsedString.begin(); c != parsedString.end(); c++) { if (*c == char(92)) { // Backlash - if (*(c + 1) == char('C')) { // C for Color - bool hasCorrectFormat = true; + if ((c + 1) != parsedString.end()) { + if (*(c + 1) == char('C')) { // C for Color + if ((c + 7) != parsedString.end()) { + bool hasCorrectFormat = true; - for (std::string::const_iterator colorC = c + 2; colorC != c + 8; colorC++) { - if (*colorC < '0' || *colorC > 'F') { - hasCorrectFormat = false; - break; + for (std::string::const_iterator colorC = c + 2; colorC != c + 8; colorC++) { + if (*colorC < '0' || *colorC > 'F') { + hasCorrectFormat = false; + break; + } + } + + if (hasCorrectFormat == true) { + colorChange = true; + + std::array hexToInt = { + std::stoi(std::string(c + 2, c + 4), 0, 16), + std::stoi(std::string(c + 4, c + 6), 0, 16), + std::stoi(std::string(c + 6, c + 8), 0, 16) + }; + + newColor = glm::vec4( + float(hexToInt[0]) / 255.f, + float(hexToInt[1]) / 255.f, + float(hexToInt[2]) / 255.f, + newColor.a); + + parsedString.erase(c, (c + 8)); + } } } - if (hasCorrectFormat == true) { - colorChange = true; + if (*(c + 1) == char('A')) { // A for Alpha + if ((c + 3) != parsedString.end()) { + bool hasCorrectFormat = true; - std::array hexToInt = { - std::stoi(std::string(c + 2, c + 4), 0, 16), - std::stoi(std::string(c + 4, c + 6), 0, 16), - std::stoi(std::string(c + 6, c + 8), 0, 16) - }; + for (std::string::const_iterator colorC = c + 2; colorC != c + 4; colorC++) { + if (*colorC < '0' || *colorC > 'F') { + hasCorrectFormat = false; + break; + } + } - newColor = glm::vec4( - float(hexToInt[0]) / 255.f, - float(hexToInt[1]) / 255.f, - float(hexToInt[2]) / 255.f, - newColor.a); + if (hasCorrectFormat == true) { + colorChange = true; - parsedString.erase(c, (c + 8)); - } - } + int hexToInt = std::stoi(std::string(c + 2, c + 4), 0, 16); - if (*(c + 1) == char('A')) { // A for Alpha - bool hasCorrectFormat = true; + newColor = glm::vec4( + newColor.r, + newColor.g, + newColor.b, + float(hexToInt) / 255.f); - for (std::string::const_iterator colorC = c + 2; colorC != c + 4; colorC++) { - if (*colorC < '0' || *colorC > 'F') { - hasCorrectFormat = false; - break; - } - - if (hasCorrectFormat == true) { - colorChange = true; - - int hexToInt = std::stoi(std::string(c + 2, c + 4), 0, 16); - - newColor = glm::vec4( - newColor.r, - newColor.g, - newColor.b, - float(hexToInt) / 255.f); - - parsedString.erase(c, (c + 4)); + parsedString.erase(c, (c + 4)); + } } } - } - if ((*(c + 1) >= '1' && *(c + 1) <= '9') || *(c + 1) == 'B' || *(c + 1) == 'E' || *(c + 1) == 'F') { // Icons - if (*(c + 1) >= '1' && *(c + 1) <= '9') { - parsedString.replace(c, (c + 2), 1, (*(c + 1) - 48)); - } else { - parsedString.replace(c, (c + 2), 1, (*(c + 1) - 55)); + if ((*(c + 1) >= '1' && *(c + 1) <= '9') || *(c + 1) == 'B' || *(c + 1) == 'E' || *(c + 1) == 'F') { // Icons + if (*(c + 1) >= '1' && *(c + 1) <= '9') { + parsedString.replace(c, (c + 2), 1, (*(c + 1) - 48)); + } + else { + parsedString.replace(c, (c + 2), 1, (*(c + 1) - 55)); + } } - } - if (colorChange) { - colorChanges[c - parsedString.begin()] = newColor; + if (colorChange) { + colorChanges[c - parsedString.begin()] = newColor; + } } } } @@ -129,11 +136,11 @@ std::string TextPass::parseColors(std::string text, std::map& co void TextPass::renderText(std::string text, Font* font, TextJob::AlignmentEnum alignment, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix) { - GLfloat penX = 0; - GLfloat penY = 0; - GLfloat scale = 1.0/font->FontSize; + GLfloat penX = 0; + GLfloat penY = 0; + GLfloat scale = 1.0 / font->FontSize; - GLfloat stringWidth = 0.f; + GLfloat stringWidth = 0.f; std::map colorChanges; std::string parsedText = parseColors(text, colorChanges, color); @@ -143,61 +150,63 @@ void TextPass::renderText(std::string text, Font* font, TextJob::AlignmentEnum a stringWidth += (ch.Advance >> 6) * scale; } - if(alignment == TextJob::AlignmentEnum::Center) { - penX = -stringWidth/2.f; - } else if (alignment == TextJob::AlignmentEnum::Right) { - penX = -stringWidth; - } else { - penX = 0; - } - - - - m_TextProgram->Bind(); - glUniform4fv(glGetUniformLocation(m_TextProgram->GetHandle(), "textColor"), 1, glm::value_ptr(color)); - glUniformMatrix4fv(glGetUniformLocation(m_TextProgram->GetHandle(), "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); - glUniformMatrix4fv(glGetUniformLocation(m_TextProgram->GetHandle(), "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); - glUniformMatrix4fv(glGetUniformLocation(m_TextProgram->GetHandle(), "P"), 1, GL_FALSE, glm::value_ptr(projectionMatrix)); - glActiveTexture(GL_TEXTURE0); - glBindVertexArray(VAO); + if (alignment == TextJob::AlignmentEnum::Center) { + penX = -stringWidth / 2.f; + } + else if (alignment == TextJob::AlignmentEnum::Right) { + penX = -stringWidth; + } + else { + penX = 0; + } - for (std::string::const_iterator c = parsedText.begin(); c != parsedText.end(); c++) { + + m_TextProgram->Bind(); + glUniform4fv(glGetUniformLocation(m_TextProgram->GetHandle(), "textColor"), 1, glm::value_ptr(color)); + glUniformMatrix4fv(glGetUniformLocation(m_TextProgram->GetHandle(), "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); + glUniformMatrix4fv(glGetUniformLocation(m_TextProgram->GetHandle(), "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); + glUniformMatrix4fv(glGetUniformLocation(m_TextProgram->GetHandle(), "P"), 1, GL_FALSE, glm::value_ptr(projectionMatrix)); + glActiveTexture(GL_TEXTURE0); + glBindVertexArray(VAO); + + + for (std::string::const_iterator c = parsedText.begin(); c != parsedText.end(); c++) { auto it = colorChanges.find(c - parsedText.begin()); if (it != colorChanges.end()) { glUniform4fv(glGetUniformLocation(m_TextProgram->GetHandle(), "textColor"), 1, glm::value_ptr(it->second)); } - Font::Character ch = font->m_Characters[*c]; + Font::Character ch = font->m_Characters[*c]; - GLfloat xpos = penX + ch.Bearing.x * scale; - GLfloat ypos = penY - (ch.Size.y - ch.Bearing.y) * scale; + GLfloat xpos = penX + ch.Bearing.x * scale; + GLfloat ypos = penY - (ch.Size.y - ch.Bearing.y) * scale; - GLfloat w = ch.Size.x * scale; - GLfloat h = ch.Size.y * scale; + GLfloat w = ch.Size.x * scale; + GLfloat h = ch.Size.y * scale; - GLfloat vertices[6][4] = { - { xpos, ypos + h, 0.0, 0.0 }, - { xpos, ypos, 0.0, 1.0 }, - { xpos + w, ypos, 1.0, 1.0 }, + GLfloat vertices[6][4] = { + { xpos, ypos + h, 0.0, 0.0 }, + { xpos, ypos, 0.0, 1.0 }, + { xpos + w, ypos, 1.0, 1.0 }, - { xpos, ypos + h, 0.0, 0.0 }, - { xpos + w, ypos, 1.0, 1.0 }, - { xpos + w, ypos + h, 1.0, 0.0 } - }; + { xpos, ypos + h, 0.0, 0.0 }, + { xpos + w, ypos, 1.0, 1.0 }, + { xpos + w, ypos + h, 1.0, 0.0 } + }; - glBindTexture(GL_TEXTURE_2D, ch.TextureID); + glBindTexture(GL_TEXTURE_2D, ch.TextureID); - glBindBuffer(GL_ARRAY_BUFFER, VBO); - glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glDrawArrays(GL_TRIANGLES, 0, 6); - penX += (ch.Advance >> 6) * scale; // Bitshift by 6 to get value in pixels (2^6 = 64) - } - glBindVertexArray(0); - glBindTexture(GL_TEXTURE_2D, 0); + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glDrawArrays(GL_TRIANGLES, 0, 6); + penX += (ch.Advance >> 6) * scale; // Bitshift by 6 to get value in pixels (2^6 = 64) + } + glBindVertexArray(0); + glBindTexture(GL_TEXTURE_2D, 0); - GLERROR("Text rendering Error"); + GLERROR("Text rendering Error"); } From 087facc22ebe4e0d8713f408d3b37b6a08a36936 Mon Sep 17 00:00:00 2001 From: Tleety Date: Wed, 9 Mar 2016 22:22:32 +0100 Subject: [PATCH 18/65] Textures are now able to keep their scale even though the sprite is scaled. --- include/Engine/Rendering/SpriteJob.h | 9 +++++++++ resources/Schema/Components/Sprite.xml | 2 ++ resources/Schema/Components/Sprite.xsd | 6 ++++++ resources/Shaders/Sprite.frag.glsl | 13 ++++++++----- src/Engine/Rendering/DrawFinalPass.cpp | 2 ++ src/Engine/Rendering/TextureSprite.cpp | 4 ++-- 6 files changed, 29 insertions(+), 7 deletions(-) diff --git a/include/Engine/Rendering/SpriteJob.h b/include/Engine/Rendering/SpriteJob.h index c323fa06..596e37f2 100644 --- a/include/Engine/Rendering/SpriteJob.h +++ b/include/Engine/Rendering/SpriteJob.h @@ -48,6 +48,13 @@ struct SpriteJob : RenderJob FillColor = fillColor; FillPercentage = fillPercentage; + + if((bool)cSprite["KeepRatioX"] == true) { + ScaleX = Transform::AbsoluteScale(world, cSprite.EntityID).x; + } + if ((bool)cSprite["KeepRatioZ"] == true) { + ScaleY = Transform::AbsoluteScale(world, cSprite.EntityID).y; + } }; unsigned int TextureID; @@ -69,6 +76,8 @@ struct SpriteJob : RenderJob bool Pickable; bool IsIndicator = false; bool BlurBackground = false; + float ScaleX = 1; + float ScaleY = 1; glm::vec4 FillColor = glm::vec4(0); float FillPercentage = 0.0; diff --git a/resources/Schema/Components/Sprite.xml b/resources/Schema/Components/Sprite.xml index e577ac96..19cd1313 100644 --- a/resources/Schema/Components/Sprite.xml +++ b/resources/Schema/Components/Sprite.xml @@ -5,5 +5,7 @@ true true + false + false false diff --git a/resources/Schema/Components/Sprite.xsd b/resources/Schema/Components/Sprite.xsd index e26d71c9..e727040c 100644 --- a/resources/Schema/Components/Sprite.xsd +++ b/resources/Schema/Components/Sprite.xsd @@ -24,6 +24,12 @@ Whether the sprite should be sorted with depth or not. Only use false for textures that are on HUD + + Wether the sprite should repeat in x instead of stretch when scaled. + + + Wether the sprite should repeat in y instead of stretch when scaled. + Wether the background should be blurred begind this sprite. diff --git a/resources/Shaders/Sprite.frag.glsl b/resources/Shaders/Sprite.frag.glsl index abad7df1..5b6567eb 100644 --- a/resources/Shaders/Sprite.frag.glsl +++ b/resources/Shaders/Sprite.frag.glsl @@ -3,6 +3,8 @@ uniform vec4 Color; uniform vec4 FillColor; uniform float FillPercentage; +uniform float ScaleX; +uniform float ScaleY; uniform mat4 P; layout (binding = 1) uniform sampler2D DiffuseTexture; @@ -21,15 +23,16 @@ out vec4 bloomColor; void main() { - vec4 diffuseTexel = texture2D(DiffuseTexture, Input.TextureCoordinate); - vec4 glowTexel = texture2D(GlowMapTexture, Input.TextureCoordinate); + vec4 diffuseTexel = texture2D(DiffuseTexture, vec2(Input.TextureCoordinate.x*ScaleX, Input.TextureCoordinate.y*ScaleY)); + vec4 glowTexel = texture2D(GlowMapTexture, vec2(Input.TextureCoordinate.x*ScaleX, Input.TextureCoordinate.y*ScaleY)); vec4 color_result = Color * diffuseTexel; float pos = ((P * vec4(Input.Position, 1)).y + 1.0)/2.0; - if(pos <= FillPercentage) { - color_result = FillColor*diffuseTexel.a; - } + float fillResult = floor(pos*FillPercentage); + + color_result = FillColor*diffuseTexel.a*fillResult + color_result*(1-fillResult); + sceneColor = vec4(color_result.xyz, clamp(color_result.a, 0, 1)); //bloomColor = vec4(clamp((glowTexel.xyz*3) - 1.0, 0, 100), 1.0); diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index 81afd852..62ce846d 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -1284,6 +1284,8 @@ void DrawFinalPass::DrawSprites(std::list>&jobs, Rend glUniform4fv(glGetUniformLocation(shaderHandle, "Color"), 1, glm::value_ptr(spriteJob->Color)); glUniform4fv(glGetUniformLocation(shaderHandle, "FillColor"), 1, glm::value_ptr(spriteJob->FillColor)); glUniform1f(glGetUniformLocation(shaderHandle, "FillPercentage"), spriteJob->FillPercentage); + glUniform1f(glGetUniformLocation(shaderHandle, "ScaleX"), spriteJob->ScaleX); + glUniform1f(glGetUniformLocation(shaderHandle, "ScaleY"), spriteJob->ScaleY); glActiveTexture(GL_TEXTURE1); if (spriteJob->DiffuseTexture != nullptr) { diff --git a/src/Engine/Rendering/TextureSprite.cpp b/src/Engine/Rendering/TextureSprite.cpp index 178aebf0..2a43e455 100644 --- a/src/Engine/Rendering/TextureSprite.cpp +++ b/src/Engine/Rendering/TextureSprite.cpp @@ -3,8 +3,8 @@ TextureSprite::TextureSprite(std::string path) :Texture(path) { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST_MIPMAP_NEAREST); GLERROR("Texture load"); From 592edf7dba7a031c892892c8848c00d20b7853d7 Mon Sep 17 00:00:00 2001 From: Tleety Date: Wed, 9 Mar 2016 23:31:54 +0100 Subject: [PATCH 19/65] Sprites can now be rendered with the texture ratio in mind --- assets | 2 +- include/Engine/Rendering/SpriteJob.h | 17 ++++++++++++++--- resources/Schema/Components/Sprite.xml | 1 + resources/Schema/Components/Sprite.xsd | 3 +++ src/Engine/Rendering/DrawFinalPass.cpp | 4 ++-- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/assets b/assets index 3af64d8b..85d96f6f 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 3af64d8b1f8cdf3e20198b079dfc02f6d64fdc88 +Subproject commit 85d96f6f3d2269e46962492f9713ec67c54e8ece diff --git a/include/Engine/Rendering/SpriteJob.h b/include/Engine/Rendering/SpriteJob.h index 596e37f2..6b52144f 100644 --- a/include/Engine/Rendering/SpriteJob.h +++ b/include/Engine/Rendering/SpriteJob.h @@ -49,11 +49,22 @@ struct SpriteJob : RenderJob FillColor = fillColor; FillPercentage = fillPercentage; + glm::vec3 scale = Transform::AbsoluteScale(world, cSprite.EntityID); + if((bool)cSprite["KeepRatioX"] == true) { - ScaleX = Transform::AbsoluteScale(world, cSprite.EntityID).x; + ScaleX = scale.x; } - if ((bool)cSprite["KeepRatioZ"] == true) { - ScaleY = Transform::AbsoluteScale(world, cSprite.EntityID).y; + if ((bool)cSprite["KeepRatioY"] == true) { + ScaleY = scale.y; + } + if((bool)cSprite["KeepRatio"] == true) { + if(scale.y >= scale.x) { + ScaleY = (scale.x)/(scale.y); + ScaleX = 1; + } else { + ScaleY = 1; + ScaleX = (scale.x)/(scale.y); + } } }; diff --git a/resources/Schema/Components/Sprite.xml b/resources/Schema/Components/Sprite.xml index 19cd1313..2c0465e9 100644 --- a/resources/Schema/Components/Sprite.xml +++ b/resources/Schema/Components/Sprite.xml @@ -7,5 +7,6 @@ true false false + false false diff --git a/resources/Schema/Components/Sprite.xsd b/resources/Schema/Components/Sprite.xsd index e727040c..eab74bfc 100644 --- a/resources/Schema/Components/Sprite.xsd +++ b/resources/Schema/Components/Sprite.xsd @@ -30,6 +30,9 @@ Wether the sprite should repeat in y instead of stretch when scaled. + + Keep a 1:1 ratio between X and Y. + Wether the background should be blurred begind this sprite. diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index 62ce846d..c5b8c591 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -311,8 +311,8 @@ void DrawFinalPass::Draw(RenderScene& scene, BlurHUD* blurHUDPass) GLERROR("TransparentObjects"); //state->BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); stateSprite->Enable(GL_DEPTH_TEST); - stateSprite->AlphaFunc(GL_GEQUAL, 0.05f); - stateSprite->Enable(GL_ALPHA_TEST); + //stateSprite->AlphaFunc(GL_GEQUAL, 0.05f); + //stateSprite->Enable(GL_ALPHA_TEST); DrawSprites(scene.Jobs.SpriteJob, scene); GLERROR("SpriteJobs"); From b0e9cd3965c152e509c53df298f873f5d62c62c4 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 10 Mar 2016 10:47:58 +0100 Subject: [PATCH 20/65] Forgot one console spammer --- src/Engine/Rendering/AnimationSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Engine/Rendering/AnimationSystem.cpp b/src/Engine/Rendering/AnimationSystem.cpp index ad61da69..fad64d77 100644 --- a/src/Engine/Rendering/AnimationSystem.cpp +++ b/src/Engine/Rendering/AnimationSystem.cpp @@ -132,7 +132,7 @@ void AnimationSystem::UpdateWeights(double dt) if(it->second.HasActiveBlendJob()) { AutoBlendQueue::AutoBlendJob& blendJob = it->second.GetActiveBlendJob(); - LOG_INFO("%s", blendJob.RootNode.Name().c_str()); + //LOG_INFO("%s", blendJob.RootNode.Name().c_str()); std::shared_ptr blendTree = it->second.GetBlendTree(); if (blendTree != nullptr) { if (blendJob.Duration != 0.0) { From a0d60160dd0b8306c1641a6cc3c5719bc783b640 Mon Sep 17 00:00:00 2001 From: Jocke Date: Thu, 10 Mar 2016 10:58:26 +0100 Subject: [PATCH 21/65] Increased size of socket buffer --- include/Engine/Network/Packet.h | 3 +- resources/Schema/Entities/CP_Rocky2.xml | 7306 +++++++++++------------ src/Engine/Network/UDPClient.cpp | 2 + 3 files changed, 3657 insertions(+), 3654 deletions(-) diff --git a/include/Engine/Network/Packet.h b/include/Engine/Network/Packet.h index 11a1a4bf..c885e59a 100644 --- a/include/Engine/Network/Packet.h +++ b/include/Engine/Network/Packet.h @@ -27,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(); } diff --git a/resources/Schema/Entities/CP_Rocky2.xml b/resources/Schema/Entities/CP_Rocky2.xml index 93b7fd77..bbe42a1a 100644 --- a/resources/Schema/Entities/CP_Rocky2.xml +++ b/resources/Schema/Entities/CP_Rocky2.xml @@ -30,6 +30,17 @@ + + + + + 2 + Models/Props/Walls/SciFiWallMedium.mesh + + + + + @@ -76,17 +87,6 @@ - - - - - 2 - Models/Props/Walls/SciFiWallMedium.mesh - - - - - @@ -684,6 +684,19 @@ + + + + + Models/Highgrounds/Hg20.mesh + + + + + + + + @@ -784,19 +797,6 @@ - - - - - Models/Highgrounds/Hg20.mesh - - - - - - - - @@ -1607,11 +1607,11 @@ 12 - + - + @@ -1661,11 +1661,11 @@ 12 - + - + @@ -1730,11 +1730,11 @@ 12 - + - + @@ -2779,6 +2779,164 @@ + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + @@ -2966,6 +3124,20 @@ + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + @@ -3305,19 +3477,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - @@ -3331,20 +3490,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3359,19 +3504,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -3385,19 +3517,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3412,19 +3531,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3439,19 +3545,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3465,19 +3558,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -3492,19 +3572,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -3518,19 +3585,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3545,19 +3599,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -3571,20 +3612,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3598,19 +3625,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -3625,20 +3639,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -3646,6 +3646,19 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -3672,19 +3685,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -3717,8 +3717,8 @@ Models/Props/PickUps/PickUpHolder.mesh - - + + @@ -3727,11 +3727,11 @@ 2 - + - + @@ -3749,55 +3749,7 @@ - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - + @@ -3823,11 +3775,11 @@ 2 - + - + @@ -3845,7 +3797,7 @@ - + @@ -3861,7 +3813,7 @@ Models/Props/PickUps/PickUpHolder.mesh - + @@ -3871,59 +3823,11 @@ 2 - + - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - + @@ -3941,55 +3845,7 @@ - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - + @@ -4015,11 +3871,11 @@ 2 - + - + @@ -4037,7 +3893,151 @@ - + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + @@ -4059,64 +4059,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar3Red.mesh - - - - - - - - - @@ -4131,49 +4073,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - @@ -4197,27 +4096,27 @@ Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + @@ -4226,8 +4125,23 @@ Models/Props/Pillars/SciFiPillar2Red.mesh - - + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + @@ -4255,8 +4169,51 @@ Models/Props/Pillars/SciFiPillar2Red.mesh - - + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar3Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + @@ -4267,12 +4224,55 @@ 4 - Models/Props/Pillars/SciFiPillar1Red.mesh + Models/Props/Pillars/SciFiPillar2Red.mesh - - - + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + @@ -4292,24 +4292,8 @@ Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - 10 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - + + @@ -4322,22 +4306,9 @@ Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - + + + @@ -4363,8 +4334,9 @@ Models/Props/Stones/AssaultHolder.mesh - - + + + @@ -4377,8 +4349,24 @@ Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + @@ -4390,36 +4378,8 @@ Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar1Blue.mesh - - - - - + + @@ -4442,11 +4402,13 @@ - Models/Props/Bridges/SciFiBridgeDefense.mesh + 10 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - + + + @@ -4455,13 +4417,64 @@ - 15 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh + Models/Props/Bridges/SciFiBridgeDefense.mesh - - - + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar1Blue.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + @@ -4484,20 +4497,6 @@ - - - - Models/Props/Flora/HangingBush2.mesh - true - - - - - - - - - @@ -4513,6 +4512,20 @@ + + + + Models/Props/Flora/HangingBush2.mesh + true + + + + + + + + + @@ -4582,19 +4595,6 @@ - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - @@ -4628,22 +4628,7 @@ - - - - Models/Core/UnitPlane.mesh - - true - - - - - - - - - - + @@ -4652,101 +4637,11 @@ - Models/Props/Flora/Root.mesh + Models/Props/Bridges/Bridge1_SciFi_Red.mesh - - - - - - - - - - - - Models/Props/Flora/Root.mesh - - - - - - - - - - - - - - Models/Props/Flora/Root.mesh - - - - - - - - - - - - - - Models/Props/Flora/Root.mesh - - - - - - - - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - + + @@ -4754,572 +4649,200 @@ - Models/Props/Stones/AssaultHolder.mesh + Models/Props/Bridges/SciFiBridgeDefense.mesh - - + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - 1.5 - 1 - 0.30000001192092896 - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - - - @@ -5337,11 +4860,11 @@ 12 - + - + @@ -5387,216 +4910,6 @@ - - - - - Models/Props/Bridges/Bridge1_SciFi_Red.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Bridges/Bridge1_SciFi_Red.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh - - - - - - - - - - - 12 - - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh - - - - - - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh - - - - - - - - - - - 12 - - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh - - - - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - @@ -5717,6 +5030,693 @@ + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Core/UnitPlane.mesh + + true + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 1 + 0.30000001192092896 + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + @@ -5743,8 +5743,9 @@ Models/Props/Walls/BigWallRed.mesh - - + + + @@ -5763,45 +5764,6 @@ - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - @@ -5823,8 +5785,49 @@ Models/Props/Walls/MediumWall3.mesh - - + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + @@ -5836,9 +5839,141 @@ Models/Props/Walls/BigWallRed.mesh - - - + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + @@ -5882,20 +6017,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -5909,20 +6030,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -5937,19 +6044,6 @@ - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - @@ -5964,20 +6058,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -5991,19 +6071,6 @@ - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - @@ -6018,19 +6085,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - @@ -6044,20 +6098,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -6071,19 +6111,6 @@ - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - @@ -6098,20 +6125,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -6125,19 +6138,6 @@ - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - @@ -6158,19 +6158,6 @@ - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - @@ -6191,8 +6178,8 @@ Models/Props/SciFiHolder1.mesh - - + + @@ -6204,8 +6191,21 @@ Models/Props/SciFiHolder1.mesh - - + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + @@ -6236,6 +6236,47 @@ + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + @@ -6253,11 +6294,11 @@ - Models/Props/Stones/BigStone.mesh + Models/Props/Stones/SmallStone2.mesh - - + + @@ -6289,33 +6330,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -6330,86 +6344,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6417,8 +6351,8 @@ Models/Props/Stones/MediumStone2.mesh - - + + @@ -6427,51 +6361,11 @@ - Models/Props/Stones/SmallStone2.mesh + Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - + + @@ -6495,10 +6389,50 @@ - Models/Props/Stones/BigStone.mesh + Models/Props/Stones/SmallStone2.mesh - + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + @@ -6517,129 +6451,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -6654,126 +6465,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -6794,13 +6485,121 @@ Models/Props/Stones/SmallStone1.mesh - - + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + @@ -6814,6 +6613,315 @@ + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + @@ -6855,19 +6963,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6908,20 +7003,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6963,19 +7044,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -7017,20 +7085,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -7072,19 +7126,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -7126,20 +7167,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -7180,20 +7207,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -7234,19 +7247,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -7254,6 +7254,19 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -7280,19 +7293,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -7300,6 +7300,65 @@ + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + @@ -7330,21 +7389,6 @@ - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -7389,21 +7433,6 @@ - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -7449,20 +7478,6 @@ - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - @@ -7508,21 +7523,6 @@ - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -7530,6 +7530,18 @@ + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + @@ -7558,18 +7570,6 @@ - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - @@ -7626,6 +7626,49 @@ + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + @@ -7670,21 +7713,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - @@ -7729,20 +7757,6 @@ - - - - - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - @@ -7785,20 +7799,6 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - @@ -7841,6 +7841,113 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + @@ -7867,32 +7974,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -7921,32 +8002,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -7973,33 +8028,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -8026,34 +8054,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - @@ -8079,11 +8079,11 @@ - Models/Props/Walls/MediumWall3.mesh + Models/Props/Walls/BigWallBlue.mesh - - + + @@ -8092,11 +8092,38 @@ - Models/Props/Walls/BigWallBlue.mesh + Models/Props/Walls/BigWallRed.mesh - - + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + @@ -8142,19 +8169,6 @@ - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - @@ -8196,20 +8210,6 @@ - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - @@ -8247,11 +8247,11 @@ 2 - + - + @@ -8269,7 +8269,7 @@ - + @@ -8295,11 +8295,11 @@ 2 - + - + @@ -8317,7 +8317,7 @@ - + @@ -8334,6 +8334,85 @@ + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + @@ -8360,19 +8439,6 @@ - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - @@ -8413,19 +8479,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -8466,20 +8519,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -8507,19 +8546,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -8561,19 +8587,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -8615,19 +8628,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -8699,6 +8699,76 @@ + + + + + + + + + + Schema/Entities/PlayerAssaultBlue.xml + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + @@ -8707,7 +8777,7 @@ - + @@ -8719,6 +8789,321 @@ + + + + + + + + + + + + + + + + + 7 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + + + + + + + + 1 + + + + 4 + + + Textures/Core/UnitHexagon_Rotated.png + + false + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + + + + + + + + + + + 3 + + + Textures/Core/UnitHexagon_Rotated.png + + false + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + + + + + + + + + + + 2 + + + Textures/Core/UnitHexagon_Rotated.png + + false + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + + + + + + + + + + + 1 + + + Textures/Core/UnitHexagon_Rotated.png + + false + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + + + + + + + + 1 + + + + + Textures/Core/UnitHexagon_Rotated.png + + false + + + + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + SwapToTeamPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + SwapToClassPick + 1 + + + + + + + + + + + Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + @@ -8912,40 +9297,6 @@ - - - - - Textures/Core/UnitHexagon.png - - false - - - - PickTeam - 1 - - - - - - - - - - - Spectator - Fonts/DroidSans.ttf,64 - - - - - - - - - - @@ -8994,40 +9345,6 @@ - - - - - Textures/Core/UnitHexagon.png - - false - - - - PickTeam - 3 - - - - - - - - - - - Blue - Fonts/DroidSans.ttf,64 - - - - - - - - - - @@ -9078,228 +9395,7 @@ - - - - - - - - - - - - - - - - - - - - - 7 - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - - - - 2 - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - - - - 1 - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - 1 - - - - 4 - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - 1 - - - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - - - - 3 - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - + @@ -9309,84 +9405,58 @@ - SwapToTeamPick + PickTeam 1 - + - + - Team + Spectator Fonts/DroidSans.ttf,64 - - - - - - - - - - Change - Fonts/DroidSans.ttf,64 - - - - + + - + Textures/Core/UnitHexagon.png false - + - SwapToClassPick - 1 + PickTeam + 3 - + - + - Class + Blue Fonts/DroidSans.ttf,64 - - - - - - - - - - Change - Fonts/DroidSans.ttf,64 - - - - + + @@ -9401,76 +9471,6 @@ - - - - - - - - - - Schema/Entities/PlayerRed.xml - - - - - - - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - - - @@ -9479,8 +9479,8 @@ - - + + @@ -9499,23 +9499,23 @@ - Schema/Entities/ScoreBoard_Red.xml + Schema/Entities/ScoreBoard_Blue.xml - + - + - + @@ -9542,17 +9542,17 @@ - + - KD + ID Fonts/DroidSans.ttf,64 - + @@ -9590,17 +9590,17 @@ - + - ID + KD Fonts/DroidSans.ttf,64 - + @@ -9608,11 +9608,11 @@ - + Models/Core/UnitCube.mesh - + @@ -9639,23 +9639,23 @@ - Schema/Entities/ScoreBoard_Blue.xml + Schema/Entities/ScoreBoard_Red.xml - + - + - + @@ -9666,17 +9666,17 @@ - + - Name + KD Fonts/DroidSans.ttf,64 - + @@ -9698,17 +9698,17 @@ - + - KD + Name Fonts/DroidSans.ttf,64 - + @@ -9748,11 +9748,11 @@ - + Models/Core/UnitCube.mesh - + @@ -9782,31 +9782,31 @@ - - + + - Schema/Entities/ScoreBoard_Blue.xml + Schema/Entities/ScoreBoard_Red.xml - + - + Models/Core/UnitCube.mesh - + @@ -9815,6 +9815,145 @@ + + + + + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + Schema/Entities/ScoreBoard_Blue.xml + + + + + + + + + + + @@ -9846,22 +9985,6 @@ - - - - Deaths - Fonts/DroidSans.ttf,64 - - - - - - - - - - - @@ -9910,117 +10033,6 @@ - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - Schema/Entities/ScoreBoard_Red.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Kills - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Name - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - KD - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - ID - Fonts/DroidSans.ttf,64 - - - - - - - - - - - @@ -10039,11 +10051,11 @@ - + Models/Core/UnitCube.mesh - + @@ -10056,18 +10068,6 @@ - - - - Models/Core/UnitCube.mesh - - - - - - - - @@ -10276,214 +10276,6 @@ - - - - - 10 - - - - - - - - - - - - - - - - 4 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - 2 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - - - - - - - - - - - 5 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - 1 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - - - - - - - - - - - - - - 0.80000001192092896 - 1.2000000476837158 - - - - - @@ -10497,44 +10289,7 @@ - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - + @@ -10568,6 +10323,43 @@ + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + @@ -10605,6 +10397,117 @@ + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + @@ -10649,20 +10552,6 @@ - - - - - 5 - 2 - 0.5 - - - - - - - @@ -10677,6 +10566,20 @@ + + + + + 5 + 2 + 0.5 + + + + + + + @@ -10716,43 +10619,6 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -10797,20 +10663,6 @@ - - - - - 5 - 2 - 0.5 - - - - - - - @@ -10825,6 +10677,20 @@ + + + + + 5 + 2 + 0.5 + + + + + + + @@ -10864,43 +10730,6 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -10945,20 +10774,6 @@ - - - - - 5 - 2 - 0.5 - - - - - - - @@ -10973,6 +10788,20 @@ + + + + + 5 + 2 + 0.5 + + + + + + + @@ -11012,43 +10841,6 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -11093,20 +10885,6 @@ - - - - - 5 - 2 - 0.5 - - - - - - - @@ -11121,6 +10899,20 @@ + + + + + 5 + 2 + 0.5 + + + + + + + @@ -11151,7 +10943,7 @@ 1 - + @@ -11164,7 +10956,7 @@ 1 - + @@ -11186,6 +10978,226 @@ + + + + + 10 + + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + 2 + + + + + + + + + + + 4 + + + + + + + + + + + 5 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + 1 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + + + + 0.80000001192092896 + 1.2000000476837158 + + + + + @@ -11209,18 +11221,6 @@ - - - - - 10 - - - - - - - @@ -11269,7 +11269,44 @@ - + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + @@ -11306,7 +11343,7 @@ - + @@ -11315,11 +11352,11 @@ 5 - 2 + 1 0.5 - + @@ -11333,7 +11370,7 @@ 0.5 - + @@ -11380,7 +11417,44 @@ - + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + @@ -11488,43 +11562,6 @@ - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - @@ -11578,7 +11615,7 @@ 0.5 - + @@ -11592,7 +11629,7 @@ 0.5 - + @@ -11636,43 +11673,6 @@ - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -11726,7 +11726,7 @@ 0.5 - + @@ -11740,7 +11740,7 @@ 0.5 - + @@ -11754,6 +11754,19 @@ + + + + + 10 + 1 + + + + + + + @@ -11780,19 +11793,6 @@ - - - - - 10 - 1 - - - - - - - @@ -11808,13 +11808,26 @@ - Schema/Entities/Player.xml + Schema/Entities/PlayerAssaultBlue.xml + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + @@ -11841,19 +11854,6 @@ - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - diff --git a/src/Engine/Network/UDPClient.cpp b/src/Engine/Network/UDPClient.cpp index a6b51541..66ebce12 100644 --- a/src/Engine/Network/UDPClient.cpp +++ b/src/Engine/Network/UDPClient.cpp @@ -15,6 +15,8 @@ bool UDPClient::Connect(std::string playerName, std::string address, int port) } m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address().from_string(address), port); m_Socket = boost::shared_ptr(new boost::asio::ip::udp::socket(m_IOService)); + boost::asio::socket_base::receive_buffer_size option(819200); + m_Socket->set_option(option); m_Socket->open(boost::asio::ip::udp::v4()); return true; } From a2244e87ad74b63b4c45f60cd6d99081125b3678 Mon Sep 17 00:00:00 2001 From: Tleety Date: Thu, 10 Mar 2016 12:18:06 +0100 Subject: [PATCH 22/65] WIP, trying to get blur to work with mipmaps --- include/Engine/Rendering/DrawBloomPass.h | 6 +- include/Engine/Rendering/FrameBuffer.h | 15 ++- resources/Shaders/Gaussian_horiz.frag.glsl | 5 +- resources/Shaders/Gaussian_vert.frag.glsl | 5 +- src/Engine/Rendering/DrawBloomPass.cpp | 120 ++++++++++++------ src/Engine/Rendering/FrameBuffer.cpp | 5 +- src/Engine/Rendering/Util/CommonFunctions.cpp | 3 +- 7 files changed, 106 insertions(+), 53 deletions(-) diff --git a/include/Engine/Rendering/DrawBloomPass.h b/include/Engine/Rendering/DrawBloomPass.h index e6a87c11..204f97d1 100644 --- a/include/Engine/Rendering/DrawBloomPass.h +++ b/include/Engine/Rendering/DrawBloomPass.h @@ -39,6 +39,7 @@ public: private: + void GaussianLodPass(GLuint mipMap, GLuint texture); Texture* m_BlackTexture; Model* m_ScreenQuad; @@ -47,12 +48,13 @@ private: //const LightCullingPass* m_LightCullingPass int m_Iterations; int m_Quality = 0; + int m_BloomLod = 4; GLuint m_GaussianTexture_horiz = 0; GLuint m_GaussianTexture_vert = 0; - FrameBuffer m_GaussianFrameBuffer_horiz; - FrameBuffer m_GaussianFrameBuffer_vert; + FrameBuffer* m_GaussianFrameBuffer_horiz = nullptr; + FrameBuffer* m_GaussianFrameBuffer_vert = nullptr; ShaderProgram* m_GaussianProgram_horiz; ShaderProgram* m_GaussianProgram_vert; diff --git a/include/Engine/Rendering/FrameBuffer.h b/include/Engine/Rendering/FrameBuffer.h index e9171894..1b4f6012 100644 --- a/include/Engine/Rendering/FrameBuffer.h +++ b/include/Engine/Rendering/FrameBuffer.h @@ -7,11 +7,12 @@ class BufferResource { public: - BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment); + BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment, GLuint mipMapLod); GLuint* m_ResourceHandle; GLenum m_ResourceType; GLenum m_Attachment; + GLuint m_MipMapLod = 0; private: }; @@ -20,15 +21,15 @@ template class ResourceType : public BufferResource { public: - ResourceType(GLuint* resourceHandle, GLenum attachment) - : BufferResource(resourceHandle, RESOURCETYPE, attachment) { } + ResourceType(GLuint* resourceHandle, GLenum attachment, GLuint mipMapLod) + : BufferResource(resourceHandle, RESOURCETYPE, attachment, mipMapLod) { } }; class Texture2D : public ResourceType { public: - Texture2D(GLuint* resourceHandle, GLenum attachment) - : ResourceType(resourceHandle, attachment) { }; + Texture2D(GLuint* resourceHandle, GLenum attachment, GLuint mipMapLod = 0) + : ResourceType(resourceHandle, attachment, mipMapLod) { }; ~Texture2D(); }; @@ -37,7 +38,7 @@ class RenderBuffer : public ResourceType { public: RenderBuffer(GLuint* resourceHandle, GLenum attachment) - : ResourceType(resourceHandle, attachment) + : ResourceType(resourceHandle, attachment, 0) { }; ~RenderBuffer(); @@ -47,7 +48,7 @@ class Texture2DArray : public ResourceType { public: Texture2DArray(GLuint* resourceHandle, GLenum attachment) - : ResourceType(resourceHandle, attachment) + : ResourceType(resourceHandle, attachment, 0) { }; ~Texture2DArray(); diff --git a/resources/Shaders/Gaussian_horiz.frag.glsl b/resources/Shaders/Gaussian_horiz.frag.glsl index 8a306ec2..06426ed3 100644 --- a/resources/Shaders/Gaussian_horiz.frag.glsl +++ b/resources/Shaders/Gaussian_horiz.frag.glsl @@ -2,6 +2,7 @@ #extension GL_EXT_gpu_shader4 : enable layout (binding = 0) uniform sampler2D Texture; +uniform int Lod; in VertexData{ vec2 TextureCoordinate; @@ -10,12 +11,14 @@ in VertexData{ out vec4 fragmentColor; uniform float weight[5] = float[](0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216); +//uniform float weight[3] = float[](0.265495, 0.226535, 0.140718); void main() { - vec2 tex_offset = 1.0 / textureSize2D(Texture, 0); + vec2 tex_offset = 1.0 / textureSize(Texture, Lod); vec3 center = texture(Texture, Input.TextureCoordinate).rgb; vec3 result = center * weight[0]; + for(int i = 1; i < 5; ++i) { vec4 eastFragments = texture(Texture, Input.TextureCoordinate + vec2(tex_offset.x * i, 0.0)); vec4 westFragments = texture(Texture, Input.TextureCoordinate - vec2(tex_offset.x * i, 0.0)); diff --git a/resources/Shaders/Gaussian_vert.frag.glsl b/resources/Shaders/Gaussian_vert.frag.glsl index 921ba55a..3924450a 100644 --- a/resources/Shaders/Gaussian_vert.frag.glsl +++ b/resources/Shaders/Gaussian_vert.frag.glsl @@ -2,6 +2,7 @@ #extension GL_EXT_gpu_shader4 : enable layout (binding = 0) uniform sampler2D Texture; +uniform int Lod; in VertexData{ vec2 TextureCoordinate; @@ -10,12 +11,14 @@ in VertexData{ out vec4 fragmentColor; uniform float weight[5] = float[](0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216); +//uniform float weight[3] = float[](0.265495, 0.226535, 0.140718); void main() { - vec2 tex_offset = 1.0 / textureSize2D(Texture, 0); + vec2 tex_offset = 1.0 / textureSize(Texture, Lod); vec3 center = texture(Texture, Input.TextureCoordinate).rgb; vec3 result = center * weight[0]; + for(int i = 1; i < 5; ++i) { vec4 northFragments = texture(Texture, Input.TextureCoordinate + vec2(0.0, tex_offset.y * i)); vec4 southFragments = texture(Texture, Input.TextureCoordinate - vec2(0.0, tex_offset.y * i)); diff --git a/src/Engine/Rendering/DrawBloomPass.cpp b/src/Engine/Rendering/DrawBloomPass.cpp index 4172118c..f30734db 100644 --- a/src/Engine/Rendering/DrawBloomPass.cpp +++ b/src/Engine/Rendering/DrawBloomPass.cpp @@ -66,18 +66,31 @@ void DrawBloomPass::InitializeShaderPrograms() void DrawBloomPass::InitializeBuffers() { - CommonFunctions::GenerateTexture(&m_GaussianTexture_horiz, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); + CommonFunctions::GenerateMipMapTexture( + &m_GaussianTexture_horiz, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) + , GL_RGB, GL_FLOAT, m_BloomLod); + CommonFunctions::GenerateMipMapTexture( + &m_GaussianTexture_vert, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) + , GL_RGB, GL_FLOAT, m_BloomLod); - if (m_GaussianFrameBuffer_horiz.GetHandle() == 0) { - m_GaussianFrameBuffer_horiz.AddResource(std::shared_ptr(new Texture2D(&m_GaussianTexture_horiz, GL_COLOR_ATTACHMENT0))); - } - m_GaussianFrameBuffer_horiz.Generate(); + if(m_GaussianFrameBuffer_horiz == nullptr) { + m_GaussianFrameBuffer_horiz = new FrameBuffer[m_BloomLod]; + } + if (m_GaussianFrameBuffer_vert == nullptr) { + m_GaussianFrameBuffer_vert = new FrameBuffer[m_BloomLod]; + } - CommonFunctions::GenerateTexture(&m_GaussianTexture_vert, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); - if (m_GaussianFrameBuffer_vert.GetHandle() == 0) { - m_GaussianFrameBuffer_vert.AddResource(std::shared_ptr(new Texture2D(&m_GaussianTexture_vert, GL_COLOR_ATTACHMENT0))); - } - m_GaussianFrameBuffer_vert.Generate(); + for (int i = 0; i < m_BloomLod; i++) { + if(m_GaussianFrameBuffer_horiz[i].GetHandle() == 0) { + m_GaussianFrameBuffer_horiz[i].AddResource(std::shared_ptr(new Texture2D(&m_GaussianTexture_horiz, GL_COLOR_ATTACHMENT0, i))); + } + m_GaussianFrameBuffer_horiz[i].Generate(); + + if (m_GaussianFrameBuffer_vert[i].GetHandle() == 0) { + m_GaussianFrameBuffer_vert[i].AddResource(std::shared_ptr(new Texture2D(&m_GaussianTexture_vert, GL_COLOR_ATTACHMENT0, i))); + } + m_GaussianFrameBuffer_vert[i].Generate(); + } } @@ -87,22 +100,53 @@ void DrawBloomPass::ClearBuffer() return; } GLERROR("PRE"); - m_GaussianFrameBuffer_horiz.Bind(); - glClearColor(0.f, 0.f, 0.f, 0.f); - glClear(GL_COLOR_BUFFER_BIT); - m_GaussianFrameBuffer_horiz.Unbind(); - m_GaussianFrameBuffer_vert.Bind(); - glClearColor(0.f, 0.f, 0.f, 0.f); - glClear(GL_COLOR_BUFFER_BIT); - m_GaussianFrameBuffer_vert.Unbind(); + for (int i = 0; i < m_BloomLod; i++) { + m_GaussianFrameBuffer_horiz[i].Bind(); + glClearColor(0.f, 0.f, 0.f, 0.f); + glClear(GL_COLOR_BUFFER_BIT); + m_GaussianFrameBuffer_horiz[i].Unbind(); + m_GaussianFrameBuffer_vert[i].Bind(); + glClearColor(0.f, 0.f, 0.f, 0.f); + glClear(GL_COLOR_BUFFER_BIT); + m_GaussianFrameBuffer_vert[i].Unbind(); + } + GLERROR("END"); } void DrawBloomPass::Draw(GLuint texture) +{ + if (m_Quality == 0) { + return; + } + + for (int i = 0; i < m_BloomLod; i++) { + GaussianLodPass(i, texture); + } +} + + +void DrawBloomPass::OnWindowResize() { if (m_Quality == 0) { return; } + CommonFunctions::GenerateMipMapTexture( + &m_GaussianTexture_vert, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) + , GL_RGB, GL_FLOAT, m_BloomLod); + CommonFunctions::GenerateMipMapTexture( + &m_GaussianTexture_horiz, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) + , GL_RGB, GL_FLOAT, m_BloomLod); + for (int i = 0; i < m_BloomLod; i++) { + m_GaussianFrameBuffer_vert[i].Generate(); + m_GaussianFrameBuffer_horiz[i].Generate(); + + } + +} + +void DrawBloomPass::GaussianLodPass(GLuint mipMap, GLuint texture) +{ GLERROR("DrawBloomPass::Draw: Pre"); DrawBloomPassState state; @@ -110,10 +154,14 @@ void DrawBloomPass::Draw(GLuint texture) GLuint shaderHandle_horiz = m_GaussianProgram_horiz->GetHandle(); GLuint shaderHandle_vert = m_GaussianProgram_vert->GetHandle(); - //Horizontal pass, first use the given texture then save it to the horizontal framebuffer. - m_GaussianFrameBuffer_horiz.Bind(); + m_GaussianFrameBuffer_horiz[mipMap].Bind(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, mipMap); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, mipMap); m_GaussianProgram_horiz->Bind(); + glUniform1i(glGetUniformLocation(shaderHandle_horiz, "Lod"), mipMap); + + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture); glBindVertexArray(m_ScreenQuad->VAO); @@ -123,10 +171,12 @@ void DrawBloomPass::Draw(GLuint texture) //Iterate some times to make it more gaussian. for (int i = 1; i < m_Iterations; i++) { //Vertical pass - m_GaussianFrameBuffer_vert.Bind(); + m_GaussianFrameBuffer_vert[mipMap].Bind(); m_GaussianProgram_vert->Bind(); + glUniform1i(glGetUniformLocation(shaderHandle_vert, "Lod"), mipMap); - glActiveTexture(GL_TEXTURE0); + + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GaussianTexture_horiz); glBindVertexArray(m_ScreenQuad->VAO); @@ -134,27 +184,29 @@ void DrawBloomPass::Draw(GLuint texture) glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->MaterialGroups()[0].material->EndIndex - m_ScreenQuad->MaterialGroups()[0].material->StartIndex +1 , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].material->StartIndex); //horizontal pass - m_GaussianFrameBuffer_vert.Unbind(); + m_GaussianFrameBuffer_vert[mipMap].Unbind(); - m_GaussianFrameBuffer_horiz.Bind(); + m_GaussianFrameBuffer_horiz[mipMap].Bind(); m_GaussianProgram_horiz->Bind(); + glUniform1i(glGetUniformLocation(shaderHandle_horiz, "Lod"), mipMap); - glActiveTexture(GL_TEXTURE0); + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GaussianTexture_vert); glBindVertexArray(m_ScreenQuad->VAO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ScreenQuad->ElementBuffer); glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->MaterialGroups()[0].material->EndIndex - m_ScreenQuad->MaterialGroups()[0].material->StartIndex +1 , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].material->StartIndex); - m_GaussianFrameBuffer_horiz.Unbind(); + m_GaussianFrameBuffer_horiz[mipMap].Unbind(); } //final vertical gaussian after the iterations are done - m_GaussianFrameBuffer_vert.Bind(); + m_GaussianFrameBuffer_vert[mipMap].Bind(); m_GaussianProgram_vert->Bind(); + glUniform1i(glGetUniformLocation(shaderHandle_vert, "Lod"), mipMap); - glActiveTexture(GL_TEXTURE0); + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GaussianTexture_horiz); glBindVertexArray(m_ScreenQuad->VAO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ScreenQuad->ElementBuffer); @@ -162,16 +214,6 @@ void DrawBloomPass::Draw(GLuint texture) , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].material->StartIndex); GLERROR("DrawBloomPass::Draw: END"); -} + m_GaussianFrameBuffer_vert[mipMap].Unbind(); - -void DrawBloomPass::OnWindowResize() -{ - if (m_Quality == 0) { - return; - } - CommonFunctions::GenerateTexture(&m_GaussianTexture_vert, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); - m_GaussianFrameBuffer_vert.Generate(); - CommonFunctions::GenerateTexture(&m_GaussianTexture_horiz, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); - m_GaussianFrameBuffer_horiz.Generate(); } diff --git a/src/Engine/Rendering/FrameBuffer.cpp b/src/Engine/Rendering/FrameBuffer.cpp index c94423ba..dfabb8a3 100644 --- a/src/Engine/Rendering/FrameBuffer.cpp +++ b/src/Engine/Rendering/FrameBuffer.cpp @@ -2,11 +2,12 @@ #include "Rendering/FrameBuffer.h" -BufferResource::BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment) +BufferResource::BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment, GLuint mipMapLod) { m_ResourceHandle = resourceHandle; m_ResourceType = resourceType; m_Attachment = attachment; + m_MipMapLod = mipMapLod; } Texture2D::~Texture2D() @@ -58,7 +59,7 @@ void FrameBuffer::Generate() for (auto it = m_Resources.begin(); it != m_Resources.end(); it++) { switch ((*it)->m_ResourceType) { case GL_TEXTURE_2D: - glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle, 0); + glFramebufferTexture(GL_FRAMEBUFFER, (*it)->m_Attachment, *(*it)->m_ResourceHandle, (*it)->m_MipMapLod); GLERROR("FrameBuffer generate: glFramebufferTexture2D"); break; case GL_RENDERBUFFER: diff --git a/src/Engine/Rendering/Util/CommonFunctions.cpp b/src/Engine/Rendering/Util/CommonFunctions.cpp index e1344928..dac9fca3 100644 --- a/src/Engine/Rendering/Util/CommonFunctions.cpp +++ b/src/Engine/Rendering/Util/CommonFunctions.cpp @@ -28,7 +28,8 @@ void CommonFunctions::GenerateMipMapTexture(GLuint* texture, GLenum wrapping, gl glGenTextures(1, texture); glBindTexture(GL_TEXTURE_2D, *texture); glTexStorage2D(GL_TEXTURE_2D, numMipMaps, GL_RGBA8, dimensions.x, dimensions.y); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, dimensions.x, dimensions.y, format, type, texture); + //glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, dimensions.x, dimensions.y, format, type, NULL); + GLERROR("MipMap Texture glTexSubImage2D failed"); glGenerateMipmap(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapping); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapping); From a6ef026db5dab7a09f666a060dc9800c607ea640 Mon Sep 17 00:00:00 2001 From: Teejoon Date: Thu, 10 Mar 2016 12:27:25 +0100 Subject: [PATCH 23/65] Fixed on window resize memory leak --- src/Engine/Rendering/LightCullingPass.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Engine/Rendering/LightCullingPass.cpp b/src/Engine/Rendering/LightCullingPass.cpp index 1ce1f88c..9a6e19cf 100644 --- a/src/Engine/Rendering/LightCullingPass.cpp +++ b/src/Engine/Rendering/LightCullingPass.cpp @@ -42,6 +42,15 @@ void LightCullingPass::SetSSBOSizes() { m_NumberOfTiles = (int)(m_Renderer->GetViewportSize().Width/TILE_SIZE) * (int)(m_Renderer->GetViewportSize().Height/TILE_SIZE); + if (m_Frustums != nullptr) { + delete[] m_Frustums; + } + if (m_LightGrid != nullptr) { + delete[] m_LightGrid; + } + if (m_LightIndex != nullptr) { + delete[] m_LightIndex; + } m_Frustums = new Frustum[m_NumberOfTiles]; m_LightGrid = new LightGrid[m_NumberOfTiles]; m_LightIndex = new float[m_NumberOfTiles*MAX_LIGHTS_PER_TILE]; From bdcb33d99248cca77133272f22d85bfef4d9f815 Mon Sep 17 00:00:00 2001 From: William Moberg Date: Thu, 10 Mar 2016 12:46:06 +0100 Subject: [PATCH 24/65] Mouse always unlocked on game start and on disconnecting (i.e when menu shows). --- include/Game/Systems/SpectatorCameraSystem.h | 3 +++ resources/DefaultInput.ini | 4 +++- src/Engine/Editor/EditorSystem.cpp | 1 + src/Engine/Network/Client.cpp | 7 ++++++- src/Game/Systems/SpectatorCameraSystem.cpp | 16 +++++++++++++++- 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/include/Game/Systems/SpectatorCameraSystem.h b/include/Game/Systems/SpectatorCameraSystem.h index 5a00279b..bc7aa860 100644 --- a/include/Game/Systems/SpectatorCameraSystem.h +++ b/include/Game/Systems/SpectatorCameraSystem.h @@ -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 m_EInputCommand; bool OnInputCommand(const Events::InputCommand& e); + EventRelay m_EDisconnect; + bool OnDisconnect(const Events::PlayerDisconnected& e); }; #endif \ No newline at end of file diff --git a/resources/DefaultInput.ini b/resources/DefaultInput.ini index 18fb943f..840e5cd0 100644 --- a/resources/DefaultInput.ini +++ b/resources/DefaultInput.ini @@ -29,4 +29,6 @@ K=TakeDamage,1500 F2=PerformanceTimingResetAllTimers F3=PerformanceTimingCreateExcelData Comma=SwapToClassPick -Period=SwapToTeamPick \ No newline at end of file +Period=SwapToTeamPick +Enter=PickClass,1 +F5=DisconnectFromServer \ No newline at end of file diff --git a/src/Engine/Editor/EditorSystem.cpp b/src/Engine/Editor/EditorSystem.cpp index 5e0d02fd..89f6ef5c 100644 --- a/src/Engine/Editor/EditorSystem.cpp +++ b/src/Engine/Editor/EditorSystem.cpp @@ -47,6 +47,7 @@ EditorSystem::EditorSystem(SystemParams params, IRenderer* renderer, RenderFrame Enable(); } else { Disable(); + m_EventBroker->Publish(Events::UnlockMouse()); } } diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index b4eafbcb..02ffc78a 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -1,4 +1,5 @@ #include "Network/Client.h" +#include "Network/EPlayerDisconnected.h" using namespace boost::asio::ip; Client::Client(World* world, EventBroker* eventBroker) @@ -224,7 +225,7 @@ void Client::parseServerlist(Packet& packet) void Client::parseKick() { LOG_WARNING("You have been kicked from the server."); - m_IsConnected = false; + disconnect(); } void Client::parseSpawnEvents() @@ -464,6 +465,10 @@ void Client::disconnect() Packet packet(MessageType::Disconnect, m_SendPacketID); m_Reliable.Send(packet); m_Reliable.Disconnect(); + Events::PlayerDisconnected e; + e.Entity = m_LocalPlayer.ID; + e.PlayerID = -1; + m_EventBroker->Publish(e); createMainMenu(); } diff --git a/src/Game/Systems/SpectatorCameraSystem.cpp b/src/Game/Systems/SpectatorCameraSystem.cpp index d1f2f1ce..23dfb164 100644 --- a/src/Game/Systems/SpectatorCameraSystem.cpp +++ b/src/Game/Systems/SpectatorCameraSystem.cpp @@ -8,6 +8,7 @@ SpectatorCameraSystem::SpectatorCameraSystem(SystemParams params) , m_PickedTeam(-1) { EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &SpectatorCameraSystem::OnInputCommand); + EVENT_SUBSCRIBE_MEMBER(m_EDisconnect, &SpectatorCameraSystem::OnDisconnect); } void SpectatorCameraSystem::Update(double dt) @@ -87,4 +88,17 @@ bool SpectatorCameraSystem::OnInputCommand(const Events::InputCommand& e) } return true; -} \ No newline at end of file +} + +bool SpectatorCameraSystem::OnDisconnect(const Events::PlayerDisconnected& e) +{ + // If local player gets disconnected, they should be set to + // the spectator camera next time a map loads that has one. + if (e.Entity == LocalPlayer.ID) { + m_CamSetToTeamPick = false; + // They will also be set to menu, so unlock mouse just in case they were in game with locked mouse. + Events::UnlockMouse unlock; + m_EventBroker->Publish(unlock); + } + return true; +} From c3255519bf42991d7bf6b7d9716951b7687b7ce4 Mon Sep 17 00:00:00 2001 From: Tleety Date: Thu, 10 Mar 2016 13:07:41 +0100 Subject: [PATCH 25/65] Blur is now looking like real blur --- include/Engine/Rendering/DrawBloomPass.h | 6 ++- .../Shaders/CombineGaussianTexture.frag.glsl | 22 +++++++++ .../Shaders/CombineGaussianTexture.vert.glsl | 13 ++++++ src/Engine/Rendering/DrawBloomPass.cpp | 46 ++++++++++++++++--- src/Engine/Rendering/Util/CommonFunctions.cpp | 1 + 5 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 resources/Shaders/CombineGaussianTexture.frag.glsl create mode 100644 resources/Shaders/CombineGaussianTexture.vert.glsl diff --git a/include/Engine/Rendering/DrawBloomPass.h b/include/Engine/Rendering/DrawBloomPass.h index 204f97d1..a76eb053 100644 --- a/include/Engine/Rendering/DrawBloomPass.h +++ b/include/Engine/Rendering/DrawBloomPass.h @@ -33,13 +33,14 @@ public: if (m_Quality == 0) { return m_BlackTexture->m_Texture; } else { - return m_GaussianTexture_vert; + return m_FinalGaussianTexture; } } private: void GaussianLodPass(GLuint mipMap, GLuint texture); + void CombineGaussianBlur(); Texture* m_BlackTexture; Model* m_ScreenQuad; @@ -52,12 +53,15 @@ private: GLuint m_GaussianTexture_horiz = 0; GLuint m_GaussianTexture_vert = 0; + GLuint m_FinalGaussianTexture = 0; FrameBuffer* m_GaussianFrameBuffer_horiz = nullptr; FrameBuffer* m_GaussianFrameBuffer_vert = nullptr; + FrameBuffer m_GaussianCombineBuffer; ShaderProgram* m_GaussianProgram_horiz; ShaderProgram* m_GaussianProgram_vert; + ShaderProgram* m_GaussianCombineProgram; }; diff --git a/resources/Shaders/CombineGaussianTexture.frag.glsl b/resources/Shaders/CombineGaussianTexture.frag.glsl new file mode 100644 index 00000000..66892a6a --- /dev/null +++ b/resources/Shaders/CombineGaussianTexture.frag.glsl @@ -0,0 +1,22 @@ +#version 430 + +layout (binding = 0) uniform sampler2D Texture; + + +in VertexData{ + vec2 TextureCoordinate; +}Input; + +out vec4 fragmentColor; + +void main() +{ + vec4 texel0 = textureLod(Texture, Input.TextureCoordinate, 0); + vec4 texel1 = textureLod(Texture, Input.TextureCoordinate, 1); + vec4 texel2 = textureLod(Texture, Input.TextureCoordinate, 2); + vec4 texel3 = textureLod(Texture, Input.TextureCoordinate, 3); + + fragmentColor = texel0 + texel1 + texel2 + texel3; +} + + diff --git a/resources/Shaders/CombineGaussianTexture.vert.glsl b/resources/Shaders/CombineGaussianTexture.vert.glsl new file mode 100644 index 00000000..346bc141 --- /dev/null +++ b/resources/Shaders/CombineGaussianTexture.vert.glsl @@ -0,0 +1,13 @@ +#version 430 + +layout (location = 0) in vec3 Position; + +out VertexData{ + vec2 TextureCoordinate; +}Output; + +void main() +{ + gl_Position = vec4(Position, 1.0); + Output.TextureCoordinate = (vec2(Position) + 1) / 2; +} \ No newline at end of file diff --git a/src/Engine/Rendering/DrawBloomPass.cpp b/src/Engine/Rendering/DrawBloomPass.cpp index f30734db..f73611a2 100644 --- a/src/Engine/Rendering/DrawBloomPass.cpp +++ b/src/Engine/Rendering/DrawBloomPass.cpp @@ -12,6 +12,7 @@ DrawBloomPass::DrawBloomPass(IRenderer* renderer, ConfigFile* config) DrawBloomPass::~DrawBloomPass() { CommonFunctions::DeleteTexture(&m_GaussianTexture_horiz); CommonFunctions::DeleteTexture(&m_GaussianTexture_vert); + CommonFunctions::DeleteTexture(&m_FinalGaussianTexture); } void DrawBloomPass::InitializeTextures() @@ -30,9 +31,8 @@ void DrawBloomPass::ChangeQuality(int quality) if (m_Quality == 0) { CommonFunctions::DeleteTexture(&m_GaussianTexture_horiz); - CommonFunctions::DeleteTexture(&m_GaussianTexture_vert); - m_GaussianTexture_horiz = 0; - m_GaussianTexture_vert = 0; + CommonFunctions::DeleteTexture(&m_GaussianTexture_vert); + CommonFunctions::DeleteTexture(&m_FinalGaussianTexture); return; } InitializeTextures(); @@ -62,6 +62,15 @@ void DrawBloomPass::InitializeShaderPrograms() m_GaussianProgram_vert->BindFragDataLocation(0, "fragmentColor"); m_GaussianProgram_vert->Link(); } + + m_GaussianCombineProgram = ResourceManager::Load("#GaussianCombineProgram"); + if (m_GaussianCombineProgram->GetHandle() == 0) { + m_GaussianCombineProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/CombineGaussianTexture.vert.glsl"))); + m_GaussianCombineProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/CombineGaussianTexture.frag.glsl"))); + m_GaussianCombineProgram->Compile(); + m_GaussianCombineProgram->BindFragDataLocation(0, "fragmentColor"); + m_GaussianCombineProgram->Link(); + } } void DrawBloomPass::InitializeBuffers() @@ -72,6 +81,12 @@ void DrawBloomPass::InitializeBuffers() CommonFunctions::GenerateMipMapTexture( &m_GaussianTexture_vert, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) , GL_RGB, GL_FLOAT, m_BloomLod); + CommonFunctions::GenerateTexture(&m_FinalGaussianTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); + + if (m_GaussianCombineBuffer.GetHandle() == 0) { + m_GaussianCombineBuffer.AddResource(std::shared_ptr(new Texture2D(&m_FinalGaussianTexture, GL_COLOR_ATTACHMENT0))); + } + m_GaussianCombineBuffer.Generate(); if(m_GaussianFrameBuffer_horiz == nullptr) { m_GaussianFrameBuffer_horiz = new FrameBuffer[m_BloomLod]; @@ -109,8 +124,12 @@ void DrawBloomPass::ClearBuffer() glClearColor(0.f, 0.f, 0.f, 0.f); glClear(GL_COLOR_BUFFER_BIT); m_GaussianFrameBuffer_vert[i].Unbind(); - } + } + m_GaussianCombineBuffer.Bind(); + glClearColor(0.f, 0.f, 0.f, 0.f); + glClear(GL_COLOR_BUFFER_BIT); + m_GaussianCombineBuffer.Unbind(); GLERROR("END"); } @@ -123,6 +142,7 @@ void DrawBloomPass::Draw(GLuint texture) for (int i = 0; i < m_BloomLod; i++) { GaussianLodPass(i, texture); } + CombineGaussianBlur(); } @@ -148,7 +168,7 @@ void DrawBloomPass::OnWindowResize() void DrawBloomPass::GaussianLodPass(GLuint mipMap, GLuint texture) { GLERROR("DrawBloomPass::Draw: Pre"); - + glViewport(0, 0, m_Renderer->GetViewportSize().Width/(glm::pow(2, mipMap)), m_Renderer->GetViewportSize().Height/(glm::pow(2, mipMap))); DrawBloomPassState state; GLuint shaderHandle_horiz = m_GaussianProgram_horiz->GetHandle(); @@ -156,8 +176,6 @@ void DrawBloomPass::GaussianLodPass(GLuint mipMap, GLuint texture) //Horizontal pass, first use the given texture then save it to the horizontal framebuffer. m_GaussianFrameBuffer_horiz[mipMap].Bind(); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, mipMap); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, mipMap); m_GaussianProgram_horiz->Bind(); glUniform1i(glGetUniformLocation(shaderHandle_horiz, "Lod"), mipMap); @@ -214,6 +232,20 @@ void DrawBloomPass::GaussianLodPass(GLuint mipMap, GLuint texture) , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].material->StartIndex); GLERROR("DrawBloomPass::Draw: END"); + glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); m_GaussianFrameBuffer_vert[mipMap].Unbind(); } + +void DrawBloomPass::CombineGaussianBlur() +{ + m_GaussianCombineBuffer.Bind(); + m_GaussianCombineProgram->Bind(); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, m_GaussianTexture_vert); + glBindVertexArray(m_ScreenQuad->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ScreenQuad->ElementBuffer); + glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->MaterialGroups()[0].material->EndIndex - m_ScreenQuad->MaterialGroups()[0].material->StartIndex +1 + , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].material->StartIndex); +} diff --git a/src/Engine/Rendering/Util/CommonFunctions.cpp b/src/Engine/Rendering/Util/CommonFunctions.cpp index dac9fca3..c185cd5c 100644 --- a/src/Engine/Rendering/Util/CommonFunctions.cpp +++ b/src/Engine/Rendering/Util/CommonFunctions.cpp @@ -25,6 +25,7 @@ void CommonFunctions::GenerateMultiSampleTexture(GLuint* texture, int numSamples void CommonFunctions::GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint format, GLenum type, GLint numMipMaps) { + glDeleteTextures(1, texture); glGenTextures(1, texture); glBindTexture(GL_TEXTURE_2D, *texture); glTexStorage2D(GL_TEXTURE_2D, numMipMaps, GL_RGBA8, dimensions.x, dimensions.y); From 0346f81234d26c2e4358471c843b0e4d4d362b58 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 10 Mar 2016 13:05:21 +0100 Subject: [PATCH 26/65] Renderer resizing updated to send EResolutionChanged when the resolution is updated so cameras can update their aspect ratio and have a correct FOV. Renderer::SetResolution actually changes the resolution now too. --- include/Engine/Rendering/EResolutionChanged.h | 19 +++++++ include/Engine/Rendering/RenderSystem.h | 3 ++ include/Engine/Rendering/Renderer.h | 10 +++- src/Engine/Rendering/RenderSystem.cpp | 10 +++- src/Engine/Rendering/Renderer.cpp | 50 ++++++++++++++++--- 5 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 include/Engine/Rendering/EResolutionChanged.h diff --git a/include/Engine/Rendering/EResolutionChanged.h b/include/Engine/Rendering/EResolutionChanged.h new file mode 100644 index 00000000..220a2c74 --- /dev/null +++ b/include/Engine/Rendering/EResolutionChanged.h @@ -0,0 +1,19 @@ +#ifndef EResolutionChanged_h__ +#define EResolutionChanged_h__ + +#include "../Core/Event.h" +#include "../Core/Util/Rectangle.h" + +namespace Events +{ + +// Fired when the framebuffer size changes +struct ResolutionChanged : Event +{ + Rectangle OldResolution; + Rectangle NewResolution; +}; + +} + +#endif \ No newline at end of file diff --git a/include/Engine/Rendering/RenderSystem.h b/include/Engine/Rendering/RenderSystem.h index 7580d654..fbcf7ec3 100644 --- a/include/Engine/Rendering/RenderSystem.h +++ b/include/Engine/Rendering/RenderSystem.h @@ -19,6 +19,7 @@ #include "../Core/Octree.h" #include "../Collision/EntityAABB.h" #include "../Core/ConfigFile.h" +#include "EResolutionChanged.h" class RenderSystem : public ImpureSystem { @@ -36,6 +37,8 @@ private: EntityWrapper m_LocalPlayer = EntityWrapper::Invalid; Octree* m_Octree; + EventRelay m_EResolutionChanged; + bool OnResolutionChanged(Events::ResolutionChanged &event); EventRelay m_ESetCamera; bool OnSetCamera(Events::SetCamera &event); EventRelay m_EInputCommand; diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index 16bdea9e..c36ba59a 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -28,10 +28,12 @@ #include "Util/CommonFunctions.h" #include "Core/PerformanceTimer.h" #include "ShadowPass.h" +#include "EResolutionChanged.h" class Renderer : public IRenderer { static void glfwFrameBufferCallback(GLFWwindow* window, int width, int height); + static void glfwWindowSizeCallback(GLFWwindow* window, int width, int height); public: Renderer(EventBroker* eventBroker, ConfigFile* config) @@ -40,13 +42,14 @@ public: { } ~Renderer(); + virtual void SetResolution(const Rectangle& resolution) override; + virtual void Initialize() override; virtual void Update(double dt) override; virtual void Draw(RenderFrame& frame) override; virtual PickData Pick(glm::vec2 screenCoord) override; - private: //----------------------Variables----------------------// @@ -90,11 +93,14 @@ private: void InputUpdate(double dt); //void PickingPass(RenderQueueCollection& rq); //void DrawScreenQuad(GLuint textureToDraw); + void setWindowSize(Rectangle size); + void updateFramebufferSize(); static bool DepthSort(const std::shared_ptr &i, const std::shared_ptr &j) { return (i->Depth < j->Depth); } void SortRenderJobsByDepth(RenderScene &scene); void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type); - //--------------------ShaderPrograms-------------------// + + //--------------------ShaderPrograms-------------------// ShaderProgram* m_BasicForwardProgram; ShaderProgram* m_ExplosionEffectProgram; diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index 54da9666..d685c443 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -9,10 +9,11 @@ RenderSystem::RenderSystem(SystemParams params, const IRenderer* renderer, Rende , m_Octree(frustumCullOctree) { EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &RenderSystem::OnSetCamera); + EVENT_SUBSCRIBE_MEMBER(m_EResolutionChanged, &RenderSystem::OnResolutionChanged); EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &RenderSystem::OnInputCommand); EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &RenderSystem::OnPlayerSpawned); - m_Camera = new Camera((float)m_Renderer->Resolution().Width / m_Renderer->Resolution().Height, glm::radians(45.f), 0.01f, 5000.f); + m_Camera = new Camera((float)m_Renderer->GetViewportSize().Width / m_Renderer->GetViewportSize().Height, glm::radians(45.f), 0.01f, 5000.f); } RenderSystem::~RenderSystem() @@ -20,6 +21,13 @@ RenderSystem::~RenderSystem() delete m_Camera; } +bool RenderSystem::OnResolutionChanged(Events::ResolutionChanged& e) +{ + // Update camera aspect ration on resolution change + m_Camera->SetAspectRatio((float)e.NewResolution.Width / e.NewResolution.Height); + return true; +} + bool RenderSystem::OnSetCamera(Events::SetCamera& e) { ComponentWrapper cTransform = e.CameraEntity["Transform"]; diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 90122f7c..09c35baa 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -36,16 +36,24 @@ void Renderer::Initialize() m_ImGuiRenderPass = new ImGuiRenderPass(this, m_EventBroker); } +void Renderer::glfwWindowSizeCallback(GLFWwindow* window, int width, int height) +{ + m_WindowToRenderer[window]->setWindowSize(Rectangle(width, height)); +} + void Renderer::glfwFrameBufferCallback(GLFWwindow* window, int width, int height) { - glViewport(0, 0, width, height); - Renderer* currentRenderer = m_WindowToRenderer[window]; - currentRenderer->m_ViewportSize = Rectangle(width, height); - currentRenderer->m_PickingPass->OnWindowResize(); - currentRenderer->m_DrawFinalPass->OnWindowResize(); - currentRenderer->m_LightCullingPass->OnWindowResize(); - currentRenderer->m_DrawBloomPass->OnWindowResize(); - currentRenderer->m_SSAOPass->OnWindowResize(); + m_WindowToRenderer[window]->updateFramebufferSize(); +} + +void Renderer::SetResolution(const Rectangle& resolution) +{ + m_Resolution = resolution; + + if (m_Window != nullptr) { + setWindowSize(resolution); + updateFramebufferSize(); + } } void Renderer::InitializeWindow() @@ -67,6 +75,7 @@ void Renderer::InitializeWindow() LOG_ERROR("GLFW: Failed to create window"); exit(EXIT_FAILURE); } + glfwSetWindowSizeCallback(m_Window, &glfwWindowSizeCallback); glfwSetFramebufferSizeCallback(m_Window, &glfwFrameBufferCallback); glfwMakeContextCurrent(m_Window); @@ -111,6 +120,30 @@ void Renderer::InputUpdate(double dt) } +void Renderer::setWindowSize(Rectangle size) +{ + glfwSetWindowSize(m_Window, size.Width, size.Height); +} + +void Renderer::updateFramebufferSize() +{ + Events::ResolutionChanged e; + e.OldResolution = m_ViewportSize; + + int width, height; + glfwGetFramebufferSize(m_Window, &width, &height); + glViewport(0, 0, width, height); + m_ViewportSize = Rectangle(width, height); + m_PickingPass->OnWindowResize(); + m_DrawFinalPass->OnWindowResize(); + m_LightCullingPass->OnWindowResize(); + m_DrawBloomPass->OnWindowResize(); + m_SSAOPass->OnWindowResize(); + + e.NewResolution = m_ViewportSize; + m_EventBroker->Publish(e); +} + void Renderer::Update(double dt) { m_EventBroker->Process(); @@ -263,6 +296,7 @@ void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filterin GLERROR("Texture initialization failed"); } + void Renderer::InitializeRenderPasses() { m_PickingPass = new PickingPass(this, m_EventBroker); From e9ef0e7060b5d86015496785d8d9f697cb871a05 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 10 Mar 2016 13:19:26 +0100 Subject: [PATCH 27/65] Disabled GLERROR macro for release builds --- include/Engine/Rendering/Util/GLError.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/Engine/Rendering/Util/GLError.h b/include/Engine/Rendering/Util/GLError.h index 2b244e1c..8efe45f3 100644 --- a/include/Engine/Rendering/Util/GLError.h +++ b/include/Engine/Rendering/Util/GLError.h @@ -16,7 +16,11 @@ inline bool _GLERROR(const char* info, const char* file, const char* func, unsig return false; } +#ifndef DEBUG #define GLERROR(function) \ _GLERROR(function, __BASE_FILE__, __func__, __LINE__) +#else +#define GLERROR(function) false +#endif #endif \ No newline at end of file From 28de31d84d8fffb4f59fc611c0d312352ec5d85d Mon Sep 17 00:00:00 2001 From: stiffly Date: Thu, 10 Mar 2016 13:28:38 +0100 Subject: [PATCH 28/65] FIX #196: Some variables had not been properly initialized and would cause the game to crash. --- include/Engine/Rendering/LightCullingPass.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/Engine/Rendering/LightCullingPass.h b/include/Engine/Rendering/LightCullingPass.h index 914fb8bb..f3b21705 100644 --- a/include/Engine/Rendering/LightCullingPass.h +++ b/include/Engine/Rendering/LightCullingPass.h @@ -54,7 +54,7 @@ private: struct Frustum { Plane Planes[4]; }; - Frustum* m_Frustums; + Frustum* m_Frustums = nullptr; //This should be a component struct LightSource { @@ -74,11 +74,11 @@ private: glm::vec2 Padding = glm::vec2(1.f, 2.f); }; - LightGrid* m_LightGrid; + LightGrid* m_LightGrid = nullptr; int m_LightOffset = 0; - float* m_LightIndex; + float* m_LightIndex = nullptr; }; From 329a15e08b05e350558ec742d4e5b4f01aaa50a0 Mon Sep 17 00:00:00 2001 From: Tleety Date: Thu, 10 Mar 2016 13:42:33 +0100 Subject: [PATCH 29/65] Bloom bad edge clamp fixed --- include/Engine/Rendering/DrawBloomPass.h | 2 +- .../Shaders/CombineGaussianTexture.frag.glsl | 14 +++++++++--- src/Engine/Rendering/DrawBloomPass.cpp | 22 ++++++++++--------- src/Engine/Rendering/DrawFinalPass.cpp | 8 +++---- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/include/Engine/Rendering/DrawBloomPass.h b/include/Engine/Rendering/DrawBloomPass.h index a76eb053..eaf17570 100644 --- a/include/Engine/Rendering/DrawBloomPass.h +++ b/include/Engine/Rendering/DrawBloomPass.h @@ -49,7 +49,7 @@ private: //const LightCullingPass* m_LightCullingPass int m_Iterations; int m_Quality = 0; - int m_BloomLod = 4; + int m_BloomLod = 5; GLuint m_GaussianTexture_horiz = 0; GLuint m_GaussianTexture_vert = 0; diff --git a/resources/Shaders/CombineGaussianTexture.frag.glsl b/resources/Shaders/CombineGaussianTexture.frag.glsl index 66892a6a..b6806493 100644 --- a/resources/Shaders/CombineGaussianTexture.frag.glsl +++ b/resources/Shaders/CombineGaussianTexture.frag.glsl @@ -1,6 +1,7 @@ #version 430 layout (binding = 0) uniform sampler2D Texture; +uniform int MaxMipMap; in VertexData{ @@ -11,12 +12,19 @@ out vec4 fragmentColor; void main() { + vec4 result = vec4(0.0, 0.0, 0.0, 0.0); + + for(int i = 0; i < MaxMipMap; i++) { + result += textureLod(Texture, Input.TextureCoordinate, i); + } + fragmentColor = result; +/* vec4 texel0 = textureLod(Texture, Input.TextureCoordinate, 0); vec4 texel1 = textureLod(Texture, Input.TextureCoordinate, 1); vec4 texel2 = textureLod(Texture, Input.TextureCoordinate, 2); vec4 texel3 = textureLod(Texture, Input.TextureCoordinate, 3); + vec4 texel4 = textureLod(Texture, Input.TextureCoordinate, 4); - fragmentColor = texel0 + texel1 + texel2 + texel3; + fragmentColor = texel0 + texel1 + texel2 + texel3 + texel4;*/ + } - - diff --git a/src/Engine/Rendering/DrawBloomPass.cpp b/src/Engine/Rendering/DrawBloomPass.cpp index f73611a2..72702299 100644 --- a/src/Engine/Rendering/DrawBloomPass.cpp +++ b/src/Engine/Rendering/DrawBloomPass.cpp @@ -76,12 +76,12 @@ void DrawBloomPass::InitializeShaderPrograms() void DrawBloomPass::InitializeBuffers() { CommonFunctions::GenerateMipMapTexture( - &m_GaussianTexture_horiz, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) + &m_GaussianTexture_horiz, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) , GL_RGB, GL_FLOAT, m_BloomLod); CommonFunctions::GenerateMipMapTexture( - &m_GaussianTexture_vert, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) + &m_GaussianTexture_vert, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) , GL_RGB, GL_FLOAT, m_BloomLod); - CommonFunctions::GenerateTexture(&m_FinalGaussianTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); + CommonFunctions::GenerateTexture(&m_FinalGaussianTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); if (m_GaussianCombineBuffer.GetHandle() == 0) { m_GaussianCombineBuffer.AddResource(std::shared_ptr(new Texture2D(&m_FinalGaussianTexture, GL_COLOR_ATTACHMENT0))); @@ -152,10 +152,10 @@ void DrawBloomPass::OnWindowResize() return; } CommonFunctions::GenerateMipMapTexture( - &m_GaussianTexture_vert, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) + &m_GaussianTexture_vert, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) , GL_RGB, GL_FLOAT, m_BloomLod); CommonFunctions::GenerateMipMapTexture( - &m_GaussianTexture_horiz, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) + &m_GaussianTexture_horiz, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) , GL_RGB, GL_FLOAT, m_BloomLod); for (int i = 0; i < m_BloomLod; i++) { m_GaussianFrameBuffer_vert[i].Generate(); @@ -174,12 +174,16 @@ void DrawBloomPass::GaussianLodPass(GLuint mipMap, GLuint texture) GLuint shaderHandle_horiz = m_GaussianProgram_horiz->GetHandle(); GLuint shaderHandle_vert = m_GaussianProgram_vert->GetHandle(); - //Horizontal pass, first use the given texture then save it to the horizontal framebuffer. - m_GaussianFrameBuffer_horiz[mipMap].Bind(); + m_GaussianProgram_vert->Bind(); + glUniform1i(glGetUniformLocation(shaderHandle_vert, "Lod"), mipMap); m_GaussianProgram_horiz->Bind(); glUniform1i(glGetUniformLocation(shaderHandle_horiz, "Lod"), mipMap); + //Horizontal pass, first use the given texture then save it to the horizontal framebuffer. + m_GaussianFrameBuffer_horiz[mipMap].Bind(); + + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture); glBindVertexArray(m_ScreenQuad->VAO); @@ -191,7 +195,6 @@ void DrawBloomPass::GaussianLodPass(GLuint mipMap, GLuint texture) //Vertical pass m_GaussianFrameBuffer_vert[mipMap].Bind(); m_GaussianProgram_vert->Bind(); - glUniform1i(glGetUniformLocation(shaderHandle_vert, "Lod"), mipMap); glActiveTexture(GL_TEXTURE0); @@ -206,7 +209,6 @@ void DrawBloomPass::GaussianLodPass(GLuint mipMap, GLuint texture) m_GaussianFrameBuffer_horiz[mipMap].Bind(); m_GaussianProgram_horiz->Bind(); - glUniform1i(glGetUniformLocation(shaderHandle_horiz, "Lod"), mipMap); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GaussianTexture_vert); @@ -222,7 +224,6 @@ void DrawBloomPass::GaussianLodPass(GLuint mipMap, GLuint texture) m_GaussianFrameBuffer_vert[mipMap].Bind(); m_GaussianProgram_vert->Bind(); - glUniform1i(glGetUniformLocation(shaderHandle_vert, "Lod"), mipMap); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GaussianTexture_horiz); @@ -241,6 +242,7 @@ void DrawBloomPass::CombineGaussianBlur() { m_GaussianCombineBuffer.Bind(); m_GaussianCombineProgram->Bind(); + glUniform1i(glGetUniformLocation(m_GaussianCombineProgram->GetHandle(), "MaxMipMap"), m_BloomLod); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GaussianTexture_vert); diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index c5b8c591..a18bd411 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -32,9 +32,9 @@ void DrawFinalPass::InitializeTextures() void DrawFinalPass::InitializeFrameBuffers() { - CommonFunctions::GenerateTexture(&m_SceneTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); + CommonFunctions::GenerateTexture(&m_SceneTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); //GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); - CommonFunctions::GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); + CommonFunctions::GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); //GenerateMipMapTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_FLOAT, 4); //GenerateTexture(&m_StencilTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_STENCIL, GL_STENCIL_INDEX8, GL_INT); @@ -345,8 +345,8 @@ void DrawFinalPass::OnWindowResize() //InitializeFrameBuffers(); CommonFunctions::GenerateTexture(&m_DepthBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8); - CommonFunctions::GenerateTexture(&m_SceneTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); - CommonFunctions::GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); + CommonFunctions::GenerateTexture(&m_SceneTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); + CommonFunctions::GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); m_FinalPassFrameBuffer.Generate(); GLERROR("Error changing texture resolutions"); From 50dbbb4ed4a5f25dd531451511b6f4390fd84db3 Mon Sep 17 00:00:00 2001 From: Tleety Date: Thu, 10 Mar 2016 13:47:16 +0100 Subject: [PATCH 30/65] SSAO now send in 0 as Lod level and some optimizations in SSAO and Blur pass. --- src/Engine/Rendering/DrawBloomPass.cpp | 7 +------ src/Engine/Rendering/SSAOPass.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/Engine/Rendering/DrawBloomPass.cpp b/src/Engine/Rendering/DrawBloomPass.cpp index 72702299..f70f25c1 100644 --- a/src/Engine/Rendering/DrawBloomPass.cpp +++ b/src/Engine/Rendering/DrawBloomPass.cpp @@ -200,8 +200,6 @@ void DrawBloomPass::GaussianLodPass(GLuint mipMap, GLuint texture) glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GaussianTexture_horiz); - glBindVertexArray(m_ScreenQuad->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ScreenQuad->ElementBuffer); glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->MaterialGroups()[0].material->EndIndex - m_ScreenQuad->MaterialGroups()[0].material->StartIndex +1 , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].material->StartIndex); //horizontal pass @@ -213,8 +211,6 @@ void DrawBloomPass::GaussianLodPass(GLuint mipMap, GLuint texture) glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GaussianTexture_vert); - glBindVertexArray(m_ScreenQuad->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ScreenQuad->ElementBuffer); glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->MaterialGroups()[0].material->EndIndex - m_ScreenQuad->MaterialGroups()[0].material->StartIndex +1 , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].material->StartIndex); m_GaussianFrameBuffer_horiz[mipMap].Unbind(); @@ -227,8 +223,7 @@ void DrawBloomPass::GaussianLodPass(GLuint mipMap, GLuint texture) glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GaussianTexture_horiz); - glBindVertexArray(m_ScreenQuad->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ScreenQuad->ElementBuffer); + glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->MaterialGroups()[0].material->EndIndex - m_ScreenQuad->MaterialGroups()[0].material->StartIndex +1 , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].material->StartIndex); diff --git a/src/Engine/Rendering/SSAOPass.cpp b/src/Engine/Rendering/SSAOPass.cpp index f3c7f74c..166bf924 100644 --- a/src/Engine/Rendering/SSAOPass.cpp +++ b/src/Engine/Rendering/SSAOPass.cpp @@ -233,6 +233,11 @@ void SSAOPass::Draw(GLuint depthBuffer, Camera* camera) GLuint shaderHandle_horiz = m_GaussianProgram_horiz->GetHandle(); GLuint shaderHandle_vert = m_GaussianProgram_vert->GetHandle(); + m_GaussianProgram_vert->Bind(); + glUniform1i(glGetUniformLocation(shaderHandle_vert, "Lod"), 0); + m_GaussianProgram_horiz->Bind(); + glUniform1i(glGetUniformLocation(shaderHandle_horiz, "Lod"), 0); + m_GaussianFrameBuffer_horiz.Bind(); m_GaussianProgram_horiz->Bind(); @@ -252,8 +257,6 @@ void SSAOPass::Draw(GLuint depthBuffer, Camera* camera) glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_Gaussian_horiz); - glBindVertexArray(m_ScreenQuad->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ScreenQuad->ElementBuffer); glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->MaterialGroups()[0].material->EndIndex - m_ScreenQuad->MaterialGroups()[0].material->StartIndex + 1 , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].material->StartIndex); //horizontal pass @@ -265,8 +268,6 @@ void SSAOPass::Draw(GLuint depthBuffer, Camera* camera) glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_Gaussian_vert); - glBindVertexArray(m_ScreenQuad->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ScreenQuad->ElementBuffer); glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->MaterialGroups()[0].material->EndIndex - m_ScreenQuad->MaterialGroups()[0].material->StartIndex + 1 , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].material->StartIndex); m_GaussianFrameBuffer_horiz.Unbind(); @@ -279,8 +280,7 @@ void SSAOPass::Draw(GLuint depthBuffer, Camera* camera) glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_Gaussian_horiz); - glBindVertexArray(m_ScreenQuad->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ScreenQuad->ElementBuffer); + glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->MaterialGroups()[0].material->EndIndex - m_ScreenQuad->MaterialGroups()[0].material->StartIndex + 1 , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].material->StartIndex); From dd63f4a1b40b799054798298fe0170fdcf770162 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 10 Mar 2016 13:51:18 +0100 Subject: [PATCH 31/65] Fixed FOV being used to calculate projection matrix being degrees when it should be radians, AGAIN. FOV angles are now correct! --- resources/Schema/Components/Camera.xml | 2 +- src/Engine/Editor/EditorRenderSystem.cpp | 2 +- src/Engine/Rendering/RenderSystem.cpp | 2 +- src/Engine/Rendering/Renderer.cpp | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/Schema/Components/Camera.xml b/resources/Schema/Components/Camera.xml index b9c28d53..00edcc00 100644 --- a/resources/Schema/Components/Camera.xml +++ b/resources/Schema/Components/Camera.xml @@ -1,6 +1,6 @@ - 45 + 59 0.01 5000 \ No newline at end of file diff --git a/src/Engine/Editor/EditorRenderSystem.cpp b/src/Engine/Editor/EditorRenderSystem.cpp index 97203dea..f31b63cf 100644 --- a/src/Engine/Editor/EditorRenderSystem.cpp +++ b/src/Engine/Editor/EditorRenderSystem.cpp @@ -86,7 +86,7 @@ bool EditorRenderSystem::OnSetCamera(Events::SetCamera& e) { ComponentWrapper cTransform = e.CameraEntity["Transform"]; ComponentWrapper cCamera = e.CameraEntity["Camera"]; - m_EditorCamera->SetFOV(static_cast((double)cCamera["FOV"])); + m_EditorCamera->SetFOV(glm::radians(static_cast((double)cCamera["FOV"]))); m_EditorCamera->SetNearClip(static_cast((double)cCamera["NearClip"])); m_EditorCamera->SetFarClip(static_cast((double)cCamera["FarClip"])); m_EditorCamera->SetPosition(cTransform["Position"]); diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index d685c443..fee539d4 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -32,7 +32,7 @@ bool RenderSystem::OnSetCamera(Events::SetCamera& e) { ComponentWrapper cTransform = e.CameraEntity["Transform"]; ComponentWrapper cCamera = e.CameraEntity["Camera"]; - m_Camera->SetFOV((double)cCamera["FOV"]); + m_Camera->SetFOV(glm::radians((double)cCamera["FOV"])); m_Camera->SetNearClip((double)cCamera["NearClip"]); m_Camera->SetFarClip((double)cCamera["FarClip"]); m_Camera->SetPosition(cTransform["Position"]); diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 09c35baa..eecb5a7a 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -122,6 +122,7 @@ void Renderer::InputUpdate(double dt) void Renderer::setWindowSize(Rectangle size) { + m_Resolution = size; glfwSetWindowSize(m_Window, size.Width, size.Height); } From 79d0ef4529cdf20eb2ccaae64b9f0c3b38db633f Mon Sep 17 00:00:00 2001 From: Tleety Date: Thu, 10 Mar 2016 14:01:45 +0100 Subject: [PATCH 32/65] Changed default value of glow intensity --- resources/Schema/Components/Model.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/Schema/Components/Model.xml b/resources/Schema/Components/Model.xml index 35b05b69..99190e1f 100644 --- a/resources/Schema/Components/Model.xml +++ b/resources/Schema/Components/Model.xml @@ -9,5 +9,5 @@ true true true - 3.0 + 1.0 \ No newline at end of file From 0a94373f3fd00aa2f8c2b18cd088dbae9e6090a0 Mon Sep 17 00:00:00 2001 From: verysecrethero Date: Thu, 10 Mar 2016 14:38:20 +0100 Subject: [PATCH 33/65] The children of the CapturePointModels now also get their visibility on/off. This is done since a capturepoint is actually 2 models and not just 1 --- include/Game/Systems/CapturePointSystem.h | 1 + src/Game/Systems/CapturePointSystem.cpp | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/Game/Systems/CapturePointSystem.h b/include/Game/Systems/CapturePointSystem.h index 3cf72e15..6211ad49 100644 --- a/include/Game/Systems/CapturePointSystem.h +++ b/include/Game/Systems/CapturePointSystem.h @@ -30,6 +30,7 @@ private: bool CapturePointSystem::OnTriggerLeave(const Events::TriggerLeave& e); EventRelay m_ECaptured; bool CapturePointSystem::OnCaptured(const Events::Captured& e); + void ChangeCapturePointModelsVisibility(EntityWrapper &capturePointModels, bool isOwner); bool m_WinnerWasFound = false; //need to track these variables for the captureSystem to work as per design! diff --git a/src/Game/Systems/CapturePointSystem.cpp b/src/Game/Systems/CapturePointSystem.cpp index 4647d1b7..064136a7 100644 --- a/src/Game/Systems/CapturePointSystem.cpp +++ b/src/Game/Systems/CapturePointSystem.cpp @@ -109,9 +109,9 @@ void CapturePointSystem::UpdateComponent(EntityWrapper& capturePointEntity, Comp for (int i = 0; i < m_NumberOfCapturePoints; i++) { auto owner = (int)m_CapturePointNumberToEntityMap[i]["Team"]["Team"]; if (m_CapturePointNumberToEntityMap[i].FirstChildByName("Red").ID != EntityID_Invalid) { - (bool&)m_CapturePointNumberToEntityMap[i].FirstChildByName("Red")["Model"]["Visible"] = owner == redTeam ? true : false; - (bool&)m_CapturePointNumberToEntityMap[i].FirstChildByName("Blue")["Model"]["Visible"] = owner == blueTeam ? true : false; - (bool&)m_CapturePointNumberToEntityMap[i].FirstChildByName("Spectator")["Model"]["Visible"] = owner == spectatorTeam ? true : false; + ChangeCapturePointModelsVisibility(m_CapturePointNumberToEntityMap[i].FirstChildByName("Red"), owner == redTeam); + ChangeCapturePointModelsVisibility(m_CapturePointNumberToEntityMap[i].FirstChildByName("Blue"), owner == blueTeam); + ChangeCapturePointModelsVisibility(m_CapturePointNumberToEntityMap[i].FirstChildByName("Spectator"), owner == spectatorTeam); } } //save the next cap points and publish the captured event @@ -232,6 +232,14 @@ void CapturePointSystem::UpdateComponent(EntityWrapper& capturePointEntity, Comp } +void CapturePointSystem::ChangeCapturePointModelsVisibility(EntityWrapper &capturePointModels, bool isOwner) { + (bool&)capturePointModels["Model"]["Visible"] = isOwner; + for (auto& capModel : capturePointModels.ChildrenWithComponent("Model")) + { + (bool&)capModel["Model"]["Visible"] = isOwner; + } +} + bool CapturePointSystem::OnTriggerTouch(const Events::TriggerTouch& e) { //personEntered = e.Entity, thingEntered = e.Trigger From 67dfbfff0179fa1966acf861f7a09856cf237f20 Mon Sep 17 00:00:00 2001 From: Jocke Date: Thu, 10 Mar 2016 14:44:06 +0100 Subject: [PATCH 34/65] Fixed multiply connections --- include/Engine/Network/Packet.h | 4 +- include/Engine/Network/UDPServer.h | 1 + src/Engine/Network/Packet.cpp | 12 +++++- src/Engine/Network/Server.cpp | 4 +- src/Engine/Network/UDPClient.cpp | 3 +- src/Engine/Network/UDPServer.cpp | 68 +++++++++++++++++++++++++++--- 6 files changed, 79 insertions(+), 13 deletions(-) diff --git a/include/Engine/Network/Packet.h b/include/Engine/Network/Packet.h index c885e59a..db6f0aa0 100644 --- a/include/Engine/Network/Packet.h +++ b/include/Engine/Network/Packet.h @@ -60,7 +60,9 @@ public: void UpdateSize(); char* ReadData(int SizeOfData); void ChangePacketID(unsigned int& packetID); - void ChangeSequenceNumber(int sequenceNumber, int sequenceLength, int groupNumber); + 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(); diff --git a/include/Engine/Network/UDPServer.h b/include/Engine/Network/UDPServer.h index 1d37f642..19b5531c 100644 --- a/include/Engine/Network/UDPServer.h +++ b/include/Engine/Network/UDPServer.h @@ -14,6 +14,7 @@ public: void AcceptNewConnections(int& nextPlayerID, std::map& connectedPlayers); void Receive(Packet & packet, PlayerDefinition & playerDefinition); void Send(Packet & packet, PlayerDefinition & playerDefinition); + void SendToConnectedPlayers(Packet & packet, std::map& playersTosendTo); void Send(Packet & packet); void Send(Packet & packet, boost::asio::ip::udp::endpoint endpoint); void Broadcast(Packet & packet, int port); diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index 3e4bf043..8d470d06 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -146,11 +146,19 @@ void Packet::ChangePacketID(unsigned int & packetID) memcpy(m_Data + packetIDOffset, &packetID, sizeof(int)); } -void Packet::ChangeSequenceNumber(int groupIndex, int groupSize, int groupNumber) +void Packet::ChangeGroupIndex(int groupIndex) { memcpy(m_Data + groupIndexOffset, &groupIndex, sizeof(int)); +} + +void Packet::ChangeGroupSize(int groupSize) +{ memcpy(m_Data + groupSizeOffset, &groupSize, sizeof(int)); - memcpy(m_Data + groupOffset, &groupNumber, sizeof(int)); +} + +void Packet::ChangeGroup(int group) +{ + memcpy(m_Data + groupOffset, &group, sizeof(int)); } MessageType Packet::GetMessageType() diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index ba5295b7..2b11b9c3 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -164,9 +164,7 @@ void Server::reliableBroadcast(Packet& packet) void Server::unreliableBroadcast(Packet& packet) { - for (auto& kv : m_ConnectedPlayers) { - m_Unreliable.Send(packet, kv.second); - } + m_Unreliable.SendToConnectedPlayers(packet, m_ConnectedPlayers); } // Send snapshot fields diff --git a/src/Engine/Network/UDPClient.cpp b/src/Engine/Network/UDPClient.cpp index 66ebce12..5bd3877e 100644 --- a/src/Engine/Network/UDPClient.cpp +++ b/src/Engine/Network/UDPClient.cpp @@ -1,4 +1,5 @@ #include "Network/UDPClient.h" +#include "boost/asio/basic_datagram_socket.hpp" using namespace boost::asio::ip; @@ -15,9 +16,9 @@ bool UDPClient::Connect(std::string playerName, std::string address, int port) } m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address().from_string(address), port); m_Socket = boost::shared_ptr(new boost::asio::ip::udp::socket(m_IOService)); + m_Socket->open(boost::asio::ip::udp::v4()); boost::asio::socket_base::receive_buffer_size option(819200); m_Socket->set_option(option); - m_Socket->open(boost::asio::ip::udp::v4()); return true; } diff --git a/src/Engine/Network/UDPServer.cpp b/src/Engine/Network/UDPServer.cpp index cf6844d9..818fa8fb 100644 --- a/src/Engine/Network/UDPServer.cpp +++ b/src/Engine/Network/UDPServer.cpp @@ -13,7 +13,7 @@ UDPServer::UDPServer(int port) UDPServer::~UDPServer() { } // TODO: Fix correct groups -void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) +void UDPServer::Send(Packet& packet, PlayerDefinition& playerDefinition) { packet.UpdateSize(); try { @@ -23,14 +23,16 @@ void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) // Remove header from packet. packet.ReadData(packet.HeaderSize()); int totalBytesSent = 0; - int sequenceNumber = 1; - int totalMessages = std::ceil((float)packet.Size() / MAXPACKETSIZE); + int groupIndex = 1; + int groupSize = std::ceil((float)packet.Size() / MAXPACKETSIZE); int packetDataSent = 0; int packetDataSize = packet.Size() - packet.HeaderSize(); while (packetDataSize > packetDataSent) { Packet splitPacket(packet.GetMessageType(), playerDefinition.PacketID); - splitPacket.ChangeSequenceNumber(sequenceNumber, totalMessages, playerDefinition.PacketGroup); + splitPacket.ChangeGroupIndex(groupIndex); + splitPacket.ChangeGroupSize(groupSize); + splitPacket.ChangeGroup(playerDefinition.PacketGroup); int amountToSend = packetDataSize - packetDataSent; if (amountToSend > MAXPACKETSIZE) { amountToSend = MAXPACKETSIZE; @@ -46,8 +48,8 @@ void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) 0); packetDataSent += bytesSent - splitPacket.HeaderSize(); totalBytesSent += bytesSent; - // LOG_INFO("bytesSent size %i, groupIndex: %i. Number of packets: %i", bytesSent, sequenceNumber, totalMessages); - ++sequenceNumber; + //LOG_INFO("bytesSent size %i, groupIndex: %i. Number of packets: %i", bytesSent, sequenceNumber, totalMessages); + ++groupIndex; } playerDefinition.PacketGroup++; } catch (const boost::system::system_error& e) { @@ -56,6 +58,60 @@ void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) playerDefinition.Endpoint = boost::asio::ip::udp::endpoint(); } } + +void UDPServer::SendToConnectedPlayers(Packet& packet, std::map& playersTosendTo) +{ + // Work in progress + packet.UpdateSize(); + + //Debug + int debugTheSixeOfpacket = packet.Size(); + //Debug end + // Remove header from packet. + packet.ReadData(packet.HeaderSize()); + int totalBytesSent = 0; + int groupIndex = 1; + int groupSize = std::ceil((float)packet.Size() / MAXPACKETSIZE); + int packetDataSent = 0; + int packetDataSize = packet.Size() - packet.HeaderSize(); + + while (packetDataSize > packetDataSent) { + Packet splitPacket(packet.GetMessageType()); + splitPacket.ChangeGroupIndex(groupIndex); + splitPacket.ChangeGroupSize(groupSize); + int amountToSend = packetDataSize - packetDataSent; + if (amountToSend > MAXPACKETSIZE) { + amountToSend = MAXPACKETSIZE; + } + splitPacket.WriteData(packet.ReadData(amountToSend), amountToSend); + splitPacket.UpdateSize(); + // Remove header size from bytes sent soo that we only + // count data in the packet + int bytesSent = 0; + for (auto& kv : playersTosendTo) { + try { + splitPacket.ChangeGroup(kv.second.PacketGroup); + bytesSent = m_Socket->send_to( + boost::asio::buffer(splitPacket.Data(), splitPacket.Size()), + kv.second.Endpoint, + 0); + } catch (const boost::system::system_error& e) { + LOG_INFO(e.what()); + // TODO: Clean up invalid endpoints out of m_ConnectedPlayers later + kv.second.Endpoint = boost::asio::ip::udp::endpoint(); + } + } + packetDataSent += splitPacket.Size() - splitPacket.HeaderSize(); + totalBytesSent += splitPacket.Size(); + + //LOG_INFO("bytesSent size %i, groupIndex: %i. Number of packets: %i", bytesSent, sequenceNumber, totalMessages); + ++groupIndex; + } + for (auto& kv : playersTosendTo) { + kv.second.PacketGroup++; + } +} + // Send back to endpoint of received packet void UDPServer::Send(Packet & packet) { From 4322a5d8dae2c9d1f9377d304f167cfb3d2353b8 Mon Sep 17 00:00:00 2001 From: Tleety Date: Thu, 10 Mar 2016 15:21:11 +0100 Subject: [PATCH 35/65] Some fixes for sprites --- include/Engine/Rendering/SpriteJob.h | 14 +- resources/Schema/Components/Sprite.xml | 2 + resources/Schema/Components/Sprite.xsd | 12 +- resources/Schema/Entities/OverwatchCamera.xml | 167 ++++++++++-------- src/Engine/Rendering/DrawFinalPass.cpp | 8 +- src/Engine/Rendering/TextureSprite.cpp | 2 +- 6 files changed, 124 insertions(+), 81 deletions(-) diff --git a/include/Engine/Rendering/SpriteJob.h b/include/Engine/Rendering/SpriteJob.h index 6b52144f..6ba2e63f 100644 --- a/include/Engine/Rendering/SpriteJob.h +++ b/include/Engine/Rendering/SpriteJob.h @@ -21,14 +21,23 @@ struct SpriteJob : RenderJob SpriteJob(ComponentWrapper cSprite, Camera* camera, glm::mat4 matrix, World* world, glm::vec4 fillColor, float fillPercentage, bool depthSorted, bool isIndicator) : RenderJob() { - Model = ResourceManager::Load<::Model>("Models/Core/UnitQuad.mesh"); + Model = ResourceManager::Load<::Model>((std::string)cSprite["Model"]); ::RawModel::MaterialProperties matProp = Model->MaterialGroups().front(); TextureID = 0; DiffuseTexture = CommonFunctions::TryLoadResource(cSprite["DiffuseTexture"]); - IncandescenceTexture = CommonFunctions::TryLoadResource(cSprite["GlowMap"]); + if ((bool)cSprite["Linear"]) { + glBindTexture(GL_TEXTURE_2D, DiffuseTexture->m_Texture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } else { + glBindTexture(GL_TEXTURE_2D, DiffuseTexture->m_Texture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } + StartIndex = matProp.material->StartIndex; EndIndex = matProp.material->EndIndex; Matrix = matrix; @@ -89,6 +98,7 @@ struct SpriteJob : RenderJob bool BlurBackground = false; float ScaleX = 1; float ScaleY = 1; + bool Linear = false; glm::vec4 FillColor = glm::vec4(0); float FillPercentage = 0.0; diff --git a/resources/Schema/Components/Sprite.xml b/resources/Schema/Components/Sprite.xml index 2c0465e9..a1963ff8 100644 --- a/resources/Schema/Components/Sprite.xml +++ b/resources/Schema/Components/Sprite.xml @@ -1,5 +1,6 @@ + Models/Core/UnitQuad.mesh @@ -8,5 +9,6 @@ false false false + false false diff --git a/resources/Schema/Components/Sprite.xsd b/resources/Schema/Components/Sprite.xsd index eab74bfc..af4860c8 100644 --- a/resources/Schema/Components/Sprite.xsd +++ b/resources/Schema/Components/Sprite.xsd @@ -9,14 +9,17 @@ + + The model the sprite will use. + - Diffuse Texture file + Diffuse Texture file. - GlowMap file + GlowMap file. - Color tint + Color tint. Whether the model is visible or not @@ -33,6 +36,9 @@ Keep a 1:1 ratio between X and Y. + + If it should use Linear or Nearest sampling method. + Wether the background should be blurred begind this sprite. diff --git a/resources/Schema/Entities/OverwatchCamera.xml b/resources/Schema/Entities/OverwatchCamera.xml index 6c93f033..92540e5b 100644 --- a/resources/Schema/Entities/OverwatchCamera.xml +++ b/resources/Schema/Entities/OverwatchCamera.xml @@ -8,7 +8,7 @@ - + @@ -34,13 +34,49 @@ + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Assault-01.png + + + PickClass + 1 + + + + + + + + + + + Assault + Fonts/DroidSans.ttf,64 + + + + + + + + + + + - Textures/Icons/Classes/Defender-01.png - false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Defender-01.png PickClass @@ -72,9 +108,10 @@ - Textures/Icons/Classes/Sniper-01.png - false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Sniper-01.png PickClass @@ -102,40 +139,6 @@ - - - - - Textures/Icons/Classes/Assault-01.png - - false - - - PickClass - 1 - - - - - - - - - - - Assault - Fonts/DroidSans.ttf,64 - - - - - - - - - - - @@ -154,9 +157,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -232,9 +236,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -266,10 +271,11 @@ - Textures/Core/UnitHexagon.png + Models/Core/UnitQuad.mesh - false + Textures/Core/UnitHexagon.png + true PickTeam @@ -300,10 +306,12 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + true PickTeam @@ -334,9 +342,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png false @@ -422,9 +431,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -441,9 +451,10 @@ 3 - Textures/Core/UnitHexagon_Rotated.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png @@ -458,9 +469,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -477,9 +489,10 @@ 4 - Textures/Core/UnitHexagon_Rotated.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png @@ -494,9 +507,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -513,9 +527,10 @@ 2 - Textures/Core/UnitHexagon_Rotated.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png @@ -530,9 +545,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -550,9 +566,10 @@ 1 - Textures/Core/UnitHexagon_Rotated.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png @@ -567,9 +584,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -584,9 +602,10 @@ - Textures/Core/UnitHexagon_Rotated.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png @@ -604,9 +623,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -651,9 +671,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index a18bd411..a685a6d3 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -1271,14 +1271,15 @@ void DrawFinalPass::DrawSprites(std::list>&jobs, Rend glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); glUniform3fv(glGetUniformLocation(shaderHandle, "CameraPos"), 1, glm::value_ptr(scene.Camera->Position())); + RenderState* jobState = new RenderState(); + for(auto& job : jobs) { auto spriteJob = std::dynamic_pointer_cast(job); - RenderState jobState; if (spriteJob) { if(spriteJob->Depth == 0) { - jobState.Disable(GL_DEPTH_TEST); + jobState->Disable(GL_DEPTH_TEST); } glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix() * spriteJob->Matrix)); glUniform4fv(glGetUniformLocation(shaderHandle, "Color"), 1, glm::value_ptr(spriteJob->Color)); @@ -1294,6 +1295,8 @@ void DrawFinalPass::DrawSprites(std::list>&jobs, Rend glBindTexture(GL_TEXTURE_2D, m_ErrorTexture->m_Texture); } + + glActiveTexture(GL_TEXTURE2); if (spriteJob->IncandescenceTexture != nullptr) { glBindTexture(GL_TEXTURE_2D, spriteJob->IncandescenceTexture->m_Texture); @@ -1307,6 +1310,7 @@ void DrawFinalPass::DrawSprites(std::list>&jobs, Rend glDrawElements(GL_TRIANGLES, spriteJob->EndIndex - spriteJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(spriteJob->StartIndex*sizeof(unsigned int))); } } + delete jobState; // m_SpriteProgram->Unbind(); } diff --git a/src/Engine/Rendering/TextureSprite.cpp b/src/Engine/Rendering/TextureSprite.cpp index 2a43e455..70d086cd 100644 --- a/src/Engine/Rendering/TextureSprite.cpp +++ b/src/Engine/Rendering/TextureSprite.cpp @@ -6,6 +6,6 @@ TextureSprite::TextureSprite(std::string path) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST_MIPMAP_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); GLERROR("Texture load"); } \ No newline at end of file From 7e6288c597e42c6a04a25e80f040e2d965a0394a Mon Sep 17 00:00:00 2001 From: Tleety Date: Thu, 10 Mar 2016 15:36:33 +0100 Subject: [PATCH 36/65] Some merge fixes and some sprite fixes. --- include/Engine/Rendering/SpriteJob.h | 28 ++++++++----------- .../Shaders/CombineGaussianTexture.frag.glsl | 9 ------ src/Engine/Rendering/DrawFinalPass.cpp | 10 +++++-- 3 files changed, 19 insertions(+), 28 deletions(-) diff --git a/include/Engine/Rendering/SpriteJob.h b/include/Engine/Rendering/SpriteJob.h index 6ba2e63f..3d55e721 100644 --- a/include/Engine/Rendering/SpriteJob.h +++ b/include/Engine/Rendering/SpriteJob.h @@ -28,15 +28,7 @@ struct SpriteJob : RenderJob DiffuseTexture = CommonFunctions::TryLoadResource(cSprite["DiffuseTexture"]); IncandescenceTexture = CommonFunctions::TryLoadResource(cSprite["GlowMap"]); - if ((bool)cSprite["Linear"]) { - glBindTexture(GL_TEXTURE_2D, DiffuseTexture->m_Texture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - } else { - glBindTexture(GL_TEXTURE_2D, DiffuseTexture->m_Texture); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - } + Linear = (bool)cSprite["Linear"]; StartIndex = matProp.material->StartIndex; EndIndex = matProp.material->EndIndex; @@ -60,21 +52,23 @@ struct SpriteJob : RenderJob glm::vec3 scale = Transform::AbsoluteScale(world, cSprite.EntityID); - if((bool)cSprite["KeepRatioX"] == true) { - ScaleX = scale.x; - } - if ((bool)cSprite["KeepRatioY"] == true) { - ScaleY = scale.y; - } if((bool)cSprite["KeepRatio"] == true) { if(scale.y >= scale.x) { ScaleY = (scale.x)/(scale.y); - ScaleX = 1; + ScaleX = 1.f; } else { - ScaleY = 1; + ScaleY = 1.f; ScaleX = (scale.x)/(scale.y); } + } else { + if ((bool)cSprite["KeepRatioX"] == true) { + ScaleX = scale.x; + } + if ((bool)cSprite["KeepRatioY"] == true) { + ScaleY = scale.y; + } } + }; unsigned int TextureID; diff --git a/resources/Shaders/CombineGaussianTexture.frag.glsl b/resources/Shaders/CombineGaussianTexture.frag.glsl index b6806493..93c36fb8 100644 --- a/resources/Shaders/CombineGaussianTexture.frag.glsl +++ b/resources/Shaders/CombineGaussianTexture.frag.glsl @@ -18,13 +18,4 @@ void main() result += textureLod(Texture, Input.TextureCoordinate, i); } fragmentColor = result; -/* - vec4 texel0 = textureLod(Texture, Input.TextureCoordinate, 0); - vec4 texel1 = textureLod(Texture, Input.TextureCoordinate, 1); - vec4 texel2 = textureLod(Texture, Input.TextureCoordinate, 2); - vec4 texel3 = textureLod(Texture, Input.TextureCoordinate, 3); - vec4 texel4 = textureLod(Texture, Input.TextureCoordinate, 4); - - fragmentColor = texel0 + texel1 + texel2 + texel3 + texel4;*/ - } diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index a685a6d3..d03b0c2b 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -1291,12 +1291,18 @@ void DrawFinalPass::DrawSprites(std::list>&jobs, Rend glActiveTexture(GL_TEXTURE1); if (spriteJob->DiffuseTexture != nullptr) { glBindTexture(GL_TEXTURE_2D, spriteJob->DiffuseTexture->m_Texture); + if (spriteJob->Linear) { + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } else { + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } + } else { glBindTexture(GL_TEXTURE_2D, m_ErrorTexture->m_Texture); } - - glActiveTexture(GL_TEXTURE2); if (spriteJob->IncandescenceTexture != nullptr) { glBindTexture(GL_TEXTURE_2D, spriteJob->IncandescenceTexture->m_Texture); From e734d0c953f7912caa57810a7cc629377a79f0c5 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 10 Mar 2016 15:47:32 +0100 Subject: [PATCH 37/65] Oops. --- include/Engine/Rendering/Util/GLError.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Engine/Rendering/Util/GLError.h b/include/Engine/Rendering/Util/GLError.h index 8efe45f3..740a5a3c 100644 --- a/include/Engine/Rendering/Util/GLError.h +++ b/include/Engine/Rendering/Util/GLError.h @@ -16,7 +16,7 @@ inline bool _GLERROR(const char* info, const char* file, const char* func, unsig return false; } -#ifndef DEBUG +#ifdef DEBUG #define GLERROR(function) \ _GLERROR(function, __BASE_FILE__, __func__, __LINE__) #else From 78129cf432a0bb46ab3b89cd81048e90080c0f11 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 10 Mar 2016 15:47:47 +0100 Subject: [PATCH 38/65] Fixed picking depth values after depth buffer was changed to a texture. --- src/Engine/Rendering/PickingPass.cpp | 2 +- src/Engine/Rendering/Util/ScreenCoords.cpp | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index 93783e19..820c184e 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -24,7 +24,7 @@ void PickingPass::InitializeTextures() glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RG8, GL_RG, GL_UNSIGNED_BYTE); CommonFunctions::GenerateTexture(&m_DepthBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST, - glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH_COMPONENT32, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT); + glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT); } void PickingPass::InitializeFrameBuffers() diff --git a/src/Engine/Rendering/Util/ScreenCoords.cpp b/src/Engine/Rendering/Util/ScreenCoords.cpp index a858524d..a8d8a662 100644 --- a/src/Engine/Rendering/Util/ScreenCoords.cpp +++ b/src/Engine/Rendering/Util/ScreenCoords.cpp @@ -36,10 +36,6 @@ ScreenCoords::PixelData ScreenCoords::ToPixelData(float x, float y, FrameBuffer* unsigned char pdata[3]; glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pdata); GLERROR("glReadPixels(pdata) Error"); - PickDataBuffer->Unbind(); - GLERROR("Unbind Error"); - glBindFramebuffer(GL_FRAMEBUFFER, DepthBuffer); - GLERROR("glBindFramebuffer(DepthBuffer) Error"); float depthData; glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depthData); GLERROR("glReadPixels(depthData) Error"); From a8a4b5d2a2fb2e7a887c92b670ec6a6e548f0b31 Mon Sep 17 00:00:00 2001 From: Jocke Date: Thu, 10 Mar 2016 15:59:55 +0100 Subject: [PATCH 39/65] Disconnect on udp --- src/Engine/Network/Client.cpp | 2 ++ src/Engine/Network/UDPClient.cpp | 12 ++++++++---- src/Engine/Network/UDPServer.cpp | 1 + 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 62fee514..6737b3ee 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -381,6 +381,7 @@ void Client::ignoreFields(Packet& packet, const ComponentInfo& componentInfo) void Client::parseSnapshot(Packet& packet) { + LOG_INFO("Snapshot received"); // Read input commands std::size_t numInputCommands = packet.ReadPrimitive(); for (std::size_t i = 0; i < numInputCommands; ++i) { @@ -471,6 +472,7 @@ void Client::disconnect() m_PacketID = 0; Packet packet(MessageType::Disconnect, m_SendPacketID); m_Reliable.Send(packet); + m_Unreliable.Disconnect(); m_Reliable.Disconnect(); createMainMenu(); } diff --git a/src/Engine/Network/UDPClient.cpp b/src/Engine/Network/UDPClient.cpp index 5bd3877e..149e860b 100644 --- a/src/Engine/Network/UDPClient.cpp +++ b/src/Engine/Network/UDPClient.cpp @@ -24,7 +24,13 @@ bool UDPClient::Connect(std::string playerName, std::string address, int port) void UDPClient::Disconnect() { + m_Socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both); + m_Socket->close(); + m_Socket = nullptr; + int lastReceivedSnapshotGroup = 0; + m_PacketSegmentMap.clear(); + PacketID m_SendPacketID = 0; } void UDPClient::Receive(Packet& packet) @@ -100,9 +106,7 @@ void UDPClient::readPartOfPacket() memcpy(&packetGroupIndex, m_ReadBuffer + 2 * sizeof(int), sizeof(int)); int packetGroupSize = 0; memcpy(&packetGroupSize, m_ReadBuffer + 3 * sizeof(int), sizeof(int)); - //LOG_INFO("Packet group: %i. Group index: %i. Group size: %i", packetGroup, packetGroupIndex, packetGroupSize); - //LOG_INFO("Packet size: %i.", sizeOfPacket); - + LOG_INFO("Packet group: %i. Group index: %i. Group size: %i. Packet size: %i.", packetGroup, packetGroupIndex, packetGroupSize, sizeOfPacket); if (sizeOfPacket > m_Socket->available()) { LOG_WARNING("UDPClient::readBuffer(): We haven't got the whole packet yet."); // return; @@ -213,7 +217,7 @@ bool UDPClient::GetNextPacket(Packet & packet) lastReceivedSnapshotGroup = packet.Group(); } // No need to get next it as we are returning. - //LOG_INFO("Packet parsed"); + LOG_INFO("Packet parsed"); m_PacketSegmentMap.erase(it); return true; } else { diff --git a/src/Engine/Network/UDPServer.cpp b/src/Engine/Network/UDPServer.cpp index 818fa8fb..c3f87fd7 100644 --- a/src/Engine/Network/UDPServer.cpp +++ b/src/Engine/Network/UDPServer.cpp @@ -95,6 +95,7 @@ void UDPServer::SendToConnectedPlayers(Packet& packet, std::map Date: Thu, 10 Mar 2016 16:02:03 +0100 Subject: [PATCH 40/65] Changed sprite text --- resources/Schema/Components/Sprite.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/Schema/Components/Sprite.xml b/resources/Schema/Components/Sprite.xml index a1963ff8..9ba27381 100644 --- a/resources/Schema/Components/Sprite.xml +++ b/resources/Schema/Components/Sprite.xml @@ -9,6 +9,6 @@ false false false - false + true false From 038a706e28255b9f8a2406a3e96c445a9996b6f1 Mon Sep 17 00:00:00 2001 From: William Moberg Date: Thu, 10 Mar 2016 16:05:30 +0100 Subject: [PATCH 41/65] Don't collide against disabled (invisible) models. Triggers uses model vs. box instead of only box vs. box. --- include/Engine/Collision/Collision.h | 12 +++++ src/Engine/Collision/Collision.cpp | 63 ++++++++++++++++++------ src/Engine/Collision/CollisionSystem.cpp | 10 +++- src/Engine/Collision/TriggerSystem.cpp | 41 +++++++++++---- 4 files changed, 101 insertions(+), 25 deletions(-) diff --git a/include/Engine/Collision/Collision.h b/include/Engine/Collision/Collision.h index 9e1a81db..c616df6b 100644 --- a/include/Engine/Collision/Collision.h +++ b/include/Engine/Collision/Collision.h @@ -84,6 +84,18 @@ bool AABBvsTriangles(const AABB& box, const std::vector& modelIndices, const glm::mat4& modelMatrix); +enum Output +{ + OutContained, + OutSeparated, + OutIntersecting +}; +//Detects intersection and containment. +Output AABBvsTrianglesWContainment(const AABB& box, + const RawModel::Vertex* modelVertices, + const std::vector& modelIndices, + const glm::mat4& modelMatrix); + //Return true if the boxes are intersecting. bool AABBVsAABB(const AABB& a, const AABB& b); //Return true if the boxes are intersecting. diff --git a/src/Engine/Collision/Collision.cpp b/src/Engine/Collision/Collision.cpp index 68d99d92..f12435fe 100644 --- a/src/Engine/Collision/Collision.cpp +++ b/src/Engine/Collision/Collision.cpp @@ -360,7 +360,14 @@ constexpr bool FaceIsGround(float faceNormalY) //An array containing 3 int pairs { 0, 2 }, { 0, 1 }, { 1, 2 } constexpr std::array, 3> dimensionPairs({ std::pair(0, 2), std::pair(0, 1), std::pair(1, 2) }); -bool AABBvsTriangle(const AABB& box, +enum class BoxTriRes +{ + Front, + Behind, + Intersect +}; + +BoxTriRes AABBvsTriangle(const AABB& box, const std::array& 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 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,11 +472,11 @@ 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; @@ -498,7 +508,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,10 +543,10 @@ bool AABBvsTriangle(const AABB& box, boxVelocity = boxVelocity - glm::dot(boxVelocity, projNorm) * projNorm; } } - return true; + return BoxTriRes::Intersect; } -bool AABBvsTriangles(const AABB& box, +Output AABBvsTriangles(const AABB& box, const RawModel::Vertex* modelVertices, const std::vector& modelIndices, const glm::mat4& modelMatrix, @@ -546,8 +556,8 @@ 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); @@ -560,20 +570,27 @@ bool AABBvsTriangles(const AABB& box, }; 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, @@ -593,13 +610,31 @@ bool AABBvsTriangles(const AABB& box, verticalStepHeight, isOnGround, outResolutionVector, - true); + true) == Output::OutIntersecting; } bool AABBvsTriangles(const AABB& box, const RawModel::Vertex* modelVertices, const std::vector& 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 RawModel::Vertex* modelVertices, + const std::vector& modelIndices, + const glm::mat4& modelMatrix) { glm::vec3 vel, outres; bool g; diff --git a/src/Engine/Collision/CollisionSystem.cpp b/src/Engine/Collision/CollisionSystem.cpp index 53cabfac..7bf76a2e 100644 --- a/src/Engine/Collision/CollisionSystem.cpp +++ b/src/Engine/Collision/CollisionSystem.cpp @@ -37,6 +37,10 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c bool hit; float dist; if (boxB.Entity.HasComponent("Model")) { + if (!((bool)boxB.Entity["Model"]["Visible"])) { + // Don't collide against invisible models. + continue; + } RawModel* model; std::string res = (std::string)boxB.Entity["Model"]["Resource"]; try { @@ -77,7 +81,11 @@ 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. + // Here we know boxB is a entity with Collideable, AABB, and Model. + if (!((bool)boxB.Entity["Model"]["Visible"])) { + // Don't collide against invisible models. + continue; + } RawModel* model; try { model = ResourceManager::Load(boxB.Entity["Model"]["Resource"]); diff --git a/src/Engine/Collision/TriggerSystem.cpp b/src/Engine/Collision/TriggerSystem.cpp index 21a47721..ef18629a 100644 --- a/src/Engine/Collision/TriggerSystem.cpp +++ b/src/Engine/Collision/TriggerSystem.cpp @@ -10,6 +10,16 @@ void TriggerSystem::UpdateComponent(EntityWrapper& triggerEntity, ComponentWrapp return; } + RawModel* triggerModel = nullptr; + glm::mat4 triggerModelMat; + if (triggerEntity.HasComponent("Model")) { + try { + triggerModel = ResourceManager::Load(triggerEntity["Model"]["Resource"]); + triggerModelMat = Transform::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->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(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); } } From 8b89df00955b2c67cff0afa05ab88b9a957fa446 Mon Sep 17 00:00:00 2001 From: verysecrethero Date: Thu, 10 Mar 2016 16:09:54 +0100 Subject: [PATCH 42/65] Changed to a better validator --- assets | 2 +- .../Entities/aim_rays_with_capturep.xml | 19 +++++++++++++++++-- src/Game/Systems/CapturePointSystem.cpp | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/assets b/assets index 3af64d8b..007b54bd 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 3af64d8b1f8cdf3e20198b079dfc02f6d64fdc88 +Subproject commit 007b54bd678d0e80af878bed457e33e73bc0834a diff --git a/resources/Schema/Entities/aim_rays_with_capturep.xml b/resources/Schema/Entities/aim_rays_with_capturep.xml index 6aa3246a..3cf5a26a 100644 --- a/resources/Schema/Entities/aim_rays_with_capturep.xml +++ b/resources/Schema/Entities/aim_rays_with_capturep.xml @@ -99,7 +99,7 @@ - Schema/Entities/Player.xml + Schema/Entities/PlayerRed.xml @@ -225,6 +225,11 @@ + + + + false + @@ -239,7 +244,17 @@ - + + + + + + + + + + + diff --git a/src/Game/Systems/CapturePointSystem.cpp b/src/Game/Systems/CapturePointSystem.cpp index 064136a7..13ac59f3 100644 --- a/src/Game/Systems/CapturePointSystem.cpp +++ b/src/Game/Systems/CapturePointSystem.cpp @@ -108,7 +108,7 @@ void CapturePointSystem::UpdateComponent(EntityWrapper& capturePointEntity, Comp //change what model is displaying (change all in case 2 capturepoints has been captured on the same frame) for (int i = 0; i < m_NumberOfCapturePoints; i++) { auto owner = (int)m_CapturePointNumberToEntityMap[i]["Team"]["Team"]; - if (m_CapturePointNumberToEntityMap[i].FirstChildByName("Red").ID != EntityID_Invalid) { + if (m_CapturePointNumberToEntityMap[i].FirstChildByName("Red").Valid()) { ChangeCapturePointModelsVisibility(m_CapturePointNumberToEntityMap[i].FirstChildByName("Red"), owner == redTeam); ChangeCapturePointModelsVisibility(m_CapturePointNumberToEntityMap[i].FirstChildByName("Blue"), owner == blueTeam); ChangeCapturePointModelsVisibility(m_CapturePointNumberToEntityMap[i].FirstChildByName("Spectator"), owner == spectatorTeam); From ab70aed840daef5f6012dd96eb60c420ec7e2ef8 Mon Sep 17 00:00:00 2001 From: Tleety Date: Thu, 10 Mar 2016 16:15:57 +0100 Subject: [PATCH 43/65] WIP --- resources/Schema/Entities/StartMenu.xml | 242 +++++++++++++----------- src/Engine/Rendering/BlurHUD.cpp | 13 +- 2 files changed, 138 insertions(+), 117 deletions(-) diff --git a/resources/Schema/Entities/StartMenu.xml b/resources/Schema/Entities/StartMenu.xml index 2ad8f377..02e99d03 100644 --- a/resources/Schema/Entities/StartMenu.xml +++ b/resources/Schema/Entities/StartMenu.xml @@ -22,7 +22,7 @@ - 7.0999304984909202 + 4.7191051568560454 @@ -2828,7 +2828,7 @@ - + @@ -2870,7 +2870,7 @@ - + @@ -2912,7 +2912,7 @@ - + @@ -2954,7 +2954,7 @@ - + @@ -2996,7 +2996,7 @@ - + @@ -3038,7 +3038,7 @@ - + @@ -3080,7 +3080,7 @@ - + @@ -3122,7 +3122,7 @@ - + @@ -3164,7 +3164,7 @@ - + @@ -5261,7 +5261,7 @@ - + @@ -5303,7 +5303,7 @@ - + @@ -6869,7 +6869,7 @@ - + @@ -6911,7 +6911,7 @@ - + @@ -6953,7 +6953,7 @@ - + @@ -6995,7 +6995,7 @@ - + @@ -7037,7 +7037,7 @@ - + @@ -7079,7 +7079,7 @@ - + @@ -7121,7 +7121,7 @@ - + @@ -8796,7 +8796,7 @@ - + @@ -8808,7 +8808,7 @@ - + @@ -8854,14 +8854,53 @@ + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + Textures/Core/White.png true - - false @@ -8890,40 +8929,6 @@ - - - - - - - - - Textures/HUD/ButtonCorner_16.png - - - - - - - - - - - - - Textures/HUD/ButtonCorner_16.png - - - - - - - - - - - - @@ -8937,10 +8942,11 @@ + false + Models/Core/UnitQuad.mesh + Textures/Core/White.png true - - false @@ -8970,28 +8976,32 @@ - + - Textures/HUD/ButtonCorner_16.png + Models/Core/UnitQuad.mesh + Textures/HUD/ButtonCorner_16.png + false - + + - + - Textures/HUD/ButtonCorner_16.png + Models/Core/UnitQuad.mesh + Textures/HUD/ButtonCorner_16.png + false - - + @@ -9008,14 +9018,53 @@ + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + Textures/Core/White.png true - - false @@ -9040,40 +9089,6 @@ - - - - - - - - - Textures/HUD/ButtonCorner_16.png - - - - - - - - - - - - - Textures/HUD/ButtonCorner_16.png - - - - - - - - - - - - @@ -9087,10 +9102,11 @@ + false + Models/Core/UnitQuad.mesh + Textures/Core/White.png true - - false @@ -9120,28 +9136,32 @@ - + - Textures/HUD/ButtonCorner_16.png + Models/Core/UnitQuad.mesh + Textures/HUD/ButtonCorner_16.png + false - + + - + - Textures/HUD/ButtonCorner_16.png + Models/Core/UnitQuad.mesh + Textures/HUD/ButtonCorner_16.png + false - - + diff --git a/src/Engine/Rendering/BlurHUD.cpp b/src/Engine/Rendering/BlurHUD.cpp index d9af3085..9adfa2a9 100644 --- a/src/Engine/Rendering/BlurHUD.cpp +++ b/src/Engine/Rendering/BlurHUD.cpp @@ -142,9 +142,15 @@ GLuint BlurHUD::Draw(GLuint texture, RenderScene& scene) glViewport(0, 0, m_Renderer->GetViewportSize().Width/m_BlurQuality, m_Renderer->GetViewportSize().Height/m_BlurQuality); glScissor(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + m_GaussianProgram_vert->Bind(); + glUniform1i(glGetUniformLocation(shaderHandle_vert, "Lod"), 0); m_GaussianProgram_horiz->Bind(); + glUniform1i(glGetUniformLocation(shaderHandle_horiz, "Lod"), 0); + + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture); + glBindVertexArray(m_ScreenQuad->VAO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ScreenQuad->ElementBuffer); glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->MaterialGroups()[0].material->EndIndex - m_ScreenQuad->MaterialGroups()[0].material->StartIndex +1 @@ -158,8 +164,6 @@ GLuint BlurHUD::Draw(GLuint texture, RenderScene& scene) glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GaussianTexture_horiz); - glBindVertexArray(m_ScreenQuad->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ScreenQuad->ElementBuffer); glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->MaterialGroups()[0].material->EndIndex - m_ScreenQuad->MaterialGroups()[0].material->StartIndex +1 , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].material->StartIndex); //horizontal pass @@ -170,8 +174,6 @@ GLuint BlurHUD::Draw(GLuint texture, RenderScene& scene) glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GaussianTexture_vert); - glBindVertexArray(m_ScreenQuad->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ScreenQuad->ElementBuffer); glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->MaterialGroups()[0].material->EndIndex - m_ScreenQuad->MaterialGroups()[0].material->StartIndex +1 , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].material->StartIndex); m_GaussianFrameBuffer_horiz.Unbind(); @@ -184,8 +186,7 @@ GLuint BlurHUD::Draw(GLuint texture, RenderScene& scene) glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_GaussianTexture_horiz); - glBindVertexArray(m_ScreenQuad->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ScreenQuad->ElementBuffer); + glDrawElementsBaseVertex(GL_TRIANGLES, m_ScreenQuad->MaterialGroups()[0].material->EndIndex - m_ScreenQuad->MaterialGroups()[0].material->StartIndex +1 , GL_UNSIGNED_INT, 0, m_ScreenQuad->MaterialGroups()[0].material->StartIndex); From e35b09cc68c5005dd6c48e0bf1319033b8ac1236 Mon Sep 17 00:00:00 2001 From: FakeShemp Date: Thu, 10 Mar 2016 21:59:01 +0100 Subject: [PATCH 44/65] Add alpha clipping Tobbe sa att jag fick pusha direkt --- src/Engine/Rendering/DrawFinalPassState.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Engine/Rendering/DrawFinalPassState.cpp b/src/Engine/Rendering/DrawFinalPassState.cpp index 5c238985..811d9d84 100644 --- a/src/Engine/Rendering/DrawFinalPassState.cpp +++ b/src/Engine/Rendering/DrawFinalPassState.cpp @@ -10,6 +10,8 @@ DrawFinalPassState::DrawFinalPassState(GLuint frameBuffer) Enable(GL_DEPTH_TEST); DepthMask(GL_TRUE); Enable(GL_CULL_FACE); + Enable(GL_ALPHA_TEST); + AlphaFunc(GL_GEQUAL, 0.05f); // Enable(GL_STENCIL_TEST); // StencilFunc(GL_NOTEQUAL, 1, 0xFF); // StencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); From cd6967b310e5920022a1bd3cc6eba798f1819f49 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Mar 2016 10:20:13 +0100 Subject: [PATCH 45/65] Merge --- assets | 2 +- resources/Schema/Entities/CP_Rocky3.xml | 11934 ++++++++++++++++ resources/Schema/Entities/FloatingCrystal.xml | 169 + .../Schema/Entities/FloatingCrystal_Blue.xml | 171 + src/Engine/Rendering/BlurHUD.cpp | 12 +- 5 files changed, 12282 insertions(+), 6 deletions(-) create mode 100644 resources/Schema/Entities/CP_Rocky3.xml create mode 100644 resources/Schema/Entities/FloatingCrystal.xml create mode 100644 resources/Schema/Entities/FloatingCrystal_Blue.xml diff --git a/assets b/assets index 85d96f6f..0ded5cb0 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 85d96f6f3d2269e46962492f9713ec67c54e8ece +Subproject commit 0ded5cb0846bd7076aecf299a112694e79db8c3e diff --git a/resources/Schema/Entities/CP_Rocky3.xml b/resources/Schema/Entities/CP_Rocky3.xml new file mode 100644 index 00000000..c68c6e11 --- /dev/null +++ b/resources/Schema/Entities/CP_Rocky3.xml @@ -0,0 +1,11934 @@ + + + + + + + + + + + + + + + + + + 2 + Models/Props/GroundTest.mesh + + + + + + + + 2 + Models/Props/Walls/SciFiWallTop.mesh + + + + + + + + + 2 + Models/Props/Walls/SciFiWallMedium.mesh + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallSmall1.mesh + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallSmall2.mesh + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallBig.mesh + + + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallBig.mesh + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallMedium.mesh + + + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallSmall3.mesh + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallSmall4.mesh + + + + + + + + + + + + Models/Highgrounds/Highground1.mesh + + + + + + + + + + Models/Highgrounds/Highground2.mesh + + + + + + + + + + Models/Highgrounds/Highground3.mesh + + + + + + + + + + + Models/Highgrounds/Highground24.mesh + + + + + + + + + + + Models/Highgrounds/Hg13.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg25.mesh + + + + + + + + + + + + Models/Highgrounds/Hg26.mesh + + + + + + + + + + + + Models/Highgrounds/Hg9.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg4.mesh + + + + + + + + + + + + + + Models/Highgrounds/Hg10.mesh + + + + + + + + + + + + + + Models/Highgrounds/Hg19.mesh + + + + + + + + + + + + + + Models/Highgrounds/Hg19.mesh + + + + + + + + + + + + + + + Models/Highgrounds/Highground12.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg16.mesh + + + + + + + + + + + + Models/Highgrounds/Hg15.mesh + + + + + + + + + + + + Models/Highgrounds/Hg14.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg13.mesh + + + + + + + + + + + + Models/Highgrounds/Hg11.mesh + + + + + + + + + + + + Models/Highgrounds/Hg20.mesh + + + + + + + + + + + + Models/Highgrounds/Hg18.mesh + + + + + + + + + + + + Models/Highgrounds/Hg19.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg17.mesh + + + + + + + + + + + + + + + Models/Highgrounds/Hg8.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg7.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg3.mesh + + + + + + + + + + + + + + + Models/Highgrounds/Highground3.mesh + + + + + + + + + + + + Models/Highgrounds/Highground1.mesh + + + + + + + + + + + + Models/Highgrounds/Highground2.mesh + + + + + + + + + + + + + + Models/Highgrounds/Hg1.mesh + + + + + + + + + + + Models/Highgrounds/Hg2.mesh + + + + + + + + + + + + + + Models/Highgrounds/Highground5.mesh + + + + + + + + + + + + Models/Highgrounds/Hg20.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg6.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg8.mesh + + + + + + + + + + + + Models/Highgrounds/Hg10.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg4.mesh + + + + + + + + + + + + Models/Highgrounds/Hg7.mesh + + + + + + + + + + + + Models/Highgrounds/Hg17.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg19.mesh + + + + + + + + + + + + Models/Highgrounds/Hg18.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg16.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg9.mesh + + + + + + + + + + + + Models/Highgrounds/Hg3.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg19.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Highgrounds/Hg10.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + + + + Models/Highgrounds/Highground22.mesh + + + + + + + + + + + + Models/Highgrounds/Hg8.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg19.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg21.mesh + + + + + + + + + + + + Models/Highgrounds/Hg11.mesh + + + + + + + + + + + + Models/Highgrounds/Hg3.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg17.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg8.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + + + Models/Highgrounds/Hg28.mesh + + + + + + + + + + + Models/Highgrounds/Hg10.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg27.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg15.mesh + + + + + + + + + + + + + + Models/Highgrounds/Hg13.mesh + + + + + + + + + + + + + + + Models/Highgrounds/Hg27.mesh + + + + + + + + + + + + Models/Highgrounds/Hg23.mesh + + + + + + + + + + + + + + + Models/Highgrounds/Hg27.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg23.mesh + + + + + + + + + + + + + + + Models/Highgrounds/Hg28.mesh + + + + + + + + + + + + Models/Highgrounds/Hg10.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg27.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg15.mesh + + + + + + + + + + + + + + Models/Highgrounds/Hg13.mesh + + + + + + + + + + + + + + + Models/Highgrounds/Hg1.mesh + + + + + + + + + + + + Models/Highgrounds/Hg2.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Blue.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Blue.mesh + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Blue.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Blue.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Blue.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Blue.mesh + + + + + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Blue.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Blue.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Blue.mesh + + + + + + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Blue.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Blue.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Blue.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Blue.mesh + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar1Blue.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + + Models/Core/UnitPlane.mesh + + true + + + + + + + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 2 + + + + + + + + + + + + 2 + 1 + + + + + + + + + + + + 3 + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar3Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar3Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + 10 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar1Blue.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + false + + + + + + + + + + + + + Models/Props/Flora/HangingBush2.mesh + true + + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Core/UnitPlane.mesh + + true + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 1 + 0.30000001192092896 + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar3Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar1Blue.mesh + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar3Blue.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/smallWall3.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + + + + + + + + + + + + Schema/Entities/PlayerRed.xml + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + + 0.049999997019767761 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + 1 + + + + 4 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 3 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 2 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 1 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + 1 + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToTeamPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToClassPick + 1 + + + + + + + + + + + Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pick Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Defender-01.png + + + PickClass + 2 + + + + + + + + + + + Defender + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Assault-01.png + + + PickClass + 1 + + + + + + + + + + + Assault + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Sniper-01.png + + + PickClass + 3 + + + + + + + + + + + Sniper + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToTeamPick + 1 + + + + + + + + + + + Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pick Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + PickTeam + 2 + + + + + + + + + + + Red + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + false + + + SwapToClassPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + Class + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + PickTeam + 1 + + + + + + + + + + + Spectator + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + PickTeam + 3 + + + + + + + + + + + Blue + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + Schema/Entities/ScoreBoard_Blue.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + Schema/Entities/ScoreBoard_Red.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Schema/Entities/ScoreBoard_Red.xml + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + Schema/Entities/ScoreBoard_Blue.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + 3 + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + + + + + + + + + + 15 + + + + + + + + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + 2 + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + 1 + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + + + + + + + + + + -15 + + + + 4 + + + + + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + + + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + 15 + 1 + + + + + + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + 2 + + + + + + + + + + + 4 + + + + + + + + + + + 5 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + 1 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + + + + 0.80000001192092896 + 1.2000000476837158 + + + + + + + + + 10 + + + + + + + + + + + 0.60000002384185791 + false + + + + + + + + + + + 10 + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + + 15 + 1 + + + + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 3 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + + + + + + + + + + + + Schema/Entities/Player.xml + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + diff --git a/resources/Schema/Entities/FloatingCrystal.xml b/resources/Schema/Entities/FloatingCrystal.xml new file mode 100644 index 00000000..8e1ad5ab --- /dev/null +++ b/resources/Schema/Entities/FloatingCrystal.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/FloatingCrystal_Blue.xml b/resources/Schema/Entities/FloatingCrystal_Blue.xml new file mode 100644 index 00000000..636a54bc --- /dev/null +++ b/resources/Schema/Entities/FloatingCrystal_Blue.xml @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + 0.20000000298023224 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystalBlue.mesh + + false + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + + 0.5 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1Blue.mesh + + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2Blue.mesh + + false + + + + + + + + + + diff --git a/src/Engine/Rendering/BlurHUD.cpp b/src/Engine/Rendering/BlurHUD.cpp index 9adfa2a9..960b1080 100644 --- a/src/Engine/Rendering/BlurHUD.cpp +++ b/src/Engine/Rendering/BlurHUD.cpp @@ -227,9 +227,7 @@ void BlurHUD::FillStencil(RenderScene& scene) m_FillDepthStencilProgram->Bind(); GLuint shaderHandle = m_FillDepthStencilProgram->GetHandle(); - - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); + glm::mat4 VP = scene.Camera->ProjectionMatrix() * scene.Camera->ViewMatrix(); for (auto& job : scene.Jobs.SpriteJob) { auto spriteJob = std::dynamic_pointer_cast(job); @@ -239,7 +237,10 @@ void BlurHUD::FillStencil(RenderScene& scene) if (!spriteJob->BlurBackground) { continue; } - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(spriteJob->Matrix)); + + glm::mat4 MVP = VP * spriteJob->Matrix; + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(MVP)); + glBindVertexArray(spriteJob->Model->VAO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, spriteJob->Model->ElementBuffer); @@ -255,7 +256,8 @@ void BlurHUD::FillStencil(RenderScene& scene) if(!spriteJob->BlurBackground) { continue; } - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(spriteJob->Matrix)); + glm::mat4 MVP = VP * spriteJob->Matrix; + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(MVP)); glBindVertexArray(spriteJob->Model->VAO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, spriteJob->Model->ElementBuffer); From 33627f917c8df422b132c9d6b0b7274d84aabd17 Mon Sep 17 00:00:00 2001 From: Jocke Date: Fri, 11 Mar 2016 11:01:10 +0100 Subject: [PATCH 46/65] removed debug info. --- include/Engine/Network/Client.h | 2 +- include/Engine/Network/UDPClient.h | 2 +- src/Engine/Network/Client.cpp | 1 - src/Engine/Network/Server.cpp | 7 ++++--- src/Engine/Network/TCPClient.cpp | 31 +++++++----------------------- src/Engine/Network/UDPClient.cpp | 11 +++++------ src/Engine/Network/UDPServer.cpp | 18 +++++++++-------- 7 files changed, 28 insertions(+), 44 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 2d4dc991..d9dcfad2 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -140,7 +140,7 @@ private: std::vector 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 diff --git a/include/Engine/Network/UDPClient.h b/include/Engine/Network/UDPClient.h index 654d4ea1..6264566d 100644 --- a/include/Engine/Network/UDPClient.h +++ b/include/Engine/Network/UDPClient.h @@ -27,7 +27,7 @@ private: boost::asio::io_service m_IOService; boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::shared_ptr m_Socket; - int lastReceivedSnapshotGroup = 0; + int m_LastReceivedSnapshotGroup = 0; int readBuffer(); void readPartOfPacket(); PacketID m_SendPacketID = 0; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 6737b3ee..d2f075e1 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -381,7 +381,6 @@ void Client::ignoreFields(Packet& packet, const ComponentInfo& componentInfo) void Client::parseSnapshot(Packet& packet) { - LOG_INFO("Snapshot received"); // Read input commands std::size_t numInputCommands = packet.ReadPrimitive(); for (std::size_t i = 0; i < numInputCommands; ++i) { diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 2b11b9c3..9cce3b68 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -164,7 +164,7 @@ void Server::reliableBroadcast(Packet& packet) void Server::unreliableBroadcast(Packet& packet) { - m_Unreliable.SendToConnectedPlayers(packet, m_ConnectedPlayers); + m_Unreliable.SendToConnectedPlayers(packet, m_ConnectedPlayers); } // Send snapshot fields @@ -317,7 +317,7 @@ void Server::checkForTimeOuts() } } } - for (size_t i = 0; i < playersToRemove.size(); i++) { + for (int i = playersToRemove.size() - 1; i >= 0; i--) { disconnect(playersToRemove.at(i)); } } @@ -360,6 +360,7 @@ void Server::parseTCPConnect(Packet & packet) // Ska vara till lagd i TCPServer receive PlayerID playerID = getPlayerIDFromEndpoint(); if (playerID == -1) { + LOG_INFO("Server::parseTCPConnect: Not connected"); return; } // Create a new player @@ -382,7 +383,7 @@ void Server::parseTCPConnect(Packet & packet) Packet connnectPacket(MessageType::Connect, m_ConnectedPlayers.at(playerID).PacketID); // Write playerID to packet connnectPacket.WritePrimitive(playerID); - m_Reliable.Send(connnectPacket); + m_Reliable.Send(connnectPacket, m_ConnectedPlayers.at(playerID)); Packet firstSnapshot(MessageType::Snapshot); addInputCommandsToPacket(firstSnapshot); diff --git a/src/Engine/Network/TCPClient.cpp b/src/Engine/Network/TCPClient.cpp index df9c159a..28da80ce 100644 --- a/src/Engine/Network/TCPClient.cpp +++ b/src/Engine/Network/TCPClient.cpp @@ -3,25 +3,14 @@ using namespace boost::asio::ip; TCPClient::TCPClient() -{ -} +{ } TCPClient::~TCPClient() -{ -} +{ } bool TCPClient::Connect(std::string playerName, std::string address, int port) { - if (m_Socket) { - if (m_IsConnected) { - Packet packet(MessageType::Connect, m_SendPacketID); - packet.WriteString(playerName); - Send(packet); - LOG_INFO("Connect message sent again!"); - } - return true; - } - else if (!m_IsConnected) { + if (!m_Socket) { boost::system::error_code error = boost::asio::error::host_not_found; m_Endpoint = tcp::endpoint(boost::asio::ip::address::from_string(address), port); m_Socket = std::unique_ptr(new tcp::socket(m_IOService)); @@ -36,9 +25,7 @@ bool TCPClient::Connect(std::string playerName, std::string address, int port) Send(packet); LOG_INFO("Connect message sent!"); return true; - } - // If error - else { + } else { // If error m_Socket->close(); m_Socket = nullptr; return false; @@ -47,14 +34,10 @@ bool TCPClient::Connect(std::string playerName, std::string address, int port) } void TCPClient::Disconnect() -{ - if (!m_IsConnected) { - return; - } +{ m_Socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both); m_Socket->close(); m_Socket = nullptr; - m_IsConnected = false; } void TCPClient::Receive(Packet& packet) @@ -66,7 +49,7 @@ void TCPClient::Receive(Packet& packet) } size_t TCPClient::readBuffer() -{ +{ if (!m_Socket) { return 0; } @@ -92,7 +75,7 @@ size_t TCPClient::readBuffer() while (sizeOfPacket > bytesReceived) { // Read the rest of the message bytesReceived += m_Socket->read_some(boost - ::asio::buffer((void*)(m_ReadBuffer), sizeOfPacket - bytesReceived), + ::asio::buffer((void*)(m_ReadBuffer + bytesReceived), sizeOfPacket - bytesReceived), error); if (error) { //LOG_ERROR("receive: %s", error.message().c_str()); diff --git a/src/Engine/Network/UDPClient.cpp b/src/Engine/Network/UDPClient.cpp index 149e860b..a10004a1 100644 --- a/src/Engine/Network/UDPClient.cpp +++ b/src/Engine/Network/UDPClient.cpp @@ -28,7 +28,7 @@ void UDPClient::Disconnect() m_Socket->close(); m_Socket = nullptr; - int lastReceivedSnapshotGroup = 0; + m_LastReceivedSnapshotGroup = 0; m_PacketSegmentMap.clear(); PacketID m_SendPacketID = 0; } @@ -106,7 +106,7 @@ void UDPClient::readPartOfPacket() memcpy(&packetGroupIndex, m_ReadBuffer + 2 * sizeof(int), sizeof(int)); int packetGroupSize = 0; memcpy(&packetGroupSize, m_ReadBuffer + 3 * sizeof(int), sizeof(int)); - LOG_INFO("Packet group: %i. Group index: %i. Group size: %i. Packet size: %i.", packetGroup, packetGroupIndex, packetGroupSize, sizeOfPacket); + //LOG_INFO("Packet group: %i. Group index: %i. Group size: %i. Packet size: %i.", packetGroup, packetGroupIndex, packetGroupSize, sizeOfPacket); if (sizeOfPacket > m_Socket->available()) { LOG_WARNING("UDPClient::readBuffer(): We haven't got the whole packet yet."); // return; @@ -120,7 +120,7 @@ void UDPClient::readPartOfPacket() sizeOfPacket), m_ReceiverEndpoint, 0, error); if (error) { - LOG_ERROR("receive: %s", error.message().c_str()); + LOG_ERROR("UDPClient::readPartOfPacket: %s", error.message().c_str()); } // Might want to do this earlier when i figure out a good way to // remove data from network buffer. @@ -198,7 +198,7 @@ bool UDPClient::GetNextPacket(Packet & packet) LOG_INFO("The map is increasing in size, size is %i", mapSize); continue; } - if (headerInfoPacket.GetMessageType() == MessageType::Snapshot && lastReceivedSnapshotGroup > headerInfoPacket.Group()) { + if (headerInfoPacket.GetMessageType() == MessageType::Snapshot && m_LastReceivedSnapshotGroup > headerInfoPacket.Group()) { it = m_PacketSegmentMap.erase(it); continue; //LOG_INFO("Deleted old entry"); @@ -214,10 +214,9 @@ bool UDPClient::GetNextPacket(Packet & packet) packet.WriteData(currentVector.at(i).second.get() + packet.HeaderSize(), sizeOfData - packet.HeaderSize()); } if (headerInfoPacket.GetMessageType() == MessageType::Snapshot) { - lastReceivedSnapshotGroup = packet.Group(); + m_LastReceivedSnapshotGroup = packet.Group(); } // No need to get next it as we are returning. - LOG_INFO("Packet parsed"); m_PacketSegmentMap.erase(it); return true; } else { diff --git a/src/Engine/Network/UDPServer.cpp b/src/Engine/Network/UDPServer.cpp index c3f87fd7..34a8175c 100644 --- a/src/Engine/Network/UDPServer.cpp +++ b/src/Engine/Network/UDPServer.cpp @@ -61,6 +61,8 @@ void UDPServer::Send(Packet& packet, PlayerDefinition& playerDefinition) void UDPServer::SendToConnectedPlayers(Packet& packet, std::map& playersTosendTo) { + // Remove a player if hen crashes. + // Return a vector with disconnected players. // Work in progress packet.UpdateSize(); @@ -95,18 +97,18 @@ void UDPServer::SendToConnectedPlayers(Packet& packet, std::map Date: Fri, 11 Mar 2016 11:03:09 +0100 Subject: [PATCH 47/65] Getting ShaderID one time per material in total instead of one time every frame --- include/Engine/Rendering/ModelJob.h | 19 +------------------ include/Engine/Rendering/RawModelCustom.h | 2 ++ src/Engine/Rendering/RawModelCustom.cpp | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/include/Engine/Rendering/ModelJob.h b/include/Engine/Rendering/ModelJob.h index dc4c8cb5..f39be723 100644 --- a/include/Engine/Rendering/ModelJob.h +++ b/include/Engine/Rendering/ModelJob.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("#ForwardPlusSkinnedProgram")->ResourceID; - } - else { - ShaderID = ResourceManager::Load("#ForwardPlusProgram")->ResourceID; - } TextureID = 0; break; case ::RawModel::MaterialType::SingleTextures: { - if (Model->IsSkinned()) { - ShaderID = ResourceManager::Load("#ForwardPlusSkinnedProgram")->ResourceID; - } - else { - ShaderID = ResourceManager::Load("#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("#ForwardPlusSplatMapSkinnedProgram")->ResourceID; - } - else { - ShaderID = ResourceManager::Load("#ForwardPlusSplatMapProgram")->ResourceID; - } ::RawModel::MaterialSplatMapping* SplatTextures = static_cast<::RawModel::MaterialSplatMapping*>(matProp.material); SplatMap = &SplatTextures->SplatMap; diff --git a/include/Engine/Rendering/RawModelCustom.h b/include/Engine/Rendering/RawModelCustom.h index ebf8da2b..f9fd18ef 100644 --- a/include/Engine/Rendering/RawModelCustom.h +++ b/include/Engine/Rendering/RawModelCustom.h @@ -18,6 +18,7 @@ #include "../Core/ResourceManager.h" #include "Texture.h" #include "Skeleton.h" +#include "ShaderProgram.h" #include "boost\endian\buffers.hpp" @@ -87,6 +88,7 @@ public: struct MaterialProperties { MaterialType type; MaterialBasic* material; + unsigned int ShaderID = 0; }; const Vertex* Vertices() const { diff --git a/src/Engine/Rendering/RawModelCustom.cpp b/src/Engine/Rendering/RawModelCustom.cpp index dd6a96de..94a824f0 100644 --- a/src/Engine/Rendering/RawModelCustom.cpp +++ b/src/Engine/Rendering/RawModelCustom.cpp @@ -148,14 +148,29 @@ void RawModelCustom::ReadMaterialSingle(std::size_t& offset, char* fileData, con case MaterialType::Basic: newMaterialProperty.material = new MaterialBasic(); ReadMaterialBasic(newMaterialProperty.material, offset, fileData, fileByteSize); + if(hasSkin){ + newMaterialProperty.ShaderID = ResourceManager::Load("#ForwardPlusSkinnedProgram")->ResourceID; + } else { + newMaterialProperty.ShaderID = ResourceManager::Load("#ForwardPlusProgram")->ResourceID; + } break; case MaterialType::SplatMapping: newMaterialProperty.material = new MaterialSplatMapping(); ReadMaterialSplatMapping(static_cast(newMaterialProperty.material), offset, fileData, fileByteSize); + if (hasSkin){ + newMaterialProperty.ShaderID = ResourceManager::Load("#ForwardPlusSplatMapSkinnedProgram")->ResourceID; + } else { + newMaterialProperty.ShaderID = ResourceManager::Load("#ForwardPlusSplatMapProgram")->ResourceID; + } break; case MaterialType::SingleTextures: newMaterialProperty.material = new MaterialSingleTextures(); ReadMaterialSingleTexture(static_cast(newMaterialProperty.material), offset, fileData, fileByteSize); + if (hasSkin){ + newMaterialProperty.ShaderID = ResourceManager::Load("#ForwardPlusSkinnedProgram")->ResourceID; + } else { + newMaterialProperty.ShaderID = ResourceManager::Load("#ForwardPlusProgram")->ResourceID; + } break; default: throw Resource::FailedLoadingException("Material contains an unknown MaterialType"); From a3ab844cc47c0d628510902aa5c516291ab7e124 Mon Sep 17 00:00:00 2001 From: stiffly Date: Fri, 11 Mar 2016 11:12:49 +0100 Subject: [PATCH 48/65] Makes sure m_CurrentSelection is valid before using it. --- src/Engine/Editor/EditorSystem.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Engine/Editor/EditorSystem.cpp b/src/Engine/Editor/EditorSystem.cpp index fa55bbc5..721f1f41 100644 --- a/src/Engine/Editor/EditorSystem.cpp +++ b/src/Engine/Editor/EditorSystem.cpp @@ -71,11 +71,10 @@ void EditorSystem::Update(double dt) m_EditorGUI->Draw(); m_EditorStats->Draw(actualDelta); - if (isAnyParentMissingTransform(m_CurrentSelection.ID)) { - return; - } if (m_CurrentSelection.Valid() && m_Widget.Valid()) { - + if (isAnyParentMissingTransform(m_CurrentSelection.ID)) { + return; + } (glm::vec3&)m_Widget["Transform"]["Position"] = Transform::AbsolutePosition(m_CurrentSelection); if (m_WidgetSpace == EditorGUI::WidgetSpace::Local) { (glm::vec3&)m_Widget["Transform"]["Orientation"] = Transform::AbsoluteOrientationEuler(m_CurrentSelection); From e96ad44e4449a460ced393457357f75d2d11905e Mon Sep 17 00:00:00 2001 From: Teejoon Date: Fri, 11 Mar 2016 11:23:23 +0100 Subject: [PATCH 49/65] BlurHUDPass now works correct when resizing window. --- src/Engine/Rendering/BlurHUD.cpp | 5 +---- src/Engine/Rendering/Renderer.cpp | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Engine/Rendering/BlurHUD.cpp b/src/Engine/Rendering/BlurHUD.cpp index 960b1080..35327764 100644 --- a/src/Engine/Rendering/BlurHUD.cpp +++ b/src/Engine/Rendering/BlurHUD.cpp @@ -201,10 +201,7 @@ GLuint BlurHUD::Draw(GLuint texture, RenderScene& scene) void BlurHUD::OnWindowResize() { - CommonFunctions::GenerateTexture(&m_GaussianTexture_vert, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width/m_BlurQuality, m_Renderer->GetViewportSize().Height/m_BlurQuality), GL_RGB16F, GL_RGB, GL_FLOAT); - m_GaussianFrameBuffer_vert.Generate(); - CommonFunctions::GenerateTexture(&m_GaussianTexture_horiz, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width/m_BlurQuality, m_Renderer->GetViewportSize().Height/m_BlurQuality), GL_RGB16F, GL_RGB, GL_FLOAT); - m_GaussianFrameBuffer_horiz.Generate(); + InitializeBuffers(); } void BlurHUD::FillStencil(RenderScene& scene) diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index eecb5a7a..63d7dfaf 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -140,6 +140,7 @@ void Renderer::updateFramebufferSize() m_LightCullingPass->OnWindowResize(); m_DrawBloomPass->OnWindowResize(); m_SSAOPass->OnWindowResize(); + m_BlurHUDPass->OnWindowResize(); e.NewResolution = m_ViewportSize; m_EventBroker->Publish(e); From 23e6a15c7fec4f23cb0f068d909bdba26a62e5d0 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Mar 2016 11:31:53 +0100 Subject: [PATCH 50/65] Fixed the fill on sprites, added some config button components, started work on option menu --- .../Schema/Components/ConfigBtnFloat.xml | 6 + .../Schema/Components/ConfigBtnFloat.xsd | 22 ++ .../Schema/Components/ConfigBtnResolution.xml | 6 + .../Schema/Components/ConfigBtnResolution.xsd | 17 ++ resources/Schema/Entities/OptionMenu.xml | 111 +++++++++ resources/Schema/Entities/StartMenu.xml | 223 +++++++++--------- resources/Shaders/Sprite.frag.glsl | 5 +- 7 files changed, 283 insertions(+), 107 deletions(-) create mode 100644 resources/Schema/Components/ConfigBtnFloat.xml create mode 100644 resources/Schema/Components/ConfigBtnFloat.xsd create mode 100644 resources/Schema/Components/ConfigBtnResolution.xml create mode 100644 resources/Schema/Components/ConfigBtnResolution.xsd create mode 100644 resources/Schema/Entities/OptionMenu.xml diff --git a/resources/Schema/Components/ConfigBtnFloat.xml b/resources/Schema/Components/ConfigBtnFloat.xml new file mode 100644 index 00000000..f9d4478e --- /dev/null +++ b/resources/Schema/Components/ConfigBtnFloat.xml @@ -0,0 +1,6 @@ + + +
+ + +
\ No newline at end of file diff --git a/resources/Schema/Components/ConfigBtnFloat.xsd b/resources/Schema/Components/ConfigBtnFloat.xsd new file mode 100644 index 00000000..69b36bd2 --- /dev/null +++ b/resources/Schema/Components/ConfigBtnFloat.xsd @@ -0,0 +1,22 @@ + + + + + + + Used with a Button component, this button will change a variable in the config file. + + + + The header of the section in config. + + + The name of the field to be changed in the config. + + + The value to give the field. + + + + + \ No newline at end of file diff --git a/resources/Schema/Components/ConfigBtnResolution.xml b/resources/Schema/Components/ConfigBtnResolution.xml new file mode 100644 index 00000000..9a586518 --- /dev/null +++ b/resources/Schema/Components/ConfigBtnResolution.xml @@ -0,0 +1,6 @@ + + +
+ + +
\ No newline at end of file diff --git a/resources/Schema/Components/ConfigBtnResolution.xsd b/resources/Schema/Components/ConfigBtnResolution.xsd new file mode 100644 index 00000000..d5d6b723 --- /dev/null +++ b/resources/Schema/Components/ConfigBtnResolution.xsd @@ -0,0 +1,17 @@ + + + + + Used with a Button component, this button will change a variable in the config file. + + + + Value of the resolution width. + + + Value of the resolution height. + + + + + \ No newline at end of file diff --git a/resources/Schema/Entities/OptionMenu.xml b/resources/Schema/Entities/OptionMenu.xml new file mode 100644 index 00000000..21e93530 --- /dev/null +++ b/resources/Schema/Entities/OptionMenu.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + + + + + + + + + + + 1920x1080 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + + + + + + + + + + + + + + Options + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/StartMenu.xml b/resources/Schema/Entities/StartMenu.xml index 02e99d03..86ee626e 100644 --- a/resources/Schema/Entities/StartMenu.xml +++ b/resources/Schema/Entities/StartMenu.xml @@ -22,7 +22,7 @@ - 4.7191051568560454 + 0.53338721940212963 @@ -2828,7 +2828,7 @@ - + @@ -2870,7 +2870,7 @@ - + @@ -2912,7 +2912,7 @@ - + @@ -2954,7 +2954,7 @@ - + @@ -2996,7 +2996,7 @@ - + @@ -3038,7 +3038,7 @@ - + @@ -3080,7 +3080,7 @@ - + @@ -3122,7 +3122,7 @@ - + @@ -3164,7 +3164,7 @@ - + @@ -5261,7 +5261,7 @@ - + @@ -5303,7 +5303,7 @@ - + @@ -6869,7 +6869,7 @@ - + @@ -6911,7 +6911,7 @@ - + @@ -6953,7 +6953,7 @@ - + @@ -6995,7 +6995,7 @@ - + @@ -7037,7 +7037,7 @@ - + @@ -7079,7 +7079,7 @@ - + @@ -7121,7 +7121,7 @@ - + @@ -8796,7 +8796,7 @@ - + @@ -8808,7 +8808,7 @@ - + @@ -8854,44 +8854,6 @@ - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/HUD/ButtonCorner_16.png - false - - - - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/HUD/ButtonCorner_16.png - false - - - - - - - - - - - @@ -8913,6 +8875,44 @@ + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + + + @@ -8976,6 +8976,21 @@ + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + @@ -8992,21 +9007,6 @@ - - - - Models/Core/UnitQuad.mesh - - Textures/HUD/ButtonCorner_16.png - false - - - - - - - - @@ -9023,21 +9023,6 @@ - - - - Models/Core/UnitQuad.mesh - - Textures/HUD/ButtonCorner_16.png - false - - - - - - - - @@ -9054,6 +9039,21 @@ + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + @@ -9067,6 +9067,10 @@ true + + Options + 1 + @@ -9076,7 +9080,7 @@ - Option + Options Fonts/DroidSans.ttf,64 @@ -9136,6 +9140,21 @@ + + + + Models/Core/UnitQuad.mesh + + Textures/HUD/ButtonCorner_16.png + false + + + + + + + + @@ -9152,21 +9171,6 @@ - - - - Models/Core/UnitQuad.mesh - - Textures/HUD/ButtonCorner_16.png - false - - - - - - - -
@@ -9189,6 +9193,15 @@
+ + + + Schema/Entities/OptionMenu.xml + + + + +
diff --git a/resources/Shaders/Sprite.frag.glsl b/resources/Shaders/Sprite.frag.glsl index 5b6567eb..eeb2bd2d 100644 --- a/resources/Shaders/Sprite.frag.glsl +++ b/resources/Shaders/Sprite.frag.glsl @@ -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)); From cac0522ae73918d80ce9256c9dab9c779da4ebae Mon Sep 17 00:00:00 2001 From: Teejoon Date: Fri, 11 Mar 2016 11:41:02 +0100 Subject: [PATCH 51/65] Fixed glow on window resize --- src/Engine/Rendering/DrawBloomPass.cpp | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/Engine/Rendering/DrawBloomPass.cpp b/src/Engine/Rendering/DrawBloomPass.cpp index f70f25c1..e0c6af66 100644 --- a/src/Engine/Rendering/DrawBloomPass.cpp +++ b/src/Engine/Rendering/DrawBloomPass.cpp @@ -151,18 +151,7 @@ void DrawBloomPass::OnWindowResize() if (m_Quality == 0) { return; } - CommonFunctions::GenerateMipMapTexture( - &m_GaussianTexture_vert, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) - , GL_RGB, GL_FLOAT, m_BloomLod); - CommonFunctions::GenerateMipMapTexture( - &m_GaussianTexture_horiz, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) - , GL_RGB, GL_FLOAT, m_BloomLod); - for (int i = 0; i < m_BloomLod; i++) { - m_GaussianFrameBuffer_vert[i].Generate(); - m_GaussianFrameBuffer_horiz[i].Generate(); - - } - + InitializeBuffers(); } void DrawBloomPass::GaussianLodPass(GLuint mipMap, GLuint texture) From 2eb863757b0cf3e0585cb186f646e79874fb9b30 Mon Sep 17 00:00:00 2001 From: Jocke Date: Fri, 11 Mar 2016 11:55:16 +0100 Subject: [PATCH 52/65] renamed variabels --- include/Engine/Network/Packet.h | 2 +- src/Engine/Network/Packet.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/Engine/Network/Packet.h b/include/Engine/Network/Packet.h index db6f0aa0..bac7fd69 100644 --- a/include/Engine/Network/Packet.h +++ b/include/Engine/Network/Packet.h @@ -17,7 +17,7 @@ public: Packet(MessageType type); ~Packet(); void Init(MessageType type, unsigned int& packetID, - int sequenceNumber, int totalAmountOfPackets, + int groupIndex, int groupSize, int packetGroup); // Add primitive types like int, float, char... diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index 8d470d06..d4f41126 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -36,7 +36,7 @@ Packet::~Packet() } void Packet::Init(MessageType type, unsigned int & packetID, - int groupIndex, int packetGroupSize, int packetGroup) + int groupIndex, int groupSize, int group) { m_ReturnDataOffset = 0; m_Offset = 0; @@ -46,13 +46,13 @@ void Packet::Init(MessageType type, unsigned int & packetID, WritePrimitive(0); // packetGroup is the gorup the packet is in groupOffset = m_Offset; - WritePrimitive(packetGroup); + WritePrimitive(group); // What index the packet has in the packetGroup groupIndexOffset = m_Offset; WritePrimitive(groupIndex); // The total amount of packets in a packetGroup groupSizeOffset = m_Offset; - WritePrimitive(packetGroupSize); + WritePrimitive(groupSize); // Add message type int messageType = static_cast(type); messageTypeOffset = m_Offset; From 0fbc482f9cad68c13c67922f3c8afa041052e8f6 Mon Sep 17 00:00:00 2001 From: Jocke Date: Fri, 11 Mar 2016 12:22:55 +0100 Subject: [PATCH 53/65] Changed getters to return reinterpret_casted data. --- src/Engine/Network/Packet.cpp | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index d4f41126..347b6e8b 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -124,7 +124,6 @@ void Packet::ReconstructFromData(char * data, size_t sizeOfData) void Packet::UpdateSize() { - int whatisoffset = m_Offset; memcpy(m_Data + packetSizeOffset, &m_Offset, sizeof(int)); } @@ -163,37 +162,27 @@ void Packet::ChangeGroup(int group) MessageType Packet::GetMessageType() { - MessageType messagType; - memcpy(&messagType, m_Data + messageTypeOffset, sizeof(int)); - return messagType; + return *reinterpret_cast(m_Data + messageTypeOffset); } size_t Packet::Group() { - size_t groupNumber; - memcpy(&groupNumber, m_Data + groupOffset, sizeof(int)); - return groupNumber; + return *reinterpret_cast(m_Data + groupOffset); } size_t Packet::GroupIndex() { - size_t groupIndex; - memcpy(&groupIndex, m_Data + groupIndexOffset, sizeof(int)); - return groupIndex; + return *reinterpret_cast(m_Data + groupIndexOffset); } size_t Packet::GroupSize() { - size_t groupSize; - memcpy(&groupSize, m_Data + groupSizeOffset, sizeof(int)); - return groupSize; + return *reinterpret_cast(m_Data + groupSizeOffset); } size_t Packet::PacketID() { - size_t packetID; - memcpy(&packetID, m_Data + packetIDOffset, sizeof(int)); - return packetID; + return *reinterpret_cast(m_Data + packetIDOffset); } void Packet::resizeData() From 5f959ded895ee3f38ec66968fb2448a1878be45c Mon Sep 17 00:00:00 2001 From: Jocke Date: Fri, 11 Mar 2016 12:54:59 +0100 Subject: [PATCH 54/65] Did changes upon pull request's request. --- include/Engine/Network/Client.h | 3 +-- include/Engine/Network/Network.h | 1 + include/Engine/Network/Server.h | 1 - include/Engine/Network/UDPClient.h | 3 ++- src/Engine/Network/Client.cpp | 9 --------- src/Engine/Network/Network.cpp | 9 +++++++++ src/Engine/Network/Packet.cpp | 2 +- src/Engine/Network/Server.cpp | 16 ---------------- src/Engine/Network/UDPClient.cpp | 2 +- 9 files changed, 15 insertions(+), 31 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index d9dcfad2..ebf46361 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -81,7 +81,7 @@ private: std::vector 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); @@ -109,7 +109,6 @@ private: void sendLocalPlayerTransform(); void becomePlayer(); void displayServerlist(); - void popNetworkSegmentOfHeader(Packet& packet); void removeWorld(); void createMainMenu(); // Mapping Logic diff --git a/include/Engine/Network/Network.h b/include/Engine/Network/Network.h index b4de053e..69395a85 100644 --- a/include/Engine/Network/Network.h +++ b/include/Engine/Network/Network.h @@ -39,6 +39,7 @@ protected: void logReceivedData(int bytesReceived); void saveToFile(); void updateNetworkData(); + void popNetworkSegmentOfHeader(Packet& packet); }; #endif \ No newline at end of file diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 421d151c..6acb7081 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -83,7 +83,6 @@ private: void kick(PlayerID player); PlayerID getPlayerIDFromEndpoint(); PlayerID getPlayerIDFromEntityID(EntityID entityID); - void popNetworkSegmentOfHeader(Packet & packet); void parsePlayerTransform(Packet& packet); void parseOnInputCommand(Packet& packet); void parseClientPing(); diff --git a/include/Engine/Network/UDPClient.h b/include/Engine/Network/UDPClient.h index 6264566d..386cc5c0 100644 --- a/include/Engine/Network/UDPClient.h +++ b/include/Engine/Network/UDPClient.h @@ -8,7 +8,6 @@ class UDPClient : public NetworkClient { - // TODO: add packets to map. public: UDPClient(); ~UDPClient(); @@ -34,6 +33,8 @@ private: //map:(packetGroup, vector:(pair:(groupIndex, packetData))) std::map>>> m_PacketSegmentMap; bool hasReceivedPacket(int packetGroup, int groupIndex); + // 2^19 + const int m_SizeOfSocketBuffer = 524288; }; #endif \ No newline at end of file diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index ffe34d97..695329b4 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -706,15 +706,6 @@ void Client::displayServerlist() } } -void Client::popNetworkSegmentOfHeader(Packet & packet) -{ - // Pop packetSize, group, groupIndex and groupSize. - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); -} - void Client::removeWorld() { std::vector childrenToBeDeleted; diff --git a/src/Engine/Network/Network.cpp b/src/Engine/Network/Network.cpp index 6ce9ef82..6ac5cf69 100644 --- a/src/Engine/Network/Network.cpp +++ b/src/Engine/Network/Network.cpp @@ -83,3 +83,12 @@ void Network::updateNetworkData() m_NetworkData.DataReceivedThisInterval = 0; } } + +void Network::popNetworkSegmentOfHeader(Packet & packet) +{ + // Pop packetSize, group, groupIndex and groupSize. + packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); +} diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index 347b6e8b..3e0d819b 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -44,7 +44,7 @@ void Packet::Init(MessageType type, unsigned int & packetID, // allocate memory for size of packet, sequenceNumber and totalPacketesInSequence packetSizeOffset = m_Offset; WritePrimitive(0); - // packetGroup is the gorup the packet is in + // packetGroup is the group the packet is in groupOffset = m_Offset; WritePrimitive(group); // What index the packet has in the packetGroup diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 9cce3b68..1f94a137 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -299,8 +299,6 @@ void Server::sendPing() reliableBroadcast(packet); } - - void Server::checkForTimeOuts() { double startPing = 1000 * m_StartPingTime @@ -332,10 +330,6 @@ void Server::parseUDPConnect(Packet & packet) m_PacketID = packet.ReadPrimitive(); //Read new packet id // parse player id and other stuff PlayerID playerID = packet.ReadPrimitive(); - if (!EntityWrapper(m_World, playerID).Valid()) { - - } - // Do something here? boost::asio::ip::udp::endpoint endpoint(m_Address, m_Port); m_ConnectedPlayers.at(playerID).Endpoint = endpoint; LOG_INFO("parseUDPConnect: Spectator \"%s\" connected on IP: %s", m_ConnectedPlayers.at(playerID).Name.c_str(), m_ConnectedPlayers.at(playerID).Endpoint.address().to_string().c_str()); @@ -357,7 +351,6 @@ void Server::parseTCPConnect(Packet & packet) LOG_INFO("Parsing connections"); // Check if player is already connected - // Ska vara till lagd i TCPServer receive PlayerID playerID = getPlayerIDFromEndpoint(); if (playerID == -1) { LOG_INFO("Server::parseTCPConnect: Not connected"); @@ -670,13 +663,4 @@ PlayerID Server::getPlayerIDFromEntityID(EntityID entityID) } } return -1; -} - -void Server::popNetworkSegmentOfHeader(Packet & packet) -{ - // Pop packetSize, group, groupIndex and groupSize. - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); } \ No newline at end of file diff --git a/src/Engine/Network/UDPClient.cpp b/src/Engine/Network/UDPClient.cpp index a10004a1..306bcb3f 100644 --- a/src/Engine/Network/UDPClient.cpp +++ b/src/Engine/Network/UDPClient.cpp @@ -17,7 +17,7 @@ bool UDPClient::Connect(std::string playerName, std::string address, int port) m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address().from_string(address), port); m_Socket = boost::shared_ptr(new boost::asio::ip::udp::socket(m_IOService)); m_Socket->open(boost::asio::ip::udp::v4()); - boost::asio::socket_base::receive_buffer_size option(819200); + boost::asio::socket_base::receive_buffer_size option(m_SizeOfSocketBuffer); m_Socket->set_option(option); return true; } From 8ceaae995d8fc72beb599fd3e346798e5ca71803 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Mar 2016 13:00:34 +0100 Subject: [PATCH 55/65] Options menu started working on --- include/Game/Systems/MainMenuSystem.h | 3 +- resources/Schema/Components.xsd | 2 + resources/Schema/Entities/OptionMenu.xml | 182 +++++++++++++++++------ resources/Schema/Types/Entity.xsd | 2 + src/Game/Systems/MainMenuSystem.cpp | 94 +++++++----- 5 files changed, 193 insertions(+), 90 deletions(-) diff --git a/include/Game/Systems/MainMenuSystem.h b/include/Game/Systems/MainMenuSystem.h index ddefcbf4..be89cd55 100644 --- a/include/Game/Systems/MainMenuSystem.h +++ b/include/Game/Systems/MainMenuSystem.h @@ -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 OnPlay(const Events::InputCommand& e); + void OnOptions(const Events::InputCommand& e); EventRelay m_EClicked; bool OnButtonClick(const Events::ButtonClicked& e); diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd index bc6da932..282a17b3 100644 --- a/resources/Schema/Components.xsd +++ b/resources/Schema/Components.xsd @@ -68,4 +68,6 @@ + + \ No newline at end of file diff --git a/resources/Schema/Entities/OptionMenu.xml b/resources/Schema/Entities/OptionMenu.xml index 21e93530..c1c4b517 100644 --- a/resources/Schema/Entities/OptionMenu.xml +++ b/resources/Schema/Entities/OptionMenu.xml @@ -6,47 +6,6 @@ - - - - - - - - - - - Models/Core/UnitQuad.mesh - - Textures/Core/White.png - - - - - - - - - - - 1920x1080 - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - @@ -72,6 +31,20 @@ + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + + + + + + + + @@ -88,16 +61,127 @@ - + + + + + + + + + + + + + + + + 1920 + 1080 + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + + + + + + - - Models/Core/UnitQuad.mesh - - Textures/Core/White.png - + + 1920x1080 + Fonts/DroidSans.ttf,64 + + + + + - - + + + + + + + + + + + + + 1366 + 768 + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + + + + + + + + 1366x768 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + 1280 + 720 + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + true + + + + + + + + + + + + 1280x720 + Fonts/DroidSans.ttf,64 + + + + + + + + diff --git a/resources/Schema/Types/Entity.xsd b/resources/Schema/Types/Entity.xsd index c0ac15aa..34f08afd 100644 --- a/resources/Schema/Types/Entity.xsd +++ b/resources/Schema/Types/Entity.xsd @@ -71,6 +71,8 @@ + + diff --git a/src/Game/Systems/MainMenuSystem.cpp b/src/Game/Systems/MainMenuSystem.cpp index 848070b4..ac64f4c1 100644 --- a/src/Game/Systems/MainMenuSystem.cpp +++ b/src/Game/Systems/MainMenuSystem.cpp @@ -16,6 +16,57 @@ void MainMenuSystem::Update(double dt) } + +void MainMenuSystem::OnPlay(const Events::InputCommand& e) +{ + auto menus = m_World->GetComponents("Menu"); + if (menus == nullptr) { + return; + } + + if (m_OpenSubMenu == EntityWrapper::Invalid) { + //No submenu is open, open one. + for (auto& menu : *menus) { + EntityWrapper menuEntity = EntityWrapper(m_World, menu.EntityID); + auto serverListSpawner = menuEntity.FirstChildByName(e.Command + "Spawner"); + if (!serverListSpawner.HasComponent("Spawner")) { + return; + } + m_OpenSubMenu = SpawnerSystem::Spawn(serverListSpawner, serverListSpawner); + Events::SearchForServers event; + m_EventBroker->Publish(event); + break; + } + + } else if (!m_OpenSubMenu.HasComponent("ServerList")) { + //Menu is open, but not the right one, delete the old one and open a new one. + m_World->DeleteEntity(m_OpenSubMenu.ID); + m_OpenSubMenu = EntityWrapper::Invalid; + + for (auto& menu : *menus) { + EntityWrapper menuEntity = EntityWrapper(m_World, menu.EntityID); + auto serverListSpawner = menuEntity.FirstChildByName(e.Command + "Spawner"); + if (!serverListSpawner.HasComponent("Spawner")) { + return; + } + m_OpenSubMenu = SpawnerSystem::Spawn(serverListSpawner, serverListSpawner); + Events::SearchForServers event; + m_EventBroker->Publish(event); + break; + } + } else { + //Serverlist submenu is open, close it. + m_World->DeleteEntity(m_OpenSubMenu.ID); + m_OpenSubMenu = EntityWrapper::Invalid; + } +} + + +void MainMenuSystem::OpenSubMenu(const Events::InputCommand& e) +{ + +} + bool MainMenuSystem::OnButtonClick(const Events::ButtonClicked& e) { if (e.EntityName == "ServerIdentityConnect") { @@ -45,49 +96,12 @@ bool MainMenuSystem::OnButtonPress(const Events::ButtonPressed& e) bool MainMenuSystem::OnInputCommand(const Events::InputCommand& e) { if(e.Command == "Play" && e.Value == 1) { - auto menus = m_World->GetComponents("Menu"); - if (menus == nullptr) { - return 0; - } - - if (m_OpenSubMenu == EntityWrapper::Invalid) { - //No submenu is open, open one. - for (auto& menu : *menus) { - EntityWrapper menuEntity = EntityWrapper(m_World, menu.EntityID); - auto serverListSpawner = menuEntity.FirstChildByName(e.Command + "Spawner"); - if (!serverListSpawner.HasComponent("Spawner")) { - return 0; - } - m_OpenSubMenu = SpawnerSystem::Spawn(serverListSpawner, serverListSpawner); - Events::SearchForServers event; - m_EventBroker->Publish(event); - break; - } - - } else if(!m_OpenSubMenu.HasComponent("ServerList")) { - //Menu is open, but not the right one, delete the old one and open a new one. - m_World->DeleteEntity(m_OpenSubMenu.ID); - m_OpenSubMenu = EntityWrapper::Invalid; - - for (auto& menu : *menus) { - EntityWrapper menuEntity = EntityWrapper(m_World, menu.EntityID); - auto serverListSpawner = menuEntity.FirstChildByName(e.Command + "Spawner"); - if (!serverListSpawner.HasComponent("Spawner")) { - return 0; - } - m_OpenSubMenu = SpawnerSystem::Spawn(serverListSpawner, serverListSpawner); - Events::SearchForServers event; - m_EventBroker->Publish(event); - break; - } - } else { - //Serverlist submenu is open, close it. - m_World->DeleteEntity(m_OpenSubMenu.ID); - m_OpenSubMenu = EntityWrapper::Invalid; - } + OnPlay(e); } else if (e.Command == "RefreshServerList" && e.Value == 1){ Events::SearchForServers event; m_EventBroker->Publish(event); + } else if (e.Command == "Options" && e.Value == 1) { + OnOptions(e); } return true; } \ No newline at end of file From bb0531a45956ea0e8fdcdfc8f0c785fa0865b8af Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Mar 2016 13:10:08 +0100 Subject: [PATCH 56/65] WIP --- include/Game/Systems/MainMenuSystem.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/Game/Systems/MainMenuSystem.h b/include/Game/Systems/MainMenuSystem.h index be89cd55..341bc7cd 100644 --- a/include/Game/Systems/MainMenuSystem.h +++ b/include/Game/Systems/MainMenuSystem.h @@ -25,6 +25,7 @@ private: IRenderer* m_Renderer; void OnPlay(const Events::InputCommand& e); void OnOptions(const Events::InputCommand& e); + void OpenSubMenu(const Events::InputCommand& e); EventRelay m_EClicked; bool OnButtonClick(const Events::ButtonClicked& e); From 4937bee46a9037dee88dc23b41c80750cec3c13d Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Mar 2016 13:38:48 +0100 Subject: [PATCH 57/65] Unresolved externals shit --- src/Game/Systems/MainMenuSystem.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Game/Systems/MainMenuSystem.cpp b/src/Game/Systems/MainMenuSystem.cpp index ac64f4c1..1f0d3cf6 100644 --- a/src/Game/Systems/MainMenuSystem.cpp +++ b/src/Game/Systems/MainMenuSystem.cpp @@ -16,7 +16,6 @@ void MainMenuSystem::Update(double dt) } - void MainMenuSystem::OnPlay(const Events::InputCommand& e) { auto menus = m_World->GetComponents("Menu"); @@ -62,6 +61,11 @@ void MainMenuSystem::OnPlay(const Events::InputCommand& e) } +void MainMenuSystem::OnOptions(const Events::InputCommand& e) +{ + +} + void MainMenuSystem::OpenSubMenu(const Events::InputCommand& e) { From 06bddd9d540f05add8348cbb9e586ff52a09bffe Mon Sep 17 00:00:00 2001 From: Jocke Date: Fri, 11 Mar 2016 14:07:03 +0100 Subject: [PATCH 58/65] Fixed requests. --- include/Engine/Network/UDPClient.h | 4 +++- src/Engine/Network/UDPClient.cpp | 30 +++++++++++++++--------------- src/Engine/Network/UDPServer.cpp | 10 ---------- 3 files changed, 18 insertions(+), 26 deletions(-) diff --git a/include/Engine/Network/UDPClient.h b/include/Engine/Network/UDPClient.h index 386cc5c0..51dc5e39 100644 --- a/include/Engine/Network/UDPClient.h +++ b/include/Engine/Network/UDPClient.h @@ -6,6 +6,8 @@ #include #include "Network/NetworkClient.h" +typedef std::map>>> PacketMap; + class UDPClient : public NetworkClient { public: @@ -31,7 +33,7 @@ private: void readPartOfPacket(); PacketID m_SendPacketID = 0; //map:(packetGroup, vector:(pair:(groupIndex, packetData))) - std::map>>> m_PacketSegmentMap; + PacketMap m_PacketSegmentMap; bool hasReceivedPacket(int packetGroup, int groupIndex); // 2^19 const int m_SizeOfSocketBuffer = 524288; diff --git a/src/Engine/Network/UDPClient.cpp b/src/Engine/Network/UDPClient.cpp index 306bcb3f..872d567c 100644 --- a/src/Engine/Network/UDPClient.cpp +++ b/src/Engine/Network/UDPClient.cpp @@ -100,12 +100,9 @@ void UDPClient::readPartOfPacket() if (sizeOfPacket == 0) { return; } - int packetGroup = 0; - memcpy(&packetGroup, m_ReadBuffer + sizeof(int), sizeof(int)); - int packetGroupIndex = 0; - memcpy(&packetGroupIndex, m_ReadBuffer + 2 * sizeof(int), sizeof(int)); - int packetGroupSize = 0; - memcpy(&packetGroupSize, m_ReadBuffer + 3 * sizeof(int), sizeof(int)); + int packetGroup = *reinterpret_cast(m_ReadBuffer + sizeof(int)); + int packetGroupIndex = *reinterpret_cast(m_ReadBuffer + 2 * sizeof(int)); + int packetGroupSize = *reinterpret_cast(m_ReadBuffer + 3 * sizeof(int)); //LOG_INFO("Packet group: %i. Group index: %i. Group size: %i. Packet size: %i.", packetGroup, packetGroupIndex, packetGroupSize, sizeOfPacket); if (sizeOfPacket > m_Socket->available()) { LOG_WARNING("UDPClient::readBuffer(): We haven't got the whole packet yet."); @@ -127,10 +124,11 @@ void UDPClient::readPartOfPacket() if (hasReceivedPacket(packetGroup, packetGroupIndex)) { return; } - //std::map>>> packetSegmentMap; // If group exists - if (m_PacketSegmentMap.find(packetGroup) != m_PacketSegmentMap.end()) { - m_PacketSegmentMap.at(packetGroup).push_back(std::make_pair(packetGroupIndex, std::move(packetData))); + PacketMap::iterator it; + it = m_PacketSegmentMap.find(packetGroup); + if (it != m_PacketSegmentMap.end()) { + it->second.push_back(std::make_pair(packetGroupIndex, std::move(packetData))); } else { // Create group and add element m_PacketSegmentMap[packetGroup].push_back(std::make_pair(packetGroupIndex, std::move(packetData))); } @@ -139,8 +137,10 @@ void UDPClient::readPartOfPacket() bool UDPClient::hasReceivedPacket(int packetGroup, int groupIndex) { - if (m_PacketSegmentMap.find(packetGroup) != m_PacketSegmentMap.end()) { - const std::vector>>& loopPacketGroup = m_PacketSegmentMap.at(packetGroup); + PacketMap::iterator it; + it = m_PacketSegmentMap.find(packetGroup); + if (it != m_PacketSegmentMap.end()) { + const std::vector>>& loopPacketGroup = it->second; for (size_t i = 0; i < loopPacketGroup.size(); i++) { if (loopPacketGroup.at(i).first == groupIndex) { return true; @@ -184,7 +184,7 @@ bool UDPClient::GetNextPacket(Packet & packet) // A duplicate packet should not be present in the vector! // Soo we will assume that this is true and only look if size // of vector is correct. - std::map>>>::iterator it = m_PacketSegmentMap.begin(); + PacketMap::iterator it = m_PacketSegmentMap.begin(); while (it != m_PacketSegmentMap.end()) { // pair(Group index, packetData) std::vector>>& currentVector = it->second; @@ -209,9 +209,9 @@ bool UDPClient::GetNextPacket(Packet & packet) packet.ReconstructFromData(currentVector.at(0).second.get(), packet.HeaderSize()); // Add the rest of the packets. int sizeOfData = 0; - for (size_t i = 0; i < currentVector.size(); i++) { - memcpy(&sizeOfData, currentVector.at(i).second.get(), sizeof(int)); - packet.WriteData(currentVector.at(i).second.get() + packet.HeaderSize(), sizeOfData - packet.HeaderSize()); + for (auto& packetSegment : currentVector) { + memcpy(&sizeOfData, packetSegment.second.get(), sizeof(int)); + packet.WriteData(packetSegment.second.get() + packet.HeaderSize(), sizeOfData - packet.HeaderSize()); } if (headerInfoPacket.GetMessageType() == MessageType::Snapshot) { m_LastReceivedSnapshotGroup = packet.Group(); diff --git a/src/Engine/Network/UDPServer.cpp b/src/Engine/Network/UDPServer.cpp index 34a8175c..e67a66c4 100644 --- a/src/Engine/Network/UDPServer.cpp +++ b/src/Engine/Network/UDPServer.cpp @@ -17,9 +17,6 @@ void UDPServer::Send(Packet& packet, PlayerDefinition& playerDefinition) { packet.UpdateSize(); try { - //Debug - int debugTheSixeOfpacket = packet.Size(); - //Debug end // Remove header from packet. packet.ReadData(packet.HeaderSize()); int totalBytesSent = 0; @@ -61,14 +58,7 @@ void UDPServer::Send(Packet& packet, PlayerDefinition& playerDefinition) void UDPServer::SendToConnectedPlayers(Packet& packet, std::map& playersTosendTo) { - // Remove a player if hen crashes. - // Return a vector with disconnected players. - // Work in progress packet.UpdateSize(); - - //Debug - int debugTheSixeOfpacket = packet.Size(); - //Debug end // Remove header from packet. packet.ReadData(packet.HeaderSize()); int totalBytesSent = 0; From 44398eac5814c2a2a80a85fb4f6843b529f6593f Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Mar 2016 14:11:58 +0100 Subject: [PATCH 59/65] Options now has some different resolutions. --- include/Game/Systems/MainMenuSystem.h | 2 - resources/Schema/Entities/OptionMenu.xml | 2 +- resources/Schema/Entities/ServerList.xml | 50 +++++++++++++++++++++--- src/Game/Systems/MainMenuSystem.cpp | 26 +++++------- 4 files changed, 55 insertions(+), 25 deletions(-) diff --git a/include/Game/Systems/MainMenuSystem.h b/include/Game/Systems/MainMenuSystem.h index 341bc7cd..7a51f4f0 100644 --- a/include/Game/Systems/MainMenuSystem.h +++ b/include/Game/Systems/MainMenuSystem.h @@ -23,8 +23,6 @@ public: private: IRenderer* m_Renderer; - void OnPlay(const Events::InputCommand& e); - void OnOptions(const Events::InputCommand& e); void OpenSubMenu(const Events::InputCommand& e); EventRelay m_EClicked; diff --git a/resources/Schema/Entities/OptionMenu.xml b/resources/Schema/Entities/OptionMenu.xml index c1c4b517..600dc49b 100644 --- a/resources/Schema/Entities/OptionMenu.xml +++ b/resources/Schema/Entities/OptionMenu.xml @@ -1,5 +1,5 @@ - + diff --git a/resources/Schema/Entities/ServerList.xml b/resources/Schema/Entities/ServerList.xml index f9a601f5..79f50c09 100644 --- a/resources/Schema/Entities/ServerList.xml +++ b/resources/Schema/Entities/ServerList.xml @@ -1,5 +1,5 @@ - + @@ -12,7 +12,7 @@ - + @@ -33,9 +33,10 @@ + Models/Core/UnitQuad.mesh + Textures/Core/White.png true - @@ -48,9 +49,10 @@ + Models/Core/UnitQuad.mesh + Textures/Core/White.png true - @@ -66,8 +68,9 @@ - Textures/Icons/rotate.png + Models/Core/UnitQuad.mesh + Textures/Icons/rotate.png @@ -79,6 +82,43 @@ + + + + + + + + + Models/Core/UnitQuad.mesh + + Textures/Core/White.png + + + + + + + + + + + + Servers + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + diff --git a/src/Game/Systems/MainMenuSystem.cpp b/src/Game/Systems/MainMenuSystem.cpp index 1f0d3cf6..ff2e2981 100644 --- a/src/Game/Systems/MainMenuSystem.cpp +++ b/src/Game/Systems/MainMenuSystem.cpp @@ -16,7 +16,7 @@ void MainMenuSystem::Update(double dt) } -void MainMenuSystem::OnPlay(const Events::InputCommand& e) +void MainMenuSystem::OpenSubMenu(const Events::InputCommand& e) { auto menus = m_World->GetComponents("Menu"); if (menus == nullptr) { @@ -37,7 +37,7 @@ void MainMenuSystem::OnPlay(const Events::InputCommand& e) break; } - } else if (!m_OpenSubMenu.HasComponent("ServerList")) { + } else if (m_OpenSubMenu.Name().compare(e.Command) != 0) { //Menu is open, but not the right one, delete the old one and open a new one. m_World->DeleteEntity(m_OpenSubMenu.ID); m_OpenSubMenu = EntityWrapper::Invalid; @@ -60,21 +60,10 @@ void MainMenuSystem::OnPlay(const Events::InputCommand& e) } } - -void MainMenuSystem::OnOptions(const Events::InputCommand& e) -{ - -} - -void MainMenuSystem::OpenSubMenu(const Events::InputCommand& e) -{ - -} - bool MainMenuSystem::OnButtonClick(const Events::ButtonClicked& e) { - if (e.EntityName == "ServerIdentityConnect") { - EntityWrapper entity = e.Entity; + EntityWrapper entity = e.Entity; + if (entity.Name() == "ServerIdentityConnect") { EntityWrapper serverIdentityEntity = entity.FirstParentWithComponent("ServerIdentity"); if(serverIdentityEntity.Valid()) { Events::ConnectRequest event; @@ -83,6 +72,9 @@ bool MainMenuSystem::OnButtonClick(const Events::ButtonClicked& e) printf("\n ----Request Server Connect----\nIP: %s\nPort: %i\n ------------------------------", event.IP, event.Port); m_EventBroker->Publish(event); } + } else if (entity.HasComponent("ConfigBtnResolution")) { + + m_Renderer->SetResolution(Rectangle((int)entity["ConfigBtnResolution"]["Width"], (int)entity["ConfigBtnResolution"]["Height"])); } return true; } @@ -100,12 +92,12 @@ bool MainMenuSystem::OnButtonPress(const Events::ButtonPressed& e) bool MainMenuSystem::OnInputCommand(const Events::InputCommand& e) { if(e.Command == "Play" && e.Value == 1) { - OnPlay(e); + OpenSubMenu(e); } else if (e.Command == "RefreshServerList" && e.Value == 1){ Events::SearchForServers event; m_EventBroker->Publish(event); } else if (e.Command == "Options" && e.Value == 1) { - OnOptions(e); + OpenSubMenu(e); } return true; } \ No newline at end of file From 0aedeb61b4a0fee17ed5025cbdc20ab0edfe3881 Mon Sep 17 00:00:00 2001 From: verysecrethero Date: Fri, 11 Mar 2016 14:15:46 +0100 Subject: [PATCH 60/65] CapturePointSystem now sets all children visible/not visible for each red/blue/spectator --- assets | 2 +- .../Entities/aim_rays_with_capturep.xml | 110 +++++++++++++++++- src/Game/Systems/CapturePointSystem.cpp | 9 +- 3 files changed, 112 insertions(+), 9 deletions(-) diff --git a/assets b/assets index 007b54bd..33455a9d 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 007b54bd678d0e80af878bed457e33e73bc0834a +Subproject commit 33455a9d10979b3041d7b8c026be4ac40b2ebad0 diff --git a/resources/Schema/Entities/aim_rays_with_capturep.xml b/resources/Schema/Entities/aim_rays_with_capturep.xml index 3cf5a26a..60030ba5 100644 --- a/resources/Schema/Entities/aim_rays_with_capturep.xml +++ b/resources/Schema/Entities/aim_rays_with_capturep.xml @@ -13,6 +13,7 @@ models/core/unitcube.mesh + false @@ -28,6 +29,7 @@ models/core/unitcube.mesh + false @@ -52,6 +54,7 @@ models/core/unitcube.mesh + false @@ -67,6 +70,7 @@ models/core/unitcube.mesh + false @@ -82,6 +86,7 @@ models/core/unitcube.mesh + false @@ -198,6 +203,7 @@ models/core/unitcube.mesh + false @@ -210,7 +216,7 @@ - + @@ -254,6 +260,13 @@ + + + + + + + @@ -265,7 +278,25 @@ - + + + + + + + + + + + + + + + + + + + @@ -276,7 +307,43 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -287,11 +354,11 @@ - + - -15 + 12 @@ -317,7 +384,38 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Game/Systems/CapturePointSystem.cpp b/src/Game/Systems/CapturePointSystem.cpp index 13ac59f3..4a511301 100644 --- a/src/Game/Systems/CapturePointSystem.cpp +++ b/src/Game/Systems/CapturePointSystem.cpp @@ -234,9 +234,14 @@ void CapturePointSystem::UpdateComponent(EntityWrapper& capturePointEntity, Comp void CapturePointSystem::ChangeCapturePointModelsVisibility(EntityWrapper &capturePointModels, bool isOwner) { (bool&)capturePointModels["Model"]["Visible"] = isOwner; - for (auto& capModel : capturePointModels.ChildrenWithComponent("Model")) + for (auto& capModel : capturePointModels.ChildrenWithComponent("Transform")) { - (bool&)capModel["Model"]["Visible"] = isOwner; + if (capModel.HasComponent("Model")) { + (bool&)capModel["Model"]["Visible"] = isOwner; + } + if (capModel.HasComponent("PointLight")) { + (bool&)capModel["PointLight"]["Visible"] = isOwner; + } } } From 62d1cb9a69a85b94ac67cdd4626ab6dd80bfa9e8 Mon Sep 17 00:00:00 2001 From: Jocke Date: Fri, 11 Mar 2016 14:24:59 +0100 Subject: [PATCH 61/65] fixed request. --- include/Engine/Network/UDPClient.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/include/Engine/Network/UDPClient.h b/include/Engine/Network/UDPClient.h index 51dc5e39..d83dc731 100644 --- a/include/Engine/Network/UDPClient.h +++ b/include/Engine/Network/UDPClient.h @@ -6,8 +6,6 @@ #include #include "Network/NetworkClient.h" -typedef std::map>>> PacketMap; - class UDPClient : public NetworkClient { public: @@ -25,6 +23,7 @@ public: bool GetNextPacket(Packet& packet); private: // Assio UDP logic + typedef std::map>>> PacketMap; boost::asio::io_service m_IOService; boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::shared_ptr m_Socket; From e45d0e8232f5674e57e59634c63863ab192002f1 Mon Sep 17 00:00:00 2001 From: Jocke Date: Fri, 11 Mar 2016 14:32:55 +0100 Subject: [PATCH 62/65] fix. --- include/Engine/Network/UDPClient.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Engine/Network/UDPClient.h b/include/Engine/Network/UDPClient.h index d83dc731..174a0c78 100644 --- a/include/Engine/Network/UDPClient.h +++ b/include/Engine/Network/UDPClient.h @@ -22,8 +22,8 @@ public: // Returns false if no packets are available bool GetNextPacket(Packet& packet); private: - // Assio UDP logic typedef std::map>>> PacketMap; + // Assio UDP logic boost::asio::io_service m_IOService; boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::shared_ptr m_Socket; From 172fb8dfc2b4ebe3242368076e3138e13ac94ec9 Mon Sep 17 00:00:00 2001 From: FakeShemp Date: Fri, 11 Mar 2016 15:04:44 +0100 Subject: [PATCH 63/65] MuzzleFlash entities --- resources/Schema/Entities/MuzzleFlashBlue.xml | 102 ++++++++++++++++++ resources/Schema/Entities/MuzzleFlashFire.xml | 102 ++++++++++++++++++ resources/Schema/Entities/MuzzleFlashGay.xml | 102 ++++++++++++++++++ resources/Schema/Entities/MuzzleFlashRed.xml | 102 ++++++++++++++++++ 4 files changed, 408 insertions(+) create mode 100644 resources/Schema/Entities/MuzzleFlashBlue.xml create mode 100644 resources/Schema/Entities/MuzzleFlashFire.xml create mode 100644 resources/Schema/Entities/MuzzleFlashGay.xml create mode 100644 resources/Schema/Entities/MuzzleFlashRed.xml diff --git a/resources/Schema/Entities/MuzzleFlashBlue.xml b/resources/Schema/Entities/MuzzleFlashBlue.xml new file mode 100644 index 00000000..38b62d6d --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashBlue.xml @@ -0,0 +1,102 @@ + + + + + + 0.039999999105930328 + + + + + + + + + Models/Effects/MuzzleFlash/Blue/PlaneRight.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Blue/Cone1Outside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Blue/Cone1Inside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Blue/Cone2Outside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Blue/Cone2Inside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Blue/PlaneUp.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Blue/PlaneDown.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Blue/PlaneLeft.mesh + false + true + + + + + + + + diff --git a/resources/Schema/Entities/MuzzleFlashFire.xml b/resources/Schema/Entities/MuzzleFlashFire.xml new file mode 100644 index 00000000..d02a3d1a --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashFire.xml @@ -0,0 +1,102 @@ + + + + + + 0.039999999105930328 + + + + + + + + + Models/Effects/MuzzleFlash/Fire/PlaneRight.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Fire/Cone1Outside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Fire/Cone1Inside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Fire/Cone2Outside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Fire/Cone2Inside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Fire/PlaneUp.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Fire/PlaneDown.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Fire/PlaneLeft.mesh + false + true + + + + + + + + diff --git a/resources/Schema/Entities/MuzzleFlashGay.xml b/resources/Schema/Entities/MuzzleFlashGay.xml new file mode 100644 index 00000000..62b1c2dc --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashGay.xml @@ -0,0 +1,102 @@ + + + + + + 0.039999999105930328 + + + + + + + + + Models/Effects/MuzzleFlash/Rainbow/PlaneRight.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Rainbow/Cone1Outside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Rainbow/Cone1Inside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Rainbow/Cone2Outside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Rainbow/Cone2Inside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Rainbow/PlaneUp.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Rainbow/PlaneDown.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Rainbow/PlaneLeft.mesh + false + true + + + + + + + + diff --git a/resources/Schema/Entities/MuzzleFlashRed.xml b/resources/Schema/Entities/MuzzleFlashRed.xml new file mode 100644 index 00000000..062454f8 --- /dev/null +++ b/resources/Schema/Entities/MuzzleFlashRed.xml @@ -0,0 +1,102 @@ + + + + + + 0.039999999105930328 + + + + + + + + + Models/Effects/MuzzleFlash/Red/PlaneRight.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Red/Cone1Outside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Red/Cone1Inside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Red/Cone2Outside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Red/Cone2Inside.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Red/PlaneUp.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Red/PlaneDown.mesh + false + true + + + + + + + + + Models/Effects/MuzzleFlash/Red/PlaneLeft.mesh + false + true + + + + + + + + From 81634578d90cdc3616e8834f64ffb7ec7fc9a0f4 Mon Sep 17 00:00:00 2001 From: antc13 Date: Fri, 11 Mar 2016 15:43:20 +0100 Subject: [PATCH 64/65] Updated CP_Rocky2, added a point light to pickups and created 3 different versions of the Floating Crystals above Capture Points. --- assets | 2 +- resources/Schema/Entities/AmmoPickup.xml | 19 +- resources/Schema/Entities/CP_Rocky2.xml | 15827 ++++++++++------ resources/Schema/Entities/FloatingCrystal.xml | 169 + .../Schema/Entities/FloatingCrystalBlue.xml | 174 + .../Schema/Entities/FloatingCrystalRed.xml | 173 + .../Schema/Entities/FloatingCrystalWhite.xml | 167 + resources/Schema/Entities/HealthPickup.xml | 19 +- .../Schema/Entities/NewMap2version6NEW.xml | 11874 ++++++++++++ 9 files changed, 22176 insertions(+), 6248 deletions(-) create mode 100644 resources/Schema/Entities/FloatingCrystal.xml create mode 100644 resources/Schema/Entities/FloatingCrystalBlue.xml create mode 100644 resources/Schema/Entities/FloatingCrystalRed.xml create mode 100644 resources/Schema/Entities/FloatingCrystalWhite.xml create mode 100644 resources/Schema/Entities/NewMap2version6NEW.xml diff --git a/assets b/assets index 007b54bd..33455a9d 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 007b54bd678d0e80af878bed457e33e73bc0834a +Subproject commit 33455a9d10979b3041d7b8c026be4ac40b2ebad0 diff --git a/resources/Schema/Entities/AmmoPickup.xml b/resources/Schema/Entities/AmmoPickup.xml index ee3704f1..a8415489 100644 --- a/resources/Schema/Entities/AmmoPickup.xml +++ b/resources/Schema/Entities/AmmoPickup.xml @@ -2,21 +2,26 @@ - - - Models/Props/PickUps/AmmoPickUp.mesh - + 8 + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + 1.5 + 3 + - + + - - diff --git a/resources/Schema/Entities/CP_Rocky2.xml b/resources/Schema/Entities/CP_Rocky2.xml index 93b7fd77..3ce754d2 100644 --- a/resources/Schema/Entities/CP_Rocky2.xml +++ b/resources/Schema/Entities/CP_Rocky2.xml @@ -24,8 +24,8 @@ - 2 Models/Props/Walls/SciFiWallTop.mesh + false @@ -34,7 +34,19 @@ - 2 + 1.2000000476837158 + Models/Props/Walls/SciFiWallMedium.mesh + false + + + + + + + + + + 1.2000000476837158 Models/Props/Walls/SciFiWallSmall1.mesh @@ -45,7 +57,7 @@ - 2 + 1.2000000476837158 Models/Props/Walls/SciFiWallSmall2.mesh @@ -56,8 +68,9 @@ - 2 + 1.2000000476837158 Models/Props/Walls/SciFiWallBig.mesh + false @@ -69,8 +82,9 @@ - 2 + 1.2000000476837158 Models/Props/Walls/SciFiWallBig.mesh + false @@ -80,19 +94,9 @@ - 2 - Models/Props/Walls/SciFiWallMedium.mesh - - - - - - - - - - 2 + 1.2000000476837158 Models/Props/Walls/SciFiWallMedium.mesh + false @@ -104,8 +108,9 @@ - 2 + 1.2000000476837158 Models/Props/Walls/SciFiWallSmall3.mesh + false @@ -115,7 +120,7 @@ - 2 + 1.2000000476837158 Models/Props/Walls/SciFiWallSmall4.mesh @@ -149,7 +154,6 @@ Models/Highgrounds/Highground3.mesh - @@ -278,7 +282,6 @@ Models/Highgrounds/Highground12.mesh - @@ -684,19 +687,6 @@ - - - - - Models/Highgrounds/Hg6.mesh - - - - - - - - @@ -797,6 +787,19 @@ + + + + + Models/Highgrounds/Hg6.mesh + + + + + + + + @@ -907,6 +910,7 @@ + 2 Models/Props/Walls/BigWallRed.mesh @@ -1416,7 +1420,7 @@ Models/Highgrounds/Hg2.mesh - + @@ -1441,6 +1445,7 @@ + 1.5 Models/Props/Bridges/Bridge1_SciFi_Blue.mesh @@ -1559,6 +1564,7 @@ + 1.5 Models/Props/Bridges/Bridge1_SciFi_Blue.mesh @@ -1571,6 +1577,7 @@ + 1.5 Models/Props/Bridges/Bridge1_SciFi_Blue.mesh @@ -1583,6 +1590,7 @@ + 1.5 Models/Props/Bridges/SciFi_Bridge_Support_Top_Blue.mesh @@ -1607,11 +1615,11 @@ 12 - + - + @@ -1619,6 +1627,7 @@ + 1.5 Models/Props/Bridges/SciFi_Bridge_Support_Middle_Blue.mesh @@ -1637,6 +1646,7 @@ + 1.5 Models/Props/Bridges/SciFi_Bridge_Support_Top_Blue.mesh @@ -1661,11 +1671,11 @@ 12 - + - + @@ -1673,6 +1683,7 @@ + 1.5 Models/Props/Bridges/SciFi_Bridge_Support_Middle_Blue.mesh @@ -1691,6 +1702,7 @@ + 1.5 Models/Props/Bridges/Bridge1_SciFi_Blue.mesh @@ -1705,6 +1717,7 @@ + 1.5 Models/Props/Bridges/SciFi_Bridge_Support_Top_Blue.mesh @@ -1730,11 +1743,11 @@ 12 - + - + @@ -1742,6 +1755,7 @@ + 1.5 Models/Props/Bridges/SciFi_Bridge_Support_Middle_Blue.mesh @@ -1769,7 +1783,7 @@ - + @@ -1796,8 +1810,8 @@ Models/Props/Walls/SpecialWall1.mesh - - + + @@ -1950,6 +1964,7 @@ + 2.5 Models/Props/Pillars/SciFiPillar2Blue.mesh @@ -1964,6 +1979,7 @@ + 2.5 Models/Props/Pillars/SciFiPillar2Blue.mesh @@ -2017,7 +2033,7 @@ - 6 + 2.5 Models/Props/Pillars/SciFiPillar1Blue.mesh @@ -2039,10 +2055,11 @@ - Models/Props/Walls/SmallWall3.mesh + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2052,10 +2069,11 @@ - Models/Props/Walls/SmallWall3.mesh + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2066,7 +2084,8 @@ - Models/Props/Walls/MediumWall3.mesh + 2 + Models/Props/Walls/Medium_Wall_SciFi_Blue.mesh @@ -2079,10 +2098,11 @@ - Models/Props/Walls/SmallWall3.mesh + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2093,10 +2113,11 @@ - Models/Props/Walls/SmallWall3.mesh + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2107,10 +2128,11 @@ - Models/Props/Walls/SmallWall3.mesh + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2121,10 +2143,11 @@ - Models/Props/Walls/SmallWall3.mesh + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2134,10 +2157,10 @@ - Models/Props/Walls/SmallWall3.mesh + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2148,10 +2171,11 @@ - Models/Props/Walls/SmallWall3.mesh + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2162,6 +2186,7 @@ + 2 Models/Props/Walls/BigWallBlue.mesh @@ -2176,10 +2201,10 @@ - Models/Props/Walls/SmallWall3.mesh + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2190,10 +2215,11 @@ - Models/Props/Walls/SmallWall3.mesh + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2203,6 +2229,7 @@ + 2 Models/Props/Walls/BigWallBlue.mesh @@ -2216,10 +2243,11 @@ - Models/Props/Walls/SmallWall3.mesh + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh - + @@ -2229,6 +2257,7 @@ + 2 Models/Props/Walls/BigWallBlue.mesh @@ -2242,6 +2271,7 @@ + 2 Models/Props/Walls/BigWallBlue.mesh @@ -2253,6 +2283,7 @@ + 2 Models/Props/Walls/BigWallBlue.mesh @@ -2268,10 +2299,10 @@ - Models/Props/Walls/SmallWall3.mesh + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2282,7 +2313,8 @@ - Models/Props/Walls/MediumWall3.mesh + 2 + Models/Props/Walls/Medium_Wall_SciFi_Blue.mesh @@ -2295,10 +2327,11 @@ - Models/Props/Walls/SmallWall3.mesh + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2309,10 +2342,11 @@ - Models/Props/Walls/SmallWall3.mesh + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2322,10 +2356,11 @@ - Models/Props/Walls/MediumWall3.mesh + 2 + Models/Props/Walls/Medium_Wall_SciFi_Blue.mesh - + @@ -2335,10 +2370,11 @@ - Models/Props/Walls/MediumWall3.mesh + 2 + Models/Props/Walls/Medium_Wall_SciFi_Blue.mesh - + @@ -2348,10 +2384,11 @@ - Models/Props/Walls/MediumWall3.mesh + 2 + Models/Props/Walls/Medium_Wall_SciFi_Blue.mesh - + @@ -2374,7 +2411,8 @@ - Models/Props/Walls/MediumWall3.mesh + 2 + Models/Props/Walls/Medium_Wall_SciFi_Blue.mesh @@ -2387,6 +2425,7 @@ + 2 Models/Props/Walls/BigWallBlue.mesh @@ -2400,10 +2439,11 @@ - Models/Props/Walls/SmallWall3.mesh + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2414,10 +2454,11 @@ - Models/Props/Walls/SmallWall3.mesh + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - + @@ -2509,7 +2550,7 @@ - 15 + 9 Models/Props/Stones/ShinyStoneCrystalBlue.mesh @@ -2524,7 +2565,7 @@ - 15 + 3 Models/Props/Stones/ShinyStoneCrystalBlue.mesh @@ -2539,9 +2580,8 @@ - 15 + 3 Models/Props/Stones/ShinyStoneCrystalBlue.mesh - @@ -2593,7 +2633,7 @@ - 15 + 3 Models/Props/Stones/ShinyStoneCrystalBlue.mesh @@ -2608,7 +2648,7 @@ - 15 + 3 Models/Props/Stones/ShinyStoneCrystalBlue.mesh @@ -2623,7 +2663,7 @@ - 15 + 3 Models/Props/Stones/ShinyStoneCrystalBlue.mesh @@ -2653,7 +2693,7 @@ - 15 + 3 Models/Props/Stones/ShinyStoneCrystalBlue.mesh @@ -2681,11 +2721,11 @@ - 15 + 3 Models/Props/Stones/ShinyStoneCrystalBlue.mesh - + @@ -2696,7 +2736,7 @@ - 15 + 3 Models/Props/Stones/ShinyStoneCrystalBlue.mesh @@ -2711,7 +2751,7 @@ - 15 + 3 Models/Props/Stones/ShinyStoneCrystalBlue.mesh @@ -2761,7 +2801,7 @@ - 15 + 3 Models/Props/Stones/ShinyStoneCrystalBlue.mesh @@ -2783,12 +2823,11 @@ - Models/Props/Stones/SmallStone2.mesh + Models/Props/Stones/SmallStone1.mesh - - - + + @@ -2797,10 +2836,12 @@ - Models/Props/Stones/SmallStone2.mesh + Models/Props/Stones/SmallStone1.mesh - + + + @@ -2812,89 +2853,8 @@ Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - + + @@ -2906,22 +2866,8 @@ Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - + + @@ -2933,48 +2879,8 @@ Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - + + @@ -2987,8 +2893,35 @@ Models/Props/Stones/SmallStone1.mesh - - + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + @@ -3000,8 +2933,8 @@ Models/Props/Stones/BigStone.mesh - - + + @@ -3013,22 +2946,9 @@ Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - + + + @@ -3040,9 +2960,8 @@ Models/Props/Stones/SmallStone1.mesh - - - + + @@ -3054,9 +2973,8 @@ Models/Props/Stones/SmallStone1.mesh - - - + + @@ -3075,34 +2993,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3110,8 +3000,8 @@ Models/Props/Stones/MediumStone2.mesh - - + + @@ -3123,94 +3013,13 @@ Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - + + - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -3225,6 +3034,167 @@ + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + @@ -3246,8 +3216,209 @@ Models/Props/Stones/SmallStone1.mesh - - + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + @@ -3283,37 +3454,12 @@ - Models/Props/Stones/SmallStone2.mesh + Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - + + + @@ -3325,8 +3471,8 @@ Models/Props/Stones/SmallStone2.mesh - - + + @@ -3338,8 +3484,8 @@ Models/Props/Stones/SmallStone1.mesh - - + + @@ -3349,38 +3495,12 @@ - Models/Props/Stones/SmallStone1.mesh + Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - + + + @@ -3392,8 +3512,9 @@ Models/Props/Stones/SmallStone2.mesh - - + + + @@ -3405,142 +3526,8 @@ Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - + + @@ -3552,21 +3539,9 @@ Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - + + + @@ -3589,11 +3564,11 @@ - Models/Props/Stones/BigStone.mesh + Models/Props/Stones/SmallStone2.mesh - - + + @@ -3602,11 +3577,11 @@ - Models/Props/Stones/SmallStone1.mesh + Models/Props/Stones/SmallStone2.mesh - - + + @@ -3629,16 +3604,81 @@ - Models/Props/Stones/MediumStone2.mesh + Models/Props/Stones/SmallStone1.mesh - - + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + @@ -3646,19 +3686,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -3685,6 +3712,19 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -3715,10 +3755,11 @@ Models/Props/PickUps/PickUpHolder.mesh + false - - + + @@ -3727,11 +3768,11 @@ 2 - + - + @@ -3747,9 +3788,175 @@ Models/Props/PickUps/HealthPickUp.mesh + + + 1.5 + 3 + - - + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + false + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + false + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + 1.5 + 3 + + + + @@ -3775,11 +3982,11 @@ 2 - + - + @@ -3795,153 +4002,14 @@ Models/Props/PickUps/HealthPickUp.mesh + + + 1.5 + 3 + - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - + + @@ -3955,6 +4023,7 @@ Models/Props/PickUps/PickUpHolder.mesh + false @@ -3967,11 +4036,11 @@ 2 - + - + @@ -3987,57 +4056,14 @@ Models/Props/PickUps/AmmoPickUp.mesh + + + 1.5 + 3 + - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - + + @@ -4063,12 +4089,13 @@ - 6 + 2 Models/Props/Pillars/SciFiPillar2Red.mesh - - + + + @@ -4077,27 +4104,12 @@ - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 6 + 2 Models/Props/Pillars/SciFiPillar2Red.mesh - - - + + @@ -4106,36 +4118,7 @@ - 4 - Models/Props/Pillars/SciFiPillar3Red.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar1Red.mesh - - - - - - - - - - - - - 6 + 2 Models/Props/Pillars/SciFiPillar2Red.mesh @@ -4145,6 +4128,20 @@ + + + + + 2 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + @@ -4163,28 +4160,13 @@ - 4 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 4 + 2 Models/Props/Pillars/SciFiPillar3Red.mesh - - - + + + @@ -4193,65 +4175,7 @@ - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 6 + 2 Models/Props/Pillars/SciFiPillar2Red.mesh @@ -4266,7 +4190,65 @@ - 4 + 2 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar3Red.mesh + + + + + + + + + + + + + + 2 Models/Props/Pillars/SciFiPillar1Red.mesh @@ -4277,6 +4259,21 @@ + + + + + 2 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + @@ -4288,7 +4285,7 @@ - 15 + 3 Models/Props/Stones/ShinyStoneCrystalBlue.mesh @@ -4299,117 +4296,6 @@ - - - - - 10 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - 15 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - 15 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - 15 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - @@ -4428,12 +4314,13 @@ - 15 + 3 Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - + + + @@ -4445,8 +4332,8 @@ Models/Props/Bridges/SciFiBridgeDefense.mesh - - + + @@ -4455,13 +4342,26 @@ - 15 + 3 Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + @@ -4471,19 +4371,6 @@ - - - - Models/Props/Flora/HangingBush4.mesh - true - - - - - - - - @@ -4503,12 +4390,10 @@ Models/Props/Flora/HangingBush4.mesh true - false - - - + + @@ -4520,8 +4405,23 @@ true - - + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + false + + + + + @@ -4532,11 +4432,11 @@ - Models/Props/Bridges/SciFiBridgeDefense.mesh + Models/Props/Stones/AssaultHolder.mesh - - + + @@ -4545,11 +4445,11 @@ - Models/Props/Stones/AssaultHolder.mesh + Models/Props/Bridges/SciFiBridgeDefense.mesh - - + + @@ -4571,7 +4471,49 @@ - 15 + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 3 Models/Props/Stones/ShinyStoneCrystalBlue.mesh @@ -4582,6 +4524,20 @@ + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + @@ -4589,8 +4545,49 @@ Models/Props/Bridges/SciFiBridgeDefense.mesh - - + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + 9 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + @@ -4643,11 +4640,1057 @@ + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + @@ -4676,16 +5719,23 @@ + + + + + + + - Models/Props/Flora/Root.mesh + Models/Props/Walls/SpecialWall1.mesh - - - + + + @@ -4694,12 +5744,40 @@ - Models/Props/Flora/Root.mesh + Models/Props/Walls/SpecialWall1.mesh - - - + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + @@ -4738,6 +5816,32 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -4779,480 +5883,9 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - 1.5 - 1 - 0.30000001192092896 - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - + @@ -5261,11 +5894,31 @@ - Models/Props/Walls/SpecialWall1.mesh + Models/Props/Pillars/StonePillar.mesh - - + + + + + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + @@ -5275,12 +5928,456 @@ - Models/Props/Walls/SpecialWall1.mesh + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh - + + + + + + + + + + + + Models/Props/Walls/Medium_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Medium_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + + + Models/Props/Walls/Medium_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh + + + + + + + + + + + + + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Medium_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + + Models/Props/Walls/Medium_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + - @@ -5289,12 +6386,11 @@ - Models/Props/Walls/SpecialWall1.mesh + Models/Props/SciFiHolder1.mesh - - - + + @@ -5303,12 +6399,24 @@ - Models/Props/Walls/SpecialWall1.mesh + Models/Props/SciFiHolder1.mesh - - - + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + @@ -5337,11 +6445,11 @@ 12 - + - + @@ -5377,6 +6485,7 @@ + 1.5 Models/Props/Bridges/Bridge1_SciFi_Red.mesh @@ -5391,6 +6500,7 @@ + 1.5 Models/Props/Bridges/Bridge1_SciFi_Red.mesh @@ -5399,6 +6509,19 @@ + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + @@ -5419,7 +6542,7 @@ Models/Props/Bridges/SciFiBridgeDefense.mesh - + @@ -5429,6 +6552,7 @@ + 1.5 Models/Props/Bridges/Bridge1_SciFi_Red.mesh @@ -5449,27 +6573,15 @@ - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh - - - - - - - 12 - + - + @@ -5477,6 +6589,7 @@ + 1.5 Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh @@ -5487,10 +6600,35 @@ + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + @@ -5504,32 +6642,6 @@ - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFiBridgeDefense.mesh - - - - - - - - @@ -5558,11 +6670,11 @@ 12 - + - + @@ -5570,6 +6682,7 @@ + 1.5 Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh @@ -5589,8 +6702,8 @@ Models/Props/Bridges/SciFiBridgeDefense.mesh - - + + @@ -5601,6 +6714,7 @@ + 1.5 Models/Props/Bridges/Bridge1_SciFi_Red.mesh @@ -5717,1535 +6831,442 @@ - + - - Models/Props/Walls/SmallWall3.mesh + Models/Props/PickUps/PickUpHolder.mesh + false - - - - - - - - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - - - - - Models/Props/Walls/BigWallRed.mesh - - - + + + - - - Models/Props/Walls/BigWallRed.mesh - + + 2 + + + - - + - + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + - - Models/Props/Walls/SmallWall3.mesh + Models/Props/PickUps/PickUpHolder.mesh + false - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - Models/Props/Walls/MediumWall3.mesh - - - - - - - - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - - - - - - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - + + + - - - Models/Props/Stones/SmallStone1.mesh - + + 2 + + + - - + - + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + - - Models/Props/Stones/MediumStone2.mesh + Models/Props/PickUps/PickUpHolder.mesh + false - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - + + + - - - Models/Props/Stones/SmallStone2.mesh - + + 2 + + + - - - + - + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + - - Models/Props/Stones/SmallStone2.mesh + Models/Props/PickUps/PickUpHolder.mesh + false - + + + - + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + - - Models/Props/Stones/SmallStone2.mesh + Models/Props/PickUps/PickUpHolder.mesh + false - - - + + + - + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + - - Models/Props/Stones/SmallStone2.mesh + Models/Props/PickUps/PickUpHolder.mesh + false - - + + + - + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + - - Models/Props/Stones/SmallStone1.mesh + Models/Props/PickUps/PickUpHolder.mesh + false - - + + + - + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + - - Models/Props/Stones/SmallStone1.mesh + Models/Props/PickUps/PickUpHolder.mesh + false - - - + + + - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + @@ -7261,8 +7282,8 @@ Models/Props/Stones/AssaultHolder.mesh - - + + @@ -7287,8 +7308,8 @@ Models/Props/Stones/AssaultHolder.mesh - - + + @@ -7304,37 +7325,7 @@ - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 7 + 2 Models/Props/Stones/ShinyStoneCrystalRed.mesh @@ -7349,13 +7340,13 @@ - 7 + 3 Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - + + + @@ -7364,71 +7355,12 @@ - 7 + 3 Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - + + @@ -7438,41 +7370,12 @@ - 6 + 3 Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - 7 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - + + @@ -7497,17 +7400,47 @@ - 7 + 2 Models/Props/Stones/ShinyStoneCrystalRed.mesh - - + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + @@ -7516,9 +7449,97 @@ Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + @@ -7558,6 +7579,21 @@ + + + + + 2 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + + + + + @@ -7597,245 +7633,297 @@ - - - - - 6 - Models/Props/Pillars/SciFiPillar1Red.mesh - - - - - - - - - - - - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar3Blue.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar1Blue.mesh - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar3Blue.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 4 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 6 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + false + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + false + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/Medium_Wall_SciFi_Blue.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + @@ -7861,8 +7949,8 @@ Models/Props/Stones/AssaultHolder.mesh - - + + @@ -7874,21 +7962,8 @@ Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - + + @@ -7914,9 +7989,8 @@ Models/Props/Stones/AssaultHolder.mesh - - - + + @@ -7928,61 +8002,8 @@ Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - + + @@ -8007,8 +8028,22 @@ Models/Props/Stones/AssaultHolder.mesh - - + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + @@ -8033,9 +8068,34 @@ Models/Props/Stones/AssaultHolder.mesh - - - + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + @@ -8054,6 +8114,34 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + @@ -8070,7 +8158,7 @@ - + @@ -8079,37 +8167,12 @@ - Models/Props/Walls/MediumWall3.mesh + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - + + @@ -8119,214 +8182,17 @@ - Models/Props/Walls/SmallWall3.mesh + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - + + + - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - - - - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/SmallWall3.mesh - - - - - - - - - - - - - - Models/Props/Walls/smallWall3.mesh - - - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - - - - - - - - - - @@ -8338,11 +8204,12 @@ - Models/Props/Stones/SmallStone1.mesh + Models/Props/Stones/SmallStone2.mesh - - + + + @@ -8360,32 +8227,6 @@ - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -8393,9 +8234,8 @@ Models/Props/Stones/SmallStone2.mesh - - - + + @@ -8407,8 +8247,8 @@ Models/Props/Stones/SmallStone1.mesh - - + + @@ -8417,11 +8257,11 @@ - Models/Props/Stones/BigStone.mesh + Models/Props/Stones/SmallStone1.mesh - - + + @@ -8446,89 +8286,9 @@ Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - + + + @@ -8554,9 +8314,128 @@ Models/Props/Stones/MediumStone2.mesh - - - + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + @@ -8574,6 +8453,19 @@ + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + @@ -8595,8 +8487,9 @@ Models/Props/Stones/MediumStone2.mesh - - + + + @@ -8608,40 +8501,13 @@ Models/Props/Stones/SmallStone1.mesh - - + + - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -8656,47 +8522,3164 @@ - - - - - - - - 6 - Models/Props/Stones/ShinyStoneCrystalRed.mesh + Models/Props/Stones/SmallStone2.mesh - - - + + - - - - - - - 15 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 1.5 + Models/Props/Pillars/SciFiPillar3Blue.mesh + + + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar1Blue.mesh + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 1.5 + Models/Props/Pillars/SciFiPillar3Blue.mesh + + + + + + + + + + + + + + 1.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 1.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + + + + + + + + + -15 + + + + 4 + + + + + + + + + Models/Props/CapturePoint/CapturePointCylinder.mesh + + false + true + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + + + + + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + false + + + + + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + false + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + false + false + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + false + false + + + + + + + + + + + 1 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + + + + + + + + 15 + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointCylinder.mesh + + false + true + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + false + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + false + false + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + false + false + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + false + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + true + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + + + + + + + + + + + + + + + + + + + 3 + + + + + Models/Props/CapturePoint/CapturePointCylinder.mesh + + false + true + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + false + + + + + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + false + + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + false + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + false + + + + + + + + + + + 1 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + + + + + + + + 2 + + + + + Models/Props/CapturePoint/CapturePointCylinder.mesh + + false + true + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + false + + + + + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + false + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + false + + + + + + + + + + + + + + + + + + + 1 + + + + + Models/Props/CapturePoint/CapturePointCylinder.mesh + + false + true + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + false + + + + + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + false + true + + + + + + + + + + + 1 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + false + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + false + + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Schema/Entities/PlayerRed.xml + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + @@ -8707,7 +11690,7 @@ - + @@ -8719,158 +11702,57 @@ - + - + - + - + - Pick Class + 7 Fonts/DroidSans.ttf,64 - + - + - Textures/Icons/Classes/Defender-01.png - false - - - PickClass - 2 - - - - - - - - - - - Defender - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - Textures/Icons/Classes/Assault-01.png + Models/Core/UnitQuad.mesh - false - - - PickClass - 1 - - - - - - - - - - - Assault - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - Textures/Icons/Classes/Sniper-01.png - - false - - - PickClass - 3 - - - - - - - - - - - Sniper - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - SwapToTeamPick + SwapToClassPick 1 - + - + - Team + Class Fonts/DroidSans.ttf,64 @@ -8895,6 +11777,254 @@ + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + 1 + + + + 4 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 2 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + 1 + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 3 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 1 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToTeamPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + @@ -8916,9 +12046,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -8960,13 +12091,65 @@ + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + false + + + SwapToClassPick + 1 + + + + + + + + + + + Class + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -8998,9 +12181,10 @@ - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -9028,284 +12212,31 @@ - - - - - Textures/Core/UnitHexagon.png - - false - - false - - - SwapToClassPick - 1 - - - - - - - - - - - Change - Fonts/DroidSans.ttf,64 - false - - - - - - - - - - - - Class - Fonts/DroidSans.ttf,64 - false - - - - - - - - - - - + - + - + - - - - 7 - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - - - - 2 - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - - - - 1 - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - 1 - - - - 4 - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - 1 - - - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - - false - - - - - - - - - - - - - - 3 - - - Textures/Core/UnitHexagon_Rotated.png - - false - - - - - - - - - - - - - - Textures/Core/UnitHexagon.png - false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png @@ -9346,47 +12277,119 @@ - + - Textures/Core/UnitHexagon.png - false - + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Sniper-01.png - SwapToClassPick - 1 + PickClass + 3 - + - + - Class + Sniper Fonts/DroidSans.ttf,64 + - - + + - + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Assault-01.png + + + PickClass + 1 + + + + + + + + - Change + Assault Fonts/DroidSans.ttf,64 + - - + + + + + + + + + + + + Pick Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Defender-01.png + + + PickClass + 2 + + + + + + + + + + + Defender + Fonts/DroidSans.ttf,64 + + + + + @@ -9401,19 +12404,19 @@ - + - + - Schema/Entities/PlayerRed.xml + Schema/Entities/PlayerAssaultBlue.xml - + @@ -9425,7 +12428,7 @@ false - + @@ -9438,7 +12441,7 @@ false - + @@ -9451,7 +12454,7 @@ false - + @@ -9464,813 +12467,13 @@ false - + - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - Schema/Entities/ScoreBoard_Red.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Kills - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - KD - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Deaths - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Name - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - ID - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - Schema/Entities/ScoreBoard_Blue.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Name - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Kills - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - KD - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - ID - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Deaths - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Schema/Entities/ScoreBoard_Blue.xml - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - - - - - - - - - - - - - - - - - ID - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Deaths - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Name - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Kills - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - KD - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - Schema/Entities/ScoreBoard_Red.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Kills - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Name - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - KD - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - ID - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Deaths - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - - - - - - - - - - 3 - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointRed.mesh - - - - - - - - - - 15 - - - - - - - - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - - - - - - - - - - 2 - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - - - - - - - - - - 1 - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointBlue.mesh - - - - - - - - - - -15 - - - - 4 - - - - - - - - - Models/Core/UnitCylinder.mesh - - true - - - - - - - - - - - - - @@ -10279,11 +12482,10 @@ - 10 - + @@ -10299,18 +12501,7 @@ 4 - - - - - - - - - 4 - - - + @@ -10332,40 +12523,7 @@ 4 - - - - - - - - - 4 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - - - + @@ -10393,51 +12551,6 @@ - - - - 4 - - - - - - - - - - - 5 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - 1 - - - - - - - @@ -10466,22 +12579,1048 @@ 4 - + + + + + + + + + 5 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + 1 + + + - + - - - 0.80000001192092896 - 1.2000000476837158 - + + + + + + 15 + 1 + + + + + + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 3 + 1 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 3 + 1 + 0.5 + + + + + + + + + + + + 2 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 6 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + 0.40000000596046448 + + + + + @@ -10489,6 +13628,251 @@ + + + + + 15 + 1 + + + + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 6 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 6 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + 10 + 1 + + + + + + + + + @@ -10497,118 +13881,7 @@ - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - + @@ -10679,160 +13952,49 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + @@ -10864,6 +14026,43 @@ + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + @@ -10880,7 +14079,7 @@ 0.5 - + @@ -10888,13 +14087,13 @@ - + 5 2 0.5 - + @@ -10904,7 +14103,7 @@ - + @@ -10917,7 +14116,7 @@ 0.5 - + @@ -10931,7 +14130,44 @@ 0.5 - + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + @@ -10944,6 +14180,43 @@ + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + @@ -10978,7 +14251,118 @@ - + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + @@ -11028,7 +14412,7 @@ 0.5 - + @@ -11042,7 +14426,7 @@ 0.5 - + @@ -11052,7 +14436,81 @@ - + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + @@ -11086,102 +14544,6 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - 15 - 1 - - - - - - - - - - - - - - - - - 10 - 1 - - - - - - - - - - - - 10 - 1 - - - - - - - - - - - - 10 - 1 - - - - - - - @@ -11192,19 +14554,7 @@ 10 - - - - - - - - - 0.60000002384185791 - false - - - + @@ -11221,651 +14571,662 @@ - - - - 10 - - - - - - - - - - - 10 - - - - - - - - + + + + 1 + 1.2000000476837158 + + + + + + + 10 + + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + + + + + + + - + - - - 15 - 1 - + + + + - + - + - + + Models/Core/UnitCube.mesh + false + + + + + + + + + + + Schema/Entities/ScoreBoard_Blue.xml + + + + - + - - - + - + - - - 5 - 1 - 0.5 - + + Models/Core/UnitCube.mesh + + false + - + + - + - - - 5 - 1 - 0.5 - + + + + + + + + - + - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 3 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + - + - + + Schema/Entities/ScoreBoard_Red.xml + + + + - + - - - 10 - 1 - - - - + - - - - - - - 10 - 1 - - - - - - - - - - - - 10 - 1 - - - - - - + + + + + Models/Core/UnitCube.mesh + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + false + + + + + + + + - - - - - - - - - - - - Schema/Entities/Player.xml - - - - - - - + - - - Models/Characters/Assault/AssaultTPose.mesh - false - + - + + - - - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - + + + + + Models/Core/UnitCube.mesh + false + + + + + + + + + + + + Schema/Entities/ScoreBoard_Red.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + false + + + + + + + + + + + + + + + + Schema/Entities/ScoreBoard_Blue.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + false + + + + + + + + diff --git a/resources/Schema/Entities/FloatingCrystal.xml b/resources/Schema/Entities/FloatingCrystal.xml new file mode 100644 index 00000000..8e1ad5ab --- /dev/null +++ b/resources/Schema/Entities/FloatingCrystal.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/FloatingCrystalBlue.xml b/resources/Schema/Entities/FloatingCrystalBlue.xml new file mode 100644 index 00000000..0b5771cd --- /dev/null +++ b/resources/Schema/Entities/FloatingCrystalBlue.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + true + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + true + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + true + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/FloatingCrystalRed.xml b/resources/Schema/Entities/FloatingCrystalRed.xml new file mode 100644 index 00000000..0ca14a15 --- /dev/null +++ b/resources/Schema/Entities/FloatingCrystalRed.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/FloatingCrystalWhite.xml b/resources/Schema/Entities/FloatingCrystalWhite.xml new file mode 100644 index 00000000..d1ccd894 --- /dev/null +++ b/resources/Schema/Entities/FloatingCrystalWhite.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + false + true + + + + + + + + + + + 1 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + diff --git a/resources/Schema/Entities/HealthPickup.xml b/resources/Schema/Entities/HealthPickup.xml index 6474426f..af9530aa 100644 --- a/resources/Schema/Entities/HealthPickup.xml +++ b/resources/Schema/Entities/HealthPickup.xml @@ -2,21 +2,26 @@ - - - Models/Props/PickUps/HealthPickUp.mesh - + 8 + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + - + + - - diff --git a/resources/Schema/Entities/NewMap2version6NEW.xml b/resources/Schema/Entities/NewMap2version6NEW.xml new file mode 100644 index 00000000..5544ba82 --- /dev/null +++ b/resources/Schema/Entities/NewMap2version6NEW.xml @@ -0,0 +1,11874 @@ + + + + + + + + + + + + + + + + + + 2 + Models/Props/GroundTest.mesh + + + + + + + + 2 + Models/Props/Walls/SciFiWallTop.mesh + + + + + + + + + 2 + Models/Props/Walls/SciFiWallBig.mesh + + + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallBig.mesh + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallMedium.mesh + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallSmall1.mesh + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallSmall2.mesh + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallMedium.mesh + + + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallSmall3.mesh + + + + + + + + + + 2 + Models/Props/Walls/SciFiWallSmall4.mesh + + + + + + + + + + + + Models/Highgrounds/Highground1.mesh + + + + + + + + + + Models/Highgrounds/Highground2.mesh + + + + + + + + + + Models/Highgrounds/Highground3.mesh + + + + + + + + + + + Models/Highgrounds/Highground24.mesh + + + + + + + + + + + Models/Highgrounds/Hg13.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg25.mesh + + + + + + + + + + + + Models/Highgrounds/Hg26.mesh + + + + + + + + + + + + Models/Highgrounds/Hg9.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg4.mesh + + + + + + + + + + + + + + Models/Highgrounds/Hg10.mesh + + + + + + + + + + + + + + Models/Highgrounds/Hg19.mesh + + + + + + + + + + + + + + Models/Highgrounds/Hg19.mesh + + + + + + + + + + + + + + + Models/Highgrounds/Highground12.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg16.mesh + + + + + + + + + + + + Models/Highgrounds/Hg15.mesh + + + + + + + + + + + + Models/Highgrounds/Hg14.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg13.mesh + + + + + + + + + + + + Models/Highgrounds/Hg11.mesh + + + + + + + + + + + + Models/Highgrounds/Hg20.mesh + + + + + + + + + + + + Models/Highgrounds/Hg18.mesh + + + + + + + + + + + + Models/Highgrounds/Hg19.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg17.mesh + + + + + + + + + + + + + + + Models/Highgrounds/Hg8.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg7.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg3.mesh + + + + + + + + + + + + + + + Models/Highgrounds/Highground3.mesh + + + + + + + + + + + + Models/Highgrounds/Highground1.mesh + + + + + + + + + + + + Models/Highgrounds/Highground2.mesh + + + + + + + + + + + + + + Models/Highgrounds/Hg1.mesh + + + + + + + + + + + Models/Highgrounds/Hg2.mesh + + + + + + + + + + + + + + Models/Highgrounds/Highground5.mesh + + + + + + + + + + + + Models/Highgrounds/Hg10.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg4.mesh + + + + + + + + + + + + Models/Highgrounds/Hg7.mesh + + + + + + + + + + + + Models/Highgrounds/Hg17.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg19.mesh + + + + + + + + + + + + Models/Highgrounds/Hg18.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg20.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg6.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg8.mesh + + + + + + + + + + + + Models/Highgrounds/Hg16.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg9.mesh + + + + + + + + + + + + Models/Highgrounds/Hg3.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg19.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Highgrounds/Hg10.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + + + + Models/Highgrounds/Highground22.mesh + + + + + + + + + + + + Models/Highgrounds/Hg8.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg19.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg21.mesh + + + + + + + + + + + + Models/Highgrounds/Hg11.mesh + + + + + + + + + + + + Models/Highgrounds/Hg3.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg17.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg8.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + + + Models/Highgrounds/Hg28.mesh + + + + + + + + + + + Models/Highgrounds/Hg10.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg27.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg15.mesh + + + + + + + + + + + + + + Models/Highgrounds/Hg13.mesh + + + + + + + + + + + + + + + Models/Highgrounds/Hg27.mesh + + + + + + + + + + + + Models/Highgrounds/Hg23.mesh + + + + + + + + + + + + + + + Models/Highgrounds/Hg27.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg23.mesh + + + + + + + + + + + + + + + Models/Highgrounds/Hg28.mesh + + + + + + + + + + + + Models/Highgrounds/Hg10.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg27.mesh + + + + + + + + + + + + + Models/Highgrounds/Hg15.mesh + + + + + + + + + + + + + + Models/Highgrounds/Hg13.mesh + + + + + + + + + + + + + + + Models/Highgrounds/Hg1.mesh + + + + + + + + + + + + Models/Highgrounds/Hg2.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Blue.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Blue.mesh + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Blue.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Blue.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Blue.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Blue.mesh + + + + + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Blue.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Blue.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Blue.mesh + + + + + + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Blue.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Blue.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Blue.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Blue.mesh + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar1Blue.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + + Models/Core/UnitPlane.mesh + + true + + + + + + + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 2 + + + + + + + + + + + + 2 + 1 + + + + + + + + + + + + 3 + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + false + + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + + + + + + + + + + + + Models/Props/Flora/HangingBush2.mesh + true + + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + 10 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar1Blue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + + 12 + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + + + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + Models/Props/Bridges/SciFiBridgeDefense.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 1 + 0.30000001192092896 + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + Models/Props/Flora/Root.mesh + + + + + + + + + + + + + + + Models/Core/UnitPlane.mesh + + true + + + + + + + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + Models/Props/SciFiHolder1.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 7 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar3Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar3Red.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar3Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar1Blue.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar3Blue.mesh + + + + + + + + + + + + + + 4 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 6 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/Walls/MediumWall3.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + + + + + + Models/Props/Walls/smallWall3.mesh + + + + + + + + + + + + + + Models/Props/Walls/SmallWall3.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + + + 6 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 15 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + Schema/Entities/ScoreBoard_Red.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + + + + + + + + + + + + + Schema/Entities/ScoreBoard_Blue.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + Schema/Entities/ScoreBoard_Blue.xml + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + Schema/Entities/ScoreBoard_Red.xml + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + 0.049999997019767761 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Textures/Icons/Classes/Assault-01.png + + false + + + PickClass + 1 + + + + + + + + + + + Assault + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + Textures/Icons/Classes/Sniper-01.png + + false + + + PickClass + 3 + + + + + + + + + + + Sniper + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + SwapToTeamPick + 1 + + + + + + + + + + + Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Textures/Icons/Classes/Defender-01.png + + false + + + PickClass + 2 + + + + + + + + + + + Defender + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Pick Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Pick Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + PickTeam + 1 + + + + + + + + + + + Spectator + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + PickTeam + 3 + + + + + + + + + + + Blue + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + PickTeam + 2 + + + + + + + + + + + Red + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + false + + + SwapToClassPick + 1 + + + + + + + + + + + Class + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + SwapToTeamPick + 1 + + + + + + + + + + + Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + + + + + + + + + + + 2 + + + Textures/Core/UnitHexagon_Rotated.png + + false + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + + + + + + + + + + + 1 + + + Textures/Core/UnitHexagon_Rotated.png + + false + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + + + + + + + + 1 + + + + 4 + + + Textures/Core/UnitHexagon_Rotated.png + + false + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + + + + + + + + 1 + + + + + Textures/Core/UnitHexagon_Rotated.png + + false + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + + + + + + + + + + + 3 + + + Textures/Core/UnitHexagon_Rotated.png + + false + + + + + + + + + + + + + + + + + + Textures/Core/UnitHexagon.png + + false + + + + SwapToClassPick + 1 + + + + + + + + + + + Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + 7 + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + 2 + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + + + + + + + + + + 15 + + + + + + + + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + 1 + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + 3 + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + + + + + + + + + + -15 + + + + 4 + + + + + + + + + Models/Core/UnitCylinder.mesh + + true + + + + + + + + + + + + + + + + + + + + + + + Schema/Entities/PlayerRed.xml + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + 15 + 1 + + + + + + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + 4 + 2 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 5 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + 1 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + + + 0.60000002384185791 + false + + + + + + + + + + + + 10 + + + + + + + + + + + + 10 + + + + + + + + + + + + 0.80000001192092896 + 1.2000000476837158 + + + + + + + + + 10 + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + 10 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 3 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + 15 + 1 + + + + + + + + + + + + + + + + + + + + + Schema/Entities/Player.xml + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + From 7759af2c5aba244c749858590dd83430236ef153 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Mar 2016 15:52:47 +0100 Subject: [PATCH 65/65] Log remove --- src/Engine/Network/Packet.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index 3e0d819b..83fbf34b 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -70,7 +70,7 @@ void Packet::WriteString(const std::string& str) size_t sizeOfString = str.size() + 1; if (m_Offset + sizeOfString > m_MaxPacketSize) { if (m_MaxPacketSize >= 32000) { - LOG_WARNING("Package::WriteString(): New size is huge %i bytes\n", m_MaxPacketSize*2); + //LOG_WARNING("Package::WriteString(): New size is huge %i bytes\n", m_MaxPacketSize*2); } resizeData(); } @@ -85,7 +85,7 @@ void Packet::WriteData(char * data, int sizeOfData) if (m_Offset + sizeOfData > m_MaxPacketSize) { if (m_MaxPacketSize >= 32000) { - LOG_WARNING("Package::WriteData(): New size is huge %i bytes\n", m_MaxPacketSize*2); + //LOG_WARNING("Package::WriteData(): New size is huge %i bytes\n", m_MaxPacketSize*2); } while (m_Offset + sizeOfData > m_MaxPacketSize) { resizeData();