( --------------------------------- )
( --                            --- )
( --      ULTRA TOOLS           --- )
( --                            --- )
( --   by Alessandro Tasora     --- )
( --------------------------------- )
(                                   ) 
(    REAL 3D RPL CUSTOM TOOLS       )
(                                   )
( --------------------------------- )

"r3d3:rpl/sys/vectors.rpl"  LOAD
"r3d3:rpl/sys/io.rpl"       LOAD
"r3d3:rpl/sys/locks.rpl"    LOAD
"r3d3:rpl/sys/editor.rpl"   LOAD
"r3d3:rpl/sys/objects.rpl"  LOAD
"r3d3:rpl/sys/coordsys.rpl" LOAD
"r3d3:rpl/sys/animation.rpl" LOAD



FVARIABLE count
VVARIABLE sum

( this world finds the average of objects'COGs

: aveCOG ( 0,..,aObj -> vAverage )
  0 count F!
  0 0 0 sum V!
  BEGIN
  DUP   
  WHILE 
   iOP_COG O_PROP sum V@ VADD sum V!
   count F@ 1 F+ count F!
  REPEAT
  DROP   
  1 count F@ F/ count F!
  sum V@ count F@ VMUL
;

VVARIABLE vDelta
VVARIABLE center


: MoveReq                                
  0 0 0 vDelta V!
  vDelta "Move selected objects" GET_VECT
  IF
    iLOCK_EXCL O_LOCK
    O_GETSEL
    vDelta V@ 0 M_MOVE
    iLOCK_REMOVE O_LOCK 
  ENDIF                
;


: SizeReq
  1 1 1 vDelta V!
  vDelta "Size selected objects" GET_VECT
  IF
   iLOCK_EXCL O_LOCK 
   O_GETSEL
   O_GETSEL
   aveCOG         ( finds the center of sizing
   1 0 0 
   0 1 0
   0 0 1
   vDelta V@ 1 1 1 VSUB
   0 M_STRETCH
   iLOCK_REMOVE O_LOCK
  ENDIF
;


: PlaceReq
  iLOCK_EXCL O_LOCK  
  O_GETSEL
  aveCOG
  O_GETSEL
  aveCOG
  center V!
  vDelta V!
  vDelta "Place selected objects" GET_VECT
  IF
    O_GETSEL
    vDelta V@ center V@ VSUB 0 M_MOVE 
  ENDIF
  iLOCK_REMOVE O_LOCK                
;

CVARIABLE coords

: RotReq
  1 0 0
  0 1 0
  0 0 1 coords C!
  0 0 0 vDelta V!
  vDelta "Rotate selected objects" GET_VECT
  IF
   iLOCK_EXCL O_LOCK 
   O_GETSEL
   O_GETSEL
   aveCOG         ( finds the center of rotation

   vDelta V@
   coords
   CROTATE
   coords C@
   
   0 M_ROTATE
   iLOCK_REMOVE O_LOCK
  ENDIF
;


: WireLR
"r3d2:environments/PWView" 65535 0 FIL_LOAD
;

: ScrHAM
"r3d2:environments/Alex-HAM" 65535 0 FIL_LOAD
;


: AssemblyANIM
"deltaconvert NAME r3d3:deltas/delta TO r3d2:deltas/preview.anim DT=3" SYSTEM
"delete r3d3:deltas/delta#?" SYSTEM
"sys:system/vt r3d2:deltas/preview.anim FP 25" SYSTEM
;

: MakeANIM
  (  VARIABLE preframes
  (  VARIABLE preseconds
  
  0 "PWView" iWM_ACTIVATE WND_SENDMSG
  NOT IF
        "r3d2:environments/PWView" 65535 0 FIL_LOAD   ( insert the preview screen
  ENDIF
 
 ( 40 preframes !  2 preseconds !

  "attr(A:->frames)" EVAL
  0
  "r3d3:deltas/delta"
  3 					( SAVE + WIRE -no goto->PLAY TO
  "%s%d"
  "Real3D"				( Screen Name
  ""
  0
  "attr(A:->samples)" EVAL
  "attr(A:->seconds)" EVAL  
  ASPEC

  0 0 1 PLAY      			( *** play animation and save screens

  5 1 0 MENU                            ( rewind animation   
 
  "attr(A:->flags) = 2" EVAL DROP    	     ( set WIRE - no SAVE -no GOTO-

  "deltaconvert NAME r3d3:deltas/delta TO r3d2:deltas/preview.anim DT=3" SYSTEM
  "delete r3d3:deltas/delta#?" SYSTEM
  "sys:system/vt r3d2:deltas/preview.anim FP 25" SYSTEM
;

: PlayANIM
"sys:system/vt r3d2:deltas/preview.anim FP 25" SYSTEM
;


: OpenPicasso24
    0 7 0 MENU   ( open 
    0 7 2 MENU   ( set FBuffer Modes ) 
    0 7 1 MENU   ( close                              
    0 7 0 MENU   ( reopen
;

: ModePicasso24
    0 7 2 MENU   ( set FBuffer Modes ) 
    0 7 1 MENU   ( close                              
    0 7 0 MENU   ( reopen
;


( ********************
( CUSTOM MENUS
( ********************


& MoveReq  "Edit/Move req." ADDMENU 
& SizeReq  "Edit/Size req." ADDMENU
& PlaceReq "Edit/Place req." ADDMENU
& RotReq   "Edit/Rotate req." ADDMENU

& MakeANIM "Anim preview/Make Preview"   ADDMENU
& WireLR   "Anim preview/open wireframe" ADDMENU
& ScrHAM   "Anim preview/open HAM"       ADDMENU
& MakeANIM "Anim preview/Make Preview"   ADDMENU
& AssemblyANIM "Anim preview/deltas->anim" ADDMENU
& PlayANIM "Anim preview/play preview"   ADDMENU

& OpenPicasso24 "Picasso/open buffer" ADDMENU
& ModePicasso24 "Picasso/set b. mode" ADDMENU 

( ********************
( KEY SHORTCUTS    
( ********************


( : KEY_¸ 0 7 2 MENU 0 ( ALT M = set FBuffer Modes ) 
(        0 7 1 MENU 0                               
(        0 7 0 MENU 0 ;
( : KEY_4 1 0 1 MENU 0 ;  ( 4 = poliedro )
( : KEY_5 1 0 6 MENU 0 ;  ( 5 = rettangolo )
( : KEY_6 1 0 17 MENU 0 ; ( 6 =cilindro )
( : KEY_7 1 0 21 MENU 0 ; ( 7 =sfera )
( : KEY_8 1 4 5  MENU 0 ; ( 8 =open line ) 
( : KEY_9 1 4 9  MENU 0 ; ( 9 =spline controlpoint)
( : KEY_0 1 4 10 MENU 0 ; ( 0 =spline knotpoint )
( : KEY_' 1 4 11 MENU 0 ; ( ' =spline curve )

( : KEY_ì                                                          
(  "r3d2:environments/alex-wb800-win" lIO_RWIN lIO_RWIN FIL_LOAD ;  
( : KEY_?
(  "r3d2:environments/alex-wb800-aniwin" lIO_RWIN lIO_RWIN FIL_LOAD ; 


( *******************
( MISC.
( *******************

"r3d2:materials/materials" lIO_RMTR lIO_RMTR FIL_LOAD

( "sys:prefs/toolmanager r3d2:ico3d/toolmanager.prefs USE" SYSTEM 