아 화면 렌더링 안 되는건 memset으로 id복사하면서 버텍스 버퍼를 0으로 덮어써버리는게 원인이었음 그리고 현재 있는 버그는 너무 빠른 속도 또는 적당한 이동속도에서 총알을 많이 발사하면 카메라의 위치가 nan이 됨.

This commit is contained in:
2025-06-14 02:39:21 +09:00
parent 13ea246990
commit 93fda88d75
7 changed files with 168 additions and 141 deletions

View File

@@ -1,6 +1,7 @@
#include "vulkan_engine/vulkan/engine.h"
#include "precomp.h"
#include "socket/packet.h"
namespace veng {
@@ -39,23 +40,21 @@ Model* Engine::SpawnModel(std::string asset_name, std::string name) {
if (asset_name == "") {
Model model_to_spawn(nullptr);
model_to_spawn.visible = false;
dynamic_immortal_models_[name] = std::move(model_to_spawn);
return &dynamic_immortal_models_[name];
models_[name] = std::move(model_to_spawn);
return &models_[name];
}
if (dynamic_immortal_models_.find(name) == dynamic_immortal_models_.end()) {
if (models_.find(name) == models_.end()) {
Model model_to_spawn(*GetStaticModel(asset_name));
dynamic_immortal_models_[name] = std::move(model_to_spawn);
return &dynamic_immortal_models_[name];
models_[name] = std::move(model_to_spawn);
return &models_[name];
}
std::uint32_t i = 0;
for (i = 0; i < std::numeric_limits<std::uint32_t>::max();) {
if (dynamic_immortal_models_.find(name + std::to_string(i)) ==
dynamic_immortal_models_.end()) {
if (models_.find(name + std::to_string(i)) == models_.end()) {
Model model_to_spawn(*GetStaticModel(asset_name));
dynamic_immortal_models_[name + std::to_string(i)] =
std::move(model_to_spawn);
models_[name + std::to_string(i)] = std::move(model_to_spawn);
break;
}
i++;
@@ -64,7 +63,7 @@ Model* Engine::SpawnModel(std::string asset_name, std::string name) {
if (i == std::numeric_limits<std::uint32_t>::max() - 1)
return nullptr;
else
return &dynamic_immortal_models_[name + std::to_string(i)];
return &models_[name + std::to_string(i)];
}
Model* Engine::SpawnLifedModel(std::string asset_name, std::string name,
@@ -72,22 +71,24 @@ Model* Engine::SpawnLifedModel(std::string asset_name, std::string name,
if (asset_name == "") {
Model model_to_spawn(nullptr);
model_to_spawn.visible = false;
dynamic_models_[name] = std::make_pair(std::move(model_to_spawn), lifespan);
return &dynamic_models_[name].first;
model_to_spawn.lifespan = lifespan;
models_[name] = std::move(model_to_spawn);
return &models_[name];
}
if (dynamic_models_.find(name) == dynamic_models_.end()) {
if (models_.find(name) == models_.end()) {
Model model_to_spawn(*GetStaticModel(asset_name));
dynamic_models_[name] = std::make_pair(std::move(model_to_spawn), lifespan);
return &dynamic_models_[name].first;
model_to_spawn.lifespan = lifespan;
models_[name] = std::move(model_to_spawn);
return &models_[name];
}
std::uint32_t i = 0;
for (i = 0; i < std::numeric_limits<std::uint32_t>::max();) {
if (dynamic_models_.find(name + std::to_string(i)) ==
dynamic_models_.end()) {
if (models_.find(name + std::to_string(i)) == models_.end()) {
Model model_to_spawn(*GetStaticModel(asset_name));
dynamic_models_[name + std::to_string(i)] =
std::make_pair(std::move(model_to_spawn), lifespan);
model_to_spawn.lifespan = lifespan;
models_[name + std::to_string(i)] = std::move(model_to_spawn);
break;
}
i++;
@@ -96,21 +97,15 @@ Model* Engine::SpawnLifedModel(std::string asset_name, std::string name,
if (i == std::numeric_limits<std::uint32_t>::max() - 1)
return nullptr;
else
return &dynamic_models_[name + std::to_string(i)].first;
return &models_[name + std::to_string(i)];
}
Model* Engine::GetSpawnedObject(std::string name) {
for (auto it = dynamic_immortal_models_.begin();
it != dynamic_immortal_models_.end();) {
for (auto it = models_.begin(); it != models_.end();) {
if (it->first == name) return &it->second;
++it;
}
for (auto it = dynamic_models_.begin(); it != dynamic_models_.end();) {
if (it->first == name) return &it->second.first;
++it;
}
return nullptr;
}
@@ -140,46 +135,74 @@ void Engine::Update() {
if (Tick != nullptr) Tick(*this, delta_time);
std::vector<Model*> models;
models.reserve(dynamic_immortal_models_.size() +
dynamic_models_.size());
models.reserve(models_.size());
for (auto it = dynamic_immortal_models_.begin();
it != dynamic_immortal_models_.end();) {
models.push_back(&it->second);
for (auto it = models_.begin(); it != models_.end();) {
auto& model = it->second;
++it;
}
for (auto it = dynamic_models_.begin(); it != dynamic_models_.end();) {
if (it->second.second < 0.f) {
it = dynamic_models_.erase(it);
if (std::abs(model.lifespan + 1.f) <
std::numeric_limits<float>::epsilon()) {
models.push_back(&model);
++it;
continue;
}
else {
it->second.second -= delta_time;
}
models.push_back(&it->second.first);
if (model.lifespan <= 0.f) {
it = models_.erase(it);
continue;
}
model.lifespan -= delta_time;
models.push_back(&model);
++it;
}
for (auto it : models) {
it->Update(delta_time);
vulkan_graphics->RenderModel(it);
for (auto& it : models_) {
it.second.Update(delta_time);
vulkan_graphics->RenderModel(&it.second);
}
physics_controller_.invokeOnColisionEvent(thread_pool_, {models.data(), models.size()});
physics_controller_.invokeOnColisionEvent(thread_pool_,
{models.data(), models.size()});
vulkan_graphics->EndFrame();
}
}
void Engine::NetworkUpload() {
//TODO: 작성하기
void Engine::NetUpdate(std::shared_ptr<Network::Socket> sock) {
NetworkUpload(sock);
RefreshFromServer(sock);
}
void Engine::RefreshFromServer() {
// TODO: 작성하기
void Engine::NetworkUpload(std::shared_ptr<Network::Socket> sock) {
Packet::Header header;
header.opcode = Packet::Opcode::UPDATEMODEL;
header.body_length = 0;
std::vector<Network::IOCPPASSINDATA*> data;
Network::IOCPPASSINDATA* packet =
new Network::IOCPPASSINDATA(sizeof(Packet::Header));
packet->event = Network::IOCPEVENT::WRITE;
packet->socket = sock;
::memcpy(packet->wsabuf.buf, &header, sizeof(Packet::Header));
packet->wsabuf.len = sizeof(Packet::Header);
data.push_back(packet);
for (auto& it : models_) {
auto model = it.second.Serialize();
Network::IOCPPASSINDATA* packet = new Network::IOCPPASSINDATA(model.size());
packet->event = Network::IOCPEVENT::WRITE;
packet->socket = sock;
::memcpy(packet->wsabuf.buf, model.data(), model.size());
packet->wsabuf.len = model.size();
data.push_back(packet);
}
iocp_->send(sock->sock, &data);
}
void Engine::RefreshFromServer(std::shared_ptr<Network::Socket> sock) {
Network::IOCPPASSINDATA* recv_data = new Network::IOCPPASSINDATA(16 * 1024);
recv_data->socket = sock;
iocp_->recv(recv_data);
}
} // namespace veng