    Rem Pick Object
    Rem Created: 14/07/2003 18:54:11

    rem Init app
    sync on : sync rate 60

    rem Make floor
    make object plain 1,300,300
    position object 1,0,-50,0
    xrotate object 1,270

    rem Make object to drag
    make object cube 2,100
    set shadow shading on 2

    rem Setup camera and light
    set point light 0,-100,500,-100
    position camera -200,0,-200
    point camera 0,0,0

    rem main loop
    do

    rem Call drag subroutine
    gosub _drag_object

    rem User prompt
    center text 320,20,"CLICK AND HOLD OBJECT TO DRAG - RIGHT BUTTON TO ROTATE"

    rem Update screen
    sync

    rem End loop
    loop

    _drag_object:

    if mouseclick()=0 then pickmode=0 : cursorobj=0
    mclick=mouseclick()
    if mclick>0
     if pickmode=0
      cursorobj=pick object(mousex(),mousey(),2,2)
      if cursorobj>0
       pickmode=mclick
       pickdistance#=get pick distance()
       pickfromx#=get pick vector x()
       pickfromy#=get pick vector y()
       pickfromz#=get pick vector z()
       if pickmode=1
        objx#=object position x(cursorobj)
        objy#=object position y(cursorobj)
        objz#=object position z(cursorobj)
       else
        objx#=object angle x(cursorobj)
        objy#=object angle y(cursorobj)
        objz#=object angle z(cursorobj)
        pickdiffx#=mousemovey() : pickdiffx#=0
        pickdiffy#=mousemovex() : pickdiffy#=0
       endif
      else
       highlightobj=0
      endif
     endif
     if pickmode>0
      if pickmode=1
       pick screen mousex(),mousey(),pickdistance#
       picktox#=get pick vector x()
       picktoy#=get pick vector y()
       picktoz#=get pick vector z()
       pickdiffx#=picktox#-pickfromx#
       pickdiffy#=picktoy#-pickfromy#
       pickdiffz#=picktoz#-pickfromz#
       grid=0
       if grid=1
        pickdiffx#=int(pickdiffx#/5)*5
        pickdiffy#=int(pickdiffy#/5)*5
        pickdiffz#=int(pickdiffz#/5)*5
       endif
       position object cursorobj,objx#+pickdiffx#,objy#+pickdiffy#,objz#+pickdiffz#
      else
       pickdiffx#=pickdiffx#+mousemovey()
       pickdiffy#=pickdiffy#+mousemovex()
       grid=0
       if grid=1
        tpickdiffx#=int(pickdiffx#/22.5)*22.5
        tpickdiffy#=int(pickdiffy#/22.5)*22.5
       else
        tpickdiffx#=pickdiffx#
        tpickdiffy#=pickdiffy#
       endif
       rotate object cursorobj,wrapvalue(objx#-tpickdiffx#),wrapvalue(objy#-tpickdiffy#),objz#
      endif
     endif
    endif

    return