diff --git a/scripts/system/create/assets/data/createAppTooltips.json b/scripts/system/create/assets/data/createAppTooltips.json index fcbad7b320..5d6ff972bb 100644 --- a/scripts/system/create/assets/data/createAppTooltips.json +++ b/scripts/system/create/assets/data/createAppTooltips.json @@ -573,6 +573,39 @@ "grab.grabbable": { "tooltip": "If enabled, this entity will allow grabbing input and will be movable." }, + "grab.grabFollowsController": { + "tooltip": "If enabled, grabbed entities will follow the movements of your hand controller instead of your avatar's hand." + }, + "grab.grabKinematic": { + "tooltip": "If enabled, this grabbed entity will be updated in a kinematic manner. If disabled, it will be grabbed using a tractor action. A kinematic grab will make the item appear more tightly held but will cause it to behave poorly when interacting with dynamic entities." + }, + "grab.grabDelegateToParent": { + "tooltip": "If enabled, when the entity is grabbed, the grab will be transferred to its parent entity if there is one. If disabled, the grab won't be transferred, so a child entity can be grabbed and moved relative to its parent." + }, + "grab.equippable": { + "tooltip": "If enabled, this entity can be attached to the hands/controllers in a simple click. (Note: Entities can't be equipped if 'ignorePickIntersection' is set to true.)" + }, + "grab.equippableLeftPosition": { + "tooltip": "When equipped on an avatar, this defines the 'position' of the entity relative to the 'left' hand." + }, + "grab.equippableLeftRotation": { + "tooltip": "When equipped on an avatar, this defines the 'rotation' of the entity relative to the 'left' hand." + }, + "grab.equippableRightPosition": { + "tooltip": "When equipped on an avatar, this defines the 'position' of the entity relative to the 'right' hand." + }, + "grab.equippableRightRotation": { + "tooltip": "When equipped on an avatar, this defines the 'rotation' of the entity relative to the 'right' hand." + }, + "grab.equippableIndicatorURL": { + "tooltip": "If a model URL is specified, this model will be used to indicate that an entity is equippable." + }, + "grab.equippableIndicatorScale": { + "tooltip": "If an 'Indicator URL' is specified, this controls the scale factors for each dimension of the displayed indicator." + }, + "grab.equippableIndicatorOffset": { + "tooltip": "If an 'Indicator URL' is specified, this controls the relative offset of the displayed indicator from the equippable entity." + }, "grab.triggerable": { "tooltip": "If enabled, the collider on this entity is used for triggering events." }, @@ -597,9 +630,6 @@ "cloneAvatarEntity": { "tooltip": "If enabled, then clones created from this entity will be created as avatar entities." }, - "grab.grabFollowsController": { - "tooltip": "If enabled, grabbed entities will follow the movements of your hand controller instead of your avatar's hand." - }, "canCastShadow": { "tooltip": "If enabled, the geometry of this entity casts shadows when a shadow-casting light source shines on it. Note: Shadows are rendered only on high-profiled computers. This setting will have no effect on computers profiled to medium or low graphics." }, diff --git a/scripts/system/create/entityProperties/html/js/entityProperties.js b/scripts/system/create/entityProperties/html/js/entityProperties.js index 8eab673e31..fabd0c60b7 100644 --- a/scripts/system/create/entityProperties/html/js/entityProperties.js +++ b/scripts/system/create/entityProperties/html/js/entityProperties.js @@ -1819,11 +1819,6 @@ const GROUPS = [ id: "behavior", label: "BEHAVIOR", properties: [ - { - label: "Grabbable", - type: "bool", - propertyID: "grab.grabbable", - }, { label: "Cloneable", type: "bool", @@ -1856,16 +1851,6 @@ const GROUPS = [ propertyID: "cloneAvatarEntity", showPropertyRule: { "cloneable": "true" }, }, - { - label: "Triggerable", - type: "bool", - propertyID: "grab.triggerable", - }, - { - label: "Follow Controller", - type: "bool", - propertyID: "grab.grabFollowsController", - }, { label: "Cast Shadows", type: "bool", @@ -1890,6 +1875,118 @@ const GROUPS = [ } ] }, + { + id: "grabAndEquip", + label: "GRAB AND EQUIP", + properties: [ + { + label: "Grabbable", + type: "bool", + propertyID: "grab.grabbable", + }, + { + label: "Follow Controller", + type: "bool", + propertyID: "grab.grabFollowsController", + showPropertyRule: { "grab.grabbable": "true" }, + }, + { + label: "Kinematic Grab", + type: "bool", + propertyID: "grab.grabKinematic", + showPropertyRule: { "grab.grabbable": "true" }, + }, + { + label: "Delegate To Parent", + type: "bool", + propertyID: "grab.grabDelegateToParent", + showPropertyRule: { "grab.grabbable": "true" }, + }, + { + label: "Triggerable", + type: "bool", + propertyID: "grab.triggerable", + }, + { + label: "Equippable", + type: "bool", + propertyID: "grab.equippable", + }, + { + label: "Left Position", + type: "vec3", + vec3Type: "xyz", + subLabels: [ "x", "y", "z" ], + step: 0.0025, + decimals: 4, + unit: "m", + propertyID: "grab.equippableLeftPosition", + showPropertyRule: { "grab.equippable": "true" }, + }, + { + label: "Left Rotation", + type: "vec3", + vec3Type: "pyr", + step: 0.1, + decimals: 4, + subLabels: [ "x", "y", "z" ], + unit: "deg", + propertyID: "grab.equippableLeftRotation", + showPropertyRule: { "grab.equippable": "true" }, + }, + { + label: "Right Position", + type: "vec3", + vec3Type: "xyz", + subLabels: [ "x", "y", "z" ], + step: 0.0025, + decimals: 4, + unit: "m", + propertyID: "grab.equippableRightPosition", + showPropertyRule: { "grab.equippable": "true" }, + }, + { + label: "Right Rotation", + type: "vec3", + vec3Type: "pyr", + step: 0.1, + decimals: 4, + subLabels: [ "x", "y", "z" ], + unit: "deg", + propertyID: "grab.equippableRightRotation", + showPropertyRule: { "grab.equippable": "true" }, + }, + { + label: "Indicator Model URL", + type: "string", + propertyID: "grab.equippableIndicatorURL", + placeholder: "URL", + showPropertyRule: { "grab.equippable": "true" }, + }, + { + label: "Indicator Scale", + type: "vec3", + vec3Type: "xyz", + subLabels: [ "x", "y", "z" ], + step: 0.0025, + decimals: 4, + unit: "scale", + propertyID: "grab.equippableIndicatorScale", + showPropertyRule: { "grab.equippable": "true" }, + }, + { + label: "Indicator Offset", + type: "vec3", + vec3Type: "xyz", + subLabels: [ "x", "y", "z" ], + step: 0.005, + decimals: 4, + unit: "m", + propertyID: "grab.equippableIndicatorOffset", + showPropertyRule: { "grab.equippable": "true" }, + }, + ] + }, { id: "scripts", label: "SCRIPTS", @@ -2068,25 +2165,25 @@ const GROUPS = [ ]; const GROUPS_PER_TYPE = { - None: [ 'base', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ], - Shape: [ 'base', 'shape', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ], - Text: [ 'base', 'text', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ], + None: [ 'base', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ], + Shape: [ 'base', 'shape', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ], + Text: [ 'base', 'text', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ], Zone: [ 'base', 'zone', 'zone_key_light', 'zone_skybox', 'zone_ambient_light', 'zone_haze', 'zone_bloom', 'zone_tonemapping', 'zone_ambient_occlusion', 'zone_avatar_priority', - 'zone_audio', 'spatial', 'behavior', 'scripts', 'physics' ], - Model: [ 'base', 'model', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ], - Image: [ 'base', 'image', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ], - Web: [ 'base', 'web', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ], - Light: [ 'base', 'light', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ], - Material: [ 'base', 'material', 'spatial', 'behavior', 'scripts', 'physics' ], + 'zone_audio', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'physics' ], + Model: [ 'base', 'model', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ], + Image: [ 'base', 'image', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ], + Web: [ 'base', 'web', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ], + Light: [ 'base', 'light', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ], + Material: [ 'base', 'material', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'physics' ], ParticleEffect: [ 'base', 'particles', 'particles_emit', 'particles_size', 'particles_color', - 'particles_behavior', 'particles_constraints', 'spatial', 'behavior', 'scripts', 'physics' ], - ProceduralParticleEffect: [ 'base', 'particles_procedural', 'spatial', 'behavior', 'scripts', 'physics' ], - PolyLine: [ 'base', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ], - PolyVox: [ 'base', 'polyvox', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ], - Grid: [ 'base', 'grid', 'spatial', 'behavior', 'scripts', 'physics' ], - Sound: [ 'base', 'sound', 'spatial', 'behavior', 'scripts', 'physics' ], - Multiple: [ 'base', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ], + 'particles_behavior', 'particles_constraints', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'physics' ], + ProceduralParticleEffect: [ 'base', 'particles_procedural', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'physics' ], + PolyLine: [ 'base', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ], + PolyVox: [ 'base', 'polyvox', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ], + Grid: [ 'base', 'grid', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'physics' ], + Sound: [ 'base', 'sound', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'physics' ], + Multiple: [ 'base', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ], }; const EDITOR_TIMEOUT_DURATION = 1500; diff --git a/scripts/system/create/entityProperties/html/tabs/grabAndEquip.png b/scripts/system/create/entityProperties/html/tabs/grabAndEquip.png new file mode 100644 index 0000000000..2cd1c75f23 Binary files /dev/null and b/scripts/system/create/entityProperties/html/tabs/grabAndEquip.png differ