-- 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: 6c51971e96d0d476b7f869ed28ca5caa72d28fe0:
path_to:
revision_to:

git.thebackupbox.net

janusweb

git://git.thebackupbox.net/janusweb

commit 6c51971e96d0d476b7f869ed28ca5caa72d28fe0
Author: James Baicoianu <james_github@baicoianu.com>
Date:   Thu Apr 26 03:37:03 2018 -0700

    Support drag-drop from local files

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

index 87a0769b6e87cab08cc52d04c63309925d754f82..

index ..eca47e3dbd961176b6b8ae00371a1a8ede4473ec 100644

--- a/scripts/room.js
+++ b/scripts/room.js
@@ -1793,11 +1793,16 @@ elation.require([
       ev.preventDefault();
     }
     this.handleDrop = function(ev) {
-      console.log('drop!', ev);
+      ev.preventDefault();
       var files = ev.dataTransfer.files,
           items = ev.dataTransfer.items;
       if (files.length > 0) {
-        console.log('dropped files!', files);
+        var objects = [];
+        for (var i = 0; i < files.length; i++) {
+          var file = files[i];
+          objects[i] = this.loadObjectFromFile(file);
+        }
+        this.editObject(objects[0], true);
       } else if (items.length > 0) {
         var types = {};
         var numitems = items.length;
@@ -1811,7 +1816,6 @@ elation.require([
           types['text/uri-list'].getAsString(elation.bind(this, this.loadObjectFromURIList));
         }
       }
-      ev.preventDefault();
       this.engine.systems.controls.requestPointerLock();
     }
     this.loadObjectFromURIList = function(list) {
@@ -1840,9 +1844,42 @@ elation.require([
       }
     }
     this.loadObjectFromJML = function(jml) {
-      console.log('cool guy', jml);
       this.applyEditXML(jml);
     }
+    this.loadObjectFromFile = function(file) {
+      var name = file.name,
+          url = URL.createObjectURL(file);
+
+      var type = 'object',
+          args = {
+            id: name,
+            pos: player.vectors.cursor_pos.clone(),
+            sync: true
+          },
+          assetargs = {
+            id: name,
+            src: url
+          };
+
+      var mimeparts = file.type.split('/');
+      if (mimeparts[0] == 'image') {
+        type = 'image';
+      } else if (mimeparts[0] == 'video') {
+        type = 'video';
+        args.video_id = name;
+        assetargs.auto_play = true;
+      } else if (mimeparts[0] == 'audio') {
+        type = 'sound';
+        args.sound_id = name;
+        args.auto_play = true;
+        assetargs.auto_play = true;
+      } else {
+        type = 'object';
+        args.collision_id = name;
+      }
+      this.loadNewAsset(type, assetargs);
+      return this.createObject(type, args);
+    }
     this.editObject = function(object, isnew) {
       this.roomedit.object = object;
       this.roomedit.modeid = 0;
@@ -1854,6 +1891,7 @@ elation.require([
         object.js_id = player.userid + '-' + window.uniqueId();
       }

+      this.roomedit.collision_id = object.collision_id;
       object.collision_id = '';

       elation.events.add(this, 'mousemove', this.editObjectMousemove);
@@ -1888,14 +1926,29 @@ elation.require([
       }
       var object = this.roomedit.object;
       var obj3d = object._target.objects['3d'];
-      var objchild = obj3d.children[obj3d.children.length-1];
-      var root = objchild.clone();
-      this.roomedit.wireframe = root;
-      root.traverse(function(n) {
-        if (n instanceof THREE.Mesh) {
-          n.material = new THREE.MeshPhongMaterial({wireframe: true, color: 0xff0000, emissive: 0x990000, wireframeLinewidth: 3, depthTest: false, transparent: true, opacity: .2});
-        }
+
+      var material = new THREE.MeshPhongMaterial({
+        wireframe: true,
+        color: 0xff0000,
+        emissive: 0x990000,
+        wireframeLinewidth: 3,
+        depthTest: false,
+        transparent: true,
+        opacity: .2
       });
+      var root = false;
+      if (obj3d instanceof THREE.Mesh) {
+        root = new THREE.Mesh(obj3d.geometry, material);
+      } else {
+        var objchild = obj3d.children[obj3d.children.length-1] || obj3d;
+        root = objchild.clone();
+        root.traverse(function(n) {
+          if (n instanceof THREE.Mesh) {
+            n.material = material;
+          }
+        });
+      }
+      this.roomedit.wireframe = root;
       this.roomedit.object._target.objects['3d'].add(root);
     }
     this.editObjectRemoveWireframe = function() {
@@ -1907,8 +1960,8 @@ elation.require([
       if (this.roomedit.object) {
         if (destroy) {
           this.roomedit.object.die();
-        } else {
-          this.roomedit.object.collision_id = this.roomedit.object.id;
+        } else if (this.roomedit.collision_id) {
+          this.roomedit.object.collision_id = this.roomedit.collision_id;
         }
       }
       this.roomedit.object = false;

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

-- Response ended

-- Page fetched on Sun Jun 2 16:29:43 2024