Difference between revisions of "LlDetectedGrab"

From Second Life Wiki
Jump to navigation Jump to search
m
 
(16 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{LSL_Function
{{LSL_Function
|inject-2={{LSL_Function/detected|number|grab|error=[[ZERO_VECTOR|<0.0, 0.0, 0.0>]]}}
|func_id=37|func_sleep=0.0|func_energy=10.0
|func_id=37|func_sleep=0.0|func_energy=10.0
|sort=DetectedGrab
|sort=DetectedGrab|func=llDetectedGrab
|func=llDetectedGrab|return_type=vector|p1_type=integer|p1_name=number
|return_type=vector
|func_footnote=Returns {{LSLG|ZERO_VECTOR|<0.0, 0.0, 0.0>}} if '''number''' is out of range or if the {{LSLGC|Detected|detected}} event does not support this attribute.
|p1_type=integer|p1_name=number
|func_desc
|func_desc
|return_text=that is the {{LSLG|grab}} offset of the user {{LSLGC|Touch|touching}} object.
|return_text=that is the {{LSLGC|Grab|grab}} offset of the user [[touch|touching]] the object; only works in the [[touch]] event.
|spec
|func_footnote=Returns [[ZERO_VECTOR|<0.0, 0.0, 0.0>]] if {{LSLP|number}} is out of range or if called from an event other than the [[touch]] event.
|spec=*If the object is [[LSL Glossary#physical|physical]], grabs are detected if the avatar has permission to move the object and the object is not [[locked]].
*If the object is [[LSL Glossary#nonphysical|nonphysical]], grabs from all avatars are detected.
|caveats
|caveats
|constants
|constants
|examples
|examples=
<source lang="lsl2">
default
{
    state_entry()
    {
        llSetStatus(PRIM_PHYSICS,TRUE);//This allows the object to be "grabbed" and dragged
    }
    touch(integer num_detected)
    {
        llSay(0,(string)llDetectedGrab(0));//Be prepared for a great amount of chatted info.
                                          //The faster you move the mouse while grabbing the object the greater the offset becomes.
                                          //This is not due to the speed but the reaction time of the turn around of the physical prim,
                                          //thus an offset (distance from grab to prim center) is created and measured by this function.
    }
}
</source>
 
<source lang="lsl2">/******
 
Simple llDetectedGrab illustration, rez a prim and add this script.
The prim will become a cone that follows mouse grabs.
 
Click and hold the mouse button down on the object, then:
- Drag left and right to move parallel to the camera focal plane.
- Drag up and down to move to and from the camera.
- Hold down Ctrl, then drag up and down to move vertically.
******/
 
default
{
    state_entry()
    {
        llMinEventDelay(0.25);
        llSetStatus(STATUS_PHYSICS, FALSE); // make the object static for simplicity
        llSetPrimitiveParams([
            PRIM_SIZE, <0.5, 0.5, 0.5>,
            PRIM_TYPE, PRIM_TYPE_CYLINDER, PRIM_HOLE_DEFAULT, <0.0, 1.0, 0.0>,
              0.0, ZERO_VECTOR, ZERO_VECTOR, ZERO_VECTOR
        ]); // a cone that can follow the mouse pointer
    }
   
    touch(integer total_number)
    {
        llLookAt(llGetPos() + llDetectedGrab(0), 1.0, 1.0);
    }
}</source>
|helpers
|helpers
|also_functions
|also_functions={{LSL DefineRow||[[llPassTouches]]|}}
|also_events=* {{LSLG|touch_start}}
|also_events={{LSL DefineRow||[[touch_start]]|}}
* {{LSLG|touch}}
{{LSL DefineRow||[[touch]]|}}
* {{LSLG|touch_end}}
{{LSL DefineRow||[[touch_end]]|}}
|also_articles= * {{LSLGC|Detected}}
|also_articles={{LSL DefineRow||{{LSLGC|Grab}}|}}
|notes
|notes=llDetectedGrab() is not blocked by [[STATUS_BLOCK_GRAB]] or [[STATUS_BLOCK_GRAB_OBJECT]].
|permission
|cat1=Grab
|negative_index=false
|cat2=Touch
|cat1
|cat2
|cat3
|cat3
|cat4
|cat4
}}
}}
{{LSLC|Detected|Grab}}

Latest revision as of 23:52, 21 January 2015

Summary

Function: vector llDetectedGrab( integer number );
0.0 Forced Delay
10.0 Energy

Returns a vector that is the grab offset of the user touching the object; only works in the touch event.

• integer number Index of detection information

number does not support negative indexes. Returns <0.0, 0.0, 0.0> if number is out of range or if called from an event other than the touch event.

Specification

llDetected* functions only work if called from within Detection events (collision, collision_start, collision_end, sensor, touch, touch_start, touch_end) or in functions called by Detection events. They will fail silently and return unusable values if called during other events.

  • If the object is physical, grabs are detected if the avatar has permission to move the object and the object is not locked.
  • If the object is nonphysical, grabs from all avatars are detected.

Caveats

  • If number is out of bounds this function returns <0.0, 0.0, 0.0> and the script continues to execute without an error message.
  • Events that enable the llDetected* functions always return at least one detected item.
    • Detection events are not raised if there is nothing detected.[1]
    • The detection event's items detected parameter is initially never less than 1.[2]

Examples

default
{
    state_entry()
    {
        llSetStatus(PRIM_PHYSICS,TRUE);//This allows the object to be "grabbed" and dragged
    }
    touch(integer num_detected)
    {
        llSay(0,(string)llDetectedGrab(0));//Be prepared for a great amount of chatted info.
                                           //The faster you move the mouse while grabbing the object the greater the offset becomes.
                                           //This is not due to the speed but the reaction time of the turn around of the physical prim,
                                           //thus an offset (distance from grab to prim center) is created and measured by this function.
    }
}
/******

Simple llDetectedGrab illustration, rez a prim and add this script.
The prim will become a cone that follows mouse grabs.

 Click and hold the mouse button down on the object, then:
 - Drag left and right to move parallel to the camera focal plane.
 - Drag up and down to move to and from the camera.
 - Hold down Ctrl, then drag up and down to move vertically.
 
******/

default
{
    state_entry()
    {
        llMinEventDelay(0.25);
        llSetStatus(STATUS_PHYSICS, FALSE); // make the object static for simplicity
        llSetPrimitiveParams([
            PRIM_SIZE, <0.5, 0.5, 0.5>,
            PRIM_TYPE, PRIM_TYPE_CYLINDER, PRIM_HOLE_DEFAULT, <0.0, 1.0, 0.0>,
              0.0, ZERO_VECTOR, ZERO_VECTOR, ZERO_VECTOR
        ]); // a cone that can follow the mouse pointer
    }
    
    touch(integer total_number)
    {
        llLookAt(llGetPos() + llDetectedGrab(0), 1.0, 1.0);
    }
}

Notes

llDetectedGrab() is not blocked by STATUS_BLOCK_GRAB or STATUS_BLOCK_GRAB_OBJECT.

See Also

Events

•  touch_start
•  touch
•  touch_end

Functions

•  llPassTouches

Articles

•  Detected
•  Grab

Deep Notes

Footnotes

  1. ^ The exception is no_sensor but it doesn't enable llDetected* functions.
  2. ^ Like all event parameters, the user can overwrite the initial value.

Signature

function vector llDetectedGrab( integer number );