106 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Factor
		
	
	
 | 
						|
USING: kernel accessors locals namespaces sequences threads
 | 
						|
       math math.order math.vectors
 | 
						|
       calendar
 | 
						|
       colors opengl ui ui.gadgets ui.gestures ui.render
 | 
						|
       circular
 | 
						|
       processing.shapes ;
 | 
						|
 | 
						|
IN: trails
 | 
						|
 | 
						|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 | 
						|
 | 
						|
! Example 33-15 from the Processing book
 | 
						|
 | 
						|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 | 
						|
 | 
						|
! Return the mouse location relative to the current gadget
 | 
						|
 | 
						|
: mouse ( -- point ) hand-loc get  hand-gadget get screen-loc  v- ;
 | 
						|
 | 
						|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 | 
						|
 | 
						|
: point-list ( n -- seq ) [ drop { 0 0 } ] map <circular> ;
 | 
						|
 | 
						|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 | 
						|
 | 
						|
: percent->radius ( percent -- radius ) neg 1 + 25 * 5 max ;
 | 
						|
 | 
						|
: dot ( pos percent -- ) percent->radius circle ;
 | 
						|
 | 
						|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 | 
						|
 | 
						|
TUPLE: <trails-gadget> < gadget paused points ;
 | 
						|
 | 
						|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 | 
						|
 | 
						|
:: iterate-system ( GADGET -- )
 | 
						|
 | 
						|
  ! Add a valid point if the mouse is in the gadget
 | 
						|
  ! Otherwise, add an "invisible" point
 | 
						|
  
 | 
						|
  hand-gadget get GADGET =
 | 
						|
    [ mouse       GADGET points>> push-circular ]
 | 
						|
    [ { -10 -10 } GADGET points>> push-circular ]
 | 
						|
  if ;
 | 
						|
 | 
						|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 | 
						|
 | 
						|
:: start-trails-thread ( GADGET -- )
 | 
						|
  GADGET f >>paused drop
 | 
						|
  [
 | 
						|
    [
 | 
						|
      GADGET paused>>
 | 
						|
        [ f ]
 | 
						|
        [ GADGET iterate-system GADGET relayout-1 1 milliseconds sleep t ]
 | 
						|
      if
 | 
						|
    ]
 | 
						|
    loop
 | 
						|
  ]
 | 
						|
  in-thread ;
 | 
						|
 | 
						|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 | 
						|
 | 
						|
M: <trails-gadget> pref-dim* ( <trails-gadget> -- dim ) drop { 500 500 } ;
 | 
						|
 | 
						|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 | 
						|
 | 
						|
: each-percent ( seq quot -- )
 | 
						|
  [
 | 
						|
    dup length
 | 
						|
    dup [ / ] curry
 | 
						|
    [ 1+ ] prepose
 | 
						|
  ] dip compose
 | 
						|
  2each ;                       inline
 | 
						|
 | 
						|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 | 
						|
 | 
						|
M:: <trails-gadget> draw-gadget* ( GADGET -- )
 | 
						|
  origin get
 | 
						|
  [
 | 
						|
    T{ rgba f 1 1 1 0.4 } \ fill-color set   ! White, with some transparency
 | 
						|
    T{ rgba f 0 0 0 0   } \ stroke-color set ! no stroke
 | 
						|
    
 | 
						|
    black gl-clear
 | 
						|
 | 
						|
    GADGET points>> [ dot ] each-percent
 | 
						|
  ]
 | 
						|
  with-translation ;
 | 
						|
 | 
						|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 | 
						|
 | 
						|
: trails-gadget ( -- <trails-gadget> )
 | 
						|
 | 
						|
  <trails-gadget> new-gadget
 | 
						|
 | 
						|
    300 point-list >>points
 | 
						|
 | 
						|
    t >>clipped?
 | 
						|
 | 
						|
  dup start-trails-thread ;
 | 
						|
 | 
						|
: trails-window ( -- ) [ trails-gadget "Trails" open-window ] with-ui ;
 | 
						|
 | 
						|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 | 
						|
 | 
						|
MAIN: trails-window |