-- 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:
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
--- 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