Scraping queues for interpolation

This commit is contained in:
stiffly
2016-01-18 18:07:59 +01:00
parent 765509b510
commit 88eb3ca2db
4 changed files with 50 additions and 38 deletions
+8 -8
View File
@@ -12,15 +12,14 @@
#include "Network/EInterpolate.h" #include "Network/EInterpolate.h"
struct Transform {
glm::vec3 Position;
glm::vec3 Scale;
glm::vec3 Orientation;
double interpolationTime;
};
class InterpolationSystem : public PureSystem class InterpolationSystem : public PureSystem
{ {
struct Transform {
glm::vec3 Position;
glm::vec3 Scale;
glm::vec3 Orientation;
double interpolationTime;
};
public: public:
InterpolationSystem(EventBroker* eventbroker) InterpolationSystem(EventBroker* eventbroker)
: PureSystem(eventbroker, "Transform") : PureSystem(eventbroker, "Transform")
@@ -31,7 +30,8 @@ public:
virtual void UpdateComponent(World* world, ComponentWrapper& transform, double dt) override; virtual void UpdateComponent(World* world, ComponentWrapper& transform, double dt) override;
private: private:
std::unordered_map<EntityID, std::queue<Transform>> m_InterpolationPoints; //std::unordered_map<EntityID, std::queue<Transform>> m_InterpolationPoints;
std::unordered_map<EntityID, Transform> m_InterpolationPoints;
glm::vec3 vectorInterpolation(glm::vec3 prev, glm::vec3 next, double currentTime); glm::vec3 vectorInterpolation(glm::vec3 prev, glm::vec3 next, double currentTime);
+4 -4
View File
@@ -40,7 +40,7 @@ void Packet::WriteString(const std::string& str)
// Message, add one extra byte for null terminator // Message, add one extra byte for null terminator
int sizeOfString = str.size() + 1; int sizeOfString = str.size() + 1;
if (m_Offset + sizeOfString > m_MaxPacketSize) { if (m_Offset + sizeOfString > m_MaxPacketSize) {
LOG_WARNING("Package::WriteString(): Data size in packet exceeded maximum package size. New size is %i bytes\n", m_MaxPacketSize*2); //LOG_WARNING("Package::WriteString(): Data size in packet exceeded maximum package size. New size is %i bytes\n", m_MaxPacketSize*2);
resizeData(); resizeData();
} }
memcpy(m_Data + m_Offset, str.data(), sizeOfString * sizeof(char)); memcpy(m_Data + m_Offset, str.data(), sizeOfString * sizeof(char));
@@ -50,7 +50,7 @@ void Packet::WriteString(const std::string& str)
void Packet::WriteData(char * data, int sizeOfData) void Packet::WriteData(char * data, int sizeOfData)
{ {
if (m_Offset + sizeOfData > m_MaxPacketSize) { if (m_Offset + sizeOfData > m_MaxPacketSize) {
LOG_WARNING("Packet::WriteData(): Data size in packet exceeded maximum packet size. New size is %i bytes\n", m_MaxPacketSize*2); //LOG_WARNING("Packet::WriteData(): Data size in packet exceeded maximum packet size. New size is %i bytes\n", m_MaxPacketSize*2);
resizeData(); resizeData();
} }
memcpy(m_Data + m_Offset, data, sizeOfData); memcpy(m_Data + m_Offset, data, sizeOfData);
@@ -61,7 +61,7 @@ std::string Packet::ReadString()
{ {
std::string returnValue(m_Data + m_ReturnDataOffset); std::string returnValue(m_Data + m_ReturnDataOffset);
if (m_Offset < m_ReturnDataOffset + returnValue.size()) { if (m_Offset < m_ReturnDataOffset + returnValue.size()) {
LOG_WARNING("packet ReadString(): Oh no! You are trying to remove things outside my memory kingdom"); //LOG_WARNING("packet ReadString(): Oh no! You are trying to remove things outside my memory kingdom");
return "PopFrontString Failed"; return "PopFrontString Failed";
} }
// +1 for null terminator. // +1 for null terminator.
@@ -72,7 +72,7 @@ std::string Packet::ReadString()
char * Packet::ReadData(int SizeOfData) char * Packet::ReadData(int SizeOfData)
{ {
if (m_Offset < m_ReturnDataOffset + SizeOfData) { if (m_Offset < m_ReturnDataOffset + SizeOfData) {
LOG_WARNING("packet ReadData(): Oh no! You are trying to remove things outside my memory kingdom"); //LOG_WARNING("packet ReadData(): Oh no! You are trying to remove things outside my memory kingdom");
return nullptr; return nullptr;
} }
unsigned int oldReturnDataOffset = m_ReturnDataOffset; unsigned int oldReturnDataOffset = m_ReturnDataOffset;
+2 -2
View File
@@ -227,7 +227,7 @@ void Server::parseOnInputCommand(Packet& packet)
e.PlayerID = playerID; // Set correct player id e.PlayerID = playerID; // Set correct player id
e.Value = packet.ReadPrimitive<float>(); e.Value = packet.ReadPrimitive<float>();
m_EventBroker->Publish(e); m_EventBroker->Publish(e);
LOG_INFO("Server::parseOnInputCommand: Command is %s. Value is %f. PlayerID is %i.", e.Command.c_str(), e.Value, e.PlayerID); //LOG_INFO("Server::parseOnInputCommand: Command is %s. Value is %f. PlayerID is %i.", e.Command.c_str(), e.Value, e.PlayerID);
} }
} }
} }
@@ -239,7 +239,7 @@ void Server::parseOnPlayerDamage(Packet & packet)
e.PlayerDamagedID = packet.ReadPrimitive<EntityID>(); e.PlayerDamagedID = packet.ReadPrimitive<EntityID>();
e.TypeOfDamage = packet.ReadString(); e.TypeOfDamage = packet.ReadString();
m_EventBroker->Publish(e); m_EventBroker->Publish(e);
LOG_DEBUG("Server::parseOnPlayerDamage: Command is %s. Value is %f. PlayerID is %i.", e.DamageAmount, e.PlayerDamagedID, e.TypeOfDamage.c_str()); //LOG_DEBUG("Server::parseOnPlayerDamage: Command is %s. Value is %f. PlayerID is %i.", e.DamageAmount, e.PlayerDamagedID, e.TypeOfDamage.c_str());
} }
void Server::parseConnect(Packet& packet) void Server::parseConnect(Packet& packet)
+36 -24
View File
@@ -1,23 +1,32 @@
#include "InterpolationSystem.h" #include "InterpolationSystem.h"
//void InterpolationSystem::UpdateComponent(World * world, ComponentWrapper & transform, double dt)
//{
// if (m_InterpolationPoints[transform.EntityID].size() > 0) {
// Transform& sTransform = m_InterpolationPoints[transform.EntityID].front();
// sTransform.interpolationTime += dt;
// if (sTransform.interpolationTime > 0.05) {
// double time = std::fmod(sTransform.interpolationTime, 0.05f);
// m_InterpolationPoints[transform.EntityID].pop();
// if (m_InterpolationPoints[transform.EntityID].size() <= 0) {
// return;
// }
// sTransform = m_InterpolationPoints[transform.EntityID].front();
// sTransform.interpolationTime = time;
// }
// glm::vec3 nextPosition = sTransform.Position;
// glm::vec3 currentPosition = static_cast<glm::vec3>(transform["Position"]);
// transform["Position"] = vectorInterpolation(currentPosition, nextPosition, sTransform.interpolationTime);
// }
//}
void InterpolationSystem::UpdateComponent(World * world, ComponentWrapper & transform, double dt) void InterpolationSystem::UpdateComponent(World * world, ComponentWrapper & transform, double dt)
{ {
if (m_InterpolationPoints[transform.EntityID].size() > 0) { Transform& sTransform = m_InterpolationPoints[transform.EntityID];
Transform& sTransform = m_InterpolationPoints[transform.EntityID].front(); sTransform.interpolationTime += dt;
sTransform.interpolationTime += dt; glm::vec3 nextPosition = sTransform.Position;
if (sTransform.interpolationTime > 0.05) { glm::vec3 currentPosition = static_cast<glm::vec3>(transform["Position"]);
double time = std::fmod(sTransform.interpolationTime, 0.05f); transform["Position"] = vectorInterpolation(currentPosition, nextPosition, sTransform.interpolationTime);
m_InterpolationPoints[transform.EntityID].pop();
if (m_InterpolationPoints[transform.EntityID].size() <= 0) {
return;
}
sTransform = m_InterpolationPoints[transform.EntityID].front();
sTransform.interpolationTime = time;
}
glm::vec3 nextPosition = sTransform.Position;
glm::vec3 currentPosition = static_cast<glm::vec3>(transform["Position"]);
transform["Position"] = vectorInterpolation(currentPosition, nextPosition, sTransform.interpolationTime);
}
} }
glm::vec3 InterpolationSystem::vectorInterpolation(glm::vec3 prev, glm::vec3 next, double currentTime) glm::vec3 InterpolationSystem::vectorInterpolation(glm::vec3 prev, glm::vec3 next, double currentTime)
@@ -37,14 +46,17 @@ bool InterpolationSystem::OnInterpolate(const Events::Interpolate & e)
memcpy(&transform.Orientation, e.DataArray.get() + offset, sizeof(glm::vec3)); memcpy(&transform.Orientation, e.DataArray.get() + offset, sizeof(glm::vec3));
offset += sizeof(glm::vec3); offset += sizeof(glm::vec3);
memcpy(&transform.Scale, e.DataArray.get() + offset, sizeof(glm::vec3)); memcpy(&transform.Scale, e.DataArray.get() + offset, sizeof(glm::vec3));
transform.interpolationTime = 0;
m_InterpolationPoints[e.Entity] = transform;
// Check if queue already exists // Check if queue already exists
if (m_InterpolationPoints.find(e.Entity) != m_InterpolationPoints.end()) { // Did exist, push to queue //if (m_InterpolationPoints.find(e.Entity) != m_InterpolationPoints.end()) { // Did exist, push to queue
m_InterpolationPoints[e.Entity].push(transform); // m_InterpolationPoints[e.Entity].push(transform);
} else { // Did not exist, create queue //}
std::queue<Transform> transformQueue;
transformQueue.push(transform); //else { // Did not exist, create queue
m_InterpolationPoints[e.Entity] = transformQueue; // std::queue<Transform> transformQueue;
} // transformQueue.push(transform);
// m_InterpolationPoints[e.Entity] = transformQueue;
//}
return false; return false;
} }