From dc1029af855784eb59e9f25c9f4762f1b5fa21ba Mon Sep 17 00:00:00 2001 From: Janine Liu Date: Tue, 4 Jun 2024 10:26:27 -0400 Subject: [PATCH] Add EXT_implicit_geometry --- .../Vendor/EXT_implicit_geometry/README.md | 193 ++++++++++++++++++ .../figures/non-uniform-box.png | Bin 0 -> 38752 bytes .../schema/box.schema.json | 30 +++ .../schema/cylinder.bounds.schema.json | 56 +++++ .../schema/cylinder.schema.json | 32 +++ .../schema/ellipsoid.bounds.schema.json | 52 +++++ .../schema/ellipsoid.schema.json | 31 +++ ...rimitive.EXT_implicit_geometry.schema.json | 46 +++++ .../schema/padding.schema.json | 36 ++++ .../schema/region.bounds.schema.json | 52 +++++ .../schema/region.schema.json | 37 ++++ .../schema/sphere.bounds.schema.json | 52 +++++ .../schema/sphere.schema.json | 26 +++ .../schema/box.schema.json | 22 +- ...primitive.EXT_primitive_voxels.schema.json | 16 +- 15 files changed, 655 insertions(+), 26 deletions(-) create mode 100644 extensions/2.0/Vendor/EXT_implicit_geometry/README.md create mode 100644 extensions/2.0/Vendor/EXT_implicit_geometry/figures/non-uniform-box.png create mode 100644 extensions/2.0/Vendor/EXT_implicit_geometry/schema/box.schema.json create mode 100644 extensions/2.0/Vendor/EXT_implicit_geometry/schema/cylinder.bounds.schema.json create mode 100644 extensions/2.0/Vendor/EXT_implicit_geometry/schema/cylinder.schema.json create mode 100644 extensions/2.0/Vendor/EXT_implicit_geometry/schema/ellipsoid.bounds.schema.json create mode 100644 extensions/2.0/Vendor/EXT_implicit_geometry/schema/ellipsoid.schema.json create mode 100644 extensions/2.0/Vendor/EXT_implicit_geometry/schema/mesh.primitive.EXT_implicit_geometry.schema.json create mode 100644 extensions/2.0/Vendor/EXT_implicit_geometry/schema/padding.schema.json create mode 100644 extensions/2.0/Vendor/EXT_implicit_geometry/schema/region.bounds.schema.json create mode 100644 extensions/2.0/Vendor/EXT_implicit_geometry/schema/region.schema.json create mode 100644 extensions/2.0/Vendor/EXT_implicit_geometry/schema/sphere.bounds.schema.json create mode 100644 extensions/2.0/Vendor/EXT_implicit_geometry/schema/sphere.schema.json diff --git a/extensions/2.0/Vendor/EXT_implicit_geometry/README.md b/extensions/2.0/Vendor/EXT_implicit_geometry/README.md new file mode 100644 index 0000000000..d634338346 --- /dev/null +++ b/extensions/2.0/Vendor/EXT_implicit_geometry/README.md @@ -0,0 +1,193 @@ +# EXT_implicit_geometry + +## Contributors +- Sean Lilley, Cesium +- Janine Liu, Cesium + +## Status +Draft + +## Dependencies +Written against the glTF 2.0 specification. + +## Overview + +This extension allows mesh primitives to represent renderable implicit surfaces. Typically, a glTF mesh primitive requires `attributes` that supply mesh data, and uses `mode` to indicate the mesh topology. With `EXT_implicit_geometry`, the primitive may omit these properties and instead use the extension to infer the implicit 3D volume. + +The following example illustrates how a primitive with this extension may represent an implicit box. + +``` +{ + "primitives": [ + { + "extensions": { + "EXT_implicit_geometry": { + "box": { + "size": [2, 2, 2] + } + } + } + } + ] +} +``` + +Primitives with this extension may still be affected by node transforms to position, orient, and scale the shape as needed. + +## Supported Geometry + +Currently, this extension supports the following implicit geometries: +- [`box`](#box) +- [`cylinder`](#cylinder) +- [`sphere`](#sphere) +- [`ellipsoid`](#ellipsoid) +- [`region`](#region) + +Only **one** shape may be defined at a time. + +By default, the implicit 3D volume is assumed to fill the entire shape specified in the extension. However, each shape allows an optional `slice` property to define the subsection of the shape in which the 3D volume is actually rendered. For instance, while the extension may define an implicit sphere, its `slice` can limit the volume to be only half of the full sphere. + +### Box + +The `box` property represents an axis-aligned box that is centered at the origin. The `size` property indicates its size in meters along the `x`, `y`, and `z` axes. + + + + + + + + + + +
+ Example + + Visual +
+    "primitives": [
+      {
+        "extensions": {
+          "EXT_implicit_geometry": {
+            "box": {
+              "size": [1, 0.5, 2],
+            }
+          }
+        }
+      }
+    ]
+    
+ +
+ +### Cylinder + +The `cylinder` property represents a cylinder that is aligned with the `y`-axis and centered at the origin. The `radius` and `height` properties indicate the dimensions of the cylinder in meters. + + + + + + + + + + +
+ Example + + Visual +
+    "primitives": [
+      {
+        "extensions": {
+          "EXT_implicit_geometry": {
+            "cylinder": {
+              "radius": 2,
+              "height": 3
+            }
+          }
+        }
+      }
+    ]
+    
+ **TODO** visual example +
+ +### Sphere + +The `sphere` property represents a sphere that is centered at the origin. The `radius` of the sphere is specified in meters. + + + + + + + + + + +
+ Example + + Visual +
+    "primitives": [
+      {
+        "extensions": {
+          "EXT_implicit_geometry": {
+            "sphere": {
+              "radius": 2,
+            }
+          }
+        }
+      }
+    ]
+    
+ **TODO** visual example +
+ +### Ellipsoid + +The `ellipsoid` property represents an ellipsoid that is centered at the origin. The `radii` property indicates the radii of the ellipsoid in meters along the `x`, `y`, and `z` axes. + +**TODO** visual example + + + + + + + + + + +
+ Example + + Visual +
+      "primitives": [
+        {
+          "extensions": {
+            "EXT_implicit_geometry": {
+              "ellpisoid": {
+                "radii": [2, 3, 4]
+              }
+            }
+          }
+        }
+      ]
+    
+ **TODO** visual example +
+``` + +### Region + +The `region` property represents a region above the surface of an ellipsoid. Though the ellipsoid itself is centered at the origin, the region may be distant from the origin due to its properties. + +The `semiMajorAxis` property indicates the radii of the ellipsoid in meters along the `x`, `y`, and `z` axes. + +## Optional vs. Required +This extension is required, meaning it should be placed in both the `extensionsUsed` list and `extensionsRequired` list. diff --git a/extensions/2.0/Vendor/EXT_implicit_geometry/figures/non-uniform-box.png b/extensions/2.0/Vendor/EXT_implicit_geometry/figures/non-uniform-box.png new file mode 100644 index 0000000000000000000000000000000000000000..065b7d8118a8492694b8a10bb4fa9e61ba769af5 GIT binary patch literal 38752 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

||2Tn$Ib(w;xRum7pW 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 OiIf!7<@3*&`u~3#YY9;R literal 0 HcmV?d00001 diff --git a/extensions/2.0/Vendor/EXT_implicit_geometry/schema/box.schema.json b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/box.schema.json new file mode 100644 index 0000000000..67c9d9600f --- /dev/null +++ b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/box.schema.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "box.schema.json", + "title": "Box", + "type": "object", + "description": "An implicit box centered at the local space origin.", + "allOf": [ + { + "$ref": "glTFProperty.schema.json" + } + ], + "properties": { + "size": { + "type": "array", + "description": "The size of the box in three dimensions.", + "items": { + "type": "number" + }, + "minItems": 3, + "maxItems": 3 + }, + "bounds": { + "$ref": "box.bounds.schema.json", + "description": "The optional bounds of the box." + } + }, + "required": [ + "size" + ] +} \ No newline at end of file diff --git a/extensions/2.0/Vendor/EXT_implicit_geometry/schema/cylinder.bounds.schema.json b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/cylinder.bounds.schema.json new file mode 100644 index 0000000000..296769a827 --- /dev/null +++ b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/cylinder.bounds.schema.json @@ -0,0 +1,56 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "cylinder.bounds.schema.json", + "title": "Cylinder Bounds", + "type": "object", + "description": "A set of bounds for an implicit cylinder surface. Defines the subsection of the cylinder that the implicit volume actually occupies.", + "allOf": [ + { + "$ref": "glTFProperty.schema.json" + } + ], + "properties": { + "minRadius": { + "type": "number", + "description": "The minimum radial bound of the cylinder.", + "minimum": 0, + "maximum": 1, + "default": 0 + }, + "maxRadius": { + "type": "number", + "description": "The maximum radial bound of the cylinder.", + "minimum": 0, + "maximum": 1, + "default": 1 + }, + "minHeight": { + "type": "number", + "description": "The minimum height bound of the cylinder.", + "minimum": 0, + "maximum": 1, + "default": 0 + }, + "maxHeight": { + "type": "number", + "description": "The maximum height bound of the cylinder.", + "minimum": 0, + "maximum": 1, + "default": 1 + }, + "minAngle": { + "type": "number", + "description": "The maximum angular bound of the cylinder in radians. Values must be in the range [-pi, pi].", + "minimum": -3.14159265359, + "maximum": 3.14159265359, + "default": -3.14159265359 + }, + "maxAngle": { + "type": "number", + "description": "The maximum angular bound of the cylinder in radians. Values must be in the range [-pi, pi].", + "minimum": -3.14159265359, + "maximum": 3.14159265359, + "default": 3.14159265359 + } + } +} \ No newline at end of file diff --git a/extensions/2.0/Vendor/EXT_implicit_geometry/schema/cylinder.schema.json b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/cylinder.schema.json new file mode 100644 index 0000000000..7d6c7759d2 --- /dev/null +++ b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/cylinder.schema.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "cylinder.schema.json", + "title": "Cylinder", + "type": "object", + "description": "An implicit cylinder centered at the local space origin.", + "allOf": [ + { + "$ref": "glTFProperty.schema.json" + } + ], + "properties": { + "radius": { + "type": "number", + "description": "The radius of the cylinder in local space.", + "minimum": 0 + }, + "height": { + "type": "number", + "description": "The height of the cylinder in local space.", + "minimum": 0 + }, + "bounds": { + "$ref": "cylinder.bounds.schema.json", + "description": "The optional bounds of the cylinder." + } + }, + "required": [ + "radius", + "height" + ] +} \ No newline at end of file diff --git a/extensions/2.0/Vendor/EXT_implicit_geometry/schema/ellipsoid.bounds.schema.json b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/ellipsoid.bounds.schema.json new file mode 100644 index 0000000000..39ca274197 --- /dev/null +++ b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/ellipsoid.bounds.schema.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "ellipsoid.bounds.schema.json", + "title": "Ellipsoid Bounds", + "type": "object", + "description": "A set of bounds for an implicit ellipsoid surface. Defines the subsection of the ellipsoid that the implicit volume actually occupies.", + "allOf": [ + { + "$ref": "glTFProperty.schema.json" + } + ], + "properties": { + "minRadius": { + "type": "number", + "description": "The minimum radial bound of the ellipsoid.", + "minimum": 0, + "maximum": 1, + "default": 0 + }, + "maxRadius": { + "type": "number", + "description": "The maximum radial bound of the ellipsoid.", + "minimum": 0, + "maximum": 1, + "default": 1 + }, + "minAngle": { + "type": "array", + "description": "The minimum angular bounds of the ellipsoid in radians. The first element corresponds to the azimuthal angle (a.k.a longitude) and must be in the range [-pi, pi]. The second element corresponds to the polar angle (a.k.a. latitude) and must be in the range [-pi/2, pi/2].", + "items": { + "type": "number", + "minimum": -3.14159265359, + "maximum": 3.14159265359, + }, + "minItems": 2, + "maxItems": 2, + "default": [-3.14159265359, -1.57079632679] + }, + "minAngle": { + "type": "array", + "description": "The maximum angular bounds of the ellipsoid in radians. The first element corresponds to the azimuthal angle (a.k.a longitude) and must be in the range [-pi, pi]. The second element corresponds to the polar angle (a.k.a. latitude) and must be in the range [-pi/2, pi/2].", + "items": { + "type": "number", + "minimum": -3.14159265359, + "maximum": 3.14159265359, + }, + "minItems": 2, + "maxItems": 2, + "default": [3.14159265359, 1.57079632679] + }, + } +} \ No newline at end of file diff --git a/extensions/2.0/Vendor/EXT_implicit_geometry/schema/ellipsoid.schema.json b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/ellipsoid.schema.json new file mode 100644 index 0000000000..6fa161c444 --- /dev/null +++ b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/ellipsoid.schema.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "ellipsoid.schema.json", + "title": "Ellipsoid", + "type": "object", + "description": "An implicit ellipsoid centered at the local space origin.", + "allOf": [ + { + "$ref": "glTFProperty.schema.json" + } + ], + "properties": { + "radii": { + "type": "array", + "description": "The radii of the ellipsoid in meters along the X, Y, and Z axes in local space.", + "items": { + "type": "number", + "minimum": 0 + }, + "minItems": 3, + "maxItems": 3 + }, + "bounds": { + "$ref": "ellipsoid.bounds.schema.json", + "description": "The optional bounds of the ellipsoid." + } + }, + "required": [ + "radii" + ] +} \ No newline at end of file diff --git a/extensions/2.0/Vendor/EXT_implicit_geometry/schema/mesh.primitive.EXT_implicit_geometry.schema.json b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/mesh.primitive.EXT_implicit_geometry.schema.json new file mode 100644 index 0000000000..7e68436f6a --- /dev/null +++ b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/mesh.primitive.EXT_implicit_geometry.schema.json @@ -0,0 +1,46 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "mesh.primitive.EXT_implicit_geometry.schema.json", + "title": "EXT_primitive_voxels glTF Mesh Primitive extension", + "type": "object", + "description": "`EXT_implicit_geometry` extension for a primitive in a glTF model, to define implicit 3D geometry", + "allOf": [ + { + "$ref": "glTFProperty.schema.json" + } + ], + "properties": { + "box": { + "$ref": "box.schema.json" + }, + "cylinder": { + "$ref": "cylinder.schema.json" + }, + "sphere": { + "$ref": "sphere.schema.json" + }, + "ellipsoid": { + "$ref": "ellipsoid.schema.json" + }, + "region": { + "$ref": "region.schema.json" + }, + }, + "oneOf": [ + { + "required": "box" + }, + { + "required": "cylinder" + }, + { + "required": "sphere" + }, + { + "required": "ellipsoid" + }, + { + "required": "region" + } + ] +} \ No newline at end of file diff --git a/extensions/2.0/Vendor/EXT_implicit_geometry/schema/padding.schema.json b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/padding.schema.json new file mode 100644 index 0000000000..ad94b3ed0c --- /dev/null +++ b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/padding.schema.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "padding.schema.json", + "title": "Padding", + "type": "object", + "description": "The padding property specifies how many rows of attribute data in each dimension come from neighboring grids.", + "allOf": [ + { + "$ref": "glTFProperty.schema.json" + } + ], + "properties": { + "before": { + "type": "array", + "items": { + "type": "integer", + "minimum": 0 + }, + "minItems": 3, + "maxItems": 3 + }, + "after": { + "type": "array", + "items": { + "type": "integer", + "minimum": 0 + }, + "minItems": 3, + "maxItems": 3 + } + }, + "required": [ + "before", + "after" + ] +} \ No newline at end of file diff --git a/extensions/2.0/Vendor/EXT_implicit_geometry/schema/region.bounds.schema.json b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/region.bounds.schema.json new file mode 100644 index 0000000000..911d3a54b3 --- /dev/null +++ b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/region.bounds.schema.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "region.bounds.schema.json", + "title": "Region Bounds", + "type": "object", + "description": "A set of bounds for an implicit region relative to an ellipsoid. Defines the subsection of the region that the implicit volume actually occupies.", + "allOf": [ + { + "$ref": "glTFProperty.schema.json" + } + ], + "properties": { + "minHeight": { + "type": "number", + "description": "The minimum height bound of the region.", + "minimum": 0, + "maximum": 1, + "default": 0 + }, + "maxHeight": { + "type": "number", + "description": "The maximum height bound of the region.", + "minimum": 0, + "maximum": 1, + "default": 1 + }, + "minAngle": { + "type": "array", + "description": "The minimum angular bounds of the region in radians. The first element corresponds to the azimuthal angle (a.k.a longitude) and must be in the range [-pi, pi]. The second element corresponds to the polar angle (a.k.a. latitude) and must be in the range [-pi/2, pi/2].", + "items": { + "type": "number", + "minimum": -3.14159265359, + "maximum": 3.14159265359, + }, + "minItems": 2, + "maxItems": 2, + "default": [-3.14159265359, -1.57079632679] + }, + "minAngle": { + "type": "array", + "description": "The maximum angular bounds of the region in radians. The first element corresponds to the azimuthal angle (a.k.a longitude) and must be in the range [-pi, pi]. The second element corresponds to the polar angle (a.k.a. latitude) and must be in the range [-pi/2, pi/2].", + "items": { + "type": "number", + "minimum": -3.14159265359, + "maximum": 3.14159265359, + }, + "minItems": 2, + "maxItems": 2, + "default": [3.14159265359, 1.57079632679] + }, + } +} \ No newline at end of file diff --git a/extensions/2.0/Vendor/EXT_implicit_geometry/schema/region.schema.json b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/region.schema.json new file mode 100644 index 0000000000..70b2b729eb --- /dev/null +++ b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/region.schema.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "region.schema.json", + "title": "Region", + "type": "object", + "description": "An implicit region defined relative to an ellipsoid that is centered at the local space origin.", + "allOf": [ + { + "$ref": "glTFProperty.schema.json" + } + ], + "properties": { + "semiMajorAxisRadius": { + "type": "number", + "description": "The radius of the reference ellipsoid along its semi-major axis in meters.", + "minimum": 0 + }, + "semiMinorAxisRadius": { + "type": "number", + "description": "The radius of the reference ellipsoid along its semi-minor axis in meters.", + "minimum": 0 + }, + "heightFromSurface": { + "type": "number", + "description": "The height of this region from the surface of the reference ellipsoid in meters.", + }, + "bounds": { + "$ref": "region.bounds.schema.json", + "description": "The optional bounds of the region." + } + }, + "required": [ + "semiMajorAxisRadius", + "semiMinorAxisRadius", + "heightFromSurface" + ] +} \ No newline at end of file diff --git a/extensions/2.0/Vendor/EXT_implicit_geometry/schema/sphere.bounds.schema.json b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/sphere.bounds.schema.json new file mode 100644 index 0000000000..32aa0deda3 --- /dev/null +++ b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/sphere.bounds.schema.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "sphere.bounds.schema.json", + "title": "Sphere Bounds", + "type": "object", + "description": "A set of bounds for an implicit sphere surface. Defines the subsection of the sphere that the implicit volume actually occupies.", + "allOf": [ + { + "$ref": "glTFProperty.schema.json" + } + ], + "properties": { + "minRadius": { + "type": "number", + "description": "The minimum radial bound of the sphere.", + "minimum": 0, + "maximum": 1, + "default": 0 + }, + "maxRadius": { + "type": "number", + "description": "The maximum radial bound of the sphere.", + "minimum": 0, + "maximum": 1, + "default": 1 + }, + "minAngle": { + "type": "array", + "description": "The minimum angular bounds of the sphere in radians. The first element corresponds to the azimuthal angle (a.k.a longitude) and must be in the range [-pi, pi]. The second element corresponds to the polar angle (a.k.a. latitude) and must be in the range [-pi/2, pi/2].", + "items": { + "type": "number", + "minimum": -3.14159265359, + "maximum": 3.14159265359, + }, + "minItems": 2, + "maxItems": 2, + "default": [-3.14159265359, -1.57079632679] + }, + "minAngle": { + "type": "array", + "description": "The maximum angular bounds of the sphere in radians. The first element corresponds to the azimuthal angle (a.k.a longitude) and must be in the range [-pi, pi]. The second element corresponds to the polar angle (a.k.a. latitude) and must be in the range [-pi/2, pi/2].", + "items": { + "type": "number", + "minimum": -3.14159265359, + "maximum": 3.14159265359, + }, + "minItems": 2, + "maxItems": 2, + "default": [3.14159265359, 1.57079632679] + }, + } +} \ No newline at end of file diff --git a/extensions/2.0/Vendor/EXT_implicit_geometry/schema/sphere.schema.json b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/sphere.schema.json new file mode 100644 index 0000000000..ff3184c476 --- /dev/null +++ b/extensions/2.0/Vendor/EXT_implicit_geometry/schema/sphere.schema.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "sphere.schema.json", + "title": "Sphere", + "type": "object", + "description": "An implicit sphere centered at the local space origin.", + "allOf": [ + { + "$ref": "glTFProperty.schema.json" + } + ], + "properties": { + "radius": { + "type": "number", + "description": "The radius of the sphere in local space.", + "minimum": 0 + }, + "bounds": { + "$ref": "sphere.bounds.schema.json", + "description": "The optional bounds of the sphere." + } + }, + "required": [ + "radius" + ] +} \ No newline at end of file diff --git a/extensions/2.0/Vendor/EXT_primitive_voxels/schema/box.schema.json b/extensions/2.0/Vendor/EXT_primitive_voxels/schema/box.schema.json index d77223606a..a348b0f690 100644 --- a/extensions/2.0/Vendor/EXT_primitive_voxels/schema/box.schema.json +++ b/extensions/2.0/Vendor/EXT_primitive_voxels/schema/box.schema.json @@ -3,32 +3,32 @@ "$id": "box.schema.json", "title": "Box", "type": "object", - "description": "The box property indicates that the voxels conform to a box-based grid. box.min and box.max represent the corners of the box grid in local coordinates.", + "description": "An implicit box surface centered at the local space origin.", "allOf": [ { "$ref": "glTFProperty.schema.json" } ], "properties": { - "min": { + "size": { "type": "array", + "description": "The size of the box in three dimensions.", "items": { "type": "number" }, "minItems": 3, "maxItems": 3 }, - "max": { - "type": "array", - "items": { - "type": "number" - }, - "minItems": 3, - "maxItems": 3 + "bounds": { + "allOf": [ + { + "$ref": "box.bounds.schema.json", + "description": "The optional bounds of the box." + } + ], } }, "required": [ - "min", - "max" + "size" ] } \ No newline at end of file diff --git a/extensions/2.0/Vendor/EXT_primitive_voxels/schema/mesh.primitive.EXT_primitive_voxels.schema.json b/extensions/2.0/Vendor/EXT_primitive_voxels/schema/mesh.primitive.EXT_primitive_voxels.schema.json index 812281bda2..61636d8a67 100644 --- a/extensions/2.0/Vendor/EXT_primitive_voxels/schema/mesh.primitive.EXT_primitive_voxels.schema.json +++ b/extensions/2.0/Vendor/EXT_primitive_voxels/schema/mesh.primitive.EXT_primitive_voxels.schema.json @@ -3,7 +3,7 @@ "$id": "mesh.primitive.EXT_primitive_voxels.schema.json", "title": "EXT_primitive_voxels glTF Mesh Primitive extension", "type": "object", - "description": "`EXT_primitive_voxels` extension for a primitive in a glTF model, to specify voxel grid geomtetry for volumetric data", + "description": "`EXT_primitive_voxels` extension for a primitive in a glTF model, to specify voxel grid geometry for volumetric data", "allOf": [ { "$ref": "glTFProperty.schema.json" @@ -20,25 +20,11 @@ "minItems": 3, "maxItems": 3 }, - "box": { - "$ref": "box.schema.json" - }, - "cylinder": { - "$ref": "cylinder.schema.json" - }, - "ellipsoid": { - "$ref": "ellipsoid.schema.json" - }, "padding": { "$ref": "padding.schema.json" } }, "required": [ "dimensions" - ], - "oneOf": [ - { "required": [ "box" ] }, - { "required": [ "cylinder" ] }, - { "required": [ "ellipsoid" ] } ] } \ No newline at end of file