*
This commit is contained in:
@@ -35,7 +35,7 @@ struct VoxelVertexPoint {
|
|||||||
|
|
||||||
struct NodeVertexStatic {
|
struct NodeVertexStatic {
|
||||||
uint32_t
|
uint32_t
|
||||||
FX : 9, FY : 9, FZ : 9, // Позиция -15 -120 ~ 240 360 +15 / 16
|
FX : 9, FY : 9, FZ : 9, // Позиция -224 ~ 288; 64 позиций в одной ноде, 7.5 метров в ряд
|
||||||
N1 : 4, // Не занято
|
N1 : 4, // Не занято
|
||||||
LS : 1, // Масштаб карты освещения (1м/16 или 1м)
|
LS : 1, // Масштаб карты освещения (1м/16 или 1м)
|
||||||
Tex : 18, // Текстура
|
Tex : 18, // Текстура
|
||||||
|
|||||||
@@ -332,9 +332,9 @@ void ChunkMeshGenerator::run(uint8_t id) {
|
|||||||
|
|
||||||
// Рендерим обычный кубоид
|
// Рендерим обычный кубоид
|
||||||
if(!(fullCovered & 0b000100)) {
|
if(!(fullCovered & 0b000100)) {
|
||||||
v.FX = 135+x*16;
|
v.FX = 224+x*16;
|
||||||
v.FY = 135+y*16+16;
|
v.FY = 224+y*16+16;
|
||||||
v.FZ = 135+z*16+16;
|
v.FZ = 224+z*16+16;
|
||||||
v.TU = 0;
|
v.TU = 0;
|
||||||
v.TV = 0;
|
v.TV = 0;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
@@ -347,8 +347,8 @@ void ChunkMeshGenerator::run(uint8_t id) {
|
|||||||
v.TV = 65535;
|
v.TV = 65535;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
|
|
||||||
v.FX = 135+x*16;
|
v.FX = 224+x*16;
|
||||||
v.FZ = 135+z*16+16;
|
v.FZ = 224+z*16+16;
|
||||||
v.TU = 0;
|
v.TU = 0;
|
||||||
v.TV = 0;
|
v.TV = 0;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
@@ -365,9 +365,9 @@ void ChunkMeshGenerator::run(uint8_t id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!(fullCovered & 0b001000)) {
|
if(!(fullCovered & 0b001000)) {
|
||||||
v.FX = 135+x*16;
|
v.FX = 224+x*16;
|
||||||
v.FY = 135+y*16;
|
v.FY = 224+y*16;
|
||||||
v.FZ = 135+z*16+16;
|
v.FZ = 224+z*16+16;
|
||||||
v.TU = 0;
|
v.TU = 0;
|
||||||
v.TV = 0;
|
v.TV = 0;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
@@ -380,8 +380,8 @@ void ChunkMeshGenerator::run(uint8_t id) {
|
|||||||
v.TU = 65535;
|
v.TU = 65535;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
|
|
||||||
v.FX = 135+x*16;
|
v.FX = 224+x*16;
|
||||||
v.FZ = 135+z*16+16;
|
v.FZ = 224+z*16+16;
|
||||||
v.TU = 0;
|
v.TU = 0;
|
||||||
v.TV = 0;
|
v.TV = 0;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
@@ -398,9 +398,9 @@ void ChunkMeshGenerator::run(uint8_t id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!(fullCovered & 0b000001)) {
|
if(!(fullCovered & 0b000001)) {
|
||||||
v.FX = 135+x*16+16;
|
v.FX = 224+x*16+16;
|
||||||
v.FY = 135+y*16;
|
v.FY = 224+y*16;
|
||||||
v.FZ = 135+z*16+16;
|
v.FZ = 224+z*16+16;
|
||||||
v.TU = 0;
|
v.TU = 0;
|
||||||
v.TV = 0;
|
v.TV = 0;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
@@ -413,8 +413,8 @@ void ChunkMeshGenerator::run(uint8_t id) {
|
|||||||
v.TU = 65535;
|
v.TU = 65535;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
|
|
||||||
v.FY = 135+y*16;
|
v.FY = 224+y*16;
|
||||||
v.FZ = 135+z*16+16;
|
v.FZ = 224+z*16+16;
|
||||||
v.TU = 0;
|
v.TU = 0;
|
||||||
v.TV = 0;
|
v.TV = 0;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
@@ -431,9 +431,9 @@ void ChunkMeshGenerator::run(uint8_t id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!(fullCovered & 0b000010)) {
|
if(!(fullCovered & 0b000010)) {
|
||||||
v.FX = 135+x*16;
|
v.FX = 224+x*16;
|
||||||
v.FY = 135+y*16;
|
v.FY = 224+y*16;
|
||||||
v.FZ = 135+z*16+16;
|
v.FZ = 224+z*16+16;
|
||||||
v.TU = 0;
|
v.TU = 0;
|
||||||
v.TV = 0;
|
v.TV = 0;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
@@ -446,8 +446,8 @@ void ChunkMeshGenerator::run(uint8_t id) {
|
|||||||
v.TV = 65535;
|
v.TV = 65535;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
|
|
||||||
v.FY = 135+y*16;
|
v.FY = 224+y*16;
|
||||||
v.FZ = 135+z*16+16;
|
v.FZ = 224+z*16+16;
|
||||||
v.TU = 0;
|
v.TU = 0;
|
||||||
v.TV = 0;
|
v.TV = 0;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
@@ -464,9 +464,9 @@ void ChunkMeshGenerator::run(uint8_t id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!(fullCovered & 0b010000)) {
|
if(!(fullCovered & 0b010000)) {
|
||||||
v.FX = 135+x*16;
|
v.FX = 224+x*16;
|
||||||
v.FY = 135+y*16;
|
v.FY = 224+y*16;
|
||||||
v.FZ = 135+z*16+16;
|
v.FZ = 224+z*16+16;
|
||||||
v.TU = 0;
|
v.TU = 0;
|
||||||
v.TV = 0;
|
v.TV = 0;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
@@ -479,8 +479,8 @@ void ChunkMeshGenerator::run(uint8_t id) {
|
|||||||
v.TV = 65535;
|
v.TV = 65535;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
|
|
||||||
v.FX = 135+x*16;
|
v.FX = 224+x*16;
|
||||||
v.FY = 135+y*16;
|
v.FY = 224+y*16;
|
||||||
v.TU = 0;
|
v.TU = 0;
|
||||||
v.TV = 0;
|
v.TV = 0;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
@@ -497,9 +497,9 @@ void ChunkMeshGenerator::run(uint8_t id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!(fullCovered & 0b100000)) {
|
if(!(fullCovered & 0b100000)) {
|
||||||
v.FX = 135+x*16;
|
v.FX = 224+x*16;
|
||||||
v.FY = 135+y*16;
|
v.FY = 224+y*16;
|
||||||
v.FZ = 135+z*16;
|
v.FZ = 224+z*16;
|
||||||
v.TU = 0;
|
v.TU = 0;
|
||||||
v.TV = 0;
|
v.TV = 0;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
@@ -512,8 +512,8 @@ void ChunkMeshGenerator::run(uint8_t id) {
|
|||||||
v.TU = 65535;
|
v.TU = 65535;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
|
|
||||||
v.FX = 135+x*16;
|
v.FX = 224+x*16;
|
||||||
v.FY = 135+y*16;
|
v.FY = 224+y*16;
|
||||||
v.TU = 0;
|
v.TU = 0;
|
||||||
v.TV = 0;
|
v.TV = 0;
|
||||||
result.NodeVertexs.push_back(v);
|
result.NodeVertexs.push_back(v);
|
||||||
|
|||||||
@@ -53,6 +53,9 @@ struct WorldPCO {
|
|||||||
|
|
||||||
static_assert(sizeof(WorldPCO) == 128);
|
static_assert(sizeof(WorldPCO) == 128);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Хранит модели и предоставляет их конечные варианты
|
||||||
|
*/
|
||||||
class ModelProvider {
|
class ModelProvider {
|
||||||
struct Model {
|
struct Model {
|
||||||
// В вершинах текущей модели TexId ссылается на локальный текстурный ключ
|
// В вершинах текущей модели TexId ссылается на локальный текстурный ключ
|
||||||
@@ -77,28 +80,23 @@ class ModelProvider {
|
|||||||
std::vector<ResourceId> DownUse;
|
std::vector<ResourceId> DownUse;
|
||||||
// Для постройки зависимостей
|
// Для постройки зависимостей
|
||||||
bool Ready = false;
|
bool Ready = false;
|
||||||
|
|
||||||
// Если модель использовалась для рендера нод, то для неё надо переформировать вершины
|
|
||||||
// std::optional<std::vector<NodeVertexStatic>> NodeVertecies;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Предкомпилирует модель
|
// Предкомпилирует модель
|
||||||
Model getModel(ResourceId id) {
|
Model getModel(ResourceId id) {
|
||||||
auto lock = Models.lock();
|
|
||||||
std::vector<ResourceId> used;
|
std::vector<ResourceId> used;
|
||||||
return getModelSynced(*lock, id, used);
|
return getModel(id, used);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Применяет изменения, возвращая все затронутые модели
|
// Применяет изменения, возвращая все затронутые модели
|
||||||
std::vector<ResourceId> onModelChanges(std::vector<std::tuple<ResourceId, Resource>> newOrChanged, std::vector<ResourceId> lost) {
|
std::vector<AssetsModel> onModelChanges(std::vector<std::tuple<AssetsModel, Resource>> newOrChanged, std::vector<AssetsModel> lost) {
|
||||||
auto lock = Models.lock();
|
std::vector<AssetsModel> result;
|
||||||
std::vector<ResourceId> result;
|
|
||||||
|
|
||||||
std::move_only_function<void(ResourceId)> makeUnready;
|
std::move_only_function<void(ResourceId)> makeUnready;
|
||||||
makeUnready = [&](ResourceId id) {
|
makeUnready = [&](ResourceId id) {
|
||||||
auto iterModel = lock->find(id);
|
auto iterModel = Models.find(id);
|
||||||
if(iterModel == lock->end())
|
if(iterModel == Models.end())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(!iterModel->second.Ready)
|
if(!iterModel->second.Ready)
|
||||||
@@ -107,8 +105,8 @@ public:
|
|||||||
result.push_back(id);
|
result.push_back(id);
|
||||||
|
|
||||||
for(ResourceId downId : iterModel->second.DownUse) {
|
for(ResourceId downId : iterModel->second.DownUse) {
|
||||||
auto iterModel = lock->find(downId);
|
auto iterModel = Models.find(downId);
|
||||||
if(iterModel == lock->end())
|
if(iterModel == Models.end())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto iter = std::find(iterModel->second.UpUse.begin(), iterModel->second.UpUse.end(), id);
|
auto iter = std::find(iterModel->second.UpUse.begin(), iterModel->second.UpUse.end(), id);
|
||||||
@@ -130,11 +128,11 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(ResourceId lostId : lost) {
|
for(ResourceId lostId : lost) {
|
||||||
auto iterModel = lock->find(lostId);
|
auto iterModel = Models.find(lostId);
|
||||||
if(iterModel == lock->end())
|
if(iterModel == Models.end())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
lock->erase(iterModel);
|
Models.erase(iterModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(const auto& [key, resource] : newOrChanged) {
|
for(const auto& [key, resource] : newOrChanged) {
|
||||||
@@ -250,7 +248,7 @@ public:
|
|||||||
LOG.warn() << "Не удалось распарсить модель " << type << ":\n\t" << exc.what();
|
LOG.warn() << "Не удалось распарсить модель " << type << ":\n\t" << exc.what();
|
||||||
}
|
}
|
||||||
|
|
||||||
lock->insert({key, std::move(model)});
|
Models.insert({key, std::move(model)});
|
||||||
}
|
}
|
||||||
|
|
||||||
std::sort(result.begin(), result.end());
|
std::sort(result.begin(), result.end());
|
||||||
@@ -262,12 +260,12 @@ public:
|
|||||||
private:
|
private:
|
||||||
Logger LOG = "Client>ModelProvider";
|
Logger LOG = "Client>ModelProvider";
|
||||||
// Таблица моделей
|
// Таблица моделей
|
||||||
TOS::SpinlockObject<std::unordered_map<ResourceId, ModelObject>> Models;
|
std::unordered_map<ResourceId, ModelObject> Models;
|
||||||
uint64_t UniqId = 0;
|
uint64_t UniqId = 0;
|
||||||
|
|
||||||
Model getModelSynced(std::unordered_map<ResourceId, ModelObject>& models, ResourceId id, std::vector<ResourceId>& used) {
|
Model getModel(ResourceId id, std::vector<ResourceId>& used) {
|
||||||
auto iterModel = models.find(id);
|
auto iterModel = Models.find(id);
|
||||||
if(iterModel == models.end()) {
|
if(iterModel == Models.end()) {
|
||||||
// Нет такой модели, ну и хрен с ним
|
// Нет такой модели, ну и хрен с ним
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@@ -285,8 +283,8 @@ private:
|
|||||||
|
|
||||||
// Отмечаемся в зависимостях
|
// Отмечаемся в зависимостях
|
||||||
for(ResourceId subId : deps) {
|
for(ResourceId subId : deps) {
|
||||||
auto iterModel = models.find(subId);
|
auto iterModel = Models.find(subId);
|
||||||
if(iterModel == models.end())
|
if(iterModel == Models.end())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
iterModel->second.UpUse.push_back(id);
|
iterModel->second.UpUse.push_back(id);
|
||||||
@@ -305,7 +303,7 @@ private:
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Model model = getModelSynced(models, id, used);
|
Model model = getModel(id, used);
|
||||||
|
|
||||||
for(auto& [face, vertecies] : model.Vertecies)
|
for(auto& [face, vertecies] : model.Vertecies)
|
||||||
trans.apply(vertecies);
|
trans.apply(vertecies);
|
||||||
@@ -364,8 +362,45 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class ModelProviderForChunkMeshGeneretaor {
|
/*
|
||||||
|
Хранит информацию о моделях при различных состояниях нод
|
||||||
|
*/
|
||||||
|
class NodestateProvider {
|
||||||
public:
|
public:
|
||||||
|
struct Model {
|
||||||
|
// В вершинах текущей модели TexId ссылается на локальный текстурный ключ
|
||||||
|
// 0 -> default_texture -> luavox:grass.png
|
||||||
|
std::vector<std::string> TextureKeys;
|
||||||
|
// Привязка локальных ключей к глобальным
|
||||||
|
std::unordered_map<std::string, TexturePipeline> TextureMap;
|
||||||
|
// Вершины со всеми применёнными трансформациями, с CullFace
|
||||||
|
std::unordered_map<EnumFace, std::vector<NodeVertexStatic>> Vertecies;
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
NodestateProvider(ModelProvider& mp)
|
||||||
|
: MP(mp)
|
||||||
|
{}
|
||||||
|
|
||||||
|
// Применяет изменения, возвращает изменённые описания состояний
|
||||||
|
std::vector<AssetsNodestate> onNodestateChanges(std::vector<std::tuple<AssetsNodestate, Resource>> newOrChanged, std::vector<AssetsNodestate> lost, std::vector<AssetsModel> changedModels) {
|
||||||
|
std::vector<AssetsNodestate> result;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<Model> getModelsForNode(DefNodeId id, uint8_t meta) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Logger LOG = "Client>NodestateProvider";
|
||||||
|
ModelProvider& MP;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1844,7 +1844,7 @@ PreparedModel::PreparedModel(const std::u8string& data) {
|
|||||||
for(int iter = 0; iter < 3; iter++)
|
for(int iter = 0; iter < 3; iter++)
|
||||||
lr >> cuboid.To[iter];
|
lr >> cuboid.To[iter];
|
||||||
|
|
||||||
uint16_t facesSize;
|
uint8_t facesSize;
|
||||||
lr >> facesSize;
|
lr >> facesSize;
|
||||||
cuboid.Faces.reserve(facesSize);
|
cuboid.Faces.reserve(facesSize);
|
||||||
|
|
||||||
@@ -1867,7 +1867,7 @@ PreparedModel::PreparedModel(const std::u8string& data) {
|
|||||||
cuboid.Faces.insert({(EnumFace) type, face});
|
cuboid.Faces.insert({(EnumFace) type, face});
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t transformationsSize;
|
uint8_t transformationsSize;
|
||||||
lr >> transformationsSize;
|
lr >> transformationsSize;
|
||||||
cuboid.Trs.OPs.reserve(transformationsSize);
|
cuboid.Trs.OPs.reserve(transformationsSize);
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ layout(push_constant) uniform UniformBufferObject {
|
|||||||
|
|
||||||
// struct NodeVertexStatic {
|
// struct NodeVertexStatic {
|
||||||
// uint32_t
|
// uint32_t
|
||||||
// FX : 9, FY : 9, FZ : 9, // Позиция 15 -120 ~ 240 360 15 / 16
|
// FX : 9, FY : 9, FZ : 9, // Позиция -224 ~ 288; 64 позиций в одной ноде, 7.5 метров в ряд
|
||||||
// N1 : 4, // Не занято
|
// N1 : 4, // Не занято
|
||||||
// LS : 1, // Масштаб карты освещения (1м/16 или 1м)
|
// LS : 1, // Масштаб карты освещения (1м/16 или 1м)
|
||||||
// Tex : 18, // Текстура
|
// Tex : 18, // Текстура
|
||||||
@@ -27,9 +27,9 @@ layout(push_constant) uniform UniformBufferObject {
|
|||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
vec4 baseVec = ubo.model*vec4(
|
vec4 baseVec = ubo.model*vec4(
|
||||||
float(Vertex.x & 0x1ff) / 16.f - 135/16.f,
|
float(Vertex.x & 0x1ff) / 64.f - 3.5f,
|
||||||
float((Vertex.x >> 9) & 0x1ff) / 16.f - 135/16.f,
|
float((Vertex.x >> 9) & 0x1ff) / 64.f - 3.5f,
|
||||||
float((Vertex.x >> 18) & 0x1ff) / 16.f - 135/16.f,
|
float((Vertex.x >> 18) & 0x1ff) / 64.f - 3.5f,
|
||||||
1
|
1
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user