Scraping queues for interpolation
This commit is contained in:
@@ -12,15 +12,14 @@
|
||||
|
||||
#include "Network/EInterpolate.h"
|
||||
|
||||
struct Transform {
|
||||
glm::vec3 Position;
|
||||
glm::vec3 Scale;
|
||||
glm::vec3 Orientation;
|
||||
double interpolationTime;
|
||||
};
|
||||
|
||||
class InterpolationSystem : public PureSystem
|
||||
{
|
||||
struct Transform {
|
||||
glm::vec3 Position;
|
||||
glm::vec3 Scale;
|
||||
glm::vec3 Orientation;
|
||||
double interpolationTime;
|
||||
};
|
||||
public:
|
||||
InterpolationSystem(EventBroker* eventbroker)
|
||||
: PureSystem(eventbroker, "Transform")
|
||||
@@ -31,7 +30,8 @@ public:
|
||||
|
||||
virtual void UpdateComponent(World* world, ComponentWrapper& transform, double dt) override;
|
||||
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);
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ void Packet::WriteString(const std::string& str)
|
||||
// Message, add one extra byte for null terminator
|
||||
int sizeOfString = str.size() + 1;
|
||||
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();
|
||||
}
|
||||
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)
|
||||
{
|
||||
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();
|
||||
}
|
||||
memcpy(m_Data + m_Offset, data, sizeOfData);
|
||||
@@ -61,7 +61,7 @@ std::string Packet::ReadString()
|
||||
{
|
||||
std::string returnValue(m_Data + m_ReturnDataOffset);
|
||||
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";
|
||||
}
|
||||
// +1 for null terminator.
|
||||
@@ -72,7 +72,7 @@ std::string Packet::ReadString()
|
||||
char * Packet::ReadData(int 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;
|
||||
}
|
||||
unsigned int oldReturnDataOffset = m_ReturnDataOffset;
|
||||
|
||||
@@ -227,7 +227,7 @@ void Server::parseOnInputCommand(Packet& packet)
|
||||
e.PlayerID = playerID; // Set correct player id
|
||||
e.Value = packet.ReadPrimitive<float>();
|
||||
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.TypeOfDamage = packet.ReadString();
|
||||
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)
|
||||
|
||||
@@ -1,23 +1,32 @@
|
||||
#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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
Transform& sTransform = m_InterpolationPoints[transform.EntityID];
|
||||
sTransform.interpolationTime += dt;
|
||||
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)
|
||||
@@ -37,14 +46,17 @@ bool InterpolationSystem::OnInterpolate(const Events::Interpolate & e)
|
||||
memcpy(&transform.Orientation, e.DataArray.get() + offset, sizeof(glm::vec3));
|
||||
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
|
||||
if (m_InterpolationPoints.find(e.Entity) != m_InterpolationPoints.end()) { // Did exist, push to queue
|
||||
m_InterpolationPoints[e.Entity].push(transform);
|
||||
} else { // Did not exist, create queue
|
||||
std::queue<Transform> transformQueue;
|
||||
transformQueue.push(transform);
|
||||
m_InterpolationPoints[e.Entity] = transformQueue;
|
||||
}
|
||||
//if (m_InterpolationPoints.find(e.Entity) != m_InterpolationPoints.end()) { // Did exist, push to queue
|
||||
// m_InterpolationPoints[e.Entity].push(transform);
|
||||
//}
|
||||
|
||||
//else { // Did not exist, create queue
|
||||
// std::queue<Transform> transformQueue;
|
||||
// transformQueue.push(transform);
|
||||
// m_InterpolationPoints[e.Entity] = transformQueue;
|
||||
//}
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user