@@ -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."); | |||||
}; | |||||
} | |||||