8293 lines · 189.4 KB · JavaScript
RawDownload
//  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.