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

View File

@@ -1,11 +1,10 @@
import SimplexNoise from 'simplex-noise'
import { DataModel, Path } from "@mcschema/core"
import { DataModel, Path, ModelPath } from "@mcschema/core"
import { Visualizer } from './Visualizer'
export class BiomeNoiseVisualizer extends Visualizer {
static readonly noiseMaps = ['altitude', 'temperature', 'humidity', 'weirdness']
static readonly path = new Path(['generator', 'biome_source'])
private noise: SimplexNoise[]
private offsetX: number = 0
private offsetY: number = 0
@@ -15,17 +14,9 @@ export class BiomeNoiseVisualizer extends Visualizer {
this.noise = BiomeNoiseVisualizer.noiseMaps.map(e => new SimplexNoise())
}
onPath(path: Path) {
return path.equals(BiomeNoiseVisualizer.path)
}
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)
active(path: ModelPath) {
return path.endsWith(new Path(['generator', 'biome_source']))
&& path.push('type').get() === 'minecraft:multi_noise'
}
draw(model: DataModel, img: ImageData) {

View File

@@ -1,5 +1,5 @@
import SimplexNoise from 'simplex-noise'
import { DataModel, Path } from "@mcschema/core"
import { DataModel, Path, ModelPath } from "@mcschema/core"
import { Visualizer } from './Visualizer'
const debug = false
@@ -14,22 +14,8 @@ export class NoiseSettingsVisualizer extends Visualizer {
this.offsetX = 0
}
onPath(path: Path) {
return path.equals(new Path(['generator', 'settings', '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])
active(path: ModelPath) {
return path.endsWith(new Path(['noise']))
}
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 {
if (debug) {
return -densities[y] * 128 + 128

View File

@@ -1,20 +1,13 @@
import { DataModel, Path } from "@mcschema/core"
import { BiomeNoiseVisualizer } from "./BiomeNoiseVisualizer"
import { NoiseSettingsVisualizer } from "./NoiseSettingsVisualizer"
import { DataModel, ModelPath } from "@mcschema/core"
export abstract class Visualizer {
state: any
dirty(model: DataModel): boolean {
return JSON.stringify(this.state) !== JSON.stringify(this.getState(model))
dirty(path: ModelPath): boolean {
return JSON.stringify(this.state) !== JSON.stringify(path.get())
}
active(model: DataModel): boolean {
return true
}
abstract onPath(path: Path): boolean
abstract getState(model: DataModel): any
abstract active(path: ModelPath): boolean
abstract draw(model: DataModel, img: ImageData): void
onDrag(from: number[], to: number[]): void {}

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 { NoiseSettingsVisualizer } from "./NoiseSettingsVisualizer"
import { Visualizer } from "./Visualizer"
@@ -7,6 +7,7 @@ export class VisualizerView extends AbstractView {
ctx: CanvasRenderingContext2D
visualizer?: Visualizer
active: boolean
path?: ModelPath
canvas: HTMLElement
sourceView: HTMLElement
gutter: HTMLElement
@@ -39,11 +40,12 @@ export class VisualizerView extends AbstractView {
}
invalidated() {
this.path = this.path?.withModel(this.model)
let newState: any
if (this.active && this.visualizer
&& this.visualizer.active(this.model)
&& (newState = this.visualizer.getState(this.model))) {
if (this.visualizer.dirty(this.model)) {
if (this.active && this.visualizer && this.path
&& this.visualizer.active(this.path)
&& (newState = this.path.get())) {
if (newState && this.visualizer.dirty(this.path)) {
const img = this.ctx.createImageData(200, 100)
this.visualizer.state = JSON.parse(JSON.stringify(newState))
this.visualizer.draw(this.model, img)
@@ -60,13 +62,13 @@ export class VisualizerView extends AbstractView {
this.gutter.style.display = 'none'
this.lastHeight = this.sourceView.style.height
this.sourceView.style.height = '100%'
this.ctx.clearRect(0, 0, 200, 100)
}
}
set(visualizer: Visualizer) {
set(visualizer: Visualizer, path: ModelPath) {
this.active = true
this.visualizer = visualizer
this.path = path
this.visualizer.state = undefined
this.invalidated()
}