Browse Source

Merge remote-tracking branch 'upstream/update2017'

Nikolay Suslov 7 years ago
parent
commit
e894ba765d

+ 83 - 42
support/client/lib/vwf/model/aframe.js

@@ -262,7 +262,7 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
                     let target = methodParameters[0];
                     node.aframeObj.object3D.lookAt(new THREE.Vector3(target.x, target.y, target.z));
                     let newRotation = node.aframeObj.getAttribute('rotation');
-                    self.kernel.setProperty(nodeID, "rotation", {x: 0, y: newRotation.y, z: 0});
+                    self.kernel.setProperty(nodeID, "rotation", {x: 0, y: newRotation.y, z: 0}); 
                 }
             }
 
@@ -431,6 +431,14 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
                             aframeObject.setAttribute('src', propertyValue);
                         break;
 
+                        // case "width":
+                        //     aframeObject.width = propertyValue;
+                        // break;
+
+                        // case "height":
+                        //     aframeObject.height = propertyValue;
+                        // break;
+
                         default:
                             value = undefined;
                             break;
@@ -456,6 +464,25 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
                     }
                 }
 
+                if (value === undefined && aframeObject.nodeName == "VIDEO") {
+                    value = propertyValue;
+
+                    switch (propertyName) {
+
+                        case "itemID":
+                            aframeObject.setAttribute('id', propertyValue);
+                        break;
+
+                        case "itemSrc":
+                            aframeObject.setAttribute('src', propertyValue);
+                        break;
+
+                        default:
+                            value = undefined;
+                            break;
+                    }
+                }
+
                 if (value === undefined && aframeObject.nodeName == "A-SKY") {
                     value = propertyValue;
 
@@ -615,29 +642,6 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
                     }
                 }
 
-                if (value === undefined && aframeObject.nodeName == "A-SOUND") {
-                    value = propertyValue;
-
-                    switch (propertyName) {
-
-                        case "src":
-                            aframeObject.setAttribute('src', propertyValue);
-                            break;
-
-                        case "on":
-                            aframeObject.setAttribute('on', propertyValue);
-                            break;
-
-                        case "autoplay":
-                            aframeObject.setAttribute('autoplay', propertyValue);
-                            break;
-
-                        default:
-                            value = undefined;
-                            break;
-                    }
-                }
-
                 if (value === undefined && aframeObject.nodeName == "A-PLANE") {
                     value = propertyValue;
 
@@ -866,6 +870,13 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
                             value = aframeObject.getAttribute('src');
                         break;
 
+                        case "width":
+                            value = aframeObject.width;
+                        break;
+
+                        case "height":
+                            value = aframeObject.height;
+                        break;
                       
                     }
                 }
@@ -886,6 +897,29 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
                     }
                 }
 
+                if (value === undefined && aframeObject.nodeName == "VIDEO") {
+
+                    switch (propertyName) {
+                        
+                        case "itemID":
+                            value = aframeObject.getAttribute('id');
+                        break;
+                    
+                        case "itemSrc":
+                            value = aframeObject.getAttribute('src');
+                        break;
+
+                        case "videoWidth":
+                        value = aframeObject.videoWidth;
+                        break;
+
+                        case "videoHeight":
+                            value = aframeObject.videoHeight;
+                        break;
+                      
+                    }
+                }
+
                 if (value === undefined && aframeObject.nodeName == "A-SCENE") {
 
                     switch (propertyName) {
@@ -1096,20 +1130,6 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
                     }
                 }
 
-                if (value === undefined && aframeObject.nodeName == "A-SOUND") {
-
-                    switch (propertyName) {
-                        case "src":
-                            value = aframeObject.getAttribute('src');
-                            break;
-                        case "on":
-                            value = aframeObject.getAttribute('on');
-                            break;
-                        case "autoplay":
-                            value = aframeObject.getAttribute('autoplay');
-                            break;
-                    }
-                }
 
                 if (value === undefined && aframeObject.nodeName == "A-GLTF-MODEL") {
                     
@@ -1179,6 +1199,21 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
             }
 
 
+        } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/a-asset-video-item.vwf")) {
+
+            let assets = document.querySelector('a-assets');
+            if (assets){
+
+                aframeObj = document.createElement('video');
+                aframeObj.setAttribute('id', "item-"+GUID());
+                aframeObj.setAttribute('src', "");
+                aframeObj.setAttribute('crossorigin', "anonymous");
+                aframeObj.setAttribute('autoplay', "");
+                aframeObj.setAttribute('loop', true);
+
+                assets.appendChild(aframeObj);
+            }
+
         } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/asky.vwf")) {
             aframeObj = document.createElement('a-sky');
         } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/acamera.vwf")) {
@@ -1205,8 +1240,6 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
             aframeObj = document.createElement('a-collada-model');
         } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/aobjmodel.vwf")) {
             aframeObj = document.createElement('a-obj-model');
-        } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/asound.vwf")) {
-            aframeObj = document.createElement('a-sound');
          } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/agltfmodel.vwf")) {
             aframeObj = document.createElement('a-gltf-model');
         } else if (self.state.isAFrameClass(protos, "http://vwf.example.com/aframe/asphere.vwf")) {
@@ -1217,7 +1250,11 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
             aframeObj = document.createElement('a-entity');
         }
 
-        if (aframeObj.nodeName !== "A-ASSET-ITEM" && aframeObj.nodeName !== "IMG" && aframeObj.nodeName !== "AUIDO"){
+        if (aframeObj.nodeName !== "A-ASSET-ITEM" && 
+            aframeObj.nodeName !== "IMG" && 
+            aframeObj.nodeName !== "AUDIO" &&
+            aframeObj.nodeName !== "VIDEO"
+        ){
             aframeObj.setAttribute('id', node.ID);
         }
 
@@ -1237,7 +1274,11 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
                     }
                     parent.children.push(node.ID);
                     //console.info( "Adding child: " + childID + " to " + nodeID );
