Skip to content

Commit 1abc28f

Browse files
committed
Get project data for worldgen previews
1 parent 2bc0fc2 commit 1abc28f

File tree

4 files changed

+32
-7
lines changed

4 files changed

+32
-7
lines changed

src/app/components/previews/BiomeSourcePreview.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { clampedMap } from 'deepslate'
22
import { mat3 } from 'gl-matrix'
33
import { useCallback, useRef, useState } from 'preact/hooks'
4-
import { useLocale, useProject, useStore, useVersion } from '../../contexts/index.js'
4+
import { getWorldgenProjectData, useLocale, useProject, useStore, useVersion } from '../../contexts/index.js'
55
import { useAsync } from '../../hooks/index.js'
66
import { checkVersion } from '../../services/Versions.js'
77
import { Store } from '../../Store.js'
@@ -37,7 +37,8 @@ export const BiomeSourcePreview = ({ docAndNode, shown }: PreviewProps) => {
3737
const hasRandomness = type === 'multi_noise' || type === 'the_end'
3838

3939
const { value } = useAsync(async function loadBiomeSource() {
40-
await DEEPSLATE.loadVersion(version, {}) // TODO: get project data
40+
const projectData = await getWorldgenProjectData(project)
41+
await DEEPSLATE.loadVersion(version, projectData)
4142
await DEEPSLATE.loadChunkGenerator(data?.generator?.settings, data?.generator?.biome_source, seed)
4243
return {
4344
biomeSource: { loaded: true },

src/app/components/previews/DensityFunctionPreview.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { Voxel } from 'deepslate/render'
22
import { clampedMap, VoxelRenderer } from 'deepslate/render'
33
import type { mat3, mat4 } from 'gl-matrix'
44
import { useCallback, useEffect, useRef, useState } from 'preact/hooks'
5-
import { useLocale, useProject, useVersion } from '../../contexts/index.js'
5+
import { getWorldgenProjectData, useLocale, useProject, useVersion } from '../../contexts/index.js'
66
import { useAsync } from '../../hooks/useAsync.js'
77
import { useLocalStorage } from '../../hooks/useLocalStorage.js'
88
import { Store } from '../../Store.js'
@@ -32,7 +32,8 @@ export const DensityFunctionPreview = ({ docAndNode, shown }: PreviewProps) => {
3232
const text = docAndNode.doc.getText()
3333

3434
const { value: df } = useAsync(async () => {
35-
await DEEPSLATE.loadVersion(version, {}) // TODO: get project data
35+
const projectData = await getWorldgenProjectData(project)
36+
await DEEPSLATE.loadVersion(version, projectData)
3637
const df = DEEPSLATE.loadDensityFunction(safeJsonParse(text) ?? {}, minY, height, seed)
3738
return df
3839
}, [version, project, minY, height, seed, text])

src/app/components/previews/NoiseSettingsPreview.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { clampedMap } from 'deepslate'
22
import type { mat3 } from 'gl-matrix'
33
import { vec2 } from 'gl-matrix'
44
import { useCallback, useRef, useState } from 'preact/hooks'
5-
import { useLocale, useProject, useVersion } from '../../contexts/index.js'
5+
import { getWorldgenProjectData, useLocale, useProject, useVersion } from '../../contexts/index.js'
66
import { useAsync } from '../../hooks/index.js'
77
import { fetchRegistries } from '../../services/index.js'
88
import { Store } from '../../Store.js'
@@ -27,7 +27,8 @@ export const NoiseSettingsPreview = ({ docAndNode, shown }: PreviewProps) => {
2727

2828
const { value, error } = useAsync(async () => {
2929
const data = safeJsonParse(text) ?? {}
30-
await DEEPSLATE.loadVersion(version, {}) // TODO: get project data
30+
const projectData = await getWorldgenProjectData(project)
31+
await DEEPSLATE.loadVersion(version, projectData)
3132
const biomeSource = { type: 'fixed', biome }
3233
await DEEPSLATE.loadChunkGenerator(data, biomeSource, seed)
3334
const noiseSettings = DEEPSLATE.getNoiseSettings()

src/app/contexts/Project.tsx

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ import { Identifier } from 'deepslate'
22
import type { ComponentChildren } from 'preact'
33
import { createContext } from 'preact'
44
import { useCallback, useContext, useState } from 'preact/hooks'
5+
import type { ProjectData } from '../components/previews/Deepslate.js'
56
import config from '../Config.js'
67
import { useAsync } from '../hooks/useAsync.js'
78
import type { VersionId } from '../services/index.js'
89
import { DEFAULT_VERSION } from '../services/index.js'
910
import { DRAFTS_URI, PROJECTS_URI, SpyglassClient } from '../services/Spyglass.js'
1011
import { Store } from '../Store.js'
11-
import { genPath, hexId, message } from '../Utils.js'
12+
import { genPath, hexId, message, safeJsonParse } from '../Utils.js'
1213

1314
export type ProjectMeta = {
1415
name: string,
@@ -167,3 +168,24 @@ export function getProjectRoot(project: ProjectMeta) {
167168
}
168169
throw new Error(`Unsupported project storage ${project.storage?.type}`)
169170
}
171+
172+
export async function getWorldgenProjectData(project: ProjectMeta): Promise<ProjectData> {
173+
const projectRoot = getProjectRoot(project)
174+
const categories = ['worldgen/noise_settings', 'worldgen/noise', 'worldgen/density_function']
175+
const result: ProjectData = Object.fromEntries(categories.map(c => [c, {}]))
176+
const entries = await SpyglassClient.FS.readdir(projectRoot)
177+
for (const entry of entries) {
178+
for (const category of categories) {
179+
if (entry.name.includes(category)) {
180+
const pattern = RegExp(`data/([a-z0-9_.-]+)/${category}/([a-z0-9_./-]+).json$`)
181+
const match = entry.name.match(pattern)
182+
if (match) {
183+
const data = await SpyglassClient.FS.readFile(entry.name)
184+
const text = new TextDecoder().decode(data)
185+
result[category][`${match[1]}:${match[2]}`] = safeJsonParse(text)
186+
}
187+
}
188+
}
189+
}
190+
return result
191+
}

0 commit comments

Comments
 (0)