| @@ -1,7 +1,10 @@ | |||||
| var ngbh = {}; | |||||
| var vops = {}; | |||||
| var meta = {}; | |||||
| var abj = {}; | var abj = {}; | ||||
| abj.ngbh = {}; | |||||
| abj.vops = {}; | |||||
| abj.meta = {}; | |||||
| ngbh = abj.ngbh; | |||||
| vops = abj.vops; | |||||
| meta = abj.meta; | |||||
| abj.add_node = function(node, m) { | abj.add_node = function(node, m) { | ||||
| ngbh[node] = {}; | ngbh[node] = {}; | ||||
| vops[node] = clifford.hadamard; | vops[node] = clifford.hadamard; | ||||
| @@ -6,21 +6,21 @@ function updateScene() { | |||||
| oldState = null; | oldState = null; | ||||
| var geometry = new THREE.Geometry(); | var geometry = new THREE.Geometry(); | ||||
| for (var i in vops) { | |||||
| var vop = vops[i]; | |||||
| var pos = meta[i].position; | |||||
| for (var i in abj.vops) { | |||||
| var vop = abj.vops[i]; | |||||
| var pos = abj.meta[i].position; | |||||
| var vertex = new THREE.Vector3(pos.x, pos.y, pos.z); | var vertex = new THREE.Vector3(pos.x, pos.y, pos.z); | ||||
| geometry.vertices.push(vertex); | geometry.vertices.push(vertex); | ||||
| geometry.colors[i] = new THREE.Color(colors[vops[i] % colors.length]); | |||||
| geometry.colors[i] = new THREE.Color(colors[abj.vops[i] % colors.length]); | |||||
| } | } | ||||
| var edges = new THREE.Object3D(); | var edges = new THREE.Object3D(); | ||||
| var my_edges = edgelist(); | |||||
| var my_edges = abj.edgelist(); | |||||
| for (i=0; i < my_edges.length; ++i) { | for (i=0; i < my_edges.length; ++i) { | ||||
| var edge = my_edges[i]; | var edge = my_edges[i]; | ||||
| var start = meta[edge[0]].position; | |||||
| var start = abj.meta[edge[0]].position; | |||||
| var startpos = new THREE.Vector3(start[0], start[1], start[2]); | var startpos = new THREE.Vector3(start[0], start[1], start[2]); | ||||
| var end = meta[edge[1]].position; | |||||
| var end = abj.meta[edge[1]].position; | |||||
| var endpos = new THREE.Vector3(end[0], end[1], end[2]); | var endpos = new THREE.Vector3(end[0], end[1], end[2]); | ||||
| var newEdge = makeEdge(startpos, endpos); | var newEdge = makeEdge(startpos, endpos); | ||||
| edges.add(newEdge); | edges.add(newEdge); | ||||
| @@ -12,7 +12,6 @@ | |||||
| <script type="text/javascript" src="three.js"></script> | <script type="text/javascript" src="three.js"></script> | ||||
| <script type="text/javascript" src="libs.js"></script> | <script type="text/javascript" src="libs.js"></script> | ||||
| <script type="text/javascript" src="materials.js"></script> | <script type="text/javascript" src="materials.js"></script> | ||||
| <script type="text/javascript" src="poll.js"></script> | |||||
| <script type="text/javascript" src="api.js"></script> | <script type="text/javascript" src="api.js"></script> | ||||
| <script type="text/javascript" src="curve.js"></script> | <script type="text/javascript" src="curve.js"></script> | ||||
| <script type="text/javascript" src="graph.js"></script> | <script type="text/javascript" src="graph.js"></script> | ||||
| @@ -1,46 +1,58 @@ | |||||
| var mouse = {}; | |||||
| var interaction = {}; | |||||
| interaction.raycaster = new THREE.Raycaster(); | |||||
| interaction.xyplane = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0); | |||||
| // Gets a reference to the node nearest to the mouse cursor | // Gets a reference to the node nearest to the mouse cursor | ||||
| function nearestNode() { | |||||
| raycaster.setFromCamera(mouse, camera); | |||||
| interaction.nearestNode = function() { | |||||
| this.raycaster.setFromCamera(mouse, camera); | |||||
| for (var i = 0; i < nodeGeometry.vertices.length; ++i) { | for (var i = 0; i < nodeGeometry.vertices.length; ++i) { | ||||
| if (raycaster.ray.distanceSqToPoint(nodeGeometry.vertices[i]) < 0.01) { | |||||
| var v = nodeGeometry.vertices[i]; | |||||
| if (this.raycaster.ray.distanceSqToPoint(v) < 0.01) { | |||||
| return i; | return i; | ||||
| } | } | ||||
| } | } | ||||
| return undefined; | return undefined; | ||||
| } | |||||
| }; | |||||
| // Find out: what is the mouse pointing at? | // Find out: what is the mouse pointing at? | ||||
| function checkIntersections() { | |||||
| interaction.checkIntersections = function() { | |||||
| var new_selection = nearestNode(); | var new_selection = nearestNode(); | ||||
| if (new_selection != selection) { | |||||
| selection = new_selection; | |||||
| info.className = selection ? "visible" : "hidden"; | |||||
| info.innerHTML = selection ? nodeGeometry.labels[new_selection] : info.innerHTML; | |||||
| if (new_selection != this.selection) { | |||||
| this.selection = new_selection; | |||||
| info.className = this.selection ? "visible" : "hidden"; | |||||
| info.innerHTML = this.selection ? nodeGeometry.labels[new_selection] : info.innerHTML; | |||||
| render(); | render(); | ||||
| } | } | ||||
| } | |||||
| }; | |||||
| // Update the mouse position tracker | // Update the mouse position tracker | ||||
| function onMouseMove(event) { | |||||
| interaction.onMouseMove = function(event) { | |||||
| mouse.wasClick = false; | mouse.wasClick = false; | ||||
| mouse.absx = event.clientX; | mouse.absx = event.clientX; | ||||
| mouse.absy = event.clientY; | mouse.absy = event.clientY; | ||||
| mouse.x = (event.clientX / window.innerWidth) * 2 - 1; | mouse.x = (event.clientX / window.innerWidth) * 2 - 1; | ||||
| mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; | mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; | ||||
| w = 200; | |||||
| h = 15; | |||||
| info.style.top = mouse.absy - h - 40 + "px"; | |||||
| info.style.left = mouse.absx - w / 2 + "px"; | |||||
| checkIntersections(); | |||||
| } | |||||
| //w = 200; //h = 15; //info.style.top = mouse.absy - h - 40 + "px"; //info.style.left = mouse.absx - w / 2 + "px"; //checkIntersections(); | |||||
| }; | |||||
| // Add qubits or whatever | |||||
| function onClick(event){ | |||||
| if (!selection){return;} | |||||
| console.log(nodeGeometry.vertices[selection]); | |||||
| qubits.geometry.dynamic = true; | |||||
| qubits.geometry.vertices.push(nodeGeometry.vertices[selection].clone()); | |||||
| qubits.geometry.verticesNeedUpdate = true; | |||||
| // Try to add a qubit at the current mouse position | |||||
| interaction.addQubitAtMouse = function(event) { | |||||
| this.raycaster.setFromCamera(mouse, camera); | |||||
| var intersection = this.raycaster.ray.intersectPlane(this.plane); | |||||
| intersection.x = Math.round(intersection.x); | |||||
| intersection.y = Math.round(intersection.y); | |||||
| abj.add_node(Object.keys(vops).length, { | |||||
| "position": intersection | |||||
| }); | |||||
| updateScene(); | |||||
| } | } | ||||
| interaction.bind = function() { | |||||
| var el = renderer.domElement; | |||||
| el.addEventListener("mousedown", this.onMouseDown); | |||||
| el.addEventListener("mouseup", this.onMouseDown); | |||||
| el.addEventListener("mousemove", this.onMouseMove); | |||||
| }; | |||||
| @@ -9,7 +9,7 @@ window.onload = init; | |||||
| // Clear the whole scene | // Clear the whole scene | ||||
| function makeScene() { | function makeScene() { | ||||
| var myScene = new THREE.Scene(); | var myScene = new THREE.Scene(); | ||||
| var grid = new THREE.GridHelper(20, 2); | |||||
| var grid = new THREE.GridHelper(10, 1); | |||||
| grid.rotation.x = Math.PI/2; | grid.rotation.x = Math.PI/2; | ||||
| grid.setColors(0xdddddd, 0xeeeeee); | grid.setColors(0xdddddd, 0xeeeeee); | ||||
| myScene.add(grid); | myScene.add(grid); | ||||
| @@ -34,31 +34,6 @@ function onWindowResize(evt){ | |||||
| function bind_events() { | function bind_events() { | ||||
| window.addEventListener("resize", onWindowResize, false); | window.addEventListener("resize", onWindowResize, false); | ||||
| renderer.domElement.addEventListener("mousedown", function (event) { | |||||
| var mouse = new THREE.Vector2(); // create once and reuse | |||||
| mouse.x = ( event.clientX / renderer.domElement.width ) * 2 - 1; | |||||
| mouse.y = - ( event.clientY / renderer.domElement.height ) * 2 + 1; | |||||
| mouseprevpos.x = mouse.x; | |||||
| mouseprevpos.y = mouse.y; | |||||
| }); | |||||
| renderer.domElement.addEventListener("mouseup", function (event) { | |||||
| var mouse = new THREE.Vector2(); // create once and reuse | |||||
| mouse.x = ( event.clientX / renderer.domElement.width ) * 2 - 1; | |||||
| mouse.y = - ( event.clientY / renderer.domElement.height ) * 2 + 1; | |||||
| if (mouse.x != mouseprevpos.x || mouse.y != mouseprevpos.y ){return;} | |||||
| var raycaster = new THREE.Raycaster(); // create once and reuse | |||||
| raycaster.setFromCamera( mouse, camera ); | |||||
| var plane = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0); | |||||
| var intersection = raycaster.ray.intersectPlane(plane); | |||||
| console.log(intersection); | |||||
| intersection.x = Math.round(intersection.x); | |||||
| intersection.y = Math.round(intersection.y); | |||||
| add_node(Object.keys(vops).length, {"position":intersection}); | |||||
| updateScene(); | |||||
| }); | |||||
| controls.addEventListener("change", render); | controls.addEventListener("change", render); | ||||
| } | } | ||||
| @@ -76,14 +51,11 @@ function init() { | |||||
| loadMaterials(); | loadMaterials(); | ||||
| // Camera, controls, raycaster | // Camera, controls, raycaster | ||||
| camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.3, 100); | |||||
| camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.3, 1000); | |||||
| controls = new THREE.OrbitControls(camera); | controls = new THREE.OrbitControls(camera); | ||||
| // Center the camera | |||||
| // TODO: frustrum | |||||
| controls.center.set(0, 0, 0); | controls.center.set(0, 0, 0); | ||||
| controls.rotateSpeed = 0.2; | controls.rotateSpeed = 0.2; | ||||
| camera.position.set(0, 0, 40); | |||||
| camera.position.set(0, 0, 20); | |||||
| // Run | // Run | ||||
| bind_events(); | bind_events(); | ||||
| @@ -1,21 +0,0 @@ | |||||
| function poll() { | |||||
| var ws = new WebSocket("ws://localhost:5001"); | |||||
| ws.onopen = function() | |||||
| { | |||||
| console.log("Connected to server."); | |||||
| }; | |||||
| ws.onmessage = function (evt) | |||||
| { | |||||
| var new_state = JSON.parse(evt.data); | |||||
| vops = new_state.vops; | |||||
| ngbh = new_state.ngbh; | |||||
| updateScene(); | |||||
| }; | |||||
| ws.onclose = function() | |||||
| { | |||||
| console.log("Connection was closed."); | |||||
| }; | |||||
| } | |||||