From 0e1f297ec0cd17b0356811dfa0ab55f1e2629e7c Mon Sep 17 00:00:00 2001 From: Fabien Benetou Date: Fri, 20 Jan 2023 15:53:50 +0100 Subject: [PATCH] cloning primitives --- index.html | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/index.html b/index.html index 3167d13..e0471cf 100644 --- a/index.html +++ b/index.html @@ -1062,8 +1062,9 @@ AFRAME.registerComponent('pinchprimary', { // currently only 1 hand, the right o //selectedElement = clone selectedElement = getClosestTargetElement( event.detail.position ) + if (selectedElement) selectedElement.emit("picked") // is it truly world position? See https://github.com/aframevr/aframe/issues/5182 - setFeedbackHUD( AFRAME.utils.coordinates.stringify( event.detail.position ) ) + // setFeedbackHUD( AFRAME.utils.coordinates.stringify( event.detail.position ) ) // if close enough to a target among a list of potential targets, unselect previous target then select new }); }, @@ -1971,7 +1972,8 @@ AFRAME.registerComponent('snap-on-pinchended', { // could check first if that "spot" is "free", e.g not other targets on that position // but then if not, what? move to another of the closest 6th closest points? (2 vertical, 2 horizontal, 2 depth) or even 8th with diagonales? // if not? now what? move until there is a free spot? - el.setAttribute("position", AFRAME.utils.coordinates.stringify(pos)) + el.setAttribute("animation__snap"+Date.now(), "property: position; to: "+AFRAME.utils.coordinates.stringify(pos)+"; dur: 200;"); + //el.setAttribute("position", AFRAME.utils.coordinates.stringify(pos)) if (el.className == "compound_object"){ let thresholdDistance = 0.2 // based on object size @@ -2076,10 +2078,26 @@ function addPrimitive( name, position="0 1.4 -0.2" ){ el.id = "template_object_" + name el.className = "template_object" targets.push(el) - // should have a dedicated cloning component activated on primary pinchstarted + el.setAttribute('clone-on-primarypinchstarted', true) return el } +AFRAME.registerComponent('clone-on-primarypinchstarted', { + init: function () { + let el = this.el + this.el.addEventListener('picked', function (event) { + var clone = selectedElement.cloneNode(true) + clone.removeAttribute('clone-on-primarypinchstarted') + clone.setAttribute( "scale", selectedElement.getAttribute("scale") ) // somehow lost? + clone.id += "_clone" + Date.now() + clone.className = "cloned" + targets.push(clone) + AFRAME.scenes[0].appendChild(clone) + selectedElement = clone + }) + } +}) + function addAllPrimitives(){ const other_primitives = ["camera", "cursor", "sky", "light", "sound", "videosphere"] const other_primitives_with_param_needed = ["text", "gltf-model", "obj-model", "troika-text"] @@ -2092,7 +2110,8 @@ function addAllPrimitives(){ } function startExperience(){ - //AFRAME.scenes[0].enterVR(); + if (AFRAME.utils.device.checkHeadsetConnected()) + AFRAME.scenes[0].enterVR(); document.querySelector("#snapping-sound").components.sound.playSound(); document.querySelector("#mainbutton").style.display = "none" }