diff --git a/src/hyper.ts b/src/hyper.ts index 504a2e1..d68a4b1 100644 --- a/src/hyper.ts +++ b/src/hyper.ts @@ -11,7 +11,7 @@ class VectorN { return this.values.length; } - map(fn: (n: number, i?: number) => number) { + map(fn: (n: number, i?: number) => number): VectorN { return new VectorN(...this.values.map(fn)); } @@ -19,11 +19,11 @@ class VectorN { return this.map((value, index) => value + vector.values[index]); } - magnitude() { + magnitude(): number { return Math.sqrt(this.values.reduce((sum, v) => (sum += v * v), 0)); } - asVector3() { + asVector3(): Vec3 { return new Vec3(this.values[0], this.values[1], this.values[2]); } } @@ -45,18 +45,4 @@ function symmetry(rank: number, space: GeneralSpace): GeneralSpace { } } -function test_ball(radius: number) { - const result = []; - for (let x = 0; x <= radius; ++x) { - for (let y = 0; y <= radius; ++y) { - for (let z = 0; z <= radius; ++z) { - if (x * x + y * y + z * z <= radius * radius) { - result.push(new VectorN(x, y, z)); - } - } - } - } - return symmetry(3, result).map((p) => p.asVector3); -} - export { VectorN, symmetry }; diff --git a/src/ifs.ts b/src/ifs.ts index 585e004..7d41227 100644 --- a/src/ifs.ts +++ b/src/ifs.ts @@ -1,4 +1,4 @@ -import { Vec3, Space, vec3 } from './vector.js'; +import { Space, vec3 } from './vector.js'; class IFS { fractal: number[][] = []; diff --git a/webviewer/public/index.html b/webviewer/public/index.html index 9a640c4..59735cb 100644 --- a/webviewer/public/index.html +++ b/webviewer/public/index.html @@ -1,19 +1,58 @@ - - - VoxelGeometry Viewer - - - - - - + - - - + + ws.onclose = function () { + document.getElementById('status-indicator').style.backgroundColor = 'red'; + setTimeout(connectWebSocket, 2000); + }; + }; + + const sendMessage = () => { + const message = inputBox.value; + ws.send(message); + inputBox.value = ''; + messageHistory.innerHTML += `

${message}

`; + messageHistory.scrollTop = messageHistory.scrollHeight; + }; + + let size = 1; + const sizeSlider = document.getElementById('size-slider'); + sizeSlider.addEventListener('input', function () { + const newSize = parseFloat(sizeSlider.value); + size = newSize; + scene.traverse(function (object) { + if (object instanceof THREE.Mesh) { + object.scale.set(newSize, newSize, newSize); + } + }); + }); + + connectWebSocket(); + + + + \ No newline at end of file diff --git a/webviewer/server.js b/webviewer/server.js index 6354237..eb58de7 100644 --- a/webviewer/server.js +++ b/webviewer/server.js @@ -1,10 +1,9 @@ -import * as ws from 'ws'; +import { WebSocketServer } from 'ws'; import readline from 'readline'; import { stdin, stdout } from 'process'; import express from 'express'; import { fileURLToPath } from 'url'; -import { dirname, join, extname, resolve } from 'path'; -import { readdirSync, renameSync, unlinkSync, mkdirSync, statSync, existsSync } from 'fs'; +import { dirname, join, resolve } from 'path'; import { Vec3, vec3, @@ -20,7 +19,7 @@ import { Turtle2D, Turtle3D, Symmetry -} from './dist/index.js'; +} from '../index.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); @@ -32,46 +31,8 @@ function pack(bs) { }; } -function rmdirSync(dirpath) { - if (existsSync(dirpath) && statSync(dirpath).isDirectory()) { - readdirSync(dirpath).forEach(function (file) { - const curPath = join(dirpath, file); - if (statSync(curPath).isDirectory()) { - rmdirSync(curPath); - } else { - unlinkSync(curPath); - } - }); - rmdirSync(dirpath); - } -} - -function removeCache() { - rmdirSync('./dist'); -} - -function moveScripts(sourceDir, targetDir, excludeDirs) { - const entries = readdirSync(sourceDir, { withFileTypes: true }); - - entries.forEach((entry) => { - const sourcePath = join(sourceDir, entry.name); - const targetPath = join(targetDir, entry.name); - - if (entry.isDirectory()) { - if (!excludeDirs.includes(entry.name)) { - moveScripts(sourcePath, targetPath, excludeDirs); - } - } else if (entry.name.endsWith('.js') || entry.name.endsWith('.d.ts')) { - if (!existsSync(targetDir)) { - mkdirSync(targetDir, { recursive: true }); - } - renameSync(sourcePath, targetPath); - } - }); -} - function handleWebSocket() { - const wss = new ws.WebSocketServer({ port: 2333 }); + const wss = new WebSocketServer({ port: 2333 }); wss.on('error', (e) => { console.log(e); @@ -79,10 +40,12 @@ function handleWebSocket() { wss.on('connection', (socket) => { const rl = readline.createInterface({ input: stdin, output: stdout }); - rl.on('line', handleLine(socket)); + rl.on('line', handleMessage(socket)); + socket.on('message', (str) => handleMessage(socket)(str.toString())); + socket.on('close', () => rl.close()); }); - function handleLine(socket) { + function handleMessage(socket) { return (s) => { try { if (s === 'clear') sendClear(socket); @@ -113,7 +76,5 @@ function handleHttpServer() { }); } -removeCache(); -moveScripts(resolve(__dirname, '..'), resolve(__dirname, 'dist'), ['node_modules', 'webviewer']); handleWebSocket(); handleHttpServer();