From 0fe482a1529eace1e31c8d7ba4fba7e6d6870576 Mon Sep 17 00:00:00 2001 From: TorgaW Date: Fri, 26 Apr 2024 15:51:07 +0300 Subject: [PATCH] terrain generation improvement --- .vscode/settings.json | 2 + .../world/world_terrain_atlas_overlay.ase | Bin 0 -> 6660 bytes .../world/world_terrain_atlas_overlay.png | Bin 0 -> 3089 bytes src/Game/AssetsLoader/AssetsLoader.js | 6 +- src/Game/Game.js | 9 ++- src/Game/Utils/Noise.utils.js | 41 +++++++++++++ .../TerrainGenerator/TerrainGenerator.js | 57 ++++++++++++++++++ .../TerrainPredefines/TerrainPredefines.js | 47 +++++++++++++++ src/Game/WorldGeneration/WorldGen.js | 48 +++++++++------ 9 files changed, 187 insertions(+), 23 deletions(-) create mode 100644 public/assets/images/world/world_terrain_atlas_overlay.ase create mode 100644 public/assets/images/world/world_terrain_atlas_overlay.png create mode 100644 src/Game/Utils/Noise.utils.js create mode 100644 src/Game/WorldGeneration/TerrainGenerator/TerrainGenerator.js create mode 100644 src/Game/WorldGeneration/TerrainPredefines/TerrainPredefines.js diff --git a/.vscode/settings.json b/.vscode/settings.json index b8f3e36..072f9b4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,6 +2,8 @@ "cSpell.words": [ "Alea", "amogus", + "DDFBM", + "DWFBM", "PIXI", "spritesheet" ] diff --git a/public/assets/images/world/world_terrain_atlas_overlay.ase b/public/assets/images/world/world_terrain_atlas_overlay.ase new file mode 100644 index 0000000000000000000000000000000000000000..3b3a9235a536e8c0d5e2df0aa40ecf130fb6350e GIT binary patch literal 6660 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 literal 0 HcmV?d00001 diff --git a/public/assets/images/world/world_terrain_atlas_overlay.png b/public/assets/images/world/world_terrain_atlas_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..4555e4a0f4e2c48d2e52c3967eab402aca8e1d0e GIT binary patch literal 3089 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 WQOMG6=s88>0|-46Sgnpr%s&7-I=LhO literal 0 HcmV?d00001 diff --git a/src/Game/AssetsLoader/AssetsLoader.js b/src/Game/AssetsLoader/AssetsLoader.js index 8d35864..8e2e5a3 100644 --- a/src/Game/AssetsLoader/AssetsLoader.js +++ b/src/Game/AssetsLoader/AssetsLoader.js @@ -4,7 +4,7 @@ import { loadPixelAsset } from "../Utils/Assets.utils"; export async function loadGameAssets() { UIAssetsLoaderInfoPipe.update((s)=>{ - s.totalToDownload = 5; + s.totalToDownload = 6; s.downloaded = 0; }); // await loadPixelAsset("assets/images/amogus.png"); @@ -43,6 +43,10 @@ export async function loadGameAssets() UIAssetsLoaderInfoPipe.update((s)=>{ s.downloaded += 1; }); + await loadPixelAsset("assets/images/world/world_terrain_atlas_overlay.png"); + UIAssetsLoaderInfoPipe.update((s)=>{ + s.downloaded += 1; + }); await loadPixelAsset("assets/images/selection.png"); UIAssetsLoaderInfoPipe.update((s)=>{ s.downloaded += 1; diff --git a/src/Game/Game.js b/src/Game/Game.js index 25910bd..97323c0 100644 --- a/src/Game/Game.js +++ b/src/Game/Game.js @@ -55,13 +55,18 @@ function setupInGameSelector() { let t = screenToWorldCoordinates(e.data.global.x, e.data.global.y); // let tChunk = getWorldChunkAt(t.x, t.y); // let tTerrainTile = tChunk.getFromChunk(t.x, t.y, ChunkStorageTypes.TYPE_TERRAIN); + let terrainTile = getTileAt(t.x, t.y, ChunkStorageTypes.TYPE_TERRAIN); + // console.log(terrainTile); + UISelectionInfo.update((s)=>{ + s.types = [terrainTile.props.type]; + }); t.x = BC_SPRITES_SETTINGS.defaultSize * BC_SPRITES_SETTINGS.scale * Math.floor(t.x / (BC_SPRITES_SETTINGS.defaultSize * BC_SPRITES_SETTINGS.scale)); t.y = BC_SPRITES_SETTINGS.defaultSize * BC_SPRITES_SETTINGS.scale * Math.floor(t.y / (BC_SPRITES_SETTINGS.defaultSize * BC_SPRITES_SETTINGS.scale)); - sprite0.position.set(t.x, t.y); + sprite0.position.set(t.x, t.y); }; - BC_VIEWPORT.onpointerdown = (e) => + BC_VIEWPORT.onclick = (e) => { let t = screenToWorldCoordinates(e.data.global.x, e.data.global.y); // console.log(getNavigationGridTile(t.x, t.y)); diff --git a/src/Game/Utils/Noise.utils.js b/src/Game/Utils/Noise.utils.js new file mode 100644 index 0000000..59b0324 --- /dev/null +++ b/src/Game/Utils/Noise.utils.js @@ -0,0 +1,41 @@ +import { Noise } from "noisejs"; +import { clampNumber } from "./Math.utils"; + +function _normalizeNoiseValue(value) +{ + return (value+1)*0.5; +} + +/** + * Fractal Brownian Motion + * @param {Noise} noiseRef + * @param {Number} octaves + * @param {Number} x + * @param {Number} y + */ +export function FBMSimplex2(noiseRef, octaves = 8, x, y) +{ + let value = 0; + let freq = 1.0; + let amplitude = 1.0; + for (let i = 0; i < octaves; i++) { + value += _normalizeNoiseValue(noiseRef.simplex2(x * freq, y * freq)) * amplitude; + amplitude *= 0.35; + freq *= 2.0; + } + return clampNumber(value, 0.0, 1.0); +} + +/** + * Domain Warping for FBM + * @param {Noise} noiseRef + * @param {Number} x + * @param {Number} y + * @param {Number} strength + * @param {Number} octaves + */ +export function DWFBMSimplex2(noiseRef, x, y, strength, octaves = 8) +{ + let q = [FBMSimplex2(noiseRef, octaves, x, y), FBMSimplex2(noiseRef, octaves, x + 5.2, y + 1.3)]; + return FBMSimplex2(noiseRef, octaves, x + q[0]*strength, y + q[1]*strength); +} \ No newline at end of file diff --git a/src/Game/WorldGeneration/TerrainGenerator/TerrainGenerator.js b/src/Game/WorldGeneration/TerrainGenerator/TerrainGenerator.js new file mode 100644 index 0000000..f791139 --- /dev/null +++ b/src/Game/WorldGeneration/TerrainGenerator/TerrainGenerator.js @@ -0,0 +1,57 @@ +import {Noise} from "noisejs"; +import { BC_CHUNKS_SETTINGS, PRNG } from "../../GlobalVariables/GlobalVariables"; +import { clampNumber } from "../../Utils/Math.utils"; +import { DWFBMSimplex2, FBMSimplex2 } from "../../Utils/Noise.utils"; + +/** + * Terrain generator + * + * cNoise 1:100 - continent type + * mNoise 1:20 - mountains + */ + +let cNoise = new Noise(Math.floor(PRNG() * 999999999999)); +let tNoise = new Noise(Math.floor(PRNG() * 999999999999)); + +export function genTerrain(xMin, xMax, yMin, yMax) +{ + /** + * @type {Array} + */ + let terrainResult = new Array(BC_CHUNKS_SETTINGS.width * BC_CHUNKS_SETTINGS.height); + let mainValue = 0; + let mountainsValue = 0; + let temperatureValue = 0; + + let ii = 0; + let jj = 0; + for (let i = xMin; i < xMax; i++) { + jj = 0; + for (let j = yMin; j < yMax; j++) { + mainValue = DWFBMSimplex2(cNoise, i / 1000.0, j / 1000.0, 3.0); + mainValue *= mainValue; + temperatureValue = DWFBMSimplex2(tNoise, i / 1000.0, j / 1000.0, 3.0); + // mainValue = Math.abs(temperatureValue - mainValue); + // if(temperatureValue > 0.5) + // { + mainValue *= DWFBMSimplex2(cNoise, i / 100, j / 100, 3.0); + // } + // mountainsValue = _normalizeNoiseValue(mNoise.simplex2(i / 200, j / 200)); + // mainValue += clampNumber(Math.pow(mountainsValue * 2, 5), 0.0, 1.0); + // mainValue = clampNumber(mainValue, 0.0, 0.99); + terrainResult[ii * BC_CHUNKS_SETTINGS.width + jj] = mainValue; + // //soil + // if(continentValue > 0.5) + // { + // terrainResult[ii * BC_CHUNKS_SETTINGS.width + jj] = continentValue; + // } + // else //water + // { + // terrainResult[ii * BC_CHUNKS_SETTINGS.width + jj] = continentValue * 0.3; + // } + jj++; + } + ii++; + } + return terrainResult; +} \ No newline at end of file diff --git a/src/Game/WorldGeneration/TerrainPredefines/TerrainPredefines.js b/src/Game/WorldGeneration/TerrainPredefines/TerrainPredefines.js new file mode 100644 index 0000000..75e7731 --- /dev/null +++ b/src/Game/WorldGeneration/TerrainPredefines/TerrainPredefines.js @@ -0,0 +1,47 @@ +import { Rectangle } from "../../../pixi/pixi.mjs"; + +class _type_TerrainTilesMapPreDefinition +{ + /** + * @type {Array} + */ + textureVariations; + /** + * @type {Number} + */ + textureVariationsNumber; + /** + * @type {Number} + */ + zIndex; +} + +/** + * @type {Array<_type_TerrainTilesMapPreDefinition>} + */ +export const TerrainTilesMapPreDefinition = { + //water + 0: { + textureVariations: [new Rectangle(1, 1, 32, 32)], + textureVariationsNumber: 1, + zIndex: 4, + }, + //sand + 1: { + textureVariations: [new Rectangle(1, 35, 32, 32), new Rectangle(35, 35, 32, 32), new Rectangle(69, 35, 32, 32), new Rectangle(103, 35, 32, 32)], + textureVariationsNumber: 4, + zIndex: 2, + }, + //grass + 2: { + textureVariations: [new Rectangle(1, 69, 32, 32), new Rectangle(35, 69, 32, 32), new Rectangle(69, 69, 32, 32)], + textureVariationsNumber: 3, + zIndex: 3, + }, + //stone + 3: { + textureVariations: [new Rectangle(1, 103, 32, 32)], + textureVariationsNumber: 1, + zIndex: 1, + }, +}; diff --git a/src/Game/WorldGeneration/WorldGen.js b/src/Game/WorldGeneration/WorldGen.js index 364ac33..002e01d 100644 --- a/src/Game/WorldGeneration/WorldGen.js +++ b/src/Game/WorldGeneration/WorldGen.js @@ -9,6 +9,8 @@ import { addGameObjectToGameState } from "../GameState/GameState"; import { VegetationTile, VegetationTileProps } from "./WorldObjects/VegetationTile/VegetationTile"; import { WorldChunksVisibilityUpdater } from "./WorldChunksVisibilityUpdater/WorldChunksVisibilityUpdater"; import { NavigationGridChunk, NavigationGridTile } from "../World/NavigationGrid/NavigationGrid"; +import { genTerrain } from "./TerrainGenerator/TerrainGenerator"; +import { TerrainTilesMapPreDefinition } from "./TerrainPredefines/TerrainPredefines"; /** * @type Map @@ -18,9 +20,9 @@ const WorldChunksStorage = new Map(); /* #### REWRITE PART START ####*/ const terrainSpriteList = { 0: { x: 20, y: 20 }, //water - 1: { x: 2, y: 20 }, //sand - 2: { x: 2, y: 2 }, //grass - 3: { x: 20, y: 2 }, //stone + 1: { x: 0, y: 20 }, //sand + 2: { x: 0, y: 0 }, //grass + 3: { x: 20, y: 0 }, //stone }; const terrainTypeList = { 0: "ter_water", //water @@ -29,7 +31,7 @@ const terrainTypeList = { 3: "ter_stone", //stone }; const terrainNavigationCostList = { - 0: 100000000000, //water + 0: 10, //water 1: 1.7, //sand 2: 1, //grass 3: 1.5, //stone @@ -147,8 +149,8 @@ let noise = new Noise(Math.floor(PRNG() * 188822321)); let noiseErosion = new Noise(Math.floor(PRNG() * 327749029)); let noiseBiomes = new Noise(Math.floor(PRNG() * 927472011)); -let terrainCue = new NumberCue([0, 1, 2, 3, 3], [0.0, 0.2, 0.25, 0.9, 1.0]); -let terrainTintCue = new NumberCue([0.9, 1, 1, 0.95, 0.9, 1, 0.93, 1], [0.0, 0.45, 0.45, 0.5, 0.5, 0.9, 0.9, 1.0]); +let terrainCue = new NumberCue([0, 1, 2, 3, 3], [0.0, 0.25, 0.5, 0.75, 1.1]); +let terrainTintCue = new NumberCue([0.9, 1, 1, 0.95, 0.9, 1, 0.93, 1], [0.0, 0.45, 0.45, 0.5, 0.5, 0.9, 0.9, 1.1]); /** * @@ -159,25 +161,30 @@ let terrainTintCue = new NumberCue([0.9, 1, 1, 0.95, 0.9, 1, 0.93, 1], [0.0, 0.4 export function fillWorldGenChunk(chunk, x, y) { let ii = 0; let jj = 0; + let terrainData = genTerrain(BC_CHUNKS_SETTINGS.width * x, BC_CHUNKS_SETTINGS.width * (x + 1), BC_CHUNKS_SETTINGS.height * y, BC_CHUNKS_SETTINGS.height * (y + 1)); + // console.log(terrainData); for (let i = BC_CHUNKS_SETTINGS.width * x; i < BC_CHUNKS_SETTINGS.width * (x + 1); i++) { jj = 0; for (let j = BC_CHUNKS_SETTINGS.height * y; j < BC_CHUNKS_SETTINGS.height * (y + 1); j++) { - let res = (noise.simplex2(i * 0.025, j * 0.025) + 1) / 2; - let resR = (noiseErosion.simplex2(i * 0.3, j * 0.3) + 1) / 2; - let resB = (noiseBiomes.simplex2(i * 0.01, j * 0.01) + 1) / 2; - if (resB > 0.7) { - res = clampNumber(res - resR / 4, 0.0, 0.99); - } - if (resB > 0.5 && res < 0.9 && res >= 0.5) { - res = clampNumber(res + resR / 4, 0.0, 0.99); - } + // let res = (noise.simplex2(i * 0.025, j * 0.025) + 1) / 2; + let res; + res = terrainData[ii * BC_CHUNKS_SETTINGS.width + jj]; + // let resR = (noiseErosion.simplex2(i * 0.3, j * 0.3) + 1) / 2; + // let resB = (noiseBiomes.simplex2(i * 0.01, j * 0.01) + 1) / 2; + // if (resB > 0.7) { + // res = clampNumber(res - resR / 4, 0.0, 0.99); + // } + // if (resB > 0.5 && res < 0.9 && res >= 0.5) { + // res = clampNumber(res + resR / 4, 0.0, 0.99); + // } let sTint = new RGBColor(255, 255, 255).multiplyByNumber(terrainTintCue.getValueAt(res)).toNumber(); res = Math.floor(terrainCue.getValueAt(res)); let terrainTile = new TerrainTile(false); - terrainTile.spriteSheetPath = "assets/images/world/world_terrain_atlas.png"; - terrainTile.frame = new Rectangle(terrainSpriteList[res].x, terrainSpriteList[res].y, 16, 16); + let tilePreDefines = TerrainTilesMapPreDefinition[res]; + terrainTile.spriteSheetPath = "assets/images/world/world_terrain_atlas_overlay.png"; + terrainTile.frame = tilePreDefines.textureVariations[Math.floor(PRNG() * (tilePreDefines.textureVariationsNumber - 1))]; terrainTile.props = new TerrainTileProps(terrainTypeList[res], res * 5, terrainNavigationCostList[res]); terrainTile.worldPosition = new Point2D( i * BC_TERRAIN_SETTINGS.scale * BC_TERRAIN_SETTINGS.tileSize, @@ -187,8 +194,9 @@ export function fillWorldGenChunk(chunk, x, y) { addGameObjectToGameState(terrainTile); terrainTile.drawObject.tint = sTint; - terrainTile.drawObject.zIndex = 1; - terrainTile.drawObject.position.set(16 * BC_SPRITES_SETTINGS.scale * ii, 16 * BC_SPRITES_SETTINGS.scale * jj); + terrainTile.drawObject.zIndex = 1 + tilePreDefines.zIndex; + // terrainTile.drawObject.pivot.set(BC_SPRITES_SETTINGS.defaultSize * 0.5, BC_SPRITES_SETTINGS.defaultSize * 0.5); + terrainTile.drawObject.position.set(16 * BC_SPRITES_SETTINGS.scale * (ii) - 8 * BC_SPRITES_SETTINGS.scale, 16 * BC_SPRITES_SETTINGS.scale * (jj) - 8 * BC_SPRITES_SETTINGS.scale); terrainTile.drawObject.scale.set(BC_SPRITES_SETTINGS.scale, BC_SPRITES_SETTINGS.scale); chunk.addToChunk(terrainTile, ChunkStorageTypes.TYPE_TERRAIN, ii + "_" + jj); @@ -218,7 +226,7 @@ export function fillWorldGenChunk(chunk, x, y) { addGameObjectToGameState(vegetationTile); vegetationTile.drawObject.tint = sTint; - vegetationTile.drawObject.zIndex = 2; + vegetationTile.drawObject.zIndex = 10; vegetationTile.drawObject.position.set(16 * BC_SPRITES_SETTINGS.scale * ii, 16 * BC_SPRITES_SETTINGS.scale * jj); vegetationTile.drawObject.scale.set(BC_SPRITES_SETTINGS.scale, BC_SPRITES_SETTINGS.scale);