diff --git a/extensions/2.0/Vendor/MPEG_interactivity/README.md b/extensions/2.0/Vendor/MPEG_interactivity/README.md
new file mode 100644
index 0000000000..100b8265ba
--- /dev/null
+++ b/extensions/2.0/Vendor/MPEG_interactivity/README.md
@@ -0,0 +1,450 @@
+# MPEG Interactivity
+
+## Contributors
+
+* ISO/IEC SC29 WG3 (MPEG Systems) - Scene Description Breakout Group
+* Contacts
+ * Thomas Stockhammer (MPEG-I Scene Description BoG Chair, tsto@qti.qualcomm.com)
+
+## Status
+
+Based on [ISO/IEC DIS 23090-14 2nd Edition](https://www.iso.org/standard/90191.html)
+
+## Dependencies
+
+Written against the glTF 2.0 spec.
+
+## Overview
+
+Interactivity is supported at the scene level and at the node level through the definition of two extensions MPEG_scene_interactivity and MPEG_node_interactivity.
+When present, the MPEG_scene_interactivity extension shall be included as extension to the scene object.
+When present, the MPEG_node_interactivity extension shall be included as extension to a node object.
+The MPEG_node_interactivity extension is used to complement the interactivity extension defined at the scene level. One particular case is the definition of the parameters for a physics engine. That is, when an MPEG_node_interactivity extension contains a trigger of type TRIGGER_COLLISION without being referenced by a trigger of type TRIGGER_COLLISION at the MPEG_scene_interactivity extension, this node shall not be considered for collision detection and instead only be used by the physics engine.
+
+## Semantics
+
+### [Semantics at scene level](#semantics-at-scene-level-1)
+### [Semantics at node level](#semantics-at-node-level-1)
+
+### Semantics at scene level
+
+The semantic of the MPEG_scene_interactivity extension is based on the definition of trigger, action and behavior objects as shown in Table 1.
+
+Table 1: Semantic of the MPEG_scene_interactivity extension
+| Name | Type | Required | Default | Description |
+|--|--|--|--|--|
+| triggers | [`MPEG_scene_interactivity.trigger`](#reference-mpeg_scene_interactivity-trigger) `[1-*]` | ✓ Yes| | Contains the definition of all the triggers used in that scene. |
+| actions | [`MPEG_scene_interactivity.action`](#reference-mpeg_scene_interactivity-action) `[1-*]` | ✓ Yes| | Contains the definition of all the actions used in that scene. |
+| behaviors | [`MPEG_scene_interactivity.behavior`](#reference-mpeg_scene_interactivity-behavior) `[1-*]` | ✓ Yes| | Contains the definition of all the behaviors used in that scene. A behavior is composed of a pair of (triggers, actions), control parameters of triggers and actions, a priority weight and an optional interrupt action. |
+| physics | object | No | | Provides a set of parameters at scene level to be used for the physics simulation. The semantics of this object are given in table 2|
+
+
+Table 2: Semantic of a physics object
+| Name | Type | Required | Default | Description |
+|--|--|--|--|--|
+| recommendedPhysicsHighPrecision | Boolean | No | false | Determines whether the application should enable a more deterministic and precise physic simulation |
+| gravity | Number | No | -9.81 | Determine the gravity for the whole scene. In meter per second square (m.s-2) as defined in the international unit system. |
+| recommendedPhysicsFrameRate | Number | No | 50 | Provides the recommended frame rate at which the Physics Engine should operate. In frame per second as defined in the international unit system. |
+| bounceThreshold | number | No | 1 | A contact with a relative velocity below this threshold will not result in a bounce. In meter per second (m.s-1) as defined in the international unit system. |
+
+
+The semantic of a trigger is provided in Table 3.
+
+Table 3: Semantic of a trigger
+| Name | Type | Required | Default | Description |
+|--|--|--|--|--|
+| type | enumeration | ✓ Yes| | One element of Table 4 that defines the type of the trigger. |
+| if (type == TRIGGER_COLLISION){ | | | | |
+| nodes | array | ✓ Yes| | Indices of the nodes in the nodes array to be considered for collision determination. Any detection of collision shall activate the trigger |
+| primitives | array(Primitive) | No | N/A | List of primitives used to activate the proximity or collision trigger. Semantics of Primitive are presented in Table 4. |
+| } | | | | |
+| if (type == TRIGGER_PROXIMITY){ | | | | |
+| referenceNode | number | No | N/A | Index in the nodes array, of the node to consider for the proximity evaluation.In the absence of the referenceNode attribute, the active camera managed by the application shall be used. |
+| distanceLowerLimit | number | No | 0 | Threshold minimum in meters for the proximity calculation, based on the distance between the nodes and the referenceNode. |
+| distanceUpperLimit | number | ✓ Yes| | Threshold maximum in meters for the proximity calculation, based on the distance between the nodes and the referenceNode. |
+| nodes | array | ✓ Yes| | Indices of the nodes in the nodes array to be considered. All the nodes shall have a distance from the origin of their local space to the referenceNode above the distanceLowerLimit and below the distanceUpperLimit to activate the trigger |
+| primitives | array(Primitive) | No | N/A | List of primitives used to activate the proximity or collision trigger. Semantics of Primitive are presented in Table 5. |
+| } | | | | |
+| if (type== TRIGGER_USER_INPUT){ | | | | |
+| userInputDescription | string | ✓ Yes| | Describes the user body part and gesture related to the input. The format shall follow the OpenXR input path description as defined in [OpenXR] section 6. An example is: “/user/hand/left/grip”. |
+| nodes | array | No | N/A | Indices of the nodes in the nodes array to be considered for this user input. |
+| } | | | | |
+| if (type== TRIGGER_VISIBILITY){ | | | | |
+| cameraNode | number | ✓ Yes| | Index to the node containing a camera in the nodes array for which the visibilities are determined.The visibility trigger shall be evaluated only if the related camera is active. |
+| nodes | array | ✓ Yes| | Indices of the nodes in the nodes array to be considered. All the nodes shall be visible by the camera to activate the trigger. |
+| } | | | | |
+| extras { | object | No | N/A | |
+| multiUsers | object | No | N/A| Additional parameters to address a TRIGGER_USER_INPUT trigger involving multiple users. See [Table 24](#reference-mpeg_scene_interactivity-multiusers) for the semantics of this object. |
+| } | | | | |
+
+Table 4: type of trigger
+| Trigger type | Description |
+|--|--|
+| TRIGGER_COLLISION=0 | Collision Trigger |
+| TRIGGER_PROXIMITY | Proximity Trigger |
+| TRIGGER_USER_INPUT | User_Input Trigger |
+| TRIGGER_VISIBILITY | Visibility Trigger |
+
+
+Table 5: Semantics of MPEG_scene_interactive.trigger.primitive properties
+| Name | Type | Required | Default | Description |
+|--|--|--|--|--|
+| type | enumeration | No | BV_SPHEROID | Describes the type of primitive used to activate the proximity trigger. The available options are:BV_CUBOID = 0, BV_PLANE_REGION = 1, BV_CYLINDER_REGION = 2, BV_CAPSULE_REGION = 3,BV_SPHEROID = 4 The default is BV_SPHEROID. Semantics are presented in Table 6. |
+| boundary | number | No | 0.0 | Defines the region of intersection within the primitive. if zero, then all area of the primitive activates the trigger. Otherwise, the region of intersection decreases following the normal direction of all sides of the primitive from its centroid. For the capsule primitive, it should be applied over the radius, top, and base attributes. |
+| transformationMatrix | array | No | [1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0] | Floating-point 4x4 matrix that defines the initial orientation, translation, and scale of a primitive. Formatted in column-major order. The primitive shall follow x+ for width, y+ for height, z+ for length . The matrix transformation allows to transform any primitive after initialization. |
+
+Table 6: Semantical description of each primitive region
+| Name | Type | Required | Default | Description |
+|--|--|--|--|--|
+| if (type == BV_CUBOID) { | | | | |
+| width | number | ✓ Yes| | Width of the box. |
+| height | number | ✓ Yes| | Height of the box. |
+| length | number | ✓ Yes| | Length of the box. |
+| centroid | VEC3 | ✓ Yes| | Centroid 3D coordinate (x,y,z) of the cube. |
+| } | | | | |
+| if (type == BV_PLANE_REGION) { | | | | |
+| width | number | ✓ Yes| | Width of the plane. |
+| height | number | ✓ Yes| | Height of the plane. |
+| centroid | VEC2 | ✓ Yes| | Centroid 2D coordinate (x,y) or (x,z) or (y,z) of the plane. |
+| } | | | | |
+| if (type == BV_CYLINDER_REGION) { | | | | |
+| radius | number | ✓ Yes| | Radius of the cylinder. |
+| length | number | ✓ Yes| | Length of the cylinder. |
+| centroid | VEC3 | ✓ Yes| | Centroid 3D coordinate (x,y,z) of the cylinder |
+| } | | | | |
+| if (type == BV_CAPSULE_REGION) { | | | | |
+| radius | number | ✓ Yes| | Radius of the capsule. |
+| baseCentroid | VEC3 | ✓ Yes| | Centroid 3D coordinate (x,y,z) of the base semi-sphere of the capsule. |
+| topCentroid | VEC3 | ✓ Yes| | Centroid 3D coordinate (x,y,z) of the top semi-sphere of the capsule. |
+| } | | | | |
+| if (type == BV_SPHEROID) { | | | | |
+| radius | number | ✓ Yes| | Radius of the sphere. |
+| centroid | VEC3 | ✓ Yes| | Centre 3D coordinate (x,y,z) of the sphere. |
+| } | | | | |
+
+
+The semantic of an action is provided in Table 6.
+
+Table 7: Semantic of action
+| Name | Type | Required | Default | Description |
+|--|--|--|--|--|
+| type | enumeration | ✓ Yes| | One element of Table 8 that defines the type of the action. |
+| delay | number | No | 0.0 | Duration of delay in second before executing the action. |
+| if (type== ACTION_ACTIVATE){ | | | | |
+| activationStatus | enumeration | ✓ Yes| | ENABLED=0: the node shall be processed by the applicationDISABLED =1: the node shall be skipped by the application. |
+| nodes | array | ✓ Yes| | Indices of the nodes in the nodes array to set the activation status. |
+| } | | | | |
+| if (type== ACTION_TRANSFORM){ | | | | |
+| transform | | ✓ Yes| | A 4x4 transformation matrix to apply to the nodes. |
+| nodes | array | ✓ Yes| | Indices of the nodes in the nodes array to be transformed. |
+| } | | | | |
+| if (type== ACTION_BLOCK){ | | | | |
+| nodes | array | ✓ Yes| | Indices of the nodes in the nodes array to lock their related transforms. |
+| } | | | | |
+| if (type == ACTION_ANIMATION){ | | | | |
+| animation | number | ✓ Yes| | Index of the animation in the animations array to be considered. |
+| animationControl | enumeration | ✓ Yes| | One element of Table 9 that defines the control of the animation. |
+| } | | | | |
+| if (type == ACTION_MEDIA){ | | | | |
+| media | number | ✓ Yes| | Index of the media in the MPEG_media array to be considered. |
+| mediaControl | enumeration | ✓ Yes| | One element of Table 10 that defines the control of the media. |
+| } | | | | |
+| if (type == ACTION_MANIPULATE){ | | | | |
+| manipulateActionType | enumeration | ✓ Yes| | One element of Table 11 that defines the action manipulate type. |
+| axis | array | No | Up | (x,y,z) coordinates of the axis used for rotation and sliding. These coordinates are relative to the local space created by the user input described in the userInputDescription. For example a “/user/hand/left/pose” user input trigger creates a local space attached to the user left hand. |
+| userInputDescription | string | ✓ Yes| | Describe the user input related to the manipulation action. The format shall follow the OpenXR input path description as defined in [OpenXR] section 6. An example is: “/user/hand/left/aim/pose”. |
+| nodes | array | ✓ Yes| | Indices of the nodes in the nodes array to be manipulated. |
+| } | | | | |
+| if (type == ACTION_SET_MATERIAL){ | | | | |
+| material | number | ✓ Yes| | Index of the material in the materials array to apply to the set of nodes. |
+| nodes | array | ✓ Yes| | Indices of the nodes in the nodes array to set their material. |
+| } | | | | |
+| if (type == ACTION_HAPTIC){ | | | | |
+| hapticActionNodes | array(HapticActionNode) | ✓ Yes| | List of haptic action nodes as defined in Table 14. |
+| } | | | | |
+| if (type == ACTION_SET_AVATAR) { | | | | |
+| avatarAction | string | ✓ Yes| | The avatarAction is a URN that uniquely identifies the avatar action.For the MPEG reference Avatar, a set of avatar actions and their respective URNs is defined in Table H.4.3.2 of Annex H.For example, the URN “urn:mpeg:sd:2023:avatar:actionslist/speech” referenced in Table H.4.3.2 of Annex H sets the optional attributes “microphone” and “media”. Considering only the boolean attribute “microphone”, the nodes in the node array will activate/deactivate their “microphone” ability accordingly when this action is launched. |
+| nodes | array | ✓ Yes| | Indices of the nodes in the nodes array to launch their avatar actions. |
+| } | | | | |
+
+Table 8: Type of action
+| Action type | Description |
+|--|--|
+| ACTION_ACTIVATE=0 | Set activation status of a node |
+| ACTION_TRANSFORM | Set transform to a node |
+| ACTION_BLOCK | Block the transform of a node |
+| ACTION_ANIMATION | Select and control an animation |
+| ACTION_MEDIA | Select and control a media |
+| ACTION_MANIPULATE | Select a manipulate action |
+| ACTION_SET_MATERIAL | Set new material to nodes |
+| ACTION_HAPTIC | Get haptic feedbacks on a set of nodes |
+| ACTION_SET_AVATAR | Get avatar related actions |
+
+
+Table 9: Control of animation
+| Animation Control | Description |
+|--|--|
+| ANIMATION_PLAY=0 | Play the animation from time 0 or from any other time provided by a control. |
+| ANIMATION_PAUSE | Pause the animation |
+| ANIMATION_RESUME | Resume the animation from the last pause position. |
+| ANIMATION_STOP | Stop the animation |
+
+Table 10: control of media
+| Media Control | Description |
+|--|--|
+| MEDIA_PLAY=0 | Play the media from time 0 or from any other time provided by a control. |
+| MEDIA_PAUSE | Pause the media |
+| MEDIA_RESUME | Resume the media from the last pause position. |
+| MEDIA_STOP | Stop the media |
+
+Table 11: Action Manipulate Type
+| Action Manipulate Type | description |
+|--|--|
+| ACTION_MANIPULATE_FREE=0 | The nodes follow the user pointing device and its rotation. |
+| ACTION_MANIPULATE_SLIDE | The nodes move linearly along the provided axis by following the user pointing device. |
+| ACTION_MANIPULATE_TRANSLATE | The nodes translate by following the user pointing device. |
+| ACTION_MANIPULATE_ROTATE | The nodes rotate around the provided axis by following the user pointing device. |
+| ACTION_MANIPULATE_SCALE | Performs a central scaling of the nodes by following the user pointing device. |
+
+
+The semantics of a behavior is provided in Table 12.
+
+Table 12: semantic of behavior
+| Name | Type | Required | Default | Description |
+|--|--|--|--|--|
+| triggers | array | ✓ Yes| | Indices of the triggers in the triggers array considered for this behavior |
+| actions | array | ✓ Yes| | Indices of the actions in the actions array considered for this behavior. |
+| triggersCombinationControl | string | ✓ Yes| | Set of logical operations to apply to the triggersA ‘#’ indicates the trigger index, ‘&’ indicates a logical AND operation, ‘\|’ a logical OR operation and ‘\~’ a NOT operation. Parenthesis are used to group some operations. Such a syntax may give the following string: “#1&\~#2\|(#3)”.An empty string is understood as a logical OR between all the triggers.A regex expression (https://json-schema.org/understanding-json-schema/reference/regular_expressions.html) is specified in the JSON schema to validate this string. |
+| triggersActivationControl | enumeration | ✓ Yes| | Indicates when the combination of the triggers shall be activated for launching the actions. One element of Table 13 that defines when the combination of the triggers shall be activated for launching the actions. |
+| actionsControl | enumeration | ✓ Yes| | Defines the way to execute the defined actions.SEQUENTIAL=0: each defined action is executed sequentially in the order of the actions array.PARALLEL=1: the defined actions are executed concurrently. |
+| interruptAction | number | No | N/A | Index of the action in the actions array to be executed if the behavior is still on-going and is no more defined in a newly received scene update. |
+| priority | number | No | 0 | Integer value defining the priority associated to the behavior When several behaviors are in concurrence to affect the same node(s) at the same time, the behavior having the highest priority value shall be processed. The lower priority behavior(s) shall not be processed. In the case of behaviors having the same priority, the application should apply its own criteria. |
+
+Table 13:Trigger Activation Control
+| Trigger Activation Control | Description |
+|--|--|
+| TRIGGER_ACTIVATE_FIRST_ENTER=0 | Activated when the conditions are first met |
+| TRIGGER_ACTIVATE_EACH_ENTER | Activated each time the conditions are first met |
+| TRIGGER_ACTIVATE_ON | Activated as long as the conditions are met |
+| TRIGGER_ACTIVATE_FIRST_EXIT | Activated when the conditions are first no longer met |
+| TRIGGER_ACTIVATE_EACH_EXIT | Activated each time the conditions are no longer met |
+| TRIGGER_ACTIVATE_OFF | Activated as long as the conditions are not met |
+
+Table 14: Semantic of HapticActionNode object
+| Property | Type | Required | Default | Description |
+|--|--|--|--|--|
+| node | integer | ✓ Yes| | Identifier of the node in the glTF nodes array. |
+| hapticObject | integer | No | N/A | Index to a haptic object in the hapticObjects array of the MPEG_haptic extension. |
+| actionLocation | integer | No | 0xFFFFFFFF | Body part mask specifying where on the body the signal can be rendered.Possible values are detailed in Table 18. |
+| washout | boolean | No | False | Specifies whether the action should trigger a washout (reset to the origin) of the associated devices. |
+| useCollider | boolean | No | False | Used with a Collision trigger. If True, the rendering engine shall use collision information to estimate the desired location of the haptic feedback on the body. For haptic materials, the presentation engine retrieves the associated haptic texture media and generates haptic feedback based on texture information and collision position. If false, the signal shall be rendered based on the information specified in the Haptic file. |
+| materialHapticModality | array(enumeration) | No | N/A | List of haptic material modalities that shall be rendered. Possible values are detailed in Table 17. |
+| hapticActionMedias | array(HapticActionMedia) | ✓ Yes| | List of Haptic Action Media. |
+
+
+Table 15: Semantic of the HapticActionMedia object
+| Property | Type | Required | Default | Description |
+|--|--|--|--|--|
+| mediaIndex | integer | ✓ Yes| | Index in the accessors array of the associated haptic data. |
+| perceptionIndices | array(integer) | ✓ Yes| | Indices of the perceptions of the media that shall be rendered. If the list if empty all perceptions shall be rendered |
+| hapticModality | array(enumeration) | No | N/A | List of haptic modalities that can be rendered. Possible values are described in Table 16. |
+| hapticControl | enumeration | No | HAPTIC_PLAY | One element of Table 20 that defines the control of the haptic rendering. |
+| loop | boolean | No | False | Specifies if the haptic rendering of the data should be continuously looping. |
+
+Table 16: List of haptic modalities
+| Pressure = 0 |
+|--|
+| Acceleration |
+| Velocity |
+| Position |
+| Temperature |
+| Vibrotactile |
+| Water |
+| Wind |
+| Force |
+| Electrotactile |
+| Vibrotactile Texture |
+| Stiffness |
+| Friction |
+| Other |
+
+
+Table 17: List of haptic Material Modalities
+| Stiffness = 0 |
+|--|
+| Friction |
+| Vibrotactile Texture |
+| Temperature |
+| Vibration |
+| Custom |
+
+
+Table 18: Body part masks
+| | Name | Body_part_mask (binary) | Hexadecimal | Decimal |
+|--|--|--|--|--|
+| 0 | Unspecified | 00000000000000000000000000000000 | 0x00000000 | 0 |
+| 1 | Head Face | 00000000000000000000000000000001 | 0x00000001 | 1 |
+| 2 | Head Back/Neck/Ears | 00000000000000000000000000000010 | 0x00000002 | 2 |
+| 3 | Mouth Bag | 00000000000000000000000000000100 | 0x00000004 | 4 |
+| 4 | Lower Jaw | 00000000000000000000000000001000 | 0x00000008 | 8 |
+| 5 | Upper Jaw | 00000000000000000000000000010000 | 0x00000010 | 16 |
+| 6 | Eye Left | 00000000000000000000000000100000 | 0x00000020 | 32 |
+| 7 | Eye Right | 00000000000000000000000001000000 | 0x00000040 | 64 |
+| 8 | Chest Front | 00000000000000000000000010000000 | 0x00000080 | 128 |
+| 9 | Chest Back | 00000000000000000000000100000000 | 0x00000100 | 256 |
+| 10 | Upper Arm Left | 00000000000000000000001000000000 | 0x00000200 | 512 |
+| 11 | Lower Arm Left | 00000000000000000000010000000000 | 0x00000400 | 1 024 |
+| 12 | Hand Left | 00000000000000000000100000000000 | 0x00000800 | 2 048 |
+| 13 | Upper Arm Right | 00000000000000000001000000000000 | 0x00001000 | 4 096 |
+| 14 | Lower Arm Right | 00000000000000000010000000000000 | 0x00002000 | 8 192 |
+| 15 | Hand Right | 00000000000000000100000000000000 | 0x00004000 | 16 384 |
+| 16 | Abdomen Front | 00000000000000001000000000000000 | 0x00008000 | 32 768 |
+| 17 | Abdomen Back | 00000000000000010000000000000000 | 0x00010000 | 65 536 |
+| 18 | Upper Leg Left | 00000000000000100000000000000000 | 0x00020000 | 131 072 |
+| 19 | Lower Leg Left | 00000000000001000000000000000000 | 0x00040000 | 262 144 |
+| 20 | Foot Left | 00000000000010000000000000000000 | 0x00080000 | 524 288 |
+| 21 | Upper Leg Right | 00000000000100000000000000000000 | 0x00100000 | 1 048 576 |
+| 22 | Lower Leg Right | 00000000001000000000000000000000 | 0x00200000 | 2 097 152 |
+| 23 | Foot Right | 00000000010000000000000000000000 | 0x00400000 | 4 194 304 |
+| 24-32 | Reserved | 00000000010000000000000000000000 - 10000000000000000000000000000000 | 0x00800000 -0x80000000 | 8 388 608 - 2 147 483 648 |
+
+
+
+Table 19: Examples of body part combinations
+| Name | Body_part_mask (binary) | Hexadecimal | Decimal |
+|--|--|--|--|
+| Right arm | 00000000000000000111000000000000 | 0x00007000 | 28 672 |
+| Left arm | 00000000000000000000111000000000 | 0x00000E00 | 3 584 |
+| Right leg | 00000000011100000000000000000000 | 0x00700000 | 7 340 032 |
+| Left leg | 00000000000011100000000000000000 | 0x000E0000 | 917 504 |
+| Upper body | 00000000000000011111111111111111 | 0x0001FFFF | 131 071 |
+| Lower body | 00000000011111100000000000000000 | 0x007E0000 | 8 257 536 |
+| Full body | 11111111111111111111111111111111 | 0xFFFFFFFF | 4 294 967 295 |
+
+
+Table 20: List of Haptic controls
+| Haptic Control | Description |
+|--|--|
+| HAPTIC_PLAY = 0 | Start the rendering of the haptic data from time 0 or from any other time provided by a control |
+| HAPTIC_PAUSE | Pause the rendering of the haptic data |
+| HAPTIC_RESUME | Resume the rendering of the haptic data from the last pause position. |
+| HAPTIC_STOP | Stop the rendering of the haptic data |
+
+### Semantics at node level
+
+In complement to the interactivity objects defined in the glTF scene-level extension, some additional data could be provided at the level of the affected glTF nodes to specialize the trigger activation.
+The semantic of the MPEG_node_interactivity extension is shown in Table 20.
+
+Table 21: Semantic of the MPEG_node_interactivity extension
+| Name | Type | Required | Default | Description |
+|--|--|--|--|--|
+| triggers | array | ✓ Yes| | Array of node triggers (as defined in Table 22). Only distinct types are allowed.The minimum size of this array is 1, and the maximum size is size of trigger types as defined in this specification. |
+
+
+Table 22: Semantic of the MPEG_node_interactivity.trigger extension
+| Name | Type | Required | Default | Description |
+|--|--|--|--|--|
+| type | enumeration | ✓ Yes| | One element of Table 4 that defines the type of the trigger. |
+| if (type == TRIGGER_COLLISION){ | | | | |
+| collider | integer | ✓ Yes| | the index of the mesh element that provides the collider geometry for the current node.The collider mesh may reference a material. |
+| isStatic | boolean | ✓ Yes| | If True, the collider is defined as a static collider. |
+| physics | object | No | | Provides a set of parameters at node level to be used for physics simulation. The semantics of this object are given in table 23|
+| primitives | array(Primitive) | No | N/A | List of primitives used to activate the proximity or collision trigger. Semantics of Primitive are presented in Table 4. |
+| } | | | | |
+| } | | | | |
+| if (type == TRIGGER_PROXIMITY){ | | | | |
+| allowOcclusion | boolean | ✓ Yes| | Indicates if occlusion by other nodes should be considered |
+| upperDistanceWeight | number | No | 1 | The weight appliedto the distanceUpperLimit parameter defined at scene level |
+| lowerDistanceWeight | number | No | 1 | The weight appliedto the distanceLowerLimit parameter defined at scene level |
+| primitives | array(Primitive) | No | N/A | List of primitives used to activate the proximity or collision trigger. Semantics of Primitive are presented in Table 4. |
+| } | | | | |
+| if (type ==TRIGGER_USER_INPUT){ | | | | |
+| userInputParameters | array | ✓ Yes| | Provides additional information related to the user inputs (eg “max speed = 0.5”) |
+| } | | | | |
+| if (type== TRIGGER_VISIBILITY){ | | | | |
+| allowsPartialOcclusion | boolean | ✓ Yes| | The visibility computation shall take into account both the occultation by other node(s) and the camera frustrum. If the allowsPartialOcclusion Boolean is TRUE, then a partial visibility of this node activates the trigger.If the allowsPartialOcclusion Boolean is FALSE, then this node shall be fully in the camera frustrum and not be occluded by any other node(s) except the nodes listed in the nodes array to activate the trigger. |
+| nodes | array | No | N/A | Set of nodes that shall not be considered for the visibility computation, when the allowsPartialOcclusion is FALSE. |
+| mesh | number | No | N/A | Index of the mesh in the scene meshes array that will be used to compute visibility. |
+| } | | | | |
+
+
+Table 23: Semantic of a node level physics object
+| Name | Type | Required | Default | Description |
+|--|--|--|--|--|
+| needPreciseCollisionDetection | Boolean | No | false | If true, the physics engine should handle the collision detection more accurately by increasing the detection rate for this node. |
+| linearDamping | Number | No | 0 | A non-negative value, in second-1 (s-1), as defined in the international unit system. It defines the linear drag coefficient which corresponds to the rate of decrease of the linear velocity over time. It is used to compute a new velocity value V(t) at each simulation step (dt):V(t+dt) = V(t)*(1-linearDamping*dt), the velocity being clamped to 0. |
+| angularDamping | number | No | 0 | A non-negative value, in second-1 (s-1), as defined in the international unit system. It defines the angular drag coefficient which corresponds to the rate of decrease of the angular velocity over time. It is used to compute a new velocity value V(t) at each simulation step (dt):V(t+dt) = V(t)*(1-angularDamping*dt), the velocity being clamped to 0. |
+| useGravity | boolean | ✓ Yes| | Indicates if the gravity affects the object |
+| mass | number | ✓ Yes| | Mass of the object in kilogram as defined in the international unit system.. |
+| restitution | number | ✓ Yes| | Provides the ratio of the final to initial relative velocity between two objects after they collide. |
+| staticFriction | number | ✓ Yes| | Unitless friction coefficient as defined in the Coulomb friction model. Friction is the quantity which prevents surfaces from sliding off each other. StaticFriction is used when the object is lying still. It will prevent the object from starting to move. |
+| dynamicFriction | number | ✓ Yes| | Unitless friction coefficient as defined in the Coulomb friction model. When a large enough force is applied to the object, the dynamicFriction is used, and will attempt to slow down the object while in contact with another. |
+
+
+Table 24: Semantic of a multiUsers object
+| Name | Type | Required | Default | Description |
+|--|--|--|--|--|
+| multiCondition | integer | No | 0 | If ALL (0), the trigger’s condition must be met by all the users. If ONLYN (1), the trigger’s condition must be met by exactly N users. If ATLEASTN (2), the trigger’s condition must be met by at least N users. |
+| duration | number | No | 2 | Give a time duration, in second. After the trigger condition is met by a first user, it specifies a time window during which the multiCondition must be met. |
+| number | number | No | 1 | Give the number of users when condition is ONLYN or ATLEASTN.|
+
+
+## Processing model
+
+When a scene description file becomes available, the Presentation Engine
+* parses the related glTF file
+* creates each behavior composed of triggers and actions described at the interactivity scene level extension
+* specializes the trigger for each affected node with the additional data provided at the interactivity node level extension if present
+At runtime, the presentation Engine iterates on each behavior and performs the following tasks:
+* checks the activation status of each trigger of this behavior by following the procedure detailed in the figure below,
+* checks the logical combination of these trigger status,
+* if this status satisfies the triggersActivationControl value, launches the corresponding actions.
+
+
+
+processing model for the activation of a single trigger.
+
+
+When several behaviors are in concurrence to affect the same node(s) at the same time, the behavior having the highest priority value shall be processed. The lower priority behavior(s) shall not be processed. In the case of behaviors having the same priority, the application should apply its own criteria.
+When a new scene description update is received, the application follows the procedure detailed in the figure below. An on-going behavior corresponds to a behavior:
+* having its triggers status verifying the triggersActivationControl value for that frame,
+* or having previously launched a play action related to a media/animation,
+* or having previously launched an action with a delay not yet expired.
+To check if the behavior is still defined, the application should check if the scene description update leads to:
+* removal of this behavior in the behaviors array.
+* modification of any parameter of this behavior (e.g. by adding a new trigger, by changing the trigger activation control,…).
+* removal of any of the referenced nodes by the action.
+The application shall process the interrupt action only if the timing requirement of the scene description update is met.
+
+
+
+Processing model when a new scene description update is received.
+
+
+If the scene description document contains a description of physics properties based on another physics model, then that physics model shall take precedence in the processing of the scene.
+
+Otherwise, the application shall handle a physics simulation if the usePhysics Boolean is TRUE on any of the collision trigger extensions defined at the node level. When a collision occurs between two nodes, the application should calculate the combination of the restitution, static friction and dynamic friction values based on the values provided by the collision trigger extension of the two nodes.
+
+For a scene level trigger specifies multiUsers parameter, the trigger must be evaluated for all the users and the actions associated with the trigger must be performed acording to the parameter.
+
+## Schema
+
+* **JSON schema**: [MPEG_scene_interactivity.schema.json](./schema/MPEG_interactivity.schema.json)
+* **JSON schema**: [MPEG_node_interactivity.schema.json](./schema/MPEG_node_interactivity.schema.json)
+
+## Known Implementations
+
+* [ISO/IEC WD 23090-24](https://www.iso.org/standard/83696.html)
+
+## Resources
+
+* [ISO/IEC DIS 23090-14 2nd Edition](https://www.iso.org/standard/90191.html), Information technology — Coded representation of immersive media — Part 14: Scene Description
+* [ISO/IEC WD 23090-24](https://www.iso.org/standard/83696.html), Information technology — Coded representation of immersive media — Part 24: Conformance and Reference Software for Scene Description for MPEG Media
+
+## License
+
+Copyright ISO/IEC 2025
+
+The use of the "MPEG scene description extensions" is subject to the license as accessible here: https://standards.iso.org/ and is subject to the IPR policy as accessible here: https://www.iso.org/iso-standards-and-patents.html.
+
+
diff --git a/extensions/2.0/Vendor/MPEG_interactivity/figures/activation.png b/extensions/2.0/Vendor/MPEG_interactivity/figures/activation.png
new file mode 100644
index 0000000000..268789886d
Binary files /dev/null and b/extensions/2.0/Vendor/MPEG_interactivity/figures/activation.png differ
diff --git a/extensions/2.0/Vendor/MPEG_interactivity/figures/update.png b/extensions/2.0/Vendor/MPEG_interactivity/figures/update.png
new file mode 100644
index 0000000000..715b15c02b
Binary files /dev/null and b/extensions/2.0/Vendor/MPEG_interactivity/figures/update.png differ
diff --git a/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.action.schema.json b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.action.schema.json
new file mode 100644
index 0000000000..3442bd96aa
--- /dev/null
+++ b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.action.schema.json
@@ -0,0 +1,271 @@
+{
+ "$schema" : "http://json-schema.org/draft-07/schema",
+ "title" : "MPEG_scene_interactivity.action object",
+ "type" : "object",
+ "description" : "glTF extension to specify action formats at scene level",
+ "properties" : {
+ "type" : {
+ "type": "integer",
+ "enum": [0,1,2,3,4,5,6,7,8],
+ "description": "Type of the action.",
+ "gltf_detailedDescription":"Value is oneOf ACTION_ACTIVATE = 0, ACTION_TRANSFORM = 1, ACTION_BLOCK = 2, ACTION_ANIMATION = 3, ACTION_MEDIA = 4, ACTION_MANIPULATE = 5, ACTION_SET_MATERIAL = 6, ACTION_HAPTIC = 7, ACTION_SET_AVATAR = 8 and can be extended"
+ },
+ "delay":{
+ "type": "number",
+ "default": 0.0,
+ "description": "Duration of delay in second before executing the action"
+ },
+ "activationStatus":{
+ "type": "integer",
+ "enum":[0,1],
+ "description":"Indicates if the node shall be processed or skipped by the application",
+ "gltf_detailedDescription":"Value is oneOf ENABLED = 0, DISABLED = 1"
+ },
+ "transform":{
+ "type":"array",
+ "items":{ "type":"number"},
+ "minItems": 16,
+ "maxitem": 16,
+ "description":"4x4 transformation matrix to apply to the nodes."
+ },
+ "animation": {
+ "type": "integer",
+ "description":"Index of the animation in the animations array to be considered "
+ },
+ "animationControl":{
+ "type": "integer",
+ "enum":[0,1,2,3],
+ "description":"Defines the control of the animation.",
+ "gltf_detailedDescription":"Value is oneOf ANIMATION_PLAY = 0, ANIMATION_PAUSE = 1, ANIMATION_STOP = 2, ANIMATION_RESUME = 3 and can be extended"
+ },
+ "media": {
+ "type": "integer",
+ "description":"Index of the media in the MPEG media array to be considered"
+ },
+ "mediaControl":{
+ "type": "integer",
+ "enum": [0,1,2,3],
+ "description":"Defines the control of the media.",
+ "gltf_detailedDescription":"Value is oneOf MEDIA_PLAY = 0, MEDIA_PAUSE = 1, MEDIA_STOP = 2, MEDIA_RESUME = 3 and can be extended"
+ },
+ "axis": {
+ "type": "array",
+ "items": { "type":"number"},
+ "default": [0.0, 1.0, 0.0],
+ "minItems": 3,
+ "maxItems": 3,
+ "description":"Coordinates of the axis used for rotation and sliding"
+ },
+ "manipulateActionType": {
+ "type": "integer",
+ "enum": [0,1,2,3,4],
+ "description":"Defines the manipulate type.",
+ "gltf_detailedDescription":"Value is oneOf ACTION_MANIPULATE_FREE = 0, ACTION_MANIPULATE_SLIDE = 1, ACTION_MANIPULATE_TRANSLATE = 2, ACTION_MANIPULATE_ROTATE = 3,ACTION_MANIPULATE_SCALE = 4 and can be extended"
+ },
+ "userInputDescription": {
+ "type": "string",
+ "description":"Describe the user input related to the manipulation action. ",
+ "gltf_detailedDescription":"The format shall follow the OpenXR input path description. An example is: /user/hand/left/aim/pose."
+ },
+ "material": {
+ "type": "integer",
+ "description":"Index of the material in the materials array to apply to the set of nodes"
+ },
+ "nodes": {
+ "type": "array",
+ "items":{ "type":"integer"},
+ "minItems": 1,
+ "description": "Indices of the nodes in the nodes array to be considered"
+ },
+ "hapticActionNodes": {
+ "type": "array",
+ "items":{ "$ref" : "MPEG_scene_interactivity.hapticActionNode.schema.json"},
+ "minItems": 1,
+ "description": "Array of hapticActionNodes"
+ },
+ "avatarAction":{
+ "type": "string",
+ "description":"The avatarAction is provided by a URN that uniquely identifies the avatar action."
+ },
+ "authorised": {
+ "type": "array",
+ "items": {"type": "string"},
+ "description": "Required when type=ACTION_SET_AVATAR and avatarAction='urn:mpeg:sd:2023:avatar:actionslist/social'. Defines avatar social actions."
+ },
+ "permissionId": {
+ "type": "string",
+ "description": "Required when type=ACTION_SET_AVATAR and avatarAction='urn:mpeg:sd:2023:avatar:actionslist/restricted'. Unique string identifier that restricts interaction between nodes without an equal permission_id."
+ },
+ "age": {
+ "type": "integer",
+ "description": "Required when type=ACTION_SET_AVATAR and avatarAction='urn:mpeg:sd:2023:avatar:actionslist/parental'. Minimum age recommendation for users given the content of the list of nodes."
+ },
+ "descriptors": {
+ "type": "array",
+ "items": {"type": "string"},
+ "description": "Required when type=ACTION_SET_AVATAR and avatarAction='urn:mpeg:sd:2023:avatar:actionslist/parental'. Adds additional explicit semantics of the content present in the list of nodes."
+ },
+ "microphone": {
+ "type": "boolean",
+ "description": "Required when type=ACTION_SET_AVATAR and avatarAction='urn:mpeg:sd:2023:avatar:actionslist/speech'. Indicates if the user uses a microphone type of input device for audio."
+ },
+ "capabilities": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Required when type=ACTION_SET_AVATAR and avatarAction='urn:mpeg:sd:2023:avatar:actionslist/capabilities'. Defines the capabilities of an avatar/object."
+ },
+ "disabilities": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Required when type=ACTION_SET_AVATAR and avatarAction='urn:mpeg:sd:2023:avatar:actionslist/disabilities'. Defines the disabilities of an avatar/object."
+ },
+ "extensions": {},
+ "extras": {}
+ },
+ "allOf": [
+ { "$ref" : "glTFProperty.schema.json" },
+ {
+ "if": {
+ "properties": { "type": { "const": 0, "description":"ACTION_ACTIVATE"} },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["activationStatus","nodes"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 1,"description":"ACTION_TRANSFORM" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["transform","nodes"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 2,"description":"ACTION_BLOCK" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["nodes"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 3, "description":"ACTION_ANIMATION" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["animation","animationControl"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 4,"description":"ACTION_MEDIA" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["media","mediaControl"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 5, "description":"ACTION_MANIPULATE" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["manipulateActionType","userInputDescription","nodes"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 6,"description":"ACTION_SET_MATERIAL" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["material","nodes"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 7,"description":"ACTION_HAPTIC" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["hapticActionNodes"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 8,"description":"ACTION_SET_AVATAR" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["avatarAction"],
+ "allOf": [
+ { "$ref" : "glTFProperty.schema.json" },
+ {
+ "if": {
+ "properties": { "avatarAction": { "const": "urn:mpeg:sd:2023:avatar:actionslist/social" } },
+ "required": ["avatarAction"]
+ },
+ "then": {
+ "required": ["authorised", "nodes"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "avatarAction": { "const": "urn:mpeg:sd:2023:avatar:actionslist/restricted" } },
+ "required": ["avatarAction"]
+ },
+ "then": {
+ "required": ["permissionId", "nodes"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "avatarAction": { "const": "urn:mpeg:sd:2023:avatar:actionslist/parental" } },
+ "required": ["avatarAction"]
+ },
+ "then": {
+ "required": ["age", "descriptors", "nodes"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "avatarAction": { "const": "urn:mpeg:sd:2023:avatar:actionslist/speech" } },
+ "required": ["avatarAction"]
+ },
+ "then": {
+ "required": ["nodes"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "avatarAction": { "const": "urn:mpeg:sd:2023:avatar:actionslist/capabilities" } },
+ "required": ["avatarAction"]
+ },
+ "then": {
+ "required": ["capabilities", "nodes"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "avatarAction": { "const": "urn:mpeg:sd:2023:avatar:actionslist/disabilities" } },
+ "required": ["avatarAction"]
+ },
+ "then": {
+ "required": ["disabilities", "nodes"]
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "required":["type"]
+}
\ No newline at end of file
diff --git a/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.behavior.schema.json b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.behavior.schema.json
new file mode 100644
index 0000000000..86c21a84b3
--- /dev/null
+++ b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.behavior.schema.json
@@ -0,0 +1,50 @@
+{
+ "$schema" : "http://json-schema.org/draft-07/schema",
+ "title" : "MPEG_scene_interactivity.behavior object",
+ "type" : "object",
+ "description" : "glTF extension to specify behavior formats at scene level",
+ "properties" : {
+ "triggers" : {
+ "type": "array",
+ "items":{"type":"integer"},
+ "minItems": 1,
+ "description": "Indices of the triggers in the triggers array considered for this behavior"
+ },
+ "actions" : {
+ "type": "array",
+ "items":{"type":"integer"},
+ "minItems": 1,
+ "description": "Indices of the actions in the actions array considered for this behavior"
+ },
+ "triggersCombinationControl":{
+ "type":"string",
+ "pattern":"([~&|]{0,2}[(]*[~]?#[0-9][)]*)+",
+ "description":"Set of logical operations to apply to the triggers. Example:((#1|#2)&(~#3|#4))|#5."
+ },
+ "triggersActivationControl":{
+ "type":"integer",
+ "enum":[0,1,2,3,4,5],
+ "description":"Indicates when the combination of the triggers shall be activated for launching the actions",
+ "gltf_detailedDescription":"Value is oneOf TRIGGER_ACTIVATE_FIRST_ENTER = 0, TRIGGER_ACTIVATE_EACH_ENTER = 1, TRIGGER_ACTIVATE_ON = 2, TRIGGER_ACTIVATE_FIRST_EXIT = 3, TRIGGER_ACTIVATE_EACH_EXIT = 4, TRIGGER_ACTIVATE_OFF = 5 and can be extended"
+ },
+ "actionsControl":{
+ "type":"integer",
+ "enum":[0,1],
+ "description":"Defines the way to execute the defined actions",
+ "gltf_detailedDescription":"Value is oneOf SEQUENTIAL = 0, PARALLEL = 1"
+ },
+ "interruptAction":{
+ "type":"integer",
+ "description":"Index of the action in the actions array to be executed if the behavior is still on-going and is no more defined in a newly received scene update"
+ },
+ "priority":{
+ "type":"number",
+ "default": 0,
+ "description": "Defines the priority associated to the behavior.",
+ "gltf_detailedDescription": "When several behaviors are in concurrence to affect the same node(s) at the same time, the behavior having the highest priority value shall be processed. The lower priority behavior(s) shall not be processed."
+ },
+ "extensions": {},
+ "extras": {}
+ },
+ "required":["triggers","actions","triggersCombinationControl","triggersActivationControl","actionsControl"]
+}
\ No newline at end of file
diff --git a/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.hapticActionMedia.schema.json b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.hapticActionMedia.schema.json
new file mode 100644
index 0000000000..4ad0533eaf
--- /dev/null
+++ b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.hapticActionMedia.schema.json
@@ -0,0 +1,44 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema",
+ "title": "MPEG_scene_interactivity.hapticActionMedia object",
+ "type": "object",
+ "properties": {
+ "mediaIndex": {
+ "type": "integer",
+ "description": "Index in the accessors array of the associated haptic data."
+ },
+ "perceptionIndices": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ },
+ "description": "Indices of the perceptions of the media that shall be rendered. If the list is empty, all perceptions shall be rendered."
+ },
+ "hapticModality": {
+ "type": "array",
+ "enum": [0,1,2,3,4,5],
+ "items": {
+ "type": "integer"
+ },
+ "description": "List of haptic modalities that can be rendered.",
+ "gltf_detailedDescription": "Value is oneOf Stiffness = 0, Friction = 1,Vibrotactile Texture = 2, Temperature = 3,Vibration = 4, Custom = 5"
+
+ },
+ "hapticControl": {
+ "type": "integer",
+ "enum": [0,1,2,3],
+ "default": 0,
+ "description": "Defines the control for the rendering of haptic data.",
+ "gltf_detailedDescription": "Value is oneOf HAPTIC_PLAY = 0, HAPTIC_PAUSE = 1,HAPTIC_RESUME = 2, HAPTIC_STOP = 3."
+ },
+ "loop": {
+ "type": "boolean",
+ "description": "Specifies if the haptic rendering of the data should be continuously looping.",
+ "default": false
+ }
+ },
+ "required": [
+ "mediaIndex",
+ "perceptionIndices"
+ ]
+}
\ No newline at end of file
diff --git a/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.hapticActionNode.schema.json b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.hapticActionNode.schema.json
new file mode 100644
index 0000000000..1bd4961751
--- /dev/null
+++ b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.hapticActionNode.schema.json
@@ -0,0 +1,51 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema",
+ "title": "MPEG_scene_interactivity.hapticActionNode object",
+ "type": "object",
+ "properties": {
+ "node": {
+ "type": "integer",
+ "description": "Index of the node in the nodes array to launch their haptic feedbacks"
+ },
+ "hapticObject": {
+ "type": "integer",
+ "description": "Index to a haptic object in the hapticObjects array of the MPEG_haptic extension."
+ },
+ "materialHapticModality": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "enum": [0,1,2,3,4,5],
+ "description": "List of haptic material modalities that shall be rendered.",
+ "gltf_detailedDescription": "Value is oneOf Stiffness = 0, Friction = 1,Vibrotactile Texture = 2,Temperature = 3, Vibration = 4,Custom = 5"
+ }
+ },
+ "actionLocation": {
+ "type": "integer",
+ "description": "Body part mask specifying where on the body the signal can be rendered.",
+ "minimum": 0
+ },
+ "washout": {
+ "type": "boolean",
+ "default": false,
+ "description": "Specifies whether the action should trigger a washout (reset to the origin or neutral position) of the associated devices."
+ },
+ "useCollider": {
+ "type": "boolean",
+ "default": false,
+ "description": "Used with a Collision trigger. If True, the rendering engine shall use collision information to estimate the desired location of the haptic feedback on the body. If false, the signal shall be rendered based on the information specified in the Haptic file.."
+ },
+ "hapticActionMedias": {
+ "description": "List of haptic medias that shall be rendered with their associated properties.",
+ "type": "array",
+ "items": {
+ "$ref" : "MPEG_scene_interactivity.hapticActionMedia.schema.json"
+ },
+ "minItems": 1
+ }
+ },
+ "required": [
+ "node",
+ "hapticActionMedias"
+ ]
+}
\ No newline at end of file
diff --git a/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.physicsobject.schema.json b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.physicsobject.schema.json
new file mode 100644
index 0000000000..de57e625c3
--- /dev/null
+++ b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.physicsobject.schema.json
@@ -0,0 +1,32 @@
+{
+ "$schema" : "http://json-schema.org/draft-07/schema",
+ "title" : "MPEG_scene_interactivity.physicsobject",
+ "type" : "object",
+ "description" : "Provides a set of parameters at scene level to be used for the physics simulation.",
+ "allOf" : [ { "$ref" : "glTFProperty.schema.json" } ],
+ "properties" : {
+ "recommendedPhysicsHighPrecision":{
+ "type":"boolean",
+ "default": false,
+ "description": "Determines whether the application should enable a more deterministic and precise physic simulation."
+ },
+ "gravity":{
+ "type":"number",
+ "default": -9.81,
+ "description": "Determine the gravity for the whole scene. In meter per second square (m.s-2). as defined in the international unit system."
+ },
+ "recommendedPhysicsFrameRate":{
+ "type":"number",
+ "default": 50,
+ "description": "Provides the recommended frame rate at which the Physics Engine should operate. In frame per second as defined in the international unit system."
+ },
+ "bounceThreshold":{
+ "type":"number",
+ "default": 1,
+ "description": "A contact with a relative velocity below this threshold will not result in a bounce. In meter per second (m.s-1) as defined in the international unit system."
+ },
+ "extensions": {},
+ "extras": {}
+ },
+ "required": [ ]
+}
\ No newline at end of file
diff --git a/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.schema.json b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.schema.json
new file mode 100644
index 0000000000..d64071ff64
--- /dev/null
+++ b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.schema.json
@@ -0,0 +1,41 @@
+{
+ "$schema" : "http://json-schema.org/draft-07/schema",
+ "title" : "MPEG_scene_interactivity",
+ "type" : "object",
+ "description" : "glTF extension to specify interactivity formats at scene level",
+ "allOf" : [ { "$ref" : "glTFProperty.schema.json" } ],
+ "properties" : {
+ "physics" : {
+ "type": "object",
+ "description": "Provides a set of parameters at scene level to be used for the physics simulation.",
+ "$ref" : "MPEG_scene_interactivity.physicsobject.schema.json"
+ },
+ "triggers" : {
+ "type": "array",
+ "description": "An array of triggers descriptions.",
+ "items": {
+ "$ref" : "MPEG_scene_interactivity.trigger.schema.json"
+ },
+ "minItems": 1
+ },
+ "actions" : {
+ "type": "array",
+ "description": "An array of actions descriptions.",
+ "items": {
+ "$ref" : "MPEG_scene_interactivity.action.schema.json"
+ },
+ "minItems": 1
+ },
+ "behaviors" : {
+ "type": "array",
+ "description": "An array of behaviors descriptions.",
+ "items": {
+ "$ref" : "MPEG_scene_interactivity.behavior.schema.json"
+ },
+ "minItems": 1
+ },
+ "extensions": {},
+ "extras": {}
+ },
+ "required": [ "triggers", "actions","behaviors" ]
+}
\ No newline at end of file
diff --git a/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.trigger.primitive.schema.json b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.trigger.primitive.schema.json
new file mode 100644
index 0000000000..4bc2deaf9a
--- /dev/null
+++ b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.trigger.primitive.schema.json
@@ -0,0 +1,127 @@
+{
+ "$schema" : "http://json-schema.org/draft-07/schema",
+ "title" : "MPEG_interactivity.trigger.primitive object",
+ "type" : "object",
+ "description" : "glTF extension to specify trigger primitive formats",
+ "properties" : {
+ "type" : {
+ "type": "number",
+ "description": "Type of the primitive used to activate the trigger.",
+ "gltf_detailedDescription": "Value is oneOf BV_CUBOID=0, BV_PLANE_REGION=1, BV_CYLINDER_REGION=2, BV_CAPSULE_REGION=3, BV_SPHEROID=4",
+ "default" : 0
+ },
+ "boundary" : {
+ "type": "number",
+ "description": "Defines the region of intersection within the primitive. if zero then all area of the primitive activates the triggerOtherwise, the region of intersection decreases following the normal direction of all sides of the primitive from its centroid. For the capsule primitive, it should be applied over the radius, top, and base attributes.",
+ "default" : 0.0
+ },
+ "transformationMatrix" : {
+ "type": "array",
+ "items": { "type" : "number"},
+ "minItem": 16,
+ "maxItems": 16,
+ "description": "Floating-point 4x4 matrix that defines the initial orientation, translation, and scale of a primitive.",
+ "gltf_detailedDescription":"Formatted in column-major order. The primitive shall follow x+ for width, y+ for height, z+ for length . The matrix transformation allows to transform any primitive after initialization.",
+ "default" : [1.0,0.0,0.0,0.0,
+ 0.0,1.0,0.0,0.0,
+ 0.0,0.0,1.0,0.0,
+ 0.0,0.0,0.0,1.0]
+ },
+ "width":
+ {
+ "type": "number",
+ "description": "Width of the primitive object. "
+ },
+ "height":
+ {
+ "type": "number",
+ "description": "Height of the primitive object. "
+ },
+ "length":
+ {
+ "type": "number",
+ "description": "Length of the primitive object. "
+ },
+ "radius":
+ {
+ "type": "number",
+ "description": "Radius of the primitive object. "
+ },
+ "baseCentroid":
+ {
+ "type": "array",
+ "items": { "type" : "number"},
+ "minItem": 3,
+ "maxItems": 3,
+ "description": "Centroid 3D coordinate (x,y,z) of the base semi-sphere of the primitive object. "
+ },
+ "topCentroid":
+ {
+ "type": "array",
+ "items": { "type" : "number"},
+ "minItem": 3,
+ "maxItems": 3,
+ "description": "Centroid 3D coordinate (x,y,z) of the top semi-sphere of the capsule. "
+ },
+ "centroid":
+ {
+ "type": "array",
+ "items": { "type" : "number"},
+ "minItem": 2,
+ "maxItems": 3,
+ "description": "Centroid 2d (x,y) or (y,z) or (x,z) or 3D coordinate (x,y,z) of the primitive object. "
+ },
+
+ "extensions": {},
+ "extras": {}
+ },
+ "allOf": [
+ { "$ref" : "glTFProperty.schema.json" },
+ {
+ "if": {
+ "properties": { "type": { "const": 0, "description":"BV_CUBOID" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["width", "height", "length", "centroid"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 1, "description":"BV_PLANE_REGION" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["width", "height", "centroid"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 2, "description":"BV_CYLINDER_REGION" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["radius", "length", "centroid"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 3, "description":"BV_CAPSULE_REGION" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["radius", "baseCentroid", "topCentroid"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 4, "description":"BV_SPHEROID"} },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["radius", "centroid"]
+ }
+ }
+ ],
+ "required":["type"]
+}
\ No newline at end of file
diff --git a/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.trigger.schema.json b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.trigger.schema.json
new file mode 100644
index 0000000000..65865c877a
--- /dev/null
+++ b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_interactivity.trigger.schema.json
@@ -0,0 +1,93 @@
+{
+ "$schema" : "http://json-schema.org/draft-07/schema",
+ "title" : "MPEG_scene_interactivity.trigger object",
+ "type" : "object",
+ "description" : "glTF extension to specify trigger formats at scene level",
+ "properties" : {
+ "type" : {
+ "type": "integer",
+ "enum":[0,1,2,3],
+ "description": "Type of the trigger.",
+ "gltf_detailedDescription":"Value is oneOf TRIGGER_COLLISION = 0, TRIGGER_PROXIMITY = 1, TRIGGER_USER_INPUT = 2, TRIGGER_VISIBILITY = 3 and can be extended"
+ },
+ "userInputDescription": {
+ "type": "string",
+ "description":"Describe the user body part and gesture related to the input."
+ },
+ "distanceLowerLimit": {
+ "type": "number",
+ "default": 0.0,
+ "description":"Threshold minimum in meters for the proximity calculation"
+ },
+ "distanceUpperLimit": {
+ "type": "number",
+ "description":"Threshold maximum in meters for the proximity calculation"
+ },
+ "referenceNode" :{
+ "type":"integer",
+ "description":"Index in the nodes array, of the node to consider for the proximity evaluation"
+ },
+ "cameraNode": {
+ "type": "integer",
+ "description":"Index to the node containing a camera in the nodes array for which the visibilities are determined "
+ },
+ "nodes": {
+ "type": "array",
+ "items":{"type":"integer"},
+ "minItems": 1,
+ "description": "Indices of the nodes in the nodes array to be considered"
+ },
+ "primitives" :{
+ "type": "array",
+ "items":{ "$ref": "MPEG_interactivity.trigger.primitive.schema.json" },
+ "minItems": 1,
+ "description": "List of primitives used to activate the proximity or collision trigger. "
+ },
+ "extensions": {},
+ "extras": {}
+ },
+ "allOf": [
+ { "$ref" : "glTFProperty.schema.json" },
+ {
+ "if": {
+ "properties": {
+ "type": { "const": 0,"description":"TRIGGER_COLLISION" }},
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["nodes"]
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "type": { "const": 1, "description":"TRIGGER_PROXIMITY" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["nodes","distanceUpperLimit"]
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "type": { "const": 2, "description":"TRIGGER_USER_INPUT" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["userInputDescription"]
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "type": { "const": 3,"description":"TRIGGER_VISIBILITY" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["cameraNode","nodes"]
+ }
+ }
+ ],
+ "required":["type"]
+}
\ No newline at end of file
diff --git a/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_node_interactivity.schema.json b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_node_interactivity.schema.json
new file mode 100644
index 0000000000..a589fa6dd2
--- /dev/null
+++ b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_node_interactivity.schema.json
@@ -0,0 +1,19 @@
+{
+ "$schema" : "http://json-schema.org/draft-07/schema",
+ "title" : "MPEG_node_interactivity",
+ "type" : "object",
+ "description" : "glTF extension to specify interactivity formats at node level",
+ "properties" : {
+ "triggers" : {
+ "type": "array",
+ "items": {
+ "$ref" : "MPEG_node_interactivity.trigger.schema.json"
+ },
+ "minItems": 1,
+ "description": "Array of node triggers . Only distinct types are allowed.The minimum size of this array is 1, and the maximum size is size of trigger types of AMD2."
+ },
+ "extensions": {},
+ "extras": {}
+ },
+ "required":["triggers"]
+}
\ No newline at end of file
diff --git a/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_node_interactivity.trigger.physicsobject.schema.json b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_node_interactivity.trigger.physicsobject.schema.json
new file mode 100644
index 0000000000..9fb690b6ca
--- /dev/null
+++ b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_node_interactivity.trigger.physicsobject.schema.json
@@ -0,0 +1,56 @@
+{
+ "$schema" : "http://json-schema.org/draft-07/schema",
+ "title" : "MPEG_node_interactivity.trigger.physicsobject",
+ "type" : "object",
+ "description" : "Provides a set of parameters at node level to be used for the physics simulation.",
+ "properties" : {
+ "needPreciseCollisionDetection":{
+ "type":"boolean",
+ "default": false,
+ "description": "If true, the physics engine should handle the collision detection more accurately by increasing the detection rate for this node."
+ },
+ "linearDamping":{
+ "type":"number",
+ "default": 0,
+ "description": "A non-negative value, in second-1 (s-1), as defined in the international unit system. It defines the linear drag coefficient which corresponds to the rate of decrease of the linear velocity over time.",
+ "gltf_detailedDescription":"It is used to compute a new velocity value V(t) at each simulation step (dt): V(t+dt) = V(t)*(1-linearDamping*dt), the velocity being clamped to 0."
+ },
+ "angularDamping":{
+ "type":"number",
+ "default": 0,
+ "description": "A non-negative value, in second-1 (s-1), as defined in the international unit system. that It defines the angular drag coefficient which corresponds to the rate of decrease of the angular velocity over time.",
+ "gltf_detailedDescription":"It is used to compute a new velocity value V(t) at each simulation step (dt): V(t+dt) = V(t)*(1-angularDamping*dt), the velocity being clamped to 0."
+ },
+ "useGravity":{
+ "type":"boolean",
+ "description": "Indicates if the gravity affects the object"
+ },
+ "mass":{
+ "type":"number",
+ "default": 1.0,
+ "description": "Mass of the object in kilogram"
+ },
+ "restitution":{
+ "type":"number",
+ "minimum": 0.0,
+ "maximun": 1.0,
+ "description": "Provides the ratio of the final to initial relative velocity between two objects after they collide."
+ },
+ "staticFriction":{
+ "type":"number",
+ "default": 0.5,
+ "minimum": 0.0,
+ "maximun": 1.0,
+ "description": "Unitless friction coefficient as defined in the Coulomb friction model. Used when the object is lying still."
+ },
+ "dynamicFriction":{
+ "type":"number",
+ "minimum": 0.0,
+ "maximun": 1.0,
+ "description": "Unitless friction coefficient as defined in the Coulomb friction model. When a large enough force is applied to the object, it is used, and will attempt to slow down the object while in contact with another."
+ },
+ "extensions": {},
+ "extras": {}
+ },
+ "required":[]
+}
\ No newline at end of file
diff --git a/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_node_interactivity.trigger.schema.json b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_node_interactivity.trigger.schema.json
new file mode 100644
index 0000000000..d34b3dcb34
--- /dev/null
+++ b/extensions/2.0/Vendor/MPEG_interactivity/schema/MPEG_node_interactivity.trigger.schema.json
@@ -0,0 +1,110 @@
+{
+ "$schema" : "http://json-schema.org/draft-07/schema",
+ "title" : "MPEG_node_interactivity.trigger object",
+ "type" : "object",
+ "description" : "glTF extension to specify trigger formats at node level",
+ "properties" : {
+ "type" : {
+ "type": "integer",
+ "enum":[0,1,2,3],
+ "description": "Type of the trigger.",
+ "gltf_detailedDescription":"Value is oneOf TRIGGER_COLLISION = 0, TRIGGER_PROXIMITY = 1, TRIGGER_USER_INPUT = 2, TRIGGER_VISIBILITY = 3 and can be extended"
+ },
+ "collider": {
+ "type": "integer",
+ "description": "Index of the mesh element that provides the collider geometry for the current node"
+ },
+ "isStatic" :{
+ "type": "boolean",
+ "default": "true",
+ "description": "If True, the collider is defined as a static collider"
+ },
+ "physics" :{
+ "type": "object",
+ "description": "Provides a set of parameters at node level to be used for the physics simulation. ",
+ "$ref": "MPEG_node_interactivity.trigger.physicsobject.schema.json"
+ },
+ "primitives" :{
+ "type": "array",
+ "items": { "$ref": "MPEG_interactivity.trigger.primitive.schema.json"},
+ "minItems": 1,
+ "description": "List of primitives used to activate the proximity or collision trigger. "
+ },
+ "allowOcclusion":{
+ "type": "boolean",
+ "description": "Indicates if occlusion by other nodes should be considered"
+ },
+ "upperDistanceWeight":{
+ "type":"number",
+ "default":1.0,
+ "description": "The weight applied to the distanceUpperLimit parameter defined at scene level "
+ },
+ "lowerDistanceWeight":{
+ "type":"number",
+ "default":1.0,
+ "description": "The weight applied to the distanceLowerLimit parameter defined at scene level "
+ },
+ "userInputParameters": {
+ "type": "array",
+ "items":{"type":"string"},
+ "minItems": 1,
+ "description": "Provides additional information related to the user inputs (e.g., “max speed = 0.5”)"
+ },
+ "allowsPartialOcclusion": {
+ "type": "boolean",
+ "description": "If TRUE, a partial visibility of this node activates the trigger. If FALSE, this node shall be fully in the camera frustrum and not be occluded by any other node(s) except the nodes listed in the nodes array to activate the trigger."
+ },
+ "nodes": {
+ "type": "array",
+ "items":{"type":"integer"},
+ "minItems": 1,
+ "description": "Set of nodes that shall not be considered for the visibility computation, when the allowsPartialOcclusion is FALSE."
+ },
+ "mesh":{
+ "type": "integer",
+ "description":"Index of the mesh in the scene meshes array that will be used to compute visibility"
+ },
+ "extensions": {},
+ "extras": {}
+ },
+ "allOf": [
+ { "$ref" : "glTFProperty.schema.json" },
+ {
+ "if": {
+ "properties": { "type": { "const": 0, "description":"TRIGGER_COLLISION"} },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["collider","isStatic"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 1,"description":"TRIGGER_PROXIMITY" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["allowOcclusion"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 2, "description":"TRIGGER_USER_INPUT" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["userInputParameters"]
+ }
+ },
+ {
+ "if": {
+ "properties": { "type": { "const": 3, "description":"TRIGGER_VISIBILITY" } },
+ "required": ["type"]
+ },
+ "then": {
+ "required": ["allowsPartialOcclusion"]
+ }
+ }
+ ],
+ "required":["type"]
+}
\ No newline at end of file