repo: janusweb action: commit revision: path_from: revision_from: e6be82f1ac03911a82a7471a4104add0191f5881: path_to: revision_to:
commit e6be82f1ac03911a82a7471a4104add0191f5881 Author: James BaicoianuDate: 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-----