-                    if (node.aframeObj.nodeName !== "A-ASSET-ITEM" && node.aframeObj.nodeName !== "IMG" && node.aframeObj.nodeName !== "AUIDO"){
+                    if (node.aframeObj.nodeName !== "A-ASSET-ITEM" &&
+                        node.aframeObj.nodeName !== "IMG" &&
+                      node.aframeObj.nodeName !== "AUDIO" &&
+                      node.aframeObj.nodeName !== "VIDEO"
+                    ){
                     parent.aframeObj.appendChild(node.aframeObj);
                     }
                 }

+ 51 - 19
support/client/lib/vwf/model/aframeComponent.js

@@ -123,8 +123,15 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
                     "width",
                     "wireframe",
                     "wireframe-linewidth",
-                    "src"]
+                    "src"],
+            
+                    'A-SOUND': [
+                        "autoplay", "distanceModel", "loop", "maxDistance", "on", "poolSize", "refDistance",
+                        "rolloffFactor", "src", "volume"
+                    ]
+
             }
+            
 
             //this.state.kernel = this.kernel.kernel.kernel;
 
@@ -358,6 +365,20 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
                     }
                 }
 
+                if (value === undefined && isASoundDefinition(node.prototypes)) {
+                    if (aframeObject.el.getAttribute(aframeObject.compName)) {
+
+                        value = propertyValue;
+                        let parentNodeAF = aframeObject.el;
+                        //let defs = ['color', 'transparent', 'opacity', 'side'];
+
+                        self.aframeComponentDef['A-SOUND'].forEach(element => {
+                            element == propertyName ? parentNodeAF.setAttribute('sound', element, propertyValue) :
+                                value = undefined;
+                        })
+                    }
+                }
+
                 if (value === undefined && isAFogDefinition(node.prototypes)) {
                     if (aframeObject.el.getAttribute(aframeObject.compName)) {
 
@@ -765,28 +786,20 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
                         }
 
                     })
+                }
 
-                    // switch (propertyName) {
-
-                    //     case "color":
-                    //         value = parentNodeAF.getAttribute('material').color;
-                    //         break;
-
-                    //     case "opacity":
-                    //         value = parentNodeAF.getAttribute('material').opacity;
-                    //         break;
-
-                    //     case "side":
-                    //         value = parentNodeAF.getAttribute('material').side;
-                    //         break;
-
-                    //     case "transparent":
-                    //         value = parentNodeAF.getAttribute('material').transparent;
-                    //         break;
+                if (value === undefined && isASoundDefinition(node.prototypes)) {
+                    value = propertyValue;
 
+                    // let parentNodeAF = self.state.nodes[node.parentID].aframeObj;
+                    let parentNodeAF = aframeObject.el;
 
-                    // }
+                    self.aframeComponentDef['A-SOUND'].forEach(element => {
+                        if (element == propertyName) {
+                            value = parentNodeAF.getAttribute('sound').element;
+                        }
 
+                    })
                 }
 
                 if (value === undefined && isALinePathDefinition(node.prototypes)) {
@@ -959,6 +972,17 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
         return found;
     }
 
