diff --git a/src/.lua/apiSync.lua b/src/.lua/apiSync.lua index cbee13a..154c00f 100644 --- a/src/.lua/apiSync.lua +++ b/src/.lua/apiSync.lua @@ -54,11 +54,6 @@ local apiSync = { -- runs sync in foreground app.on('init', function() - foreach( app.plugin.openbrush.opts, function(k,opt) - if opt.key == 'app.opts.plugin_openbrush_sync_folder' then - opt.values = app.cache.dirs - end - end) if util.contains(argv, 'generate') then api.sync(api) end end) diff --git a/src/.lua/util.lua b/src/.lua/util.lua index 619a607..7e71469 100644 --- a/src/.lua/util.lua +++ b/src/.lua/util.lua @@ -418,7 +418,7 @@ end util.hyphenate = function(str) local str,match = str:lower() - :gsub("[^%w]", "-") + :gsub("[^%w_]", "-") :gsub("%-+", "-") :gsub("^%-", "") :gsub("%-$", "") @@ -426,7 +426,7 @@ util.hyphenate = function(str) end util.dehyphenate = function(str) - local str,match = str:gsub("_[a-zA-Z0-9]+","") -- remove ids starting with _ + local str,match = str:gsub("^_[a-zA-Z0-9]+","") -- remove ids starting with _ :gsub("%-%-","-") -- remove double dash :gsub("-"," ") -- convert to spaces :gsub("^%s*(.-)%s*$", "%1") -- trim diff --git a/src/myverse/tronverse/tronverse-icosagallery/README.md b/src/myverse/tronverse/tronverse-icosagallery/README.md new file mode 100644 index 0000000..3464c2d --- /dev/null +++ b/src/myverse/tronverse/tronverse-icosagallery/README.md @@ -0,0 +1,60 @@ +

Hi there! 👋

+Welcome to this XR experience.
+
+
+ +
+ + +
+ +This virtual world is generated in realtime via icosa.gallery. +You can add/create parcels in icosa.gallery, by publishing via OpenBrush, OpenBlocks, or Blender.
+ +> NOTE: Make sure to add hashtag **#tronverse-icosagallery** to the title (and re-run xrforge for fast re-sync). \ No newline at end of file diff --git a/src/myverse/tronverse/tronverse-icosagallery/_0dycp4HDxf4-tronverse_floor-overlay-tronverse-icosagallery.jpg b/src/myverse/tronverse/tronverse-icosagallery/_0dycp4HDxf4-tronverse_floor-overlay-tronverse-icosagallery.jpg new file mode 100644 index 0000000..4e41bc7 Binary files /dev/null and b/src/myverse/tronverse/tronverse-icosagallery/_0dycp4HDxf4-tronverse_floor-overlay-tronverse-icosagallery.jpg differ diff --git a/src/myverse/tronverse/tronverse-icosagallery/_0dycp4HDxf4-tronverse_floor-overlay-tronverse-icosagallery/asset.json b/src/myverse/tronverse/tronverse-icosagallery/_0dycp4HDxf4-tronverse_floor-overlay-tronverse-icosagallery/asset.json new file mode 100644 index 0000000..a14e1d0 --- /dev/null +++ b/src/myverse/tronverse/tronverse-icosagallery/_0dycp4HDxf4-tronverse_floor-overlay-tronverse-icosagallery/asset.json @@ -0,0 +1 @@ +{"assetId":"0dycp4HDxf4","authorId":"9Vkr0htmSzc","authorName":"coderofsalvation","createTime":"2026-09-15T13:03:05.314Z","description":"","displayName":"tronverse_floor #overlay #tronverse-icosagallery","formats":[{"formatComplexity":{},"formatType":"GLTF2","isCorsAllowed":true,"isPreferredForDownload":true,"isPreferredForGalleryViewer":true,"resources":[],"role":"USER_SUPPLIED_GLTF","root":{"contentType":"model\/gltf-binary","relativePath":"tronverse_floor.glb","url":"https:\/\/s3.us-east-005.backblazeb2.com\/icosa-gallery\/icosa\/28534\/755050994710086613\/GLTF2\/tronverse_floor.glb"}}],"isCurated":false,"isIcosaGalleryCompatible":true,"license":"CREATIVE_COMMONS_BY","licenseVersion":"4.0","name":"assets\/0dycp4HDxf4","thumbnail":{"relativePath":"preview_image.jpg","url":"https:\/\/s3.us-east-005.backblazeb2.com\/icosa-gallery\/icosa\/28534\/755050994710086613\/preview_image.jpg"},"triangleCount":0,"updateTime":"2026-09-16T11:21:33.683Z","url":"http:\/\/api.icosa.gallery\/v1\/assets\/0dycp4HDxf4","visibility":"PUBLIC"} \ No newline at end of file diff --git a/src/myverse/tronverse/tronverse-icosagallery/_0dycp4HDxf4-tronverse_floor-overlay-tronverse-icosagallery/tronverse_floor.glb b/src/myverse/tronverse/tronverse-icosagallery/_0dycp4HDxf4-tronverse_floor-overlay-tronverse-icosagallery/tronverse_floor.glb new file mode 100644 index 0000000..a47f7f8 Binary files /dev/null and b/src/myverse/tronverse/tronverse-icosagallery/_0dycp4HDxf4-tronverse_floor-overlay-tronverse-icosagallery/tronverse_floor.glb differ diff --git a/src/myverse/tronverse/tronverse-icosagallery/_C9J0_dyCzd8-tronverse_parcel_empty-tronverse-icosagallery.jpg b/src/myverse/tronverse/tronverse-icosagallery/_C9J0_dyCzd8-tronverse_parcel_empty-tronverse-icosagallery.jpg new file mode 100644 index 0000000..3be4612 Binary files /dev/null and b/src/myverse/tronverse/tronverse-icosagallery/_C9J0_dyCzd8-tronverse_parcel_empty-tronverse-icosagallery.jpg differ diff --git a/src/myverse/tronverse/tronverse-icosagallery/_C9J0_dyCzd8-tronverse_parcel_empty-tronverse-icosagallery/asset.json b/src/myverse/tronverse/tronverse-icosagallery/_C9J0_dyCzd8-tronverse_parcel_empty-tronverse-icosagallery/asset.json new file mode 100644 index 0000000..d00768d --- /dev/null +++ b/src/myverse/tronverse/tronverse-icosagallery/_C9J0_dyCzd8-tronverse_parcel_empty-tronverse-icosagallery/asset.json @@ -0,0 +1 @@ +{"assetId":"C9J0_dyCzd8","authorId":"9Vkr0htmSzc","authorName":"coderofsalvation","createTime":"2026-09-15T18:22:06.894Z","description":"copy this asset as a starting point to paint into","displayName":"tronverse_parcel_empty #tronverse-icosagallery","formats":[{"formatComplexity":{},"formatType":"GLTF2","isCorsAllowed":true,"isPreferredForDownload":true,"isPreferredForGalleryViewer":true,"resources":[],"role":"USER_SUPPLIED_GLTF","root":{"contentType":"model\/gltf-binary","relativePath":"tronverse_parcel_empty.glb","url":"https:\/\/s3.us-east-005.backblazeb2.com\/icosa-gallery\/icosa\/28534\/755131280311452630\/GLTF2\/tronverse_parcel_empty.glb"}}],"isCurated":false,"isIcosaGalleryCompatible":true,"license":"CREATIVE_COMMONS_BY","licenseVersion":"4.0","name":"assets\/C9J0_dyCzd8","thumbnail":{"relativePath":"preview_image.jpg","url":"https:\/\/s3.us-east-005.backblazeb2.com\/icosa-gallery\/icosa\/28534\/755131280311452630\/preview_image.jpg"},"triangleCount":0,"updateTime":"2026-09-16T11:21:20.762Z","url":"http:\/\/api.icosa.gallery\/v1\/assets\/C9J0_dyCzd8","visibility":"PUBLIC"} \ No newline at end of file diff --git a/src/myverse/tronverse/tronverse-icosagallery/_C9J0_dyCzd8-tronverse_parcel_empty-tronverse-icosagallery/tronverse_parcel_empty.glb b/src/myverse/tronverse/tronverse-icosagallery/_C9J0_dyCzd8-tronverse_parcel_empty-tronverse-icosagallery/tronverse_parcel_empty.glb new file mode 100644 index 0000000..ae2bda2 Binary files /dev/null and b/src/myverse/tronverse/tronverse-icosagallery/_C9J0_dyCzd8-tronverse_parcel_empty-tronverse-icosagallery/tronverse_parcel_empty.glb differ diff --git a/src/myverse/tronverse/tronverse-icosagallery/_igTGJIhJcSw-tronverse_parcel3-tronverse-icosagallery.jpg b/src/myverse/tronverse/tronverse-icosagallery/_igTGJIhJcSw-tronverse_parcel3-tronverse-icosagallery.jpg new file mode 100644 index 0000000..77c8489 Binary files /dev/null and b/src/myverse/tronverse/tronverse-icosagallery/_igTGJIhJcSw-tronverse_parcel3-tronverse-icosagallery.jpg differ diff --git a/src/myverse/tronverse/tronverse-icosagallery/_igTGJIhJcSw-tronverse_parcel3-tronverse-icosagallery/asset.json b/src/myverse/tronverse/tronverse-icosagallery/_igTGJIhJcSw-tronverse_parcel3-tronverse-icosagallery/asset.json new file mode 100644 index 0000000..5a760af --- /dev/null +++ b/src/myverse/tronverse/tronverse-icosagallery/_igTGJIhJcSw-tronverse_parcel3-tronverse-icosagallery/asset.json @@ -0,0 +1 @@ +{"assetId":"igTGJIhJcSw","authorId":"9Vkr0htmSzc","authorName":"coderofsalvation","createTime":"2026-09-16T10:16:05.148Z","description":"","displayName":"tronverse_parcel3 #tronverse-icosagallery","formats":[{"formatComplexity":{},"formatType":"GLTF2","isCorsAllowed":true,"isPreferredForDownload":true,"isPreferredForGalleryViewer":true,"resources":[],"role":"USER_SUPPLIED_GLTF","root":{"contentType":"model\/gltf-binary","relativePath":"tronverse_parcel3.glb","url":"https:\/\/s3.us-east-005.backblazeb2.com\/icosa-gallery\/icosa\/28534\/755371354949157841\/GLTF2\/tronverse_parcel3.glb"}}],"isCurated":false,"isIcosaGalleryCompatible":true,"license":"CREATIVE_COMMONS_BY","licenseVersion":"4.0","name":"assets\/igTGJIhJcSw","thumbnail":{"relativePath":"preview_image.jpg","url":"https:\/\/s3.us-east-005.backblazeb2.com\/icosa-gallery\/icosa\/28534\/755371354949157841\/preview_image.jpg"},"triangleCount":0,"updateTime":"2026-09-16T11:20:41.832Z","url":"http:\/\/api.icosa.gallery\/v1\/assets\/igTGJIhJcSw","visibility":"PUBLIC"} \ No newline at end of file diff --git a/src/myverse/tronverse/tronverse-icosagallery/_igTGJIhJcSw-tronverse_parcel3-tronverse-icosagallery/tronverse_parcel3.glb b/src/myverse/tronverse/tronverse-icosagallery/_igTGJIhJcSw-tronverse_parcel3-tronverse-icosagallery/tronverse_parcel3.glb new file mode 100644 index 0000000..47a82db Binary files /dev/null and b/src/myverse/tronverse/tronverse-icosagallery/_igTGJIhJcSw-tronverse_parcel3-tronverse-icosagallery/tronverse_parcel3.glb differ diff --git a/src/myverse/tronverse/tronverse-icosagallery/_mRU7wJh9BLQ-tronverse_parcel1-tronverse-icosagallery.jpg b/src/myverse/tronverse/tronverse-icosagallery/_mRU7wJh9BLQ-tronverse_parcel1-tronverse-icosagallery.jpg new file mode 100644 index 0000000..e7cbafd Binary files /dev/null and b/src/myverse/tronverse/tronverse-icosagallery/_mRU7wJh9BLQ-tronverse_parcel1-tronverse-icosagallery.jpg differ diff --git a/src/myverse/tronverse/tronverse-icosagallery/_mRU7wJh9BLQ-tronverse_parcel1-tronverse-icosagallery/asset.json b/src/myverse/tronverse/tronverse-icosagallery/_mRU7wJh9BLQ-tronverse_parcel1-tronverse-icosagallery/asset.json new file mode 100644 index 0000000..ea5de32 --- /dev/null +++ b/src/myverse/tronverse/tronverse-icosagallery/_mRU7wJh9BLQ-tronverse_parcel1-tronverse-icosagallery/asset.json @@ -0,0 +1 @@ +{"assetId":"mRU7wJh9BLQ","authorId":"9Vkr0htmSzc","authorName":"coderofsalvation","createTime":"2026-09-15T11:44:11.217Z","description":"","displayName":"tronverse_parcel1 #tronverse-icosagallery","formats":[{"formatComplexity":{},"formatType":"GLTF2","isCorsAllowed":true,"isPreferredForDownload":true,"isPreferredForGalleryViewer":true,"resources":[],"role":"USER_SUPPLIED_GLTF","root":{"contentType":"model\/gltf-binary","relativePath":"tronverse_parcel1.glb","url":"https:\/\/s3.us-east-005.backblazeb2.com\/icosa-gallery\/icosa\/28534\/755031138472297450\/GLTF2\/tronverse_parcel1.glb"}}],"isCurated":false,"isIcosaGalleryCompatible":true,"license":"CREATIVE_COMMONS_BY","licenseVersion":"4.0","name":"assets\/mRU7wJh9BLQ","thumbnail":{"relativePath":"preview_image.jpg","url":"https:\/\/s3.us-east-005.backblazeb2.com\/icosa-gallery\/icosa\/28534\/755031138472297450\/preview_image.jpg"},"triangleCount":0,"updateTime":"2026-09-16T11:21:48.917Z","url":"http:\/\/api.icosa.gallery\/v1\/assets\/mRU7wJh9BLQ","visibility":"PUBLIC"} \ No newline at end of file diff --git a/src/myverse/tronverse/tronverse-icosagallery/_mRU7wJh9BLQ-tronverse_parcel1-tronverse-icosagallery/tronverse_parcel1.glb b/src/myverse/tronverse/tronverse-icosagallery/_mRU7wJh9BLQ-tronverse_parcel1-tronverse-icosagallery/tronverse_parcel1.glb new file mode 100644 index 0000000..2a9b91b Binary files /dev/null and b/src/myverse/tronverse/tronverse-icosagallery/_mRU7wJh9BLQ-tronverse_parcel1-tronverse-icosagallery/tronverse_parcel1.glb differ diff --git a/src/myverse/tronverse/tronverse-icosagallery/_oiIu1aNn6Ek-tronverse_parcel2-overlay-tronverse-icosagallery.jpg b/src/myverse/tronverse/tronverse-icosagallery/_oiIu1aNn6Ek-tronverse_parcel2-overlay-tronverse-icosagallery.jpg new file mode 100644 index 0000000..9e37069 Binary files /dev/null and b/src/myverse/tronverse/tronverse-icosagallery/_oiIu1aNn6Ek-tronverse_parcel2-overlay-tronverse-icosagallery.jpg differ diff --git a/src/myverse/tronverse/tronverse-icosagallery/_oiIu1aNn6Ek-tronverse_parcel2-overlay-tronverse-icosagallery/asset.json b/src/myverse/tronverse/tronverse-icosagallery/_oiIu1aNn6Ek-tronverse_parcel2-overlay-tronverse-icosagallery/asset.json new file mode 100644 index 0000000..af66c17 --- /dev/null +++ b/src/myverse/tronverse/tronverse-icosagallery/_oiIu1aNn6Ek-tronverse_parcel2-overlay-tronverse-icosagallery/asset.json @@ -0,0 +1 @@ +{"assetId":"oiIu1aNn6Ek","authorId":"9Vkr0htmSzc","authorName":"coderofsalvation","createTime":"2026-09-16T10:06:44.019Z","description":"","displayName":"tronverse_parcel2 #overlay #tronverse-icosagallery","formats":[{"formatComplexity":{},"formatType":"GLTF2","isCorsAllowed":true,"isPreferredForDownload":true,"isPreferredForGalleryViewer":true,"resources":[],"role":"USER_SUPPLIED_GLTF","root":{"contentType":"model\/gltf-binary","relativePath":"tronverse_parcel2.glb","url":"https:\/\/s3.us-east-005.backblazeb2.com\/icosa-gallery\/icosa\/28534\/755369001416131548\/GLTF2\/tronverse_parcel2.glb"}}],"isCurated":false,"isIcosaGalleryCompatible":true,"license":"CREATIVE_COMMONS_BY","licenseVersion":"4.0","name":"assets\/oiIu1aNn6Ek","thumbnail":{"relativePath":"preview_image.jpg","url":"https:\/\/s3.us-east-005.backblazeb2.com\/icosa-gallery\/icosa\/28534\/755369001416131548\/preview_image.jpg"},"triangleCount":0,"updateTime":"2026-09-16T11:20:54.904Z","url":"http:\/\/api.icosa.gallery\/v1\/assets\/oiIu1aNn6Ek","visibility":"PUBLIC"} \ No newline at end of file diff --git a/src/myverse/tronverse/tronverse-icosagallery/_oiIu1aNn6Ek-tronverse_parcel2-overlay-tronverse-icosagallery/tronverse_parcel2.glb b/src/myverse/tronverse/tronverse-icosagallery/_oiIu1aNn6Ek-tronverse_parcel2-overlay-tronverse-icosagallery/tronverse_parcel2.glb new file mode 100644 index 0000000..8721763 Binary files /dev/null and b/src/myverse/tronverse/tronverse-icosagallery/_oiIu1aNn6Ek-tronverse_parcel2-overlay-tronverse-icosagallery/tronverse_parcel2.glb differ diff --git a/src/page/about.html b/src/page/about.html index 40cf089..3816bfb 100644 --- a/src/page/about.html +++ b/src/page/about.html @@ -62,7 +62,7 @@ div#xrecosystem{

Turn files into AR/VR 🥽 experiences

A static website generator for interconnected XR experiences.
- Optionally runs as server/client too. + Generate and manage open virtual worlds, powered by JanusXR & XR Fragments.

@@ -225,7 +225,8 @@ div#xrecosystem{

Auto-compose virtual worlds

Instead of manually composing virtual worlds from multiple assets, XRForge's philosophy is auto-layout and interoperability.
- This means that assets produced in OpenBlocks or OpenBrush can (in)directly get imported (via online 3D stores like icosa.gallery- and manyfold.app).
+ This means that existing RSS/Atom-feeds (from blogs) and partial content from websites can be projected into virtual worlds, via URLs.
+ But also assets produced elsewhere, in OpenBlocks or OpenBrush are synchronized (via online 3D stores like icosa.gallery- and manyfold.app).
This allows for infinitely scalable virtual worlds, yet completely downloadable and portable.
XRForge features layout-engines which allows crowdsourcing virtual worlds via assets using various apps/platforms:

diff --git a/src/page/index.html b/src/page/index.html index 84cf338..05248d7 100644 --- a/src/page/index.html +++ b/src/page/index.html @@ -7,6 +7,8 @@ ${header} {if defined(item) and item.parent and item.parent.info then description = item.parent.info +elseif defined(itemdir) and itemdir.info then + description = itemdir.info else description = opts.plugin_global_popup_instructions end} diff --git a/src/page/janusxr.html b/src/page/janusxr.html index d5f34e8..1113cf0 100644 --- a/src/page/janusxr.html +++ b/src/page/janusxr.html @@ -65,7 +65,7 @@ end} print(' ') end end} - + {if not defined(item) and defined(items) and #items > 0 then local layout = itemdir.layout or '' diff --git a/src/plugin/diskscan.lua b/src/plugin/diskscan.lua index 6e68dba..43585e3 100644 --- a/src/plugin/diskscan.lua +++ b/src/plugin/diskscan.lua @@ -79,7 +79,16 @@ return { v.file.state = nil end end) + + -- sort & apply dirs to plugin options table.sort( app.cache.dirs) + foreach( app.plugin, function(k,plugin) + foreach( plugin.opts, function(k,opt) + if opt.type == 'dir' then + opt.values = app.cache.dirs + end + end) + end) end, scanDir = function(scandir,parent,seen) diff --git a/src/plugin/global.lua b/src/plugin/global.lua index 4415588..e60b3ef 100644 --- a/src/plugin/global.lua +++ b/src/plugin/global.lua @@ -108,46 +108,46 @@ Welcome to this XR experience.