From 31e7340daf4ebd0993a17bb229105b17f4f08a7e Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Sat, 23 Jan 2016 00:40:18 +0100 Subject: [PATCH] Ignoring interpolation and rendering for local player entities! --- assets | 2 +- .../Editor/EditorCameraInputController.h | 2 +- include/Engine/Rendering/RenderSystem.h | 5 ++ include/Game/Systems/InterpolationSystem.h | 13 ++--- resources/Schema/Entities/Player.xml | 47 +++++++++++++++---- src/Engine/Core/EntityWrapper.cpp | 3 ++ src/Engine/Rendering/RenderSystem.cpp | 35 +++++++++++++- src/Game/Systems/InterpolationSystem.cpp | 29 ++++++++++-- 8 files changed, 113 insertions(+), 23 deletions(-) diff --git a/assets b/assets index 2a800ea9..e8174f63 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 2a800ea92b323646432c65217d55aab6750d5a72 +Subproject commit e8174f630fc3242e15ada1346b42c72f44cbc854 diff --git a/include/Engine/Editor/EditorCameraInputController.h b/include/Engine/Editor/EditorCameraInputController.h index 82e8b337..66c7952a 100644 --- a/include/Engine/Editor/EditorCameraInputController.h +++ b/include/Engine/Editor/EditorCameraInputController.h @@ -30,7 +30,7 @@ public: virtual bool OnCommand(const Events::InputCommand& e) override { - if (!m_MouseLocked) { + if (glm::abs(e.Value) > 0 && !m_MouseLocked) { return false; } diff --git a/include/Engine/Rendering/RenderSystem.h b/include/Engine/Rendering/RenderSystem.h index ef824ea5..4c23c6c6 100644 --- a/include/Engine/Rendering/RenderSystem.h +++ b/include/Engine/Rendering/RenderSystem.h @@ -15,6 +15,7 @@ #include "Renderer.h" #include "PointLightJob.h" #include "../Core/Transform.h" +#include "../../Game/Events/EPlayerSpawned.h" class RenderSystem : public ImpureSystem { @@ -29,6 +30,7 @@ private: RenderFrame* m_RenderFrame; Camera* m_Camera; EntityWrapper m_CurrentCamera = EntityWrapper::Invalid; + EntityWrapper m_LocalPlayer = EntityWrapper::Invalid; EventRelay m_ESetCamera; bool OnSetCamera(Events::SetCamera &event); @@ -40,6 +42,9 @@ private: void fillModels(std::list>& jobs); void fillLight(std::list>& jobs); + + EventRelay m_EPlayerSpawned; + bool OnPlayerSpawned(Events::PlayerSpawned& e); }; #endif \ No newline at end of file diff --git a/include/Game/Systems/InterpolationSystem.h b/include/Game/Systems/InterpolationSystem.h index 0e137598..707c0acf 100644 --- a/include/Game/Systems/InterpolationSystem.h +++ b/include/Game/Systems/InterpolationSystem.h @@ -12,6 +12,7 @@ #include "Core/EventBroker.h" #include "Core/ResourceManager.h" #include "Core/ConfigFile.h" +#include "Events/EPlayerSpawned.h" #include "Network/EInterpolate.h" @@ -25,19 +26,13 @@ class InterpolationSystem : public PureSystem double interpolationTime; }; public: - InterpolationSystem(World* world, EventBroker* eventBroker) - : System(world, eventBroker) - , PureSystem("Transform") - { - ConfigFile* config = ResourceManager::Load("Config.ini"); - m_SnapshotInterval = config->Get("Networking.SnapshotInterval", 0.05); - EVENT_SUBSCRIBE_MEMBER(m_EInterpolate, &InterpolationSystem::OnInterpolate); - } + InterpolationSystem(World* world, EventBroker* eventBroker); ~InterpolationSystem() { } virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& transform, double dt) override; private: std::unordered_map m_NextTransform; std::unordered_map m_LastReceivedTransform; + EntityWrapper m_LocalPlayer = EntityWrapper::Invalid; //glm::vec3 vectorInterpolation(glm::vec3 prev, glm::vec3 next, double currentTime); template @@ -51,6 +46,8 @@ private: EventRelay m_EInterpolate; bool InterpolationSystem::OnInterpolate(const Events::Interpolate& e); + EventRelay m_EPlayerSpawned; + bool OnPlayerSpawned(Events::PlayerSpawned& e); }; #endif diff --git a/resources/Schema/Entities/Player.xml b/resources/Schema/Entities/Player.xml index 087b1f7e..fa8b7686 100644 --- a/resources/Schema/Entities/Player.xml +++ b/resources/Schema/Entities/Player.xml @@ -11,9 +11,13 @@ 3 + + + + + - - + @@ -21,22 +25,47 @@ - - Models/Camera.obj - false - - + - + + + + + + Fonts/DroidSans.ttf,100 + + + + + + + + + + + + + + Models/Camera.obj + + + + + + + + + Models/Camera.obj + false @@ -48,7 +77,7 @@ - Models/Assault.obj + Models/AssaultHeadless.obj diff --git a/src/Engine/Core/EntityWrapper.cpp b/src/Engine/Core/EntityWrapper.cpp index 6177d91d..2f9c17db 100644 --- a/src/Engine/Core/EntityWrapper.cpp +++ b/src/Engine/Core/EntityWrapper.cpp @@ -5,6 +5,9 @@ const EntityWrapper EntityWrapper::Invalid = EntityWrapper(nullptr, EntityID_Inv bool EntityWrapper::HasComponent(const std::string& componentName) { + if (!Valid()) { + return false; + } return World->HasComponent(ID, componentName); } diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index 5aa0108e..a478bb43 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -7,6 +7,7 @@ RenderSystem::RenderSystem(World* world, EventBroker* eventBroker, const IRender { EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &RenderSystem::OnSetCamera); 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); } @@ -46,6 +47,18 @@ void RenderSystem::fillModels(std::list>& jobs) continue; } + EntityWrapper entity(m_World, modelComponent.EntityID); + bool isLocalPlayer = entity == m_LocalPlayer; + while (entity.Parent().Valid()) { + entity = entity.Parent(); + if (entity == m_LocalPlayer) { + isLocalPlayer = true; + } + } + if (isLocalPlayer) { + continue; + } + Model* model; try { model = ResourceManager::Load<::Model, true>(resource); @@ -68,6 +81,14 @@ void RenderSystem::fillModels(std::list>& jobs) } } +bool RenderSystem::OnPlayerSpawned(Events::PlayerSpawned& e) +{ + if (e.PlayerID == -1) { + m_LocalPlayer = e.Player; + } + return true; +} + void RenderSystem::fillPointLights(std::list>& jobs, World* world) { auto pointLights = m_World->GetComponents("PointLight"); @@ -128,6 +149,18 @@ void RenderSystem::fillText(std::list>& jobs, World* continue; } + EntityWrapper entity(m_World, textComponent.EntityID); + bool isLocalPlayer = entity == m_LocalPlayer; + while (entity.Parent().Valid()) { + entity = entity.Parent(); + if (entity == m_LocalPlayer) { + isLocalPlayer = true; + } + } + if (isLocalPlayer) { + continue; + } + Font* font; try { font = ResourceManager::Load(resource); @@ -169,7 +202,7 @@ void RenderSystem::Update(double dt) fillModels(scene.ForwardJobs); fillPointLights(scene.PointLightJobs, m_World); fillDirectionalLights(scene.DirectionalLightJobs, m_World); - fillText(scene.TextJobs, world); + fillText(scene.TextJobs, m_World); m_RenderFrame->Add(scene); } \ No newline at end of file diff --git a/src/Game/Systems/InterpolationSystem.cpp b/src/Game/Systems/InterpolationSystem.cpp index be2c9a4f..84f50456 100644 --- a/src/Game/Systems/InterpolationSystem.cpp +++ b/src/Game/Systems/InterpolationSystem.cpp @@ -1,5 +1,15 @@ #include "Systems/InterpolationSystem.h" +InterpolationSystem::InterpolationSystem(World* world, EventBroker* eventBroker) + : System(world, eventBroker) + , PureSystem("Transform") +{ + ConfigFile* config = ResourceManager::Load("Config.ini"); + m_SnapshotInterval = config->Get("Networking.SnapshotInterval", 0.05); + EVENT_SUBSCRIBE_MEMBER(m_EInterpolate, &InterpolationSystem::OnInterpolate); + EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &InterpolationSystem::OnPlayerSpawned); +} + void InterpolationSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& transform, double dt) { if (m_NextTransform.find(transform.EntityID) != m_NextTransform.end()) { // Exists in map @@ -17,14 +27,21 @@ void InterpolationSystem::UpdateComponent(EntityWrapper& entity, ComponentWrappe } } if (transform.Info.Name == "Transform") { + bool isLocalPlayer = entity == m_LocalPlayer || entity.Parent() == m_LocalPlayer; // Position glm::vec3 nextPosition = sTransform.Position; glm::vec3 currentPosition = static_cast(transform["Position"]); + if (isLocalPlayer && glm::length(nextPosition - currentPosition) < 1.f) { + return; + } (glm::vec3&)transform["Position"] += vectorInterpolation(currentPosition, nextPosition, sTransform.interpolationTime); // Orientation - glm::quat nextOrientation = sTransform.Orientation; - glm::quat currentOrientation = glm::quat(static_cast(transform["Orientation"])); - (glm::vec3&)transform["Orientation"] = glm::eulerAngles(glm::slerp(currentOrientation, nextOrientation, sTransform.interpolationTime / m_SnapshotInterval)); + //bool isPlayer = entity.HasComponent("Player") || entity.Parent().HasComponent("Player"); + if (!isLocalPlayer) { + glm::quat nextOrientation = sTransform.Orientation; + glm::quat currentOrientation = glm::quat(static_cast(transform["Orientation"])); + (glm::vec3&)transform["Orientation"] = glm::eulerAngles(glm::slerp(currentOrientation, nextOrientation, sTransform.interpolationTime / m_SnapshotInterval)); + } // Scale glm::vec3 nextScale = sTransform.Scale; glm::vec3 currentScale = static_cast(transform["Scale"]); @@ -33,6 +50,12 @@ void InterpolationSystem::UpdateComponent(EntityWrapper& entity, ComponentWrappe } } +bool InterpolationSystem::OnPlayerSpawned(Events::PlayerSpawned& e) +{ + m_LocalPlayer = e.Player; + return true; +} + bool InterpolationSystem::OnInterpolate(const Events::Interpolate & e) { Transform transform;