update documentation

This commit is contained in:
Leon van Kammen 2024-02-05 11:17:16 +01:00
parent 01a4814149
commit 1c7c6cc93c
6 changed files with 425 additions and 512 deletions

View File

@ -485,49 +485,14 @@ That way, if the link gets shared, the XR Fragments implementation at <code>http
<td>temporal W3C media fragment</td> <td>temporal W3C media fragment</td>
<td>t=x</td> <td>t=x</td>
<td>0</td> <td>0</td>
<td>1D parameters: play from 0 seconds to end (and stop)</td> <td>play from 0 seconds to end (and stop)</td>
</tr> </tr>
<tr> <tr>
<td>temporal W3C media fragment</td> <td>temporal W3C media fragment</td>
<td>t=x,y</td> <td>t=x,y</td>
<td>0,2</td> <td>0,2</td>
<td>1D parameters: play from 0 seconds till 2 seconds (and stop)</td> <td>play from 0 seconds till 2 seconds (and stop)</td>
</tr>
<tr>
<td>temporal W3C media fragment *</td>
<td>t=[uv:][l:][pl:]x,y,&hellip;</td>
<td><sub>0,1,4,5</sub></td>
<td>XD parameters: play [or scroll uvcoordinates] [as loop] or [as pingpongloop] between <code>x</code> and <code>y</code></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td>more args (<code>...</code>) means passing all values as positional uniform values to shader in case its loaded with <code>src</code>)</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td>uv-coordinate playback equals <code>U = xywh.x + (t.x*(s.x/fps))</code> and <code>V = t.y*(s.y/fps)</code></td>
</tr>
<tr>
<td>temporal W3C media fragment *</td>
<td>s=[uv:]x, &hellip;</td>
<td><sub>1,1,1,1</sub></td>
<td>XD speed: set playback speed of audio/video [or uv-coordinates]</td>
</tr>
<tr>
<td></td>
<td></td>
<td>uv:1,1</td>
<td>(texture)scroll uv-coordinates with <code>0.1</code> units/per second</td>
</tr> </tr>
<tr> <tr>
@ -536,11 +501,39 @@ That way, if the link gets shared, the XR Fragments implementation at <code>http
<td>0,0,1,1</td> <td>0,0,1,1</td>
<td>crop (uv) coordinates (default for uv-coordinates is <code>0,0,1,1</code>)</td> <td>crop (uv) coordinates (default for uv-coordinates is <code>0,0,1,1</code>)</td>
</tr> </tr>
<tr>
<td>temporal W3C media fragment *</td>
<td>t=[l:]x,y</td>
<td>l:0,1</td>
<td>play [as loop] between <code>x</code> and <code>y</code></td>
</tr>
<tr>
<td>temporal W3C media fragment *</td>
<td>s=x[,y]</td>
<td>1</td>
<td>set playback speed of audio/video/3D anim</td>
</tr>
<tr>
<td>temporal W3C media fragment *</td>
<td>sxy=[l:]x,y</td>
<td>0.1,0.2</td>
<td>xy scrollspeed of new xywh viewport/uvcoordinates (default <code>1,1</code> is instant): allows lerping to new <code>xywh</code> values [or infinite texturescrolling]</td>
</tr>
<tr>
<td>temporal W3C media fragment *</td>
<td>u:<uniform>=<string</td>
<td>float</td>
<td>vec2</td>
</tr>
</tbody> </tbody>
</table> </table>
<blockquote> <blockquote>
<p>* = this is extending the <a href="https://www.w3.org/TR/media-frags/#mf-advanced">W3C media fragments</a> with:</p> <p>* = this is extending the <a href="https://www.w3.org/TR/media-frags/#mf-advanced">W3C media fragments</a> with finer playback/viewport-control:</p>
</blockquote> </blockquote>
<table> <table>
@ -558,62 +551,60 @@ That way, if the link gets shared, the XR Fragments implementation at <code>http
</tr> </tr>
<tr> <tr>
<td><code>pl:</code> specifices pingpongloop</td> <td><code>s:</code> specifies playback speed</td>
<td><code>t=0,2</code> specifies oneshot-play (default) whereas <code>t=pl:0,2</code> indicates looped-play</td> <td>being able to specify loop(speed) of audio/video/uv timeline-coordinates (default: <code>1[,1]</code> which translates to uv-coordinate <code>0.1,0.1</code> units p/second)</td>
</tr> </tr>
<tr> <tr>
<td><code>uv:</code> specifies uv-coordinates</td> <td><code>sxy=</code> specifies lerping of xy(wh) values</td>
<td><code>t=0,2</code> specifies <code>src</code> loaded media (or 3D animations in 3D models) whereas <code>t=uv:0,1</code> plays uv-coordinate texturescroller</td> <td>allows animated cropping and infinite texturescroll with configurable speed for u/v coordinates</td>
</tr> </tr>
<tr> <tr>
<td><code>s</code> specifies speed</td> <td><code>u:&lt;uniform&gt;=</code></td>
<td>being able to specify loop(speed) of audio/video/uv timeline-coordinates which is <code>1,[[1],[1]]</code> by default (translates to uv-coordinate <code>0.1</code> units p/second)</td> <td>specifies updating a uniform value</td>
</tr>
<tr>
<td><code>t=x,y,...</code> forwarded as shadervalues</td>
<td><code>t=x,y,...</code> values are forwarded as positional shader-uniform values (like <a href="https://isf.video/">IFS parameters</a>).</td>
</tr>
<tr>
<td></td>
<td>The rationale that shaders are temporal &lsquo;players&rsquo; too, but which require loose-coupled positional values (parameters) for temporal control (like <a href="https://isf.video/">IFS parameters</a>)</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p>Example URI&rsquo;s:</p>
<ul>
<li><code>https://shaders.org/plasma.glsl#t=0&amp;u.col1=1,0,0&amp;u.col2=0,1,0</code> (red-green shader plasma starts playing from time-offset 0)</li>
<li><code>https://images.org/credits.jpg#t=0&amp;sxy=l:0,0.1</code> (infinite vertical texturescrolling)</li>
<li><code>https://video.org/organogram.mp4#t=0&amp;sxy:0.1,0.1&amp;xywh=500,500,480,640</code> (animated zoom towards region in video)</li>
</ul>
<pre><code> +──────────────────────────────────────────────────────────+ <pre><code> +──────────────────────────────────────────────────────────+
│ │ │ │
│ index.gltf#playall │ │ index.gltf#playall │
│ │ │ │ │ │
│ ├ # : #playall │ apply default XR Fragment on load │ ├ # : #playall │ apply default XR Fragment on load
│ ├ #playall: #media.play&amp;wall.calm&amp;t=1 │ here `t` plays the 3D animations inside index.gltf from 1 seconds │ ├ #playall: #media=play&amp;wall=calm&amp;t=1 │ here `t` plays the 3D animations inside index.gltf from 1 seconds
│ │ │ │ │ │
│ ├── ◻ playbutton │ │ ├── ◻ playbutton │
│ │ └ href: #media.play&amp;wall.calm │ trigger #play on object 'media' and #calm on 'wall' │ │ └ href: #media=play&amp;wall=calm ······· │ (re)trigger `play` on object 'media' and `calm` on 'wall'
│ │ │ │ │ · │
│ ├── ◻ plane │ │ ├── ◻ plane · │
│ │ └ src: foo.jpg#t=uv:l:0,0.2&amp;s=1 │ infinite texturescroll `v` of uv-coordinates with 0.2/fps │ │ └ src: foo.jpg#sxy=l:0,0.1 · │ infinite texturescroll `v` of uv·coordinates with 0.1/fps
│ │ │ with u-speed `0.1` and v-speed `0.1` (`#s` defaults) units p/second │ │ · │ with u·speed `0.1` and v·speed `0.1` (`#s` defaults) units p/second
│ ├── ◻ media │ │ ├── ◻ media · │
│ │ ├ play: #t=0 │ play cat.mp4 from 0 sec │ │ ├ play: #t=0 ················ · │ play cat.mp4 from 0 sec
│ │ ├ stop: #t=0,0 │ stop │ │ ├ #: #play ···^ · · │ apply default XR fragment (on load)
│ │ ├ loop: #t=l:1,2&amp;s=2 │ loop cat.mp4 between 1 and 2 sec with double speed │ │ ├ stop: #t=0,0 ··········· · │ stop
│ │ ├ crop: #xywh=0,0,0.5,0.5 │ crop uv-coordinates │ │ ├ loop: #t=l:1,2&amp;s=2 ············ │ loop cat.mp4 between 1 and 2 sec with double speed
│ │ ├ #: #play │ apply default XR fragment (on load) │ │ ├ crop: #xywh=0,0,0.5,0.5 ····· · │ crop viewport/uv·coordinates
│ │ │ │ │ │ └ src: cat.mp4#t=l:2,10 &lt;&lt;······· · │ loop cat.mp4 (or mp3/wav/jpg) between 2 and 10 seconds
│ │ └ src: cat.mp4#t=l:2,10 │ loop cat.mp4 (or mp3/wav/jpg) between 2 and 10 seconds │ │ · │
│ │ │ │ └── ◻ wall · │
│ └── ◻ wall │ │ ├ calm: #u:color=1,0,0 ················ │ updates uniform values (IFS shader e.g.)
│ ├ href: #calm │ │ ├ #: #wall=calm ···^ · │ apply default XR Fragment (on load)
│ ├ calm: #t=1,2,3,4 &gt;--+--+--&gt; updates uniform values (IFS shader e.g.) │ └ src: ://a.com/art.fs#sxy:l:0,0.1 &lt;&lt;··· │ .fs/.vs/.glsl/.wgsl etc
│ ├ #: #calm | │ apply default XR Fragment (on load)
│ └ src: ://a.com/art.fs#t=0,0,0,0 &gt;--- │ .fs/.vs/.glsl/.wgsl etc
│ │ │ │
│ │ │ │
+──────────────────────────────────────────────────────────+ +──────────────────────────────────────────────────────────+
&gt; NOTE: node-metadata (without #-prefix) applies XR Fragments to its `src` URL, otherwise it applies it to the browser URL. Full addressibility can be maintained, since top-level `href` values can trigger node-specific aliases (`media=play` e.g.).
</code></pre> </code></pre>
<h1 id="spatial-referencing-3d">Spatial Referencing 3D</h1> <h1 id="spatial-referencing-3d">Spatial Referencing 3D</h1>

View File

@ -269,26 +269,29 @@ These are automatic fragment-to-metadata mappings, which only trigger if the 3D
|-------------------------------|------------------------|-----------------|----------------------| |-------------------------------|------------------------|-----------------|----------------------|
| vector2 | x,y | 2,3.0 | 2-dimensional vector | | vector2 | x,y | 2,3.0 | 2-dimensional vector |
| vector3 | x,y,z | 2,3.0,4 | 3-dimensional vector | | vector3 | x,y,z | 2,3.0,4 | 3-dimensional vector |
| temporal W3C media fragment | t=x | 0 | 1D parameters: play from 0 seconds to end (and stop) | | temporal W3C media fragment | t=x | 0 | play from 0 seconds to end (and stop) |
| temporal W3C media fragment | t=x,y | 0,2 | 1D parameters: play from 0 seconds till 2 seconds (and stop) | | temporal W3C media fragment | t=x,y | 0,2 | play from 0 seconds till 2 seconds (and stop) |
| temporal W3C media fragment * | t=[uv:][l:]x,y,... | l:0,1,4,5 | XD parameters: play [or scroll uvcoordinates] [as loop] between `x` and `y` |
| | | | more args (`...`) means passing all values as positional uniform values to shader in case its loaded with `src`) |
| | | | uv-coordinate playback equals `U = xywh.x + (t.x*(s.x/fps))` and `V = t.y*(s.y/fps)` |
| temporal W3C media fragment * | s=[uv:]x, ... | 1,1,1,1 | XD speed: set playback speed of audio/video [or uv-coordinates] |
| | | uv:1,1 | (texture)scroll uv-coordinates with `0.1` units/per second |
| temporal W3C media fragment | xywh=x,y,w,h | 0,0,1,1 | crop (uv) coordinates (default for uv-coordinates is `0,0,1,1`) | | temporal W3C media fragment | xywh=x,y,w,h | 0,0,1,1 | crop (uv) coordinates (default for uv-coordinates is `0,0,1,1`) |
| temporal W3C media fragment * | t=[l:]x,y | l:0,1 | play [as loop] between `x` and `y` |
| temporal W3C media fragment * | s=x[,y] | 1 | set playback speed of audio/video/3D anim |
| temporal W3C media fragment * | sxy=[l:]x,y | 0.1,0.2 | xy scrollspeed of new xywh viewport/uvcoordinates (default `1,1` is instant): allows lerping to new `xywh` values [or infinite texturescrolling] |
| temporal W3C media fragment * | u:<uniform>=<string|float|vec2|vec3|vec4> | u.color=1,0,0 | set shader uniform value |
> \* = this is extending the [W3C media fragments](https://www.w3.org/TR/media-frags/#mf-advanced) with finer playback/viewport-control:
> \* = this is extending the [W3C media fragments](https://www.w3.org/TR/media-frags/#mf-advanced) with:
| extension | info | | extension | info |
|------------------|---------| |------------------|---------|
| `l:` specifices loop | `t=0,2` specifies oneshot-play (default) whereas `t=l:0,2` indicates looped-play | | `l:` specifices loop | `t=0,2` specifies oneshot-play (default) whereas `t=l:0,2` indicates looped-play |
| `uv:` specifies uv-coordinates | `t=0,2` specifies `src` loaded media (or 3D animations in 3D models) whereas `t=uv:0,1` plays uv-coordinate texturescroller | | `s:` specifies playback speed | being able to specify loop(speed) of audio/video/uv timeline-coordinates (default: `1[,1]` which translates to uv-coordinate `0.1,0.1` units p/second) |
| `s` specifies speed | being able to specify loop(speed) of audio/video/uv timeline-coordinates which is `1,[[1],[1]]` by default (translates to uv-coordinate `0.1` units p/second) | | `sxy=` specifies lerping of xy(wh) values | allows animated cropping and infinite texturescroll with configurable speed for u/v coordinates |
| `t=x,y,...` forwarded as shadervalues | `t=x,y,...` values are forwarded as positional shader-uniform values (like [IFS parameters](https://isf.video/)). | | `u:<uniform>=` | specifies updating a uniform value |
| | The rationale that shaders are temporal 'players' too, but which require loose-coupled positional values (parameters) for temporal control (like [IFS parameters](https://isf.video/)) |
Example URI's:
* `https://shaders.org/plasma.glsl#t=0&u.col1=1,0,0&u.col2=0,1,0` (red-green shader plasma starts playing from time-offset 0)
* `https://images.org/credits.jpg#t=0&sxy=l:0,0.1` (infinite vertical texturescrolling)
* `https://video.org/organogram.mp4#t=0&sxy:0.1,0.1&xywh=500,500,480,640` (animated zoom towards region in video)
``` ```
@ -297,31 +300,32 @@ These are automatic fragment-to-metadata mappings, which only trigger if the 3D
│ index.gltf#playall │ │ index.gltf#playall │
│ │ │ │ │ │
│ ├ # : #playall │ apply default XR Fragment on load │ ├ # : #playall │ apply default XR Fragment on load
│ ├ #playall: #media.play&wall.calm&t=1 │ here `t` plays the 3D animations inside index.gltf from 1 seconds │ ├ #playall: #media=play&wall=calm&t=1 │ here `t` plays the 3D animations inside index.gltf from 1 seconds
│ │ │ │ │ │
│ ├── ◻ playbutton │ │ ├── ◻ playbutton │
│ │ └ href: #media.play&wall.calm │ trigger #play on object 'media' and #calm on 'wall' │ │ └ href: #media=play&wall=calm ······· │ (re)trigger `play` on object 'media' and `calm` on 'wall'
│ │ │ │ │ · │
│ ├── ◻ plane │ │ ├── ◻ plane · │
│ │ └ src: foo.jpg#t=uv:l:0,0.2&s=1 │ infinite texturescroll `v` of uv-coordinates with 0.2/fps │ │ └ src: foo.jpg#sxy=l:0,0.1 · │ infinite texturescroll `v` of uv·coordinates with 0.1/fps
│ │ │ with u-speed `0.1` and v-speed `0.1` (`#s` defaults) units p/second │ │ · │ with u·speed `0.1` and v·speed `0.1` (`#s` defaults) units p/second
│ ├── ◻ media │ │ ├── ◻ media · │
│ │ ├ play: #t=0 │ play cat.mp4 from 0 sec │ │ ├ play: #t=0 ················ · │ play cat.mp4 from 0 sec
│ │ ├ stop: #t=0,0 │ stop │ │ ├ #: #play ···^ · · │ apply default XR fragment (on load)
│ │ ├ loop: #t=l:1,2&s=2 │ loop cat.mp4 between 1 and 2 sec with double speed │ │ ├ stop: #t=0,0 ··········· · │ stop
│ │ ├ crop: #xywh=0,0,0.5,0.5 │ crop uv-coordinates │ │ ├ loop: #t=l:1,2&s=2 ············ │ loop cat.mp4 between 1 and 2 sec with double speed
│ │ ├ #: #play │ apply default XR fragment (on load) │ │ ├ crop: #xywh=0,0,0.5,0.5 ····· · │ crop viewport/uv·coordinates
│ │ │ │ │ │ └ src: cat.mp4#t=l:2,10 <<······· · │ loop cat.mp4 (or mp3/wav/jpg) between 2 and 10 seconds
│ │ └ src: cat.mp4#t=l:2,10 │ loop cat.mp4 (or mp3/wav/jpg) between 2 and 10 seconds │ │ · │
│ │ │ │ └── ◻ wall · │
│ └── ◻ wall │ │ ├ calm: #u:color=1,0,0 ················ │ updates uniform values (IFS shader e.g.)
│ ├ href: #calm │ ├ #: #wall=calm ···^ · │ apply default XR Fragment (on load)
│ ├ calm: #t=1,2,3,4 >--+--+--> updates uniform values (IFS shader e.g.) │ └ src: ://a.com/art.fs#sxy:l:0,0.1 <<··· │ .fs/.vs/.glsl/.wgsl etc
│ ├ #: #calm | │ apply default XR Fragment (on load)
│ └ src: ://a.com/art.fs#t=0,0,0,0 >--- │ .fs/.vs/.glsl/.wgsl etc
│ │ │ │
│ │ │ │
+──────────────────────────────────────────────────────────+ +──────────────────────────────────────────────────────────+
> NOTE: node-metadata (without #-prefix) applies XR Fragments to its `src` URL, otherwise it applies it to the browser URL. Full addressibility can be maintained, since top-level `href` values can trigger node-specific aliases (`media=play` e.g.).
``` ```
# Spatial Referencing 3D # Spatial Referencing 3D

View File

@ -3,7 +3,7 @@
Internet Engineering Task Force L.R. van Kammen Internet Engineering Task Force L.R. van Kammen
Internet-Draft 2 February 2024 Internet-Draft 5 February 2024
Intended status: Informational Intended status: Informational
@ -41,7 +41,7 @@ Status of This Memo
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on 5 August 2024. This Internet-Draft will expire on 8 August 2024.
Copyright Notice Copyright Notice
@ -53,7 +53,7 @@ Copyright Notice
van Kammen Expires 5 August 2024 [Page 1] van Kammen Expires 8 August 2024 [Page 1]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -77,39 +77,39 @@ Table of Contents
4.1. List of metadata for 3D nodes . . . . . . . . . . . . . . 8 4.1. List of metadata for 3D nodes . . . . . . . . . . . . . . 8
4.2. Dynamic XR Fragments (+databindings) . . . . . . . . . . 8 4.2. Dynamic XR Fragments (+databindings) . . . . . . . . . . 8
4.3. media fragments and datatypes . . . . . . . . . . . . . . 9 4.3. media fragments and datatypes . . . . . . . . . . . . . . 9
5. Spatial Referencing 3D . . . . . . . . . . . . . . . . . . . 13 5. Spatial Referencing 3D . . . . . . . . . . . . . . . . . . . 12
6. Navigating 3D . . . . . . . . . . . . . . . . . . . . . . . . 14 6. Navigating 3D . . . . . . . . . . . . . . . . . . . . . . . . 13
7. Top-level URL processing . . . . . . . . . . . . . . . . . . 15 7. Top-level URL processing . . . . . . . . . . . . . . . . . . 14
8. Embedding XR content using src . . . . . . . . . . . . . . . 16 8. Embedding XR content using src . . . . . . . . . . . . . . . 15
9. Navigating content href portals . . . . . . . . . . . . . . . 18 9. Navigating content href portals . . . . . . . . . . . . . . . 17
9.1. Walking surfaces . . . . . . . . . . . . . . . . . . . . 20 9.1. Walking surfaces . . . . . . . . . . . . . . . . . . . . 19
9.2. UX spec . . . . . . . . . . . . . . . . . . . . . . . . . 20 9.2. UX spec . . . . . . . . . . . . . . . . . . . . . . . . . 19
9.3. Scaling instanced content . . . . . . . . . . . . . . . . 20 9.3. Scaling instanced content . . . . . . . . . . . . . . . . 19
10. XR Fragment: pos . . . . . . . . . . . . . . . . . . . . . . 21 10. XR Fragment: pos . . . . . . . . . . . . . . . . . . . . . . 20
11. XR Fragment: rot . . . . . . . . . . . . . . . . . . . . . . 21 11. XR Fragment: rot . . . . . . . . . . . . . . . . . . . . . . 20
12. XR Fragment: t . . . . . . . . . . . . . . . . . . . . . . . 21 12. XR Fragment: t . . . . . . . . . . . . . . . . . . . . . . . 20
13. XR audio/video integration . . . . . . . . . . . . . . . . . 22 13. XR audio/video integration . . . . . . . . . . . . . . . . . 21
14. XR Fragment filters . . . . . . . . . . . . . . . . . . . . . 22 14. XR Fragment filters . . . . . . . . . . . . . . . . . . . . . 21
14.1. including/excluding . . . . . . . . . . . . . . . . . . 23 14.1. including/excluding . . . . . . . . . . . . . . . . . . 22
14.2. Filter Parser . . . . . . . . . . . . . . . . . . . . . 23 14.2. Filter Parser . . . . . . . . . . . . . . . . . . . . . 22
15. Visible links . . . . . . . . . . . . . . . . . . . . . . . . 24 15. Visible links . . . . . . . . . . . . . . . . . . . . . . . . 23
16. Text in XR (tagging,linking to spatial objects) . . . . . . . 24 16. Text in XR (tagging,linking to spatial objects) . . . . . . . 23
16.1. Default Data URI mimetype . . . . . . . . . . . . . . . 28 16.1. Default Data URI mimetype . . . . . . . . . . . . . . . 27
16.2. URL and Data URI . . . . . . . . . . . . . . . . . . . . 29 16.2. URL and Data URI . . . . . . . . . . . . . . . . . . . . 28
16.3. XR Text example parser . . . . . . . . . . . . . . . . . 30 16.3. XR Text example parser . . . . . . . . . . . . . . . . . 29
17. Transclusion (broken link) resolution . . . . . . . . . . . . 32 17. Transclusion (broken link) resolution . . . . . . . . . . . . 31
18. Topic-based index-less Webrings . . . . . . . . . . . . . . . 33 18. Topic-based index-less Webrings . . . . . . . . . . . . . . . 32
19. Security Considerations . . . . . . . . . . . . . . . . . . . 34 19. Security Considerations . . . . . . . . . . . . . . . . . . . 33
20. FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 20. FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
21. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 35 21. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 34
22. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 35 22. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 34
23. Appendix: Definitions . . . . . . . . . . . . . . . . . . . . 35 23. Appendix: Definitions . . . . . . . . . . . . . . . . . . . . 34
van Kammen Expires 5 August 2024 [Page 2] van Kammen Expires 8 August 2024 [Page 2]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -165,7 +165,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 3] van Kammen Expires 8 August 2024 [Page 3]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -221,7 +221,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 4] van Kammen Expires 8 August 2024 [Page 4]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -277,7 +277,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 5] van Kammen Expires 8 August 2024 [Page 5]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -333,7 +333,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 6] van Kammen Expires 8 August 2024 [Page 6]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -389,7 +389,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 7] van Kammen Expires 8 August 2024 [Page 7]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -445,7 +445,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 8] van Kammen Expires 8 August 2024 [Page 8]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -501,154 +501,109 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 9] van Kammen Expires 8 August 2024 [Page 9]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
+========+=========================+============+=================+ +==========+=====================+=========+=====================+
|type | syntax | example | info | | type | syntax | example | info |
+========+=========================+============+=================+ +==========+=====================+=========+=====================+
|vector2 | x,y | 2,3.0 | 2-dimensional | | vector2 | x,y | 2,3.0 | 2-dimensional |
| | | | vector | | | | | vector |
+--------+-------------------------+------------+-----------------+ +----------+---------------------+---------+---------------------+
|vector3 | x,y,z | 2,3.0,4 | 3-dimensional | | vector3 | x,y,z | 2,3.0,4 | 3-dimensional |
| | | | vector | | | | | vector |
+--------+-------------------------+------------+-----------------+ +----------+---------------------+---------+---------------------+
|temporal| t=x | 0 | 1D parameters: | | temporal | t=x | 0 | play from 0 seconds |
|W3C | | | play from 0 | | W3C | | | to end (and stop) |
|media | | | seconds to end | | media | | | |
|fragment| | | (and stop) | | fragment | | | |
+--------+-------------------------+------------+-----------------+ +----------+---------------------+---------+---------------------+
|temporal| t=x,y | 0,2 | 1D parameters: | | temporal | t=x,y | 0,2 | play from 0 seconds |
|W3C | | | play from 0 | | W3C | | | till 2 seconds (and |
|media | | | seconds till 2 | | media | | | stop) |
|fragment| | | seconds (and | | fragment | | | |
| | | | stop) | +----------+---------------------+---------+---------------------+
+--------+-------------------------+------------+-----------------+ | temporal | xywh=x,y,w,h | 0,0,1,1 | crop (uv) |
|temporal| t=[uv:][l:][pl:]x,y,... | _(0,1,4,5) | XD parameters: | | W3C | | | coordinates |
|W3C | | | play [or scroll | | media | | | (default for uv- |
|media | | | uvcoordinates] | | fragment | | | coordinates is |
|fragment| | | [as loop] or | | | | | 0,0,1,1) |
|* | | | [as | +----------+---------------------+---------+---------------------+
| | | | pingpongloop] | | temporal | t=[l:]x,y | l:0,1 | play [as loop] |
| | | | between x and y | | W3C | | | between x and y |
+--------+-------------------------+------------+-----------------+ | media | | | |
| | | | more args (...) | | fragment | | | |
| | | | means passing | | * | | | |
| | | | all values as | +----------+---------------------+---------+---------------------+
| | | | positional | | temporal | s=x[,y] | 1 | set playback speed |
| | | | uniform values | | W3C | | | of audio/video/3D |
| | | | to shader in | | media | | | anim |
| | | | case its loaded | | fragment | | | |
| | | | with src) | | * | | | |
+--------+-------------------------+------------+-----------------+ +----------+---------------------+---------+---------------------+
| | | | uv-coordinate | | temporal | sxy=[l:]x,y | 0.1,0.2 | xy scrollspeed of |
| | | | playback equals | | W3C | | | new xywh viewport/ |
| | | | U = xywh.x + | | media | | | uvcoordinates |
| | | | (t.x*(s.x/fps)) | | fragment | | | (default 1,1 is |
| | | | and V = | | * | | | instant): allows |
| | | | t.y*(s.y/fps) | | | | | lerping to new xywh |
+--------+-------------------------+------------+-----------------+ | | | | values [or infinite |
|temporal| s=[uv:]x, ... | _(1,1,1,1) | XD speed: set | | | | | texturescrolling] |
|W3C | | | playback speed | +----------+---------------------+---------+---------------------+
|media | | | of audio/video | | temporal | u:<uniform>=<string | float | vec2 |
|fragment| | | [or uv- | | W3C | | | |
van Kammen Expires 5 August 2024 [Page 10] van Kammen Expires 8 August 2024 [Page 10]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
|* | | | coordinates] | | media | | | |
+--------+-------------------------+------------+-----------------+ | fragment | | | |
| | | uv:1,1 | (texture)scroll | | * | | | |
| | | | uv-coordinates | +----------+---------------------+---------+---------------------+
| | | | with 0.1 units/ |
| | | | per second |
+--------+-------------------------+------------+-----------------+
|temporal| xywh=x,y,w,h | 0,0,1,1 | crop (uv) |
|W3C | | | coordinates |
|media | | | (default for |
|fragment| | | uv-coordinates |
| | | | is 0,0,1,1) |
+--------+-------------------------+------------+-----------------+
Table 6 Table 6
| * = this is extending the W3C media fragments | * = this is extending the W3C media fragments
| (https://www.w3.org/TR/media-frags/#mf-advanced) with: | (https://www.w3.org/TR/media-frags/#mf-advanced) with finer
| playback/viewport-control:
+===============+=======================================+
van Kammen Expires 5 August 2024 [Page 11]
Internet-Draft XR Fragments February 2024
+================+===========================================+
| extension | info | | extension | info |
+================+===========================================+ +===============+=======================================+
| l: specifices | t=0,2 specifies oneshot-play (default) | | l: specifices | t=0,2 specifies oneshot-play |
| loop | whereas t=l:0,2 indicates looped-play | | loop | (default) whereas t=l:0,2 indicates |
+----------------+-------------------------------------------+ | | looped-play |
| pl: specifices | t=0,2 specifies oneshot-play (default) | +---------------+---------------------------------------+
| pingpongloop | whereas t=pl:0,2 indicates looped-play | | s: specifies | being able to specify loop(speed) of |
+----------------+-------------------------------------------+ | playback | audio/video/uv timeline-coordinates |
| uv: specifies | t=0,2 specifies src loaded media (or 3D | | speed | (default: 1[,1] which translates to |
| uv-coordinates | animations in 3D models) whereas t=uv:0,1 | | | uv-coordinate 0.1,0.1 units p/second) |
| | plays uv-coordinate texturescroller | +---------------+---------------------------------------+
+----------------+-------------------------------------------+ | sxy= | allows animated cropping and infinite |
| s specifies | being able to specify loop(speed) of | | specifies | texturescroll with configurable speed |
| speed | audio/video/uv timeline-coordinates which | | lerping of | for u/v coordinates |
| | is 1,[[1],[1]] by default (translates to | | xy(wh) values | |
| | uv-coordinate 0.1 units p/second) | +---------------+---------------------------------------+
+----------------+-------------------------------------------+ | u:<uniform>= | specifies updating a uniform value |
| t=x,y,... | t=x,y,... values are forwarded as | +---------------+---------------------------------------+
| forwarded as | positional shader-uniform values (like |
| shadervalues | IFS parameters (https://isf.video/)). |
+----------------+-------------------------------------------+
| | The rationale that shaders are temporal |
| | 'players' too, but which require loose- |
| | coupled positional values (parameters) |
| | for temporal control (like IFS parameters |
| | (https://isf.video/)) |
+----------------+-------------------------------------------+
Table 7 Table 7
Example URI's:
* https://shaders.org/plasma.glsl#t=0&u.col1=1,0,0&u.col2=0,1,0
(red-green shader plasma starts playing from time-offset 0)
* https://images.org/credits.jpg#t=0&sxy=l:0,0.1 (infinite vertical
texturescrolling)
* https://video.org/
organogram.mp4#t=0&sxy:0.1,0.1&xywh=500,500,480,640 (animated zoom
towards region in video)
@ -658,18 +613,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 8 August 2024 [Page 11]
van Kammen Expires 5 August 2024 [Page 12]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -679,32 +623,32 @@ Internet-Draft XR Fragments February 2024
│ index.gltf#playall │ │ index.gltf#playall │
│ │ │ │ │ │
│ ├ # : #playall │ apply default XR Fragment on load │ ├ # : #playall │ apply default XR Fragment on load
│ ├ #playall: #media.play&wall.calm&t=1 │ here `t` plays the 3D animations inside index.gltf from 1 seconds │ ├ #playall: #media=play&wall=calm&t=1 │ here `t` plays the 3D animations inside index.gltf from 1 seconds
│ │ │ │ │ │
│ ├── ◻ playbutton │ │ ├── ◻ playbutton │
│ │ └ href: #media.play&wall.calm │ trigger #play on object 'media' and #calm on 'wall' │ │ └ href: #media=play&wall=calm ······· │ (re)trigger `play` on object 'media' and `calm` on 'wall'
│ │ │ │ │ · │
│ ├── ◻ plane │ │ ├── ◻ plane · │
│ │ └ src: foo.jpg#t=uv:l:0,0.2&s=1 │ infinite texturescroll `v` of uv-coordinates with 0.2/fps │ │ └ src: foo.jpg#sxy=l:0,0.1 · │ infinite texturescroll `v` of uv·coordinates with 0.1/fps
│ │ │ with u-speed `0.1` and v-speed `0.1` (`#s` defaults) units p/second │ │ · │ with u·speed `0.1` and v·speed `0.1` (`#s` defaults) units p/second
│ ├── ◻ media │ │ ├── ◻ media · │
│ │ ├ play: #t=0 │ play cat.mp4 from 0 sec │ │ ├ play: #t=0 ················ · │ play cat.mp4 from 0 sec
│ │ ├ stop: #t=0,0 │ stop │ │ ├ #: #play ···^ · · │ apply default XR fragment (on load)
│ │ ├ loop: #t=l:1,2&s=2 │ loop cat.mp4 between 1 and 2 sec with double speed │ │ ├ stop: #t=0,0 ··········· · │ stop
│ │ ├ crop: #xywh=0,0,0.5,0.5 │ crop uv-coordinates │ │ ├ loop: #t=l:1,2&s=2 ············ │ loop cat.mp4 between 1 and 2 sec with double speed
│ │ ├ #: #play │ apply default XR fragment (on load) │ │ ├ crop: #xywh=0,0,0.5,0.5 ····· · │ crop viewport/uv·coordinates
│ │ │ │ │ │ └ src: cat.mp4#t=l:2,10 <<······· · │ loop cat.mp4 (or mp3/wav/jpg) between 2 and 10 seconds
│ │ └ src: cat.mp4#t=l:2,10 │ loop cat.mp4 (or mp3/wav/jpg) between 2 and 10 seconds │ │ · │
│ │ │ │ └── ◻ wall · │
│ └── ◻ wall │ │ ├ calm: #u:color=1,0,0 ················ │ updates uniform values (IFS shader e.g.)
│ ├ href: #calm │ │ ├ #: #wall=calm ···^ · │ apply default XR Fragment (on load)
│ ├ calm: #t=1,2,3,4 >--+--+--> updates uniform values (IFS shader e.g.) │ └ src: ://a.com/art.fs#sxy:l:0,0.1 <<··· │ .fs/.vs/.glsl/.wgsl etc
│ ├ #: #calm | │ apply default XR Fragment (on load)
│ └ src: ://a.com/art.fs#t=0,0,0,0 >--- │ .fs/.vs/.glsl/.wgsl etc
│ │ │ │
│ │ │ │
+──────────────────────────────────────────────────────────+ +──────────────────────────────────────────────────────────+
> NOTE: node-metadata (without #-prefix) applies XR Fragments to its `src` URL, otherwise it applies it to the browser URL. Full addressibility can be maintained, since top-level `href` values can trigger node-specific aliases (`media=play` e.g.).
5. Spatial Referencing 3D 5. Spatial Referencing 3D
XR Fragments assume the following objectname-to-URIFragment mapping: XR Fragments assume the following objectname-to-URIFragment mapping:
@ -725,7 +669,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 13] van Kammen Expires 8 August 2024 [Page 12]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -781,15 +725,15 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 14] van Kammen Expires 8 August 2024 [Page 13]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
» example implementation &#187; example implementation
(https://github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/ (https://github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/
three/xrf/pos.js) three/xrf/pos.js)
» discussion (https://github.com/coderofsalvation/xrfragment/ &#187; discussion (https://github.com/coderofsalvation/xrfragment/
issues/5) issues/5)
1. the Y-coordinate of pos identifies the floorposition. This means 1. the Y-coordinate of pos identifies the floorposition. This means
@ -805,7 +749,7 @@ Internet-Draft XR Fragments February 2024
coordinate, pos=0,0,0 will be assumed coordinate, pos=0,0,0 will be assumed
Here's an ascii representation of a 3D scene-graph which contains 3D Here's an ascii representation of a 3D scene-graph which contains 3D
objects and their metadata: objects &#9723; and their metadata:
+────────────────────────────────────────────────────────+ +────────────────────────────────────────────────────────+
│ │ │ │
@ -837,7 +781,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 15] van Kammen Expires 8 August 2024 [Page 14]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -881,8 +825,9 @@ Internet-Draft XR Fragments February 2024
Table 9 Table 9
Here's an ascii representation of a 3D scene-graph with 3D objects ◻ Here's an ascii representation of a 3D scene-graph with 3D objects
which embeds remote & local 3D objects ◻ with/out using filters: &#9723; which embeds remote & local 3D objects &#9723; with/out using
filters:
@ -892,8 +837,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 8 August 2024 [Page 15]
van Kammen Expires 5 August 2024 [Page 16]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -949,7 +893,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 17] van Kammen Expires 8 August 2024 [Page 16]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -985,13 +929,13 @@ Internet-Draft XR Fragments February 2024
* image/jpg * image/jpg
* text/plain;charset=utf-8 * text/plain;charset=utf-8
» example implementation &#187; example implementation
(https://github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/ (https://github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/
three/xrf/src.js) three/xrf/src.js)
» example 3D asset &#187; example 3D asset
(https://github.com/coderofsalvation/xrfragment/blob/main/example/ (https://github.com/coderofsalvation/xrfragment/blob/main/example/
assets/src.gltf#L192) assets/src.gltf#L192)
» discussion (https://github.com/coderofsalvation/xrfragment/ &#187; discussion (https://github.com/coderofsalvation/xrfragment/
issues/4) issues/4)
9. Navigating content href portals 9. Navigating content href portals
@ -1005,7 +949,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 18] van Kammen Expires 8 August 2024 [Page 17]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1061,18 +1005,18 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 19] van Kammen Expires 8 August 2024 [Page 18]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
» example implementation &#187; example implementation
(https://github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/ (https://github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/
three/xrf/href.js) three/xrf/href.js)
» example 3D asset &#187; example 3D asset
(https://github.com/coderofsalvation/xrfragment/blob/main/example/ (https://github.com/coderofsalvation/xrfragment/blob/main/example/
assets/href.gltf#L192) assets/href.gltf#L192)
» discussion (https://github.com/coderofsalvation/xrfragment/ &#187; discussion (https://github.com/coderofsalvation/xrfragment/
issues/1) issues/1)
9.1. Walking surfaces 9.1. Walking surfaces
@ -1117,7 +1061,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 20] van Kammen Expires 8 August 2024 [Page 19]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1173,7 +1117,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 21] van Kammen Expires 8 August 2024 [Page 20]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1229,7 +1173,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 22] van Kammen Expires 8 August 2024 [Page 21]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1268,11 +1212,11 @@ Internet-Draft XR Fragments February 2024
| colorbuffer (to allow children being still visible while their | colorbuffer (to allow children being still visible while their
| parents are invisible). | parents are invisible).
» example implementation &#187; example implementation
(https://github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/ (https://github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/
three/xrf/q.js) » example 3D asset three/xrf/q.js) &#187; example 3D asset
(https://github.com/coderofsalvation/xrfragment/blob/main/example/ (https://github.com/coderofsalvation/xrfragment/blob/main/example/
assets/filter.gltf#L192) » discussion assets/filter.gltf#L192) &#187; discussion
(https://github.com/coderofsalvation/xrfragment/issues/3) (https://github.com/coderofsalvation/xrfragment/issues/3)
14.2. Filter Parser 14.2. Filter Parser
@ -1285,7 +1229,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 23] van Kammen Expires 8 August 2024 [Page 22]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1341,7 +1285,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 24] van Kammen Expires 8 August 2024 [Page 23]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1397,7 +1341,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 25] van Kammen Expires 8 August 2024 [Page 24]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1453,7 +1397,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 26] van Kammen Expires 8 August 2024 [Page 25]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1509,7 +1453,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 27] van Kammen Expires 8 August 2024 [Page 26]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1565,7 +1509,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 28] van Kammen Expires 8 August 2024 [Page 27]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1621,7 +1565,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 29] van Kammen Expires 8 August 2024 [Page 28]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1677,7 +1621,7 @@ xrtext = {
van Kammen Expires 5 August 2024 [Page 30] van Kammen Expires 8 August 2024 [Page 29]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1733,7 +1677,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 31] van Kammen Expires 8 August 2024 [Page 30]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1789,7 +1733,7 @@ console.log( xrtext.encode(text,tags) ) // multiplex text & bibtex back to
van Kammen Expires 5 August 2024 [Page 32] van Kammen Expires 8 August 2024 [Page 31]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1845,7 +1789,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 33] van Kammen Expires 8 August 2024 [Page 32]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1901,7 +1845,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 34] van Kammen Expires 8 August 2024 [Page 33]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -1922,7 +1866,7 @@ Internet-Draft XR Fragments February 2024
* Michiel Leenaars * Michiel Leenaars
* Gerben van der Broeke * Gerben van der Broeke
* Mauve * Mauve
* Jens Finkhäuser * Jens Finkh&#228;user
* Marc Belmont * Marc Belmont
* Tim Gerritsen * Tim Gerritsen
* Frode Hegland * Frode Hegland
@ -1957,7 +1901,7 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 35] van Kammen Expires 8 August 2024 [Page 34]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
@ -2013,14 +1957,14 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 36] van Kammen Expires 8 August 2024 [Page 35]
Internet-Draft XR Fragments February 2024 Internet-Draft XR Fragments February 2024
| | is a person who lives in oklahoma") | | | is a person who lives in oklahoma") |
+-----------------+---------------------------------------------+ +-----------------+---------------------------------------------+
| | ascii representation of an 3D object/mesh | | &#9723; | ascii representation of an 3D object/mesh |
+-----------------+---------------------------------------------+ +-----------------+---------------------------------------------+
| (un)obtrusive | obtrusive: wrapping human text/thought in | | (un)obtrusive | obtrusive: wrapping human text/thought in |
| | XML/HTML/JSON obfuscates human text into a | | | XML/HTML/JSON obfuscates human text into a |
@ -2069,4 +2013,4 @@ Internet-Draft XR Fragments February 2024
van Kammen Expires 5 August 2024 [Page 37] van Kammen Expires 8 August 2024 [Page 36]

