From 6a065323f452a02ed6fb6516506d831cff91ff98 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Wed, 25 Mar 2026 14:53:22 +0000 Subject: [PATCH 01/10] Adding new v4 validator --- .github/workflows/validate.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/validate.yml diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml new file mode 100644 index 000000000..5d49638ec --- /dev/null +++ b/.github/workflows/validate.yml @@ -0,0 +1,23 @@ +name: validate + +on: + pull_request: + workflow_dispatch: + +jobs: + validate: + runs-on: ubuntu-latest + env: + BUNDLE_WITH: test jekyll_plugins + SITE_ID: 'cookbook' # which iiif site this is + URL: 'https://preview.iiif.io' + + steps: + - name: Check out this repository + uses: actions/checkout@v5 + + - name: Run IIIF validator + uses: IIIF/presentation-validator@v4 + with: + directory: source/presentation/4.0/example/ + version: "4.0" \ No newline at end of file From dc87229930290a6077f25ce45d63fa9c6c9b9a65 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Wed, 25 Mar 2026 15:11:06 +0000 Subject: [PATCH 02/10] Fixing duration --- source/presentation/4.0/example/uc07_duration_composite.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/presentation/4.0/example/uc07_duration_composite.json b/source/presentation/4.0/example/uc07_duration_composite.json index 2e44a2554..81dd2294b 100644 --- a/source/presentation/4.0/example/uc07_duration_composite.json +++ b/source/presentation/4.0/example/uc07_duration_composite.json @@ -10,7 +10,7 @@ "label": { "en": [ "Side A: 99 Luftballons - 10min duration" ] }, "width": 100, "height": 100, - "duration": 36000, + "duration": 600, "items": [ { "id": "https://iiif.io/api/presentation/4.0/example/uc07_audio/canvas/1/page/1", From 7de660ec1e599163d46c782c135696fce70cabd0 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Wed, 25 Mar 2026 18:07:36 +0000 Subject: [PATCH 03/10] Update validate.yml Using main validator --- .github/workflows/validate.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 5d49638ec..cf5b02354 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -17,7 +17,7 @@ jobs: uses: actions/checkout@v5 - name: Run IIIF validator - uses: IIIF/presentation-validator@v4 + uses: IIIF/presentation-validator@main with: directory: source/presentation/4.0/example/ - version: "4.0" \ No newline at end of file + version: "4.0" From 87b91c49f0a461d0319cb633a1d31bf9eddc13d3 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Wed, 25 Mar 2026 23:38:04 +0000 Subject: [PATCH 04/10] Fixing target by turning it into an object --- source/presentation/4.0/example/uc06_canvas_in_scene.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/example/uc06_canvas_in_scene.json b/source/presentation/4.0/example/uc06_canvas_in_scene.json index 8f83ab5e8..a72177d3f 100644 --- a/source/presentation/4.0/example/uc06_canvas_in_scene.json +++ b/source/presentation/4.0/example/uc06_canvas_in_scene.json @@ -54,7 +54,10 @@ "width": 800, "height": 800 }, - "target": "https://iiif.io/api/presentation/4.0/example/uc06/canvas/chessboard" + "target": { + "id": "https://iiif.io/api/presentation/4.0/example/uc06/canvas/chessboard", + "type": "Canvas" + } } ] } From 31421a417e9320e13b8e9e33875f2ebb47dc3f41 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Tue, 31 Mar 2026 00:06:25 +0100 Subject: [PATCH 05/10] Adding the sub scene information --- .../4.0/example/uc06_scene_in_scene.json | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/source/presentation/4.0/example/uc06_scene_in_scene.json b/source/presentation/4.0/example/uc06_scene_in_scene.json index 1442451aa..0a25c691b 100644 --- a/source/presentation/4.0/example/uc06_scene_in_scene.json +++ b/source/presentation/4.0/example/uc06_scene_in_scene.json @@ -19,7 +19,34 @@ "motivation": [ "painting" ], "body": { "id": "https://iiif.io/api/presentation/4.0/example/uc06/scene/1", - "type": "Scene" + "type": "Scene", + "label": { + "en": [ + "Chess Pawn" + ] + }, + "items": [ + { + "id": "https://iiif.io/api/presentation/4.0/example/uc06/scene/1/page/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://iiif.io/api/presentation/4.0/example/uc06/3d/anno/1", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://fixtures.iiif.io/3d/thomas_flynn/chess/Pawn_black.glb", + "type": "Model", + "format": "model/gltf-binary" + }, + "target": { + "id": "https://iiif.io/api/presentation/4.0/example/uc06/scene/1", + "type": "Scene" + } + } + ] + } + ] }, "target": { "id": "https://iiif.io/api/presentation/4.0/example/uc06/scene/parent/anno/1/specificResource/1", From cc896b6591ecf14beb3f2dce54e4c2c305b57f83 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Thu, 2 Apr 2026 22:28:17 +0100 Subject: [PATCH 06/10] Fixing chessboard image --- source/presentation/4.0/example/uc06_canvas_in_scene.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/presentation/4.0/example/uc06_canvas_in_scene.json b/source/presentation/4.0/example/uc06_canvas_in_scene.json index a72177d3f..41daf3b53 100644 --- a/source/presentation/4.0/example/uc06_canvas_in_scene.json +++ b/source/presentation/4.0/example/uc06_canvas_in_scene.json @@ -48,11 +48,11 @@ "type": "Annotation", "motivation": [ "painting" ], "body": { - "id": "https://fixtures.iiif.io/3d/chess/chessboard.jpg", + "id": "https://fixtures.iiif.io/3d/thomas_flynn/chess/chessboard.png", "type": "Image", - "format": "image/jpeg", - "width": 800, - "height": 800 + "format": "image/png", + "width": 1024, + "height": 1024 }, "target": { "id": "https://iiif.io/api/presentation/4.0/example/uc06/canvas/chessboard", From b33eb652a0def770c51af493307e418bdea8e9a5 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Thu, 2 Apr 2026 23:07:53 +0100 Subject: [PATCH 07/10] Making hdr links to actual files --- source/presentation/4.0/example/uc06_audio_with_3d.json | 2 +- source/presentation/4.0/example/uc06_multiple_3d_objects.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/presentation/4.0/example/uc06_audio_with_3d.json b/source/presentation/4.0/example/uc06_audio_with_3d.json index 7443e9528..36f9e7edc 100644 --- a/source/presentation/4.0/example/uc06_audio_with_3d.json +++ b/source/presentation/4.0/example/uc06_audio_with_3d.json @@ -256,7 +256,7 @@ "type": "ImageBasedLight", "label": { "en": [ "Image-Based Light" ] }, "environmentMap": { - "id": "https://iiif.io/api/presentation/4.0/example/uc06/light/3/environment.hdr", + "id": "https://fixtures.iiif.io/3d/polyhaven/spruit_sunrise_4k.hdr", "type": "Image", "format": "image/vnd.radiance", "profile": "equirectangular" diff --git a/source/presentation/4.0/example/uc06_multiple_3d_objects.json b/source/presentation/4.0/example/uc06_multiple_3d_objects.json index c48c5b7ae..826c8e321 100644 --- a/source/presentation/4.0/example/uc06_multiple_3d_objects.json +++ b/source/presentation/4.0/example/uc06_multiple_3d_objects.json @@ -139,7 +139,7 @@ "type": "ImageBasedLight", "label": { "en": [ "Image-Based Light" ] }, "environmentMap": { - "id": "https://iiif.io/api/presentation/4.0/example/uc06/light/3/environment.hdr", + "id": "https://fixtures.iiif.io/3d/polyhaven/spruit_sunrise_4k.hdr", "type": "Image", "format": "image/vnd.radiance", "profile": "equirectangular" From 864919632e26bdc6c7ce93a1eb27c6bd91463a72 Mon Sep 17 00:00:00 2001 From: Glen Robson Date: Fri, 3 Apr 2026 00:42:33 +0100 Subject: [PATCH 08/10] Adding uc08_3d_annotation --- .../4.0/example/uc08_3d_annotation.json | 77 ++++++++++++++++++ source/presentation/4.0/index.md | 80 +------------------ 2 files changed, 78 insertions(+), 79 deletions(-) create mode 100644 source/presentation/4.0/example/uc08_3d_annotation.json diff --git a/source/presentation/4.0/example/uc08_3d_annotation.json b/source/presentation/4.0/example/uc08_3d_annotation.json new file mode 100644 index 000000000..6f08acd23 --- /dev/null +++ b/source/presentation/4.0/example/uc08_3d_annotation.json @@ -0,0 +1,77 @@ +{ + "@context": "http://iiif.io/api/presentation/4/context.json", + "id": "https://iiif.io/api/presentation/4.0/example/uc08_3d_annotation.json", + "type": "Manifest", + "label": { "en": ["2nd century BC Greek sculpture"] }, + "items": [ + { + "id": "https://iiif.io/api/presentation/4.0/example/uc08/scene/1", + "type": "Scene", + "items": [ + { + "id": "https://iiif.io/api/presentation/4.0/example/uc08/scene/1/pages/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://iiif.io/api/presentation/4.0/example/uc08/scene/1/sculpture", + "type": "Annotation", + "motivation": ["painting"] , + "label": { + "en": ["A 1st century Roman portrait bust."] + }, + "body": + { + "id": "https://fixtures.iiif.io/3d/smk/venus.glb", + "type": "Model" + }, + "target": { + "id": "https://iiif.io/api/presentation/4.0/example/uc08/scene/1", + "type": "Scene" + } + } + ] + } + ] + } + ], + "annotations": [ + { + "id": "https://iiif.io/api/presentation/4.0/example/uc08/scene/1/commenting-annotation-pages/1", + "type": "AnnotationPage", + "items": [ + { + "id": "https://example.org/iiif/presentation/examples/commenting/anno/3", + "type": "Annotation", + "motivation": ["commenting"], + "body": + { + "id": "https://example.org/iiif/presentation/examples/commenting/anno/3/comment1", + "type": "TextualBody", + "language": "en", + "format": "text/plain", + "value": "This sculpture embodies the Hellenistic synthesis of idealised form and expressive naturalism that emerged in the late Greek period.", + "position": { + "type": "SpecificResource", + "source": { + "id": "https://iiif.io/api/presentation/4.0/example/uc08/scene/1", + "type": "Scene" + }, + "selector": [ + { + "type": "PointSelector", + "x": 0.75, + "y": 1.5, + "z": 0.1 + } + ] + } + }, + "target": { + "id": "https://iiif.io/api/presentation/4.0/example/uc08/scene/1", + "type": "Scene" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index f48720f3f..4049302ea 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -748,85 +748,7 @@ A commenting annotation can also reference a Content Resource, such as a Model, In some cases it is desirable to influence the client's positioning of the commenting annotation when rendered. This may be done to ensure that the annotation does not hide key visual elements or to ensure that the annotation itself is not obscured by resources painted in the Container, such as 3D models. In these cases, the [`position`][prezi-40-model-position] property may be used to define the position where a TextualBody should be rendered. The example shows a [`position`][prezi-40-model-position] that places the annotation at a specific coordinate within the Scene. The position is a [Specific Resource][prezi-40-model-SpecificResource] that requires a [`source`][prezi-40-model-source] and `selector`. -```jsonc -{ - "@context": "http://iiif.io/api/presentation/4/context.json", - "id": "https://example.org/iiif/manifest/commenting/manifest/3", - "type": "Manifest", - "label": { "en": ["1st Century Roman portrait bust with comment"] }, - "items": [ - { - "id": "https://example.org/iiif/scene/commenting/scene3", - "type": "Scene", - "items": [ - { - "id": "https://example.org/iiif/scene/commenting/scene3/painting-annotation-pages/1", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/scene/commenting/scene3/sculpture", - "type": "Annotation", - "motivation": ["painting"] , - "label": { - "en": ["A 1st century Roman portrait bust."] - }, - "body": - { - "id": "https://example.org/iiif/scene/commenting/models/portrait.gltf", - "type": "Model" - }, - "target": { - "id": "https://example.org/iiif/scene/commenting/scene3", - "type": "Scene" - } - } - ] - } - ] - } - ], - "annotations": [ - { - "id": "https://example.org/iiif/scene/commenting/scene3/commenting-annotation-pages/1", - "type": "AnnotationPage", - "items": [ - { - "id": "https://example.org/iiif/presentation/examples/commenting/anno/3", - "type": "Annotation", - "motivation": ["commenting"], - "body": - { - "id": "https://example.org/iiif/presentation/examples/commenting/anno/3/comment1", - "type": "TextualBody", - "language": "en", - "format": "text/plain", - "value": "This marble portrait exemplifies the veristic tradition that dominated Roman Republican portraiture and persisted into the early Imperial period.", - "position": { - "type": "SpecificResource", - "source": { - "id": "https://example.org/iiif/scene/commenting/scene3", - "type": "Scene" - }, - "selector": [ - { - "type": "PointSelector", - "x": 0.75, - "y": 1.5, - "z": 0.1 - } - ] - } - }, - "target": { - "id": "https://example.org/iiif/scene/commenting/scene3", - "type": "Scene" - } - } - ] - } - ] -} -``` +{% include code_example.html src="uc08_3d_annotation.json" %}