Scraping queues for interpolation
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user