From cbe0f0a5a8f9cf5b4f7ed2f5cf4052fdf83d4e05 Mon Sep 17 00:00:00 2001 From: Peaceultime Date: Mon, 12 Dec 2022 23:41:04 +0100 Subject: [PATCH] Test some feature for the voronoi generation. --- src/main.mjs | 8 ++--- src/modules/renderer/renderer.mjs | 16 ++++++--- src/workers/base.mjs | 57 +++++++++++++++++++------------ 3 files changed, 51 insertions(+), 30 deletions(-) diff --git a/src/main.mjs b/src/main.mjs index 541e21f..db23d9e 100644 --- a/src/main.mjs +++ b/src/main.mjs @@ -15,15 +15,15 @@ import Delaunator from 'https://cdn.skypack.dev/delaunator@5.0.0'; //await new Promise(r => setTimeout(r, 3000)); - const settings = { model: { x: 50, y: 25, seed: 0, jitter: 0.2, }, view: { width: window.innerWidth, height: window.innerHeight, }, }; + const settings = { model: { x: 30, y: 30, seed: 0, jitter: 0.1, }, view: { width: window.innerWidth, height: window.innerHeight, }, }; await thread.global.updateSettings(settings); await thread.model.generateTriangles(); const view = await thread.view.lerpToViewport(); - const debug = await thread.debug.getAll(); + window.debug = await thread.debug.getAll(); Renderer.init(); - Renderer.initGrid(view.position, view.vertices); -})(); \ No newline at end of file + Renderer.initGrid(undefined, view.position, view.vertices); +})(); diff --git a/src/modules/renderer/renderer.mjs b/src/modules/renderer/renderer.mjs index f00b334..228ca00 100644 --- a/src/modules/renderer/renderer.mjs +++ b/src/modules/renderer/renderer.mjs @@ -44,7 +44,7 @@ class Renderer this._renderer.render(this._scene, this._camera); } - static async initGrid(position, vertices) //Share the list of cell and the resolution in the model with the view + static async initGrid(centers, positions, vertices) //Share the list of cell and the resolution in the model with the view { if(this._threaded) { @@ -53,18 +53,24 @@ class Renderer } else { + /*const centerGeometry = new Three.BufferGeometry(); + centerGeometry.setAttribute('position', new Three.Float32BufferAttribute( centers, 3)); +*/ const geometry = new Three.BufferGeometry(); geometry.setIndex( new Three.Uint32BufferAttribute( vertices, 1 ) ); - geometry.setAttribute('position', new Three.Float32BufferAttribute( position, 3)); + geometry.setAttribute('position', new Three.Float32BufferAttribute( positions, 3)); const material = new Three.MeshBasicMaterial( { color: 0xff0000, wireframe: true, } ); const mesh = new Three.Mesh( geometry, material ); this._scene.add( mesh ); - /*const points = new Three.Points( geometry, new Three.PointsMaterial( { size: 3.0 } ) ); - this._scene.add( points );*/ + const points = new Three.Points( geometry, new Three.PointsMaterial( { size: 3.0 } ) ); + this._scene.add( points ); + + /*const center = new Three.Points( centerGeometry, new Three.PointsMaterial( { color: 0xffbb00, size: 2.0 } ) ); + this._scene.add( center );*/ } } } -export default Renderer; \ No newline at end of file +export default Renderer; diff --git a/src/workers/base.mjs b/src/workers/base.mjs index fd8f61b..78a9b63 100644 --- a/src/workers/base.mjs +++ b/src/workers/base.mjs @@ -1,7 +1,8 @@ import { Process } from "../utils/workerUtils.mjs"; -import Noise from '../libs/alea.mjs' +import Noise from '../libs/alea.mjs'; import Delaunator from 'https://cdn.skypack.dev/delaunator@5.0.0'; + let settings = {}; const model = {}; const view = {}; @@ -26,35 +27,39 @@ function generateTriangles() const _y = (i / 2 - _x) / settings.model.x; const angle = lerp(0, Math.PI * 2, rand()); - const magnitude = lerp(0, settings.model.jitter, rand()); + const magnitude = lerp(0, settings.model.jitter, 1); grid[i ] = _x + Math.sin(angle) * magnitude; grid[i + 1] = _y + Math.cos(angle) * magnitude; } model.delaunay = new Delaunator(grid); + + + //model.voronoi = model.delaunay.voronoi([-1, -1, settings.model.x + 1, settings.model.y + 1]); + //model.cells = []; + + /*console.group("Cells"); + let cell = model.voronoi.cellPolygons(); + for(let i = 0, n = (model.delaunay.points.length / 2); i < n; i++) + { + const cells = model.voronoi._cell(i); + const val = cell.next().value.flat(); + console.log(val, cells); + model.cells.push(...val); + } + console.groupEnd("Cells");*/ } -function generateVoronoi() + +function relax(delaunay) { - function circumcenter(a, b, c) + delaunay.coords = new Float32Array(delaunay.coords.length); + //For each voronoi cells, get the centroid + for(let i = 0; i < delaunay.trianglesLen; i++) { - const ad = a[0] * a[0] + a[1] * a[1]; - const bd = b[0] * b[0] + b[1] * b[1]; - const cd = c[0] * c[0] + c[1] * c[1]; - const D = 2 * (a[0] * (b[1] - c[1]) + b[0] * (c[1] - a[1]) + c[0] * (a[1] - b[1])); - return [ - 1 / D * (ad * (b[1] - c[1]) + bd * (c[1] - a[1]) + cd * (a[1] - b[1])), - 1 / D * (ad * (c[0] - b[0]) + bd * (a[0] - c[0]) + cd * (b[0] - a[0])), - ]; - } - const coords = model.delaunay.coords; - const tri = model.delaunay.triangles; - - for(let i = model.delaunay.trianglesLen - 1; i >= 0; --i) - { - tri[] } + delaunay.coords = } function getDelaunay() @@ -69,8 +74,18 @@ function getAll() //Settings view contains width & height function lerpToViewport() { - const size = settings.model.x * settings.model.y; + /*const centers = model.voronoi.circumcenters; + const centerSize = centers.length / 2; + view.centers = new Float32Array(centerSize * 3); + for(let i = centerSize - 1; i >= 0; --i) + { + view.centers[i * 3 ] = lerp(0, settings.view.width , inverse_lerp(0, settings.model.x - 1, centers[i * 2 ])); + view.centers[i * 3 + 1] = lerp(0, settings.view.height, inverse_lerp(0, settings.model.y - 1, centers[i * 2 + 1])); + view.centers[i * 3 + 2] = -2; + }*/ + const grid = model.delaunay.coords; + const size = grid.length / 2; view.grid = new Float32Array(size * 3); for(let i = size - 1; i >= 0; --i) { @@ -79,7 +94,7 @@ function lerpToViewport() view.grid[i * 3 + 2] = -3; } - return { position: view.grid, vertices: model.delaunay.triangles }; + return { position: view.grid/*, centers: view.centers*/, vertices: model.delaunay.triangles }; } //Process.register is the equivalent of export