";
+ 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 6edb330..847f08d 100644
--- a/dist/xrfragment.three.js
+++ b/dist/xrfragment.three.js
@@ -843,6 +843,7 @@ xrf.model = {}
xrf.mixers = []
xrf.init = ((init) => function(opts){
+ console.log("add #debug to URL to see XR Fragment debuglog")
let scene = new opts.THREE.Group()
opts.scene.add(scene)
opts.scene = scene
@@ -1412,7 +1413,7 @@ xrf.addEventListener('parseModel', (opts) => {
mixer.actions.map( (action) => {
if( mixer.loop.timeStart != undefined ){
action.time = mixer.loop.timeStart
- action.setLoop( THREE.LoopOnce, )
+ action.setLoop( xrf.THREE.LoopOnce, )
action.timeScale = mixer.timeScale
action.enabled = true
if( t.x != 0 ){
@@ -2071,9 +2072,9 @@ xrf.portalNonEuclidian = function(opts){
stencilRef: xrf.portalNonEuclidian.stencilRef,
needUpdate: false,
stencilObject: false,
- cameraDirection: new THREE.Vector3(),
- cameraPosition: new THREE.Vector3(),
- raycaster: new THREE.Raycaster(),
+ cameraDirection: new xrf.THREE.Vector3(),
+ cameraPosition: new xrf.THREE.Vector3(),
+ raycaster: new xrf.THREE.Raycaster(),
isLocal: opts.isLocal,
isLens: false,
isInside: false,
diff --git a/dist/xrfragment.three.module.js b/dist/xrfragment.three.module.js
index 06c7555..c5aee8b 100644
--- a/dist/xrfragment.three.module.js
+++ b/dist/xrfragment.three.module.js
@@ -843,6 +843,7 @@ xrf.model = {}
xrf.mixers = []
xrf.init = ((init) => function(opts){
+ console.log("add #debug to URL to see XR Fragment debuglog")
let scene = new opts.THREE.Group()
opts.scene.add(scene)
opts.scene = scene
@@ -1412,7 +1413,7 @@ xrf.addEventListener('parseModel', (opts) => {
mixer.actions.map( (action) => {
if( mixer.loop.timeStart != undefined ){
action.time = mixer.loop.timeStart
- action.setLoop( THREE.LoopOnce, )
+ action.setLoop( xrf.THREE.LoopOnce, )
action.timeScale = mixer.timeScale
action.enabled = true
if( t.x != 0 ){
@@ -2071,9 +2072,9 @@ xrf.portalNonEuclidian = function(opts){
stencilRef: xrf.portalNonEuclidian.stencilRef,
needUpdate: false,
stencilObject: false,
- cameraDirection: new THREE.Vector3(),
- cameraPosition: new THREE.Vector3(),
- raycaster: new THREE.Raycaster(),
+ cameraDirection: new xrf.THREE.Vector3(),
+ cameraPosition: new xrf.THREE.Vector3(),
+ raycaster: new xrf.THREE.Raycaster(),
isLocal: opts.isLocal,
isLens: false,
isInside: false,
diff --git a/example/aframe/sandbox/index.html b/example/aframe/sandbox/index.html
index 7209226..b7dd7a6 100644
--- a/example/aframe/sandbox/index.html
+++ b/example/aframe/sandbox/index.html
@@ -4,14 +4,12 @@
AFRAME - xrfragment sandbox
-
-
-
+
-
-
-
+
+
+
diff --git a/example/assets/index.glb b/example/assets/index.glb
index 521afd9..9794079 100644
Binary files a/example/assets/index.glb and b/example/assets/index.glb differ
diff --git a/example/three/sandbox/index.html b/example/three/sandbox/index.html
index 96b558f..df1866c 100644
--- a/example/three/sandbox/index.html
+++ b/example/three/sandbox/index.html
@@ -15,7 +15,6 @@
-
@@ -23,7 +22,6 @@
-
@@ -39,9 +37,9 @@