var version = 82; var baseLocation = "http://dynamoidapps.com/HighFidelity/Cosm/"; var cellLayout; assignVariables(); //(2000, 2000, 2000), //(18000, 2000, 18000), //(2000, 18000, 18000), //(18000,18000, 2000) var locations = { cellLayout:[{x:4000,y:4000,z:4000},{x:4276.6, y:4203.3, z:5405.6}, 2000], cells:[{x:15000,y:15000,z:15000},{x:15001,y:15001,z:15001}, 400], ribosome:[{x:4000, y:15000, z:4000},{x:3000, y:15000, z:4000}, 2000], hexokinase:[{x:4000, y:4000, z:15000},{x:3000, y:4000, z:15000}, 2000], exitHexokinase:[{x:4000, y:4000, z:4000},{x:4240, y:4019, z:4874}, 2000], exitRibosome:[{x:4000, y:4000, z:4000},{x:3962, y:3992, z:4342}, 2000] }; var scenes = [ { name: "CellLayout", objects: cellLayout, location: locations.cellLayout[0], zone: { dimensions:{x:10000,y:10000,z:10000}, light:{r:247,g:233,b:220}, intensity:1.3, ambient: 0.6, sun:true, skybox: "skybox_cosmos_cross" }, instances:[ { model:"translation", dimensions:{x:10,y:16,z:10}, offset:{x:0,y:0,z:0}, radius:300, number:15, userData: JSON.stringify({ target:{x:4000, y:15000, z:4000}, location:{x:3000, y:15000, z:4000} }), script:"zoom", visible:true }, { model:"vesicle", dimensions:{x:60,y:60,z:60}, randomSize: 10, offset:{x:0,y:0,z:0}, radius:1000, number:45, userData:"", script:"", visible:true }, {//golgi vesicles model:"vesicle", dimensions:{x:10,y:10,z:10}, randomSize: 10, offset:{x:-319,y:66,z:976}, radius:140, number:20, userData:"", script:"", visible:true }, {//golgi vesicles model:"vesicle", dimensions:{x:15,y:15,z:15}, randomSize: 10, offset:{x:-319,y:66,z:976}, radius:115, number:30, userData:"", script:"", visible:true }, { model:"vesicle", dimensions:{x:50,y:50,z:50}, randomSize: 10, offset:{x:0,y:0,z:0}, radius:600, number:45, userData:"", script:"", visible:true }, {//outer vesicles model:"vesicle", dimensions:{x:60,y:60,z:60}, randomSize: 10, offset:{x:0,y:0,z:0}, radius:1600, number:65, userData:"", script:"", visible:true }, {//outer vesicles model:"vesicle", dimensions:{x:40,y:40,z:40}, randomSize: 10, offset:{x:0,y:0,z:0}, radius:1400, number:65, userData:"", script:"", visible:true }, {//outer vesicles model:"vesicle", dimensions:{x:80,y:80,z:80}, randomSize: 10, offset:{x:0,y:0,z:0}, radius:1800, number:65, userData:"", script:"", visible:true }, {//wigglies model:"wiggly", dimensions:{x:320,y:40,z:160}, randomSize: 10, offset:{x:0,y:0,z:0}, radius:1800, number:50, userData:"", script:"", visible:true }, {//wigglies model:"wiggly", dimensions:{x:640,y:80,z:320}, randomSize: 10, offset:{x:0,y:0,z:0}, radius:2100, number:50, userData:"", script:"", visible:true }, { model:"hexokinase", dimensions:{x:3,y:4,z:3}, randomSize: 10, offset:{x:236,y:8,z:771}, radius:80, number:25, userData: JSON.stringify({ target:{x:4000, y:4000, z:15000}, location:{x:3000, y:4000, z:15000} }), script:"zoom", visible:true }, { model:"pfructo_kinase", dimensions:{x:3,y:4,z:3}, randomSize: 10, offset:{x:236,y:8,z:771}, radius:60, number:25, userData: "", script:"", visible:true }, { model:"glucoseisomerase", dimensions:{x:3,y:4,z:3}, randomSize: 10, offset:{x:236,y:8,z:771}, radius:70, number:25, userData: "", script:"", visible:true } ], boundary: { radius: locations.cellLayout[2], center: locations.cellLayout[0], location: locations.cells[1], target: locations.cells[0] } }, { name:"Cells", objects:"", location: {x:15000,y:15000,z:15000}, zone: { dimensions:{x:4000,y:4000,z:4000}, light:{r:255,g:200, b:200}, intensity:0.6, ambient: 0.4, sun:true, skybox: "cells_skybox_cross" }, instances:[{ model:"Cell", dimensions:{x:400,y:450,z:400}, offset:{x:0,y:0,z:0}, radius:500, number:10, script: "", visible:true }], boundary: { radius: locations.cells[2], center: locations.cells[0], location: locations.cellLayout[1], target: locations.cellLayout[0] } }, { name:"Ribosome", objects:"", location: {x:4000, y:15000, z:4000}, zone: { dimensions:{x:6000,y:6000,z:6000}, light:{r:255,g:255,b:255}, intensity:0.6, ambient: 0.4, sun:true, skybox: "ribosome_skybox" }, instances:[ { model:"translation_highres", dimensions:{x:3000,y:3000,z:1200}, offset:{x:0,y:0,z:0}, radius:0, number:1, userData:"", script: "", visible:true } ], boundary: { radius: locations.ribosome[2], center: locations.ribosome[0], location: locations.exitRibosome[1], target: locations.exitRibosome[0] } }, { name:"Hexokinase", objects:"", location: {x:4000, y:4000, z:15000}, zone: { dimensions:{x:6000,y:6000,z:6000}, light:{r:255,g:255,b:255}, intensity:0.6, ambient: 0.4, sun:true, skybox: "hexokinase_skybox" }, instances:[ { model:"hexokinase_highres", dimensions:{x:1200,y:1200,z:1200}, offset:{x:0,y:0,z:0}, radius:0, number:1, userData:"", script: "", visible:true } ], boundary: { radius: locations.hexokinase[2], center: locations.hexokinase[0], location: locations.exitHexokinase[1], target: locations.exitHexokinase[0] } } ]; var mtEndURL = "Tubulin/tubulin.fbx?"+version; var mtEndDimensions = {x:10, y:10, z:20}; function ImportScene(scene) { var sceneDataLines = scene.objects.split(";"); for (var i = 1; i < sceneDataLines.length; i++) { var data = sceneDataLines[i].split(","); var posX = Number(data[1]) + scene.location.x; var posY = Number(data[2]) + scene.location.y; var posZ = Number(data[3]) + scene.location.z; var url = baseLocation + scene.name + "/" + data[0] + ".fbx?" + version; var position = {x:posX, y:posY, z:posZ}; var dimensions = {x:data[4], y:data[5], z:data[6]}; var rotation = Quat.fromPitchYawRollDegrees(0,0,0); CreateEntity(data[0], position, rotation, dimensions, url, ".js", "", true); } if (scene.name == "CellLayout") { MakeMTEnds(scene); } //create zone and instances CreateZone(scene); CreateInstances(scene); CreateBoundary(scene); print("done " + scene.name); } function CreateBoundary (scene) { var pts = getEvenlyDistributedPointsOnSphere(); for (var i = 0; i < pts.length; i++) { var boundPos = { x: scene.boundary.center.x + scene.boundary.radius * pts[i].x, y: scene.boundary.center.y + scene.boundary.radius * pts[i].y, z: scene.boundary.center.z + scene.boundary.radius * pts[i].z }; var script = "zoom.js?" + version; var dimensions = {x: 0.6 * scene.boundary.radius, y: 0.6 * scene.boundary.radius, z: 100}; var boundRot = getLookRotation(boundPos, scene.boundary.center); var data = JSON.stringify({ target:scene.boundary.target, location:scene.boundary.location }); createBound(boundPos, boundRot, dimensions, script, data); } } function getLookRotation (loc, targetPos) { var direction = Vec3.normalize(Vec3.subtract(loc, targetPos)); var pitch = Quat.angleAxis(Math.asin(-direction.y) * 180.0 / Math.PI, {x:1, y:0, z:0}); var yaw = Quat.angleAxis(Math.atan2(direction.x, direction.z) * 180.0 / Math.PI, {x:0, y:1, z:0}); return Quat.multiply(yaw, pitch); } function createBound (boundPos, boundRot, dimensions, script, userData) { Entities.addEntity({ type: "Sphere", name: "boundary", color: { red: 200, green: 0, blue: 0 }, position: boundPos, rotation: boundRot, dimensions: dimensions, visible: false, userData: userData, script: baseLocation + "Scripts/" + script, ignoreForCollisions:true }); print("created BOUNDARY at (" + boundPos.x + ", "+ boundPos.y + ", " + boundPos.z + ")"); } function getEvenlyDistributedPointsOnSphere () { var numPoints = 80; var points = []; var inc = Math.PI * (3 - Math.sqrt(5)); var off = 2 / numPoints; for (var i = 0; i < numPoints; i++) { var y = i * off - 1 + (off / 2); var r = Math.sqrt(1 - y * y); var phi = i * inc; points[i] = {x: Math.cos(phi) * r, y: y, z: Math.sin(phi) * r}; } return points; } function deleteAllInRadius (position, radius) { var n = 0; var arrayFound = Entities.findEntities(position, radius); for (var i = 0; i < arrayFound.length; i++) { Entities.deleteEntity(arrayFound[i]); Entities.deletingEntity(arrayFound[i]); } // print("deleted " + arrayFound.length + " entities"); } function CreateInstances(scene){ for (var i=0; i < scene.instances.length; i++){ for (var j=0; j