Add world settings generator + improve visualizers

This commit is contained in:
Misode
2020-08-15 00:31:50 +02:00
parent 0370eeccde
commit d983fda1a9
9 changed files with 45 additions and 64 deletions
+10 -10
View File
@@ -5,22 +5,22 @@
"requires": true, "requires": true,
"dependencies": { "dependencies": {
"@mcschema/core": { "@mcschema/core": {
"version": "0.6.3", "version": "0.6.4",
"resolved": "https://registry.npmjs.org/@mcschema/core/-/core-0.6.3.tgz", "resolved": "https://registry.npmjs.org/@mcschema/core/-/core-0.6.4.tgz",
"integrity": "sha512-38sdUsiAzzHEl6vo6h7yud9BxjPB56CUIG3HETpCKdORN3KyETbYDOlajXHXmbrYvtPwIh0QMWNRmenkuNnthA==" "integrity": "sha512-CGPp8ccnwPNfPacVS8mwImP8kxAuPMhE6halZuOl70Rd4bK3sfAl8Nd+UWMnA3tR5d1fOI3Z0RAgp1eB/DYAOw=="
}, },
"@mcschema/java-1.16": { "@mcschema/java-1.16": {
"version": "0.3.4", "version": "0.3.5",
"resolved": "https://registry.npmjs.org/@mcschema/java-1.16/-/java-1.16-0.3.4.tgz", "resolved": "https://registry.npmjs.org/@mcschema/java-1.16/-/java-1.16-0.3.5.tgz",
"integrity": "sha512-r15OHlez2Cj7brfStXX27PSniSsZNt25Cws7kMzKqmiYpom1SRO+WMS5mvbCfzuztxaA1qR8b+UX4r3/2qMXTg==", "integrity": "sha512-q4Njxud9ghSdNPIqYqDBSBoxZcycq+AXts2EDk4EofFMmKM11CVQRlL51CWO0LqV57k8s2X1v4ItsnLMTw1ekQ==",
"requires": { "requires": {
"@mcschema/core": "^0.6.3" "@mcschema/core": "^0.6.4"
} }
}, },
"@mcschema/locales": { "@mcschema/locales": {
"version": "0.1.7", "version": "0.1.8",
"resolved": "https://registry.npmjs.org/@mcschema/locales/-/locales-0.1.7.tgz", "resolved": "https://registry.npmjs.org/@mcschema/locales/-/locales-0.1.8.tgz",
"integrity": "sha512-KJbKzWpw5XJdRtmih1cN5LqmMeoxtYeRkWu7fkfpH5Vo6ZshxceGyIqyIDsn06+rxkT5jyZX6bokmbn/P0Xwbg==" "integrity": "sha512-CnmN0ytut+moXDcDhvMVe0zrrYwM7pWa2RqxsFGa7a6QlID/TaYhUdfXqNpUbr1npu8EcEKV4nzSF7ev/XPghA=="
}, },
"@nodelib/fs.scandir": { "@nodelib/fs.scandir": {
"version": "2.1.3", "version": "2.1.3",
+3 -3
View File
@@ -12,9 +12,9 @@
"author": "Misode", "author": "Misode",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@mcschema/core": "^0.6.3", "@mcschema/core": "^0.6.4",
"@mcschema/java-1.16": "^0.3.4", "@mcschema/java-1.16": "^0.3.5",
"@mcschema/locales": "^0.1.7", "@mcschema/locales": "^0.1.8",
"@types/google.analytics": "0.0.40", "@types/google.analytics": "0.0.40",
"@types/split.js": "^1.4.0", "@types/split.js": "^1.4.0",
"copy-webpack-plugin": "^6.0.1", "copy-webpack-plugin": "^6.0.1",
+2 -3
View File
@@ -63,11 +63,10 @@ const treeViewObserver = (el: HTMLElement) => {
const treeViewNodeInjector = (path: ModelPath, view: TreeView) => { const treeViewNodeInjector = (path: ModelPath, view: TreeView) => {
return VisualizerView.visualizers return VisualizerView.visualizers
.filter(v => v.onPath(path)) .filter(v => v.active(path))
.filter(v => v.active(path.getModel()))
.map(v => { .map(v => {
const id = view.registerClick(() => { const id = view.registerClick(() => {
views.visualizer.set(v) views.visualizer.set(v, path)
}) })
return `<button data-id=${id}>${locale('visualize')} <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M1.5 8a6.5 6.5 0 1113 0 6.5 6.5 0 01-13 0zM8 0a8 8 0 100 16A8 8 0 008 0zM6.379 5.227A.25.25 0 006 5.442v5.117a.25.25 0 00.379.214l4.264-2.559a.25.25 0 000-.428L6.379 5.227z"></path></svg></button>` return `<button data-id=${id}>${locale('visualize')} <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M1.5 8a6.5 6.5 0 1113 0 6.5 6.5 0 01-13 0zM8 0a8 8 0 100 16A8 8 0 008 0zM6.379 5.227A.25.25 0 006 5.442v5.117a.25.25 0 00.379.214l4.264-2.559a.25.25 0 000-.428L6.379 5.227z"></path></svg></button>`
}) })
+4 -13
View File
@@ -1,11 +1,10 @@
import SimplexNoise from 'simplex-noise' import SimplexNoise from 'simplex-noise'
import { DataModel, Path } from "@mcschema/core" import { DataModel, Path, ModelPath } from "@mcschema/core"
import { Visualizer } from './Visualizer' import { Visualizer } from './Visualizer'
export class BiomeNoiseVisualizer extends Visualizer { export class BiomeNoiseVisualizer extends Visualizer {
static readonly noiseMaps = ['altitude', 'temperature', 'humidity', 'weirdness'] static readonly noiseMaps = ['altitude', 'temperature', 'humidity', 'weirdness']
static readonly path = new Path(['generator', 'biome_source'])
private noise: SimplexNoise[] private noise: SimplexNoise[]
private offsetX: number = 0 private offsetX: number = 0
private offsetY: number = 0 private offsetY: number = 0
@@ -15,17 +14,9 @@ export class BiomeNoiseVisualizer extends Visualizer {
this.noise = BiomeNoiseVisualizer.noiseMaps.map(e => new SimplexNoise()) this.noise = BiomeNoiseVisualizer.noiseMaps.map(e => new SimplexNoise())
} }
onPath(path: Path) { active(path: ModelPath) {
return path.equals(BiomeNoiseVisualizer.path) return path.endsWith(new Path(['generator', 'biome_source']))
} && path.push('type').get() === 'minecraft:multi_noise'
active(model: DataModel) {
return model.get(BiomeNoiseVisualizer.path) !== undefined
&& model.get(BiomeNoiseVisualizer.path.push('type')) === 'minecraft:multi_noise'
}
getState(model: DataModel) {
return model.get(BiomeNoiseVisualizer.path)
} }
draw(model: DataModel, img: ImageData) { draw(model: DataModel, img: ImageData) {
@@ -1,5 +1,5 @@
import SimplexNoise from 'simplex-noise' import SimplexNoise from 'simplex-noise'
import { DataModel, Path } from "@mcschema/core" import { DataModel, Path, ModelPath } from "@mcschema/core"
import { Visualizer } from './Visualizer' import { Visualizer } from './Visualizer'
const debug = false const debug = false
@@ -14,22 +14,8 @@ export class NoiseSettingsVisualizer extends Visualizer {
this.offsetX = 0 this.offsetX = 0
} }
onPath(path: Path) { active(path: ModelPath) {
return path.equals(new Path(['generator', 'settings', 'noise'])) return path.endsWith(new Path(['noise']))
|| path.equals(new Path(['noise']))
}
active(model: DataModel) {
return true
}
getState(model: DataModel) {
return model.get(new Path(['generator', 'settings', 'noise']))
?? model.get(new Path(['noise']))
}
onDrag(from: number[], to: number[]) {
this.offsetX += (to[0] - from[0])
} }
draw(model: DataModel, img: ImageData) { draw(model: DataModel, img: ImageData) {
@@ -47,6 +33,10 @@ export class NoiseSettingsVisualizer extends Visualizer {
} }
} }
onDrag(from: number[], to: number[]) {
this.offsetX += (to[0] - from[0])
}
private getColor(densities: number[], y: number): number { private getColor(densities: number[], y: number): number {
if (debug) { if (debug) {
return -densities[y] * 128 + 128 return -densities[y] * 128 + 128
+4 -11
View File
@@ -1,20 +1,13 @@
import { DataModel, Path } from "@mcschema/core" import { DataModel, ModelPath } from "@mcschema/core"
import { BiomeNoiseVisualizer } from "./BiomeNoiseVisualizer"
import { NoiseSettingsVisualizer } from "./NoiseSettingsVisualizer"
export abstract class Visualizer { export abstract class Visualizer {
state: any state: any
dirty(model: DataModel): boolean { dirty(path: ModelPath): boolean {
return JSON.stringify(this.state) !== JSON.stringify(this.getState(model)) return JSON.stringify(this.state) !== JSON.stringify(path.get())
} }
active(model: DataModel): boolean { abstract active(path: ModelPath): boolean
return true
}
abstract onPath(path: Path): boolean
abstract getState(model: DataModel): any
abstract draw(model: DataModel, img: ImageData): void abstract draw(model: DataModel, img: ImageData): void
onDrag(from: number[], to: number[]): void {} onDrag(from: number[], to: number[]): void {}
+9 -7
View File
@@ -1,4 +1,4 @@
import { AbstractView, DataModel, Path } from "@mcschema/core" import { AbstractView, DataModel, Path, ModelPath } from "@mcschema/core"
import { BiomeNoiseVisualizer } from "./BiomeNoiseVisualizer" import { BiomeNoiseVisualizer } from "./BiomeNoiseVisualizer"
import { NoiseSettingsVisualizer } from "./NoiseSettingsVisualizer" import { NoiseSettingsVisualizer } from "./NoiseSettingsVisualizer"
import { Visualizer } from "./Visualizer" import { Visualizer } from "./Visualizer"
@@ -7,6 +7,7 @@ export class VisualizerView extends AbstractView {
ctx: CanvasRenderingContext2D ctx: CanvasRenderingContext2D
visualizer?: Visualizer visualizer?: Visualizer
active: boolean active: boolean
path?: ModelPath
canvas: HTMLElement canvas: HTMLElement
sourceView: HTMLElement sourceView: HTMLElement
gutter: HTMLElement gutter: HTMLElement
@@ -39,11 +40,12 @@ export class VisualizerView extends AbstractView {
} }
invalidated() { invalidated() {
this.path = this.path?.withModel(this.model)
let newState: any let newState: any
if (this.active && this.visualizer if (this.active && this.visualizer && this.path
&& this.visualizer.active(this.model) && this.visualizer.active(this.path)
&& (newState = this.visualizer.getState(this.model))) { && (newState = this.path.get())) {
if (this.visualizer.dirty(this.model)) { if (newState && this.visualizer.dirty(this.path)) {
const img = this.ctx.createImageData(200, 100) const img = this.ctx.createImageData(200, 100)
this.visualizer.state = JSON.parse(JSON.stringify(newState)) this.visualizer.state = JSON.parse(JSON.stringify(newState))
this.visualizer.draw(this.model, img) this.visualizer.draw(this.model, img)
@@ -60,13 +62,13 @@ export class VisualizerView extends AbstractView {
this.gutter.style.display = 'none' this.gutter.style.display = 'none'
this.lastHeight = this.sourceView.style.height this.lastHeight = this.sourceView.style.height
this.sourceView.style.height = '100%' this.sourceView.style.height = '100%'
this.ctx.clearRect(0, 0, 200, 100)
} }
} }
set(visualizer: Visualizer) { set(visualizer: Visualizer, path: ModelPath) {
this.active = true this.active = true
this.visualizer = visualizer this.visualizer = visualizer
this.path = path
this.visualizer.state = undefined this.visualizer.state = undefined
this.invalidated() this.invalidated()
} }
+5
View File
@@ -108,6 +108,11 @@
"schema": "template_pool" "schema": "template_pool"
} }
] ]
},
{
"id": "world",
"name": "Import World Settings",
"schema": "world_settings"
} }
], ],
"registries": [ "registries": [
+1
View File
@@ -12,6 +12,7 @@
"title.generator": "%0% Generator", "title.generator": "%0% Generator",
"title.home": "Data Pack Generators", "title.home": "Data Pack Generators",
"visualize": "Visualize", "visualize": "Visualize",
"world": "World Settings",
"worldgen/biome": "Biome", "worldgen/biome": "Biome",
"worldgen/carver": "Carver", "worldgen/carver": "Carver",
"worldgen/feature": "Feature", "worldgen/feature": "Feature",