X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2FGenerator.cpp;fp=src%2Fworld%2FGenerator.cpp;h=88ac1eb674b0c24b5449f206694d0f70043145c4;hb=9240fdf2e68ee014da0d0a89a7fb2f29ebf28e2d;hp=f15a25245dc0d89413671fdcc3a4407c09e413b5;hpb=825f479edf9867938b6789215ad7ae6303596cba;p=blank.git diff --git a/src/world/Generator.cpp b/src/world/Generator.cpp index f15a252..88ac1eb 100644 --- a/src/world/Generator.cpp +++ b/src/world/Generator.cpp @@ -23,9 +23,10 @@ std::vector candidates; } -Generator::Generator(const Config &config, const BlockTypeRegistry &types) noexcept +Generator::Generator(const Config &config) noexcept : config(config) -, types(types) +, types() +, min_solidity(2.0f) , solidity_noise(config.seed ^ config.solidity.seed_mask) , humidity_noise(config.seed ^ config.humidity.seed_mask) , temperature_noise(config.seed ^ config.temperature.seed_mask) @@ -34,12 +35,18 @@ Generator::Generator(const Config &config, const BlockTypeRegistry &types) noexc } -void Generator::Scan() { - size_t count = 0; - for (size_t i = 0, end = types.Size(); i < end; ++i) { - if (types[i].generate) ++count; +void Generator::LoadTypes(const BlockTypeRegistry ®) { + types.clear(); + min_solidity = 2.0f; + for (const BlockType &type : reg) { + if (type.generate) { + types.push_back(&type); + if (type.min_solidity < min_solidity) { + min_solidity = type.min_solidity; + } + } } - candidates.reserve(count); + candidates.reserve(types.size()); } void Generator::operator ()(Chunk &chunk) const noexcept { @@ -53,30 +60,32 @@ void Generator::operator ()(Chunk &chunk) const noexcept { } } } + chunk.SetGenerated(); } Block Generator::Generate(const glm::vec3 &pos) const noexcept { float solidity = GetValue(solidity_noise, pos, config.solidity); + if (solidity < min_solidity) { + return Block(0); + } float humidity = GetValue(humidity_noise, pos, config.humidity); float temperature = GetValue(temperature_noise, pos, config.temperature); float richness = GetValue(richness_noise, pos, config.richness); candidates.clear(); float total = 0.0f; - for (size_t i = 0, end = types.Size(); i < end; ++i) { - const BlockType &type = types[i]; - if (!type.generate) continue; - if (solidity < type.min_solidity || solidity > type.max_solidity) continue; - if (humidity < type.min_humidity || humidity > type.max_humidity) continue; - if (temperature < type.min_temperature || temperature > type.max_temperature) continue; - if (richness < type.min_richness || richness > type.max_richness) continue; - float solidity_match = 4.0f - ((solidity - type.mid_solidity) * (solidity - type.mid_solidity)); - float humidity_match = 4.0f - ((humidity - type.mid_humidity) * (humidity - type.mid_humidity)); - float temperature_match = 4.0f - ((temperature - type.mid_temperature) * (temperature - type.mid_temperature)); - float richness_match = 4.0f - ((richness - type.mid_richness) * (richness - type.mid_richness)); - float chance = (solidity_match + humidity_match + temperature_match + richness_match) * type.commonness; + for (const BlockType *type : types) { + if (solidity < type->min_solidity || solidity > type->max_solidity) continue; + if (humidity < type->min_humidity || humidity > type->max_humidity) continue; + if (temperature < type->min_temperature || temperature > type->max_temperature) continue; + if (richness < type->min_richness || richness > type->max_richness) continue; + float solidity_match = 4.0f - ((solidity - type->mid_solidity) * (solidity - type->mid_solidity)); + float humidity_match = 4.0f - ((humidity - type->mid_humidity) * (humidity - type->mid_humidity)); + float temperature_match = 4.0f - ((temperature - type->mid_temperature) * (temperature - type->mid_temperature)); + float richness_match = 4.0f - ((richness - type->mid_richness) * (richness - type->mid_richness)); + float chance = (solidity_match + humidity_match + temperature_match + richness_match) * type->commonness; total += chance; - candidates.emplace_back(&type, total); + candidates.emplace_back(type, total); } if (candidates.empty()) { return Block(0);