| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461 | /*The MIT License (MIT)Copyright (c) 2014-2020 Nikolai Suslov and the Krestianstvo.org project contributors. (https://github.com/NikolaySuslov/livecodingspace/blob/master/LICENSE.md)*/// VWF & Ohm model driverimport { Fabric } from '/core/vwf/fabric.js';import {skipjs} from "/drivers/model/rubik/lib/skip.js"import {Queue} from "/drivers/model/rubik/lib/queues.js"import {Color} from "/drivers/model/rubik/lib/colors.js"import {Twist} from "/drivers/model/rubik/lib/twists.js"import {Direction} from "/drivers/model/rubik/lib/directions.js"import {Fold} from "/drivers/model/rubik/lib/folds.js"import {Cubelet} from "/drivers/model/rubik/lib/cubelets.js"import {Group} from "/drivers/model/rubik/lib/groups.js"import {Slice} from "/drivers/model/rubik/lib/slices.js"import {Cube} from "/drivers/model/rubik/lib/cubes.js"class RubikModel extends Fabric {    constructor(module) {        console.log("RUBIK model constructor");        super(module, "Model");    }    factory() {        let _self_ = this;        return this.load( this.module,             {                // == Module Definition ====================================================================                        // -- pipeline -----------------------------------------------------------------------------                        // pipeline: [ log ], // vwf <=> log <=> scene                        // -- initialize ---------------------------------------------------------------------------                        initialize: function() {                                        let self = this;                              skipjs();                globalThis.Queue = Queue;                globalThis.Color = Color;                globalThis.Twist = Twist;                globalThis.Direction = Direction;                globalThis.Fold = Fold;                        globalThis.Cubelet = Cubelet;                globalThis.Group = Group;                globalThis.Slice = Slice;                        globalThis.Cube = Cube;                        if( globalThis.setupTasks )	{                    globalThis.setupTasks.forEach( function( task ){ task() })                }                                                                       this.state = {                        nodes: {},                        scenes: {},                        prototypes: {},                        createLocalNode: function (nodeID, childID, childExtendsID, childImplementsIDs,                            childSource, childType, childIndex, childName, callback) {                            return {                                "parentID": nodeID,                                "ID": childID,                                "extendsID": childExtendsID,                                "implementsIDs": childImplementsIDs,                                "source": childSource,                                "type": childType,                                "name": childName,                                "prototypes": undefined,                            };                        },                        isCubeNodeComponent: function (prototypes) {                            var found = false;                            if (prototypes) {                                for (var i = 0; i < prototypes.length && !found; i++) {                                    found = (prototypes[i] === "cubeModel.vwf");                                }                            }                            return found;                        },                        isCubeletNodeComponent: function (prototypes) {                            var found = false;                            if (prototypes) {                                for (var i = 0; i < prototypes.length && !found; i++) {                                    found = (prototypes[i] === "cubeletModel.vwf");                                }                            }                            return found;                        }                                                            };                            this.state.kernel = this.kernel.kernel.kernel;                            //this.state.kernel = this.kernel.kernel.kernel;                                    },                // == Model API ============================================================================                        // -- creatingNode -------------------------------------------------------------------------                        creatingNode: function( nodeID, childID, childExtendsID, childImplementsIDs,                    childSource, childType, childIndex, childName, callback /* ( ready ) */ ) {                            // If the parent nodeID is 0, this node is attached directly to the root and is therefore either                     // the scene or a prototype.  In either of those cases, save the uri of the new node                    var childURI = (nodeID === 0 ? childIndex : undefined);                    var appID = this.kernel.application();                            // If the node being created is a prototype, construct it and add it to the array of prototypes,                    // and then return                    var prototypeID = _self_.utility.ifPrototypeGetId(appID, this.state.prototypes, nodeID, childID);                    if (prototypeID !== undefined) {                                this.state.prototypes[prototypeID] = {                            parentID: nodeID,                            ID: childID,                            extendsID: childExtendsID,                            implementsID: childImplementsIDs,                            source: childSource,                            type: childType,                            name: childName                        };                        return;                    }                            var protos = _self_.getPrototypes(this.kernel, childExtendsID);                    //var kernel = this.kernel.kernel.kernel;                    var node;                            if (this.state.isCubeNodeComponent(protos)) {                                // Create the local copy of the node properties                        if (this.state.nodes[childID] === undefined) {                            this.state.nodes[childID] = this.state.createLocalNode(nodeID, childID, childExtendsID, childImplementsIDs,                                childSource, childType, childIndex, childName, callback);                        }                                node = this.state.nodes[childID];                        node.prototypes = protos;                                node.cube = new Cube(childName);                        node.cube.nodeID = childID;                        node.cube.kernel = this.state.kernel;                        // let jsModel = vwf.models['/core/vwf/model/javascript'].model;                        // let jsNode = jsModel.nodes[childID];                        // jsNode.cubeModel = node.cube;                        //node.aframeObj = createAFrameObject(node);                        //addNodeToHierarchy(node);                        //notifyDriverOfPrototypeAndBehaviorProps();                    }                    if (this.state.isCubeletNodeComponent(protos)) {                                // Create the local copy of the node properties                        if (this.state.nodes[childID] === undefined) {                            this.state.nodes[childID] = this.state.createLocalNode(nodeID, childID, childExtendsID, childImplementsIDs,                                childSource, childType, childIndex, childName, callback);                        }                                node = this.state.nodes[childID];                        node.prototypes = protos;                            }                },                        callingMethod: function( nodeID, methodName, methodParameters ) {                            //let self = this;                    let node = this.state.nodes[nodeID];                    if (node && node.cube) {                        // if (methodName == 'getCubeModel') {                    //    return node.cube                    // }                    if(methodName == "inspect"){                        node.cube.inspect();                        console.log(node.cube);                    }                                        if (methodName == 'isCubeTweening') {                        return node.cube.isTweening()                     }                    if (methodName == 'getCubeModelID') {                        return node.cube.id                     }                    if (methodName == 'getCubelet') {                        let cubelet = Object.assign({}, node.cube.cubelets[methodParameters[0]]);                        cubelet.cube = node.cube.id;                        return cubelet                                            }                    if(methodName == "setCubeletID"){                        node.cube.cubelets[methodParameters[0]].nodeID = methodParameters[1];                    }                    if (methodName == 'progressQueue') {                           if (node.cube.twistQueue.future.length > 0) {                                node.cube.twist(node.cube.twistQueue.do());                            }                     }                    if (methodName == 'undo') {                        //TODO:                 }                    if (methodName == 'twistAction') {                        let key = methodParameters[0];                        node.cube.twistQueue.add(key);                            // while (node.cube.twistQueue.future.length > 0) {                            //     node.cube.twist(node.cube.twistQueue.do());                            // }                    //node.cube.twist( node.cube.twistQueue.do() );                         }                    if (methodName == 'getCubelets') {                        var cubelets = [];                        node.cube.cubelets.forEach(el=>{                            let cubelet = {                                id: el.id.toString(),                                address: el.address,                                addressX: el.addressX,                                addressY: el.addressY,                                addressZ: el.addressZ                            }                            cubelets.push(cubelet)                        })                        return cubelets                     }                }                if(methodName == "cubeletsRemap"){                    let cubeletID = methodParameters[0];                    let cubeCallback = methodParameters[1]                                    node.cube.remap(cubeletID, cubeCallback)                                    }                // if (this.state.isCubeletNodeComponent(node.prototypes)){                                                       //     // if (methodName == 'getFaces') {                //     //     var faces = [];                //     //     node.cube.cubelets.forEach(el=>{                //     //         let cubelet = {                //     //             id: el.id.toString(),                //     //             address: el.address,                //     //             addressX: el.addressX,                //     //             addressY: el.addressY,                //     //             addressZ: el.addressZ                //     //         }                //     //         cubelets.push(cubelet)                //     //     })                //     //     return cubelets                //     // }                                                         // }                        },                 // -- initializingNode -------------------------------------------------------------------------                        initializingNode: function( nodeID, childID, childExtendsID, childImplementsIDs,                childSource, childType, childIndex, childName ) {                let node = this.state.nodes[childID];                if ( node ) {                    if (this.state.isCubeletNodeComponent(node.prototypes)) {                            console.log("CUBElet INitializing...");                                                        let props = this.state.kernel.getProperties(childID);                            let nodeCube = this.state.nodes[props.cubeNodeID];                            nodeCube.cube.cubelets[childName].nodeID = childID;                                                        // nodeCube.cube.cubelets[childName].address = props.address;                            // nodeCube.cube.cubelets[childName].cubeletID = props.cubeletID;                    }                    if (this.state.isCubeNodeComponent(node.prototypes)) {                        console.log("CUBE INitializing...");                        let props = this.state.kernel.getProperties(childID);                        let history = props.twistQueueHistory;                        // let action = history.join('');                        // node.cube.twistQueue.add(action);                        // node.cube.twist(node.cube.twistQueue.do(), true );                        history.forEach(el=>{                            node.cube.twistQueue.add(el);                        })                                                                        if(history.length > 0){                            while (node.cube.twistQueue.future.length > 0) {                                node.cube.twist(node.cube.twistQueue.do(), true );                            }                            // node.cube.twistQueue.future.map(el=>{                            //     node.cube.twist(node.cube.twistQueue.do(), true );                            // })                                                    }                                                //node.cube.map();                }                }            },                        // -- deletingNode -------------------------------------------------------------------------                        //deletingNode: function( nodeID ) {                //},                         // -- initializingProperty -----------------------------------------------------------------                    initializingProperty: function( nodeID, propertyName, propertyValue ) {                             var value = undefined;                    var node = this.state.nodes[nodeID];                    if (node !== undefined) {                        value = this.settingProperty(nodeID, propertyName, propertyValue);                    }                    return value;                            },                        // -- creatingProperty ---------------------------------------------------------------------                        creatingProperty: function (nodeID, propertyName, propertyValue) {                    return this.initializingProperty(nodeID, propertyName, propertyValue);                },                                // -- settingProperty ----------------------------------------------------------------------                        settingProperty: function( nodeID, propertyName, propertyValue ) {                            // let node = this.state.nodes[nodeID];                    // var value = undefined;                    // if (node) {                        //     if (this.state.isCubeletNodeComponent(node.prototypes)) {                    //        switch ( propertyName ) {                                             //             case "cubeletID":                    //                 node.nodeID = nodeID;                    //                 value = propertyValue                              //                 break;                            //             default:                    //                 value = undefined;                    //                 break;                    //         }                    //      }                    //     }                            //  return value;                        },                        // -- gettingProperty ----------------------------------------------------------------------                        gettingProperty: function( nodeID, propertyName, propertyValue ) {                            // let node = this.state.nodes[nodeID];                    // let value = undefined;                        // if (node) {                        //     if (this.state.isCubeNodeComponent(node.prototypes)) {                    //        switch ( propertyName ) {                                             //                case "cubeID":                    //                            value = node.cube.id;                    //                             break;                    //         }                    //      }                    // }                            //  if ( value !== undefined ) {                    //     propertyValue = value;                    // }                            // return value;                                             }                    } );        }    getPrototypes(kernel, extendsID) {        var prototypes = [];        var id = extendsID;            while (id !== undefined) {            prototypes.push(id);            id = kernel.prototype(id);        }        return prototypes;    }        }    export {        RubikModel as default      }    
 |