diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md index 4c55a90aa..d395aa3d3 100644 --- a/source/presentation/4.0/index.md +++ b/source/presentation/4.0/index.md @@ -101,7 +101,7 @@ a:hover > code { margin-top: 0px; margin-bottom: 0px; text-align: left; - + } code.language-json { @@ -1194,7 +1194,7 @@ There are two types of Camera, [`PerspectiveCamera`][prezi-40-model-PerspectiveC ### Lights -There are four types of Light: AmbientLight, DirectionalLight, PointLight and SpotLight. They have a [`color`][prezi-40-model-color] and an [`intensity`][prezi-40-model-intensity]. SpotLight has an additional property of [`angle`][prezi-40-model-angle] that determines the spread of its light cone. +There are five types of Light: AmbientLight, DirectionalLight, ImageBasedLight, PointLight, and SpotLight. They have an [`intensity`][prezi-40-model-intensity] property, and all Lights except ImageBasedLight have a [`color`][prezi-40-model-color] property. ImageBasedLight has an additional property of [`environmentMap`][prezi-40-model-environment-map] that specifies the environment map image used to simulate lighting. SpotLight has an additional property of [`angle`][prezi-40-model-angle] that determines the spread of its light cone. PointLights and SpotLights can be painted at specific positions within the Scene. DirectionalLights, PointLights, and SpotLights have directional facing in the Scene that affects how light is casted. If the Scene has no Lights, then the client provides its own lighting as it sees fit. @@ -1388,7 +1388,7 @@ The Light is green and has a position, but has its default orientation of lookin > **Key Points** -* This example uses some of the Scene-Specific resources introduced in the next section. +* This example uses some of the Scene-Specific resources introduced in [3D Supporting Resources](#3d-supporting-resources). * A Point Selector explicitly places the model in the Scene via the Painting Annotation's [`target`][prezi-40-model-target] property. In the previous example, there was an implicit Point Selector placing the model at (0,0,0) because no explicit Point Selector was provided. * The provided Light should replace any default lighting the client might have. {: .note} @@ -1400,7 +1400,7 @@ Properties: [backgroundColor][prezi-40-model-backgroundColor], [lookAt][prezi-40 ## Use Case 6: Complex Scene -This example is a Manifest with a single Scene with multiple models painted into the Scene at specific positions with transforms applied. It represents a collection of chess game pieces with multiple pawns and a single queen. The example demonstrates painting multiple models into a Scene, including one Content Resource being painted into a Scene multiple times. Transforms and Point Selectors are used to establish position and scale for Annotations. Some external web resources referenced as Content Resources may include elements such as lights or audio that are undesirable within a Manifest, and the [`exclude`][prezi-40-model-exclude] property is used to prevent these from being rendered. The property [`interactionMode`][prezi-40-model-interactionMode] is used to guide clients in how to best guide or limit user interaction with rendered content. +This example is a Manifest with a single Scene with multiple models painted into the Scene at specific positions with transforms applied. It represents a collection of chess game pieces with multiple pawns and a single queen. The example demonstrates painting multiple models into a Scene, including one Content Resource being painted into a Scene multiple times. Transforms and Point Selectors are used to establish position and scale for Annotations. Some external web resources referenced as Content Resources may include elements such as lights or audio that are undesirable within a Manifest, and the [`exclude`][prezi-40-model-exclude] property is used to prevent these from being rendered. The property [`interactionMode`][prezi-40-model-interactionMode] is used to guide clients in how to best guide or limit user interaction with rendered content. This example also introduces an Image-Based Light Annotation to simulate real-world lighting of the chess game pieces. ```jsonc { @@ -1446,7 +1446,7 @@ This example is a Manifest with a single Scene with multiple models painted into }] }, { - "id": "https://example.org/iiif/3d/anno1", + "id": "https://example.org/iiif/3d/anno2", "type": "Annotation", "motivation": ["painting"], "body": [{ @@ -1490,7 +1490,7 @@ This example is a Manifest with a single Scene with multiple models painted into }] }, { - "id": "https://example.org/iiif/3d/anno1", + "id": "https://example.org/iiif/3d/anno3", "type": "Annotation", "motivation": ["painting"], "exclude": ["Audio", "Lights"], @@ -1528,6 +1528,26 @@ This example is a Manifest with a single Scene with multiple models painted into ] } ] + }, + { + "id": "https://example.org/iiif/3d/anno4", + "type": "Annotation", + "motivation": ["painting"], + "body": { + "id": "https://example.org/iiif/3d/lights/1", + "type": "ImageBasedLight", + "label": {"en": ["Image-Based Light"]}, + "environmentMap": { + "id": "https://example.org/iiif/light/3/environment.hdr", + "type": "Image", + "format": "image/vnd.radiance", + "profile": "equirectangular" + } + }, + "target": { + "id": "https://example.org/iiif/scene1/page/p1/1", + "type": "Scene" + } } ] } @@ -1542,6 +1562,7 @@ This example is a Manifest with a single Scene with multiple models painted into * Each Annotation is painted into the Scene at a different point via Point Selectors. * The second Annotation represents a pawn game piece that is tipped over, and Transforms are used to achieve this. RotateTransform is used to tip the pawn over and TranslateTransform is used to align the bottom of the pawn with the coordinate origin's XY plane. * The third Annotation represents a queen game piece that is scaled to be larger than the pawns using ScaleTransform. +* The fourth Annotation represents an Image-Based Light where an environment map texture image is used to simulate omnidirectional real-world light on the chess game pieces. * The [`exclude`][prezi-40-model-exclude] property instructs clients not to import or render any external audio or light content present in the Content Resource for the queen game piece. * The [`interactionMode`][prezi-40-model-interactionMode] property instructs clients that, if possible, user interactions relating to orbiting the scene should be restricted to a hemisphere. {: .note} diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md index a03a4aeeb..bfe29c729 100644 --- a/source/presentation/4.0/model.md +++ b/source/presentation/4.0/model.md @@ -300,7 +300,7 @@ All Collection Pages in a Collection, with the exception of the last page, _MUST __Properties__
A Collection Page _MUST_ have the following properties: [id](#id), [type](#type), [partOf](#partOf) and [items](#items)

-A Collection Page _SHOULD_ have the following properties: [next](#next), and [prev](#prev)

+A Collection Page _SHOULD_ have the following properties: [next](#next) and [prev](#prev)

A Collection Page _MAY_ have the following properties: [startIndex](#startIndex), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations). {: .note} @@ -334,8 +334,8 @@ Containers _SHOULD_ have an `items` property which is a list of Annotation Pages Containers specify extents in space and/or time with one or more space or time dimensions such as `height`, `width`, or `duration`. These dimensions allow resources to be associated with specific regions of the Canvas, within the space and/or time extents provided. Content _MUST NOT_ be associated with space or time outside of the Container's dimensions, such as at coordinates below 0,0 or greater than specified height or width for a Canvas, or before 0 seconds or after the duration for a Timeline. Content resources that have dimensions which are not defined for the Container _MUST NOT_ be associated with that Container by an Annotation that has the `motivation` value "painting". For example, it is valid to use an Annotation that has the `motivation` value "painting" to associate an Image (which has only height and width) with a Canvas that has `height`, `width`, and `duration` properties, but it is an error to associate a Video resource (which has height, width and duration) with a Canvas that does not `duration`. Such a resource _MAY_ instead be referenced using the rendering property, or by Annotations that have a `motivation` value other than "painting" in the annotations property. __Properties__
-All Containers _MUST_ have the following properties: [id](#id), and [type](#type)

-All Containers _SHOULD_ have the following properties: [label](#label), and [items](#items)

+All Containers _MUST_ have the following properties: [id](#id) and [type](#type).

+All Containers _SHOULD_ have the following properties: [label](#label), and [items](#items).

All Containers _MAY_ have the following properites: [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [canonical](#canonical), [via](#via), and [annotations](#annotations). {: .note} @@ -359,7 +359,7 @@ A Timeline _MUST_ have the following additional properties: [duration](#duration A Canvas is a Container that represents a particular rectangular 2 dimensional view and has content resources associated with it or with parts of it. This aspect ratio is defined by the `height` and `width` properties. The values of these properties are not pixels, but arbitrary square units into which pixel-based resources can be scaled. A Canvas _MAY_ also have a duration, given in the `duration` property, allowing audio and video to be correctly positioned in time as well as in the 2 dimensional space. __Properties__
-A Canvas _MUST_ have the following additional properties: [height](#height), and [width](#width).

+A Canvas _MUST_ have the following additional properties: [height](#height) and [width](#width).

A Canvas _MAY_ have the following additional properties: [duration](#duration). {: .note} @@ -510,7 +510,7 @@ A Canvas painted into a Scene has special requirements. The top-left corner of t A Scene painted into a Scene has one special requirement, that any `backgroundColor` of the Scene to be painted _SHOULD_ be ignored. __Properties__
-A Content Resource _MUST_ have the following properties: [id](#id), and [type](#type)

+A Content Resource _MUST_ have the following properties: [id](#id) and [type](#type).

A Content Resource _SHOULD_ have the following properties: [label](#label)

A Content Resource _MAY_ have the following properties: [height](#height), [width](#width), [duration](#duration), [language](#language), [format](#format), [fileSize](#fileSize),[metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [behavior](#behavior), [profile](#profile), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [canonical](#canonical), [via](#via), and [annotations](#annotations).

{: .note} @@ -531,7 +531,7 @@ Fragment Selectors use the fragment part of the URI specification to define a se For more information about Fragment Selectors, see the [Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#fragment-selector). __Properties__
-A Fragment Selector _MUST_ have the following properties: [type](#type), and [value](#value)

+A Fragment Selector _MUST_ have the following properties: [type](#type) and [value](#value).

A Fragment Selector _MAY_ have the following properties: [id](#id) and [conformsTo](#conformsTo).

{: .note} @@ -546,7 +546,7 @@ SVG Selectors use the [SVG specification](https://www.w3.org/TR/SVG11/) to defin For more information about SVG Selectors, see the [Web Annotation Data Model](https://www.w3.org/TR/annotation-model/#svg-selector). __Properties__
-An SVG Selector _MUST_ have the following properties: [type](#type), and [value](#value).

+An SVG Selector _MUST_ have the following properties: [type](#type) and [value](#value).

A Fragment Selector _MAY_ have the following properties: [id](#id).

{: .note} @@ -589,7 +589,7 @@ Well-known text, or WKT, is an ISO standard method for describing 2 and 3 dimens The text representation is given in the `value` property of the selector. __Properties__
-A WKT Selector _MUST_ have the following properties: [type](#type), and [value](#value).

+A WKT Selector _MUST_ have the following properties: [type](#type) and [value](#value).

A WKT Selector _MAY_ have the following properties: [id](#id) {: .note} @@ -676,7 +676,7 @@ The Image API Selector has properties following the parameters from the API, and | `rotation` | "0" | The string to put in the rotation parameter of the URI. Note that this must be a string in order to allow mirroring, for example "!90". | | `quality` | "default" | The string to put in the quality parameter of the URI. | | `format` | "jpg" | The string to put in the format parameter of the URI. Note that the '.' character is not part of the format, just the URI syntax. | -| `version` | "2.1" | The string representation of a published version number in "major.minor" form of the IIIF Image API. If the version given in the Selector differs from the version exposed by a Image API service, the client is expected to translate between versions as possible. | +| `version` | "2.1" | The string representation of a published version number in "major.minor" form of the IIIF Image API. If the version given in the Selector differs from the version exposed by a Image API service, the client is expected to translate between versions as possible. | __Properties__
A IIIF Image API Selector _MUST_ have the following properties: [type](#type).

@@ -705,8 +705,8 @@ Ranges _MUST_ have an HTTP(s) URI given in `id`. Top level Ranges are embedded o The included Containers and parts of Containers need not be contiguous or in the same order as in the Manifest's `items` property or any other Range. Examples include newspaper articles that are continued in different sections, a chapter that starts half way through a page, or time segments of a single canvas that represent different sections of a piece of music. __Properties__
-A Range _MUST_ have the following properties: [id](#id), and [type](#type).

-A Range _SHOULD_ have the following properties: [label](#label), and [items](#items)

. +A Range _MUST_ have the following properties: [id](#id) and [type](#type).

+A Range _SHOULD_ have the following properties: [label](#label) and [items](#items).

A Range _MAY_ have the following properties: [start](#start), [supplementary](#supplementary), [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail), [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [canonical](#canonical), [via](#via), and [annotations](#annotations). {: .note} @@ -739,7 +739,7 @@ All Cameras _MAY_ have the following properties: [id](#id), [label](#label), [lo An Orthographic Camera removes visual perspective, resulting in object size remaining constant regardless of its distance from the camera. __Properties__
-Orthographic Cameras _SHOULD_ have the following additional properties: [viewHeight](#viewHeight). +An Orthographic Camera _SHOULD_ have the following additional properties: [viewHeight](#viewHeight). {: .note} ```json @@ -764,7 +764,7 @@ The region of the Scene's space that is observable by the camera is bounded by t drawing of a geometrical frustrum truncated by near and far distances __Properties__
-Perspective Cameras _SHOULD_ have the following additional properties: [fieldOfView](#fieldOfView). +A Perspective Camera _SHOULD_ have the following additional properties: [fieldOfView](#fieldOfView). {: .note} {% include api/code_header.html %} @@ -785,12 +785,12 @@ It is necessary for there to be a Light within a Scene that illuminates the obje This specification does not define other aspects of Lights, such as the rate of decay of the intensity of the light over a distance, the maximum range of the light, or the penumbra of a cone. Implementation of these aspects is client-dependent. -The specification defines four types, or subclasses, of Light below. +The specification defines five types, or subclasses, of Light below. __Properties__
All Lights _MUST_ have the following properties: [type](#type).

-All Lights _SHOULD_ have the following properties: [color](#color), and [intensity](#intensity).

-All Lights _MAY_ have the following properties: [id](#id), and [label](#label). +All Lights _SHOULD_ have the following properties: [intensity](#intensity).

+All Lights _MAY_ have the following properties: [id](#id) and [label](#label). {: .note} @@ -800,6 +800,10 @@ All Lights _MAY_ have the following properties: [id](#id), and [label](#label). Ambient Light evenly illuminates all objects in the Scene, and does not have a direction or position. It does not have any new properties. The Light itself _MUST_ be added into the scene at a specific position, however this is only such that editing interfaces can render the object to the user. +__Properties__
+An Ambient Light _SHOULD_ have the following additional properties: [color](#color).

+{: .note} + {% include api/code_header.html %} ```json { @@ -818,7 +822,8 @@ Directional Lights emit their light in a specific direction as if infinitely far The light is emitted in the negative Y direction by default, thus straight down, but the orientation of the light can be altered with `lookAt` or with a `RotateTransform`. __Properties__
-Directional Lights _MAY_ have the following additional properties: [lookAt](#lookAt) +A Directional Light _SHOULD_ have the following additional properties: [color](#color).

+A Directional Light _MAY_ have the following additional properties: [lookAt](#lookAt).

{: .note} {% include api/code_header.html %} @@ -831,16 +836,49 @@ Directional Lights _MAY_ have the following additional properties: [lookAt](#loo } ``` +##### Image-Based Light +{: #ImageBasedLight} +> `"type": "ImageBasedLight"` + +Image-Based Lights illuminate objects in a Scene using lighting information derived from an image, typically a panoramic environment map. They simulate complex, realistic lighting without a specific direction or position. + +__Properties__
+An Image-Based Light _MUST_ have the following properties: [environmentMap](#environmentMap).

+{: .note} + +{% include api/code_header.html %} +```json +{ + "id": "https://example.org/iiif/light/3", + "type": "ImageBasedLight", + "environmentMap": { + "id": "https://example.org/iiif/light/3/environment.hdr", + "type": "Image", + "format": "image/vnd.radiance", + "profile": "equirectangular" + }, + "intensity": { + "type": "Quantity", + "quantityValue": 0.5, + "unit": "relative" + } +} +``` + ##### Point Light {: #PointLight} > `"type": "PointLight"` Point Lights emit in all directions from a single point within the Scene. +__Properties__
+A Point Light _SHOULD_ have the following additional properties: [color](#color).

+{: .note} + {% include api/code_header.html %} ```json { - "id": "https://example.org/iiif/light/3", + "id": "https://example.org/iiif/light/4", "type": "PointLight", "color": "#A0F0F0" } @@ -858,14 +896,14 @@ The Spot Light emits in the negative Y direction by default, but the orientation diagram of cone geometry showing how the angle of the cone is defined __Properties__
-Spot Lights _SHOULD_ have the following additional properties: [angle](#angle)

-Spot Lights _MAY_ have the following additional properties: [lookAt](#lookAt) +Spot Lights _SHOULD_ have the following additional properties: [color](#color) and [angle](#angle).

+Spot Lights _MAY_ have the following additional properties: [lookAt](#lookAt).

{: .note} {% include api/code_header.html %} ```json { - "id": "https://example.org/iiif/spotlight/1", + "id": "https://example.org/iiif/light/5", "type": "SpotLight", "angle": 15.0, "color": "#FFFFFF", @@ -1037,7 +1075,7 @@ The Agent is not intended to be used as a primary identifier for the person or o __Properties__
An Agent _MUST_ have the following properties: [type](#type) and [label](#label).

-An Agent _SHOULD_ have the following properties: [homepage](#homepage) and [logo](#logo)

. +An Agent _SHOULD_ have the following properties: [homepage](#homepage) and [logo](#logo).

An Agent _MAY_ have the following properties: [id](#id), [seeAlso](#seeAlso) and [summary](#summary). {: .note} @@ -1114,7 +1152,7 @@ For cross-version consistency, this specification defines the following values f Implementations _SHOULD_ be prepared to recognize the `@id` and `@type` property names used by older specifications, as well as `id` and `type`. Note that the `@context` key _SHOULD NOT_ be present within the `service`, but instead included at the beginning of the document. __Properties__
-A Service _MUST_ have the following properties: [id](#id), and [type](#type).

+A Service _MUST_ have the following properties: [id](#id) and [type](#type).

A Service _SHOULD_ have the following properties: [label](#label), [profile](#profile).

A Service _MAY_ have the following properties: [service](#service), `@id` and `@type`.

Services will also have specific requirements as to additional properties based on the type of service. @@ -1395,6 +1433,27 @@ The value _MUST_ be a positive floating point number. ``` +### environmentMap +{: #environmentMap} + +A content resource representing the environment map image used by an [ImageBasedLight](#ImageBasedLight). The image provides omnidirectional lighting information and may use high dynamic range (HDR) encoding. The projection type of the image, such as equirectangular or cubic, is specified via the `profile` property. + +The value _MUST_ be a JSON object representing an Image which _MUST_ have the `id`, `type`, and `profile` properties, and _SHOULD_ have the `format` property. + +* An Image-Based Light _MUST_ have the `environmentMap` property.
+ Clients _SHOULD_ process `environmentMap` on an Image-Based Light. + +{% include api/code_header.html %} +``` json-doc +"environmentMap": { + "id": "https://example.org/iiif/light/3/environment.hdr", + "type": "Image", + "format": "image/vnd.radiance", + "profile": "equirectangular" +} +``` + + ### exclude {: #exclude} @@ -1624,7 +1683,7 @@ When more than one interaction mode is present, the client _SHOULD_ pick the fir For interaction modes that involve a Camera orbiting around a target point, the target point _SHOULD_ be the same as the Camera's `lookAt` property. -If `action` is used to "disable" a Camera, then it is the same as if it were in the "locked" `interactionMode`. Thus a Camera can meaningfully be not hidden, selected, and disabled at the same time. +If `action` is used to "disable" a Camera, then it is the same as if it were in the "locked" `interactionMode`. Thus a Camera can meaningfully be not hidden, selected, and disabled at the same time. The value _MUST_ be an array of strings. @@ -2009,7 +2068,7 @@ The value of `placeholderContainer` _MUST_ be a JSON object with the `id` and `t ### position {: #position} -It is important to be able to position the body of an annotation within the Container's space that the annotation also targets. For example, a description of part of an image in a Canvas should be positioned such that it does not obscure the image region itself and labels to be displayed as part of a Scene should not be rendered such that the text is hidden by the three dimensional geometry of the model. If this property is not supplied, then the client should do its best to ensure the content is visible to the user. The body resource _MUST_ be either a `TextualBody` or a `SpecificResource`. +It is important to be able to position the body of an annotation within the Container's space that the annotation also targets. For example, a description of part of an image in a Canvas should be positioned such that it does not obscure the image region itself and labels to be displayed as part of a Scene should not be rendered such that the text is hidden by the three dimensional geometry of the model. If this property is not supplied, then the client should do its best to ensure the content is visible to the user. The body resource _MUST_ be either a `TextualBody` or a `SpecificResource`. The value of this property _MUST_ be a JSON object conforming to the `SpecificResource` pattern of the Web Annotation Model. The Specific Resource _MUST_ have a `source` property that refers to a Container, and a `selector` that describes a point or region within the Container. @@ -2065,13 +2124,23 @@ The value must be a JSON object, with the `id` and `type` properties. The value A schema or named set of functionality available from the resource. The profile can further clarify the `type` and/or `format` of an external resource or service, allowing clients to customize their handling of the resource that has the `profile` property. -The value _MUST_ be a string, either taken from the [profiles registry][registry-profiles] or a full URI. +When `profile` is used in a resource [referenced][prezi30-terminology] by the `environmentMap` property, the specification defines values in the table below for environment map projection types. Other values for additional projection types may be taken from the [profiles registry][registry-profiles] or as a full URI. + +The value _MUST_ be a string, either taken from the [profiles registry][registry-profiles], a full URI, or from the table below. +* Resources [referenced][prezi30-terminology] by the `environmentMap` property _MUST_ have the `profile` property.
+ Clients _SHOULD_ process the `profile` of an environment map. * Resources [referenced][prezi30-terminology] by the `seeAlso` or `service` properties _SHOULD_ have the `profile` property.
Clients _SHOULD_ process the `profile` of a service or external resource. * Other types of resource _MAY_ have the `profile` property.
Clients _MAY_ process the `profile` of other types of resource. +| Value | Description | +| ----- | ----------- | +| `equirectangular` | For environment map, the image uses equirectangular projection, mapping a full spherical environment onto a 2:1 rectangular image. | +| `cubic` | For environment map, the image uses cube map projection, representing the environment as six square faces of a cube. | +{: .api-table #table-profile} + {% include api/code_header.html %} ``` json-doc { "profile": "https://example.org/profile/statuary" } @@ -2311,7 +2380,7 @@ The machine actionable URIs for both Creative Commons licenses and RightsStateme ### rotation {: #rotation} -The value of the rotation parameter in the IIIF Image API URL structure, as recorded in an Image API Selector. +The value of the rotation parameter in the IIIF Image API URL structure, as recorded in an Image API Selector. The value _MUST_ be a string, not a number, in order to allow for the "!" character which indicates a mirror image. @@ -2841,7 +2910,7 @@ For compatibility with previous versions, clients _SHOULD_ accept `Sound` as a s The unit of measurement of a quantity expressed by a Quantity. -The value _MUST_ be a string value. This specification defines the values in the table below. Others may be registered via the IIIF unit registry. +The value _MUST_ be a string value. This specification defines the values in the table below. Others may be registered via the IIIF unit registry. > TODO: create registry and link it here @@ -2947,12 +3016,12 @@ The `value` property of the Quantity _MUST_ be between 0.0 and 1.0. {% include api/code_header.html %} ``` json-doc -{ - "volume": { - "type": "Quantity", +{ + "volume": { + "type": "Quantity", "quantityValue": 0.5, - "unit": "relative" - } + "unit": "relative" + } } ```