diff --git a/#server.js# b/#server.js# new file mode 100644 index 0000000..8682165 --- /dev/null +++ b/#server.js# @@ -0,0 +1,116 @@ +const express = require('express') +const http = require('http') +const WebSocket = require('ws') + +const osc = require('osc') + +const port = 6676 +// Vzemi iz argumenta +const tty = process.argv[2] + +const include_files = [ + '/anim.js', + '/control.js', + '/test.js', + '/node_modules/three/build/three.min.js', + '/node_modules/nouislider/distribute/nouislider.min.js', + '/node_modules/nouislider/distribute/nouislider.min.css', + '/node_modules/osc/dist/osc-browser.js' +]; + +const app = express(); +const server = http.Server(app); + +// Odprti serijski OSC link +const scon = new osc.SerialPort({ + devicePath: tty, + bitrate: 115200 +}) +scon.on('error', e => { + console.log('tty error', e) +}) +scon.open() + +app.get('/', (req, res) => { + res.sendFile(__dirname + '/index.html'); +}); + +app.get('/ctl', (req, res) => { + res.sendFile(__dirname + '/control.html'); +}); + +app.get('/test', (req, res) => { + res.sendFile(__dirname + '/test.html'); +}); + +let settings = {}; +app.get('/settings', function(req, res) { + res.send(settings); +}); + +include_files.map(function(file) { + app.get(file, function(req, res){ + res.sendFile(__dirname + file); + }); +}); + +server.listen(port, () => console.log('listening on *:' + port)) + +// Websocket init +const wss = new WebSocket.Server({ server }) + +const sendAll = (msg, wss, ws = null) => { + wss.clients.forEach( client => { + if (client != ws) { + client.send(msg) + } + }) +} + +// Debug osc +/* +scon.on('osc', msg => { + console.log('tty osc', msg.address, ...msg.args.map(val => Math.round(val * 1000) / 1000)) +}) +*/ + +wss.on('connection', function (ws) { + const oscWS = new osc.WebSocketPort({ + socket: ws, + metadata: true + }); + + // Arduino OSC gre v web + scon.on('osc', msg => { + switch(msg.address) { + case '/gyro/': + const [gx, gy, gz] = msg.args + sendAll('adjust:rotx:' + gx, wss) + sendAll('adjust:roty:' + gy, wss) + sendAll('adjust:rotz:' + gz, wss) + break; + case '/quaternion/': + const [qw, qx, qy, qz] = msg.args + sendAll('adjust:quaternion:' + [qw, qx, qy, qz].join(':'), wss) + break; + case '/accel/': + const [ax, ay, az] = msg.args + sendAll('adjust:posx:' + ax, wss) + sendAll('adjust:posy:' + ay, wss) + sendAll('adjust:posz:' + az, wss) + break; + } + }) + + ws.on('message', (msg) => { + //console.log('got msg', msg) + const parts = msg.split(":") + const cmd = parts[0] + + // Broadcast adjust msg + switch (cmd) { + case 'adjust': + sendAll(msg, wss, ws) + } + }) +}) diff --git a/#test.html# b/#test.html# new file mode 100644 index 0000000..981fca7 --- /dev/null +++ b/#test.html# @@ -0,0 +1,24 @@ + + + + cancerainbow test + + + +

TEST

