From Valve Developer Community
< SteamVR‎ | Environments‎ | Scripting‎ | API
Revision as of 07:28, 23 June 2019 by Rectus (talk | contribs) (Updated categories to match the other SteamVR Home pages)
Jump to: navigation, search

Function Description

table OnHandleInput(table input)

Adding this function to the entity script of a prop_destinations_tool causes it to be called periodically by the game while the tool is held. A table of motion controller inputs associated with the hand using the tool is passed to the function. Modifying the table and returning it allows for capturing inputs making the game code ignore them.

-- Note that the m_nHandID variable is the current hand ID, and needs to be set from the SetEquipped() function.

function OnHandleInput( input ) 
 	-- this is lua's ugly version of a ternary operator
 	-- we do this because we only care about the input from the hand that is holding us
 	-- but you could check input from the other hand if you want
 	local nIN_TRIGGER = IN_USE_HAND1; if (m_nHandID == 0) then nIN_TRIGGER = IN_USE_HAND0 end;
 	local nIN_GRIP = IN_GRIP_HAND1; if (m_nHandID == 0) then nIN_GRIP = IN_GRIP_HAND0 end;
 	-- this checks to see if the TRIGGER has been pressed on this hand
 	-- this is only set when the trigger is first pressed
 	-- if you want to see if it's HELD, check buttonsDown instead.
 	if ( input.buttonsPressed:IsBitSet( nIN_TRIGGER ) ) then
 		print( "TRIGGER is pressed" );

 		-- now clear it because we don't want any other tools to do anything with the trigger press
 		input.buttonsPressed:ClearBit( nIN_TRIGGER );
 	-- this checks if the TRIGGER has just been released
 	if ( input.buttonsReleased:IsBitSet( nIN_TRIGGER ) ) then
 		print( "TRIGGER is released" );

 		-- If the trigger release is not cleared, the tool will be dropped 
		-- as soon as the player releases the trigger after picking the tool up!
 		input.buttonsReleased:ClearBit( nIN_TRIGGER );
 	-- checks to see if the GRIP has been pressed this update
 	if ( input.buttonsReleased:IsBitSet( nIN_GRIP ) ) then
 		print( "GRIP is released" );
 		-- if it's pressed, clear the bit!
 		input.buttonsReleased:ClearBit( nIN_GRIP );
 		-- drop the tool

 	-- we return the input data back to C++ code so other tools can use it
 	-- you could always return null if you want this tool to control 100% of the input...
 	return input;


Type Name Description
table input Table containing the the input state for the motion controller.

Input table

Structure of the input table passed to the function. Button values for both controllers are present in the button masks. The bit flags for the button masks can be found here.

Type Name Description
UInt64 buttonsDown Button mask for buttons being held down.
UInt64 buttonsPressed Button mask for buttons that have just been pressed.
UInt64 buttonsReleased Button mask for buttons that have just been released.
float joystickX To do: Find how these differ from the trackpad values.
float joystickY
float trackpadX Horizontal trackpad touch position ( -1.0 to 1.0 ).
float trackpadY Vertical trackpad touch position ( -1.0 to 1.0 ).
float triggerValue Analog trigger value ( 0 to 1.0 ).


table - Return the input table to pass the button data back to the game. Returning nil captures all button presses.