일단은 멀티로 접속이 됨..
This commit is contained in:
@@ -10,6 +10,9 @@ struct Address {
|
||||
void set(int type, gsl::czstring presentationAddr, std::uint16_t port);
|
||||
void setType(int type);
|
||||
|
||||
Address(const Address&) = default;
|
||||
Address& operator=(const Address&) = default;
|
||||
|
||||
operator std::string();
|
||||
std::uint16_t getPort() const;
|
||||
|
||||
|
||||
@@ -24,80 +24,10 @@ typedef struct __WSABUF {
|
||||
|
||||
namespace Network {
|
||||
|
||||
class IOCP;
|
||||
struct IOCPPASSINDATA;
|
||||
|
||||
enum class IOCPEVENT { QUIT, READ, WRITE };
|
||||
|
||||
struct IOCPPASSINDATA {
|
||||
OVERLAPPED overlapped;
|
||||
IOCPEVENT event;
|
||||
std::shared_ptr<Socket> socket;
|
||||
std::uint32_t transferredbytes;
|
||||
WSABUF wsabuf;
|
||||
std::uint32_t bufsize;
|
||||
IOCP* IOCPInstance;
|
||||
#ifdef __linux__
|
||||
std::shared_ptr<std::queue<IOCPPASSINDATA*>> sendQueue;
|
||||
#endif
|
||||
|
||||
IOCPPASSINDATA(std::uint32_t bufsize) {
|
||||
std::memset(&overlapped, 0, sizeof(overlapped));
|
||||
event = IOCPEVENT::QUIT;
|
||||
socket = nullptr;
|
||||
transferredbytes = 0;
|
||||
this->bufsize = bufsize;
|
||||
IOCPInstance = nullptr;
|
||||
|
||||
wsabuf.buf = new char[bufsize];
|
||||
wsabuf.len = bufsize;
|
||||
}
|
||||
|
||||
/*IOCPPASSINDATA(const IOCPPASSINDATA& other) {
|
||||
if (this != &other) {
|
||||
std::memset(&overlapped, 0, sizeof(overlapped));
|
||||
event = other.event;
|
||||
socket = other.socket;
|
||||
ssl = other.ssl;
|
||||
transferredbytes = other.transferredbytes;
|
||||
bufsize = other.bufsize;
|
||||
IOCPInstance = other.IOCPInstance;
|
||||
#ifdef __linux__
|
||||
sendQueue = other.sendQueue;
|
||||
#endif
|
||||
wsabuf.buf = new char[other.bufsize];
|
||||
wsabuf.len = other.bufsize;
|
||||
std::memcpy(wsabuf.buf, other.wsabuf.buf, other.wsabuf.len);
|
||||
}
|
||||
}*/
|
||||
|
||||
~IOCPPASSINDATA() {
|
||||
if (wsabuf.buf != nullptr) delete[] wsabuf.buf;
|
||||
wsabuf.buf = nullptr;
|
||||
}
|
||||
|
||||
/*IOCPPASSINDATA& operator=(const IOCPPASSINDATA& other) {
|
||||
if (this != &other) {
|
||||
std::memset(&overlapped, 0, sizeof(overlapped));
|
||||
event = other.event;
|
||||
socket = other.socket;
|
||||
ssl = other.ssl;
|
||||
transferredbytes = other.transferredbytes;
|
||||
bufsize = other.bufsize;
|
||||
IOCPInstance = other.IOCPInstance;
|
||||
#ifdef __linux__
|
||||
sendQueue = other.sendQueue;
|
||||
#endif
|
||||
if (wsabuf.buf != nullptr) delete[] wsabuf.buf;
|
||||
wsabuf.buf = new char[other.bufsize];
|
||||
wsabuf.len = other.bufsize;
|
||||
std::memcpy(wsabuf.buf, other.wsabuf.buf, other.wsabuf.len);
|
||||
}
|
||||
return *this;
|
||||
}*/
|
||||
|
||||
IOCPPASSINDATA(const IOCPPASSINDATA& other) = delete;
|
||||
IOCPPASSINDATA& operator=(const IOCPPASSINDATA&) = delete;
|
||||
};
|
||||
std::list<char> DEFAULT_RECVALL_CALLBACK(utils::ThreadPool* th,
|
||||
IOCPPASSINDATA* data);
|
||||
|
||||
class IOCP {
|
||||
public:
|
||||
@@ -108,15 +38,26 @@ class IOCP {
|
||||
|
||||
void destruct();
|
||||
|
||||
void registerTCPSocket(Socket& sock, std::uint32_t bufsize);
|
||||
void registerUDPSocket(IOCPPASSINDATA* data, Address recv_addr);
|
||||
void registerSocket(std::shared_ptr<Socket> sock);
|
||||
|
||||
int recv(Socket& sock, std::vector<char>& data);
|
||||
std::future<std::vector<char>> recvFull(
|
||||
std::shared_ptr<Socket> sock, std::uint32_t bufsize);
|
||||
|
||||
std::future<std::list<char>> recv(
|
||||
std::shared_ptr<Socket> sock, std::uint32_t bufsize,
|
||||
std::function<std::list<char>(utils::ThreadPool*, IOCPPASSINDATA*)>
|
||||
callback = DEFAULT_RECVALL_CALLBACK);
|
||||
// data는 한 가지 소켓에 보내는 패킷만 담아야 합니다
|
||||
int send(Socket& sock, std::vector<char>& data);
|
||||
int send(std::shared_ptr<Socket> sock, std::vector<char>& data);
|
||||
|
||||
int GetRecvedBytes(SOCKET sock);
|
||||
|
||||
std::shared_ptr<std::list<IOCPPASSINDATA*>> GetSendQueue(SOCKET sock);
|
||||
std::shared_ptr<std::list<std::pair<std::vector<char>, std::uint32_t>>>
|
||||
GetRecvQueue(SOCKET sock);
|
||||
std::shared_ptr<std::mutex> GetSendQueueMutex(SOCKET sock);
|
||||
std::shared_ptr<std::mutex> GetRecvQueueMutex(SOCKET sock);
|
||||
|
||||
private:
|
||||
#ifdef _WIN32
|
||||
void iocpWatcher_(utils::ThreadPool* IOCPThread);
|
||||
@@ -124,12 +65,6 @@ class IOCP {
|
||||
|
||||
#endif
|
||||
|
||||
std::shared_ptr<std::list<IOCPPASSINDATA*>> GetSendQueue_(SOCKET sock);
|
||||
std::shared_ptr<std::list<std::pair<std::vector<char>, std::uint32_t>>>
|
||||
GetRecvQueue_(SOCKET sock);
|
||||
std::shared_ptr<std::mutex> GetSendQueueMutex_(SOCKET sock);
|
||||
std::shared_ptr<std::mutex> GetRecvQueueMutex_(SOCKET sock);
|
||||
|
||||
void packet_sender_(SOCKET sock);
|
||||
utils::ThreadPool* IOCPThread_;
|
||||
|
||||
@@ -182,4 +117,56 @@ class IOCP {
|
||||
#endif
|
||||
};
|
||||
|
||||
enum class IOCPEVENT { QUIT, READ, WRITE };
|
||||
|
||||
struct IOCPPASSINDATA {
|
||||
OVERLAPPED overlapped;
|
||||
IOCPEVENT event;
|
||||
std::shared_ptr<Socket> socket;
|
||||
std::uint32_t transferredbytes;
|
||||
WSABUF wsabuf;
|
||||
IOCP* IOCPInstance;
|
||||
std::packaged_task<std::list<char>(utils::ThreadPool*, IOCPPASSINDATA*)>
|
||||
callback;
|
||||
#ifdef __linux__
|
||||
std::shared_ptr<std::queue<IOCPPASSINDATA*>> sendQueue;
|
||||
#endif
|
||||
IOCPPASSINDATA(std::shared_ptr<Socket> socket, std::uint32_t bufsize,
|
||||
IOCP* IOCPInstance)
|
||||
: event(IOCPEVENT::QUIT),
|
||||
socket(socket),
|
||||
transferredbytes(0),
|
||||
IOCPInstance(IOCPInstance) {
|
||||
std::memset(&overlapped, 0, sizeof(overlapped));
|
||||
|
||||
wsabuf.buf = new char[bufsize];
|
||||
wsabuf.len = bufsize;
|
||||
}
|
||||
|
||||
IOCPPASSINDATA(
|
||||
std::shared_ptr<Socket> socket, std::uint32_t bufsize, IOCP* IOCPInstance,
|
||||
std::packaged_task<std::list<char>(utils::ThreadPool*, IOCPPASSINDATA*)>
|
||||
callback_)
|
||||
: event(IOCPEVENT::QUIT),
|
||||
socket(socket),
|
||||
transferredbytes(0),
|
||||
IOCPInstance(IOCPInstance),
|
||||
callback(std::move(callback_)) {
|
||||
std::memset(&overlapped, 0, sizeof(overlapped));
|
||||
|
||||
wsabuf.buf = new char[bufsize];
|
||||
wsabuf.len = bufsize;
|
||||
}
|
||||
|
||||
~IOCPPASSINDATA() {
|
||||
if (wsabuf.buf != nullptr) delete[] wsabuf.buf;
|
||||
wsabuf.buf = nullptr;
|
||||
}
|
||||
|
||||
IOCPPASSINDATA(const IOCPPASSINDATA& other) = delete;
|
||||
IOCPPASSINDATA& operator=(const IOCPPASSINDATA&) = delete;
|
||||
IOCPPASSINDATA(IOCPPASSINDATA&&) = default;
|
||||
IOCPPASSINDATA& operator=(IOCPPASSINDATA&&) = default;
|
||||
};
|
||||
|
||||
} // namespace Network
|
||||
|
||||
@@ -16,18 +16,21 @@ enum class Opcode : std::uint16_t {
|
||||
|
||||
struct Header {
|
||||
Opcode opcode;
|
||||
double timestamp;
|
||||
std::uint32_t body_length;
|
||||
|
||||
std::vector<char> Serialize() {
|
||||
std::vector<char> serialize(6);
|
||||
std::vector<char> serialize(14);
|
||||
::memcpy(serialize.data(), &opcode, 2);
|
||||
::memcpy(serialize.data() + 2, &body_length, 4);
|
||||
::memcpy(serialize.data() + 2, ×tamp, 8);
|
||||
::memcpy(serialize.data() + 10, &body_length, 4);
|
||||
return serialize;
|
||||
}
|
||||
|
||||
void Deserialize(std::vector<char>& data) {
|
||||
::memcpy(&opcode, data.data(), 2);
|
||||
::memcpy(&body_length, data.data() + 2, 4);
|
||||
::memcpy(×tamp, data.data() + 2, 8);
|
||||
::memcpy(&body_length, data.data() + 10, 4);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -26,8 +26,9 @@ class Socket {
|
||||
int sendto(const void* __buf, size_t __n, int __flags, struct Address __addr);
|
||||
|
||||
Socket(const Socket&);
|
||||
Socket(Socket&&) noexcept;
|
||||
Socket& operator=(const Socket&);
|
||||
|
||||
Socket(Socket&&) noexcept;
|
||||
Socket& operator=(Socket&&) noexcept;
|
||||
|
||||
struct Address bindAddr = {};
|
||||
|
||||
@@ -9,8 +9,7 @@ class TCPSocket : public Socket {
|
||||
using Socket::Socket;
|
||||
int init(int domain);
|
||||
int listen(int __n);
|
||||
void accept(TCPSocket& newSock, Address& addr);
|
||||
int connect(Network::Address& serveraddr);
|
||||
void accept(std::shared_ptr<TCPSocket>& newSock, Address& addr);
|
||||
int recv(void* __restrict __buf, size_t __n, int __flags);
|
||||
int send(const void* __buf, size_t __n, int __flags);
|
||||
};
|
||||
|
||||
@@ -18,14 +18,13 @@ struct Snowflake {
|
||||
}
|
||||
|
||||
std::vector<char> Serialize() {
|
||||
std::vector<char> serialized;
|
||||
serialized.insert(serialized.end(), &snowflake,
|
||||
&snowflake + sizeof(snowflake));
|
||||
std::vector<char> serialized(8);
|
||||
::memcpy(serialized.data(), &snowflake, 8);
|
||||
return serialized;
|
||||
}
|
||||
};
|
||||
|
||||
Snowflake GenerateID(std::uint16_t instance);
|
||||
Snowflake GenerateID(std::uint8_t instance);
|
||||
|
||||
} // namespace Chattr
|
||||
|
||||
|
||||
9
include/utils/utils.h
Normal file
9
include/utils/utils.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
#include <list>
|
||||
#include <vector>
|
||||
|
||||
namespace utils {
|
||||
|
||||
std::vector<char> CvtListToVector(std::list<char> data);
|
||||
|
||||
} // namespace std
|
||||
@@ -5,20 +5,25 @@
|
||||
#include <vector>
|
||||
|
||||
#include "material.h"
|
||||
#include "utils/snowflake.h"
|
||||
#include "vulkan_engine/vulkan/buffer_handle.h"
|
||||
#include "vulkan_engine/vulkan/vertex.h"
|
||||
#include "utils/snowflake.h"
|
||||
|
||||
extern std::uint8_t CLIENTID;
|
||||
|
||||
namespace veng {
|
||||
struct Model {
|
||||
Model() : graphics_(nullptr) {}
|
||||
Model(class Graphics* graphics) : graphics_(graphics) {}
|
||||
Model() : ID(utils::GenerateID(CLIENTID)), graphics_(nullptr) {
|
||||
}
|
||||
Model(class Graphics* graphics)
|
||||
: ID(utils::GenerateID(CLIENTID)), graphics_(graphics) {
|
||||
}
|
||||
~Model();
|
||||
|
||||
Model(const Model& other)
|
||||
: asset_name(other.asset_name),
|
||||
: ID(utils::GenerateID(CLIENTID)),
|
||||
name(/*"_" + */other.name),
|
||||
asset_name(other.asset_name),
|
||||
vertices(other.vertices),
|
||||
vertex_buffer(other.vertex_buffer),
|
||||
indices(other.indices),
|
||||
@@ -39,14 +44,14 @@ struct Model {
|
||||
OnColision(other.OnColision),
|
||||
visible(other.visible),
|
||||
colision(other.colision),
|
||||
networkReplicated(other.networkReplicated) {
|
||||
name = "_" + other.name;
|
||||
ID = utils::GenerateID(CLIENTID);
|
||||
networkReplicated(other.networkReplicated),
|
||||
lastUpdatedTime(other.lastUpdatedTime) {
|
||||
graphics_ = nullptr;
|
||||
}
|
||||
|
||||
Model(Model&& other)
|
||||
: name(other.name),
|
||||
: ID(other.ID),
|
||||
name(other.name),
|
||||
asset_name(other.asset_name),
|
||||
vertices(std::move(other.vertices)),
|
||||
vertex_buffer(std::move(other.vertex_buffer)),
|
||||
@@ -68,9 +73,8 @@ struct Model {
|
||||
OnColision(other.OnColision),
|
||||
visible(other.visible),
|
||||
colision(other.colision),
|
||||
networkReplicated(other.networkReplicated)
|
||||
{
|
||||
ID = other.ID;
|
||||
networkReplicated(other.networkReplicated),
|
||||
lastUpdatedTime(other.lastUpdatedTime) {
|
||||
::memset(&other.ID, 0, 8);
|
||||
|
||||
graphics_ = other.graphics_;
|
||||
@@ -104,6 +108,7 @@ struct Model {
|
||||
visible = other.visible;
|
||||
colision = other.colision;
|
||||
networkReplicated = other.networkReplicated;
|
||||
lastUpdatedTime = other.lastUpdatedTime;
|
||||
|
||||
graphics_ = other.graphics_;
|
||||
other.graphics_ = nullptr;
|
||||
@@ -141,13 +146,14 @@ struct Model {
|
||||
|
||||
glm::vec3 original_offset = glm::vec3(0.f);
|
||||
|
||||
Model* owner = this;
|
||||
std::weak_ptr<Model> owner;
|
||||
|
||||
std::float_t radius = 0.f;
|
||||
|
||||
std::float_t lifespan = -1.f;
|
||||
|
||||
std::function<void(Model* self, Model* other)> OnColision = nullptr;
|
||||
std::function<void(std::shared_ptr<Model> self, std::shared_ptr<Model> other)>
|
||||
OnColision = nullptr;
|
||||
|
||||
bool visible = true;
|
||||
bool colision = false;
|
||||
@@ -156,6 +162,10 @@ struct Model {
|
||||
|
||||
bool needsUpdate = true;
|
||||
|
||||
double lastUpdatedTime = 0.f; // 서버 기준 업데이트된 시간임
|
||||
|
||||
std::mutex modding;
|
||||
|
||||
private:
|
||||
class Graphics* graphics_;
|
||||
};
|
||||
|
||||
@@ -20,9 +20,9 @@ class Engine {
|
||||
const Model* GetStaticModel(std::string name);
|
||||
|
||||
// 수명을 무제한으로 놓고 싶으면 lifespan을 -1으로 설정하면 됨
|
||||
Model* SpawnLifedModel(std::string asset_name, std::string name,
|
||||
std::shared_ptr<Model> SpawnLifedModel(std::string asset_name, std::string name,
|
||||
std::float_t lifespan);
|
||||
Model* GetSpawnedObject(std::string name);
|
||||
std::shared_ptr<Model> GetSpawnedObject(std::string name);
|
||||
|
||||
void Update();
|
||||
void NetUpdate(std::shared_ptr<Network::Socket> sock);
|
||||
@@ -53,7 +53,7 @@ class Engine {
|
||||
|
||||
std::unordered_map<std::string, veng::Model> model_assets_;
|
||||
|
||||
std::unordered_map<std::string, veng::Model> models_;
|
||||
std::unordered_map<std::string, std::shared_ptr<Model>> models_;
|
||||
};
|
||||
|
||||
} // namespace veng
|
||||
|
||||
@@ -33,7 +33,7 @@ class Graphics final {
|
||||
void RenderBuffer(BufferHandle handle, std::uint32_t vertex_count);
|
||||
void RenderIndexedBuffer(BufferHandle vertex_buffer,
|
||||
BufferHandle index_buffer, std::uint32_t count);
|
||||
void RenderModel(struct Model* model);
|
||||
void RenderModel(std::shared_ptr<struct Model> model);
|
||||
void EndFrame();
|
||||
|
||||
BufferHandle CreateVertexBuffer(gsl::span<Vertex> vertices);
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
namespace veng {
|
||||
class Physics {
|
||||
public:
|
||||
void invokeOnColisionEvent(gsl::not_null<utils::ThreadPool *> thread_pool, gsl::span<Model*> models);
|
||||
void invokeOnColisionEvent(gsl::not_null<utils::ThreadPool*> thread_pool,
|
||||
std::vector<std::shared_ptr<Model>> models);
|
||||
|
||||
bool RayTrace(const glm::vec3& rayOrigin, const glm::vec3& rayDir,
|
||||
const glm::vec3& v0, const glm::vec3& v1, const glm::vec3& v2,
|
||||
|
||||
Reference in New Issue
Block a user