diff --git a/interface/src/raypick/LaserPointerScriptingInterface.h b/interface/src/raypick/LaserPointerScriptingInterface.h
index 425ffd7de4..6c5ce0dbaf 100644
--- a/interface/src/raypick/LaserPointerScriptingInterface.h
+++ b/interface/src/raypick/LaserPointerScriptingInterface.h
@@ -21,121 +21,146 @@ class LaserPointerScriptingInterface : public QObject, public Dependency {
SINGLETON_DEPENDENCY
/**jsdoc
- * Synonym for {@link Pointers} as used for laser pointers. Deprecated.
+ * The LaserPointers
API is a subset of the {@link Pointers} API. It lets you create, manage, and visually
+ * represent objects for repeatedly calculating ray intersections with avatars, entities, and overlays. Ray pointers can also
+ * be configured to generate events on entities and overlays intersected.
+ *
+ *
Deprecated: This API is deprecated. Use {@link Pointers} instead. * * @namespace LaserPointers * * @hifi-interface * @hifi-client-entity * @hifi-avatar + * + * @borrows Pointers.enablePointer as enableLaserPointer + * @borrows Pointers.disablePointer as disableLaserPointer + * @borrows Pointers.removePointer as removeLaserPointer + * @borrows Pointers.setPrecisionPicking as setPrecisionPicking */ public: /**jsdoc + * Creates a new ray pointer. The pointer can have a wide range of behaviors depending on the properties specified. For + * example, it may be a static ray pointer, a mouse ray pointer, or joint ray pointer. + *
Warning: Pointers created using this method currently always intersect at least visible and + * collidable things but this may not always be the case.
* @function LaserPointers.createLaserPointer - * @param {Pointers.LaserPointerProperties} properties - * @returns {number} + * @param {Pointers.RayPointerProperties} properties - The properties of the pointer, including the properties of the + * underlying pick that the pointer uses to do its picking. + * @returns {number} The ID of the pointer if successfully created, otherwise0
.
*/
Q_INVOKABLE unsigned int createLaserPointer(const QVariant& properties) const;
- /**jsdoc
- * @function LaserPointers.enableLaserPointer
- * @param {number} id
- */
+ // jsdoc @borrows from Pointers
Q_INVOKABLE void enableLaserPointer(unsigned int uid) const { DependencyManager::getNote: You can only edit the properties of the existing parts of the pointer; you cannot change the + * type of any part.
+ *Note: You cannot use this method to change the appearance of a default render state.
* @function LaserPointers.editRenderState - * @param {number} id - * @param {string} renderState - * @param {Pointers.RayPointerRenderState} properties + * @param {number} id - The ID of the pointer. + * @param {string} renderState - The name of the render state to edit. + * @param {Pointers.RayPointerRenderState} properties - The new properties for the render state. Only the overlay + * properties to change need be specified. */ Q_INVOKABLE void editRenderState(unsigned int uid, const QString& renderState, const QVariant& properties) const; /**jsdoc + * Sets the render state of a pointer, to change its visual appearance and possibly disable or enable it. * @function LaserPointers.setRenderState - * @param {string} renderState - * @param {number} id + * @param {string} renderState -The name of the render state to set the pointer to. This may be:
+ *""
, to hide the pointer and disable emitting of events.true
if the target is an avatar, false
if it is an entity.
+ * @param {Mat4} [offset] - The offset of the target point from the center of the target item. If not specified, the
+ * pointer locks on to the center of the target item.
*/
Q_INVOKABLE void setLockEndUUID(unsigned int uid, const QUuid& objectID, bool isAvatar, const glm::mat4& offsetMat = glm::mat4()) const { DependencyManager::getjoint
property set to
+ * "_CONTROLLER_LEFTHAND"
or "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND"
.
* @function LaserPointers.isLeftHand
- * @param {number} id
- * @returns {boolean}
+ * @param {number} id - The ID of the pointer.
+ * @returns {boolean} true
if the pointer is associated with the left hand, false
if it isn't.
*/
Q_INVOKABLE bool isLeftHand(unsigned int uid) { return DependencyManager::getjoint
property set to
+ * "_CONTROLLER_RIGHTHAND"
or "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND"
.
* @function LaserPointers.isRightHand
- * @param {number} id
- * @returns {boolean}
+ * @param {number} id - The ID of the pointer.
+ * @returns {boolean} true
if the pointer is associated with the right hand, false
if it isn't.
*/
Q_INVOKABLE bool isRightHand(unsigned int uid) { return DependencyManager::getjoint
property set to
+ * "Mouse"
.
* @function LaserPointers.isMouse
- * @param {number} id
- * @returns {boolean}
+ * @param {number} id - The ID of the pointer.
+ * @returns {boolean} true
if the pointer is associated with the system mouse, false
if it isn't.
*/
Q_INVOKABLE bool isMouse(unsigned int uid) { return DependencyManager::gettrue
if this pick should start enabled, false
if it should
@@ -138,7 +138,7 @@ unsigned int PickScriptingInterface::createRayPick(const QVariant& properties) {
}
/**jsdoc
- * A set of properties that can be passed to {@link Picks.createPick} when creating a new stylus pick.
+ * The properties of a stylus pick.
*
* @typedef {object} Picks.StylusPickProperties
* @property {number} [hand=-1] 0
for the left hand, 1
for the right hand, invalid (-1
)
@@ -189,7 +189,7 @@ unsigned int PickScriptingInterface::createStylusPick(const QVariant& properties
// NOTE: Laser pointer still uses scaleWithAvatar. Until scaleWithAvatar is also deprecated for pointers, scaleWithAvatar should not be removed from the pick API.
/**jsdoc
- * A set of properties that can be passed to {@link Picks.createPick} when creating a new parabola pick.
+ * The properties of a parabola pick.
*
* @typedef {object} Picks.ParabolaPickProperties
* @property {boolean} [enabled=false] - true
if this pick should start enabled, false
if it should
@@ -297,7 +297,7 @@ unsigned int PickScriptingInterface::createParabolaPick(const QVariant& properti
/**jsdoc
- * A set of properties that can be passed to {@link Picks.createPick} when creating a new collision pick.
+ * The properties of a collision pick.
*
* @typedef {object} Picks.CollisionPickProperties
* @property {boolean} [enabled=false] - true
if this pick should start enabled, false
if it should
diff --git a/interface/src/raypick/PickScriptingInterface.h b/interface/src/raypick/PickScriptingInterface.h
index 1cbdaa92f7..e973ee3643 100644
--- a/interface/src/raypick/PickScriptingInterface.h
+++ b/interface/src/raypick/PickScriptingInterface.h
@@ -194,7 +194,8 @@ public:
Q_INVOKABLE QVariantMap getPrevPickResult(unsigned int uid);
/**jsdoc
- * Sets whether or not to use precision picking, i.e., whether to pick against precise meshes or coarse meshes.
+ * Sets whether or not a pick should use precision picking, i.e., whether it should pick against precise meshes or coarse
+ * meshes.
* This has the same effect as using the PICK_PRECISE
or PICK_COARSE
filter flags.
* @function Picks.setPrecisionPicking
* @param {number} id - The ID of the pick.
@@ -203,7 +204,7 @@ public:
Q_INVOKABLE void setPrecisionPicking(unsigned int uid, bool precisionPicking);
/**jsdoc
- * Sets a list of entity and avatar IDs to ignore during intersection.
+ * Sets a list of entity and avatar IDs that a pick should ignore during intersection.
* Note: Not used by stylus picks.
* @function Picks.setIgnoreItems * @param {number} id - The ID of the pick. @@ -212,8 +213,9 @@ public: Q_INVOKABLE void setIgnoreItems(unsigned int uid, const QScriptValue& ignoreItems); /**jsdoc - * Sets a list of entity IDs and/or avatar IDs to include during intersection, instead of intersecting with everything. - *Note: Stylus picks only intersect with objects in their include list.
+ * Sets a list of entity and avatar IDs that a pick should include during intersection, instead of intersecting with + * everything. + *Note: Stylus picks only intersect with items in their include list.
* @function Picks.setIncludeItems * @param {number} id - The ID of the pick. * @param {Uuid[]} includeItems - The list of IDs to include. @@ -221,9 +223,9 @@ public: Q_INVOKABLE void setIncludeItems(unsigned int uid, const QScriptValue& includeItems); /**jsdoc - * Checks if a pick is associated with the left hand: a ray or parabola pick with joint set to - *"_CONTROLLER_LEFTHAND"
or "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND"
, or a stylus pick with hand
- * set to 0
.
+ * Checks if a pick is associated with the left hand: a ray or parabola pick with joint
property set to
+ * "_CONTROLLER_LEFTHAND"
or "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND"
, or a stylus pick with
+ * hand
property set to 0
.
* @function Picks.isLeftHand
* @param {number} id - The ID of the pick.
* @returns {boolean} true
if the pick is associated with the left hand, false
if it isn't.
@@ -231,9 +233,9 @@ public:
Q_INVOKABLE bool isLeftHand(unsigned int uid);
/**jsdoc
- * Checks if a pick is associated with the right hand: a ray or parabola pick with joint set to
- * "_CONTROLLER_RIGHTHAND"
or "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND"
, or a stylus pick with hand
- * set to 1
.
+ * Checks if a pick is associated with the right hand: a ray or parabola pick with joint
property set to
+ * "_CONTROLLER_RIGHTHAND"
or "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND"
, or a stylus pick with
+ * hand
property set to 1
.
* @function Picks.isRightHand
* @param {number} id - The ID of the pick.
* @returns {boolean} true
if the pick is associated with the right hand, false
if it isn't.
@@ -241,7 +243,8 @@ public:
Q_INVOKABLE bool isRightHand(unsigned int uid);
/**jsdoc
- * Checks if a pick is associated with the system mouse: a ray or parabola pick with joint set to "Mouse"
.
+ * Checks if a pick is associated with the system mouse: a ray or parabola pick with joint
property set to
+ * "Mouse"
.
* @function Picks.isMouse
* @param {number} id - The ID of the pick.
* @returns {boolean} true
if the pick is associated with the system mouse, false
if it isn't.
diff --git a/interface/src/raypick/PointerScriptingInterface.cpp b/interface/src/raypick/PointerScriptingInterface.cpp
index 1c80caff88..f1dcf7bd5d 100644
--- a/interface/src/raypick/PointerScriptingInterface.cpp
+++ b/interface/src/raypick/PointerScriptingInterface.cpp
@@ -51,21 +51,22 @@ unsigned int PointerScriptingInterface::createPointer(const PickQuery::PickType&
}
/**jsdoc
- * A set of properties that can be passed to {@link Pointers.createPointer} to create a new Pointer. Contains the relevant {@link Picks.PickProperties} to define the underlying Pick.
+ * The properties of a stylus pointer. These include the properties from the underlying stylus pick that the pointer uses.
* @typedef {object} Pointers.StylusPointerProperties
- * @property {boolean} [hover=false] If this pointer should generate hover events.
- * @property {boolean} [enabled=false]
- * @property {Vec3} [tipOffset] The specified offset of the from the joint index.
- * @property {Pointers.StylusPointerProperties.model} [model] Data to replace the default model url, positionOffset and rotationOffset.
+ * @property {Pointers.StylusPointerModel} [model] - Override some or all of the default stylus model properties.
+ * @property {boolean} [hover=false] - true
if the pointer generates {@link Entities} hover events,
+ * false
if it doesn't.
+ * @see {@link Picks.StylusPickProperties} for additional properties from the underlying stylus pick.
+ */
+/**jsdoc
+ * The properties of a stylus pointer model.
+ * @typedef {object} Pointers.StylusPointerModel
+ * @property {string} [url] - The url of a model to use for the stylus, to override the default stylus mode.
+ * @property {Vec3} [dimensions] - The dimensions of the stylus, to override the default stylus dimensions.
+ * @property {Vec3} [positionOffset] - The position offset of the model from the stylus tip, to override the default position
+ * offset.
+ * @property {Quat} [rotationOffset] - The rotation offset of the model from the hand, to override the default rotation offset.
*/
- /**jsdoc
- * properties defining stylus pick model that can be included to {@link Pointers.StylusPointerProperties}
- * @typedef {object} Pointers.StylusPointerProperties.model
- * @property {string} [url] url to the model
- * @property {Vec3} [dimensions] the dimensions of the model
- * @property {Vec3} [positionOffset] the position offset of the model from the stylus tip.
- * @property {Vec3} [rotationOffset] the rotation offset of the model from the parent joint index
- */
unsigned int PointerScriptingInterface::createStylus(const QVariant& properties) const {
QVariantMap propertyMap = properties.toMap();
@@ -104,48 +105,76 @@ unsigned int PointerScriptingInterface::createStylus(const QVariant& properties)
}
/**jsdoc
- * A set of properties used to define the visual aspect of a Ray Pointer in the case that the Pointer is not intersecting something. Same as a {@link Pointers.RayPointerRenderState},
- * but with an additional distance field.
- *
+ * Properties that define the visual appearance of a ray pointer when the pointer is not intersecting something. These are the
+ * properties of {@link Pointers.RayPointerRenderState} but with an additional property.
* @typedef {object} Pointers.DefaultRayPointerRenderState
- * @augments Pointers.RayPointerRenderState
- * @property {number} distance The distance at which to render the end of this Ray Pointer, if one is defined.
+ * @property {number} distance - The distance at which to render the end of the ray pointer.
+ * @see {@link Pointers.RayPointerRenderState} for the remainder of the properties.
*/
/**jsdoc
- * A set of properties which define the visual aspect of a Ray Pointer in the case that the Pointer is intersecting something.
- *
+ * Properties that define the visual appearance of a ray pointer when the pointer is intersecting something.
* @typedef {object} Pointers.RayPointerRenderState
- * @property {string} name When using {@link Pointers.createPointer}, the name of this render state, used by {@link Pointers.setRenderState} and {@link Pointers.editRenderState}
- * @property {Overlays.OverlayProperties|QUuid} [start] When using {@link Pointers.createPointer}, an optionally defined object to represent the beginning of the Ray Pointer,
- * using the properties you would normally pass to {@link Overlays.addOverlay}, plus the type (as a type
field).
- * When returned from {@link Pointers.getPointerProperties}, the ID of the created object if it exists, or a null ID otherwise.
- * @property {Overlays.OverlayProperties|QUuid} [path] When using {@link Pointers.createPointer}, an optionally defined object to represent the path of the Ray Pointer,
- * using the properties you would normally pass to {@link Overlays.addOverlay}, plus the type (as a type
field), which must be "line3d"
.
- * When returned from {@link Pointers.getPointerProperties}, the ID of the created object if it exists, or a null ID otherwise.
- * @property {Overlays.OverlayProperties|QUuid} [end] When using {@link Pointers.createPointer}, an optionally defined object to represent the end of the Ray Pointer,
- * using the properties you would normally pass to {@link Overlays.addOverlay}, plus the type (as a type
field).
- * When returned from {@link Pointers.getPointerProperties}, the ID of the created object if it exists, or a null ID otherwise.
+ * @property {string} name - When creating using {@link Pointers.createPointer}, the name of the render state.
+ * @property {Overlays.OverlayProperties|Uuid} [start]
+ * When creating or editing using {@link Pointers.createPointer} or {@link Pointers.editRenderState}, the properties of
+ * an overlay to render at the start of the ray pointer. The type
property must be specified.
When getting using {@link Pointers.getPointerProperties}, the ID of the overlay rendered at the start of the ray;
+ * null
if there is no overlay.
+ *
+ * @property {Overlays.OverlayProperties|Uuid} [path]
+ *
When creating or editing using {@link Pointers.createPointer} or {@link Pointers.editRenderState}, the properties of
+ * the overlay rendered for the path of the ray pointer. The type
property must be specified and be
+ * "line3d"
.
When getting using {@link Pointers.getPointerProperties}, the ID of the overlay rendered for the path of the ray;
+ * null
if there is no overlay.
+ *
+ * @property {Overlays.OverlayProperties|Uuid} [end]
+ *
When creating or editing using {@link Pointers.createPointer} or {@link Pointers.editRenderState}, the properties of
+ * an overlay to render at the end of the ray pointer. The type
property must be specified.
When getting using {@link Pointers.getPointerProperties}, the ID of the overlay rendered at the end of the ray;
+ * Deprecated: This property is deprecated and will be removed. A set of visual states that can be switched among using {@link Pointers.setRenderState}. These define the visual
+ * appearance of the pointer when it is intersecting something. When setting using {@link Pointers.createPointer}, an array of
+ * {@link Pointers.RayPointerRenderState|RayPointerRenderState} values. When getting using {@link Pointers.getPointerProperties}, an object mapping render state names to
+ * {@link Pointers.RayPointerRenderState|RayPointerRenderState} values. A set of visual states that can be switched among using {@link Pointers.setRenderState}. These define the visual
+ * appearance of the pointer when it is not intersecting something. When setting using {@link Pointers.createPointer}, an array of
+ * {@link Pointers.DefaultRayPointerRenderState|DefaultRayPointerRenderState} values. When getting using {@link Pointers.getPointerProperties}, an object mapping render state names to
+ * {@link Pointers.DefaultRayPointerRenderState|DefaultRayPointerRenderState} values. When creating or editing using {@link Pointers.createPointer} or {@link Pointers.editRenderState}, the properties of
+ * an overlay to render at the start of the parabola pointer. The When getting using {@link Pointers.getPointerProperties}, the ID of the overlay rendered at the start of the
+ * parabola; When creating or editing using {@link Pointers.createPointer} or {@link Pointers.editRenderState}, the properties of
+ * the rendered path of the parabola pointer. This property is not provided when getting using {@link Pointers.getPointerProperties}.
+ * @property {Overlays.OverlayProperties|Uuid} [end]
+ * When creating or editing using {@link Pointers.createPointer} or {@link Pointers.editRenderState}, the properties of
+ * an overlay to render at the end of the ray pointer. The When getting using {@link Pointers.getPointerProperties}, the ID of the overlay rendered at the end of the parabola;
+ * Deprecated: This property is deprecated and will be removed. A set of visual states that can be switched among using {@link Pointers.setRenderState}. These define the visual
+ * appearance of the pointer when it is intersecting something. When setting using {@link Pointers.createPointer}, an array of
+ * {@link Pointers.ParabolaPointerRenderState|ParabolaPointerRenderState} values. When getting using {@link Pointers.getPointerProperties}, an object mapping render state names to
+ * {@link Pointers.ParabolaPointerRenderState|ParabolaPointerRenderState} values. A set of visual states that can be switched among using {@link Pointers.setRenderState}. These define the visual
+ * appearance of the pointer when it is not intersecting something. When setting using {@link Pointers.createPointer}, an array of
+ * {@link Pointers.DefaultParabolaPointerRenderState|DefaultParabolaPointerRenderState} values. When getting using {@link Pointers.getPointerProperties}, an object mapping render state names to
+ * {@link Pointers.DefaultParabolaPointerRenderState|DefaultParabolaPointerRenderState} values. Warning: Pointers created using this method currently always intersect at least visible and
+ * collidable things but this may not always be the case. Note: You can only edit the properties of the existing parts of the pointer; you cannot change the
+ * type of any part. Note: You cannot use this method to change the appearance of a default render state. Note: Not able to be used with stylus pointers. The name of the render state to set the pointer to. For {@link Pointers.RayPointerProperties|ray} and {@link Pointers.ParabolaPointerProperties|parabola} pointers,
+ * this may be: For {@link Pointers.StylusPointerProperties|stylus} pointers, the values may be: Note: Not used by stylus pointers. Note: Not used by stylus pointers. Note: Stylus pointers only intersect with items in their include list. Note: Not used by stylus pointers.null
if there is no overlay.
*/
/**jsdoc
- * A set of properties that can be passed to {@link Pointers.createPointer} to create a new Pointer. Contains the relevant {@link Picks.PickProperties} to define the underlying Pick.
- * @typedef {object} Pointers.LaserPointerProperties
- * @property {boolean} [faceAvatar=false] If true, the end of the Pointer will always rotate to face the avatar.
- * @property {boolean} [centerEndY=true] If false, the end of the Pointer will be moved up by half of its height.
- * @property {boolean} [lockEnd=false] If true, the end of the Pointer will lock on to the center of the object at which the pointer is pointing.
- * @property {boolean} [distanceScaleEnd=false] If true, the dimensions of the end of the Pointer will scale linearly with distance.
- * @property {boolean} [scaleWithParent=false] If true, the width of the Pointer's path will scale linearly with the pick parent's scale. scaleWithAvatar is an alias but is deprecated.
- * @property {boolean} [followNormal=false] If true, the end of the Pointer will rotate to follow the normal of the intersected surface.
- * @property {number} [followNormalStrength=0.0] The strength of the interpolation between the real normal and the visual normal if followNormal is true. 0-1
. If 0 or 1,
- * the normal will follow exactly.
- * @property {boolean} [enabled=false]
- * @property {Pointers.RayPointerRenderState[]|Object.true
if the overlay rendered at the end of the ray rotates about the
+ * world y-axis to always face the avatar; false
if it maintains its world orientation.
+ * @property {boolean} [centerEndY=true] - true
if the overlay rendered at the end of the ray is centered on
+ * the ray end; false
if the overlay is positioned against the surface if followNormal
is
+ * true
, or above the ray end if followNormal
is false
.
+* @property {boolean} [lockEnd=false] - true
if the end of the ray is locked to the center of the object at
+ * which the ray is pointing; false
if the end of the ray is at the intersected surface.
+ * @property {boolean} [distanceScaleEnd=false] - true
if the dimensions of the overlay at the end of the ray
+ * scale linearly with distance; false
if they aren't.
+ * @property {boolean} [scaleWithParent=false] - true
if the width of the ray's path and the size of the
+ * start and end overlays scale linearly with the pointer parent's scale; false
if they don't scale.
+ * @property {boolean} [scaleWithAvatar=false] - A synonym for scalewithParent
.
+ * true
if the overlay rendered at the end of the ray rotates to
+ * follow the normal of the surface if one is intersected; false
if it doesn't.
+ * @property {number} [followNormalStrength=0.0] - How quickly the overlay rendered at the end of the ray rotates to follow
+ * the normal of an intersected surface. If 0
or 1
, the overlay rotation follows instantaneously;
+ * for other values, the larger the value the more quickly the rotation follows.
+ * @property {Pointers.RayPointerRenderState[]|Object.true
if the pointer generates {@link Entities} hover events,
+ * false
if it doesn't.
+ * @property {Pointers.Trigger[]} [triggers=[]] - A list of ways that a {@link Controller} action or function should trigger
+ * events on the entity or overlay currently intersected.
+ * @see {@link Picks.RayPickProperties} for additional properties from the underlying ray pick.
*/
unsigned int PointerScriptingInterface::createLaserPointer(const QVariant& properties) const {
QVariantMap propertyMap = properties.toMap();
@@ -260,58 +289,84 @@ unsigned int PointerScriptingInterface::createLaserPointer(const QVariant& prope
}
/**jsdoc
-* The rendering properties of the parabolic path
-*
-* @typedef {object} Pointers.ParabolaProperties
-* @property {Color} color=255,255,255 The color of the parabola.
-* @property {number} alpha=1.0 The alpha of the parabola.
-* @property {number} width=0.01 The width of the parabola, in meters.
-* @property {boolean} isVisibleInSecondaryCamera=false The width of the parabola, in meters.
-* @property {boolean} drawInFront=false If true
, the parabola is rendered in front of other items in the scene.
-*/
+ * The visual appearance of the parabolic path.
+ * @typedef {object} Pointers.ParabolaPointerPath
+ * @property {Color} [color=255,255,255] - The color of the parabola.
+ * @property {number} [alpha=1.0] - The opacity of the parabola, range 0.0
– 1.0
.
+ * @property {number} [width=0.01] - The width of the parabola, in meters.
+ * @property {boolean} [isVisibleInSecondaryCamera=false] - true
if the parabola is rendered in the secondary
+ * camera, false
if it isn't.
+ * @property {boolean} [drawInFront=false] - true
if the parabola is rendered in front of objects in the world,
+ * but behind the HUD, false
if it is occluded by objects in front of it.
+ */
/**jsdoc
-* A set of properties used to define the visual aspect of a Parabola Pointer in the case that the Pointer is not intersecting something. Same as a {@link Pointers.ParabolaPointerRenderState},
-* but with an additional distance field.
-*
-* @typedef {object} Pointers.DefaultParabolaPointerRenderState
-* @augments Pointers.ParabolaPointerRenderState
-* @property {number} distance The distance along the parabola at which to render the end of this Parabola Pointer, if one is defined.
-*/
+ * Properties that define the visual appearance of a parabola pointer when the pointer is not intersecting something. These are
+ * properties of {@link Pointers.ParabolaPointerRenderState} but with an additional property.
+ * @typedef {object} Pointers.DefaultParabolaPointerRenderState
+ * @property {number} distance - The distance along the parabola at which to render the end of the parabola pointer.
+ * @see {@link Pointers.ParabolaPointerRenderState} for the remainder of the properties.
+ */
/**jsdoc
-* A set of properties used to define the visual aspect of a Parabola Pointer in the case that the Pointer is intersecting something.
-*
-* @typedef {object} Pointers.ParabolaPointerRenderState
-* @property {string} name When using {@link Pointers.createPointer}, the name of this render state, used by {@link Pointers.setRenderState} and {@link Pointers.editRenderState}
-* @property {Overlays.OverlayProperties|QUuid} [start] When using {@link Pointers.createPointer}, an optionally defined object to represent the beginning of the Parabola Pointer,
-* using the properties you would normally pass to {@link Overlays.addOverlay}, plus the type (as a type
field).
-* When returned from {@link Pointers.getPointerProperties}, the ID of the created object if it exists, or a null ID otherwise.
-* @property {Pointers.ParabolaProperties} [path] When using {@link Pointers.createPointer}, the optionally defined rendering properties of the parabolic path defined by the Parabola Pointer.
-* Not defined in {@link Pointers.getPointerProperties}.
-* @property {Overlays.OverlayProperties|QUuid} [end] When using {@link Pointers.createPointer}, an optionally defined object to represent the end of the Parabola Pointer,
-* using the properties you would normally pass to {@link Overlays.addOverlay}, plus the type (as a type
field).
-* When returned from {@link Pointers.getPointerProperties}, the ID of the created object if it exists, or a null ID otherwise.
-*/
+ * Properties that define the visual appearance of a parabola pointer when the pointer is intersecting something.
+ * @typedef {object} Pointers.ParabolaPointerRenderState
+ * @property {string} name - When creating using {@link Pointers.createPointer}, the name of the render state.
+ * @property {Overlays.OverlayProperties|Uuid} [start]
+ * type
property must be specified.null
if there is no overlay.
+ * @property {Pointers.ParabolaPointerPath|Uuid} [path]
+ * type
property must be specified.null
if there is no overlay.
+ */
/**jsdoc
-* A set of properties that can be passed to {@link Pointers.createPointer} to create a new Pointer. Contains the relevant {@link Picks.PickProperties} to define the underlying Pick.
-* @typedef {object} Pointers.ParabolaPointerProperties
-* @property {boolean} [faceAvatar=false] If true, the end of the Pointer will always rotate to face the avatar.
-* @property {boolean} [centerEndY=true] If false, the end of the Pointer will be moved up by half of its height.
-* @property {boolean} [lockEnd=false] If true, the end of the Pointer will lock on to the center of the object at which the pointer is pointing.
-* @property {boolean} [distanceScaleEnd=false] If true, the dimensions of the end of the Pointer will scale linearly with distance.
-* @property {boolean} [scaleWithParent=true] If true, the width of the Pointer's path will scale linearly with the pick parent's scale. scaleWithAvatar is an alias but is deprecated.
-* @property {boolean} [followNormal=false] If true, the end of the Pointer will rotate to follow the normal of the intersected surface.
-* @property {number} [followNormalStrength=0.0] The strength of the interpolation between the real normal and the visual normal if followNormal is true. 0-1
. If 0 or 1,
-* the normal will follow exactly.
-* @property {boolean} [enabled=false]
-* @property {Pointers.ParabolaPointerRenderState[]|Object.true
if the overlay rendered at the end of the ray rotates about the
+ * world y-axis to always face the avatar; false
if it maintains its world orientation.
+ * @property {boolean} [centerEndY=true] - true
if the overlay rendered at the end of the ray is centered on
+ * the ray end; false
if the overlay is positioned against the surface if followNormal
is
+ * true
, or above the ray end if followNormal
is false
.
+* @property {boolean} [lockEnd=false] - true
if the end of the ray is locked to the center of the object at
+ * which the ray is pointing; false
if the end of the ray is at the intersected surface.
+ * @property {boolean} [distanceScaleEnd=false] - true
if the dimensions of the overlay at the end of the ray
+ * scale linearly with distance; false
if they aren't.
+ * @property {boolean} [scaleWithParent=false] - true
if the width of the ray's path and the size of the
+ * start and end overlays scale linearly with the pointer parent's scale; false
if they don't scale.
+ * @property {boolean} [scaleWithAvatar=false] - A synonym for scalewithParent
.
+ * true
if the overlay rendered at the end of the ray rotates to
+ * follow the normal of the surface if one is intersected; false
if it doesn't.
+ * @property {number} [followNormalStrength=0.0] - How quickly the overlay rendered at the end of the ray rotates to follow
+ * the normal of an intersected surface. If 0
or 1
, the overlay rotation follows instantaneously;
+ * for other values, the larger the value the more quickly the rotation follows.
+ * @property {Pointers.ParabolaPointerRenderState[]|Object.true
if the pointer generates {@link Entities} hover events,
+ * false
if it doesn't.
+ * @property {Pointers.Trigger[]} [triggers=[]] - A list of ways that a {@link Controller} action or function should trigger
+ * events on the entity or overlay currently intersected.
+ * @see {@link Picks.ParabolaPickProperties} for additional properties from the underlying parabola pick.
+ */
unsigned int PointerScriptingInterface::createParabolaPointer(const QVariant& properties) const {
QVariantMap propertyMap = properties.toMap();
diff --git a/interface/src/raypick/PointerScriptingInterface.h b/interface/src/raypick/PointerScriptingInterface.h
index 268b178fb6..e6efaae09f 100644
--- a/interface/src/raypick/PointerScriptingInterface.h
+++ b/interface/src/raypick/PointerScriptingInterface.h
@@ -15,8 +15,9 @@
#include Pointers
API lets you create, manage, and visually represent objects for repeatedly calculating
+ * intersections with avatars, entities, and overlays. Pointers can also be configured to generate events on entities and
+ * overlays intersected.
*
* @namespace Pointers
*
@@ -35,184 +36,416 @@ public:
unsigned int createParabolaPointer(const QVariant& properties) const;
/**jsdoc
- * A trigger mechanism for Ray and Parabola Pointers.
- *
- * @typedef {object} Pointers.Trigger
- * @property {Controller.Standard|Controller.Actions|function} action This can be a built-in Controller action, like Controller.Standard.LTClick, or a function that evaluates to >= 1.0 when you want to trigger button
.
- * @property {string} button Which button to trigger. "Primary", "Secondary", "Tertiary", and "Focus" are currently supported. Only "Primary" will trigger clicks on web surfaces. If "Focus" is triggered,
- * it will try to set the entity focus to the object at which the Pointer is aimed. Buttons besides the first three will still trigger events, but event.button will be "None".
- */
+ * Specifies that a {@link Controller} action or function should trigger events on the entity or overlay currently
+ * intersected by a {@link Pointers.RayPointerProperties|Ray} or {@link Pointers.ParabolaPointerProperties|Parabola}
+ * pointer.
+ * @typedef {object} Pointers.Trigger
+ * @property {Controller.Standard|Controller.Actions|function} action - The controller output or function that triggers the
+ * events on the entity or overlay. If a function, it must return a number >= 1.0
to start the action
+ * and < 1.0
to terminate the action.
+ * @property {string} button - Which button to trigger.
+ *
+ *
+ */
/**jsdoc
- * Adds a new Pointer
- * Different {@link PickType}s use different properties, and within one PickType, the properties you choose can lead to a wide range of behaviors. For example,
- * with PickType.Ray, depending on which optional parameters you pass, you could create a Static Ray Pointer, a Mouse Ray Pointer, or a Joint Ray Pointer.
- * Pointers created with this method always intersect at least visible and collidable things
+ * Creates a new ray, parabola, or stylus pointer. The pointer can have a wide range of behaviors depending on the
+ * properties specified. For example, a ray pointer may be a static ray pointer, a mouse ray pointer, or joint ray
+ * pointer.
+ * "Primary"
, "Secondary"
, and "Tertiary"
cause {@link Entities} and
+ * {@link Overlays} mouse pointer events. Other button names also cause mouse events but the button
+ * property in the event will be "None"
."Focus"
will try to give focus to the entity or overlay which the pointer is intersecting.type
, including the properties of the underlying pick
+ * that the pointer uses to do its picking.
+ * @returns {number} The ID of the pointer if successfully created, otherwise 0
.
*
- * @example
+ * Note: Stop controllerScripts.js from running to disable similar behavior from it.renderStates
item.
+ * @param {number} id - The ID of the pointer.
+ * @param {string} renderState - The name of the render state to edit.
+ * @param {Pointers.RayPointerRenderState|Pointers.ParabolaPointerRenderState} properties - The new properties for the
+ * render state. Only the overlay properties to change need be specified.
+ * @example
+ *
+ * ""
, to hide the pointer and disable emitting of events.
+ *
+ * @example "events on"
, to render and emit events (the default)."events off"
, to render but don't emit events."disabled"
, to not render and not emit events.PICK_PRECISE
or PICK_COARSE
filter flags.
* @function Pointers.setPrecisionPicking
- * @param {number} uid The ID of the Pointer, as returned by {@link Pointers.createPointer}.
- * @param {boolean} precisionPicking Whether or not to use precision picking
+ * @param {number} id - The ID of the pointer.
+ * @param {boolean} precisionPicking - true
to use precision picking, false
to use coarse picking.
*/
Q_INVOKABLE void setPrecisionPicking(unsigned int uid, bool precisionPicking) const { DependencyManager::gettrue
if the target is an avatar, false
if it is an entity.
+ * @param {Mat4} [offset] - The offset of the target point from the center of the target item. If not specified, the
+ * pointer locks on to the center of the target item.
*/
Q_INVOKABLE void setLockEndUUID(unsigned int uid, const QUuid& objectID, bool isAvatar, const glm::mat4& offsetMat = glm::mat4()) const { DependencyManager::getjoint
property set to
+ * "_CONTROLLER_LEFTHAND"
or "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND"
, or a stylus pointer with
+ * hand
property set to 0
.
* @function Pointers.isLeftHand
- * @param {number} uid The ID of the Pointer, as returned by {@link Pointers.createPointer}.
- * @returns {boolean} True if the Pointer is a Joint Ray Pointer with joint == "_CONTROLLER_LEFTHAND" or "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND", or a Stylus Pointer with hand == 0
+ * @param {number} id - The ID of the pointer.
+ * @returns {boolean} true
if the pointer is associated with the left hand, false
if it isn't.
*/
Q_INVOKABLE bool isLeftHand(unsigned int uid) { return DependencyManager::getjoint
property set to
+ * "_CONTROLLER_RIGHTHAND"
or "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND"
, or a stylus pointer with
+ * hand
property set to 1
.
* @function Pointers.isRightHand
- * @param {number} uid The ID of the Pointer, as returned by {@link Pointers.createPointer}.
- * @returns {boolean} True if the Pointer is a Joint Ray Pointer with joint == "_CONTROLLER_RIGHTHAND" or "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND", or a Stylus Pointer with hand == 1
+ * @param {number} id - The ID of the pointer.
+ * @returns {boolean} true
if the pointer is associated with the right hand, false
if it isn't.
*/
Q_INVOKABLE bool isRightHand(unsigned int uid) { return DependencyManager::getjoint
property set
+ * to "Mouse"
.
* @function Pointers.isMouse
- * @param {number} uid The ID of the Pointer, as returned by {@link Pointers.createPointer}.
- * @returns {boolean} True if the Pointer is a Mouse Ray Pointer, false otherwise.
+ * @param {number} id - The ID of the pointer.
+ * @returns {boolean} true
if the pointer is associated with the system mouse, false
if it isn't.
*/
Q_INVOKABLE bool isMouse(unsigned int uid) { return DependencyManager::getrenderStates
and
+ * defaultRenderStates
for ray and parabola pointers, {}
for stylus pointers.
+ * @example true
to use precision picking, false
to use coarse picking.
@@ -115,7 +116,7 @@ public:
Q_INVOKABLE void setPrecisionPicking(unsigned int uid, bool precisionPicking);
/**jsdoc
- * Sets a list of entity and avatar IDs to ignore during intersection.
+ * Sets a list of entity and avatar IDs that a ray pick should ignore during intersection.
* @function RayPick.setIgnoreItems
* @param {number} id - The ID of the ray pick.
* @param {Uuid[]} ignoreItems - The list of IDs to ignore.
@@ -123,7 +124,8 @@ public:
Q_INVOKABLE void setIgnoreItems(unsigned int uid, const QScriptValue& ignoreEntities);
/**jsdoc
- * Sets a list of entity IDs and/or avatar IDs to include during intersection, instead of intersecting with everything.
+ * Sets a list of entity and avatar IDs that a ray pick should include during intersection, instead of intersecting with
+ * everything.
* @function RayPick.setIncludeItems
* @param {number} id - The ID of the ray pick.
* @param {Uuid[]} includeItems - The list of IDs to include.
@@ -132,9 +134,9 @@ public:
/**jsdoc
- * Checks if a pick is associated with the left hand: a ray or parabola pick with joint set to
- * "_CONTROLLER_LEFTHAND"
or "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND"
, or a stylus pick with hand
- * set to 0
.
+ * Checks if a pick is associated with the left hand: a ray or parabola pick with joint
property set to
+ * "_CONTROLLER_LEFTHAND"
or "_CAMERA_RELATIVE_CONTROLLER_LEFTHAND"
, or a stylus pick with
+ * hand
property set to 0
.
* @function RayPick.isLeftHand
* @param {number} id - The ID of the ray pick.
* @returns {boolean} true
if the pick is associated with the left hand, false
if it isn't.
@@ -142,9 +144,9 @@ public:
Q_INVOKABLE bool isLeftHand(unsigned int uid);
/**jsdoc
- * Checks if a pick is associated with the right hand: a ray or parabola pick with joint set to
- * "_CONTROLLER_RIGHTHAND"
or "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND"
, or a stylus pick with hand
- * set to 1
.
+ * Checks if a pick is associated with the right hand: a ray or parabola pick with joint
property set to
+ * "_CONTROLLER_RIGHTHAND"
or "_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND"
, or a stylus pick with
+ * hand
property set to 1
.
* @function RayPick.isRightHand
* @param {number} id - The ID of the ray pick.
* @returns {boolean} true
if the pick is associated with the right hand, false
if it isn't.
@@ -152,7 +154,8 @@ public:
Q_INVOKABLE bool isRightHand(unsigned int uid);
/**jsdoc
- * Checks if a pick is associated with the system mouse: a ray or parabola pick with joint set to "Mouse"
.
+ * Checks if a pick is associated with the system mouse: a ray or parabola pick with joint
property set to
+ * "Mouse"
.
* @function RayPick.isMouse
* @param {number} id - The ID of the ray pick.
* @returns {boolean} true
if the pick is associated with the system mouse, false
if it isn't.