refactor: lake group detection and features rendering

This commit is contained in:
max 2022-07-23 19:53:03 +03:00
parent 4a15dc3243
commit 4b874246e3
10 changed files with 52 additions and 60 deletions

View file

@ -5,8 +5,6 @@ import {closeDialogs} from "dialogs/utils";
import {openDialog} from "dialogs";
import {initLayers, renderLayer, restoreLayers} from "layers";
// @ts-expect-error js module
import {drawCoastline} from "layers/renderers/drawCoastline";
// @ts-expect-error js module
import {drawScaleBar, Rulers} from "modules/measurers";
// @ts-expect-error js module
import {unfog} from "modules/ui/editors";
@ -63,7 +61,7 @@ async function generate(options?: IGenerationOptions) {
// temp rendering for debug
renderLayer("cells");
renderLayer("coastline", pack.vertices, pack.features);
renderLayer("features");
renderLayer("heightmap");
renderLayer("rivers", pack);

View file

@ -45,7 +45,7 @@ export const getClimateData = function (
return lakeData;
};
export const mergeLakeData = function (
export const mergeLakeDataToFeatures = function (
features: TPackFeatures,
lakeData: ILakeClimateData[],
rivers: Pick<IRiver, "i">[]
@ -57,11 +57,12 @@ export const mergeLakeData = function (
const lake = lakeData.find(lake => lake.i === feature.i);
if (!lake) return feature;
const {flux, temp, evaporation} = lake;
const {firstCell, height, flux, temp, evaporation} = lake;
const inlets = lake.inlets?.filter(inlet => rivers.find(river => river.i === inlet));
const outlet = rivers.find(river => river.i === lake.outlet)?.i;
const group = defineLakeGroup({firstCell, height, flux, temp, evaporation, inlets, outlet});
const lakeFeature: IPackFeatureLake = {...feature, flux, temp, evaporation, inlets, outlet};
const lakeFeature: IPackFeatureLake = {...feature, flux, temp, evaporation, inlets, outlet, group};
if (!inlets || !inlets.length) delete lakeFeature.inlets;
if (!outlet) delete lakeFeature.outlet;
@ -70,3 +71,33 @@ export const mergeLakeData = function (
return updatedFeatures as TPackFeatures;
};
function defineLakeGroup({
firstCell,
height,
flux,
temp,
evaporation,
inlets,
outlet
}: {
firstCell: number;
height: number;
flux: number;
temp: number;
evaporation: number;
inlets?: number[];
outlet?: number;
}): IPackFeatureLake["group"] {
if (temp < -3) return "frozen";
if (height > 60 && cells < 10 && firstCell % 10 === 0) return "lava";
if ((!inlets || !inlets.length) && !outlet) {
if (evaporation > flux * 4) return "dry";
if (cells < 3 && firstCell % 10 === 0) return "sinkhole";
}
if (!outlet && evaporation > flux) return "salt";
return "freshwater";
}

View file

@ -1,7 +1,5 @@
import * as d3 from "d3";
// @ts-expect-error js module
import {drawCoastline} from "layers/renderers/drawCoastline";
import {markupPackFeatures} from "modules/markup";
// @ts-expect-error js module
import {drawScaleBar} from "modules/measurers";
@ -22,17 +20,19 @@ const {LAND_COAST, WATER_COAST, DEEPER_WATER} = DISTANCE_FIELD;
export function createPack(grid: IGrid): IPack {
const {vertices, cells} = repackGrid(grid);
const markup = markupPackFeatures(grid, vertices, pick(cells, "v", "c", "b", "p", "h"));
const {features, featureIds, distanceField, haven, harbor} = markup;
const {features, featureIds, distanceField, haven, harbor} = markupPackFeatures(
grid,
vertices,
pick(cells, "v", "c", "b", "p", "h")
);
const {heights, flux, r, conf, rivers, mergedFeatures} = generateRivers(
grid.cells.prec,
grid.cells.temp,
pick({...cells, f: featureIds, t: distanceField, haven}, "i", "c", "b", "g", "t", "h", "f", "haven", "p"),
{...pick(cells, "i", "c", "b", "g", "h", "p"), f: featureIds, t: distanceField, haven},
features
);
// Lakes.defineGroup(newPack);
// Biomes.define(newPack, grid);
// const rankCellsData = pick(newPack.cells, "i", "f", "fl", "conf", "r", "h", "area", "biome", "haven", "harbor");

View file

@ -7,7 +7,7 @@ import {DISTANCE_FIELD, MAX_HEIGHT, MIN_LAND_HEIGHT} from "config/generation";
import {getInputNumber} from "utils/nodeUtils";
import {pick} from "utils/functionUtils";
import {byId} from "utils/shorthands";
import {mergeLakeData, getClimateData, ILakeClimateData} from "./lakes";
import {mergeLakeDataToFeatures, getClimateData, ILakeClimateData} from "./lakes";
import {drawArrow} from "utils/debugUtils";
const {Rivers} = window;
@ -44,7 +44,7 @@ export function generateRivers(
const {r, conf, rivers} = defineRivers();
const heights = downcutRivers(currentCellHeights);
const mergedFeatures = mergeLakeData(features, lakeData, rivers);
const mergedFeatures = mergeLakeDataToFeatures(features, lakeData, rivers);
TIME && console.timeEnd("generateRivers");