소스 검색

add gearvr controller

Nikolay Suslov 7 년 전
부모
커밋
3dca788987

+ 9 - 6
support/client/lib/vwf/model/aframe/addon/aframe-components.js

@@ -374,17 +374,20 @@ AFRAME.registerComponent('sun', {
 AFRAME.registerComponent('gearvrcontrol', {
     
         init: function () {
-            this.gearel = document.querySelector('#gearvrcontrol');
-            //this.el.sceneEl.querySelector('#gearvrcontrols')
+            var self = this;
+            var controllerID = 'controlvr-' + vwf_view.kernel.moniker();
+            //this.gearel = document.querySelector('#gearvrcontrol');
+            this.el.addEventListener('triggerdown', function (event) {
+              vwf_view.kernel.callMethod(controllerID, "triggerdown", []);
+              });
+              this.el.addEventListener('triggerup', function (event) {
+               vwf_view.kernel.callMethod(controllerID, "triggerup", []);
+              });
         },
     
         update: function () {
         },
     
         tick: function (t) {
-        //    if (this.gearel) {
-        //     let rot = this.gearel.getAttribute('rotation');
-        //     this.el.setAttribute('rotation', rot);
-        //    }
         }
     })

+ 0 - 9
support/client/lib/vwf/model/aframeComponent.js

@@ -923,15 +923,6 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
  
          }
 
-         if (self.state.isComponentClass(protos, "http://vwf.example.com/aframe/gearvrcontrol-component.vwf")) {
-            
- 
-                // aframeObj.el.setAttribute(node.type, {});
-             aframeObj.compName = "gearvrcontrol";
-             aframeObj.el.setAttribute(aframeObj.compName, {});
- 
-         }
-
         if (self.state.isComponentClass(protos, "http://vwf.example.com/aframe/gearvr-controlsComponent.vwf")) {
 
 

+ 174 - 113
support/client/lib/vwf/view/aframe.js

@@ -34,7 +34,7 @@ define(["module", "vwf/view"], function (module, view) {
 
             this.state.appInitialized = false;
 
-            if ( options === undefined ) { options = {}; }
+            if (options === undefined) { options = {}; }
 
             if (typeof options == "object") {
 
@@ -44,9 +44,9 @@ define(["module", "vwf/view"], function (module, view) {
                 this.rootSelector = options;
             }
 
-            this.gearvr = options.gearvr !== undefined  ? options.gearvr : false;
-            this.wmrright = options.wmrright !== undefined  ? options.wmrright : false;
-            this.wmrleft = options.wmrleft !== undefined  ? options.wmrleft : false;
+            this.gearvr = options.gearvr !== undefined ? options.gearvr : false;
+            this.wmrright = options.wmrright !== undefined ? options.wmrright : false;
+            this.wmrleft = options.wmrleft !== undefined ? options.wmrleft : false;
         },
 
         createdNode: function (nodeID, childID, childExtendsID, childImplementsIDs,
@@ -66,29 +66,37 @@ define(["module", "vwf/view"], function (module, view) {
                 createAvatarControl(scene);
                 createAvatar.call(this, childID);
 
-               // this.state.appInitialized  = true;
-
-               if (this.gearvr == true) {
-                   console.log("CREATE GEARVR HERE!!");
-                   createGearVRControls();
-                   createControlVR.call(this, childID, 'controlvr-');
-               }
-               if (this.wmrright == true) {
-                console.log("CREATE WMR RIGHT HERE!!");
-                createWMRVRControls('right');
-                createControlVR.call(this, childID, 'wmrvr-right-');
-            }
-            if (this.wmrright == true) {
-                console.log("CREATE WMR LEFT HERE!!");
-                createWMRVRControls('left');
-                createControlVR.call(this, childID, 'wmrvr-left-');
-            }
-                
+                // this.state.appInitialized  = true;
+
+                if (this.gearvr == true) {
+                    console.log("CREATE GEARVR HERE!!");
+
+                    if (AFRAME.utils.device.isGearVR()) {
+                        let nodeName = 'controlvr-' + self.kernel.moniker();
+                        createGearVRControls();
+                        createGearVRController.call(this, childID, nodeName);
+                    }
+                }
+                // if (this.wmrright == true) {
+                //     console.log("CREATE WMR RIGHT HERE!!");
+                //     if (AFRAME.utils.device.checkHasPositionalTracking()) {
+                //         createWMRVRControls('right');
+                //         createControlVR.call(this, childID, 'wmrvr-right-');
+                //     }
+                // }
+                // if (this.wmrright == true) {
+                //     console.log("CREATE WMR LEFT HERE!!");
+                //     if (AFRAME.utils.device.checkHasPositionalTracking()) {
+                //         createWMRVRControls('left');
+                //         createControlVR.call(this, childID, 'wmrvr-left-');
+                //     }
+                // }
+
             }
 
             if (this.state.nodes[childID] && this.state.nodes[childID].aframeObj) {
-                    this.nodes[childID] = {id:childID,extends:childExtendsID};
-                }
+                this.nodes[childID] = { id: childID, extends: childExtendsID };
+            }
 
             // if(this.state.nodes[childID]) {
             //     this.nodes[childID] = {id:childID,extends:childExtendsID};
@@ -100,7 +108,7 @@ define(["module", "vwf/view"], function (module, view) {
         },
 
 
-        initializedNode: function( nodeID, childID ) {
+        initializedNode: function (nodeID, childID) {
 
             var node = this.state.nodes[childID];
             if (!node) {
@@ -108,7 +116,7 @@ define(["module", "vwf/view"], function (module, view) {
             }
 
 
-          
+
 
         },
 
@@ -123,9 +131,9 @@ define(["module", "vwf/view"], function (module, view) {
         satProperty: function (nodeId, propertyName, propertyValue) {
             var selfs = this;
 
-             var node = this.state.nodes[ nodeId ];
+            var node = this.state.nodes[nodeId];
 
-            if ( !( node && node.aframeObj ) ) {
+            if (!(node && node.aframeObj)) {
                 return;
             }
 
@@ -154,25 +162,25 @@ define(["module", "vwf/view"], function (module, view) {
 
                 let avatarID = self.kernel.moniker();
                 var nodeName = 'avatar-' + avatarID;
-        
+
                 var newNode = {
                     "id": avatarName,
                     "uri": avatarName,
                     "extends": "http://vwf.example.com/aframe/avatar.vwf",
-                    "properties":{
+                    "properties": {
                         "localUrl": '',
-                        "remoteUrl":'',
+                        "remoteUrl": '',
                         "displayName": randId(),
                         "sharing": { audio: true, video: true }
                     }
                 }
-                
-               
+
+
                 if (!self.state.nodes[avatarName]) {
 
-                vwf_view.kernel.createChild(nodeID, avatarName, newNode);
-                vwf_view.kernel.callMethod(avatarName, "createAvatarBody", []);
-                //"/../assets/avatars/male/avatar1.gltf"
+                    vwf_view.kernel.createChild(nodeID, avatarName, newNode);
+                    vwf_view.kernel.callMethod(avatarName, "createAvatarBody", []);
+                    //"/../assets/avatars/male/avatar1.gltf"
                 }
 
             }
@@ -190,60 +198,84 @@ define(["module", "vwf/view"], function (module, view) {
 
             updateAvatarPosition();
             updateHandControllerVR('controlvr-', '#gearvrcontrol');
-            updateHandControllerVR('wmrvr-right-', '#wmrvrcontrolright');
-            updateHandControllerVR('wmrvr-left-', '#wmrvrcontrolleft');
+            // updateHandControllerVR('wmrvr-right-', '#wmrvrcontrolright');
+            // updateHandControllerVR('wmrvr-left-', '#wmrvrcontrolleft');
+
 
-           
             //lerpTick ()
         }
 
 
     });
 
+    function compareCoordinates(a, b) {
+        return a.x !== b.x || a.y !== b.y || a.z !== b.z
 
-    function updateHandControllerVR(aName, aSelector) {
-        //let avatarName = 'avatar-' + self.kernel.moniker();
-        let avatarName = aName + self.kernel.moniker();
-        let el = document.querySelector(aSelector);
+    }
+
+    function updateAvatarPosition() {
+
+        let avatarName = 'avatar-' + self.kernel.moniker();
+        var node = self.state.nodes[avatarName];
+        if (!node) return;
+        if (!node.aframeObj) return;
+
+        let el = document.querySelector('#avatarControl');
         if (el) {
             let position = el.getAttribute('position');
             let rotation = el.getAttribute('rotation');
 
-            if ( position && rotation) {
-               // vwf_view.kernel.callMethod(avatarName, "updateAvatarVRControl", [postion, rotation]);
-         vwf_view.kernel.setProperty(avatarName, "rotation", AFRAME.utils.coordinates.stringify(rotation));
-         vwf_view.kernel.setProperty(avatarName, "position", AFRAME.utils.coordinates.stringify(position));
-         //AFRAME.utils.coordinates.stringify(position)
+            let currentPosition = node.aframeObj.getAttribute('position');
+            let currentRotation = node.aframeObj.getAttribute('rotation');
+
+            if (position && rotation && currentPosition && currentRotation) {
+                if (compareCoordinates(position, currentPosition) || rotation.y !== currentRotation.y) {
+                    console.log("not equal!!")
+                    vwf_view.kernel.callMethod(avatarName, "followAvatarControl", [position, rotation]);
+                }
             }
         }
-
     }
 
-    function updateAvatarPosition() {
 
-        let avatarName = 'avatar-' + self.kernel.moniker();
-        let el = document.querySelector('#avatarControl');
+    function updateHandControllerVR(aName, aSelector) {
+        //let avatarName = 'avatar-' + self.kernel.moniker();
+        let avatarName = aName + self.kernel.moniker();
+        var node = self.state.nodes[avatarName];
+        if (!node) return;
+        if (!node.aframeObj) return;
+
+        let el = document.querySelector(aSelector);
         if (el) {
-            let postion = el.getAttribute('position');
+            let position = el.getAttribute('position');
             let rotation = el.getAttribute('rotation');
 
-            if ( postion && rotation) {
-                //[postion.x, postion.y, postion.z] //[rotation.x, rotation.y, rotation.z]
+            let currentPosition = node.aframeObj.getAttribute('position');
+            let currentRotation = node.aframeObj.getAttribute('rotation');
+
+            if (position && rotation && currentPosition && currentRotation) {
+                if (compareCoordinates(position, currentPosition) || compareCoordinates(rotation, currentRotation)) {
+                    console.log("not equal!!");
+
+                    vwf_view.kernel.setProperty(avatarName, "rotation", AFRAME.utils.coordinates.stringify(rotation));
+                    vwf_view.kernel.setProperty(avatarName, "position", AFRAME.utils.coordinates.stringify(position));
 
-                vwf_view.kernel.callMethod(avatarName, "followAvatarControl", [postion, rotation]);
 
-            // vwf_view.kernel.setProperty(avatarName, "position", AFRAME.utils.coordinates.stringify(postion));
-            // vwf_view.kernel.setProperty(avatarName, "rotation", AFRAME.utils.coordinates.stringify(rotation));
+                }
             }
+
         }
+
     }
 
+
+
     function createAvatarControl(aScene) {
 
         let avatarName = 'avatar-' + self.kernel.moniker();
 
         let controlEl = document.createElement('a-camera');
-       // controlEl.setAttribute('avatar', '');
+        // controlEl.setAttribute('avatar', '');
         controlEl.setAttribute('id', 'avatarControl');
         controlEl.setAttribute('wasd-controls', {});
         controlEl.setAttribute('look-controls', {});
@@ -254,35 +286,53 @@ define(["module", "vwf/view"], function (module, view) {
         aScene.appendChild(controlEl);
 
         let cursorEl = document.createElement('a-cursor');
-        cursorEl.setAttribute('id', 'cursor-'+avatarName);
+        cursorEl.setAttribute('id', 'cursor-' + avatarName);
         cursorEl.setAttribute('raycaster', {});
         cursorEl.setAttribute('raycaster', 'objects', '.intersectable');
         cursorEl.setAttribute('raycaster', 'showLine', false);
 
-       // cursorEl.setAttribute('raycaster', {objects: '.intersectable', showLine: true, far: 100});
-       // cursorEl.setAttribute('raycaster', 'showLine', true);
+        // cursorEl.setAttribute('raycaster', {objects: '.intersectable', showLine: true, far: 100});
+        // cursorEl.setAttribute('raycaster', 'showLine', true);
         controlEl.appendChild(cursorEl);
 
         // let gearVRControlsEl = document.createElement('a-entity');
         // gearVRControlsEl.setAttribute('id', 'gearvr-'+avatarName);
         // gearVRControlsEl.setAttribute('gearvr-controls', {});
         // aScene.appendChild(gearVRControlsEl);
-        
 
-       
-    //     controlEl.addEventListener('componentchanged', function (evt) {
-    //     if (evt.detail.name === 'position') {
-    //         var eventParameters = evt.detail.newData;
-    //          vwf_view.kernel.setProperty(avatarName, "position", [eventParameters.x, eventParameters.y, eventParameters.z]);
-    //     }
 
-    //      if (evt.detail.name === 'rotation') {
-    //         var eventParameters = evt.detail.newData;
-    //            vwf_view.kernel.setProperty(avatarName, "rotation", [eventParameters.x, eventParameters.y, eventParameters.z]);
-    //     }
 
-    // });
+        //     controlEl.addEventListener('componentchanged', function (evt) {
+        //     if (evt.detail.name === 'position') {
+        //         var eventParameters = evt.detail.newData;
+        //          vwf_view.kernel.setProperty(avatarName, "position", [eventParameters.x, eventParameters.y, eventParameters.z]);
+        //     }
+
+        //      if (evt.detail.name === 'rotation') {
+        //         var eventParameters = evt.detail.newData;
+        //            vwf_view.kernel.setProperty(avatarName, "rotation", [eventParameters.x, eventParameters.y, eventParameters.z]);
+        //     }
+
+        // });
+
+    }
+
+    function createGearVRController(nodeID, nodeName) {
+
+            var newNode = {
+                "id": nodeName,
+                "uri": nodeName,
+                "extends": "http://vwf.example.com/aframe/gearvrcontroller.vwf",
+                "properties": {
+                }
+            }
+
+            if (!self.state.nodes[nodeName]) {
 
+                vwf_view.kernel.createChild(nodeID, nodeName, newNode);
+                vwf_view.kernel.callMethod(nodeName, "createController", []);
+                //"/../assets/controller/gearvr.gltf"
+            }
     }
 
     function createAvatar(nodeID) {
@@ -297,16 +347,16 @@ define(["module", "vwf/view"], function (module, view) {
         //     "uri": nodeName,
         //     "extends": "http://vwf.example.com/aframe/avatar.vwf"
         // }
-        
-       
+
+
         // vwf_view.kernel.createChild(nodeID, nodeName, newNode);
         // vwf_view.kernel.callMethod(nodeName, "createAvatarBody");
     }
 
     function randId() {
         return '_' + Math.random().toString(36).substr(2, 9);
-   }
-    
+    }
+
     function createGearVRControls() {
 
         let sceneEl = document.querySelector('a-scene');
@@ -314,58 +364,69 @@ define(["module", "vwf/view"], function (module, view) {
         gearvr.setAttribute('id', 'gearvrcontrol');
         gearvr.setAttribute('gearvr-controls', '');
         gearvr.setAttribute('gearvr-controls', 'hand', 'right');
+        gearvr.setAttribute('gearvrcontrol', '');
         sceneEl.appendChild(gearvr);
 
     }
 
     function createWMRVRControls(hand) {
-        
-                let sceneEl = document.querySelector('a-scene');
-                let wmrvr = document.createElement('a-entity');
-                wmrvr.setAttribute('id', 'wmrvrcontrol'+hand);
-                wmrvr.setAttribute('windows-motion-controls', '');
-                wmrvr.setAttribute('windows-motion-controls', 'hand', hand);
-                sceneEl.appendChild(wmrvr);
-            }
+
+        let sceneEl = document.querySelector('a-scene');
+        let wmrvr = document.createElement('a-entity');
+        wmrvr.setAttribute('id', 'wmrvrcontrol' + hand);
+        wmrvr.setAttribute('windows-motion-controls', '');
+        wmrvr.setAttribute('windows-motion-controls', 'hand', hand);
+        sceneEl.appendChild(wmrvr);
+    }
 
 
 
     function createControlVR(nodeID, name) {
-        
-                let avatarID = self.kernel.moniker();
-                var nodeName = name + avatarID;
-        
-                var newNode = { 
+
+        let avatarID = self.kernel.moniker();
+        var nodeName = name + avatarID;
+
+        var newNode = {
             "id": nodeName,
-             "uri": nodeName,
-                "extends": "http://vwf.example.com/aframe/abox.vwf",
-                "properties": {
-                    "color": "white",
-                    "position": "0 0 0",
-                    "height": 0.1,
-                    "width": 0.1,
-                    "depth": 1,
+            "uri": nodeName,
+            "extends": "http://vwf.example.com/aframe/abox.vwf",
+            "properties": {
+                "color": "white",
+                "position": "0 0 0",
+                "height": 0.01,
+                "width": 0.01,
+                "depth": 1,
+            },
+            children: {
+                "cur": {
+                    "extends": "http://vwf.example.com/aframe/abox.vwf",
+                    "properties": {
+                        "color": "green",
+                        "position": "0 0 -1",
+                        "height": 0.2,
+                        "width": 0.2,
+                        "depth": 0.2
+                    }
                 },
-                children: {
-                    "gearvr":
+                "gearvr":
                     {
                         "extends": "http://vwf.example.com/aframe/gearvrcontrol-component.vwf",
                         "type": "component",
                         "properties": {
                         }
+                    },
+                "interpolation":
+                    {
+                        "extends": "http://vwf.example.com/aframe/interpolation-component.vwf",
+                        "type": "component",
+                        "properties": {
+                        }
                     }
-                    // "interpolation":
-                    // {
-                    //     "extends": "http://vwf.example.com/aframe/interpolation-component.vwf",
-                    //     "type": "component",
-                    //     "properties": {
-                    //     }
-                    // }
-                }
-            }
-               
-            vwf_view.kernel.createChild(nodeID, nodeName, newNode);
-                // vwf_view.kernel.callMethod(nodeName, "createAvatarBody");
             }
+        }
+
+        vwf_view.kernel.createChild(nodeID, nodeName, newNode);
+        // vwf_view.kernel.callMethod(nodeName, "createAvatarBody");
+    }
 
 });

+ 16 - 0
support/proxy/vwf.example.com/aframe/ascene.js

@@ -27,6 +27,22 @@ this.clientWatch = function () {
                     } else {
                         //console.log(node.id + " needed to delete!");
                         self.children.delete(self.children[node.id]);
+                        //'controlvr-'
+                        let controllerVR = self.children['controlvr-'+ node.id.slice(7)];
+                        if (controllerVR){
+                            self.children.delete(controllerVR);
+                        }
+
+                        let wmrvR = self.children['wmrvr-right-'+ node.id.slice(7)];
+                        if (wmrvR){
+                            self.children.delete(wmrvR);
+                        }
+                        
+                        let wmrvL = self.children['wmrvr-left-'+ node.id.slice(7)];
+                        if (wmrvL){
+                            self.children.delete(wmrvL);
+                        }
+                        
                     }
                 }
             });

+ 9 - 32
support/proxy/vwf.example.com/aframe/avatar.js

@@ -1,22 +1,3 @@
-this.simpleVrControllerDef = {
-    "extends": "http://vwf.example.com/aframe/abox.vwf",
-    "properties": {
-        "color": "white",
-        "position": "0.5 0 -2",
-        "height": 0.3,
-        "width": 0.3,
-        "depth": 1,
-    },
-    children: {
-        "gearvr":
-        {
-            "extends": "http://vwf.example.com/aframe/gearvrcontrol-component.vwf",
-            "type": "component",
-            "properties": {
-            }
-        }
-    }
-}
 this.simpleBodyDef = {
     "extends": "http://vwf.example.com/aframe/abox.vwf",
     "properties": {
@@ -58,7 +39,7 @@ this.createAvatarBody = function (modelSrc) {
 
     let myColor = this.getRandomColor();
     let myBodyDef = this.simpleBodyDef;
-    let myHandDef = this.simpleVrControllerDef;
+    //let myHandDef = this.simpleVrControllerDef;
 
     myBodyDef.properties.color = myColor;
 
@@ -260,7 +241,7 @@ this.getRandomColor = function () {
 this.followAvatarControl = function (position, rotation) {
     // this.position = AFRAME.utils.coordinates.stringify(position);
     // this.rotation = AFRAME.utils.coordinates.stringify(rotation);
-
+//debugger;
 
     this.position = AFRAME.utils.coordinates.stringify(position);
     let myRot = AFRAME.utils.coordinates.parse(this.rotation);
@@ -283,16 +264,6 @@ this.followAvatarControl = function (position, rotation) {
     // this.avatarCamera.rotation = [rotation.x, myHeadRot.y, rotation.z];  
 }
 
-this.updateAvatarVRControl = function(position, rotation){
-
-    let myBodyRot = AFRAME.utils.coordinates.parse(this.avatarNode.myBody.rotation);
-    this.avatarNode.myHand.rotation = rotation;
-    this.avatarNode.myHand.position = position;
-    //console.log(this.avatarNode.myHand.rotation);
-
-}
-
-
 this.createSimpleAvatar = function(){
        if (this.avatarNode.myBody) {
         this.avatarNode.children.delete(this.avatarNode.myBody);
@@ -348,4 +319,10 @@ this.setVideoTexture = function(val){
     this.avatarNode.myHead.visual.color = "white";
     this.avatarNode.myHead.visual.src = '#temp';
     this.avatarNode.myHead.visual.src = '#'+val;
-}
+}
+
+this.initialize = function() {
+   // this.future(0).updateAvatar();
+};
+
+

+ 2 - 4
support/proxy/vwf.example.com/aframe/avatar.vwf.yaml

@@ -9,6 +9,8 @@ properties:
     displayName:
     sharing: { audio: true, video: true }
 methods:
+    initialize:
+    updateAvatar:
     showHideCursor:
         parameters:
             - bool
@@ -24,10 +26,6 @@ methods:
         parameters:
             - position
             - rotation
-    updateAvatarVRControl:
-        parameters:
-            - position
-            - rotation
     setSmallVideoHead:
     setBigVideoHead:
     setVideoTexture:

+ 0 - 5
support/proxy/vwf.example.com/aframe/gearvrcontrol-component.vwf.yaml

@@ -1,5 +0,0 @@
-# Interpolation
----
-extends: http://vwf.example.com/aframe/aentityComponent.vwf
-type: "component"
-properties:

+ 132 - 0
support/proxy/vwf.example.com/aframe/gearvrcontroller.js

@@ -0,0 +1,132 @@
+this.simpleDef = {
+    "extends": "http://vwf.example.com/aframe/abox.vwf",
+    "properties": {
+        "color": "white",
+        "position": "0 0 0",
+        "height": 0.01,
+        "width": 0.01,
+        "depth": 1,
+    },
+    children: {
+        "pointer": {
+            "extends": "http://vwf.example.com/aframe/abox.vwf",
+            "properties": {
+                "color": "green",
+                "position": "0 0 -0.8",
+                "height": 0.1,
+                "width": 0.1,
+                "depth": 0.1
+            }
+        },
+        "interpolation":
+            {
+                "extends": "http://vwf.example.com/aframe/interpolation-component.vwf",
+                "type": "component",
+                "properties": {
+                }
+            }
+    }
+}
+
+this.modelDef = {
+    "extends": "http://vwf.example.com/aframe/agltfmodel.vwf",
+    "properties": {
+        "src": "#gearvr",
+        "position": "0 0 0",
+        "rotation": "0 180 0"
+    },
+    "children": {
+        "animation-mixer": {
+            "extends": "http://vwf.example.com/aframe/anim-mixer-component.vwf",
+            "properties": {
+                "clip": "*",
+                "duration": 1
+            }
+        }
+
+    }
+}
+
+this.createController = function (modelSrc) {
+
+    let controllerDef = this.simpleDef;
+
+    var newNode = {
+        "extends": "http://vwf.example.com/aframe/aentity.vwf",
+        "properties": {
+            "position": [0, 0, 0]
+        },
+        children: {
+            "controller": controllerDef
+        }
+    }
+
+    if (modelSrc) {
+
+        let controllerDef = this.modelDef;
+        controllerDef.properties.src = modelSrc;
+        newNode.children.controller = controllerDef;
+    }
+
+
+    let interpolation =  {
+        "extends": "http://vwf.example.com/aframe/interpolation-component.vwf",
+        "type": "component",
+        "properties": {
+            "enabled": true,
+            "duration": 50,
+            "deltaPos": 0,
+            "deltaRot": 0
+        }
+    }
+
+
+    this.children.create( "interpolation", interpolation );
+    this.children.create("gearVRNode", newNode);
+
+}
+
+
+this.updateAvatarVRControl = function(position, rotation){
+
+    this.rotation = rotation;
+    this.position = position;
+
+}
+
+
+this.createSimpleController = function(){
+       if (this.gearVRNode.controller) {
+        this.gearVRNode.children.delete(this.gearVRNode.controller);
+
+        let controllerDef = this.simpleDef;
+
+        this.gearVRNode.children.create("controller", controllerDef);
+
+       }
+}
+
+this.createAvatarFromGLTF = function(modelSrc){
+
+    if (this.gearVRNode.controller) {
+        this.gearVRNode.children.delete(this.gearVRNode.controller);
+        
+        let controllerDef = this.modelDef;
+        controllerDef.properties.src = modelSrc;
+
+        this.gearVRNode.children.create("controller", controllerDef);
+
+       }
+}
+
+this.initialize = function() {
+   // this.future(0).update();
+}
+
+this.triggerdown = function() {
+    this.gearVRNode.controller.pointer.color = 'red'
+ }
+
+ this.triggerup = function() {
+    this.gearVRNode.controller.pointer.color = 'green'
+ }

+ 24 - 0
support/proxy/vwf.example.com/aframe/gearvrcontroller.vwf.yaml

@@ -0,0 +1,24 @@
+# gearvr controller
+# Copyright 2017 Krestianstvo.org project
+---
+extends: http://vwf.example.com/aframe/aentity.vwf
+type: "gearvr"
+properties:
+methods:
+    initialize:
+    updateController:
+    createSimpleController:
+    createControllerFromGLTF:
+        parameters:
+            - modelSrc
+    createController:
+        parameters:
+            - modelSrc
+    updateVRControl:
+        parameters:
+            - position
+            - rotation
+    triggerdown:
+    triggerup:
+scripts:
+- source: "http://vwf.example.com/aframe/gearvrcontroller.js"