+ + + + diff --git a/.#server.js b/.#server.js new file mode 120000 index 0000000..e699048 --- /dev/null +++ b/.#server.js @@ -0,0 +1 @@ +g1smo@dbn.20170:1628540355 \ No newline at end of file diff --git a/anim.js b/anim.js index ea3e479..c0c8ea0 100644 --- a/anim.js +++ b/anim.js @@ -47,10 +47,6 @@ var svetlost = 0.4; var wDiff = 0.5; var hDiff = 0.5; -var gostota_obj = 2; - - - // Scena, kamera in render diff --git a/control.html b/control.html index 32b386c..e6a31c3 100644 --- a/control.html +++ b/control.html @@ -1,7 +1,7 @@ - cancerainbow control + wavey wind control + + +
+ + + + + + diff --git a/test.js b/test.js new file mode 100644 index 0000000..e8af15a --- /dev/null +++ b/test.js @@ -0,0 +1,140 @@ +console.log("Hello, Sky!"); + +/**** ☭☭☭☭☭☭☭☭☭☭☭☭ ****** +/☭☭☭☭ Parametri razni ☭☭☭☭ * +******☭☭☭☭☭☭☭☭☭☭☭☭******/ + +// Odmik kamere +var odmik_kamere = 100; + +// Rotacija kamere +var cam_rot_offset = 1; + +// Vidni kot +var FOV = 140; + +// Sirina in visina test objekta +var width = 25; +var height = 150; +var depth = 50; + +// Stevec, za razno animiranje +var stevec = 0; + +// Parametri animacije +var rotacijaX = 0.000; +var rotacijaY = 0.000; +var rotacijaZ = 0.000; + +// Pozicija +var posX = 0; +var posY = 0; +var posZ = 0; + +// Zamik pri novem objektu +var barva = 0.333; +var saturacija = 1; +var svetlost = 0.4; + +// Drugi parametri +var wDiff = 0.5; + +// Scena, kamera in render +scene = new THREE.Scene; + +camera = new THREE.PerspectiveCamera(FOV, window.innerWidth / window.innerHeight, 0.1, 2000); +camera.position.z = odmik_kamere; + +renderer = new THREE.WebGLRenderer({ + alpha: true +}); +renderer.setSize(window.innerWidth, window.innerHeight); + +// Belo ozadje +renderer.setClearColor(0xFFFFFF, 1); +// Črno ozadje +//renderer.setClearColor(0x000000, 1); + +// Dodaj test skatlo +var geo = new THREE.BoxGeometry(width, height, depth); +var mat = new THREE.MeshBasicMaterial({ + color: 0xff00ff, + wireframe: true +}); +var cube = new THREE.Mesh(geo, mat); +scene.add(cube); // + +var objekti = [cube]; + +function render () { + requestAnimationFrame(render); + + stevec += 1; + renderer.render(scene, camera); + + objAnim(); + //camRotate(); +}; + +// Funkcija za animacijo objektov +function objAnim() { + objekti.map(function (obj) { + obj.setRotationFromEuler(new THREE.Euler(rotacijaX, rotacijaY, rotacijaZ, 'XYZ')); + + /* + obj.rotation.y = -rotacijaX; + obj.rotation.x = rotacijaY; + obj.rotation.z = rotacijaZ; + */ + + /* + const cor = 0.8; + obj.position.x += posX / 1000; + obj.position.x *= cor; + obj.position.y += posY / 1000; + obj.position.y *= cor; + obj.position.z += posZ / 1000; + obj.position.z *= cor; + */ + }); +}; + + +var xAksa = new THREE.Vector3(0, 1, 0); +function camRotate () { + // rotiraj po z osi + camera.translateX(cam_rot_offset); + camera.translateZ(odmik_kamere - Math.sqrt(Math.pow(odmik_kamere, 2) + Math.pow(cam_rot_offset, 2))); + + /* + camera.translateY(cam_rot_offset); + camera.translateX(odmik_kamere - Math.sqrt(Math.pow(odmik_kamere, 2) + Math.pow(cam_rot_offset, 2))); + + camera.translateY(cam_rot_offset); + camera.translateX(odmik_kamere - Math.sqrt(Math.pow(odmik_kamere, 2) + Math.pow(cam_rot_offset, 2))); + + + + camera.position.x = Math.sin((stevec % 10) / 10) * cam_rot_offset; + camera.position.y = Math.cos((stevec % 10) / 10) * cam_rot_offset; + */ + + camera.lookAt(scene.position); +}; + +// Inicializiraj +document.onreadystatechange = function () { + if (document.readyState === 'complete') { + document.getElementById("anim-container").appendChild(renderer.domElement); + + render(); + } +}; + +// Lep risajz +function onWindowResize() { + camera.aspect = window.innerWidth / window.innerHeight; + camera.updateProjectionMatrix(); + renderer.setSize(window.innerWidth, window.innerHeight); +} +window.addEventListener('resize', onWindowResize, false);