"use strict"; // Copyright 2012 United States Government, as represented by the Secretary of Defense, Under // Secretary of Defense (Personnel & Readiness). // // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software distributed under the License // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express // or implied. See the License for the specific language governing permissions and limitations under // the License. /// vwf/model/scenejs.js is a placeholder for a 3-D scene manager. /// /// @module vwf/model/scenejs /// @requires vwf/model define(["module", "vwf/model", "vwf/utility"], function (module, model, utility) { var self; // vwf/model/example/scene.js is a demonstration of a scene manager. return model.load(module, { // == Module Definition ==================================================================== // -- pipeline ----------------------------------------------------------------------------- // pipeline: [ log ], // vwf <=> log <=> scene // -- initialize --------------------------------------------------------------------------- initialize: function () { self = this; 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, "aframeObj": undefined, "componentName": undefined }; }, isComponentClass: function (prototypes, classID) { if (prototypes) { for (var i = 0; i < prototypes.length; i++) { if (prototypes[i] === classID) { //console.info( "prototypes[ i ]: " + prototypes[ i ] ); return true; } } } return false; }, isComponentNode: function (prototypes) { var found = false; if (prototypes) { for (var i = 0; i < prototypes.length && !found; i++) { found = (prototypes[i] === "http://vwf.example.com/aframe/componentNode.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 = 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 = getPrototypes(this.kernel, childExtendsID); //var kernel = this.kernel.kernel.kernel; var node; if (this.state.isComponentNode(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.aframeObj = createAFrameObject(node); node.aframeObj = setAFrameObject(node); // addNodeToHierarchy(node); //notifyDriverOfPrototypeAndBehaviorProps(); } }, // -- initializingNode ------------------------------------------------------------------------- // initializingNode: function( nodeID, childID, childExtendsID, childImplementsIDs, // childSource, childType, childIndex, childName ) { // }, // -- deletingNode ------------------------------------------------------------------------- deletingNode: function (nodeID) { if (this.state.nodes[nodeID] !== undefined) { var node = this.state.nodes[nodeID]; if (node.aframeObj !== undefined) { // removes and destroys object node.aframeObj = undefined; } delete this.state.nodes[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) { var node = this.state.nodes[nodeID]; var value = undefined; if (node && node.aframeObj && utility.validObject(propertyValue)) { var aframeObject = node.aframeObj; if (isComponentNodeDefinition(node.prototypes)) { value = propertyValue; switch (propertyName) { default: value = undefined; break; } } if (value === undefined && isComponentDefinition(node.prototypes)) { value = propertyValue; switch (propertyName) { case "compName": break; default: value = undefined; break; } } //isALineDefinition(node.prototypes) //if (value === undefined && node.componentName == 'line') { //isALineDefinition( node.prototypes ) if (value === undefined && aframeObject.el.getAttribute(aframeObject.compName)) { value = propertyValue; //let parentNodeAF = self.state.kernel.find(node.parentID); // aframeObject.el.setAttribute('line', 'color') let parentNodeAF = aframeObject.el; switch (propertyName) { case "start": parentNodeAF.setAttribute(aframeObject.compName, { start: propertyValue }); break; case "end": parentNodeAF.setAttribute(aframeObject.compName, { end: propertyValue }); break; case "color": parentNodeAF.setAttribute(aframeObject.compName, 'color', propertyValue); break; case "opacity": parentNodeAF.setAttribute(aframeObject.compName, 'opacity', propertyValue); break; case "visible": parentNodeAF.setAttribute(aframeObject.compName, 'visible', propertyValue); break; default: value = undefined; break; } } if (value === undefined && aframeObject.el.getAttribute(aframeObject.compName)) { value = propertyValue; let parentNodeAF = aframeObject.el; switch (propertyName) { case "enabled": parentNodeAF.setAttribute(aframeObject.compName, 'enabled', propertyValue); break; case "duration": parentNodeAF.setAttribute(aframeObject.compName, 'duration', propertyValue); break; case "deltaPos": parentNodeAF.setAttribute(aframeObject.compName, 'deltaPos', propertyValue); break; case "deltaRot": parentNodeAF.setAttribute(aframeObject.compName, 'deltaRot', propertyValue); break; default: value = undefined; break; } } } return value; }, // -- gettingProperty ---------------------------------------------------------------------- gettingProperty: function (nodeID, propertyName, propertyValue) { var node = this.state.nodes[nodeID]; var value = undefined; if (node && node.aframeObj) { var aframeObject = node.aframeObj; if (isComponentNodeDefinition(node.prototypes)) { switch (propertyName) { } } if (value === undefined && isComponentDefinition(node.prototypes)) { switch (propertyName) { case "compName": break; } } // isALineDefinition( node.prototypes ) aframeObject.compName == compName if (value === undefined && isALineDefinition(node.prototypes)) { value = propertyValue; // let parentNodeAF = self.state.nodes[node.parentID].aframeObj; let parentNodeAF = aframeObject.el; switch (propertyName) { case "start": value = AFRAME.utils.coordinates.stringify(parentNodeAF.getAttribute(aframeObject.compName).start); break; case "end": value = AFRAME.utils.coordinates.stringify(parentNodeAF.getAttribute(aframeObject.compName).end); break; case "color": value = parentNodeAF.getAttribute(aframeObject.compName).color; break; case "opacity": value = parentNodeAF.getAttribute(aframeObject.compName).opacity; break; case "visible": value = parentNodeAF.getAttribute(aframeObject.compName).visible; break; } } if (value === undefined && isAInterpolationDefinition(node.prototypes)) { value = propertyValue; // let parentNodeAF = self.state.nodes[node.parentID].aframeObj; let parentNodeAF = aframeObject.el; switch (propertyName) { case "enabled": value = parentNodeAF.getAttribute(aframeObject.compName).enabled; break; case "duration": value = parentNodeAF.getAttribute(aframeObject.compName).duration; break; case "deltaPos": value = parentNodeAF.getAttribute(aframeObject.compName).deltaPos; break; case "deltaRot": value = parentNodeAF.getAttribute(aframeObject.compName).deltaRot; break; } } } if (value !== undefined) { propertyValue = value; } return value; } }); function getPrototypes(kernel, extendsID) { var prototypes = []; var id = extendsID; while (id !== undefined) { prototypes.push(id); id = kernel.prototype(id); } return prototypes; } function isAInterpolationDefinition(prototypes) { var found = false; if (prototypes) { for (var i = 0; i < prototypes.length && !found; i++) { found = (prototypes[i] == "http://vwf.example.com/aframe/interpolation-component.vwf"); } } return found; } function isALineDefinition(prototypes) { var found = false; if (prototypes) { for (var i = 0; i < prototypes.length && !found; i++) { found = (prototypes[i] == "http://vwf.example.com/aframe/lineComponent.vwf"); } } return found; } function isComponentNodeDefinition(prototypes) { var found = false; if (prototypes) { for (var i = 0; i < prototypes.length && !found; i++) { found = (prototypes[i] == "http://vwf.example.com/aframe/componentNode.vwf"); } } return found; } function isComponentDefinition(prototypes) { var found = false; if (prototypes) { for (var i = 0; i < prototypes.length && !found; i++) { found = (prototypes[i] == "http://vwf.example.com/aframe/aentityComponent.vwf"); } } return found; } function setAFrameObject(node, config) { var protos = node.prototypes; var aframeObj = {}; var sceneEl = document.querySelector('a-scene'); aframeObj.id = node.parentID; aframeObj.el = sceneEl.children[node.parentID]; aframeObj.el = Array.from(sceneEl.querySelectorAll('*')).filter(item => {return item.id == aframeObj.id})[0]; if (self.state.isComponentClass(protos, "http://vwf.example.com/aframe/lineComponent.vwf")) { // aframeObj.id = node.parentID; // aframeObj.el = sceneEl.children[node.parentID]; if (node.name !== 'line') { aframeObj.compName = node.name; } else { aframeObj.compName = "line"; } //aframeObj.el.setAttribute(node.type, {}); aframeObj.el.setAttribute(aframeObj.compName, {}); } if (self.state.isComponentClass(protos, "http://vwf.example.com/aframe/interpolation-component.vwf")) { // aframeObj.el.setAttribute(node.type, {}); aframeObj.compName = "interpolation"; aframeObj.el.setAttribute(aframeObj.compName, {}); } return aframeObj; } // function addNodeToHierarchy(node) { // if (self.state.nodes[node.parentID] !== undefined) { // var parent = self.state.nodes[node.parentID]; // if (parent.children === undefined) { // parent.children = []; // } // parent.children.push(node.ID); // console.info( "Adding child: " + node.ID ); // } // } function addNodeToHierarchy(node) { if (node.aframeObj) { if (self.state.nodes[node.parentID] !== undefined) { var parent = self.state.nodes[node.parentID]; if (parent.aframeObj) { if (parent.children === undefined) { parent.children = []; } parent.children.push(node.ID); //console.info( "Adding child: " + childID + " to " + nodeID ); //node.aframeObj.setAttribute(node.componentName, {}); console.info("Adding child: " + node.ID); //parent.aframeObj.appendChild(node.aframeObj); } } } } });