Сначала надо сделать расчёт мешей в отдельном потоке

This commit is contained in:
2025-07-24 18:10:55 +06:00
parent bd31b57d7d
commit 67476f5908
3 changed files with 44 additions and 12 deletions

View File

@@ -85,10 +85,6 @@ struct World {
};
struct DefVoxelInfo {
};
struct DefWorldInfo {
};
@@ -153,7 +149,7 @@ public:
} Binary;
struct {
std::unordered_map<DefVoxelId_t, DefVoxelInfo> DefVoxel;
std::unordered_map<DefVoxelId_t, DefVoxel_t> DefVoxel;
std::unordered_map<DefNodeId_t, DefNode_t> DefNode;
std::unordered_map<DefWorldId_t, DefWorldInfo> DefWorld;
std::unordered_map<DefPortalId_t, DefPortalInfo> DefPortal;

View File

@@ -50,11 +50,21 @@ struct PP_Content_RegionRemove : public ParsedPacket {
{}
};
struct PP_Definition_FreeNode : public ParsedPacket {
DefNodeId_t Id;
struct PP_Definition_Voxel : public ParsedPacket {
DefVoxelId_t Id;
DefVoxel_t Def;
PP_Definition_FreeNode(DefNodeId_t id)
: ParsedPacket(ToClient::L1::Definition, (uint8_t) ToClient::L2Definition::Node),
PP_Definition_Voxel(DefVoxelId_t id, DefVoxel_t def)
: ParsedPacket(ToClient::L1::Definition, (uint8_t) ToClient::L2Definition::Voxel),
Id(id), Def(def)
{}
};
struct PP_Definition_FreeVoxel : public ParsedPacket {
DefVoxelId_t Id;
PP_Definition_FreeVoxel(DefVoxelId_t id)
: ParsedPacket(ToClient::L1::Definition, (uint8_t) ToClient::L2Definition::FreeVoxel),
Id(id)
{}
};
@@ -69,6 +79,15 @@ struct PP_Definition_Node : public ParsedPacket {
{}
};
struct PP_Definition_FreeNode : public ParsedPacket {
DefNodeId_t Id;
PP_Definition_FreeNode(DefNodeId_t id)
: ParsedPacket(ToClient::L1::Definition, (uint8_t) ToClient::L2Definition::FreeNode),
Id(id)
{}
};
struct PP_Resource_InitResSend : public ParsedPacket {
Hash_t Hash;
BinaryResource Resource;
@@ -327,16 +346,33 @@ void ServerSession::atFreeDrawTime(GlobalTime gTime, float dTime) {
} else if(pack->Level1 == ToClient::L1::Definition) {
ToClient::L2Definition l2 = ToClient::L2Definition(pack->Level2);
if(l2 == ToClient::L2Definition::Node) {
if(l2 == ToClient::L2Definition::Voxel) {
PP_Definition_Voxel &p = *dynamic_cast<PP_Definition_Voxel*>(pack);
Registry.DefVoxel[p.Id] = p.Def;
onContentDefinesAdd[EnumDefContent::Voxel].push_back(p.Id);
} else if(l2 == ToClient::L2Definition::FreeVoxel) {
PP_Definition_FreeVoxel &p = *dynamic_cast<PP_Definition_FreeVoxel*>(pack);
{
auto iter = Registry.DefVoxel.find(p.Id);
if(iter != Registry.DefVoxel.end())
Registry.DefVoxel.erase(iter);
}
onContentDefinesLost[EnumDefContent::Voxel].push_back(p.Id);
} else if(l2 == ToClient::L2Definition::Node) {
PP_Definition_Node &p = *dynamic_cast<PP_Definition_Node*>(pack);
Registry.DefNode[p.Id] = p.Def;
onContentDefinesAdd[EnumDefContent::Node].push_back(p.Id);
} else if(l2 == ToClient::L2Definition::FreeNode) {
PP_Definition_FreeNode &p = *dynamic_cast<PP_Definition_FreeNode*>(pack);
{
auto iter = Registry.DefNode.find(p.Id);
if(iter != Registry.DefNode.end())
Registry.DefNode.erase(iter);
}
onContentDefinesLost[EnumDefContent::Node].push_back(p.Id);
}
} else if(pack->Level1 == ToClient::L1::Content) {
ToClient::L2Content l2 = ToClient::L2Content(pack->Level2);
if(l2 == ToClient::L2Content::ChunkVoxels) {

View File

@@ -106,7 +106,7 @@ class VulkanRenderSession : public IRenderSession, public IVulkanDependent {
// Для отрисовки вокселей
std::shared_ptr<ShaderModule> VoxelShaderVertex, VoxelShaderGeometry, VoxelShaderFragmentOpaque, VoxelShaderFragmentTransparent;
VkPipeline
VkPipeline
VoxelOpaquePipeline = VK_NULL_HANDLE, // Альфа канал может быть либо 255, либо 0
VoxelTransparentPipeline = VK_NULL_HANDLE; // Допускается полупрозрачность и смешивание