diff --git a/package-lock.json b/package-lock.json index 45eaa5d2..1b89de10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@mcschema/java-1.17": "^0.2.24", "@mcschema/java-1.18": "^0.1.16", "@mcschema/locales": "^0.1.35", - "deepslate": "^0.9.0-beta.5", + "deepslate": "^0.9.0-beta.6", "deepslate-rs": "^0.1.6", "howler": "^2.2.3", "rfdc": "^1.3.0" @@ -996,9 +996,9 @@ "dev": true }, "node_modules/deepslate": { - "version": "0.9.0-beta.5", - "resolved": "https://registry.npmjs.org/deepslate/-/deepslate-0.9.0-beta.5.tgz", - "integrity": "sha512-/f3cFDsgNWbSdo7dfHYSO7ZJEjjkEqIBlI6K9Q+elaKudduzE9SQdFlDAodW3ye2g/XhkA2jO9pc0i9F9fAMhw==", + "version": "0.9.0-beta.6", + "resolved": "https://registry.npmjs.org/deepslate/-/deepslate-0.9.0-beta.6.tgz", + "integrity": "sha512-kG4KF1WWVnymcbSb9U/0806SmK/vQU/QqqyB44RCz/QPfxDeFwuSfuDJRN4DCOyEeafkTbp8BaoaU1ysxT2Jrw==", "dependencies": { "gl-matrix": "^3.3.0", "md5": "^2.3.0", @@ -1571,9 +1571,9 @@ } }, "node_modules/gl-matrix": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", - "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" }, "node_modules/glob": { "version": "7.1.7", @@ -3459,9 +3459,9 @@ "dev": true }, "deepslate": { - "version": "0.9.0-beta.5", - "resolved": "https://registry.npmjs.org/deepslate/-/deepslate-0.9.0-beta.5.tgz", - "integrity": "sha512-/f3cFDsgNWbSdo7dfHYSO7ZJEjjkEqIBlI6K9Q+elaKudduzE9SQdFlDAodW3ye2g/XhkA2jO9pc0i9F9fAMhw==", + "version": "0.9.0-beta.6", + "resolved": "https://registry.npmjs.org/deepslate/-/deepslate-0.9.0-beta.6.tgz", + "integrity": "sha512-kG4KF1WWVnymcbSb9U/0806SmK/vQU/QqqyB44RCz/QPfxDeFwuSfuDJRN4DCOyEeafkTbp8BaoaU1ysxT2Jrw==", "requires": { "gl-matrix": "^3.3.0", "md5": "^2.3.0", @@ -3897,9 +3897,9 @@ "dev": true }, "gl-matrix": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", - "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" }, "glob": { "version": "7.1.7", diff --git a/package.json b/package.json index ad2b8744..632b50b4 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "@mcschema/java-1.17": "^0.2.24", "@mcschema/java-1.18": "^0.1.16", "@mcschema/locales": "^0.1.35", - "deepslate": "^0.9.0-beta.5", + "deepslate": "^0.9.0-beta.6", "deepslate-rs": "^0.1.6", "howler": "^2.2.3", "rfdc": "^1.3.0" diff --git a/src/app/components/previews/BiomeSourcePreview.tsx b/src/app/components/previews/BiomeSourcePreview.tsx index 087aa8c6..233f97e8 100644 --- a/src/app/components/previews/BiomeSourcePreview.tsx +++ b/src/app/components/previews/BiomeSourcePreview.tsx @@ -1,6 +1,6 @@ -import { Path } from '@mcschema/core' +import { DataModel, Path } from '@mcschema/core' import type { NoiseOctaves } from 'deepslate' -import { NoiseGeneratorSettings } from 'deepslate' +import { NoiseGeneratorSettings, TerrainShaper } from 'deepslate' import { useEffect, useRef, useState } from 'preact/hooks' import type { PreviewProps } from '.' import { Btn, BtnMenu } from '..' @@ -11,6 +11,8 @@ import { newSeed } from '../../Utils' const LAYERS = ['biomes', 'temperature', 'humidity', 'continentalness', 'erosion', 'weirdness', 'offset', 'factor', 'jaggedness'] as const +const OverworldShaper = TerrainShaper.overworld() + export const BiomeSourcePreview = ({ model, data, shown, lang, version }: PreviewProps) => { const [scale, setScale] = useState(2) const [focused, setFocused] = useState(undefined) @@ -21,7 +23,8 @@ export const BiomeSourcePreview = ({ model, data, shown, lang, version }: Previe const seed = BigInt(model.get(new Path(['generator', 'seed']))) const octaves = getOctaves(model.get(new Path(['generator', 'settings']))) - const state = shown ? calculateState(data, octaves) : '' + const shaper = getShaper(model.get(new Path(['generator', 'settings']))) + const state = shown ? calculateState(data, octaves, shaper) : '' const type: string = data.type?.replace(/^minecraft:/, '') const { canvas, redraw } = useCanvas({ @@ -29,7 +32,7 @@ export const BiomeSourcePreview = ({ model, data, shown, lang, version }: Previe return [200 / res.current, 200 / res.current] }, async draw(img) { - const options = { octaves, biomeColors: {}, layers, offset: offset.current, scale, seed, res: res.current, version } + const options = { octaves, shaper, biomeColors: {}, layers, offset: offset.current, scale, seed, res: res.current, version } await biomeMap(data, img, options) if (res.current === 4) { clearTimeout(refineTimeout.current) @@ -47,7 +50,7 @@ export const BiomeSourcePreview = ({ model, data, shown, lang, version }: Previe redraw() }, async onHover(x, y) { - const options = { octaves, biomeColors: {}, layers, offset: offset.current, scale, seed, res: 1, version } + const options = { octaves, shaper, biomeColors: {}, layers, offset: offset.current, scale, seed, res: 1, version } const biome = await getBiome(data, Math.floor(x * 200), Math.floor(y * 200), options) setFocused(biome) }, @@ -99,13 +102,13 @@ export const BiomeSourcePreview = ({ model, data, shown, lang, version }: Previe } -function calculateState(data: any, octaves: NoiseOctaves) { - return JSON.stringify([data, octaves]) +function calculateState(data: any, octaves: NoiseOctaves, shaper: TerrainShaper) { + return JSON.stringify([data, octaves, shaper.toJson()]) } function getOctaves(obj: any): NoiseOctaves { if (typeof obj !== 'string') { - const settings = NoiseGeneratorSettings.fromJson(obj) + const settings = NoiseGeneratorSettings.fromJson(DataModel.unwrapLists(obj)) obj = settings.noise.densityFactor === 0 && settings.noise.densityOffset === -0.030078125 ? 'minecraft:nether' : 'minecraft:overworld' } @@ -141,3 +144,16 @@ function getOctaves(obj: any): NoiseOctaves { } } } + +function getShaper(obj: any): TerrainShaper { + if (typeof obj === 'string') { + switch (obj.replace(/^minecraft:/, '')) { + case 'overworld': + case 'amplified': + return OverworldShaper + default: + return TerrainShaper.fromJson({ offset: 0, factor: 0, jaggedness: 0 }) + } + } + return TerrainShaper.fromJson(DataModel.unwrapLists(obj?.noise?.terrain_shaper)) +} diff --git a/src/app/previews/BiomeSource.ts b/src/app/previews/BiomeSource.ts index a8ee6aec..b335defa 100644 --- a/src/app/previews/BiomeSource.ts +++ b/src/app/previews/BiomeSource.ts @@ -16,8 +16,6 @@ async function loadWasm() { console.debug(`Loaded deepslate-rs from "${wasm}"`) } -const OverworldShaper = TerrainShaper.overworld() - const LAYERS = { temperature: [-1, 1], humidity: [-1, 1], @@ -33,6 +31,7 @@ type Triple = [number, number, number] type BiomeColors = Record type BiomeSourceOptions = { octaves: NoiseOctaves, + shaper: TerrainShaper, biomeColors: BiomeColors, offset: [number, number], scale: number, @@ -99,7 +98,7 @@ export async function getBiome(state: any, x: number, z: number, options: BiomeS } async function getCached(state: any, options: BiomeSourceOptions): Promise<{ biomeSource: CachedBiomeSource}> { - const newState = [state, options.octaves, `${options.seed}`, options.version] + const newState = [state, options.octaves, options.shaper.toJson(), `${options.seed}`, options.version] if (!deepEqual(newState, cacheState)) { cacheState = deepClone(newState) @@ -182,9 +181,9 @@ async function getBiomeSource(state: any, options: BiomeSourceOptions): Promise< continentalness: c, erosion: e, weirdness: w, - ...layers.has('offset') && { offset: OverworldShaper.offset(point) }, - ...layers.has('factor') && { factor: OverworldShaper.factor(point) }, - ...layers.has('jaggedness') && { jaggedness: OverworldShaper.jaggedness(point) }, + ...layers.has('offset') && { offset: options.shaper.offset(point) }, + ...layers.has('factor') && { factor: options.shaper.factor(point) }, + ...layers.has('jaggedness') && { jaggedness: options.shaper.jaggedness(point) }, }) } return result