-- Leo's gemini proxy

-- Connecting to git.thebackupbox.net:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

repo: janusweb
action: commit
revision:
path_from:
revision_from: e6be82f1ac03911a82a7471a4104add0191f5881:
path_to:
revision_to:

git.thebackupbox.net

janusweb

git://git.thebackupbox.net/janusweb

commit e6be82f1ac03911a82a7471a4104add0191f5881
Author: James Baicoianu <james_github@baicoianu.com>
Date:   Tue Oct 9 14:47:40 2018 -0700

    Room edit improvements

diff --git a/scripts/room.js b/scripts/room.js

index a753997d6bd2498d10e3a27bccf4c6489dc4b44c..

index ..1de888e3dfa97ca33b5567dd8bafa05221536b6f 100644

--- a/scripts/room.js
+++ b/scripts/room.js
@@ -103,20 +103,23 @@ elation.require([
       this.roomedit = {
         snap: .01,
         modes: ['pos', 'rotation', 'scale', 'col'],
+        movespeed: new THREE.Vector3(),
         modeid: 0,
         object: false,
         distancescale: 1
       };
       this.engine.systems.controls.addContext('roomedit', {
+        'accept':           [ 'keyboard_enter', (ev) => { if (ev.value) this.editObjectStop(); } ],
         'cancel':           [ 'keyboard_esc', this.editObjectCancel ],
         'delete':           [ 'keyboard_delete,keyboard_backspace', this.editObjectDelete ],
         'mode':             [ 'keyboard_tab', this.editObjectToggleMode ],
-        'manipulate_left':  [ 'keyboard_nomod_a,keyboard_a',   this.editObjectManipulateLeft ],
-        'manipulate_right': [ 'keyboard_nomod_d,keyboard_d',   this.editObjectManipulateRight ],
-        'manipulate_up':    [ 'keyboard_nomod_w,keyboard_w',   this.editObjectManipulateUp ],
-        'manipulate_down':  [ 'keyboard_nomod_s,keyboard_s',   this.editObjectManipulateDown ],
-        'manipulate_in':    [ 'keyboard_nomod_q,mouse_wheel_down',   this.editObjectManipulateIn ],
-        'manipulate_out':   [ 'keyboard_nomod_e,mouse_wheel_up',   this.editObjectManipulateOut ],
+        'toggle_raycast':   [ 'keyboard_shift',   this.editObjectToggleRaycast ],
+        'manipulate_left':  [ 'keyboard_j',   this.editObjectManipulateLeft ],
+        'manipulate_right': [ 'keyboard_l',   this.editObjectManipulateRight ],
+        'manipulate_up':    [ 'keyboard_i',   this.editObjectManipulateUp ],
+        'manipulate_down':  [ 'keyboard_k',   this.editObjectManipulateDown ],
+        'manipulate_in':    [ 'keyboard_u',   this.editObjectManipulateIn ],
+        'manipulate_out':   [ 'keyboard_o',   this.editObjectManipulateOut ],
         //'manipulate_mouse': [ 'mouse_delta',   this.editObjectManipulateMouse ],
         'snap_ones':        [ 'keyboard_1',   this.editObjectSnapOnes ],
         'snap_tenths':      [ 'keyboard_2',   this.editObjectSnapTenths ],
@@ -1445,6 +1448,12 @@ elation.require([
         link.activate();
       }
     }
+    this.closeLink = function(js_id) {
+      var link = this.jsobjects[js_id];
+      if (link) {
+        link.closePortal();
+      }
+    }
     this.getObjectFromProxy = function(proxy, children) {
       return proxy._target;
     }
@@ -1881,6 +1890,7 @@ elation.require([
       ev.preventDefault();
       var files = ev.dataTransfer.files,
           items = ev.dataTransfer.items;
+      this.roomedit.raycast = true;
       if (files.length > 0) {
         var objects = [];
         for (var i = 0; i < files.length; i++) {
@@ -1926,7 +1936,7 @@ elation.require([
             // Handle special schemes which are used for internal primitives
             var scheme = id.substr(0, schemeidx);
             if (scheme == 'janus-object') {
-              id = id.substr(schemeidx+1);
+              objargs.id = id.substr(schemeidx+1);
             } else if (scheme == 'janus-light') {
               type = 'light';
               if (id == 'point') {
@@ -1935,11 +1945,14 @@ elation.require([
               }
             }
           }
+          if (id.match(/\.(png|gif|jpg|jpeg)/i)) {
+            type = 'image';
+          }
           if (typeof EventBridge != 'undefined') {
             // if EventBridge is defined, we're (probably) running inside of High Fidelity, so just spawn this object
             EventBridge.emitWebEvent(JSON.stringify({
               type: 'spawn',
-              data: id
+              data: objargs.id
             }));
           } else {
             var newobject = this.createObject(type, objargs);
@@ -1956,7 +1969,8 @@ elation.require([
     }
     this.loadObjectFromFile = function(file) {
       var name = file.name,
-          url = URL.createObjectURL(file);
+          url = URL.createObjectURL(file),
+          object;

       var type = 'object',
           args = {
@@ -1972,6 +1986,33 @@ elation.require([
       var mimeparts = file.type.split('/');
       if (mimeparts[0] == 'image') {
         type = 'image';
+        // We're going to send the local file's image data over the network, but we want to cap at a max size to avoid bogging down the network
+        let maxsize = 512;
+        args.onload = (ev) => {
+          if (!args.loaded) {
+            args.loaded = true;
+            let fullcanvas = ev.element.asset.canvas;
+            let rawimage = ev.element.asset.rawimage;
+            let aspect = rawimage.width / rawimage.height;
+
+            let canvas = document.createElement('canvas');
+            let realsize = [rawimage.width, rawimage.height];
+            if (realsize[0] <= maxsize && realsize[1] < maxsize) {
+              object.id = object.image_id = rawimage.toDataURL(file.type);
+            } else {
+              if (realsize[0] > realsize[1]) {
+                canvas.width = maxsize;
+                canvas.height = maxsize / aspect;
+              } else {
+                canvas.height = maxsize;
+                canvas.width = maxsize * aspect;
+              }
+              let ctx = canvas.getContext('2d');
+              ctx.drawImage(rawimage, 0, 0, rawimage.width, rawimage.height, 0, 0, canvas.width, canvas.height);
+              object.id = object.image_id = canvas.toDataURL(file.type);
+            }
+          }
+        };
       } else if (mimeparts[0] == 'video') {
         type = 'video';
         args.video_id = name;
@@ -1986,7 +2027,8 @@ elation.require([
         args.collision_id = name;
       }
       this.loadNewAsset(type, assetargs);
-      return this.createObject(type, args);
+      object = this.createObject(type, args);
+      return object;
     }
     this.editObject = function(object, isnew) {
       this.roomedit.object = object;
@@ -1994,6 +2036,7 @@ elation.require([
       this.roomedit.modeid = 0;
       this.roomedit.objectIsNew = isnew;
       this.roomedit.moving = true;
+      this.roomedit.movespeed.set(0, 0, 0);

       object.sync = true;
       if (!object.js_id) {
@@ -2004,6 +2047,7 @@ elation.require([
       object.addEventListener('load', (ev) => {
         this.roomedit.objectBoundingBox = object.getBoundingBox(true);
         this.editObjectUpdate();
+        this.editObjectShowWireframe();
         console.log('update bbox', this.roomedit.objectBoundingBox);
       });

@@ -2032,8 +2076,8 @@ elation.require([
       }

       // activate context
-      //this.engine.systems.controls.activateContext('roomedit', this);
-      this.engine.systems.controls.activateContext('roomedit_togglemove', this);
+      this.engine.systems.controls.activateContext('roomedit', this);
+      //this.engine.systems.controls.activateContext('roomedit_togglemove', this);

       this.editObjectShowWireframe();
     }
@@ -2102,7 +2146,7 @@ elation.require([

       // deactivate context
       this.engine.systems.controls.deactivateContext('roomedit', this);
-      this.engine.systems.controls.deactivateContext('roomedit_togglemove', this);
+      //this.engine.systems.controls.deactivateContext('roomedit_togglemove', this);
     }
     this.editObjectRevert = function() {
       var object = this.roomedit.object;
@@ -2115,7 +2159,7 @@ elation.require([
     this.editObjectMousemove = function(ev) {
       if (this.roomedit.object) {
         var obj = this.roomedit.object;
-        if (this.roomedit.moving && ev.element.getProxyObject() !== obj) {
+        if (this.roomedit.moving && this.roomedit.raycast && ev.element.getProxyObject() !== obj) {
           this.roomedit.objectPosition = ev.data.point;
           this.editObjectUpdate();
         }
@@ -2142,13 +2186,22 @@ elation.require([
       obj.pos = newpos;
       obj.sync = true;
     }
-    this.editObjectMousewheel = function(ev) {
-      //this.roomedit.distancescale *= (ev.deltaY > 0 ? .9 : 1.1);
-      let obj = this.roomedit.object;
-      let r = obj.rotation;
-      obj.rotation = V(r.x, r.y += (ev.deltaY > 0 ? 5 : -5), r.z);
-      this.editObjectMousemove(ev);
-    }
+    this.editObjectMousewheel = (function() {
+      var rot = new THREE.Euler();
+      return function(ev) {
+        //this.roomedit.distancescale *= (ev.deltaY > 0 ? .9 : 1.1);
+        let obj = this.roomedit.object;
+        //let rot = obj.rotation;
+        rot.setFromQuaternion(obj.properties.orientation);
+        //obj.rotation = V(rot.x, rot.y += (ev.deltaY > 0 ? 5 : -5), rot.z);
+        let amount = Math.PI/32;
+        let newrot = V(rot.x * THREE.Math.RAD2DEG, (rot.y + (ev.deltaY > 0 ? amount : -amount)) * THREE.Math.RAD2DEG, rot.z * THREE.Math.RAD2DEG);
+        obj.rotation = newrot;
+  //obj.updateOrientationFromEuler();
+  //obj.updateDirvecsFromOrientation();
+        //this.editObjectMousemove(ev);
+      }
+    })();
     this.editObjectClick = function(ev) {
       if (this.roomedit.object) {
         if (ev.button == 0) {
@@ -2174,7 +2227,7 @@ elation.require([
     this.editObjectManipulate = function(vec) {
       var mode = this.editObjectGetMode();
       var obj = this.roomedit.object;
-      var space = 'player'; // 'world', 'local', 'player'
+      var space = 'world'; // 'world', 'local', 'player'
       var player = this.engine.client.player;

       if (!obj) return;
@@ -2195,12 +2248,20 @@ elation.require([
         case 'rotation':
           var amount = Math.PI/2 * this.roomedit.snap;
           var euler = new THREE.Euler().setFromQuaternion(obj._target.orientation);
-          vec.multiplyScalar(amount);
+          //vec.multiplyScalar(amount);
           euler.x += vec.x;
           euler.y += vec.y;
           euler.z += vec.z;
-          var quat = new THREE.Quaternion().setFromEuler(euler);
-          obj._target.properties.orientation.multiply(quat);
+          //var quat = new THREE.Quaternion().setFromEuler(euler);
+          //obj._target.properties.orientation.copy(quat);
+          let rot = obj.rotation;
+          var amount = 90;
+          if (this.roomedit.snap == .1) amount = 45;
+          else if (this.roomedit.snap == .01) amount = 15;
+          else if (this.roomedit.snap == .001) amount = 5;
+          obj.properties.rotation.set(rot.x * 180 / Math.PI + vec.x * amount, rot.y * 180 / Math.PI + vec.y * amount, rot.z * 180 / Math.PI + vec.z * amount);
+obj.updateOrientationFromEuler();
+obj.updateDirvecsFromOrientation();
           //this.roomedit.object.pos = vec;
           break;
         case 'scale':
@@ -2233,26 +2294,89 @@ elation.require([

     // FIXME - the following functions aren't bound to "this", because the control system isn't properly managing context
     this.editObjectManipulateLeft = function(ev) {
-      if (ev.value) ev.target.editObjectManipulate(V(-1, 0, 0));
+      if (ev.value) {
+        //ev.target.editObjectManipulate(V(-1, 0, 0));
+        ev.target.roomedit.movespeed.x = -1;
+        ev.target.roomedit.raycast = false;
+        ev.target.roomedit.keyrepeatdelay = 300;
+      } else if (ev.target.roomedit.movespeed.x == -1) {
+        ev.target.roomedit.movespeed.x = 0;
+      }
+      ev.target.editObjectManipulateTimer();
     }
     this.editObjectManipulateRight = function(ev) {
-      if (ev.value) ev.target.editObjectManipulate(V(1,0,0));
+      if (ev.value) {
+        //ev.target.editObjectManipulate(V(1,0,0));
+        ev.target.roomedit.movespeed.x = 1;
+        ev.target.roomedit.raycast = false;
+        ev.target.roomedit.keyrepeatdelay = 300;
+      } else if (ev.target.roomedit.movespeed.x == 1) {
+        ev.target.roomedit.movespeed.x = 0;
+      }
+      ev.target.editObjectManipulateTimer();
     }
     this.editObjectManipulateUp = function(ev) {
-      if (ev.value) ev.target.editObjectManipulate(V(0,1,0));
+      if (ev.value) {
+        //ev.target.editObjectManipulate(V(0,1,0));
+        ev.target.roomedit.movespeed.y = 1;
+        ev.target.roomedit.raycast = false;
+        ev.target.roomedit.keyrepeatdelay = 300;
+      } else if (ev.target.roomedit.movespeed.y == 1) {
+        ev.target.roomedit.movespeed.y = 0;
+      }
+      ev.target.editObjectManipulateTimer();
     }
     this.editObjectManipulateDown = function(ev) {
-      if (ev.value) ev.target.editObjectManipulate(V(0,-1,0));
+      if (ev.value) {
+        //ev.target.editObjectManipulate(V(0,-1,0));
+        ev.target.roomedit.movespeed.y = -1;
+        ev.target.roomedit.raycast = false;
+        ev.target.roomedit.keyrepeatdelay = 300;
+      } else if (ev.target.roomedit.movespeed.y == -1) {
+        ev.target.roomedit.movespeed.y = 0;
+      }
+      ev.target.editObjectManipulateTimer();
     }
     this.editObjectManipulateIn = function(ev) {
-      if (ev.value) ev.target.editObjectManipulate(V(0,0,1));
+      if (ev.value) {
+        //ev.target.editObjectManipulate(V(0,0,1));
+        ev.target.roomedit.movespeed.z = 1;
+        ev.target.roomedit.raycast = false;
+        ev.target.roomedit.keyrepeatdelay = 300;
+      } else if (ev.target.roomedit.movespeed.z == 1) {
+        ev.target.roomedit.movespeed.z = 0;
+      }
+      ev.target.editObjectManipulateTimer();
     }
     this.editObjectManipulateOut = function(ev) {
-      if (ev.value) ev.target.editObjectManipulate(V(0,0,-1));
+      if (ev.value) {
+        //ev.target.editObjectManipulate(V(0,0,-1));
+        ev.target.roomedit.movespeed.z = -1;
+        ev.target.roomedit.raycast = false;
+        ev.target.roomedit.keyrepeatdelay = 300;
+      } else if (ev.target.roomedit.movespeed.z == -1) {
+        ev.target.roomedit.movespeed.z = 0;
+      }
+      ev.target.editObjectManipulateTimer();
+    }
+    this.editObjectManipulateTimer = function() {
+      if (this.roomedit.movespeed.x || this.roomedit.movespeed.y || this.roomedit.movespeed.z) {
+        this.editObjectManipulate(V(this.roomedit.movespeed));
+        if (!this.roomedit.movetimer) {
+          this.roomedit.movetimer = setTimeout(() => {
+            this.roomedit.movetimer = false;
+            this.roomedit.keyrepeatdelay = 75;
+            this.editObjectManipulateTimer();
+          }, this.roomedit.keyrepeatdelay);
+        }
+      }
     }
     this.editObjectManipulateMouse = function(ev) {
       ev.target.editObjectManipulate(V(ev.value[0], -ev.value[1], 0));
     }
+    this.editObjectToggleRaycast = function(ev) {
+      ev.target.roomedit.raycast = ev.value;
+    }
     this.editObjectSnapOnes = function(ev) {
       if (ev.value) ev.target.editObjectSetSnap(1);
     }
@@ -2285,7 +2409,7 @@ elation.require([
       var roomedit = ev.target.roomedit;
       if (ev.value == 1) {
         roomedit.moving = true;
-        this.engine.systems.controls.activateContext('roomedit', this);
+        this.engine.systems.conyytrols.activateContext('roomedit', this);
       } else if (ev.value == 0) {
         roomedit.moving = true;
         this.engine.systems.controls.deactivateContext('roomedit', this);

-----END OF PAGE-----

-- Response ended

-- Page fetched on Sun Jun 2 16:15:20 2024