Fix noise settings preview, use the terrain shaper

This commit is contained in:
Misode
2021-10-30 04:44:25 +02:00
parent 561f9a3956
commit b4d43c55bd
5 changed files with 36 additions and 34 deletions

View File

@@ -170,7 +170,11 @@ export async function fetchPreset(version: VersionId, registry: string, id: stri
if (registry === 'worldgen/noise_settings' && version === '1.18') {
let text = await res.text()
text = text.replaceAll('"max_threshold": Infinity', '"max_threshold": 100')
return JSON.parse(text)
const data = JSON.parse(text)
if (id !== 'overworld' && id !== 'large_biomes') {
data.noise.terrain_shaper = { offset: 0, factor: 0, jaggedness: 0 }
}
return data
}
return await res.json()
} catch (e) {

View File

@@ -106,7 +106,7 @@ function calculateState(data: any, octaves: NoiseOctaves, shaper: TerrainShaper)
return JSON.stringify([data, octaves, shaper.toJson()])
}
function getOctaves(obj: any): NoiseOctaves {
export function getOctaves(obj: any): NoiseOctaves {
if (typeof obj !== 'string') {
const settings = NoiseGeneratorSettings.fromJson(DataModel.unwrapLists(obj))
obj = settings.noise.densityFactor === 0 && settings.noise.densityOffset === -0.030078125
@@ -145,7 +145,7 @@ function getOctaves(obj: any): NoiseOctaves {
}
}
function getShaper(obj: any): TerrainShaper {
export function getShaper(obj: any): TerrainShaper {
if (typeof obj === 'string') {
switch (obj.replace(/^minecraft:/, '')) {
case 'overworld':

View File

@@ -10,18 +10,11 @@ import { randomSeed } from '../../Utils'
export const NoiseSettingsPreview = ({ lang, data, shown, version }: PreviewProps) => {
const loc = locale.bind(null, lang)
const [seed, setSeed] = useState(randomSeed())
const [biomeFactor, setBiomeFactor] = useState(0.2)
const [biomeOffset, setBiomeOffset] = useState(0.1)
const [biomePeaks, setBiomePeaks] = useState(0)
const [biomeScale, setBiomeScale] = useState(0.2)
const [biomeDepth, setBiomeDepth] = useState(0.1)
const [focused, setFocused] = useState<string | undefined>(undefined)
const offset = useRef(0)
const state = JSON.stringify([data, biomeFactor, biomeOffset, biomePeaks])
const hasPeaks = checkVersion(version, '1.18')
useEffect(() => {
setBiomeFactor(hasPeaks ? 600 : 0.2)
setBiomeOffset(hasPeaks ? 0.05 : 0.1)
}, [hasPeaks])
const state = JSON.stringify([data, biomeScale, biomeDepth])
const size = data?.noise?.height ?? 256
const { canvas, redraw } = useCanvas({
@@ -29,7 +22,7 @@ export const NoiseSettingsPreview = ({ lang, data, shown, version }: PreviewProp
return [size, size]
},
async draw(img) {
const options = { biomeOffset, biomeFactor, biomePeaks, offset: offset.current, width: img.width, seed, version }
const options = { biomeDepth, biomeScale, offset: offset.current, width: img.width, seed, version }
noiseSettings(data, img, options)
},
async onDrag(dx) {
@@ -54,16 +47,12 @@ export const NoiseSettingsPreview = ({ lang, data, shown, version }: PreviewProp
return <>
<div class="controls">
{focused && <Btn label={`Y = ${focused}`} class="no-pointer" />}
<BtnMenu icon="gear" tooltip={locale(lang, 'terrain_settings')}>
{hasPeaks ? <>
<BtnInput label={loc('preview.factor')} value={`${biomeFactor}`} onChange={v => setBiomeFactor(Number(v))} />
<BtnInput label={loc('preview.offset')} value={`${biomeOffset}`} onChange={v => setBiomeOffset(Number(v))} />
<BtnInput label={loc('preview.peaks')} value={`${biomePeaks}`} onChange={v => setBiomePeaks(Number(v))} />
</> : <>
<BtnInput label={loc('preview.scale')} value={`${biomeFactor}`} onChange={v => setBiomeFactor(Number(v))} />
<BtnInput label={loc('preview.depth')} value={`${biomeOffset}`} onChange={v => setBiomeOffset(Number(v))} />
</>}
</BtnMenu>
{checkVersion(version, undefined, '1.17') &&
<BtnMenu icon="gear" tooltip={locale(lang, 'terrain_settings')}>
<BtnInput label={loc('preview.scale')} value={`${biomeScale}`} onChange={v => setBiomeScale(Number(v))} />
<BtnInput label={loc('preview.depth')} value={`${biomeDepth}`} onChange={v => setBiomeDepth(Number(v))} />
</BtnMenu>
}
<Btn icon="sync" tooltip={locale(lang, 'generate_new_seed')}
onClick={() => setSeed(randomSeed())} />
</div>

View File

@@ -1,15 +1,15 @@
import { DataModel } from '@mcschema/core'
import type { BlockPos, BlockState } from 'deepslate'
import { Chunk, ChunkPos, FixedBiome, NoiseChunkGenerator, NoiseGeneratorSettings } from 'deepslate'
import { getOctaves } from '../components'
import type { VersionId } from '../Schemas'
import { checkVersion } from '../Schemas'
import { deepClone, deepEqual } from '../Utils'
import { NoiseChunkGenerator as OldNoiseChunkGenerator } from './noise/NoiseChunkGenerator'
export type NoiseSettingsOptions = {
biomeFactor: number,
biomeOffset: number,
biomePeaks: number,
biomeScale?: number,
biomeDepth?: number,
offset: number,
width: number,
seed: bigint,
@@ -54,7 +54,7 @@ export function noiseSettings(state: any, img: ImageData, options: NoiseSettings
}
const generator = new OldNoiseChunkGenerator(options.seed)
generator.reset(state.noise, options.biomeOffset, options.biomeFactor, options.offset, 200)
generator.reset(state.noise, options.biomeDepth ?? 0, options.biomeScale ?? 0, options.offset, options.width)
const data = img.data
const row = img.width * 4
for (let x = 0; x < options.width; x += 1) {
@@ -72,12 +72,9 @@ export function noiseSettings(state: any, img: ImageData, options: NoiseSettings
function getCached(state: unknown, options: NoiseSettingsOptions) {
const settings = NoiseGeneratorSettings.fromJson(DataModel.unwrapLists(state))
// Temporary fix for slides
settings.noise.bottomSlide.target *= 128
settings.noise.topSlide.target *= 128
const shape = { factor: options.biomeFactor, offset: options.biomeOffset, peaks: options.biomePeaks, nearWater: false }
settings.octaves = getOctaves(settings)
const newState = [state, shape, `${options.seed}`]
const newState = [state, `${options.seed}`]
if (!deepEqual(newState, cacheState)) {
cacheState = deepClone(newState)
chunkCache = []

View File

@@ -237,6 +237,8 @@ const renderHtml: RenderHook = {
},
object({ node, config, getActiveFields, getChildModelPath }, path, value, lang, states, ctx) {
const { expand, isToggled } = useToggles()
if (path.getArray().length == 0 && isDecorated(config.context, value)) {
const { wrapper, fields } = createDecoratorsWrapper(getActiveFields(path), path, value)
value = wrapper.data
@@ -263,6 +265,16 @@ const renderHtml: RenderHook = {
.filter(([_, child]) => child.enabled(path))
.map(([key, child]) => {
const cPath = getChildModelPath(path, key)
const canToggle = child.type(cPath) === 'object'
const toggle = isToggled(key)
if (canToggle && (toggle === false || (toggle === undefined && (ctx.depth ?? 0) > 5))) {
return <div class="node node-header" data-category={child.category(cPath)}>
<ErrorPopup lang={lang} path={cPath} nested />
<button class="toggle tooltipped tip-se" aria-label={`${locale(lang, 'expand')}\n${locale(lang, 'expand_all', 'Ctrl')}`} onClick={expand(key)}>{Octicon.chevron_right}</button>
<label>{pathLocale(lang, cPath)}</label>
</div>
}
const context = cPath.getContext().join('.')
if (hiddenFields.includes(context)) return null
const [cPrefix, cSuffix, cBody] = child.hook(this, cPath, value[key], lang, states, newCtx)
@@ -434,7 +446,7 @@ function TreeNode({ label, schema, path, value, lang, states, ctx, actions, chil
setActive()
}
const newCtx = {...ctx}
const newCtx: Record<string, any> = { ...ctx, depth: (ctx.depth ?? 0) + 1 }
delete newCtx.index
const [prefix, suffix, body] = schema.hook(renderHtml, path, value, lang, states, newCtx)
return <div class={`node ${type}-node`} data-category={category}>