From 17e253006b36634602996fbda7d3d642e955ed6a Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Thu, 10 Oct 2024 22:23:28 -0400
Subject: [PATCH 1/6] Adding icon for "Grab And Equip" section

Adding icon for "Grab And Equip" section
---
 .../entityProperties/html/tabs/grabAndEquip.png   | Bin 0 -> 755 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 scripts/system/create/entityProperties/html/tabs/grabAndEquip.png

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 0000000000000000000000000000000000000000..2cd1c75f23180b358c42172821892489b8e7bbb1
GIT binary patch
literal 755
zcmXAhZ%mAF0LQ=2bN?RQ<$lenRNT*zCA}yMqpattD|eZ8PA?9dYo|ZgW-HMYH$Bf4
z?lOd=(a0!o{Hs|EW96Zc`7;}b&6P2FVT+AB(%H?6&#TY(^Yz<G*2Kmn#Q=!4TFiC;
ziBUK;fZ(pxApkRKEgN?L+F4N;oa%}$lvTny0q8sI`Lq5w0J_y;UkB_?1;l0`90A0y
zKz$}KQ3kB)1QKeFIUf`OY_-)als3F|O+_Mk3NAahjH)fnWIDae$csaU<!QWIglp*h
z{y5(u(UD@+$v4#Fgnn*rmENTCqu!@P#88#AlAKkIhaIn)zckry#rfVz4)*kXFfGs6
z&aS!Si4eGC`<?fS6{uSEFo#b2{%3=$>9kIM&tKBd{%AfHiIpe#QI*`CIHjKbTIFi&
zG)2D$_t3q{isXXoy$g+E#&hYrk)3p=MGU0IJBKBFC?hmO-gVTJ5b!qHJ~#@(nFm71
z(%5ZFp(L}U@<v7RX=EjngZbg6?!n-GLl-4XkA6r8j^@X|Z+Y2maQVvz^>jceUP<dq
zEZgf*2_A9%!KCbMLgSFuS8>#old?F?Iltmg6@Nz`wSDATFrM6#DhG7#kXPi$Z9Z^S
zawPfwc2AwKWo3e+<wmYxgSNlND28UXKh+%4>_qF46nEXUN?zNR%CKC(+sJ#=zCCSn
zM7W=9L`8N@+MjgdEb35lbkX%7BoE!v+`cfJ=+j(07go$fw6W7G`}!49Ll!wWmcF%C
zT>FIu({iSDli0x8djn#7wx9X+LIsxFy!0|VUhw=vwZFZNV{FR2!UQEpx5axj<HhdZ
zi&P%DlHoD-*gf3lZFSVfoT{>c$Jmoc^&>r|xUv<?1raV2>Gh8U=IKL9`CXqCN^-8B
zE8P%QOxCdzz4X%p0|=jCzWGf{h82@V^rzU7lh2Q8V}BI#xtf!eB3v!YHoH||b-3qo
T?_RRPnF|2c!V>e9{4(!9h8zu@

literal 0
HcmV?d00001


From 82a923e06c4dcf13a4690809de4bca2ad024bad3 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Thu, 10 Oct 2024 22:27:26 -0400
Subject: [PATCH 2/6] Add "Grab And Equip" section

Add "Grab And Equip" section for the grabbale and Equipable groups of properties.
---
 .../html/js/entityProperties.js               | 145 +++++++++++++++---
 1 file changed, 121 insertions(+), 24 deletions(-)

diff --git a/scripts/system/create/entityProperties/html/js/entityProperties.js b/scripts/system/create/entityProperties/html/js/entityProperties.js
index ab7c7ba54a..0d26df29c4 100644
--- a/scripts/system/create/entityProperties/html/js/entityProperties.js
+++ b/scripts/system/create/entityProperties/html/js/entityProperties.js
@@ -1512,11 +1512,6 @@ const GROUPS = [
         id: "behavior",
         label: "BEHAVIOR",
         properties: [
-            {
-                label: "Grabbable",
-                type: "bool",
-                propertyID: "grab.grabbable",
-            },
             {
                 label: "Cloneable",
                 type: "bool",
@@ -1554,11 +1549,6 @@ const GROUPS = [
                 type: "bool",
                 propertyID: "grab.triggerable",
             },
-            {
-                label: "Follow Controller",
-                type: "bool",
-                propertyID: "grab.grabFollowsController",
-            },
             {
                 label: "Cast Shadows",
                 type: "bool",
@@ -1583,6 +1573,113 @@ 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: "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",
@@ -1761,22 +1858,22 @@ 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_avatar_priority', '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_bloom', 'zone_avatar_priority', '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' ],
-  PolyLine: [ 'base', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ],
-  PolyVox: [ 'base', 'polyvox', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ],
-  Grid: [ 'base', 'grid', 'spatial', 'behavior', 'scripts', 'physics' ],
-  Multiple: [ 'base', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ],
+                    'particles_behavior', 'particles_constraints', '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' ],
+  Multiple: [ 'base', 'spatial', 'behavior', 'grabAndEquip', 'scripts', 'collision', 'physics' ],
 };
 
 const EDITOR_TIMEOUT_DURATION = 1500;

From 64b5d2db33411f22d445f90e5d567cd6a6103953 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Fri, 11 Oct 2024 21:37:51 -0400
Subject: [PATCH 3/6] Add files via upload

---
 .../create/assets/data/createAppTooltips.json | 36 +++++++++++++++++--
 1 file changed, 33 insertions(+), 3 deletions(-)

diff --git a/scripts/system/create/assets/data/createAppTooltips.json b/scripts/system/create/assets/data/createAppTooltips.json
index eaefd08a0d..eeabb89ae8 100644
--- a/scripts/system/create/assets/data/createAppTooltips.json
+++ b/scripts/system/create/assets/data/createAppTooltips.json
@@ -500,6 +500,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 mounted to the hands/controllers."
+    },
+    "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."
     },
@@ -518,9 +551,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."
     },

From c928c9b0488e5d76cfce92a570511a38e2e5f4f7 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Fri, 11 Oct 2024 22:09:29 -0400
Subject: [PATCH 4/6] Add tooltips for the "Grab and Equip" properties

Add the tooltips for the "Grab and Equip" properties
---
 scripts/system/create/assets/data/createAppTooltips.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/system/create/assets/data/createAppTooltips.json b/scripts/system/create/assets/data/createAppTooltips.json
index eeabb89ae8..ba5266bdf5 100644
--- a/scripts/system/create/assets/data/createAppTooltips.json
+++ b/scripts/system/create/assets/data/createAppTooltips.json
@@ -510,7 +510,7 @@
         "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 mounted to the hands/controllers."
+        "tooltip": "If enabled, this entity can be mounted to the hands/controllers. (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."

From d63b3f51bcc53e9d4518bdf7e5475e1269b24eab Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Sat, 12 Oct 2024 13:37:14 -0400
Subject: [PATCH 5/6] Text adjustments for grab.equippable

Text adjustments for grab.equippable
---
 scripts/system/create/assets/data/createAppTooltips.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/system/create/assets/data/createAppTooltips.json b/scripts/system/create/assets/data/createAppTooltips.json
index ba5266bdf5..6b294e0c6f 100644
--- a/scripts/system/create/assets/data/createAppTooltips.json
+++ b/scripts/system/create/assets/data/createAppTooltips.json
@@ -510,7 +510,7 @@
         "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 mounted to the hands/controllers. (Note: Entities can't be equipped if 'ignorePickIntersection' is set to true.)"
+        "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."

From 130948f0ac99a189c9be2aa8743b02b5065b91f0 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Wed, 16 Oct 2024 22:13:55 -0400
Subject: [PATCH 6/6] move "triggerable" under GRAB & EQUIP

move "triggerable" under GRAB & EQUIP
---
 .../entityProperties/html/js/entityProperties.js       | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/scripts/system/create/entityProperties/html/js/entityProperties.js b/scripts/system/create/entityProperties/html/js/entityProperties.js
index 0d26df29c4..fc49f532b5 100644
--- a/scripts/system/create/entityProperties/html/js/entityProperties.js
+++ b/scripts/system/create/entityProperties/html/js/entityProperties.js
@@ -1544,11 +1544,6 @@ const GROUPS = [
                 propertyID: "cloneAvatarEntity",
                 showPropertyRule: { "cloneable": "true" },
             },
-            {
-                label: "Triggerable",
-                type: "bool",
-                propertyID: "grab.triggerable",
-            },
             {
                 label: "Cast Shadows",
                 type: "bool",
@@ -1600,6 +1595,11 @@ const GROUPS = [
                 propertyID: "grab.grabDelegateToParent",
                 showPropertyRule: { "grab.grabbable": "true" },
             },
+            {
+                label: "Triggerable",
+                type: "bool",
+                propertyID: "grab.triggerable",
+            },
             {
                 label: "Equippable",
                 type: "bool",