아 화면 렌더링 안 되는건 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

@@ -13,64 +13,85 @@ Model::~Model() {
}
template <typename T>
static void Append(std::vector<char>& dst, const T& data) {
const char* ptr = reinterpret_cast<const char*>(&data);
dst.insert(dst.end(), ptr, ptr + sizeof(T));
}
std::vector<char> Model::Serialize() {
std::vector<char> serialized;
Append(serialized, ID);
Append(serialized, transform);
Append(serialized, position);
Append(serialized, linear_velocity);
Append(serialized, linear_acceleration);
Append(serialized, rotation);
Append(serialized, angular_velocity);
Append(serialized, angular_acceleration);
Append(serialized, scale);
Append(serialized, original_offset);
Append(serialized, radius);
uint8_t vis = visible ? 1 : 0;
uint8_t col = colision ? 1 : 0;
Append(serialized, vis);
Append(serialized, col);
return serialized;
void Append(std::vector<char>& buffer, const T& value) {
const char* data = reinterpret_cast<const char*>(&value);
buffer.insert(buffer.end(), data, data + sizeof(T));
}
template <typename T>
static void Extract(const std::vector<char>& src, size_t& offset, T& out) {
std::memcpy(&out, src.data() + offset, sizeof(T));
void AppendVector(std::vector<char>& buffer, const std::vector<T>& vec) {
std::uint32_t size = static_cast<std::uint32_t>(vec.size());
Append(buffer, size);
buffer.insert(buffer.end(), reinterpret_cast<const char*>(vec.data()),
reinterpret_cast<const char*>(vec.data() + size));
}
template <typename T>
void Read(const std::vector<char>& buffer, size_t& offset, T& out) {
std::memcpy(&out, buffer.data() + offset, sizeof(T));
offset += sizeof(T);
}
template <typename T>
void ReadVector(const std::vector<char>& buffer, size_t& offset,
std::vector<T>& out) {
std::uint32_t size = 0;
Read(buffer, offset, size);
out.resize(size);
std::memcpy(out.data(), buffer.data() + offset, sizeof(T) * size);
offset += sizeof(T) * size;
}
std::vector<char> Model::Serialize() {
std::vector<char> buffer;
AppendVector(buffer, vertices);
AppendVector(buffer, indices);
Append(buffer, position);
Append(buffer, linear_velocity);
Append(buffer, linear_acceleration);
Append(buffer, rotation);
Append(buffer, angular_velocity);
Append(buffer, angular_acceleration);
Append(buffer, scale);
Append(buffer, transform);
Append(buffer, original_offset);
Append(buffer, radius);
Append(buffer, lifespan);
Append(buffer, visible);
Append(buffer, colision);
return buffer;
}
void Model::Deserialize(std::vector<char> data) {
size_t offset = 0;
Extract(data, offset, ID);
ReadVector(data, offset, vertices);
ReadVector(data, offset, indices);
Extract(data, offset, transform);
Extract(data, offset, position);
Extract(data, offset, linear_velocity);
Extract(data, offset, linear_acceleration);
Extract(data, offset, rotation);
Extract(data, offset, angular_velocity);
Extract(data, offset, angular_acceleration);
Extract(data, offset, scale);
Extract(data, offset, original_offset);
Read(data, offset, position);
Read(data, offset, linear_velocity);
Read(data, offset, linear_acceleration);
Extract(data, offset, radius);
Read(data, offset, rotation);
Read(data, offset, angular_velocity);
Read(data, offset, angular_acceleration);
uint8_t vis = 0, col = 0;
Extract(data, offset, vis);
Extract(data, offset, col);
visible = vis != 0;
colision = col != 0;
Read(data, offset, scale);
Read(data, offset, transform);
Read(data, offset, original_offset);
Read(data, offset, radius);
Read(data, offset, lifespan);
Read(data, offset, visible);
Read(data, offset, colision);
}
void veng::Model::Update(float dt) {