mirror of
https://github.com/misode/misode.github.io.git
synced 2026-04-26 16:35:39 +00:00
Fix noise settings preview, use the terrain shaper
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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':
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
@@ -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}>
|
||||
|
||||
Reference in New Issue
Block a user