Steam VR template: /flow_callbacks.lua   code sample - Stingray Lua API Reference
         
	
    
    
ProjectFlowCallbacks = ProjectFlowCallbacks or {}
-- Example custom project flow node callback. Prints a message.
-- The parameter t contains the node inputs, and node outputs can
-- be set on t. See documentation for details.
local Unit = stingray.Unit
local Matrix4x4 = stingray.Matrix4x4
local Quaternion = stingray.Quaternion
local Vector3 = stingray.Vector3
function ProjectFlowCallbacks.example(t)
    local message = t.Text or ""
    print("Example Node Message: " .. message)
end
function ProjectFlowCallbacks.update_look_at_constraint(t)
    local unit = t.unit
    if not Unit.has_data(unit, "saved_rotation") then
        print ("no saved_rotation")
        return
    end
    if not Unit.has_data(unit, "grab_location") then
        print ("no grab_location")
        return
    end
    local saved_rotation = Unit.get_data(unit, "saved_rotation")
    local grab_location = Unit.get_data(unit, "grab_location")
    -- Rotate around this up axis
    local up_axis = Vector3(0, 1, 0)
    local target_unit = unit
    local world_target_pos = t.world_look_at_position
    local node_to_rotate = t.node_to_rotate
    local rotate_id = Unit.node(unit, node_to_rotate)
    local parent = Unit.scene_graph_parent(unit, rotate_id)
    local parent_pose = Unit.world_pose(unit, parent)
    local inverse_parent_pose = Matrix4x4.inverse(parent_pose)
    local local_target_pos = Matrix4x4.transform(inverse_parent_pose, world_target_pos)
    local target_angle = math.atan2(local_target_pos.x, local_target_pos.z) / (2 * math.pi)
    local local_grab_pos = Matrix4x4.transform(inverse_parent_pose, grab_location)
    local grab_angle = math.atan2(local_grab_pos.x, local_grab_pos.z) / (2 * math.pi)
    local delta = target_angle - grab_angle
    delta = delta % 1.0
    if delta > 0.5 then delta = delta - 1 end
    local delta_rotation = Quaternion.axis_angle(up_axis, delta * (math.pi * 2))
    local rotation = Quaternion.multiply(saved_rotation, delta_rotation)
    Unit.set_local_rotation(unit, rotate_id, rotation)
end