View File

@ -48,18 +48,18 @@ XR Fragments exploits the fact that all 3D models already contain such metadata:
Instead of forcing authors to combine 3D/2D objects programmatically (publishing thru a game-editor e.g.), XR Fragments <strong>integrates all</strong> which allows a universal viewing experience.<br /> Instead of forcing authors to combine 3D/2D objects programmatically (publishing thru a game-editor e.g.), XR Fragments <strong>integrates all</strong> which allows a universal viewing experience.<br />
</t> </t>
<artwork><![CDATA[ +───────────────────────────────────────────────────────────────────────────────────────────────+ <artwork> +───────────────────────────────────────────────────────────────────────────────────────────────+
│ │ │ │
│ U R N │ │ U R N │
│ U R L | │ │ U R L | │
│ | |-----------------+--------| │ │ | |-----------------+--------| │
│ +--------------------------------------------------| │ │ +--------------------------------------------------| │
│ | │ │ | │
│ + https://foo.com/some/foo/scene.glb#someview <-- http URI (=URL and has URN) │ + https://foo.com/some/foo/scene.glb#someview &lt;-- http URI (=URL and has URN) │
│ | │ │ | │
│ + ipfs://cfe0987ec9r9098ecr/cats.fbx#someview <-- an IPFS URI (=URL and has URN) │ + ipfs://cfe0987ec9r9098ecr/cats.fbx#someview &lt;-- an IPFS URI (=URL and has URN) │
│ │ │ │
│ ec09f7e9cf8e7f09c8e7f98e79c09ef89e000efece8f7ecfe9fe <-- an interpeer URI │ ec09f7e9cf8e7f09c8e7f98e79c09ef89e000efece8f7ecfe9fe &lt;-- an interpeer URI │
│ │ │ │
│ │ │ │
│ |------------------------+-------------------------| │ │ |------------------------+-------------------------| │
@ -68,20 +68,19 @@ Instead of forcing authors to combine 3D/2D objects programmatically (publishing
│ │ │ │
+───────────────────────────────────────────────────────────────────────────────────────────────+ +───────────────────────────────────────────────────────────────────────────────────────────────+
]]>
</artwork> </artwork>
<t>Fact: our typical browser URL's are just <strong>a possible implementation</strong> of URI's (for untapped humancentric potential of URI's <eref target="https://interpeer.io">see interpeer.io</eref>)</t> <t>Fact: our typical browser URL's are just <strong>a possible implementation</strong> of URI's (for untapped humancentric potential of URI's <eref target="https://interpeer.io">see interpeer.io</eref>)</t>
<blockquote><t>XR Fragments does not look at XR (or the web) thru the lens of HTML or URLs.<br /> <blockquote><t>XR Fragments does not look at XR (or the web) thru the lens of HTML or URLs.<br />
But approaches things from a higherlevel feedbackloop/hypermedia browser-perspective.</t> But approaches things from a higherlevel feedbackloop/hypermedia browser-perspective.</t>
</blockquote><t>Below you can see how this translates back into good-old URLs:</t> </blockquote><t>Below you can see how this translates back into good-old URLs:</t>
<artwork><![CDATA[ +───────────────────────────────────────────────────────────────────────────────────────────────+ <artwork> +───────────────────────────────────────────────────────────────────────────────────────────────+
│ │ │ │
│ the soul of any URL: ://macro /meso ?micro #nano │ │ the soul of any URL: ://macro /meso ?micro #nano │
│ │ │ │
│ 2D URL: ://library.com /document ?search #chapter │ │ 2D URL: ://library.com /document ?search #chapter │
│ │ │ │
│ 4D URL: ://park.com /4Dscene.fbx ─> ?other.glb ─> #view ───> hashbus │ │ 4D URL: ://park.com /4Dscene.fbx ─&gt; ?other.glb ─&gt; #view ───&gt; hashbus │
│ │ #filter │ │ │ │ #filter │ │
│ │ #tag │ │ │ │ #tag │ │
│ │ (hypermediatic) #material │ │ │ │ (hypermediatic) #material │ │
@ -89,14 +88,13 @@ But approaches things from a higherlevel feedbackloop/hypermedia browser-perspec
│ │ ( loop ) #texture │ │ │ │ ( loop ) #texture │ │
│ │ #variable │ │ │ │ #variable │ │
│ │ │ │ │ │ │ │
│ XRWG <─────────────────────<─────────────+ │ │ XRWG &lt;─────────────────────&lt;─────────────+ │
│ │ │ │ │ │ │ │
│ └─ objects ──────────────>─────────────+ │ │ └─ objects ──────────────&gt;─────────────+ │
│ │ │ │
│ │ │ │
+───────────────────────────────────────────────────────────────────────────────────────────────+ +───────────────────────────────────────────────────────────────────────────────────────────────+
]]>
</artwork> </artwork>
<blockquote><t>?-linked and #-linked navigation allows a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation.</t> <blockquote><t>?-linked and #-linked navigation allows a Hypermediatic FeedbackLoop (HFL) between external and internal 4D navigation.</t>
</blockquote><t>Traditional webbrowsers can become 4D document-ready by:</t> </blockquote><t>Traditional webbrowsers can become 4D document-ready by:</t>
@ -174,10 +172,9 @@ But approaches things from a higherlevel feedbackloop/hypermedia browser-perspec
<section anchor="xr-fragment-url-grammar"><name>XR Fragment URL Grammar</name> <section anchor="xr-fragment-url-grammar"><name>XR Fragment URL Grammar</name>
<t>For typical HTTP-like browsers/applications:</t> <t>For typical HTTP-like browsers/applications:</t>
<artwork><![CDATA[reserved = gen-delims / sub-delims <artwork>reserved = gen-delims / sub-delims
gen-delims = "#" / "&" gen-delims = &quot;#&quot; / &quot;&amp;&quot;
sub-delims = "," / "=" sub-delims = &quot;,&quot; / &quot;=&quot;
]]>
</artwork> </artwork>
<blockquote><t>Example: <tt>://foo.com/my3d.gltf#pos=1,0,0&amp;prio=-5&amp;t=0,100</tt></t> <blockquote><t>Example: <tt>://foo.com/my3d.gltf#pos=1,0,0&amp;prio=-5&amp;t=0,100</tt></t>
</blockquote><table> </blockquote><table>
@ -391,49 +388,14 @@ That way, if the link gets shared, the XR Fragments implementation at <tt>https:
<td>temporal W3C media fragment</td> <td>temporal W3C media fragment</td>
<td>t=x</td> <td>t=x</td>
<td>0</td> <td>0</td>
<td>1D parameters: play from 0 seconds to end (and stop)</td> <td>play from 0 seconds to end (and stop)</td>
</tr> </tr>
<tr> <tr>
<td>temporal W3C media fragment</td> <td>temporal W3C media fragment</td>
<td>t=x,y</td> <td>t=x,y</td>
<td>0,2</td> <td>0,2</td>
<td>1D parameters: play from 0 seconds till 2 seconds (and stop)</td> <td>play from 0 seconds till 2 seconds (and stop)</td>
</tr>
<tr>
<td>temporal W3C media fragment *</td>
<td>t=[uv:][l:][pl:]x,y,...</td>
<td><sub>0,1,4,5</sub></td>
<td>XD parameters: play [or scroll uvcoordinates] [as loop] or [as pingpongloop] between <tt>x</tt> and <tt>y</tt></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td>more args (<tt>...</tt>) means passing all values as positional uniform values to shader in case its loaded with <tt>src</tt>)</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td>uv-coordinate playback equals <tt>U = xywh.x + (t.x*(s.x/fps))</tt> and <tt>V = t.y*(s.y/fps)</tt></td>
</tr>
<tr>
<td>temporal W3C media fragment *</td>
<td>s=[uv:]x, ...</td>
<td><sub>1,1,1,1</sub></td>
<td>XD speed: set playback speed of audio/video [or uv-coordinates]</td>
</tr>
<tr>
<td></td>
<td></td>
<td>uv:1,1</td>
<td>(texture)scroll uv-coordinates with <tt>0.1</tt> units/per second</td>
</tr> </tr>
<tr> <tr>
@ -442,8 +404,36 @@ That way, if the link gets shared, the XR Fragments implementation at <tt>https:
<td>0,0,1,1</td> <td>0,0,1,1</td>
<td>crop (uv) coordinates (default for uv-coordinates is <tt>0,0,1,1</tt>)</td> <td>crop (uv) coordinates (default for uv-coordinates is <tt>0,0,1,1</tt>)</td>
</tr> </tr>
<tr>
<td>temporal W3C media fragment *</td>
<td>t=[l:]x,y</td>
<td>l:0,1</td>
<td>play [as loop] between <tt>x</tt> and <tt>y</tt></td>
</tr>
<tr>
<td>temporal W3C media fragment *</td>
<td>s=x[,y]</td>
<td>1</td>
<td>set playback speed of audio/video/3D anim</td>
</tr>
<tr>
<td>temporal W3C media fragment *</td>
<td>sxy=[l:]x,y</td>
<td>0.1,0.2</td>
<td>xy scrollspeed of new xywh viewport/uvcoordinates (default <tt>1,1</tt> is instant): allows lerping to new <tt>xywh</tt> values [or infinite texturescrolling]</td>
</tr>
<tr>
<td>temporal W3C media fragment *</td>
<td>u:&lt;uniform&gt;=&lt;string</td>
<td>float</td>
<td>vec2</td>
</tr>
</tbody> </tbody>
</table><blockquote><t>* = this is extending the <eref target="https://www.w3.org/TR/media-frags/#mf-advanced">W3C media fragments</eref> with:</t> </table><blockquote><t>* = this is extending the <eref target="https://www.w3.org/TR/media-frags/#mf-advanced">W3C media fragments</eref> with finer playback/viewport-control:</t>
</blockquote><table> </blockquote><table>
<thead> <thead>
<tr> <tr>
@ -459,62 +449,59 @@ That way, if the link gets shared, the XR Fragments implementation at <tt>https:
</tr> </tr>
<tr> <tr>
<td><tt>pl:</tt> specifices pingpongloop</td> <td><tt>s:</tt> specifies playback speed</td>
<td><tt>t=0,2</tt> specifies oneshot-play (default) whereas <tt>t=pl:0,2</tt> indicates looped-play</td> <td>being able to specify loop(speed) of audio/video/uv timeline-coordinates (default: <tt>1[,1]</tt> which translates to uv-coordinate <tt>0.1,0.1</tt> units p/second)</td>
</tr> </tr>
<tr> <tr>
<td><tt>uv:</tt> specifies uv-coordinates</td> <td><tt>sxy=</tt> specifies lerping of xy(wh) values</td>
<td><tt>t=0,2</tt> specifies <tt>src</tt> loaded media (or 3D animations in 3D models) whereas <tt>t=uv:0,1</tt> plays uv-coordinate texturescroller</td> <td>allows animated cropping and infinite texturescroll with configurable speed for u/v coordinates</td>
</tr> </tr>
<tr> <tr>
<td><tt>s</tt> specifies speed</td> <td><tt>u:&lt;uniform&gt;=</tt></td>
<td>being able to specify loop(speed) of audio/video/uv timeline-coordinates which is <tt>1,[[1],[1]]</tt> by default (translates to uv-coordinate <tt>0.1</tt> units p/second)</td> <td>specifies updating a uniform value</td>
</tr>
<tr>
<td><tt>t=x,y,...</tt> forwarded as shadervalues</td>
<td><tt>t=x,y,...</tt> values are forwarded as positional shader-uniform values (like <eref target="https://isf.video/">IFS parameters</eref>).</td>
</tr>
<tr>
<td></td>
<td>The rationale that shaders are temporal 'players' too, but which require loose-coupled positional values (parameters) for temporal control (like <eref target="https://isf.video/">IFS parameters</eref>)</td>
</tr> </tr>
</tbody> </tbody>
</table> </table><t>Example URI's:</t>
<artwork><![CDATA[ +──────────────────────────────────────────────────────────+
<ul spacing="compact">
<li><tt>https://shaders.org/plasma.glsl#t=0&amp;u.col1=1,0,0&amp;u.col2=0,1,0</tt> (red-green shader plasma starts playing from time-offset 0)</li>
<li><tt>https://images.org/credits.jpg#t=0&amp;sxy=l:0,0.1</tt> (infinite vertical texturescrolling)</li>
<li><tt>https://video.org/organogram.mp4#t=0&amp;sxy:0.1,0.1&amp;xywh=500,500,480,640</tt> (animated zoom towards region in video)</li>
</ul>
<artwork> +──────────────────────────────────────────────────────────+
│ │ │ │
│ index.gltf#playall │ │ index.gltf#playall │
│ │ │ │ │ │
│ ├ # : #playall │ apply default XR Fragment on load │ ├ # : #playall │ apply default XR Fragment on load
│ ├ #playall: #media.play&wall.calm&t=1 │ here `t` plays the 3D animations inside index.gltf from 1 seconds │ ├ #playall: #media=play&amp;wall=calm&amp;t=1 │ here `t` plays the 3D animations inside index.gltf from 1 seconds
│ │ │ │ │ │
│ ├── ◻ playbutton │ │ ├── ◻ playbutton │
│ │ └ href: #media.play&wall.calm │ trigger #play on object 'media' and #calm on 'wall' │ │ └ href: #media=play&amp;wall=calm ······· │ (re)trigger `play` on object 'media' and `calm` on 'wall'
│ │ │ │ │ · │
│ ├── ◻ plane │ │ ├── ◻ plane · │
│ │ └ src: foo.jpg#t=uv:l:0,0.2&s=1 │ infinite texturescroll `v` of uv-coordinates with 0.2/fps │ │ └ src: foo.jpg#sxy=l:0,0.1 · │ infinite texturescroll `v` of uv·coordinates with 0.1/fps
│ │ │ with u-speed `0.1` and v-speed `0.1` (`#s` defaults) units p/second │ │ · │ with u·speed `0.1` and v·speed `0.1` (`#s` defaults) units p/second
│ ├── ◻ media │ │ ├── ◻ media · │
│ │ ├ play: #t=0 │ play cat.mp4 from 0 sec │ │ ├ play: #t=0 ················ · │ play cat.mp4 from 0 sec
│ │ ├ stop: #t=0,0 │ stop │ │ ├ #: #play ···^ · · │ apply default XR fragment (on load)
│ │ ├ loop: #t=l:1,2&s=2 │ loop cat.mp4 between 1 and 2 sec with double speed │ │ ├ stop: #t=0,0 ··········· · │ stop
│ │ ├ crop: #xywh=0,0,0.5,0.5 │ crop uv-coordinates │ │ ├ loop: #t=l:1,2&amp;s=2 ············ │ loop cat.mp4 between 1 and 2 sec with double speed
│ │ ├ #: #play │ apply default XR fragment (on load) │ │ ├ crop: #xywh=0,0,0.5,0.5 ····· · │ crop viewport/uv·coordinates
│ │ │ │ │ │ └ src: cat.mp4#t=l:2,10 &lt;&lt;······· · │ loop cat.mp4 (or mp3/wav/jpg) between 2 and 10 seconds
│ │ └ src: cat.mp4#t=l:2,10 │ loop cat.mp4 (or mp3/wav/jpg) between 2 and 10 seconds │ │ · │
│ │ │ │ └── ◻ wall · │
│ └── ◻ wall │ │ ├ calm: #u:color=1,0,0 ················ │ updates uniform values (IFS shader e.g.)
│ ├ href: #calm │ │ ├ #: #wall=calm ···^ · │ apply default XR Fragment (on load)
│ ├ calm: #t=1,2,3,4 >--+--+--> updates uniform values (IFS shader e.g.) │ └ src: ://a.com/art.fs#sxy:l:0,0.1 &lt;&lt;··· │ .fs/.vs/.glsl/.wgsl etc
│ ├ #: #calm | │ apply default XR Fragment (on load)
│ └ src: ://a.com/art.fs#t=0,0,0,0 >--- │ .fs/.vs/.glsl/.wgsl etc
│ │ │ │
│ │ │ │
+──────────────────────────────────────────────────────────+ +──────────────────────────────────────────────────────────+
]]>
&gt; NOTE: node-metadata (without #-prefix) applies XR Fragments to its `src` URL, otherwise it applies it to the browser URL. Full addressibility can be maintained, since top-level `href` values can trigger node-specific aliases (`media=play` e.g.).
</artwork> </artwork>
</section> </section>
</section> </section>
@ -522,7 +509,7 @@ That way, if the link gets shared, the XR Fragments implementation at <tt>https:
<section anchor="spatial-referencing-3d"><name>Spatial Referencing 3D</name> <section anchor="spatial-referencing-3d"><name>Spatial Referencing 3D</name>
<t>XR Fragments assume the following objectname-to-URIFragment mapping:</t> <t>XR Fragments assume the following objectname-to-URIFragment mapping:</t>
<artwork><![CDATA[ <artwork>
my.io/scene.fbx my.io/scene.fbx
+─────────────────────────────+ +─────────────────────────────+
│ sky │ src: http://my.io/scene.fbx#sky (includes building,mainobject,floor) │ sky │ src: http://my.io/scene.fbx#sky (includes building,mainobject,floor)
@ -538,7 +525,6 @@ That way, if the link gets shared, the XR Fragments implementation at <tt>https:
│ +─────────────────────────+ │ │ +─────────────────────────+ │
+─────────────────────────────+ +─────────────────────────────+
]]>
</artwork> </artwork>
<blockquote><t>Every 3D fileformat supports named 3D object, and this name allows URLs (fragments) to reference them (and their children objects).</t> <blockquote><t>Every 3D fileformat supports named 3D object, and this name allows URLs (fragments) to reference them (and their children objects).</t>
</blockquote><t>Clever nested design of 3D scenes allow great ways for re-using content, and/or previewing scenes.<br /> </blockquote><t>Clever nested design of 3D scenes allow great ways for re-using content, and/or previewing scenes.<br />
@ -589,19 +575,18 @@ For example, to render a portal with a preview-version of the scene, create an 3
</ol> </ol>
<t>Here's an ascii representation of a 3D scene-graph which contains 3D objects <tt></tt> and their metadata:</t> <t>Here's an ascii representation of a 3D scene-graph which contains 3D objects <tt></tt> and their metadata:</t>
<artwork><![CDATA[ +────────────────────────────────────────────────────────+ <artwork> +────────────────────────────────────────────────────────+
│ │ │ │
│ index.gltf │ │ index.gltf │
│ │ │ │ │ │
│ ├── ◻ buttonA │ │ ├── ◻ buttonA │
│ │ └ href: #pos=1,0,1&t=100,200 │ │ │ └ href: #pos=1,0,1&amp;t=100,200 │
│ │ │ │ │ │
│ └── ◻ buttonB │ │ └── ◻ buttonB │
│ └ href: other.fbx │ <── file─agnostic (can be .gltf .obj etc) │ └ href: other.fbx │ &lt;── file─agnostic (can be .gltf .obj etc)
│ │ │ │
+────────────────────────────────────────────────────────+ +────────────────────────────────────────────────────────+
]]>
</artwork> </artwork>
<t>An XR Fragment-compatible browser viewing this scene, allows the end-user to interact with the <tt>buttonA</tt> and <tt>buttonB</tt>.<br /> <t>An XR Fragment-compatible browser viewing this scene, allows the end-user to interact with the <tt>buttonA</tt> and <tt>buttonB</tt>.<br />
@ -649,7 +634,7 @@ It instances content (in objects) in the current scene/asset.</t>
</tbody> </tbody>
</table><t>Here's an ascii representation of a 3D scene-graph with 3D objects <tt></tt> which embeds remote &amp; local 3D objects <tt></tt> with/out using filters:</t> </table><t>Here's an ascii representation of a 3D scene-graph with 3D objects <tt></tt> which embeds remote &amp; local 3D objects <tt></tt> with/out using filters:</t>
<artwork><![CDATA[ +────────────────────────────────────────────────────────+ +─────────────────────────+ <artwork> +────────────────────────────────────────────────────────+ +─────────────────────────+
│ │ │ │ │ │ │ │
│ index.gltf │ │ ocean.com/aquarium.fbx │ │ index.gltf │ │ ocean.com/aquarium.fbx │
│ │ │ │ ├ room │ │ │ │ │ ├ room │
@ -666,7 +651,6 @@ It instances content (in objects) in the current scene/asset.</t>
│ └ src: #canvas │ │ └ src: #canvas │
│ │ │ │
+────────────────────────────────────────────────────────+ +────────────────────────────────────────────────────────+
]]>
</artwork> </artwork>
<t>An XR Fragment-compatible browser viewing this scene, lazy-loads and projects <tt>painting.png</tt> onto the (plane) object called <tt>canvas</tt> (which is copy-instanced in the bed and livingroom).<br /> <t>An XR Fragment-compatible browser viewing this scene, lazy-loads and projects <tt>painting.png</tt> onto the (plane) object called <tt>canvas</tt> (which is copy-instanced in the bed and livingroom).<br />
@ -983,7 +967,7 @@ XR Fragments does this by detecting Bib(s)Tex, without introducing a new languag
</ol> </ol>
<t>Example:</t> <t>Example:</t>
<artwork><![CDATA[ http://y.io/z.fbx | Derived XRWG (expressed as BibTex) <artwork> http://y.io/z.fbx | Derived XRWG (expressed as BibTex)
----------------------------------------------------------------------------+-------------------------------------- ----------------------------------------------------------------------------+--------------------------------------
| @house{castle, | @house{castle,
+-[src: data:.....]----------------------+ +-[3D mesh]-+ | url = {https://y.io/z.fbx#castle} +-[src: data:.....]----------------------+ +-[3D mesh]-+ | url = {https://y.io/z.fbx#castle}
@ -1001,12 +985,11 @@ XR Fragments does this by detecting Bib(s)Tex, without introducing a new languag
| /|\ | | | /|\ | |
| / \ | | | / \ | |
+--------+ | +--------+ |
]]>
</artwork> </artwork>
<blockquote><t>the <tt>#john@baroque</tt>-bib associates both text <tt>John</tt> and objectname <tt>john</tt>, with tag <tt>baroque</tt></t> <blockquote><t>the <tt>#john@baroque</tt>-bib associates both text <tt>John</tt> and objectname <tt>john</tt>, with tag <tt>baroque</tt></t>
</blockquote><t>Another example:</t> </blockquote><t>Another example:</t>
<artwork><![CDATA[ http://y.io/z.fbx | Derived XRWG (expressed as BibTex) <artwork> http://y.io/z.fbx | Derived XRWG (expressed as BibTex)
----------------------------------------------------------------------------+-------------------------------------- ----------------------------------------------------------------------------+--------------------------------------
| |
+-[src: data:.....]----------------------+ +-[3D mesh]-+ | @house{castle, +-[src: data:.....]----------------------+ +-[3D mesh]-+ | @house{castle,
@ -1024,7 +1007,6 @@ XR Fragments does this by detecting Bib(s)Tex, without introducing a new languag
| #baroque@todo@house | | /|\ | | | #baroque@todo@house | | /|\ | |
| ... | | / \ | | | ... | | / \ | |
+----------------------------------------+ +--------+ | +----------------------------------------+ +--------+ |
]]>
</artwork> </artwork>
<blockquote><t>both <tt>#john@baroque</tt>-bib and BibTex <tt>@baroque{john}</tt> result in the same XRWG, however on top of that 2 tages (<tt>house</tt> and <tt>todo</tt>) are now associated with text/objectname/tag 'baroque'.</t> <blockquote><t>both <tt>#john@baroque</tt>-bib and BibTex <tt>@baroque{john}</tt> result in the same XRWG, however on top of that 2 tages (<tt>house</tt> and <tt>todo</tt>) are now associated with text/objectname/tag 'baroque'.</t>
</blockquote><t>As seen above, the XRWG can expand <eref target="https://github.com/coderofsalvation/hashtagbibs">bibs</eref> (and the whole scene) to BibTeX.<br /> </blockquote><t>As seen above, the XRWG can expand <eref target="https://github.com/coderofsalvation/hashtagbibs">bibs</eref> (and the whole scene) to BibTeX.<br />
@ -1078,22 +1060,21 @@ Some pointers for good UX (but not necessary to be XR Fragment compatible):</t>
<blockquote><t>The simplicity of appending metadata (and leveling the metadata-playfield between humans and machines) is also demonstrated by <eref target="https://visual-meta.info">visual-meta</eref> in greater detail.</t> <blockquote><t>The simplicity of appending metadata (and leveling the metadata-playfield between humans and machines) is also demonstrated by <eref target="https://visual-meta.info">visual-meta</eref> in greater detail.</t>
</blockquote><t>Fictional chat:</t> </blockquote><t>Fictional chat:</t>
<artwork><![CDATA[<John> Hey what about this: https://my.com/station.gltf#pos=0,0,1&rot=90,2,0&t=500,1000 <artwork>&lt;John&gt; Hey what about this: https://my.com/station.gltf#pos=0,0,1&amp;rot=90,2,0&amp;t=500,1000
<Sarah> I'm checking it right now &lt;Sarah&gt; I'm checking it right now
<Sarah> I don't see everything..where's our text from yesterday? &lt;Sarah&gt; I don't see everything..where's our text from yesterday?
<John> Ah wait, that's tagged with tag 'draft' (and hidden)..hold on, try this: &lt;John&gt; Ah wait, that's tagged with tag 'draft' (and hidden)..hold on, try this:
<John> https://my.com/station.gltf#.draft&pos=0,0,1&rot=90,2,0&t=500,1000 &lt;John&gt; https://my.com/station.gltf#.draft&amp;pos=0,0,1&amp;rot=90,2,0&amp;t=500,1000
<Sarah> how about we link the draft to the upcoming YELLO-event? &lt;Sarah&gt; how about we link the draft to the upcoming YELLO-event?
<John> ok I'm adding #draft@YELLO &lt;John&gt; ok I'm adding #draft@YELLO
<Sarah> Yesterday I also came up with other usefull assocations between other texts in the scene: &lt;Sarah&gt; Yesterday I also came up with other usefull assocations between other texts in the scene:
#event#YELLO #event#YELLO
#2025@YELLO #2025@YELLO
<John> thanks, added. &lt;John&gt; thanks, added.
<Sarah> Btw. I stumbled upon this spatial book which references station.gltf in some chapters: &lt;Sarah&gt; Btw. I stumbled upon this spatial book which references station.gltf in some chapters:
<Sarah> https://thecommunity.org/forum/foo/mytrainstory.txt &lt;Sarah&gt; https://thecommunity.org/forum/foo/mytrainstory.txt
<John> interesting, I'm importing mytrainstory.txt into station.gltf &lt;John&gt; interesting, I'm importing mytrainstory.txt into station.gltf
<John> ah yes, chapter three points to trainterminal_2A in the scene, cool &lt;John&gt; ah yes, chapter three points to trainterminal_2A in the scene, cool
]]>
</artwork> </artwork>
<section anchor="default-data-uri-mimetype"><name>Default Data URI mimetype</name> <section anchor="default-data-uri-mimetype"><name>Default Data URI mimetype</name>
@ -1129,7 +1110,7 @@ to connect text further with its environment ( setup links between textual/spati
<section anchor="url-and-data-uri"><name>URL and Data URI</name> <section anchor="url-and-data-uri"><name>URL and Data URI</name>
<artwork><![CDATA[ +--------------------------------------------------------------+ +------------------------+ <artwork> +--------------------------------------------------------------+ +------------------------+
| | | author.com/article.txt | | | | author.com/article.txt |
| index.gltf | +------------------------+ | index.gltf | +------------------------+
| │ | | | | │ | | |
@ -1141,7 +1122,6 @@ to connect text further with its environment ( setup links between textual/spati
| | +------------------------+ | | +------------------------+
| | | |
+--------------------------------------------------------------+ +--------------------------------------------------------------+
]]>
</artwork> </artwork>
<t>The enduser will only see <tt>welcome human</tt> and <tt>Hello friends</tt> rendered verbatim (see mimetype). <t>The enduser will only see <tt>welcome human</tt> and <tt>Hello friends</tt> rendered verbatim (see mimetype).
The beauty is that text in Data URI automatically promotes rich copy-paste (retaining metadata). The beauty is that text in Data URI automatically promotes rich copy-paste (retaining metadata).
@ -1153,14 +1133,14 @@ The XR Fragment-compatible browser can let the enduser access visual-meta(data)-
<section anchor="xr-text-example-parser"><name>XR Text example parser</name> <section anchor="xr-text-example-parser"><name>XR Text example parser</name>
<t>To prime the XRWG with text from plain text <tt>src</tt>-values, here's an example XR Text (de)multiplexer in javascript (which supports inline bibs &amp; bibtex):</t> <t>To prime the XRWG with text from plain text <tt>src</tt>-values, here's an example XR Text (de)multiplexer in javascript (which supports inline bibs &amp; bibtex):</t>
<artwork><![CDATA[xrtext = { <artwork>xrtext = {
expandBibs: (text) => { expandBibs: (text) =&gt; {
let bibs = { regex: /(#[a-zA-Z0-9_+@\-]+(#)?)/g, tags: {}} let bibs = { regex: /(#[a-zA-Z0-9_+@\-]+(#)?)/g, tags: {}}
text.replace( bibs.regex , (m,k,v) => { text.replace( bibs.regex , (m,k,v) =&gt; {
tok = m.substr(1).split("@") tok = m.substr(1).split(&quot;@&quot;)
match = tok.shift() match = tok.shift()
if( tok.length ) tok.map( (t) => bibs.tags[t] = `@${t}{${match},\n}` ) if( tok.length ) tok.map( (t) =&gt; bibs.tags[t] = `@${t}{${match},\n}` )
else if( match.substr(-1) == '#' ) else if( match.substr(-1) == '#' )
bibs.tags[match] = `@{${match.replace(/#/,'')}}` bibs.tags[match] = `@{${match.replace(/#/,'')}}`
else bibs.tags[match] = `@${match}{${match},\n}` else bibs.tags[match] = `@${match}{${match},\n}`
@ -1168,16 +1148,16 @@ The XR Fragment-compatible browser can let the enduser access visual-meta(data)-
return text.replace( bibs.regex, '') + Object.values(bibs.tags).join('\n') return text.replace( bibs.regex, '') + Object.values(bibs.tags).join('\n')
}, },
decode: (str) => { decode: (str) =&gt; {
// bibtex: ↓@ ↓<tag|tag{phrase,|{ruler}> ↓property ↓end // bibtex: ↓@ ↓&lt;tag|tag{phrase,|{ruler}&gt; ↓property ↓end
let pat = [ /@/, /^\S+[,{}]/, /},/, /}/ ] let pat = [ /@/, /^\S+[,{}]/, /},/, /}/ ]
let tags = [], text='', i=0, prop='' let tags = [], text='', i=0, prop=''
let lines = xrtext.expandBibs(str).replace(/\r?\n/g,'\n').split(/\n/) let lines = xrtext.expandBibs(str).replace(/\r?\n/g,'\n').split(/\n/)
for( let i = 0; i < lines.length && !String(lines[i]).match( /^@/ ); i++ ) for( let i = 0; i &lt; lines.length &amp;&amp; !String(lines[i]).match( /^@/ ); i++ )
text += lines[i]+'\n' text += lines[i]+'\n'
bibtex = lines.join('\n').substr( text.length ) bibtex = lines.join('\n').substr( text.length )
bibtex.split( pat[0] ).map( (t) => { bibtex.split( pat[0] ).map( (t) =&gt; {
try{ try{
let v = {} let v = {}
if( !(t = t.trim()) ) return if( !(t = t.trim()) ) return
@ -1186,9 +1166,9 @@ The XR Fragment-compatible browser can let the enduser access visual-meta(data)-
if( tag.match( /}$/ ) ) return tags.push({k: tag.replace(/}$/,''), v: {}}) if( tag.match( /}$/ ) ) return tags.push({k: tag.replace(/}$/,''), v: {}})
t = t.substr( tag.length ) t = t.substr( tag.length )
t.split( pat[2] ) t.split( pat[2] )
.map( kv => { .map( kv =&gt; {
if( !(kv = kv.trim()) || kv == "}" ) return if( !(kv = kv.trim()) || kv == &quot;}&quot; ) return
v[ kv.match(/\s?(\S+)\s?=/)[1] ] = kv.substr( kv.indexOf("{")+1 ) v[ kv.match(/\s?(\S+)\s?=/)[1] ] = kv.substr( kv.indexOf(&quot;{&quot;)+1 )
}) })
tags.push( { k:tag, v } ) tags.push( { k:tag, v } )
}catch(e){ console.error(e) } }catch(e){ console.error(e) }
@ -1196,8 +1176,8 @@ The XR Fragment-compatible browser can let the enduser access visual-meta(data)-
return {text, tags} return {text, tags}
}, },
encode: (text,tags) => { encode: (text,tags) =&gt; {
let str = text+"\n" let str = text+&quot;\n&quot;
for( let i in tags ){ for( let i in tags ){
let item = tags[i] let item = tags[i]
if( item.ruler ){ if( item.ruler ){
@ -1211,12 +1191,11 @@ The XR Fragment-compatible browser can let the enduser access visual-meta(data)-
return str return str
} }
} }
]]>
</artwork> </artwork>
<t>The above functions (de)multiplexe text/metadata, expands bibs, (de)serialize bibtex and vice versa</t> <t>The above functions (de)multiplexe text/metadata, expands bibs, (de)serialize bibtex and vice versa</t>
<blockquote><t>above can be used as a startingpoint for LLVM's to translate/steelman to a more formal form/language.</t> <blockquote><t>above can be used as a startingpoint for LLVM's to translate/steelman to a more formal form/language.</t>
</blockquote> </blockquote>
<artwork><![CDATA[str = ` <artwork>str = `
hello world hello world
here are some hashtagbibs followed by bibtex: here are some hashtagbibs followed by bibtex:
@ -1229,15 +1208,14 @@ here are some hashtagbibs followed by bibtex:
asdf = {23423} asdf = {23423}
}` }`
var {tags,text} = xrtext.decode(str) // demultiplex text & bibtex var {tags,text} = xrtext.decode(str) // demultiplex text &amp; bibtex
tags.find( (t) => t.k == 'flap{' ).v.asdf = 1 // edit tag tags.find( (t) =&gt; t.k == 'flap{' ).v.asdf = 1 // edit tag
tags.push({ k:'bar{', v:{abc:123} }) // add tag tags.push({ k:'bar{', v:{abc:123} }) // add tag
console.log( xrtext.encode(text,tags) ) // multiplex text & bibtex back together console.log( xrtext.encode(text,tags) ) // multiplex text &amp; bibtex back together
]]>
</artwork> </artwork>
<t>This expands to the following (hidden by default) BibTex appendix:</t> <t>This expands to the following (hidden by default) BibTex appendix:</t>
<artwork><![CDATA[hello world <artwork>hello world
here are some hashtagbibs followed by bibtex: here are some hashtagbibs followed by bibtex:
@{some-section} @{some-section}
@ -1252,7 +1230,6 @@ here are some hashtagbibs followed by bibtex:
@bar{ @bar{
abc = {123} abc = {123}
} }
]]>
</artwork> </artwork>
<blockquote><t>when an XR browser updates the human text, a quick scan for nonmatching tags (<tt>@book{nonmatchingbook</tt> e.g.) should be performed and prompt the enduser for deleting them.</t> <blockquote><t>when an XR browser updates the human text, a quick scan for nonmatching tags (<tt>@book{nonmatchingbook</tt> e.g.) should be performed and prompt the enduser for deleting them.</t>
</blockquote></section> </blockquote></section>
@ -1269,7 +1246,7 @@ here are some hashtagbibs followed by bibtex:
<blockquote><t>due to the popularity, maturity and extensiveness of HTTP codes for client/server communication, non-HTTP protocols easily map to HTTP codes (ipfs ERR_NOT_FOUND maps to 404 e.g.)</t> <blockquote><t>due to the popularity, maturity and extensiveness of HTTP codes for client/server communication, non-HTTP protocols easily map to HTTP codes (ipfs ERR_NOT_FOUND maps to 404 e.g.)</t>
</blockquote><t>For example:</t> </blockquote><t>For example:</t>
<artwork><![CDATA[ +────────────────────────────────────────────────────────+ <artwork> +────────────────────────────────────────────────────────+
│ │ │ │
│ index.gltf │ │ index.gltf │
│ │ │ │ │ │
@ -1281,14 +1258,13 @@ here are some hashtagbibs followed by bibtex:
│ │ └ href@400: #clienterrortext │ │ │ └ href@400: #clienterrortext │
│ │ └ ◻ offlinetext │ │ │ └ ◻ offlinetext │
│ │ │ │ │ │
│ └── ◻ embeddedObject <--------- the meshdata inside embeddedObject will (not) │ └── ◻ embeddedObject &lt;--------- the meshdata inside embeddedObject will (not)
│ └ src: https://foo.io/bar.gltf │ be flushed when the request (does not) succeed. │ └ src: https://foo.io/bar.gltf │ be flushed when the request (does not) succeed.
│ └ src@404: http://foo.io/bar.gltf │ So worstcase the 3D data (of the time of publishing index.gltf) │ └ src@404: http://foo.io/bar.gltf │ So worstcase the 3D data (of the time of publishing index.gltf)
│ └ src@400: https://archive.org/l2kj43.gltf │ will be displayed. │ └ src@400: https://archive.org/l2kj43.gltf │ will be displayed.
│ │ │ │
+────────────────────────────────────────────────────────+ +────────────────────────────────────────────────────────+
]]>
</artwork> </artwork>
</section> </section>

View File

@ -3,7 +3,7 @@
Internet Engineering Task Force L.R. van Kammen Internet Engineering Task Force L.R. van Kammen
Internet-Draft 2 February 2024 Internet-Draft 5 February 2024
Intended status: Informational Intended status: Informational
@ -38,7 +38,7 @@ Status of This Memo
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on 5 August 2024. This Internet-Draft will expire on 8 August 2024.
Copyright Notice Copyright Notice
@ -53,7 +53,7 @@ Copyright Notice
van Kammen Expires 5 August 2024 [Page 1] van Kammen Expires 8 August 2024 [Page 1]
Internet-Draft XR Macros February 2024 Internet-Draft XR Macros February 2024
@ -109,13 +109,13 @@ Table of Contents
van Kammen Expires 5 August 2024 [Page 2] van Kammen Expires 8 August 2024 [Page 2]
Internet-Draft XR Macros February 2024 Internet-Draft XR Macros February 2024
3. Metadata-values can contain the | symbol to 🎲 roundrobin variable 3. Metadata-values can contain the | symbol to &#127922; roundrobin
values (!toggleme: fog=0,10|fog=0,1000 e.g.) variable values (!toggleme: fog=0,10|fog=0,1000 e.g.)
4. XR Macros acts as simple eventhandlers for URI Fragments: they 4. XR Macros acts as simple eventhandlers for URI Fragments: they
are automatically published on the (XR Fragments are automatically published on the (XR Fragments
(https://xrfragment.org)) hashbus, to act as events (so more (https://xrfragment.org)) hashbus, to act as events (so more
@ -165,7 +165,7 @@ Internet-Draft XR Macros February 2024
van Kammen Expires 5 August 2024 [Page 3] van Kammen Expires 8 August 2024 [Page 3]
Internet-Draft XR Macros February 2024 Internet-Draft XR Macros February 2024
@ -221,7 +221,7 @@ Internet-Draft XR Macros February 2024
van Kammen Expires 5 August 2024 [Page 4] van Kammen Expires 8 August 2024 [Page 4]
Internet-Draft XR Macros February 2024 Internet-Draft XR Macros February 2024
@ -277,7 +277,7 @@ Internet-Draft XR Macros February 2024
van Kammen Expires 5 August 2024 [Page 5] van Kammen Expires 8 August 2024 [Page 5]
Internet-Draft XR Macros February 2024 Internet-Draft XR Macros February 2024
@ -333,7 +333,7 @@ click object with (`!clickme`:`!foo|!bar|!flop` e.g.)
van Kammen Expires 5 August 2024 [Page 6] van Kammen Expires 8 August 2024 [Page 6]
Internet-Draft XR Macros February 2024 Internet-Draft XR Macros February 2024
@ -375,7 +375,7 @@ Internet-Draft XR Macros February 2024
| | (games,VR,AR e.g.), should be as high as | | | (games,VR,AR e.g.), should be as high as |
| | possible | | | possible |
+---------------+---------------------------------------------------+ +---------------+---------------------------------------------------+
| | ascii representation of an 3D object/mesh | | &#9723; | ascii representation of an 3D object/mesh |
+---------------+---------------------------------------------------+ +---------------+---------------------------------------------------+
| (un)obtrusive | obtrusive: wrapping human text/thought in | | (un)obtrusive | obtrusive: wrapping human text/thought in |
| | XML/HTML/JSON obfuscates human text into | | | XML/HTML/JSON obfuscates human text into |
@ -389,4 +389,4 @@ Internet-Draft XR Macros February 2024
van Kammen Expires 5 August 2024 [Page 7] van Kammen Expires 8 August 2024 [Page 7]

View File

@ -282,17 +282,16 @@ Macros also act as events, so more serious scripting languages can react to them
<section anchor="event-bubble-flow"><name>Event Bubble-flow</name> <section anchor="event-bubble-flow"><name>Event Bubble-flow</name>
<t>click object with (<tt>!clickme</tt>:<tt>AR</tt> or <tt>!clickme</tt>: <tt>!reset</tt> e.g.)</t> <t>click object with (<tt>!clickme</tt>:<tt>AR</tt> or <tt>!clickme</tt>: <tt>!reset</tt> e.g.)</t>
<artwork><![CDATA[ <artwork>
└── does current object contain this property-key (`AR` or `!reset` e.g.)? └── does current object contain this property-key (`AR` or `!reset` e.g.)?
└── no: is there any (root)object containing property `AR` └── no: is there any (root)object containing property `AR`
└── yes: evaluate its (roundrobin) XR macro-value(s) (and exit) └── yes: evaluate its (roundrobin) XR macro-value(s) (and exit)
└── no: trigger URL: #AR └── no: trigger URL: #AR
]]>
</artwork> </artwork>
<t>click object with (<tt>!clickme</tt>:<tt>#AR|#VR</tt> e.g.)</t> <t>click object with (<tt>!clickme</tt>:<tt>#AR|#VR</tt> e.g.)</t>
<artwork><![CDATA[ <artwork>
└── apply the roundrobin (rotate the options, value `#AR` becomes `#VR` upon next click) └── apply the roundrobin (rotate the options, value `#AR` becomes `#VR` upon next click)
└── is there any object with property-key (`#AR` e.g.)? └── is there any object with property-key (`#AR` e.g.)?
@ -300,7 +299,6 @@ Macros also act as events, so more serious scripting languages can react to them
└── yes: apply its value to the scene, and update the URL to `#AR` └── yes: apply its value to the scene, and update the URL to `#AR`
click object with (`!clickme`:`!foo|!bar|!flop` e.g.) click object with (`!clickme`:`!foo|!bar|!flop` e.g.)
]]>
</artwork> </artwork>
<t> <t>
<br /> <br />