| @@ -1,7 +1,10 @@ | |||
| var ngbh = {}; | |||
| var vops = {}; | |||
| var meta = {}; | |||
| var abj = {}; | |||
| abj.ngbh = {}; | |||
| abj.vops = {}; | |||
| abj.meta = {}; | |||
| ngbh = abj.ngbh; | |||
| vops = abj.vops; | |||
| meta = abj.meta; | |||
| abj.add_node = function(node, m) { | |||
| ngbh[node] = {}; | |||
| vops[node] = clifford.hadamard; | |||
| @@ -6,21 +6,21 @@ function updateScene() { | |||
| oldState = null; | |||
| 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); | |||
| 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 my_edges = edgelist(); | |||
| var my_edges = abj.edgelist(); | |||
| for (i=0; i < my_edges.length; ++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 end = meta[edge[1]].position; | |||
| var end = abj.meta[edge[1]].position; | |||
| var endpos = new THREE.Vector3(end[0], end[1], end[2]); | |||
| var newEdge = makeEdge(startpos, endpos); | |||
| edges.add(newEdge); | |||
| @@ -12,7 +12,6 @@ | |||
| <script type="text/javascript" src="three.js"></script> | |||
| <script type="text/javascript" src="libs.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="curve.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 | |||
| function nearestNode() { | |||
| raycaster.setFromCamera(mouse, camera); | |||
| interaction.nearestNode = function() { | |||
| this.raycaster.setFromCamera(mouse, camera); | |||
| 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 undefined; | |||
| } | |||
| }; | |||
| // Find out: what is the mouse pointing at? | |||
| function checkIntersections() { | |||
| interaction.checkIntersections = function() { | |||
| 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(); | |||
| } | |||
| } | |||
| }; | |||
| // Update the mouse position tracker | |||
| function onMouseMove(event) { | |||
| interaction.onMouseMove = function(event) { | |||
| mouse.wasClick = false; | |||
| mouse.absx = event.clientX; | |||
| mouse.absy = event.clientY; | |||
| mouse.x = (event.clientX / window.innerWidth) * 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 | |||
| function makeScene() { | |||
| 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.setColors(0xdddddd, 0xeeeeee); | |||
| myScene.add(grid); | |||
| @@ -34,31 +34,6 @@ function onWindowResize(evt){ | |||
| function bind_events() { | |||
| 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); | |||
| } | |||
| @@ -76,14 +51,11 @@ function init() { | |||
| loadMaterials(); | |||
| // 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); | |||
| // Center the camera | |||
| // TODO: frustrum | |||
| controls.center.set(0, 0, 0); | |||
| controls.rotateSpeed = 0.2; | |||
| camera.position.set(0, 0, 40); | |||
| camera.position.set(0, 0, 20); | |||
| // Run | |||
| 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."); | |||
| }; | |||
| } | |||