+    function isASoundDefinition(prototypes) {
+        var found = false;
+        if (prototypes) {
+            for (var i = 0; i < prototypes.length && !found; i++) {
+                found = (prototypes[i] == "http://vwf.example.com/aframe/a-sound-component.vwf");
+            }
+        }
+        return found;
+    }
+
+
     function isAViewOffsetCameraDefinition(prototypes) {
         var found = false;
         if (prototypes) {
@@ -1152,6 +1176,14 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
 
         }
 
+        if (self.state.isComponentClass(protos, "http://vwf.example.com/aframe/a-sound-component.vwf")) {
+
+            // aframeObj.el.setAttribute(node.type, {});
+            aframeObj.compName = "sound";
+            aframeObj.el.setAttribute(aframeObj.compName, {});
+
+        }
+
         if (self.state.isComponentClass(protos, "http://vwf.example.com/aframe/interpolation-component.vwf")) {
 
 

+ 65 - 8
support/client/lib/vwf/view/aframe.js

@@ -163,21 +163,47 @@ define(["module", "vwf/view"], function (module, view) {
                 return;
             }
 
+            // if (node.aframeObj.nodeName == "AUDIO" && propertyName == 'itemSrc') {
+
+            //     //console.log("sat new item");
+            //     let elID = '#' + node.aframeObj.getAttribute('id');
+            //     Object.entries(this.state.nodes).forEach(el => {
+            //         let src = el[1].aframeObj.getAttribute('src');
+            //         if (src){
+            //            // console.log("my: " + src);
+            //             if (src == elID)
+            //             self.kernel.callMethod(el[0], "updateSrc", [elID])
+            //         }
+            //     })
+
+            // }
+
             if (node.aframeObj.nodeName == "AUDIO" && propertyName == 'itemSrc') {
 
                 //console.log("sat new item");
                 let elID = '#' + node.aframeObj.getAttribute('id');
                 Object.entries(this.state.nodes).forEach(el => {
-                    let src = el[1].aframeObj.getAttribute('src');
-                    if (src){
-                       // console.log("my: " + src);
-                        if (src == elID)
-                        self.kernel.callMethod(el[0], "updateSrc", [elID])
-                    }
-                })
+                    let sound = el[1].aframeObj.getAttribute('sound');
+                    if(sound) {
+                   
+                        let soundID = vwf.find(el[0], 'sound');
+                        self.kernel.callMethod(soundID, "refreshSrc", [elID])
+
+                    // if (sound.src !== ""){
+                    //     let src = '#' + sound.src.id;
+                    //     if (src == elID){
+                    //         let soundID = vwf.find(el[0], 'sound');
+                    //         self.kernel.callMethod(soundID, "updateSrc", [elID])
+                    //     }
+                        
+                    // }
+
+                }
 
+                })
             }
 
+
             if (node.aframeObj.nodeName == "IMG" && propertyName == 'itemSrc') {
 
                 //console.log("sat new item");
@@ -198,7 +224,27 @@ define(["module", "vwf/view"], function (module, view) {
                 }
 
                 })
+            }
+
+            if (node.aframeObj.nodeName == "VIDEO" && propertyName == 'itemSrc') {
 
+                //console.log("sat new item");
+                let elID = '#' + node.aframeObj.getAttribute('id');
+                Object.entries(this.state.nodes).forEach(el => {
+                    let material = el[1].aframeObj.getAttribute('material');
+                    if(material) {
+                   
+                    if (material.src !== ""){
+                       // console.log("my: " + src);
+                        let src = '#' + material.src.id;
+                        if (src == elID){
+                            let materialID = vwf.find(el[0], 'material');
+                            self.kernel.callMethod(materialID, "updateSrc", [elID])
+                        }
+                        
+                    }
+                }
+                })
             }
 
             if (node.aframeObj.nodeName == "A-ASSET-ITEM" && propertyName == 'itemSrc') {
@@ -363,10 +409,21 @@ define(["module", "vwf/view"], function (module, view) {
                 if (methodName == "setCameraToActive"){
                     if (methodParameters[0] == vwf.moniker_){
                     console.log("set active");
-                    node.aframeObj.setAttribute('camera', 'active', true)
+                    let offsetComp = node.aframeObj.getAttribute('viewoffset');
+                    if (offsetComp) {
+                        let offsetCompID = vwf.find(nodeID, 'viewoffset');
+                        self.kernel.callMethod(offsetCompID, "setParams", []);
+                    }
+                    node.aframeObj.setAttribute('camera', 'active', true);
                 }
             }
         }
+
+            if(methodName == "createGooglePoly"){
+
+
+            }
+
             
         }
 

+ 88 - 21
support/client/lib/vwf/view/editor-new.js

@@ -256,15 +256,24 @@ define([
                                                 title: 'Camera',
                                                 styleClass: "createListItem",
                                                 onclickfunc: function(){
+                                                    let avatarID = 'avatar-' + vwf.moniker_;
                                                     //let cubeName = self.GUID();
+                                                    vwf_view.kernel.callMethod(vwf.application(), "createCamera", [null, null, avatarID])
+                                                     //let cubeName = self.GUID();
                                                    // vwf_view.kernel.callMethod(vwf.application(), "createFloor")
                                                 }
+                                               
+                                                   
+                                                
                                             }),
                                             self.widgets.gridListItem({
                                                 imgSrc: "vwf/view/lib/images/ui/icons/camera_offset.png",
                                                 title: 'Camera with view offset',
                                                 styleClass: "createListItem",
                                                 onclickfunc: function(){
+                                                    let avatarID = 'avatar-' + vwf.moniker_;
+                                                    //let cubeName = self.GUID();
+                                                    vwf_view.kernel.callMethod(vwf.application(), "createCameraWithOffset", [null, null, avatarID])
                                                     //let cubeName = self.GUID();
                                                    // vwf_view.kernel.callMethod(vwf.application(), "createFloor")
                                                 }
@@ -284,7 +293,7 @@ define([
                              
                             },
                             widgets.textField({
-                                id:"asset3dsrc",
+                                id:"assetsrc",
                                 value:"Enter URL to asset source",
                                 funconchange: function(e){
                                     console.log(this.value)
@@ -304,6 +313,10 @@ define([
                                                 {
                                                     label: "Image",
                                                     onclick: function(e){
+                                                        let srcEl = document.querySelector('#assetsrc');
+                                                            let avatarID = 'avatar-' + vwf.moniker_;
+                                                            vwf_view.kernel.callMethod(vwf.application(), "createImage", [srcEl.value, null, null, avatarID])
+                                                        
                                                     }
                                                 }
                                             ),
@@ -311,6 +324,9 @@ define([
                                                 {
                                                     label: "Sound",
                                                     onclick: function(e){
+                                                        let srcEl = document.querySelector('#assetsrc');
+                                                        let avatarID = 'avatar-' + vwf.moniker_;
+                                                        vwf_view.kernel.callMethod(vwf.application(), "createAudio", [srcEl.value, null, null, avatarID])
                                                     }
                                                 }
                                             ),
@@ -318,20 +334,21 @@ define([
                                                 {
                                                     label: "Video",
                                                     onclick: function(e){
+                                                        let srcEl = document.querySelector('#assetsrc');
+                                                        let avatarID = 'avatar-' + vwf.moniker_;
+                                                        vwf_view.kernel.callMethod(vwf.application(), "createVideo", [srcEl.value, null, null, avatarID])
                                                     }
                                                 }
                                             ),
-                                            widgets.buttonSimple(
-                                                {
-                                                    label: "MTL",
-                                                    onclick: function(e){
-                                                    }
-                                                }
-                                            ),
+                                           
                                             widgets.buttonSimple(
                                                 {
                                                     label: "GLTF",
                                                     onclick: function(e){
+                                                        let srcEl = document.querySelector('#assetsrc');
+                                                        let avatarID = 'avatar-' + vwf.moniker_;
+                                                        if(srcEl.value.includes('.gltf'))
+                                                        vwf_view.kernel.callMethod(vwf.application(), "createModel", ['GLTF', srcEl.value, avatarID])
                                                     }
                                                 }
                                             ),
@@ -339,11 +356,10 @@ define([
                                                 {
                                                     label: "DAE",
                                                     onclick: function(e){
-                                                        let srcEl = document.querySelector('#asset3dsrc');
+                                                        let srcEl = document.querySelector('#assetsrc');
                                                         let avatarID = 'avatar-' + vwf.moniker_;
                                                         if(srcEl.value.includes('.dae'))
-                                                        vwf_view.kernel.callMethod(vwf.application(), "createModelDAE", [srcEl.value, avatarID])
-
+                                                        vwf_view.kernel.callMethod(vwf.application(), "createModel", ['DAE', srcEl.value, avatarID])
                                                     }
                                                 }
                                             ),
@@ -351,6 +367,10 @@ define([
                                                 {
                                                     label: "OBJ",
                                                     onclick: function(e){
+                                                        let srcEl = document.querySelector('#assetsrc');
+                                                        let avatarID = 'avatar-' + vwf.moniker_;
+                                                        if(srcEl.value.includes('.obj'))
+                                                        vwf_view.kernel.callMethod(vwf.application(), "createModel", ['OBJ', srcEl.value, avatarID])
                                                     }
                                                 }
                                             )
@@ -383,7 +403,11 @@ define([
                                             self.widgets.gridListItem({
                                                 imgSrc: "vwf/view/lib/images/ui/icons/3ditem.png",
                                                 title: 'Asset item',
-                                                styleClass: "createListItem"
+                                                styleClass: "createListItem",
+                                                onclickfunc: function(){
+                                                    let srcEl = document.querySelector('#assetsrc');
+                                                    vwf_view.kernel.callMethod(vwf.application(), "createAssetResource", ['ITEM', srcEl.value])
+                                                }
                                             }),
                                             self.widgets.gridListItem({
                                                 imgSrc: "vwf/view/lib/images/ui/icons/image.png",
@@ -391,24 +415,67 @@ define([
                                                 styleClass: "createListItem",
                                                 onclickfunc: function(){
                                                     //let cubeName = self.GUID();
-                                                    vwf_view.kernel.callMethod(vwf.application(), "createAssetItemImg")
+                                                    let srcEl = document.querySelector('#assetsrc');
+                                                    vwf_view.kernel.callMethod(vwf.application(), "createAssetResource", ['IMG', srcEl.value])
                                                 }
                                             }),
                                             self.widgets.gridListItem({
                                                 imgSrc: "vwf/view/lib/images/ui/icons/video.png",
                                                 title: 'Video',
-                                                styleClass: "createListItem"
+                                                styleClass: "createListItem",
+                                                onclickfunc: function(){
+                                                    let srcEl = document.querySelector('#assetsrc');
+                                                    vwf_view.kernel.callMethod(vwf.application(), "createAssetResource", ['VIDEO', srcEl.value])
+                                                }
                                             }),
                                             self.widgets.gridListItem({
                                                 imgSrc: "vwf/view/lib/images/ui/icons/sound.png",
                                                 title: 'Sound',
-                                                styleClass: "createListItem"
-                                            })
+                                                styleClass: "createListItem",
+                                                onclickfunc: function(){
+                                                    let srcEl = document.querySelector('#assetsrc');
+                                                    vwf_view.kernel.callMethod(vwf.application(), "createAssetResource", ['AUDIO', srcEl.value])
+                                                }
+                                            }),
+                                            self.widgets.buttonSimple(
+                                                {
+                                                    label: "MTL",
+                                                    onclick: function(e){
+                                                        let srcEl = document.querySelector('#assetsrc');
+                                                        if(srcEl.value.includes('.mtl'))
+                                                        vwf_view.kernel.callMethod(vwf.application(), "createAssetResource", ['ITEM', srcEl.value])
+                                                    }
+                                                }
+                                            )
                                         
                                         ]
                                     }
                                 ]
-                            } 
+                            },
+                            {
+                                $cell: true,
+                                $type: "h3",
+                                class: "mdc-typography--title",
+                                $text:"Google Poly" 
+                             
+                            },
+                            widgets.textField({
+                                id:"googlepolyid",
+                                value:"Enter Google Poly model ID",
+                                funconchange: function(e){
+                                    console.log(this.value)
+                                }
+                            }),
+                            widgets.buttonSimple(
+                                {
+                                    label: "Load Model from Poly",
+                                    onclick: function(e){
+                                        let srcEl = document.querySelector('#googlepolyid');
+                                        let avatarID = 'avatar-' + vwf.moniker_;
+                                        vwf_view.kernel.callMethod(vwf.application(), "createGooglePoly", [srcEl.value, null, null, avatarID])
+                                    }
+                                }
+                            )
                         ]
                     }
 
@@ -425,7 +492,7 @@ define([
                         onclickfunc: function(){
                             let avatarID = 'avatar-' + vwf.moniker_;
                             //let cubeName = self.GUID();
-                            vwf_view.kernel.callMethod(vwf.application(), "createPrimitive", [el.toLowerCase(), avatarID])
+                            vwf_view.kernel.callMethod(vwf.application(), "createPrimitive", [el.toLowerCase(), null, null, null, avatarID])
                         }
                 })
                 })
@@ -441,7 +508,7 @@ define([
                         onclickfunc: function(){
                             let avatarID = 'avatar-' + vwf.moniker_;
                             //let cubeName = self.GUID();
-                            vwf_view.kernel.callMethod(vwf.application(), "createPrimitive", ["light", avatarID, el.toLowerCase()])
+                            vwf_view.kernel.callMethod(vwf.application(), "createPrimitive", ["light", el.toLowerCase(), null, null, avatarID])
                         }
                     })
                 })
@@ -1254,7 +1321,7 @@ define([
         var continuousSlider = new mdc.slider.MDCSlider(myEl);
         this._comp = continuousSlider;
         continuousSlider.listen('MDCSlider:input', function(e) {
-            console.log(continuousSlider.value)
+           // console.log(continuousSlider.value)
             let myEl = e.currentTarget;
            // let prop = myEl._prop.body;
             //document.querySelector('#propAceEditor').env.editor.setValue(prop);
@@ -1263,7 +1330,7 @@ define([
          
         });
         continuousSlider.listen('MDCSlider:change', function(e) {
-          console.log(continuousSlider.value);
+          //console.log(continuousSlider.value);
           let myEl = e.currentTarget;
          // let prop = myEl._prop.body;
           //document.querySelector('#propAceEditor').env.editor.setValue(prop);

+ 3 - 1
support/proxy/vwf.example.com/aframe/a-asset-image-item.vwf.yaml

@@ -4,4 +4,6 @@ extends: http://vwf.example.com/aframe/node.vwf
 type: "image"
 properties:
   itemID:
-  itemSrc:
+  itemSrc:
+  width:
+  height:

+ 9 - 0
support/proxy/vwf.example.com/aframe/a-asset-video-item.vwf.yaml

@@ -0,0 +1,9 @@
+# https://aframe.io/docs/0.5.0/primitives/a-cursor.html
+---
+extends: http://vwf.example.com/aframe/node.vwf
+type: "video"
+properties:
+  itemID:
+  itemSrc:
+  videoWidth:
+  videoHeight:

+ 22 - 0
support/proxy/vwf.example.com/aframe/a-sound-component.js

@@ -0,0 +1,22 @@
+this.updateSrc = function(srcID){
+
+    if (srcID) {
+
+            this.src = "";
+            this.src = srcID;
+        
+    }
+    
+}
+
+this.refreshSrc = function(srcID){
+
+    if (srcID) {
+
+        if (srcID == this.src) {
+            this.src = "";
+            this.src = srcID;
+        }
+    }
+    
+}

+ 24 - 0
support/proxy/vwf.example.com/aframe/a-sound-component.vwf.yaml

@@ -0,0 +1,24 @@
+# https://aframe.io/docs/master/primitives/a-sound.html
+--- 
+extends: http://vwf.example.com/aframe/aentityComponent.vwf
+type: "component"
+properties:
+  autoplay:
+  distanceModel:
+  loop:
+  maxDistance:
+  on:
+  poolSize:
+  refDistance:
+  rolloffFactor:
+  src:
+  volume:
+methods:
+  refreshSrc:
+    parameters:
+      - srcID
+  updateSrc:
+    parameters:
+      - srcID
+scripts:
+  - source: "http://vwf.example.com/aframe/a-sound-component.js"

+ 0 - 9
support/proxy/vwf.example.com/aframe/aentity.js

@@ -21,13 +21,4 @@ this.showCloseGizmo = function () {
             this.children.delete(this.gizmo)
         }
     }
-}
-
-this.updateSrc = function(srcID){
-
-    if (srcID) {
-        this.src = "";
-        this.src = srcID;
-    }
-    
 }

+ 0 - 3
support/proxy/vwf.example.com/aframe/aentity.vwf.yaml

@@ -17,9 +17,6 @@ methods:
     parameters:
       - mode
   showCloseGizmo:
-  updateSrc:
-    parameters:
-      - src
   lookAt:
     parameters:
       - nodeID

+ 0 - 17
support/proxy/vwf.example.com/aframe/aimage.vwf.yaml

@@ -1,17 +0,0 @@
---- 
-extends: http://vwf.example.com/aframe/node.vwf
-type: "a-image"
-properties:
-  color:
-  height:
-  metalness:
-  opacity:
-  repeat:
-  roughness:
-  segments-height:
-  segments-width:
-  shader:
-  side:
-  src:
-  transparent:
-  width:

+ 562 - 26
support/proxy/vwf.example.com/aframe/ascene.js

@@ -290,6 +290,56 @@ this.lightProto = function (lightType) {
     return node
 }
 
+this.cameraProto = function () {
+
+    let newNode = this.cubeProto();
+    newNode.properties.width = 0.3;
+    newNode.properties.height = 0.3;
+    newNode.properties.depth= 0.5;
+    newNode.children.material.properties.opacity = 0.5;
+    newNode.children.material.properties.color = "red";
+
+    newNode.children.camera = {
+        "extends": "http://vwf.example.com/aframe/acamera.vwf",
+        "properties": {
+            "look-controls-enabled": false,
+            "wasd-controls-enabled": false,
+            "user-height": 0
+        }
+    }
+
+    return newNode
+}
+
+this.cameraProtoWithOffset = function () {
+
+    let newNode = this.cubeProto();
+    newNode.properties.width = 0.3;
+    newNode.properties.height = 0.3;
+    newNode.properties.depth= 0.5;
+    newNode.children.material.properties.opacity = 0.5;
+    newNode.children.material.properties.color = "red";
+
+    newNode.children.camera = {
+        "extends": "http://vwf.example.com/aframe/acamera.vwf",
+        "properties": {
+            "look-controls-enabled": false,
+            "wasd-controls-enabled": false,
+            "user-height": 0
+        },
+        children: {
+            viewoffset: {
+                extends: "http://vwf.example.com/aframe/viewOffsetCamera-component.vwf",
+                properties: {
+                }
+            }
+           
+        }
+}
+
+    return newNode
+}
+
 this.planeProto = function () {
 
     let node = {
@@ -332,40 +382,114 @@ this.planeProto = function () {
     return node
 }
 
-this.createModelDAE = function (daeSrc, avatar) {
+
+this.createModelObj = function (mtlSrc, objSrc, name, avatar) {
 
     var self = this;
 
-    let daeTagName = 'DAE-ASSET-'+this.GUID();
-    let daeTagNode = {
-        "extends": "http://vwf.example.com/aframe/a-asset-item.vwf",
+
+    var position = "0 0 0";
+
+    var nodeName = this.GUID();
+
+    if (avatar) {
+
+        let myAvatar = this.children[avatar];
+        let cursorNode = myAvatar.avatarNode.myHead.myCursor.vis;
+
+        if (cursorNode) {
+            position = cursorNode.worldPosition;
+            //console.log(position);
+        }
+
+    }
+
+    let modelNode = {
+        "extends": "http://vwf.example.com/aframe/aobjmodel.vwf",
         "properties": {
-            "itemID": daeTagName,
-            "itemSrc": daeSrc,
+            "src": '#' + objSrc,
+            "mtl": '#' + mtlSrc,
+            "position": position
         },
+        children:{
+            "interpolation":
+            {
+                "extends": "http://vwf.example.com/aframe/interpolation-component.vwf",
+                "type": "component",
+                "properties": {
+                    "enabled": true
+                }
+            }
+        }
     }
 
-    this.children.create(daeTagName, daeTagNode, function( child ) {
-        let daeNodeName = 'DAE-MODEL-'+self.GUID();
+    if (name) {
+        modelNode.properties.displayName = name;
+    }
+
+    self.children.create(nodeName, modelNode, function( child ) {
+        if (avatar) child.lookAt(self.children[avatar].worldPosition)
+       });
+
+}
+
+this.createModel = function (modelType, modelSrc, avatar) {
+
+    var self = this;
+
+    let tagName = modelType + '-ASSET-'+ this.GUID();
+    let tagNode = {
+        "extends": "http://vwf.example.com/aframe/a-asset-item.vwf",
+        "properties": {
+            "itemID": tagName,
+            "itemSrc": modelSrc
+        }
+    }
 
+    this.children.create(tagName, tagNode, function( child ) {
+
+        let nodeName = modelType + '-MODEL-'+self.GUID();
         var position = "0 0 0";
-        let myAvatar = self.children[avatar];
-        let cursorNode = myAvatar.avatarNode.myHead.myCursor.vis;
+        if (avatar) {
+            
+            let myAvatar = self.children[avatar];
+            let cursorNode = myAvatar.avatarNode.myHead.myCursor.vis;
+        
+            if (cursorNode) {
+                 position = cursorNode.worldPosition;
+                //console.log(position);
+            }
     
-        if (cursorNode) {
-             position = cursorNode.worldPosition;
-            //console.log(position);
         }
+       
+        const protos = {
+            DAE: "http://vwf.example.com/aframe/acolladamodel.vwf",
+            OBJ: "http://vwf.example.com/aframe/aobjmodel.vwf",
+            GLTF: "http://vwf.example.com/aframe/agltfmodel.vwf"
+        }
+
 
-        let daeNode = {
-            "extends": "http://vwf.example.com/aframe/acolladamodel.vwf",
+        let extendsName = Object.entries(protos).filter(el => el[0] == modelType)[0];
+ 
+        let modelNode = {
+            "extends": extendsName[1],
             "properties": {
                 "src": '#' + child.itemID,
                 "position": position
+            },
+            children:{
+                "interpolation":
+                {
+                    "extends": "http://vwf.example.com/aframe/interpolation-component.vwf",
+                    "type": "component",
+                    "properties": {
+                        "enabled": true
+                    }
+                }
             }
         }
 
-        self.children.create(daeNodeName, daeNode, function( child ) {
+        self.children.create(nodeName, modelNode, function( child ) {
             if (avatar) child.lookAt(self.children[avatar].worldPosition)
            });
 
@@ -373,24 +497,54 @@ this.createModelDAE = function (daeSrc, avatar) {
 }
 
 
-this.createPrimitive = function (type, avatar, params, name, node) {
+this.createAssetResource = function(resType, resSrc){
 
-    var position = "0 0 0";
-    var nodeName = name;
+    var self = this;
 
+    const protos = {
+        IMG: "http://vwf.example.com/aframe/a-asset-image-item.vwf",
+        AUDIO: "http://vwf.example.com/aframe/a-asset-audio-item.vwf",
+        VIDEO:  "http://vwf.example.com/aframe/a-asset-video-item.vwf",
+        ITEM:  "http://vwf.example.com/aframe/a-asset-item.vwf" 
+    };
 
-    let myAvatar = this.children[avatar];
-    let cursorNode = myAvatar.avatarNode.myHead.myCursor.vis;
+    let extendsName = Object.entries(protos).filter(el => el[0] == resType)[0];
 
-    if (cursorNode) {
-        position = cursorNode.worldPosition;
-        //console.log(position);
+    let tagName = resType + '-ASSET-'+ this.GUID();
+    let tagNode = {
+        "extends": extendsName[1],
+        "properties": {
+            "itemID": tagName,
+            "itemSrc": resSrc
+        }
     }
 
-    if (!name) {
+    this.children.create(tagName, tagNode);
+
+}
+
+
+this.createPrimitive = function (type, params, name, node, avatar) {
+
+    var position = "0 0 0";
+
+    var nodeName = name;
+    if (!nodeName) {
         nodeName = this.GUID();
     }
 
+    if (avatar) {
+
+        let myAvatar = this.children[avatar];
+        let cursorNode = myAvatar.avatarNode.myHead.myCursor.vis;
+
+        if (cursorNode) {
+            position = cursorNode.worldPosition;
+            //console.log(position);
+        }
+
+    }
+
     var newNode = {};
 
     switch (type) {
@@ -433,13 +587,395 @@ this.createPrimitive = function (type, avatar, params, name, node) {
     if (newNode) {
         newNode.properties.position = position;
         this.children.create(nodeName, newNode, function( child ) {
-           child.lookAt(self.children[avatar].worldPosition)
+            if (avatar) child.lookAt(self.children[avatar].worldPosition);
+          });
+    }
+
+}
+
+this.createCamera = function (name, node, avatar) {
+
+    var position = "0 0 0";
+
+    var nodeName = name;
+    if (!nodeName) {
+        nodeName = this.GUID();
+    }
+
+    if (avatar) {
+
+        let myAvatar = this.children[avatar];
+        let cursorNode = myAvatar.avatarNode.myHead.myCursor.vis;
+
+        if (cursorNode) {
+            position = cursorNode.worldPosition;
+            //console.log(position);
+        }
+
+    }
+
+    var newNode = this.cameraProto();
+    newNode.properties.displayName = "camera";
+
+    var self = this;
+
+    if (newNode) {
+        newNode.properties.position = position;
+        this.children.create(nodeName, newNode, function( child ) {
+            if (avatar) child.lookAt(self.children[avatar].worldPosition);
+          });
+    }
+
+}
+
+this.createCameraWithOffset = function (name, node, avatar) {
+
+    var position = "0 0 0";
+
+    var nodeName = name;
+    if (!nodeName) {
+        nodeName = this.GUID();
+    }
+
+    if (avatar) {
+
+        let myAvatar = this.children[avatar];
+        let cursorNode = myAvatar.avatarNode.myHead.myCursor.vis;
+
+        if (cursorNode) {
+            position = cursorNode.worldPosition;
+            //console.log(position);
+        }
+
+    }
+
+    var newNode = this.cameraProtoWithOffset();
+    newNode.properties.displayName = "cameraWithOffset";
+
+    var self = this;
+
+    if (newNode) {
+        newNode.properties.position = position;
+        this.children.create(nodeName, newNode, function( child ) {
+            if (avatar) child.lookAt(self.children[avatar].worldPosition);
           });
     }
 
 }
 
 
+this.createImage = function (imgSrc, name, node, avatar) {
+
+    var self = this;
+
+    var position = "0 0 0";
+
+    var nodeName = name;
+    if (!nodeName) {
+        nodeName = this.GUID();
+    }
+
+    if (avatar) {
+
+        let myAvatar = this.children[avatar];
+        let cursorNode = myAvatar.avatarNode.myHead.myCursor.vis;
+
+        if (cursorNode) {
+            position = cursorNode.worldPosition;
+            //console.log(position);
+        }
+
+    }
+
+    let tagName = 'IMG-ASSET-'+ this.GUID();
+    let tagNode = {
+        "extends": "http://vwf.example.com/aframe/a-asset-image-item.vwf",
+        "properties": {
+            "itemID": tagName,
+            "itemSrc": imgSrc
+        }
+    }
+
+    this.children.create(tagName, tagNode, function( child ) {
+
+
+        let allNodes = vwf.models["vwf/model/aframe"].model.state.nodes;
+        let imgAssetNode = allNodes[child.id];
+
+        imgAssetNode.aframeObj.onload = function(){
+
+       // console.log(imgAssetNode);
+
+        let nodeName = 'IMAGE-'+self.GUID();
+        var position = "0 0 0";
+        if (avatar) {
+            
+            let myAvatar = self.children[avatar];
+            let cursorNode = myAvatar.avatarNode.myHead.myCursor.vis;
+        
+            if (cursorNode) {
+                 position = cursorNode.worldPosition;
+                //console.log(position);
+            }
+    
+        }
+ 
+        let newNode = self.planeProto();
+        newNode.properties.displayName = "image";
+        newNode.children.material.properties.src = '#' + child.itemID;
+        newNode.properties.position = position;
+        newNode.properties.width = child.width;
+        newNode.properties.height = child.height;
+        newNode.properties.scale = [0.003, 0.003, 0.003];
+
+        self.children.create(nodeName, newNode, function( child ) {
+            if (avatar) child.lookAt(self.children[avatar].worldPosition)
+           });
+
+        }
+        
+
+       });
+
+}
+
+this.createVideo = function (vidSrc, name, node, avatar) {
+
+    var self = this;
+
+    var position = "0 0 0";
+
+    var nodeName = name;
+    if (!nodeName) {
+        nodeName = this.GUID();
+    }
+
+    if (avatar) {
+
+        let myAvatar = this.children[avatar];
+        let cursorNode = myAvatar.avatarNode.myHead.myCursor.vis;
+
+        if (cursorNode) {
+            position = cursorNode.worldPosition;
+            //console.log(position);
+        }
+
+    }
+
+    let tagName = 'VIDEO-ASSET-'+ this.GUID();
+    let tagNode = {
+        "extends": "http://vwf.example.com/aframe/a-asset-video-item.vwf",
+        "properties": {
+            "itemID": tagName,
+            "itemSrc": vidSrc
+        }
+    }
+
+    this.children.create(tagName, tagNode, function( child ) {
+
+
+        let allNodes = vwf.models["vwf/model/aframe"].model.state.nodes;
+        let imgAssetNode = allNodes[child.id];
+
+        imgAssetNode.aframeObj.onloadeddata = function(){
+
+       //console.log(imgAssetNode);
+
+        let nodeName = 'VIDEO-'+self.GUID();
+        var position = "0 0 0";
+        if (avatar) {
+            
+            let myAvatar = self.children[avatar];
+            let cursorNode = myAvatar.avatarNode.myHead.myCursor.vis;
+        
+            if (cursorNode) {
+                 position = cursorNode.worldPosition;
+                //console.log(position);
+            }
+    
+        }
+ 
+        let newNode = self.planeProto();
+        newNode.properties.displayName = "video";
+        newNode.children.material.properties.src = '#' + child.itemID;
+        newNode.properties.position = position;
+        // newNode.properties.width = 3;
+        // newNode.properties.height = 1.75;
+        newNode.properties.width = child.videoWidth;
+        newNode.properties.height = child.videoHeight;
+        newNode.properties.scale = [0.003, 0.003, 0.003];
+
+        self.children.create(nodeName, newNode, function( child ) {
+            if (avatar) child.lookAt(self.children[avatar].worldPosition)
+           });
+
+        }
+        
+       });
+
+}
+
+this.createAudio = function (itemSrc, name, node, avatar) {
+
+    var self = this;
+
+    var position = "0 0 0";
+
+    var nodeName = name;
+    if (!nodeName) {
+        nodeName = this.GUID();
+    }
+
+    if (avatar) {
+
+        let myAvatar = this.children[avatar];
+        let cursorNode = myAvatar.avatarNode.myHead.myCursor.vis;
+
+        if (cursorNode) {
+            position = cursorNode.worldPosition;
+            //console.log(position);
+        }
+
+    }
+
+    let tagName = 'AUDIO-ASSET-'+ this.GUID();
+    let tagNode = {
+        "extends": "http://vwf.example.com/aframe/a-asset-audio-item.vwf",
+        "properties": {
+            "itemID": tagName,
+            "itemSrc": itemSrc
+        }
+    }
+
+    this.children.create(tagName, tagNode, function( child ) {
+
+
+        // let allNodes = vwf.models["vwf/model/aframe"].model.state.nodes;
+        // let itemAssetNode = allNodes[child.id];
+
+    //     itemAssetNode.aframeObj.onload = function(){
+
+    //    console.log(itemAssetNode);
+
+        let nodeName = 'AUDIO-'+self.GUID();
+        var position = "0 0 0";
+        if (avatar) {
+            
+            let myAvatar = self.children[avatar];
+            let cursorNode = myAvatar.avatarNode.myHead.myCursor.vis;
+        
+            if (cursorNode) {
+                 position = cursorNode.worldPosition;
+                //console.log(position);
+            }
+    
+        }
+ 
+        let newNode = self.cubeProto();
+        newNode.properties.displayName = "audio";
+        newNode.properties.position = position;
+        newNode.properties.width = 0.3;
+        newNode.properties.height = 0.3;
+        newNode.properties.depth= 0.3;
+        newNode.children.material.properties.opacity = 0.5;
+        newNode.children.material.properties.color = "yellow";
+
+        newNode.children.sound = {
+            
+                "extends": "http://vwf.example.com/aframe/a-sound-component.vwf",
+                "type": "component",
+                "properties": {
+                    "autoplay": true,
+                    "loop": true,
+                    "src": '#' + child.itemID
+                }
+            
+        };
+
+        self.children.create(nodeName, newNode, function( child ) {
+            if (avatar) child.lookAt(self.children[avatar].worldPosition)
+           });
+
+       // }
+        
+
+       });
+
+}
+
+this.createGooglePoly = function(polyID, name, node, avatar){
+
+    // all done in aframe view driver
+    let params = [polyID, name, node, avatar];
+    this.loadGooglePolyAsset(params)
+  
+}
+
+this.loadGooglePolyAsset = function( params ) {
+
+    var self = this;
+
+    const API_KEY = "AIzaSyCGx2_idlUJ88yW5GBkOllIkyxJyKbEgDk";
+    const id = params[0];
+    const avatarID = params[3];
+
+
+    var url = `https://poly.googleapis.com/v1/assets/${id}/?key=${API_KEY}`;
+
+    var request = new XMLHttpRequest();
+    request.open( 'GET', url, true );
+    request.addEventListener( 'load', function ( event ) {
+
+        var asset = JSON.parse( event.target.response );
+
+        // asset_name.textContent = asset.displayName;
+        // asset_author.textContent = asset.authorName;
+
+        var format = asset.formats.find( format => { return format.formatType === 'OBJ'; } );
+
+        if ( format !== undefined ) {
+
+            var obj = format.root;
+            var mtl = format.resources.find( resource => { return resource.url.endsWith( 'mtl' ) } );
+
+            var path = obj.url.slice( 0, obj.url.indexOf( obj.relativePath ) );
+            
+            //const createOnNodeID = vwf.application();
+
+            let mtlName = 'MTL-ASSET-'+ self.GUID();
+            let mtlNode = {
+                "extends": "http://vwf.example.com/aframe/a-asset-item.vwf",
+                "properties": {
+                    "itemID": mtlName,
+                    "itemSrc": mtl.url
+                }
+            }
+        
+            self.children.create(mtlName, mtlNode, function( mtlChild ) {
+
+                let objName = 'OBJ-ASSET-'+ self.GUID();
+                let objNode = {
+                    "extends": "http://vwf.example.com/aframe/a-asset-item.vwf",
+                    "properties": {
+                        "itemID": objName,
+                        "itemSrc": obj.url
+                    }
+                }
+
+                self.children.create(objName, objNode, function( objChild ) {
+
+                        self.createModelObj(mtlChild.itemID, objChild.itemID, asset.displayName, avatarID);
+
+                })
+
+
+            })
+        }
+
+    } );
+    request.send( null );
+}
+
 this.GUID = function () {
     var self = this;
     var S4 = function () {

+ 50 - 4
support/proxy/vwf.example.com/aframe/ascene.vwf.yaml

@@ -12,9 +12,10 @@ methods:
   createPrimitive:
     parameters:
       - type
-      - avatar
+      - params
       - name
       - node
+      - avatar
   createAssetItemImg:
   planeProto:
   cubeProto:
@@ -23,11 +24,56 @@ methods:
   coneProto:
   textProto:
   lightProto:
-     parameters:
+    parameters:
       - lightType
-  createModelDAE:
+  createImage:
+    parameters:
+      - imgSrc
+      - name
+      - node
+      - avatar
+  createAudio:
+    parameters:
+      - itemSrc
+      - name
+      - node
+      - avatar
+  createVideo:
+    parameters:
+      - vidSrc
+      - name
+      - node
+      - avatar
+  createAssetResource:
+    parameters:
+      - resType
+      - resSrc
+  createModel:
     parameters:
-      - src
+      - modelType
+      - modelSrc
+      - avatar
+  createModelObj:
+    parameters:
+      - mtlSrc
+      - objSrc
+      - name
+      - avatar
+  createGooglePoly:
+    parameters:
+      - polyID
+      - name
+      - node
+      - avatar
+  createCamera:
+    parameters:
+      - name
+      - node
+      - avatar
+  createCameraWithOffset:
+    parameters:
+      - name
+      - node
       - avatar
   deleteNode:
     parameters:

+ 0 - 8
support/proxy/vwf.example.com/aframe/asound.vwf.yaml

@@ -1,8 +0,0 @@
-# https://aframe.io/docs/master/primitives/a-sound.html
---- 
-extends: http://vwf.example.com/aframe/aentity.vwf
-type: "a-sound"
-properties:
-  src:
-  on:
-  autoplay: