// Copyright 2016 High Fidelity, Inc.////// Distributed under the Apache License, Version 2.0.// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html// var numDynein = 2;var numKinesin = 2;var percentOnMainMT = 100; baseLocation = "https://hifi-content/DomainContent/CellScience/" var WORLD_OFFSET = { x: 0, y: 0, z: 0} var WORLD_SCALE_AMOUNT = 1.0; function offsetVectorToWorld(vector) { var newVector; newVector = Vec3.sum(vector, WORLD_OFFSET); print('JBP NEW VECTOR IS:: ' + JSON.stringify(newVector)) return newVector} var USE_LOCAL_HOST = false; var basePosition = offsetVectorToWorld({ x: 3000, y: 13500, z: 3000}); EntityViewer.setPosition(basePosition);EntityViewer.setKeyholeRadius(60000);var octreeQueryInterval = Script.setInterval(function() { EntityViewer.queryOctree();}, 200); var dyneinURL = this.baseLocation + "MotorProteins/dynein.fbx";var dyneinDimensions = { x: 11.75, y: 25.05, z: 11.75};var kinesinURL = this.baseLocation + "MotorProteins/kinesin.fbx";var kinesinDimensions = { x: 17.66 * 1.5, y: 30.52 * 1.5, z: 17.02 * 1.5};var scriptURL = this.baseLocation + "Scripts/clickToRideAndLook.js?" + Math.random(); var t = 0;var tInc = 0.001;var sceneOffset = offsetVectorToWorld({ x: 3000, y: 13500, z: 3000}); var yOffset = { dynein: 16, kinesin: -28}; var motorProteins = [];var terms; var secondaryInit = false; function deleteAllMotorProteins() { var position = offsetVectorToWorld({ x: 3280, y: 13703, z: 4405 }); if (secondaryInit === true) { return; } if (EntityViewer.getOctreeElementsCount() <= 1) { Script.setTimeout(function() { deleteAllMotorProteins(); }, 1000) return; } var results = Entities.findEntities(position, 2000); var mpCount = 0; results.forEach(function(r) { var name = Entities.getEntityProperties(r, 'name').name; if (name.indexOf('Hifi-Motor-Protein-Anchor') > -1) { // print('Script.clearTimeout DELETING A MOTOR PROTEIN::' + r) Entities.deleteEntity(r); } }) makeAll(); secondaryInit = true; } function makeAll() { // print('CREATING MOTOR PROTEINS') var segment; var segments = shuffleSegments(); var lastSegment = []; for (var i = 0; i < curves.length; i++) { lastSegment[lastSegment.length] = 0; } var mt = curves.length - 1; var isDynein = true; var model = dyneinURL; var start = 3; var dimensions = dyneinDimensions; var type = "dynein"; var numOnMain = 0; for (var i = 0; i < numDynein + numKinesin; i++) { if (i == numDynein) { isDynein = false; model = kinesinURL; start = 0; dimensions = kinesinDimensions; type = "kinesin"; mt = curves.length - 1; } if ((isDynein && (i > numDynein * percentOnMainMT / 100 - 1 || numOnMain >= curves[curves.length - 1].length / 2)) || (!isDynein && (i - numDynein > numKinesin * percentOnMainMT / 100 - 1 || numOnMain >= curves[curves.length - 1].length))) { mt = Math.floor((curves.length - 1) * Math.random()); } else { numOnMain++; } segment = segments[mt][lastSegment[mt]]; lastSegment[mt]++; if (segment != null) { motorProteins[motorProteins.length] = { isDynein: isDynein, curve: mt, segment: segment, protein: Entities.addEntity({ type: "Model", name: 'Hifi-Motor-Protein-Anchor-' + type, modelURL: model, position: getPosInScene(curves[mt][segment][start]), dimensions: dimensions, script: scriptURL, animationURL: model, animationIsPlaying: true, animationSettings: JSON.stringify({ hold: false, loop: true, running: true, startAutomatically: true }), visible: true, userData: JSON.stringify({ grabbableKey: { grabbable: false }, isDynein: isDynein, baseURL: baseLocation }), }) }; // print('MADE A MOTOR PROTEIN!!!') } } Script.clearInterval(octreeQueryInterval); // print("made " + numDynein + " dyneins and " + numKinesin + " kinesins");} function shuffleSegments() { var segs = []; var temp = 0; for (var curve = 0; curve < curves.length; curve++) { var s = []; for (var i = 0; i < curves[curve].length; i++) { s[s.length] = i; } for (var i = 0; i < curves[curve].length; i++) { var j = Math.floor((curves[curve].length - i) * Math.random()) + i; temp = s[i]; s[i] = s[j]; s[j] = temp; } segs[curve] = s; } return segs;} var initialized = false function update(deltaTime) { if (!initialized) { print("checking for servers..."); if (Entities.serversExist() && Entities.canRez()) { print("servers exist -- makeAll..."); Entities.setPacketsPerSecond(6000); print("PPS:" + Entities.getPacketsPerSecond()); Script.setTimeout(function() { //print('SETTING TIMEOUT') deleteAllMotorProteins() }, 10000) initialized = true; } return; } t += tInc; var dir = -1; calculateTerms(); var newSegment = false; if (t >= 1) { t = 0; newSegment = true; } for (var i = 0; i < motorProteins.length; i++) { if (newSegment) { if (motorProteins[i].isDynein) { motorProteins[i].segment--; if (motorProteins[i].segment < 0) { motorProteins[i].segment = curves[motorProteins[i].curve].length - 1; } } else { motorProteins[i].segment++; if (motorProteins[i].segment > curves[motorProteins[i].curve].length - 1) { motorProteins[i].segment = 0; } } } if (i == numDynein) { dir = 1; } var newPos = getPositionOnCurve(dir, curves[motorProteins[i].curve][motorProteins[i].segment]); var newRot = getRotationOnCurve(dir, curves[motorProteins[i].curve][motorProteins[i].segment]); Entities.editEntity(motorProteins[i].protein, { type: "Model", position: newPos, rotation: newRot }); }} function calculateTerms() { terms = { pos: [ (1 - t) * (1 - t) * (1 - t), 3 * t * (1 - t) * (1 - t), 3 * t * t * (1 - t), t * t * t ], rot: [ 3 * (1 - t) * (1 - t), 6 * t * (1 - t), 3 * t * t ] }} function getPositionOnCurve(direction, segment) { var offset = yOffset.kinesin; var i = 0; var inc = 1; if (direction < 0) { offset = yOffset.dynein; i = 3; inc = -1; } return { x: terms.pos[i] * addOffset("x", segment[0].x) + terms.pos[i + inc] * addOffset("x", segment[1].x) + terms.pos[i + 2 * inc] * addOffset("x", segment[2].x) + terms.pos[i + 3 * inc] * addOffset("x", segment[3].x), y: terms.pos[i] * addOffset("y", segment[0].y) + terms.pos[i + inc] * addOffset("y", segment[1].y) + terms.pos[i + 2 * inc] * addOffset("y", segment[2].y) + terms.pos[i + 3 * inc] * addOffset("y", segment[3].y) + offset, z: terms.pos[i] * addOffset("z", segment[0].z) + terms.pos[i + inc] * addOffset("z", segment[1].z) + terms.pos[i + 2 * inc] * addOffset("z", segment[2].z) + terms.pos[i + 3 * inc] * addOffset("z", segment[3].z) };} function getRotationOnCurve(direction, segment) { var i = 0; var inc = 1; if (direction < 0) { i = 2; inc = -1; } var tangent = Vec3.normalize({ x: terms.pos[i] * (addOffset("x", segment[1].x) - addOffset("x", segment[0].x)) + terms.pos[i + inc] * (addOffset("x", segment[2].x) - addOffset("x", segment[1].x)) + terms.pos[i + 2 * inc] * (addOffset("x", segment[3].x) - addOffset("x", segment[2].x)), y: terms.pos[i] * (addOffset("y", segment[1].y) - addOffset("y", segment[0].y)) + terms.pos[i + inc] * (addOffset("y", segment[2].y) - addOffset("y", segment[1].y)) + terms.pos[i + 2 * inc] * (addOffset("y", segment[3].y) - addOffset("y", segment[2].y)), z: terms.pos[i] * (addOffset("z", segment[1].z) - addOffset("z", segment[0].z)) + terms.pos[i + inc] * (addOffset("z", segment[2].z) - addOffset("z", segment[1].z)) + terms.pos[i + 2 * inc] * (addOffset("z", segment[3].z) - addOffset("z", segment[2].z)) }); var pitch = Quat.angleAxis(Math.asin(direction * -tangent.y) * 180.0 / Math.PI, { x: 1, y: 0, z: 0 }); var yaw = Quat.angleAxis(Math.atan2(direction * tangent.x, direction * tangent.z) * 180.0 / Math.PI, { x: 0, y: 1, z: 0 }); var roll = Quat.angleAxis(180, { x: 0, y: 0, z: 1 }); if (direction < 0) { return Quat.multiply(yaw, pitch); } else { return Quat.multiply(Quat.multiply(yaw, pitch), roll); }} function getPosInScene(pos) { return { x: addOffset("x", pos.x), y: addOffset("y", pos.y), z: addOffset("z", pos.z) };} function addOffset(dimension, n) { var offset = sceneOffset.x; if (dimension == "y") { offset = sceneOffset.y; } else if (dimension == "z") { offset = sceneOffset.z; } return n + offset;} function unload() { print("unload motorProteinController"); print(" PPS:" + Entities.getPacketsPerSecond()); Script.update.disconnect(this.update); for (var i = 0; i < motorProteins.length; i++) { Entities.deleteEntity(motorProteins[i].protein); } print("pending packets:" + Entities.packetsToSendCount());}var curves = [ [ [{ x: -495.1377539, y: 447.6999851, z: 67.71881918 }, { x: -459.8060244, y: 430.0299175, z: 58.61231833 }, { x: -430.0561194, y: 393.4288088, z: 58.18999042 }, { x: -396.3439356, y: 368.0364237, z: 55.07196935 }], [{ x: -396.3439356, y: 368.0364237, z: 55.07196935 }, { x: -371.0597978, y: 348.9921349, z: 52.73345354 }, { x: -343.5468781, y: 336.252753, z: 48.87861033 }, { x: -313.7608397, y: 326.6089999, z: 39.67528364 }], [{ x: -313.7608397, y: 326.6089999, z: 39.67528364 }, { x: -283.2951845, y: 316.7452089, z: 30.26196812 }, { x: -250.4514975, y: 310.1199219, z: 15.25331604 }, { x: -221.5619658, y: 302.4919751, z: 6.625614572 }], [{ x: -221.5619658, y: 302.4919751, z: 6.625614572 }, { x: -191.9958819, y: 294.6853925, z: -2.204135545 }, { x: -166.5713233, y: 285.8286384, z: -4.350569745 }, { x: -145.8284432, y: 264.5135505, z: -12.40980801 }], [{ x: -145.8284432, y: 264.5135505, z: -12.40980801 }, { x: -133.0044557, y: 251.3358039, z: -17.39231622 }, { x: -121.9698772, y: 233.3962915, z: -24.63478854 }, { x: -111.9765579, y: 220.2156326, z: -34.7149099 }], [{ x: -111.9765579, y: 220.2156326, z: -34.7149099 }, { x: -97.01720198, y: 200.4850343, z: -49.80420286 }, { x: -84.39111651, y: 191.4181523, z: -71.25214612 }, { x: -63.5035664, y: 185.1529929, z: -93.19394907 }], [{ x: -63.5035664, y: 185.1529929, z: -93.19394907 }, { x: -44.42551249, y: 179.4305865, z: -113.2349255 }, { x: -18.45538061, y: 176.0455007, z: -133.6879014 }, { x: 2.988566987, y: 160.6771648, z: -149.4073571 }], [{ x: 2.988566987, y: 160.6771648, z: -149.4073571 }, { x: 16.05317726, y: 151.3140885, z: -158.9843512 }, { x: 27.4377628, y: 137.503081, z: -166.8043619 }, { x: 39.12809334, y: 129.893086, z: -175.4108522 }] ], [ [{ x: -502.782479, y: 419.211002, z: 1.244313114 }, {Lines 1–500 of 8293. Load more
// Copyright 2016 High Fidelity, Inc. // // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // var numDynein = 2; var numKinesin = 2; var percentOnMainMT = 100; baseLocation = "https://hifi-content/DomainContent/CellScience/" var WORLD_OFFSET = { x: 0, y: 0, z: 0 } var WORLD_SCALE_AMOUNT = 1.0; function offsetVectorToWorld(vector) { var newVector; newVector = Vec3.sum(vector, WORLD_OFFSET); print('JBP NEW VECTOR IS:: ' + JSON.stringify(newVector)) return newVector } var USE_LOCAL_HOST = false; var basePosition = offsetVectorToWorld({ x: 3000, y: 13500, z: 3000 }); EntityViewer.setPosition(basePosition); EntityViewer.setKeyholeRadius(60000); var octreeQueryInterval = Script.setInterval(function() { EntityViewer.queryOctree(); }, 200); var dyneinURL = this.baseLocation + "MotorProteins/dynein.fbx"; var dyneinDimensions = { x: 11.75, y: 25.05, z: 11.75 }; var kinesinURL = this.baseLocation + "MotorProteins/kinesin.fbx"; var kinesinDimensions = { x: 17.66 * 1.5, y: 30.52 * 1.5, z: 17.02 * 1.5 }; var scriptURL = this.baseLocation + "Scripts/clickToRideAndLook.js?" + Math.random(); var t = 0; var tInc = 0.001; var sceneOffset = offsetVectorToWorld({ x: 3000, y: 13500, z: 3000 }); var yOffset = { dynein: 16, kinesin: -28 }; var motorProteins = []; var terms; var secondaryInit = false; function deleteAllMotorProteins() { var position = offsetVectorToWorld({ x: 3280, y: 13703, z: 4405 }); if (secondaryInit === true) { return; } if (EntityViewer.getOctreeElementsCount() <= 1) { Script.setTimeout(function() { deleteAllMotorProteins(); }, 1000) return; } var results = Entities.findEntities(position, 2000); var mpCount = 0; results.forEach(function(r) { var name = Entities.getEntityProperties(r, 'name').name; if (name.indexOf('Hifi-Motor-Protein-Anchor') > -1) { // print('Script.clearTimeout DELETING A MOTOR PROTEIN::' + r) Entities.deleteEntity(r); } }) makeAll(); secondaryInit = true; } function makeAll() { // print('CREATING MOTOR PROTEINS') var segment; var segments = shuffleSegments(); var lastSegment = []; for (var i = 0; i < curves.length; i++) { lastSegment[lastSegment.length] = 0; } var mt = curves.length - 1; var isDynein = true; var model = dyneinURL; var start = 3; var dimensions = dyneinDimensions; var type = "dynein"; var numOnMain = 0; for (var i = 0; i < numDynein + numKinesin; i++) { if (i == numDynein) { isDynein = false; model = kinesinURL; start = 0; dimensions = kinesinDimensions; type = "kinesin"; mt = curves.length - 1; } if ((isDynein && (i > numDynein * percentOnMainMT / 100 - 1 || numOnMain >= curves[curves.length - 1].length / 2)) || (!isDynein && (i - numDynein > numKinesin * percentOnMainMT / 100 - 1 || numOnMain >= curves[curves.length - 1].length))) { mt = Math.floor((curves.length - 1) * Math.random()); } else { numOnMain++; } segment = segments[mt][lastSegment[mt]]; lastSegment[mt]++; if (segment != null) { motorProteins[motorProteins.length] = { isDynein: isDynein, curve: mt, segment: segment, protein: Entities.addEntity({ type: "Model", name: 'Hifi-Motor-Protein-Anchor-' + type, modelURL: model, position: getPosInScene(curves[mt][segment][start]), dimensions: dimensions, script: scriptURL, animationURL: model, animationIsPlaying: true, animationSettings: JSON.stringify({ hold: false, loop: true, running: true, startAutomatically: true }), visible: true, userData: JSON.stringify({ grabbableKey: { grabbable: false }, isDynein: isDynein, baseURL: baseLocation }), }) }; // print('MADE A MOTOR PROTEIN!!!') } } Script.clearInterval(octreeQueryInterval); // print("made " + numDynein + " dyneins and " + numKinesin + " kinesins"); } function shuffleSegments() { var segs = []; var temp = 0; for (var curve = 0; curve < curves.length; curve++) { var s = []; for (var i = 0; i < curves[curve].length; i++) { s[s.length] = i; } for (var i = 0; i < curves[curve].length; i++) { var j = Math.floor((curves[curve].length - i) * Math.random()) + i; temp = s[i]; s[i] = s[j]; s[j] = temp; } segs[curve] = s; } return segs; } var initialized = false function update(deltaTime) { if (!initialized) { print("checking for servers..."); if (Entities.serversExist() && Entities.canRez()) { print("servers exist -- makeAll..."); Entities.setPacketsPerSecond(6000); print("PPS:" + Entities.getPacketsPerSecond()); Script.setTimeout(function() { //print('SETTING TIMEOUT') deleteAllMotorProteins() }, 10000) initialized = true; } return; } t += tInc; var dir = -1; calculateTerms(); var newSegment = false; if (t >= 1) { t = 0; newSegment = true; } for (var i = 0; i < motorProteins.length; i++) { if (newSegment) { if (motorProteins[i].isDynein) { motorProteins[i].segment--; if (motorProteins[i].segment < 0) { motorProteins[i].segment = curves[motorProteins[i].curve].length - 1; } } else { motorProteins[i].segment++; if (motorProteins[i].segment > curves[motorProteins[i].curve].length - 1) { motorProteins[i].segment = 0; } } } if (i == numDynein) { dir = 1; } var newPos = getPositionOnCurve(dir, curves[motorProteins[i].curve][motorProteins[i].segment]); var newRot = getRotationOnCurve(dir, curves[motorProteins[i].curve][motorProteins[i].segment]); Entities.editEntity(motorProteins[i].protein, { type: "Model", position: newPos, rotation: newRot }); } } function calculateTerms() { terms = { pos: [ (1 - t) * (1 - t) * (1 - t), 3 * t * (1 - t) * (1 - t), 3 * t * t * (1 - t), t * t * t ], rot: [ 3 * (1 - t) * (1 - t), 6 * t * (1 - t), 3 * t * t ] } } function getPositionOnCurve(direction, segment) { var offset = yOffset.kinesin; var i = 0; var inc = 1; if (direction < 0) { offset = yOffset.dynein; i = 3; inc = -1; } return { x: terms.pos[i] * addOffset("x", segment[0].x) + terms.pos[i + inc] * addOffset("x", segment[1].x) + terms.pos[i + 2 * inc] * addOffset("x", segment[2].x) + terms.pos[i + 3 * inc] * addOffset("x", segment[3].x), y: terms.pos[i] * addOffset("y", segment[0].y) + terms.pos[i + inc] * addOffset("y", segment[1].y) + terms.pos[i + 2 * inc] * addOffset("y", segment[2].y) + terms.pos[i + 3 * inc] * addOffset("y", segment[3].y) + offset, z: terms.pos[i] * addOffset("z", segment[0].z) + terms.pos[i + inc] * addOffset("z", segment[1].z) + terms.pos[i + 2 * inc] * addOffset("z", segment[2].z) + terms.pos[i + 3 * inc] * addOffset("z", segment[3].z) }; } function getRotationOnCurve(direction, segment) { var i = 0; var inc = 1; if (direction < 0) { i = 2; inc = -1; } var tangent = Vec3.normalize({ x: terms.pos[i] * (addOffset("x", segment[1].x) - addOffset("x", segment[0].x)) + terms.pos[i + inc] * (addOffset("x", segment[2].x) - addOffset("x", segment[1].x)) + terms.pos[i + 2 * inc] * (addOffset("x", segment[3].x) - addOffset("x", segment[2].x)), y: terms.pos[i] * (addOffset("y", segment[1].y) - addOffset("y", segment[0].y)) + terms.pos[i + inc] * (addOffset("y", segment[2].y) - addOffset("y", segment[1].y)) + terms.pos[i + 2 * inc] * (addOffset("y", segment[3].y) - addOffset("y", segment[2].y)), z: terms.pos[i] * (addOffset("z", segment[1].z) - addOffset("z", segment[0].z)) + terms.pos[i + inc] * (addOffset("z", segment[2].z) - addOffset("z", segment[1].z)) + terms.pos[i + 2 * inc] * (addOffset("z", segment[3].z) - addOffset("z", segment[2].z)) }); var pitch = Quat.angleAxis(Math.asin(direction * -tangent.y) * 180.0 / Math.PI, { x: 1, y: 0, z: 0 }); var yaw = Quat.angleAxis(Math.atan2(direction * tangent.x, direction * tangent.z) * 180.0 / Math.PI, { x: 0, y: 1, z: 0 }); var roll = Quat.angleAxis(180, { x: 0, y: 0, z: 1 }); if (direction < 0) { return Quat.multiply(yaw, pitch); } else { return Quat.multiply(Quat.multiply(yaw, pitch), roll); } } function getPosInScene(pos) { return { x: addOffset("x", pos.x), y: addOffset("y", pos.y), z: addOffset("z", pos.z) }; } function addOffset(dimension, n) { var offset = sceneOffset.x; if (dimension == "y") { offset = sceneOffset.y; } else if (dimension == "z") { offset = sceneOffset.z; } return n + offset; } function unload() { print("unload motorProteinController"); print(" PPS:" + Entities.getPacketsPerSecond()); Script.update.disconnect(this.update); for (var i = 0; i < motorProteins.length; i++) { Entities.deleteEntity(motorProteins[i].protein); } print("pending packets:" + Entities.packetsToSendCount()); } var curves = [ [ [{ x: -495.1377539, y: 447.6999851, z: 67.71881918 }, { x: -459.8060244, y: 430.0299175, z: 58.61231833 }, { x: -430.0561194, y: 393.4288088, z: 58.18999042 }, { x: -396.3439356, y: 368.0364237, z: 55.07196935 }], [{ x: -396.3439356, y: 368.0364237, z: 55.07196935 }, { x: -371.0597978, y: 348.9921349, z: 52.73345354 }, { x: -343.5468781, y: 336.252753, z: 48.87861033 }, { x: -313.7608397, y: 326.6089999, z: 39.67528364 }], [{ x: -313.7608397, y: 326.6089999, z: 39.67528364 }, { x: -283.2951845, y: 316.7452089, z: 30.26196812 }, { x: -250.4514975, y: 310.1199219, z: 15.25331604 }, { x: -221.5619658, y: 302.4919751, z: 6.625614572 }], [{ x: -221.5619658, y: 302.4919751, z: 6.625614572 }, { x: -191.9958819, y: 294.6853925, z: -2.204135545 }, { x: -166.5713233, y: 285.8286384, z: -4.350569745 }, { x: -145.8284432, y: 264.5135505, z: -12.40980801 }], [{ x: -145.8284432, y: 264.5135505, z: -12.40980801 }, { x: -133.0044557, y: 251.3358039, z: -17.39231622 }, { x: -121.9698772, y: 233.3962915, z: -24.63478854 }, { x: -111.9765579, y: 220.2156326, z: -34.7149099 }], [{ x: -111.9765579, y: 220.2156326, z: -34.7149099 }, { x: -97.01720198, y: 200.4850343, z: -49.80420286 }, { x: -84.39111651, y: 191.4181523, z: -71.25214612 }, { x: -63.5035664, y: 185.1529929, z: -93.19394907 }], [{ x: -63.5035664, y: 185.1529929, z: -93.19394907 }, { x: -44.42551249, y: 179.4305865, z: -113.2349255 }, { x: -18.45538061, y: 176.0455007, z: -133.6879014 }, { x: 2.988566987, y: 160.6771648, z: -149.4073571 }], [{ x: 2.988566987, y: 160.6771648, z: -149.4073571 }, { x: 16.05317726, y: 151.3140885, z: -158.9843512 }, { x: 27.4377628, y: 137.503081, z: -166.8043619 }, { x: 39.12809334, y: 129.893086, z: -175.4108522 }] ], [ [{ x: -502.782479, y: 419.211002, z: 1.244313114 }, {