*
This commit is contained in:
@@ -392,16 +392,23 @@ public:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Model> getModelsForNode(DefNodeId id, uint8_t meta) {
|
struct StateInfo {
|
||||||
|
std::string Name;
|
||||||
|
std::vector<std::string> Variable;
|
||||||
|
int Variations = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Выдаёт модели в зависимости от состояний
|
||||||
|
// statesInfo - Описание состояний ноды
|
||||||
|
// states - Текущие значения состояний ноды
|
||||||
|
std::vector<Model> getModelsForNode(AssetsNodestate id, const std::vector<StateInfo>& statesInfo, const std::unordered_map<std::string, int>& states) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Logger LOG = "Client>NodestateProvider";
|
Logger LOG = "Client>NodestateProvider";
|
||||||
ModelProvider& MP;
|
ModelProvider& MP;
|
||||||
|
std::unordered_map<AssetsNodestate, PreparedNodeState> Nodestates;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -874,11 +874,11 @@ PreparedNodeState::PreparedNodeState(const std::u8string& data) {
|
|||||||
uint16_t size;
|
uint16_t size;
|
||||||
lr >> size;
|
lr >> size;
|
||||||
|
|
||||||
ModelToLocalId.reserve(size);
|
LocalToModel.reserve(size);
|
||||||
for(int counter = 0; counter < size; counter++) {
|
for(int counter = 0; counter < size; counter++) {
|
||||||
std::string domain, key;
|
AssetsModel modelId;
|
||||||
lr >> domain >> key;
|
lr >> modelId;
|
||||||
ModelToLocalId.emplace_back(std::move(domain), std::move(key));
|
LocalToModel.push_back(modelId);
|
||||||
}
|
}
|
||||||
|
|
||||||
lr >> size;
|
lr >> size;
|
||||||
@@ -989,14 +989,12 @@ std::u8string PreparedNodeState::dump() const {
|
|||||||
Net::Packet result;
|
Net::Packet result;
|
||||||
|
|
||||||
// ResourceToLocalId
|
// ResourceToLocalId
|
||||||
assert(ModelToLocalId.size() < (1 << 16));
|
assert(LocalToModelKD.size() < (1 << 16));
|
||||||
result << uint16_t(ModelToLocalId.size());
|
assert(LocalToModelKD.size() == LocalToModel.size());
|
||||||
|
result << uint16_t(LocalToModel.size());
|
||||||
|
|
||||||
for(const auto& [domain, key] : ModelToLocalId) {
|
for(AssetsModel modelId : LocalToModel) {
|
||||||
assert(domain.size() < 32);
|
result << modelId;
|
||||||
result << domain;
|
|
||||||
assert(key.size() < 32);
|
|
||||||
result << key;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nodes
|
// Nodes
|
||||||
@@ -1448,15 +1446,15 @@ std::pair<float, std::variant<PreparedNodeState::Model, PreparedNodeState::Vecto
|
|||||||
auto [domain, key] = parseDomainKey((std::string) *model_key, modid);
|
auto [domain, key] = parseDomainKey((std::string) *model_key, modid);
|
||||||
|
|
||||||
uint16_t resId = 0;
|
uint16_t resId = 0;
|
||||||
for(auto& [lDomain, lKey] : ModelToLocalId) {
|
for(auto& [lDomain, lKey] : LocalToModelKD) {
|
||||||
if(lDomain == domain && lKey == key)
|
if(lDomain == domain && lKey == key)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
resId++;
|
resId++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(resId == ModelToLocalId.size()) {
|
if(resId == LocalToModelKD.size()) {
|
||||||
ModelToLocalId.emplace_back(domain, key);
|
LocalToModelKD.emplace_back(domain, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
result.Id = resId;
|
result.Id = resId;
|
||||||
@@ -1483,15 +1481,15 @@ std::pair<float, std::variant<PreparedNodeState::Model, PreparedNodeState::Vecto
|
|||||||
auto [domain, key] = parseDomainKey((std::string) js_obj.at("model").as_string(), modid);
|
auto [domain, key] = parseDomainKey((std::string) js_obj.at("model").as_string(), modid);
|
||||||
|
|
||||||
uint16_t resId = 0;
|
uint16_t resId = 0;
|
||||||
for(auto& [lDomain, lKey] : ModelToLocalId) {
|
for(auto& [lDomain, lKey] : LocalToModelKD) {
|
||||||
if(lDomain == domain && lKey == key)
|
if(lDomain == domain && lKey == key)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
resId++;
|
resId++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(resId == ModelToLocalId.size()) {
|
if(resId == LocalToModelKD.size()) {
|
||||||
ModelToLocalId.emplace_back(domain, key);
|
LocalToModelKD.emplace_back(domain, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
subModel.Id = resId;
|
subModel.Id = resId;
|
||||||
|
|||||||
@@ -636,7 +636,9 @@ struct PreparedNodeState {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Локальный идентификатор в именной ресурс
|
// Локальный идентификатор в именной ресурс
|
||||||
std::vector<std::pair<std::string, std::string>> ModelToLocalId;
|
std::vector<std::pair<std::string, std::string>> LocalToModelKD;
|
||||||
|
// Локальный идентификатор в глобальный идентификатор
|
||||||
|
std::vector<AssetsModel> LocalToModel;
|
||||||
// Ноды выражений
|
// Ноды выражений
|
||||||
std::vector<Node> Nodes;
|
std::vector<Node> Nodes;
|
||||||
// Условия -> вариации модели + веса
|
// Условия -> вариации модели + веса
|
||||||
|
|||||||
@@ -77,10 +77,7 @@ void AssetsManager::loadResourceFromFile_Nodestate(ResourceChangeObj& out, const
|
|||||||
Resource res(path);
|
Resource res(path);
|
||||||
js::object obj = js::parse(std::string_view((const char*) res.data(), res.size())).as_object();
|
js::object obj = js::parse(std::string_view((const char*) res.data(), res.size())).as_object();
|
||||||
PreparedNodeState pns(domain, obj);
|
PreparedNodeState pns(domain, obj);
|
||||||
std::u8string data = pns.dump();
|
out.NewOrChange_Nodestates[domain].emplace_back(key, std::move(pns), fs::last_write_time(path));
|
||||||
Resource result((const uint8_t*) data.data(), data.size());
|
|
||||||
out.Nodestates[domain].emplace_back(key, std::move(pns));
|
|
||||||
out.NewOrChange[(int) EnumAssets::Nodestate][domain].emplace_back(key, result, fs::last_write_time(path));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssetsManager::loadResourceFromFile_Particle(ResourceChangeObj& out, const std::string& domain, const std::string& key, fs::path path) const {
|
void AssetsManager::loadResourceFromFile_Particle(ResourceChangeObj& out, const std::string& domain, const std::string& key, fs::path path) const {
|
||||||
@@ -491,28 +488,33 @@ AssetsManager::Out_applyResourceChange AssetsManager::applyResourceChange(const
|
|||||||
std::set_difference(l.begin(), l.end(), noc.begin(), noc.end(), std::back_inserter(result.Lost[type]));
|
std::set_difference(l.begin(), l.end(), noc.begin(), noc.end(), std::back_inserter(result.Lost[type]));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!orr.Nodestates.empty())
|
// Приёмка новых/изменённых описаний состояний нод
|
||||||
|
if(!orr.NewOrChange_Nodestates.empty())
|
||||||
{
|
{
|
||||||
auto lock = LocalObj.lock();
|
auto lock = LocalObj.lock();
|
||||||
for(auto& [domain, table] : orr.Nodestates) {
|
for(auto& [domain, table] : orr.NewOrChange_Nodestates) {
|
||||||
for(auto& [key, value] : table) {
|
for(auto& [key, _nodestate, ftt] : table) {
|
||||||
ResourceId resId = lock->getId(EnumAssets::Nodestate, domain, key);
|
ResourceId resId = lock->getId(EnumAssets::Nodestate, domain, key);
|
||||||
|
std::optional<DataEntry>& data = lock->Table[(int) EnumAssets::Nodestate][resId / TableEntry<DataEntry>::ChunkSize]->Entries[resId % TableEntry<DataEntry>::ChunkSize];
|
||||||
|
PreparedNodeState nodestate = _nodestate;
|
||||||
|
|
||||||
std::vector<AssetsModel> models;
|
// Ресолвим модели
|
||||||
|
for(const auto& [lKey, lDomain] : nodestate.LocalToModelKD) {
|
||||||
for(auto& [domain2, key2] : value.ModelToLocalId) {
|
nodestate.LocalToModel.push_back(lock->getId(EnumAssets::Nodestate, lDomain, lKey));
|
||||||
models.push_back(lock->getId(EnumAssets::Model, domain2, key2));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
// Сдампим для отправки клиенту (Кеш в пролёте?)
|
||||||
std::sort(models.begin(), models.end());
|
Resource res(nodestate.dump());
|
||||||
auto iterErase = std::unique(models.begin(), models.end());
|
|
||||||
models.erase(iterErase, models.end());
|
// На оповещение
|
||||||
models.shrink_to_fit();
|
result.NewOrChange[(int) EnumAssets::Model].push_back({resId, res});
|
||||||
}
|
|
||||||
|
// Запись в таблице ресурсов
|
||||||
|
data.emplace(ftt, res, domain, key);
|
||||||
|
lock->HashToId[res.hash()] = {EnumAssets::Nodestate, resId};
|
||||||
|
|
||||||
lock->Table_NodeState[resId / TableEntry<DataEntry>::ChunkSize]
|
lock->Table_NodeState[resId / TableEntry<DataEntry>::ChunkSize]
|
||||||
->Entries[resId % TableEntry<DataEntry>::ChunkSize] = std::move(models);
|
->Entries[resId % TableEntry<DataEntry>::ChunkSize] = nodestate.LocalToModel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,12 +65,12 @@ public:
|
|||||||
std::unordered_map<std::string, std::vector<std::string>> Lost[(int) EnumAssets::MAX_ENUM];
|
std::unordered_map<std::string, std::vector<std::string>> Lost[(int) EnumAssets::MAX_ENUM];
|
||||||
// Домен и ключ ресурса
|
// Домен и ключ ресурса
|
||||||
std::unordered_map<std::string, std::vector<std::tuple<std::string, Resource, fs::file_time_type>>> NewOrChange[(int) EnumAssets::MAX_ENUM];
|
std::unordered_map<std::string, std::vector<std::tuple<std::string, Resource, fs::file_time_type>>> NewOrChange[(int) EnumAssets::MAX_ENUM];
|
||||||
|
std::unordered_map<std::string, std::vector<std::tuple<std::string, PreparedNodeState, fs::file_time_type>>> NewOrChange_Nodestates;
|
||||||
std::unordered_map<std::string, std::vector<std::tuple<std::string, std::variant<
|
std::unordered_map<std::string, std::vector<std::tuple<std::string, std::variant<
|
||||||
LV::PreparedModel,
|
LV::PreparedModel,
|
||||||
PreparedGLTF
|
PreparedGLTF
|
||||||
>, fs::file_time_type>>> NewOrChange_Models;
|
>, fs::file_time_type>>> NewOrChange_Models;
|
||||||
|
|
||||||
std::unordered_map<std::string, std::vector<std::pair<std::string, PreparedNodeState>>> Nodestates;
|
|
||||||
// std::unordered_map<std::string, std::vector<std::pair<std::string, PreparedModel>>> Models;
|
// std::unordered_map<std::string, std::vector<std::pair<std::string, PreparedModel>>> Models;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user