From 44acdfb2d77c18d84a6d230907e72cce4b661cce Mon Sep 17 00:00:00 2001 From: Leon van Kammen Date: Wed, 29 Nov 2023 11:15:22 +0100 Subject: [PATCH] bugfix --- dist/xrfragment.aframe.js | 4 - dist/xrfragment.module.js | 554 ++++++++++++++++++++++ dist/xrfragment.three.js | 4 - dist/xrfragment.three.module.js | 4 - example/assets/index.glb | Bin 2443884 -> 2449332 bytes src/3rd/js/three/xrf/src/non-euclidian.js | 4 - 6 files changed, 554 insertions(+), 16 deletions(-) diff --git a/dist/xrfragment.aframe.js b/dist/xrfragment.aframe.js index e0e18ba..4ae11c8 100644 --- a/dist/xrfragment.aframe.js +++ b/dist/xrfragment.aframe.js @@ -2145,10 +2145,6 @@ xrf.portalNonEuclidian = function(opts){ if( mesh.material ) mesh.material = mesh.material.clone() // clone, so we can individually highlight meshes }, 0, mesh ) - - // spec: increase height of portal(object) floor so it won't get rendererd under the current floor - mesh.portal.posWorld.y +=0.1 - return this } diff --git a/dist/xrfragment.module.js b/dist/xrfragment.module.js index 3ea5aae..af5b067 100644 --- a/dist/xrfragment.module.js +++ b/dist/xrfragment.module.js @@ -108,6 +108,560 @@ * https://xrfragment.org * SPDX-License-Identifier: MPL-2.0 */ +/* + * generated at $(date) + * https://xrfragment.org + * SPDX-License-Identifier: MPL-2.0 + */ +var $hx_exports = typeof exports != "undefined" ? exports : typeof window != "undefined" ? window : typeof self != "undefined" ? self : this; +(function ($global) { "use strict"; +$hx_exports["xrfragment"] = $hx_exports["xrfragment"] || {}; +var EReg = function(r,opt) { + this.r = new RegExp(r,opt.split("u").join("")); +}; +EReg.__name__ = true; +EReg.prototype = { + match: function(s) { + if(this.r.global) { + this.r.lastIndex = 0; + } + this.r.m = this.r.exec(s); + this.r.s = s; + return this.r.m != null; + } + ,split: function(s) { + var d = "#__delim__#"; + return s.replace(this.r,d).split(d); + } +}; +var HxOverrides = function() { }; +HxOverrides.__name__ = true; +HxOverrides.cca = function(s,index) { + var x = s.charCodeAt(index); + if(x != x) { + return undefined; + } + return x; +}; +HxOverrides.substr = function(s,pos,len) { + if(len == null) { + len = s.length; + } else if(len < 0) { + if(pos == 0) { + len = s.length + len; + } else { + return ""; + } + } + return s.substr(pos,len); +}; +HxOverrides.now = function() { + return Date.now(); +}; +Math.__name__ = true; +var Reflect = function() { }; +Reflect.__name__ = true; +Reflect.field = function(o,field) { + try { + return o[field]; + } catch( _g ) { + return null; + } +}; +Reflect.fields = function(o) { + var a = []; + if(o != null) { + var hasOwnProperty = Object.prototype.hasOwnProperty; + for( var f in o ) { + if(f != "__id__" && f != "hx__closures__" && hasOwnProperty.call(o,f)) { + a.push(f); + } + } + } + return a; +}; +Reflect.deleteField = function(o,field) { + if(!Object.prototype.hasOwnProperty.call(o,field)) { + return false; + } + delete(o[field]); + return true; +}; +Reflect.copy = function(o) { + if(o == null) { + return null; + } + var o2 = { }; + var _g = 0; + var _g1 = Reflect.fields(o); + while(_g < _g1.length) { + var f = _g1[_g]; + ++_g; + o2[f] = Reflect.field(o,f); + } + return o2; +}; +var Std = function() { }; +Std.__name__ = true; +Std.string = function(s) { + return js_Boot.__string_rec(s,""); +}; +Std.parseInt = function(x) { + if(x != null) { + var _g = 0; + var _g1 = x.length; + while(_g < _g1) { + var i = _g++; + var c = x.charCodeAt(i); + if(c <= 8 || c >= 14 && c != 32 && c != 45) { + var nc = x.charCodeAt(i + 1); + var v = parseInt(x,nc == 120 || nc == 88 ? 16 : 10); + if(isNaN(v)) { + return null; + } else { + return v; + } + } + } + } + return null; +}; +var StringTools = function() { }; +StringTools.__name__ = true; +StringTools.isSpace = function(s,pos) { + var c = HxOverrides.cca(s,pos); + if(!(c > 8 && c < 14)) { + return c == 32; + } else { + return true; + } +}; +StringTools.ltrim = function(s) { + var l = s.length; + var r = 0; + while(r < l && StringTools.isSpace(s,r)) ++r; + if(r > 0) { + return HxOverrides.substr(s,r,l - r); + } else { + return s; + } +}; +StringTools.rtrim = function(s) { + var l = s.length; + var r = 0; + while(r < l && StringTools.isSpace(s,l - r - 1)) ++r; + if(r > 0) { + return HxOverrides.substr(s,0,l - r); + } else { + return s; + } +}; +StringTools.trim = function(s) { + return StringTools.ltrim(StringTools.rtrim(s)); +}; +var haxe_iterators_ArrayIterator = function(array) { + this.current = 0; + this.array = array; +}; +haxe_iterators_ArrayIterator.__name__ = true; +haxe_iterators_ArrayIterator.prototype = { + hasNext: function() { + return this.current < this.array.length; + } + ,next: function() { + return this.array[this.current++]; + } +}; +var js_Boot = function() { }; +js_Boot.__name__ = true; +js_Boot.__string_rec = function(o,s) { + if(o == null) { + return "null"; + } + if(s.length >= 5) { + return "<...>"; + } + var t = typeof(o); + if(t == "function" && (o.__name__ || o.__ename__)) { + t = "object"; + } + switch(t) { + case "function": + return ""; + case "object": + if(((o) instanceof Array)) { + var str = "["; + s += "\t"; + var _g = 0; + var _g1 = o.length; + while(_g < _g1) { + var i = _g++; + str += (i > 0 ? "," : "") + js_Boot.__string_rec(o[i],s); + } + str += "]"; + return str; + } + var tostr; + try { + tostr = o.toString; + } catch( _g ) { + return "???"; + } + if(tostr != null && tostr != Object.toString && typeof(tostr) == "function") { + var s2 = o.toString(); + if(s2 != "[object Object]") { + return s2; + } + } + var str = "{\n"; + s += "\t"; + var hasp = o.hasOwnProperty != null; + var k = null; + for( k in o ) { + if(hasp && !o.hasOwnProperty(k)) { + continue; + } + if(k == "prototype" || k == "__class__" || k == "__super__" || k == "__interfaces__" || k == "__properties__") { + continue; + } + if(str.length != 2) { + str += ", \n"; + } + str += s + k + " : " + js_Boot.__string_rec(o[k],s); + } + s = s.substring(1); + str += "\n" + s + "}"; + return str; + case "string": + return o; + default: + return String(o); + } +}; +var xrfragment_Filter = $hx_exports["xrfragment"]["Filter"] = function(str) { + this.q = { }; + this.str = ""; + if(str != null) { + this.parse(str); + } +}; +xrfragment_Filter.__name__ = true; +xrfragment_Filter.prototype = { + toObject: function() { + return Reflect.copy(this.q); + } + ,get: function() { + return Reflect.copy(this.q); + } + ,parse: function(str) { + var token = str.split(" "); + var q = { }; + var process = function(str,prefix) { + if(prefix == null) { + prefix = ""; + } + str = StringTools.trim(str); + var k = str.split("=")[0]; + var v = str.split("=")[1]; + var filter = { }; + if(q[prefix + k]) { + filter = q[prefix + k]; + } + if(xrfragment_XRF.isProp.match(str)) { + var oper = ""; + if(str.indexOf(">") != -1) { + oper = ">"; + } + if(str.indexOf("<") != -1) { + oper = "<"; + } + if(xrfragment_XRF.isExclude.match(k)) { + k = HxOverrides.substr(k,1,null); + } + v = HxOverrides.substr(v,oper.length,null); + if(oper.length == 0) { + oper = "="; + } + var rule = { }; + if(xrfragment_XRF.isNumber.match(v)) { + rule[oper] = parseFloat(v); + } else { + rule[oper] = v; + } + q["expr"] = rule; + } + var value = xrfragment_XRF.isDeep.match(str) ? k.split("*").length - 1 : 0; + q["deep"] = value; + var value = xrfragment_XRF.isExclude.match(str) ? false : true; + q["show"] = value; + var value = k.replace(xrfragment_XRF.operators.r,""); + q["key"] = value; + q["value"] = v; + }; + var _g = 0; + var _g1 = token.length; + while(_g < _g1) { + var i = _g++; + process(token[i]); + } + return this.q = q; + } + ,test: function(obj) { + var qualify = false; + var _g = 0; + var _g1 = Reflect.fields(obj); + while(_g < _g1.length) { + var k = _g1[_g]; + ++_g; + var v = Std.string(Reflect.field(obj,k)); + if(this.testProperty(k,v)) { + qualify = true; + } + } + var _g = 0; + var _g1 = Reflect.fields(obj); + while(_g < _g1.length) { + var k = _g1[_g]; + ++_g; + var v = Std.string(Reflect.field(obj,k)); + if(this.testProperty(k,v,true)) { + qualify = false; + } + } + return qualify; + } + ,testProperty: function(property,value,exclude) { + var conds = 0; + var fails = 0; + var qualify = 0; + var testprop = function(expr) { + conds += 1; + fails += expr ? 0 : 1; + return expr; + }; + if(this.q[value] != null) { + var v = this.q[value]; + if(v[property] != null) { + return v[property]; + } + } + if(Reflect.field(this.q,"expr")) { + var f = Reflect.field(this.q,"expr"); + if(!Reflect.field(this.q,"show")) { + if(Reflect.field(f,"!=") != null && testprop((value == null ? "null" : "" + value) == Std.string(Reflect.field(f,"!="))) && exclude) { + ++qualify; + } + } else { + if(Reflect.field(f,"*") != null && testprop(parseFloat(value) != null)) { + ++qualify; + } + if(Reflect.field(f,">") != null && testprop(parseFloat(value) >= parseFloat(Reflect.field(f,">")))) { + ++qualify; + } + if(Reflect.field(f,"<") != null && testprop(parseFloat(value) <= parseFloat(Reflect.field(f,"<")))) { + ++qualify; + } + if(Reflect.field(f,"=") != null && (testprop(value == Reflect.field(f,"=")) || testprop(parseFloat(value) == parseFloat(Reflect.field(f,"="))))) { + ++qualify; + } + } + } + return qualify > 0; + } +}; +var xrfragment_Parser = $hx_exports["xrfragment"]["Parser"] = function() { }; +xrfragment_Parser.__name__ = true; +xrfragment_Parser.parse = function(key,value,store,index) { + var Frag_h = Object.create(null); + Frag_h["#"] = xrfragment_XRF.ASSET | xrfragment_XRF.T_PREDEFINED_VIEW | xrfragment_XRF.PV_EXECUTE; + Frag_h["src"] = xrfragment_XRF.ASSET | xrfragment_XRF.T_URL; + Frag_h["href"] = xrfragment_XRF.ASSET | xrfragment_XRF.T_URL | xrfragment_XRF.T_PREDEFINED_VIEW; + Frag_h["tag"] = xrfragment_XRF.ASSET | xrfragment_XRF.T_STRING; + Frag_h["pos"] = xrfragment_XRF.PV_OVERRIDE | xrfragment_XRF.T_VECTOR3 | xrfragment_XRF.T_STRING | xrfragment_XRF.T_STRING_OBJ | xrfragment_XRF.METADATA | xrfragment_XRF.NAVIGATOR; + Frag_h["rot"] = xrfragment_XRF.QUERY_OPERATOR | xrfragment_XRF.PV_OVERRIDE | xrfragment_XRF.T_VECTOR3 | xrfragment_XRF.METADATA | xrfragment_XRF.NAVIGATOR; + Frag_h["t"] = xrfragment_XRF.ASSET | xrfragment_XRF.PV_OVERRIDE | xrfragment_XRF.T_FLOAT | xrfragment_XRF.T_VECTOR2 | xrfragment_XRF.T_STRING | xrfragment_XRF.NAVIGATOR | xrfragment_XRF.METADATA; + Frag_h["tv"] = xrfragment_XRF.ASSET | xrfragment_XRF.PV_OVERRIDE | xrfragment_XRF.T_FLOAT | xrfragment_XRF.T_VECTOR2 | xrfragment_XRF.T_VECTOR3 | xrfragment_XRF.NAVIGATOR | xrfragment_XRF.METADATA; + Frag_h["namespace"] = xrfragment_XRF.ASSET | xrfragment_XRF.T_STRING; + Frag_h["SPDX"] = xrfragment_XRF.ASSET | xrfragment_XRF.T_STRING; + Frag_h["unit"] = xrfragment_XRF.ASSET | xrfragment_XRF.T_STRING; + Frag_h["description"] = xrfragment_XRF.ASSET | xrfragment_XRF.T_STRING; + Frag_h["session"] = xrfragment_XRF.ASSET | xrfragment_XRF.T_URL | xrfragment_XRF.PV_OVERRIDE | xrfragment_XRF.NAVIGATOR | xrfragment_XRF.METADATA | xrfragment_XRF.PROMPT; + var keyStripped = key.replace(xrfragment_XRF.operators.r,""); + var isPVDynamic = key.length > 0 && !Object.prototype.hasOwnProperty.call(Frag_h,key); + var isPVDefault = value.length == 0 && key.length > 0 && key == "#"; + if(isPVDynamic) { + var v = new xrfragment_XRF(key,xrfragment_XRF.PV_EXECUTE | xrfragment_XRF.NAVIGATOR,index); + v.validate(value); + store[keyStripped] = v; + return true; + } + var v = new xrfragment_XRF(key,Frag_h[key],index); + if(Object.prototype.hasOwnProperty.call(Frag_h,key)) { + if(!v.validate(value)) { + console.log("src/xrfragment/Parser.hx:66:","⚠ fragment '" + key + "' has incompatible value (" + value + ")"); + return false; + } + store[keyStripped] = v; + if(xrfragment_Parser.debug) { + console.log("src/xrfragment/Parser.hx:70:","✔ " + key + ": " + v.string); + } + } else { + if(typeof(value) == "string") { + v.guessType(v,value); + } + v.noXRF = true; + store[keyStripped] = v; + } + return true; +}; +var xrfragment_URI = $hx_exports["xrfragment"]["URI"] = function() { }; +xrfragment_URI.__name__ = true; +xrfragment_URI.parse = function(url,filter) { + var store = { }; + if(url == null || url.indexOf("#") == -1) { + return store; + } + var fragment = url.split("#"); + var splitArray = fragment[1].split("&"); + var _g = 0; + var _g1 = splitArray.length; + while(_g < _g1) { + var i = _g++; + var splitByEqual = splitArray[i].split("="); + var regexPlus = new EReg("\\+","g"); + var key = splitByEqual[0]; + var value = ""; + if(splitByEqual.length > 1) { + var s = regexPlus.split(splitByEqual[1]).join(" "); + value = decodeURIComponent(s.split("+").join(" ")); + } + var ok = xrfragment_Parser.parse(key,value,store,i); + } + if(filter != null && filter != 0) { + var _g = 0; + var _g1 = Reflect.fields(store); + while(_g < _g1.length) { + var key = _g1[_g]; + ++_g; + var xrf = store[key]; + if(!xrf.is(filter)) { + Reflect.deleteField(store,key); + } + } + } + return store; +}; +var xrfragment_XRF = $hx_exports["xrfragment"]["XRF"] = function(_fragment,_flags,_index) { + this.fragment = _fragment; + this.flags = _flags; + this.index = _index; +}; +xrfragment_XRF.__name__ = true; +xrfragment_XRF.set = function(flag,flags) { + return flags | flag; +}; +xrfragment_XRF.unset = function(flag,flags) { + return flags & ~flag; +}; +xrfragment_XRF.prototype = { + is: function(flag) { + var v = this.flags; + if(!(typeof(v) == "number" && ((v | 0) === v))) { + this.flags = 0; + } + return (this.flags & flag) != 0; + } + ,validate: function(value) { + this.guessType(this,value); + var ok = true; + if(!this.is(xrfragment_XRF.T_FLOAT) && this.is(xrfragment_XRF.T_VECTOR2) && !(typeof(this.x) == "number" && typeof(this.y) == "number")) { + ok = false; + } + if(!(this.is(xrfragment_XRF.T_VECTOR2) || this.is(xrfragment_XRF.T_STRING)) && this.is(xrfragment_XRF.T_VECTOR3) && !(typeof(this.x) == "number" && typeof(this.y) == "number" && typeof(this.z) == "number")) { + ok = false; + } + return ok; + } + ,guessType: function(v,str) { + v.string = str; + if(typeof(str) != "string") { + return; + } + if(str.length > 0) { + if(str.split(",").length > 1) { + var xyzw = str.split(","); + if(xyzw.length > 0) { + v.x = parseFloat(xyzw[0]); + } + if(xyzw.length > 1) { + v.y = parseFloat(xyzw[1]); + } + if(xyzw.length > 2) { + v.z = parseFloat(xyzw[2]); + } + if(xyzw.length > 3) { + v.w = parseFloat(xyzw[3]); + } + } + if(xrfragment_XRF.isColor.match(str)) { + v.color = str; + } + if(xrfragment_XRF.isFloat.match(str)) { + v.x = parseFloat(str); + v.float = v.x; + } + if(xrfragment_XRF.isInt.match(str)) { + v.int = Std.parseInt(str); + v.x = v.int; + } + v.filter = new xrfragment_Filter(v.fragment + "=" + v.string); + } else { + v.filter = new xrfragment_Filter(v.fragment); + } + } +}; +if(typeof(performance) != "undefined" ? typeof(performance.now) == "function" : false) { + HxOverrides.now = performance.now.bind(performance); +} +String.__name__ = true; +Array.__name__ = true; +js_Boot.__toStr = ({ }).toString; +xrfragment_Parser.error = ""; +xrfragment_Parser.debug = false; +xrfragment_XRF.ASSET = 1; +xrfragment_XRF.PROP_BIND = 2; +xrfragment_XRF.QUERY_OPERATOR = 4; +xrfragment_XRF.PROMPT = 8; +xrfragment_XRF.ROUNDROBIN = 16; +xrfragment_XRF.NAVIGATOR = 32; +xrfragment_XRF.METADATA = 64; +xrfragment_XRF.PV_OVERRIDE = 128; +xrfragment_XRF.PV_EXECUTE = 256; +xrfragment_XRF.T_COLOR = 8192; +xrfragment_XRF.T_INT = 16384; +xrfragment_XRF.T_FLOAT = 32768; +xrfragment_XRF.T_VECTOR2 = 65536; +xrfragment_XRF.T_VECTOR3 = 131072; +xrfragment_XRF.T_URL = 262144; +xrfragment_XRF.T_PREDEFINED_VIEW = 524288; +xrfragment_XRF.T_STRING = 1048576; +xrfragment_XRF.T_STRING_OBJ = 2097152; +xrfragment_XRF.T_STRING_OBJ_PROP = 4194304; +xrfragment_XRF.isColor = new EReg("^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$",""); +xrfragment_XRF.isInt = new EReg("^[-0-9]+$",""); +xrfragment_XRF.isFloat = new EReg("^[-0-9]+\\.[0-9]+$",""); +xrfragment_XRF.isVector = new EReg("([,]+|\\w)",""); +xrfragment_XRF.isUrl = new EReg("(://)?\\..*",""); +xrfragment_XRF.isUrlOrPretypedView = new EReg("(^#|://)?\\..*",""); +xrfragment_XRF.isString = new EReg(".*",""); +xrfragment_XRF.operators = new EReg("(^-|[\\*]+)",""); +xrfragment_XRF.isProp = new EReg("^.*=[><=]?",""); +xrfragment_XRF.isExclude = new EReg("^-",""); +xrfragment_XRF.isDeep = new EReg("\\*",""); +xrfragment_XRF.isNumber = new EReg("^[0-9\\.]+$",""); +})({}); +var xrfragment = $hx_exports["xrfragment"]; +export default xrfragment; var $hx_exports = typeof exports != "undefined" ? exports : typeof window != "undefined" ? window : typeof self != "undefined" ? self : this; (function ($global) { "use strict"; $hx_exports["xrfragment"] = $hx_exports["xrfragment"] || {}; diff --git a/dist/xrfragment.three.js b/dist/xrfragment.three.js index 7bb3b74..b21cf9d 100644 --- a/dist/xrfragment.three.js +++ b/dist/xrfragment.three.js @@ -2145,10 +2145,6 @@ xrf.portalNonEuclidian = function(opts){ if( mesh.material ) mesh.material = mesh.material.clone() // clone, so we can individually highlight meshes }, 0, mesh ) - - // spec: increase height of portal(object) floor so it won't get rendererd under the current floor - mesh.portal.posWorld.y +=0.1 - return this } diff --git a/dist/xrfragment.three.module.js b/dist/xrfragment.three.module.js index 88f5698..ddce0f4 100644 --- a/dist/xrfragment.three.module.js +++ b/dist/xrfragment.three.module.js @@ -2145,10 +2145,6 @@ xrf.portalNonEuclidian = function(opts){ if( mesh.material ) mesh.material = mesh.material.clone() // clone, so we can individually highlight meshes }, 0, mesh ) - - // spec: increase height of portal(object) floor so it won't get rendererd under the current floor - mesh.portal.posWorld.y +=0.1 - return this } diff --git a/example/assets/index.glb b/example/assets/index.glb index 03defecb309032d486ac4f2e4f7793997a3d13df..7e89f5bd5cf55ac989fd0414a33153eed14f71de 100644 GIT binary patch delta 8251 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 mRfGLC*k6O+uh8K4Yw-W$;Qz