diff --git a/dist/aframe-street-component.js b/dist/aframe-street-component.js index 340b34ad3..6140b22b4 100644 --- a/dist/aframe-street-component.js +++ b/dist/aframe-street-component.js @@ -1,4 +1,4 @@ -!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var r=e();for(var n in r)("object"==typeof exports?exports:t)[n]=r[n]}}(self,(()=>(()=>{var t={631:t=>{var e=[new THREE.Vector2,new THREE.Vector2,new THREE.Vector2,new THREE.Vector2];function r(t,r,n,i){const a=1/i,o=1/n;return e[0].set(a*r,o*t+o),e[1].set(a*r,o*t),e[2].set(a*r+a,o*t),e[3].set(a*r+a,o*t+o),e}AFRAME.registerComponent("atlas-uvs",{dependencies:["geometry"],schema:{totalColumns:{type:"int",default:1},totalRows:{type:"int",default:1},column:{type:"int",default:1},row:{type:"int",default:1}},update:function(){const t=this.data,e=r(t.row-1,t.column-1,t.totalRows,t.totalColumns),n=this.el.getObject3D("mesh").geometry;var i=new Float32Array([e[0].x,e[0].y,e[3].x,e[3].y,e[1].x,e[1].y,e[2].x,e[2].y]);n.setAttribute("uv",new THREE.BufferAttribute(i,2)),n.uvsNeedUpdate=!0}}),AFRAME.registerComponent("dynamic-texture-atlas",{schema:{canvasId:{default:"dynamicAtlas"},canvasHeight:{default:1024},canvasWidth:{default:1024},debug:{default:!1},numColumns:{default:8},numRows:{default:8}},multiple:!0,init:function(){const t=this.canvas=document.createElement("canvas");t.id=this.data.canvasId,t.height=this.data.canvasHeight,t.width=this.data.canvasWidth,this.ctx=t.getContext("2d"),document.body.appendChild(t),this.data.debug&&(t.style.left=0,t.style.top=0,t.style.position="fixed",t.style.zIndex=9999999999)},drawTexture:function(t,e,n,i,a){const o=this.canvas,s=this.data;t.complete||(t.onload=()=>{this.drawTexture(t,e,n)});const c=a||o.height/s.numRows,u=i||o.width/s.numColumns;return this.ctx.drawImage(t,u*e,u*n,u,c),r(e,n,s.numRows,s.numColumns)}}),t.exports.getGridUvs=r},5236:(t,e,r)=>{"use strict";if(r(412),r(7588),r(8327),r.g._babelPolyfill)throw new Error("only one instance of babel-polyfill is allowed");r.g._babelPolyfill=!0;function n(t,e,r){t[e]||Object.defineProperty(t,e,{writable:!0,configurable:!0,value:r})}n(String.prototype,"padLeft","".padStart),n(String.prototype,"padRight","".padEnd),"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill".split(",").forEach((function(t){[][t]&&n(Array,t,Function.call.bind([][t]))}))},8327:(t,e,r)=>{r(9217),t.exports=r(7984).RegExp.escape},8304:t=>{t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},5811:(t,e,r)=>{var n=r(9519);t.exports=function(t,e){if("number"!=typeof t&&"Number"!=n(t))throw TypeError(e);return+t}},6224:(t,e,r)=>{var n=r(8076)("unscopables"),i=Array.prototype;null==i[n]&&r(9247)(i,n,{}),t.exports=function(t){i[n][t]=!0}},2774:(t,e,r)=>{"use strict";var n=r(5813)(!0);t.exports=function(t,e,r){return e+(r?n(t,e).length:1)}},264:t=>{t.exports=function(t,e,r,n){if(!(t instanceof e)||void 0!==n&&n in t)throw TypeError(r+": incorrect invocation!");return t}},9204:(t,e,r)=>{var n=r(9603);t.exports=function(t){if(!n(t))throw TypeError(t+" is not an object!");return t}},8734:(t,e,r)=>{"use strict";var n=r(6415),i=r(7149),a=r(1773);t.exports=[].copyWithin||function(t,e){var r=n(this),o=a(r.length),s=i(t,o),c=i(e,o),u=arguments.length>2?arguments[2]:void 0,l=Math.min((void 0===u?o:i(u,o))-c,o-s),d=1;for(c0;)c in r?r[s]=r[c]:delete r[s],s+=d,c+=d;return r}},6436:(t,e,r)=>{"use strict";var n=r(6415),i=r(7149),a=r(1773);t.exports=function(t){for(var e=n(this),r=a(e.length),o=arguments.length,s=i(o>1?arguments[1]:void 0,r),c=o>2?arguments[2]:void 0,u=void 0===c?r:i(c,r);u>s;)e[s++]=t;return e}},9349:(t,e,r)=>{var n=r(1725);t.exports=function(t,e){var r=[];return n(t,!1,r.push,r,e),r}},3997:(t,e,r)=>{var n=r(3057),i=r(1773),a=r(7149);t.exports=function(t){return function(e,r,o){var s,c=n(e),u=i(c.length),l=a(o,u);if(t&&r!=r){for(;u>l;)if((s=c[l++])!=s)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===r)return t||l||0;return!t&&-1}}},2026:(t,e,r)=>{var n=r(9124),i=r(3424),a=r(6415),o=r(1773),s=r(4164);t.exports=function(t,e){var r=1==t,c=2==t,u=3==t,l=4==t,d=6==t,f=5==t||d,h=e||s;return function(e,s,p){for(var m,g,v=a(e),y=i(v),b=n(s,p,3),x=o(y.length),w=0,A=r?h(e,x):c?h(e,0):void 0;x>w;w++)if((f||w in y)&&(g=b(m=y[w],w,v),t))if(r)A[w]=g;else if(g)switch(t){case 3:return!0;case 5:return m;case 6:return w;case 2:A.push(m)}else if(l)return!1;return d?-1:u||l?l:A}}},1457:(t,e,r)=>{var n=r(8304),i=r(6415),a=r(3424),o=r(1773);t.exports=function(t,e,r,s,c){n(e);var u=i(t),l=a(u),d=o(u.length),f=c?d-1:0,h=c?-1:1;if(r<2)for(;;){if(f in l){s=l[f],f+=h;break}if(f+=h,c?f<0:d<=f)throw TypeError("Reduce of empty array with no initial value")}for(;c?f>=0:d>f;f+=h)f in l&&(s=e(s,l[f],f,u));return s}},5720:(t,e,r)=>{var n=r(9603),i=r(7375),a=r(8076)("species");t.exports=function(t){var e;return i(t)&&("function"!=typeof(e=t.constructor)||e!==Array&&!i(e.prototype)||(e=void 0),n(e)&&null===(e=e[a])&&(e=void 0)),void 0===e?Array:e}},4164:(t,e,r)=>{var n=r(5720);t.exports=function(t,e){return new(n(t))(e)}},6371:(t,e,r)=>{"use strict";var n=r(8304),i=r(9603),a=r(3436),o=[].slice,s={};t.exports=Function.bind||function(t){var e=n(this),r=o.call(arguments,1),c=function(){var n=r.concat(o.call(arguments));return this instanceof c?function(t,e,r){if(!(e in s)){for(var n=[],i=0;i{var n=r(9519),i=r(8076)("toStringTag"),a="Arguments"==n(function(){return arguments}());t.exports=function(t){var e,r,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(r=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),i))?r:a?n(e):"Object"==(o=n(e))&&"function"==typeof e.callee?"Arguments":o}},9519:t=>{var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},947:(t,e,r)=>{"use strict";var n=r(5234).f,i=r(4958),a=r(4584),o=r(9124),s=r(264),c=r(1725),u=r(7091),l=r(4165),d=r(6538),f=r(1329),h=r(4787).fastKey,p=r(2023),m=f?"_s":"size",g=function(t,e){var r,n=h(e);if("F"!==n)return t._i[n];for(r=t._f;r;r=r.n)if(r.k==e)return r};t.exports={getConstructor:function(t,e,r,u){var l=t((function(t,n){s(t,l,e,"_i"),t._t=e,t._i=i(null),t._f=void 0,t._l=void 0,t[m]=0,null!=n&&c(n,r,t[u],t)}));return a(l.prototype,{clear:function(){for(var t=p(this,e),r=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete r[n.i];t._f=t._l=void 0,t[m]=0},delete:function(t){var r=p(this,e),n=g(r,t);if(n){var i=n.n,a=n.p;delete r._i[n.i],n.r=!0,a&&(a.n=i),i&&(i.p=a),r._f==n&&(r._f=i),r._l==n&&(r._l=a),r[m]--}return!!n},forEach:function(t){p(this,e);for(var r,n=o(t,arguments.length>1?arguments[1]:void 0,3);r=r?r.n:this._f;)for(n(r.v,r.k,this);r&&r.r;)r=r.p},has:function(t){return!!g(p(this,e),t)}}),f&&n(l.prototype,"size",{get:function(){return p(this,e)[m]}}),l},def:function(t,e,r){var n,i,a=g(t,e);return a?a.v=r:(t._l=a={i:i=h(e,!0),k:e,v:r,p:n=t._l,n:void 0,r:!1},t._f||(t._f=a),n&&(n.n=a),t[m]++,"F"!==i&&(t._i[i]=a)),t},getEntry:g,setStrong:function(t,e,r){u(t,e,(function(t,r){this._t=p(t,e),this._k=r,this._l=void 0}),(function(){for(var t=this,e=t._k,r=t._l;r&&r.r;)r=r.p;return t._t&&(t._l=r=r?r.n:t._t._f)?l(0,"keys"==e?r.k:"values"==e?r.v:[r.k,r.v]):(t._t=void 0,l(1))}),r?"entries":"values",!r,!0),d(e)}}},5741:(t,e,r)=>{var n=r(9382),i=r(9349);t.exports=function(t){return function(){if(n(this)!=t)throw TypeError(t+"#toJSON isn't generic");return i(this)}}},5268:(t,e,r)=>{"use strict";var n=r(4584),i=r(4787).getWeak,a=r(9204),o=r(9603),s=r(264),c=r(1725),u=r(2026),l=r(1262),d=r(2023),f=u(5),h=u(6),p=0,m=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},v=function(t,e){return f(t.a,(function(t){return t[0]===e}))};g.prototype={get:function(t){var e=v(this,t);if(e)return e[1]},has:function(t){return!!v(this,t)},set:function(t,e){var r=v(this,t);r?r[1]=e:this.a.push([t,e])},delete:function(t){var e=h(this.a,(function(e){return e[0]===t}));return~e&&this.a.splice(e,1),!!~e}},t.exports={getConstructor:function(t,e,r,a){var u=t((function(t,n){s(t,u,e,"_i"),t._t=e,t._i=p++,t._l=void 0,null!=n&&c(n,r,t[a],t)}));return n(u.prototype,{delete:function(t){if(!o(t))return!1;var r=i(t);return!0===r?m(d(this,e)).delete(t):r&&l(r,this._i)&&delete r[this._i]},has:function(t){if(!o(t))return!1;var r=i(t);return!0===r?m(d(this,e)).has(t):r&&l(r,this._i)}}),u},def:function(t,e,r){var n=i(a(e),!0);return!0===n?m(t).set(e,r):n[t._i]=r,t},ufstore:m}},1405:(t,e,r)=>{"use strict";var n=r(2276),i=r(3350),a=r(1951),o=r(4584),s=r(4787),c=r(1725),u=r(264),l=r(9603),d=r(4308),f=r(3490),h=r(6668),p=r(1906);t.exports=function(t,e,r,m,g,v){var y=n[t],b=y,x=g?"set":"add",w=b&&b.prototype,A={},_=function(t){var e=w[t];a(w,t,"delete"==t||"has"==t?function(t){return!(v&&!l(t))&&e.call(this,0===t?0:t)}:"get"==t?function(t){return v&&!l(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,r){return e.call(this,0===t?0:t,r),this})};if("function"==typeof b&&(v||w.forEach&&!d((function(){(new b).entries().next()})))){var E=new b,S=E[x](v?{}:-0,1)!=E,M=d((function(){E.has(1)})),k=f((function(t){new b(t)})),O=!v&&d((function(){for(var t=new b,e=5;e--;)t[x](e,e);return!t.has(-0)}));k||((b=e((function(e,r){u(e,b,t);var n=p(new y,e,b);return null!=r&&c(r,g,n[x],n),n}))).prototype=w,w.constructor=b),(M||O)&&(_("delete"),_("has"),g&&_("get")),(O||S)&&_(x),v&&w.clear&&delete w.clear}else b=m.getConstructor(e,t,g,x),o(b.prototype,r),s.NEED=!0;return h(b,t),A[t]=b,i(i.G+i.W+i.F*(b!=y),A),v||m.setStrong(b,t,g),b}},7984:t=>{var e=t.exports={version:"2.6.12"};"number"==typeof __e&&(__e=e)},2122:(t,e,r)=>{"use strict";var n=r(5234),i=r(9933);t.exports=function(t,e,r){e in t?n.f(t,e,i(0,r)):t[e]=r}},9124:(t,e,r)=>{var n=r(8304);t.exports=function(t,e,r){if(n(t),void 0===e)return t;switch(r){case 1:return function(r){return t.call(e,r)};case 2:return function(r,n){return t.call(e,r,n)};case 3:return function(r,n,i){return t.call(e,r,n,i)}}return function(){return t.apply(e,arguments)}}},4041:(t,e,r)=>{"use strict";var n=r(4308),i=Date.prototype.getTime,a=Date.prototype.toISOString,o=function(t){return t>9?t:"0"+t};t.exports=n((function(){return"0385-07-25T07:06:39.999Z"!=a.call(new Date(-50000000000001))}))||!n((function(){a.call(new Date(NaN))}))?function(){if(!isFinite(i.call(this)))throw RangeError("Invalid time value");var t=this,e=t.getUTCFullYear(),r=t.getUTCMilliseconds(),n=e<0?"-":e>9999?"+":"";return n+("00000"+Math.abs(e)).slice(n?-6:-4)+"-"+o(t.getUTCMonth()+1)+"-"+o(t.getUTCDate())+"T"+o(t.getUTCHours())+":"+o(t.getUTCMinutes())+":"+o(t.getUTCSeconds())+"."+(r>99?r:"0"+o(r))+"Z"}:a},768:(t,e,r)=>{"use strict";var n=r(9204),i=r(4276),a="number";t.exports=function(t){if("string"!==t&&t!==a&&"default"!==t)throw TypeError("Incorrect hint");return i(n(this),t!=a)}},2099:t=>{t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},1329:(t,e,r)=>{t.exports=!r(4308)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},7233:(t,e,r)=>{var n=r(9603),i=r(2276).document,a=n(i)&&n(i.createElement);t.exports=function(t){return a?i.createElement(t):{}}},120:t=>{t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},5084:(t,e,r)=>{var n=r(1720),i=r(1259),a=r(6418);t.exports=function(t){var e=n(t),r=i.f;if(r)for(var o,s=r(t),c=a.f,u=0;s.length>u;)c.call(t,o=s[u++])&&e.push(o);return e}},3350:(t,e,r)=>{var n=r(2276),i=r(7984),a=r(9247),o=r(1951),s=r(9124),c="prototype",u=function(t,e,r){var l,d,f,h,p=t&u.F,m=t&u.G,g=t&u.S,v=t&u.P,y=t&u.B,b=m?n:g?n[e]||(n[e]={}):(n[e]||{})[c],x=m?i:i[e]||(i[e]={}),w=x[c]||(x[c]={});for(l in m&&(r=e),r)f=((d=!p&&b&&void 0!==b[l])?b:r)[l],h=y&&d?s(f,n):v&&"function"==typeof f?s(Function.call,f):f,b&&o(b,l,f,t&u.U),x[l]!=f&&a(x,l,h),v&&w[l]!=f&&(w[l]=f)};n.core=i,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,t.exports=u},2381:(t,e,r)=>{var n=r(8076)("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(r){try{return e[n]=!1,!"/./"[t](e)}catch(t){}}return!0}},4308:t=>{t.exports=function(t){try{return!!t()}catch(t){return!0}}},1658:(t,e,r)=>{"use strict";r(5761);var n=r(1951),i=r(9247),a=r(4308),o=r(2099),s=r(8076),c=r(3323),u=s("species"),l=!a((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")})),d=function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var r="ab".split(t);return 2===r.length&&"a"===r[0]&&"b"===r[1]}();t.exports=function(t,e,r){var f=s(t),h=!a((function(){var e={};return e[f]=function(){return 7},7!=""[t](e)})),p=h?!a((function(){var e=!1,r=/a/;return r.exec=function(){return e=!0,null},"split"===t&&(r.constructor={},r.constructor[u]=function(){return r}),r[f](""),!e})):void 0;if(!h||!p||"replace"===t&&!l||"split"===t&&!d){var m=/./[f],g=r(o,f,""[t],(function(t,e,r,n,i){return e.exec===c?h&&!i?{done:!0,value:m.call(e,r,n)}:{done:!0,value:t.call(r,e,n)}:{done:!1}})),v=g[0],y=g[1];n(String.prototype,t,v),i(RegExp.prototype,f,2==e?function(t,e){return y.call(t,this,e)}:function(t){return y.call(t,this)})}}},9388:(t,e,r)=>{"use strict";var n=r(9204);t.exports=function(){var t=n(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},7849:(t,e,r)=>{"use strict";var n=r(7375),i=r(9603),a=r(1773),o=r(9124),s=r(8076)("isConcatSpreadable");t.exports=function t(e,r,c,u,l,d,f,h){for(var p,m,g=l,v=0,y=!!f&&o(f,h,3);v0)g=t(e,r,p,a(p.length),g,d-1)-1;else{if(g>=9007199254740991)throw TypeError();e[g]=p}g++}v++}return g}},1725:(t,e,r)=>{var n=r(9124),i=r(228),a=r(99),o=r(9204),s=r(1773),c=r(8837),u={},l={},d=t.exports=function(t,e,r,d,f){var h,p,m,g,v=f?function(){return t}:c(t),y=n(r,d,e?2:1),b=0;if("function"!=typeof v)throw TypeError(t+" is not iterable!");if(a(v)){for(h=s(t.length);h>b;b++)if((g=e?y(o(p=t[b])[0],p[1]):y(t[b]))===u||g===l)return g}else for(m=v.call(t);!(p=m.next()).done;)if((g=i(m,y,p.value,e))===u||g===l)return g};d.BREAK=u,d.RETURN=l},7650:(t,e,r)=>{t.exports=r(3259)("native-function-to-string",Function.toString)},2276:t=>{var e=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=e)},1262:t=>{var e={}.hasOwnProperty;t.exports=function(t,r){return e.call(t,r)}},9247:(t,e,r)=>{var n=r(5234),i=r(9933);t.exports=r(1329)?function(t,e,r){return n.f(t,e,i(1,r))}:function(t,e,r){return t[e]=r,t}},1847:(t,e,r)=>{var n=r(2276).document;t.exports=n&&n.documentElement},706:(t,e,r)=>{t.exports=!r(1329)&&!r(4308)((function(){return 7!=Object.defineProperty(r(7233)("div"),"a",{get:function(){return 7}}).a}))},1906:(t,e,r)=>{var n=r(9603),i=r(8860).set;t.exports=function(t,e,r){var a,o=e.constructor;return o!==r&&"function"==typeof o&&(a=o.prototype)!==r.prototype&&n(a)&&i&&i(t,a),t}},3436:t=>{t.exports=function(t,e,r){var n=void 0===r;switch(e.length){case 0:return n?t():t.call(r);case 1:return n?t(e[0]):t.call(r,e[0]);case 2:return n?t(e[0],e[1]):t.call(r,e[0],e[1]);case 3:return n?t(e[0],e[1],e[2]):t.call(r,e[0],e[1],e[2]);case 4:return n?t(e[0],e[1],e[2],e[3]):t.call(r,e[0],e[1],e[2],e[3])}return t.apply(r,e)}},3424:(t,e,r)=>{var n=r(9519);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==n(t)?t.split(""):Object(t)}},99:(t,e,r)=>{var n=r(479),i=r(8076)("iterator"),a=Array.prototype;t.exports=function(t){return void 0!==t&&(n.Array===t||a[i]===t)}},7375:(t,e,r)=>{var n=r(9519);t.exports=Array.isArray||function(t){return"Array"==n(t)}},8400:(t,e,r)=>{var n=r(9603),i=Math.floor;t.exports=function(t){return!n(t)&&isFinite(t)&&i(t)===t}},9603:t=>{t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},5119:(t,e,r)=>{var n=r(9603),i=r(9519),a=r(8076)("match");t.exports=function(t){var e;return n(t)&&(void 0!==(e=t[a])?!!e:"RegExp"==i(t))}},228:(t,e,r)=>{var n=r(9204);t.exports=function(t,e,r,i){try{return i?e(n(r)[0],r[1]):e(r)}catch(e){var a=t.return;throw void 0!==a&&n(a.call(t)),e}}},4434:(t,e,r)=>{"use strict";var n=r(4958),i=r(9933),a=r(6668),o={};r(9247)(o,r(8076)("iterator"),(function(){return this})),t.exports=function(t,e,r){t.prototype=n(o,{next:i(1,r)}),a(t,e+" Iterator")}},7091:(t,e,r)=>{"use strict";var n=r(5020),i=r(3350),a=r(1951),o=r(9247),s=r(479),c=r(4434),u=r(6668),l=r(9565),d=r(8076)("iterator"),f=!([].keys&&"next"in[].keys()),h="keys",p="values",m=function(){return this};t.exports=function(t,e,r,g,v,y,b){c(r,e,g);var x,w,A,_=function(t){if(!f&&t in k)return k[t];switch(t){case h:case p:return function(){return new r(this,t)}}return function(){return new r(this,t)}},E=e+" Iterator",S=v==p,M=!1,k=t.prototype,O=k[d]||k["@@iterator"]||v&&k[v],R=O||_(v),C=v?S?_("entries"):R:void 0,P="Array"==e&&k.entries||O;if(P&&(A=l(P.call(new t)))!==Object.prototype&&A.next&&(u(A,E,!0),n||"function"==typeof A[d]||o(A,d,m)),S&&O&&O.name!==p&&(M=!0,R=function(){return O.call(this)}),n&&!b||!f&&!M&&k[d]||o(k,d,R),s[e]=R,s[E]=m,v)if(x={values:S?R:_(p),keys:y?R:_(h),entries:C},b)for(w in x)w in k||a(k,w,x[w]);else i(i.P+i.F*(f||M),e,x);return x}},3490:(t,e,r)=>{var n=r(8076)("iterator"),i=!1;try{var a=[7][n]();a.return=function(){i=!0},Array.from(a,(function(){throw 2}))}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var r=!1;try{var a=[7],o=a[n]();o.next=function(){return{done:r=!0}},a[n]=function(){return o},t(a)}catch(t){}return r}},4165:t=>{t.exports=function(t,e){return{value:e,done:!!t}}},479:t=>{t.exports={}},5020:t=>{t.exports=!1},9372:t=>{var e=Math.expm1;t.exports=!e||e(10)>22025.465794806718||e(10)<22025.465794806718||-2e-17!=e(-2e-17)?function(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:Math.exp(t)-1}:e},5600:(t,e,r)=>{var n=r(7083),i=Math.pow,a=i(2,-52),o=i(2,-23),s=i(2,127)*(2-o),c=i(2,-126);t.exports=Math.fround||function(t){var e,r,i=Math.abs(t),u=n(t);return is||r!=r?u*(1/0):u*r}},5386:t=>{t.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:Math.log(1+t)}},6030:t=>{t.exports=Math.scale||function(t,e,r,n,i){return 0===arguments.length||t!=t||e!=e||r!=r||n!=n||i!=i?NaN:t===1/0||t===-1/0?t:(t-e)*(i-n)/(r-e)+n}},7083:t=>{t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},4787:(t,e,r)=>{var n=r(6835)("meta"),i=r(9603),a=r(1262),o=r(5234).f,s=0,c=Object.isExtensible||function(){return!0},u=!r(4308)((function(){return c(Object.preventExtensions({}))})),l=function(t){o(t,n,{value:{i:"O"+ ++s,w:{}}})},d=t.exports={KEY:n,NEED:!1,fastKey:function(t,e){if(!i(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!a(t,n)){if(!c(t))return"F";if(!e)return"E";l(t)}return t[n].i},getWeak:function(t,e){if(!a(t,n)){if(!c(t))return!0;if(!e)return!1;l(t)}return t[n].w},onFreeze:function(t){return u&&d.NEED&&c(t)&&!a(t,n)&&l(t),t}}},9966:(t,e,r)=>{var n=r(468),i=r(3350),a=r(3259)("metadata"),o=a.store||(a.store=new(r(7729))),s=function(t,e,r){var i=o.get(t);if(!i){if(!r)return;o.set(t,i=new n)}var a=i.get(e);if(!a){if(!r)return;i.set(e,a=new n)}return a};t.exports={store:o,map:s,has:function(t,e,r){var n=s(e,r,!1);return void 0!==n&&n.has(t)},get:function(t,e,r){var n=s(e,r,!1);return void 0===n?void 0:n.get(t)},set:function(t,e,r,n){s(r,n,!0).set(t,e)},keys:function(t,e){var r=s(t,e,!1),n=[];return r&&r.forEach((function(t,e){n.push(e)})),n},key:function(t){return void 0===t||"symbol"==typeof t?t:String(t)},exp:function(t){i(i.S,"Reflect",t)}}},6787:(t,e,r)=>{var n=r(2276),i=r(9770).set,a=n.MutationObserver||n.WebKitMutationObserver,o=n.process,s=n.Promise,c="process"==r(9519)(o);t.exports=function(){var t,e,r,u=function(){var n,i;for(c&&(n=o.domain)&&n.exit();t;){i=t.fn,t=t.next;try{i()}catch(n){throw t?r():e=void 0,n}}e=void 0,n&&n.enter()};if(c)r=function(){o.nextTick(u)};else if(!a||n.navigator&&n.navigator.standalone)if(s&&s.resolve){var l=s.resolve(void 0);r=function(){l.then(u)}}else r=function(){i.call(n,u)};else{var d=!0,f=document.createTextNode("");new a(u).observe(f,{characterData:!0}),r=function(){f.data=d=!d}}return function(n){var i={fn:n,next:void 0};e&&(e.next=i),t||(t=i,r()),e=i}}},8176:(t,e,r)=>{"use strict";var n=r(8304);function i(t){var e,r;this.promise=new t((function(t,n){if(void 0!==e||void 0!==r)throw TypeError("Bad Promise constructor");e=t,r=n})),this.resolve=n(e),this.reject=n(r)}t.exports.f=function(t){return new i(t)}},7288:(t,e,r)=>{"use strict";var n=r(1329),i=r(1720),a=r(1259),o=r(6418),s=r(6415),c=r(3424),u=Object.assign;t.exports=!u||r(4308)((function(){var t={},e={},r=Symbol(),n="abcdefghijklmnopqrst";return t[r]=7,n.split("").forEach((function(t){e[t]=t})),7!=u({},t)[r]||Object.keys(u({},e)).join("")!=n}))?function(t,e){for(var r=s(t),u=arguments.length,l=1,d=a.f,f=o.f;u>l;)for(var h,p=c(arguments[l++]),m=d?i(p).concat(d(p)):i(p),g=m.length,v=0;g>v;)h=m[v++],n&&!f.call(p,h)||(r[h]=p[h]);return r}:u},4958:(t,e,r)=>{var n=r(9204),i=r(2305),a=r(120),o=r(1606)("IE_PROTO"),s=function(){},c="prototype",u=function(){var t,e=r(7233)("iframe"),n=a.length;for(e.style.display="none",r(1847).appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write(" - - - @@ -68,7 +65,7 @@
@@ -123,7 +120,7 @@ - diff --git a/package-lock.json b/package-lock.json index f5e1aad18..7792464de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "3dstreet", - "version": "0.4.6", + "version": "0.4.8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "3dstreet", - "version": "0.4.5", + "version": "0.4.8", "license": "AGPLv3", "dependencies": { "aframe-atlas-uvs-component": "^3.0.0", diff --git a/package.json b/package.json index 45470c9a9..c4b9060f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "3dstreet", - "version": "0.4.6", + "version": "0.4.8", "description": "Web-based 3D visualization of streets using A-Frame and WebXR", "main": "dist/aframe-street-component.js", "scripts": { diff --git a/src/assets.js b/src/assets.js index f59bbeb68..d27e50b12 100644 --- a/src/assets.js +++ b/src/assets.js @@ -1,7 +1,7 @@ /* global AFRAME, customElements */ function buildAssetHTML (assetUrl, categories) { - if (!assetUrl) assetUrl = 'https://assets.3dstreet.app/'; + // if (!assetUrl) assetUrl = 'https://assets.3dstreet.app/'; console.log('[street]', 'Using street assets from', assetUrl); const surfacesRoughness = 0.8; var assetsObj = { @@ -295,7 +295,12 @@ class StreetAssets extends AFRAME.ANode { const self = this; var categories = this.getAttribute('categories'); var assetUrl = this.getAttribute('url'); + if (!assetUrl) { + assetUrl = 'https://assets.3dstreet.app/'; + this.setAttribute('url', assetUrl); + } const assetsHTML = buildAssetHTML(assetUrl, categories); + this.insertAdjacentHTML('afterend', assetsHTML); AFRAME.ANode.prototype.load.call(self); diff --git a/src/components/svg-extruder.js b/src/components/svg-extruder.js new file mode 100644 index 000000000..60d5f36ba --- /dev/null +++ b/src/components/svg-extruder.js @@ -0,0 +1,106 @@ +/* global AFRAME */ +var { SVGLoader } = require('../lib/SVGLoader.js'); + +AFRAME.registerComponent('svg-extruder', { + schema: { + svgString: { type: 'string' }, + depth: { type: 'number', default: 4 } + }, + init: function () { + const el = this.el; + const svgString = this.data.svgString; + this.loader = new SVGLoader(); + + el.addEventListener('materialtextureloaded', () => { + // fix texture properties to correctly show texture for extruded mesh + const extrudedMesh = el.getObject3D('mesh'); + if (extrudedMesh && extrudedMesh.material) { + const texture = extrudedMesh.material.map; + texture.wraps = texture.wrapt = THREE.repeatwrapping; + texture.repeat.set(1 / 100, 1 / 100); + texture.offset.set(0.1, 0.5); + } + }); + + if (svgString) { + this.extrudeFromSVG(svgString); + el.setAttribute('material', 'src:#grass-texture;repeat:5 5;roughness:1'); + el.setAttribute('scale', '0.05 0.05 0.05'); + el.setAttribute('shadow', 'cast: true; receive: true'); + } + }, + extrudeFromSVG: function (svgString) { + const depth = this.data.depth; + const el = this.el; + const svgData = this.loader.parse(svgString); + const fillMaterial = new THREE.MeshStandardMaterial({ color: '#F3FBFB' }); + const stokeMaterial = new THREE.LineBasicMaterial({ + color: '#00A5E6' + }); + + const extrudeSettings = { + depth: depth, + bevelEnabled: false + }; + + // svgGroup.scale.y *= -1; + let shapeIndex = 0; + + const shapeGeometryArray = []; + + svgData.paths.forEach((path) => { + const shapes = SVGLoader.createShapes(path); + + shapes.forEach((shape) => { + const geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings); + shapeGeometryArray.push(geometry); + + const linesGeometry = new THREE.EdgesGeometry(geometry); + const lines = new THREE.LineSegments(linesGeometry, stokeMaterial); + + el.setObject3D('lines' + shapeIndex, lines); + lines.name = 'lines' + shapeIndex; + shapeIndex += 1; + }); + }); + + // Merge array of extruded geometries into the mergedGeometry + const mergedGeometry = + THREE.BufferGeometryUtils.mergeBufferGeometries(shapeGeometryArray); + + mergedGeometry.computeVertexNormals(); + + // Finally, create a mesh with the merged geometry + const mergedMesh = new THREE.Mesh(mergedGeometry, fillMaterial); + + // remove existing mesh from entity + el.removeObject3D('mesh'); + + el.setObject3D('mesh', mergedMesh); + + const box = new THREE.Box3().setFromObject(mergedMesh); + const size = box.getSize(new THREE.Vector3()); + + const zOffset = size.y / -2; + const xOffset = size.x / -2; + + // Offset all of extruded elements, to center them + el.object3D.children.forEach((item) => { + item.position.x = xOffset; + item.position.y = zOffset; + }); + + el.object3D.rotateX(Math.PI / 2); + }, + update: function (oldData) { + // If `oldData` is empty, then this means we're in the initialization process. + // No need to update. + if (Object.keys(oldData).length === 0) { return; } + + const svgString = this.data.svgString; + + if (svgString) { + this.extrudeFromSVG(svgString); + } + } +}); diff --git a/src/index.js b/src/index.js index e1b51f153..072de4d4d 100644 --- a/src/index.js +++ b/src/index.js @@ -3,8 +3,10 @@ require('babel-polyfill'); if (typeof VERSION !== 'undefined') { console.log(`3DStreet Version: ${VERSION} (Date: ${new Date(COMMIT_DATE).toISOString().split('T')[0]}, Commit Hash: #${COMMIT_HASH})`); } var streetmixParsers = require('./aframe-streetmix-parsers'); var streetmixUtils = require('./tested/streetmix-utils'); +require('./json-utils.js'); require('./components/gltf-part'); require('./components/ocean'); +require('./components/svg-extruder.js'); require('./lib/aframe-cursor-teleport-component.min.js'); require('./lib/animation-mixer.js'); require('./assets.js'); diff --git a/src/json-utils.js b/src/json-utils.js index 05d471845..f4af4e3dd 100644 --- a/src/json-utils.js +++ b/src/json-utils.js @@ -1,7 +1,8 @@ /* global AFRAME, Node */ /* version: 1.0 */ -var STREET = {}; +window.STREET = {}; +var assetsUrl; STREET.utils = {}; function getSceneUuidFromURLHash () { @@ -43,6 +44,9 @@ function convertDOMElToObject (entity) { const referenceEntities = document.querySelector('#reference-layers'); const sceneEntities = [entity, environmentElement, referenceEntities]; + // get assets url address + assetsUrl = document.querySelector('street-assets').getAttribute('url'); + for (const entry of sceneEntities) { const entityData = getElementData(entry); if (entityData) { @@ -56,6 +60,8 @@ function convertDOMElToObject (entity) { }; } +STREET.utils.convertDOMElToObject = convertDOMElToObject; + function getElementData (entity) { if (!entity.isEntity) { return; @@ -137,7 +143,12 @@ function toPropString (propData) { return Object.entries(propData) .map(([key, value]) => { if (key == 'src') { - if (value.id) { + // checking to ensure the object's src value is correctly stored + if (value.src && !value.src.includes(assetsUrl)) { + // asset came from external sources. So need to save it src value if it has + return `${key}: ${value.src}`; + } else if (value.id) { + // asset came from 3dstreet. So it has id for link to it return `${key}: #${value.id}`; } else { return `${key}: ${value}`; @@ -175,7 +186,7 @@ const renameProps = { intersection: 'not-intersection' }; -function filterJSONstreet (removeProps, renameProps, streetJSON) { +function filterJSONstreet (streetJSON) { function removeValueCheck (removeVal, value) { if (AFRAME.utils.deepEqual(removeVal, value) || removeVal === '*') { return true; @@ -184,10 +195,11 @@ function filterJSONstreet (removeProps, renameProps, streetJSON) { } let stringJSON = JSON.stringify(streetJSON, function replacer (key, value) { - const compAttributes = AFRAME.utils.styleParser.parse(value); + let compAttributes; for (var removeKey in removeProps) { // check for removing components if (key === removeKey) { + compAttributes = AFRAME.utils.styleParser.parse(value); const removeVal = removeProps[removeKey]; // check for deleting component's attribute if (typeof removeVal === 'object' && !isEmpty(removeVal)) { @@ -210,7 +222,7 @@ function filterJSONstreet (removeProps, renameProps, streetJSON) { } } - return compAttributes; + return compAttributes || value; }); // rename components for (var renameKey in renameProps) { @@ -220,6 +232,8 @@ function filterJSONstreet (removeProps, renameProps, streetJSON) { return stringJSON; } +STREET.utils.filterJSONstreet = filterJSONstreet; + /** * function from 3dstreet-editor/src/lib/entity.js * Gets the value for a component or component's property coming from mixins of @@ -366,6 +380,8 @@ function createEntities (entitiesData, parentEl) { } } +STREET.utils.createEntities = createEntities; + /* Add a new entity with a list of components and children (if exists) * @param {object} entityData Entity definition to add: @@ -550,7 +566,7 @@ AFRAME.registerComponent('set-loader-from-hash', { '[set-loader-from-hash]', '200 response received and JSON parsed, now createElementsFromJSON' ); - createElementsFromJSON(jsonData); + STREET.utils.createElementsFromJSON(jsonData); const sceneId = getUUIDFromPath(requestURL); if (sceneId) { console.log('sceneId from fetchJSON from url hash loader', sceneId); @@ -608,6 +624,8 @@ function inputStreetmix () { '"">'; } +STREET.utils.inputStreetmix = inputStreetmix; + // JSON loading starts here function getValidJSON (stringJSON) { // Preserve newlines, etc. - use valid JSON @@ -642,6 +660,8 @@ function createElementsFromJSON (streetJSON) { STREET.notify.successMessage('Scene loaded from JSON'); } +STREET.utils.createElementsFromJSON = createElementsFromJSON; + // viewer widget click to paste json string of 3dstreet scene function inputJSON () { const stringJSON = prompt('Please paste 3DStreet JSON string'); @@ -660,3 +680,6 @@ function fileJSON () { }; reader.readAsText(this.files[0]); } + +// temporarily place the UI function in utils, which is used in index.html. +STREET.utils.fileJSON = fileJSON; diff --git a/src/lib/SVGLoader.js b/src/lib/SVGLoader.js new file mode 100644 index 000000000..bbcb101dd --- /dev/null +++ b/src/lib/SVGLoader.js @@ -0,0 +1,3173 @@ +const { + Box2, + BufferGeometry, + FileLoader, + Float32BufferAttribute, + Loader, + Matrix3, + Path, + Shape, + ShapePath, + ShapeUtils, + SRGBColorSpace, + Vector2, + Vector3 +} = THREE; + +const COLOR_SPACE_SVG = SRGBColorSpace; + +class SVGLoader extends Loader { + + constructor( manager ) { + + super( manager ); + + // Default dots per inch + this.defaultDPI = 90; + + // Accepted units: 'mm', 'cm', 'in', 'pt', 'pc', 'px' + this.defaultUnit = 'px'; + + } + + load( url, onLoad, onProgress, onError ) { + + const scope = this; + + const loader = new FileLoader( scope.manager ); + loader.setPath( scope.path ); + loader.setRequestHeader( scope.requestHeader ); + loader.setWithCredentials( scope.withCredentials ); + loader.load( url, function ( text ) { + + try { + + onLoad( scope.parse( text ) ); + + } catch ( e ) { + + if ( onError ) { + + onError( e ); + + } else { + + console.error( e ); + + } + + scope.manager.itemError( url ); + + } + + }, onProgress, onError ); + + } + + parse( text ) { + + const scope = this; + + function parseNode( node, style ) { + + if ( node.nodeType !== 1 ) return; + + const transform = getNodeTransform( node ); + + let isDefsNode = false; + + let path = null; + + switch ( node.nodeName ) { + + case 'svg': + style = parseStyle( node, style ); + break; + + case 'style': + parseCSSStylesheet( node ); + break; + + case 'g': + style = parseStyle( node, style ); + break; + + case 'path': + style = parseStyle( node, style ); + if ( node.hasAttribute( 'd' ) ) path = parsePathNode( node ); + break; + + case 'rect': + style = parseStyle( node, style ); + path = parseRectNode( node ); + break; + + case 'polygon': + style = parseStyle( node, style ); + path = parsePolygonNode( node ); + break; + + case 'polyline': + style = parseStyle( node, style ); + path = parsePolylineNode( node ); + break; + + case 'circle': + style = parseStyle( node, style ); + path = parseCircleNode( node ); + break; + + case 'ellipse': + style = parseStyle( node, style ); + path = parseEllipseNode( node ); + break; + + case 'line': + style = parseStyle( node, style ); + path = parseLineNode( node ); + break; + + case 'defs': + isDefsNode = true; + break; + + case 'use': + style = parseStyle( node, style ); + + const href = node.getAttributeNS( 'http://www.w3.org/1999/xlink', 'href' ) || ''; + const usedNodeId = href.substring( 1 ); + const usedNode = node.viewportElement.getElementById( usedNodeId ); + if ( usedNode ) { + + parseNode( usedNode, style ); + + } else { + + console.warn( 'SVGLoader: \'use node\' references non-existent node id: ' + usedNodeId ); + + } + + break; + + default: + // console.log( node ); + + } + + if ( path ) { + + if ( style.fill !== undefined && style.fill !== 'none' ) { + + path.color.setStyle( style.fill, COLOR_SPACE_SVG ); + + } + + transformPath( path, currentTransform ); + + paths.push( path ); + + path.userData = { node: node, style: style }; + + } + + const childNodes = node.childNodes; + + for ( let i = 0; i < childNodes.length; i ++ ) { + + const node = childNodes[ i ]; + + if ( isDefsNode && node.nodeName !== 'style' && node.nodeName !== 'defs' ) { + + // Ignore everything in defs except CSS style definitions + // and nested defs, because it is OK by the standard to have + //