Состояния нод на стороне сервера
This commit is contained in:
@@ -873,11 +873,11 @@ PreparedNodeState::PreparedNodeState(const std::u8string& data) {
|
||||
uint16_t size;
|
||||
lr >> size;
|
||||
|
||||
ResourceToLocalId.reserve(size);
|
||||
ModelToLocalId.reserve(size);
|
||||
for(int counter = 0; counter < size; counter++) {
|
||||
std::string domain, key;
|
||||
lr >> domain >> key;
|
||||
ResourceToLocalId.emplace_back(std::move(domain), std::move(key));
|
||||
ModelToLocalId.emplace_back(std::move(domain), std::move(key));
|
||||
}
|
||||
|
||||
lr >> size;
|
||||
@@ -987,10 +987,10 @@ std::u8string PreparedNodeState::dump() const {
|
||||
Net::Packet result;
|
||||
|
||||
// ResourceToLocalId
|
||||
assert(ResourceToLocalId.size() < (1 << 16));
|
||||
result << uint16_t(ResourceToLocalId.size());
|
||||
assert(ModelToLocalId.size() < (1 << 16));
|
||||
result << uint16_t(ModelToLocalId.size());
|
||||
|
||||
for(const auto& [domain, key] : ResourceToLocalId) {
|
||||
for(const auto& [domain, key] : ModelToLocalId) {
|
||||
assert(domain.size() < 32);
|
||||
result << domain;
|
||||
assert(key.size() < 32);
|
||||
@@ -1421,7 +1421,7 @@ uint16_t PreparedNodeState::parseCondition(const std::string_view expression) {
|
||||
}
|
||||
|
||||
std::pair<float, std::variant<PreparedNodeState::Model, PreparedNodeState::VectorModel>> PreparedNodeState::parseModel(const std::string_view modid, const js::object& obj) {
|
||||
// ResourceToLocalId
|
||||
// ModelToLocalId
|
||||
|
||||
bool uvlock;
|
||||
float weight = 1;
|
||||
@@ -1449,15 +1449,15 @@ std::pair<float, std::variant<PreparedNodeState::Model, PreparedNodeState::Vecto
|
||||
auto [domain, key] = parseDomainKey((std::string) *model_key, modid);
|
||||
|
||||
uint16_t resId = 0;
|
||||
for(auto& [lDomain, lKey] : ResourceToLocalId) {
|
||||
for(auto& [lDomain, lKey] : ModelToLocalId) {
|
||||
if(lDomain == domain && lKey == key)
|
||||
break;
|
||||
|
||||
resId++;
|
||||
}
|
||||
|
||||
if(resId == ResourceToLocalId.size()) {
|
||||
ResourceToLocalId.emplace_back(domain, key);
|
||||
if(resId == ModelToLocalId.size()) {
|
||||
ModelToLocalId.emplace_back(domain, key);
|
||||
}
|
||||
|
||||
result.Id = resId;
|
||||
@@ -1484,15 +1484,15 @@ std::pair<float, std::variant<PreparedNodeState::Model, PreparedNodeState::Vecto
|
||||
auto [domain, key] = parseDomainKey((std::string) js_obj.at("model").as_string(), modid);
|
||||
|
||||
uint16_t resId = 0;
|
||||
for(auto& [lDomain, lKey] : ResourceToLocalId) {
|
||||
for(auto& [lDomain, lKey] : ModelToLocalId) {
|
||||
if(lDomain == domain && lKey == key)
|
||||
break;
|
||||
|
||||
resId++;
|
||||
}
|
||||
|
||||
if(resId == ResourceToLocalId.size()) {
|
||||
ResourceToLocalId.emplace_back(domain, key);
|
||||
if(resId == ModelToLocalId.size()) {
|
||||
ModelToLocalId.emplace_back(domain, key);
|
||||
}
|
||||
|
||||
subModel.Id = resId;
|
||||
@@ -1598,8 +1598,7 @@ PreparedModel::PreparedModel(const std::string_view modid, const js::object& pro
|
||||
const js::object& textures = textures_val->as_object();
|
||||
|
||||
for(const auto& [key, value] : textures) {
|
||||
auto [domain, key2] = parseDomainKey((const std::string) value.as_string(), modid);
|
||||
Textures[key] = {domain, key2};
|
||||
Textures[key] = value.as_string();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1807,9 +1806,9 @@ PreparedModel::PreparedModel(const std::u8string& data) {
|
||||
lr >> size;
|
||||
Textures.reserve(size);
|
||||
for(int counter = 0; counter < size; counter++) {
|
||||
std::string tkey, domain, key;
|
||||
lr >> tkey >> domain >> key;
|
||||
Textures.insert({tkey, {std::move(domain), std::move(key)}});
|
||||
std::string tkey, pipeline;
|
||||
lr >> tkey >> pipeline;
|
||||
Textures.insert({tkey, pipeline});
|
||||
}
|
||||
|
||||
lr >> size;
|
||||
@@ -1916,11 +1915,8 @@ std::u8string PreparedModel::dump() const {
|
||||
assert(tkey.size() < 32);
|
||||
result << tkey;
|
||||
|
||||
assert(dk.first.size() < 32);
|
||||
result << dk.first;
|
||||
|
||||
assert(dk.second.size() < 32);
|
||||
result << dk.second;
|
||||
assert(dk.size() < 512);
|
||||
result << dk;
|
||||
}
|
||||
|
||||
assert(Cuboids.size() < (1 << 16));
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <glm/ext.hpp>
|
||||
#include <memory>
|
||||
#include <sol/forward.hpp>
|
||||
#include <string>
|
||||
#include <type_traits>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
@@ -494,13 +495,6 @@ void unCompressNodes(const std::u8string& compressed, Node* ptr);
|
||||
std::u8string compressLinear(const std::u8string& data);
|
||||
std::u8string unCompressLinear(const std::u8string& data);
|
||||
|
||||
enum struct TexturePipelineCMD : uint8_t {
|
||||
Texture, // Указание текстуры
|
||||
Combine, // Комбинирование
|
||||
|
||||
};
|
||||
|
||||
|
||||
struct NodestateEntry {
|
||||
std::string Name;
|
||||
int Variability = 0; // Количество возможный значений состояния
|
||||
@@ -551,7 +545,7 @@ struct PreparedNodeState {
|
||||
};
|
||||
|
||||
// Локальный идентификатор в именной ресурс
|
||||
std::vector<std::pair<std::string, std::string>> ResourceToLocalId;
|
||||
std::vector<std::pair<std::string, std::string>> ModelToLocalId;
|
||||
// Ноды выражений
|
||||
std::vector<Node> Nodes;
|
||||
// Условия -> вариации модели + веса
|
||||
@@ -578,6 +572,7 @@ struct PreparedNodeState {
|
||||
// Пишет в сжатый двоичный формат
|
||||
std::u8string dump() const;
|
||||
|
||||
// Если зависит от случайного распределения по миру
|
||||
bool hasVariability() const {
|
||||
return HasVariability;
|
||||
}
|
||||
@@ -609,7 +604,7 @@ struct PreparedModel {
|
||||
};
|
||||
|
||||
std::unordered_map<std::string, FullTransformation> Display;
|
||||
std::unordered_map<std::string, std::pair<std::string, std::string>> Textures;
|
||||
std::unordered_map<std::string, std::string> Textures;
|
||||
|
||||
struct Cuboid {
|
||||
bool Shade;
|
||||
@@ -670,9 +665,9 @@ private:
|
||||
bool load(const std::u8string& data) noexcept;
|
||||
};
|
||||
|
||||
struct TexturePipeline {
|
||||
std::vector<AssetsTexture> BinTextures;
|
||||
std::u8string Pipeline;
|
||||
enum struct TexturePipelineCMD : uint8_t {
|
||||
Texture, // Указание текстуры
|
||||
Combine, // Комбинирование
|
||||
};
|
||||
|
||||
using Hash_t = std::array<uint8_t, 32>;
|
||||
@@ -689,6 +684,30 @@ inline std::pair<std::string, std::string> parseDomainKey(const std::string& val
|
||||
}
|
||||
}
|
||||
|
||||
struct PrecompiledTexturePipeline {
|
||||
// Локальные идентификаторы пайплайна в домен+ключ
|
||||
std::vector<std::pair<std::string, std::string>> Assets;
|
||||
// Чистый код текстурных преобразований, локальные идентификаторы связаны с Assets
|
||||
std::u8string Pipeline;
|
||||
};
|
||||
|
||||
struct TexturePipeline {
|
||||
// Разыменованые идентификаторы
|
||||
std::vector<AssetsTexture> BinTextures;
|
||||
// Чистый код текстурных преобразований, локальные идентификаторы связаны с BinTextures
|
||||
std::u8string Pipeline;
|
||||
};
|
||||
|
||||
// Компилятор текстурных потоков
|
||||
inline PrecompiledTexturePipeline compileTexturePipeline(const std::string &cmd, const std::string_view defaultDomain = "core") {
|
||||
PrecompiledTexturePipeline result;
|
||||
|
||||
auto [domain, key] = parseDomainKey(cmd, defaultDomain);
|
||||
|
||||
result.Assets.emplace_back(domain, key);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
struct Resource {
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user