home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD1.iso / GFX / Raytracing / Raytracer / LW5VT09.LHA / Toaster / Arexx_examples / lwm / RecurseClone.lwm < prev    next >
Encoding:
Text File  |  1996-06-10  |  4.4 KB  |  191 lines

  1. /* CMD: Recursive Clone
  2.  * Clone With transformed Object !! STILL EXPERIMENTAL !! */
  3. /* Wed Dec 30 13:14:49 1992 */
  4.  
  5. ax.1='X'
  6. ax.2='Y'
  7. ax.3='Z'
  8. address "LWModelerARexx.port"
  9. call addlib "LWModelerARexx.port", 0
  10. SIGNAL ON ERROR
  11. SIGNAL ON SYNTAX
  12. call addlib "rexxsupport.library", 0, -30, 0
  13. call addlib "rexxmathlib.library", 0, -30, 0
  14. sysnam = 'Recursive Transform Clone'
  15. filnam = 'T:RClone.state'
  16. version = sysnam' v. 1.0'
  17.  
  18. empty=emptylayers()
  19. layer=curlayer()
  20. olayer=layer
  21. if empty~="" then do
  22.   layer=word(empty,1)
  23.   slayer=word(empty,2)
  24.   empty=1
  25.   end
  26. else do    /* Need 1 layer to transform in */
  27.   call notify(1,'!'sysnam,'@Sorry, No Scratch Layer Available')
  28.   exit
  29.   end
  30.  
  31. if slayer="" then do  /* Use second layer, if available for finished object */
  32.   if ~notify(2,'!'sysnam,'@No Scratch Layers Available','@Transform Original?') then exit
  33.   slayer=olayer
  34.   end
  35. else do
  36.   call COPY
  37.   call 'SETLAYER 'slayer
  38.   call PASTE
  39.   end
  40.  
  41. lev=0
  42. cnt='0,0,0'
  43. mov='0,0,0'
  44. rot='0,0,0'
  45. scl='1,1,1'
  46. sym=1
  47.  
  48. if (exists(filnam)) then do
  49.     if (~open(state, filnam, 'R')) then break
  50.     if (readln(state) ~= version) then break
  51.     lev = readln(state)
  52.     cnt=readln(state)
  53.     mov=readln(state)
  54.     rot=readln(state)
  55.     scl=readln(state)
  56.     sym=readln(state)
  57.     call close state
  58. end
  59. say cnt mov scl rot
  60.  
  61. call req_begin sysnam
  62.  
  63. /* id_txt = req_addcontrol('Danger ', 'T','This one can go wild...') */
  64. id_lev = req_addcontrol("Level [<5]", 'N')
  65. id_cnt = req_addcontrol("Center", 'V', 0)
  66. id_scl = req_addcontrol("Scale", 'V', 0)
  67. id_rot = req_addcontrol("Rotate", 'V', 0)
  68. id_mov = req_addcontrol("Move", 'V', 0)
  69. id_sym = req_addcontrol("Rotational Symmetry", 'CH','OFF X Y Z')
  70. id_deg = req_addcontrol("Degree of Symmetry, n:",'N')
  71.  
  72. call req_setval id_lev, lev,1
  73. call req_setval id_sym, sym,1
  74. call req_setval id_deg, 6,6
  75. call req_setval id_cnt, translate(cnt,' ',','),0
  76. call req_setval id_scl, translate(scl,' ',','),1
  77. call req_setval id_rot, translate(rot,' ',','),0
  78. call req_setval id_mov, translate(mov,' ',','),0
  79.  
  80. if (~req_post()) then do
  81.     call req_end
  82.     exit
  83. end
  84.  
  85. lev=req_getval(id_lev)
  86. if lev>4 then lev=4
  87. deg=req_getval(id_deg)
  88. sym=req_getval(id_sym)
  89. t= req_getval(id_cnt)
  90. parse var t cx cy cz
  91. t= req_getval(id_scl)
  92. parse var t sx sy sz
  93. t= req_getval(id_rot)
  94. parse var t rx ry rz
  95. t= req_getval(id_mov)
  96. parse var t mx my mz
  97.  
  98. cnt= cx','cy','cz
  99. mov= mx','my','mz
  100. rot= rx','ry','rz
  101. scl= sx','sy','sz
  102.  
  103. if (open(state, filnam, 'W')) then do
  104.     call writeln state, version
  105.     call writeln state, lev
  106.     call writeln state, cnt
  107.     call writeln state, mov
  108.     call writeln state, rot
  109.     call writeln state, scl
  110.     call writeln state, sym
  111.     call close state
  112. end
  113.  
  114. call req_end
  115.  
  116. sym=sym-1
  117. Ax=Ax.sym
  118.  
  119. /* Can accumulate transformations either by transforming object or transform,
  120.   i.e. F(A)->A' ==> F(A')->A'' vs F'(A)->A'' There are differences...
  121.  */
  122.  
  123. call COPY
  124. call 'SETLAYER 'layer
  125. if empty then call PASTE
  126. do i=0 to lev
  127.   call COPY
  128.   call 'SETLAYER 'slayer  /* Hold present level here */
  129.   call PASTE
  130.   if sym~=0 then call symmetrize(Ax,deg)
  131.   call 'SETLAYER 'layer /* Back to work layer */
  132.   do n=0 to i
  133.     if sym~=0 then call symmetrize(Ax,deg)
  134.     call transform( mov, rot, scl, cnt)
  135.   end
  136.   call COPY
  137.   call 'SETLAYER 'slayer
  138.   call PASTE /* Add next level in, cut over to work layer  */
  139.   call CUT
  140.   call 'SETLAYER 'layer
  141.   call PASTE
  142.  
  143. /*   cx=cx*sx; cy=cy*sy; cz=cz*sz */
  144. /*   rx=rx*sx; ry=ry*sy; rz=rz*sz */
  145.    cx=cx+mx; cy=cy+my; cz=cz+mz  /* Move Center */
  146.    cnt= cx','cy','cz
  147.    mx=mx*sx; my=my*sy; mz=mz*sz
  148.    mov= mx','my','mz
  149. /*   rot= rx','ry','rz */
  150. /*   scl= sx','sy','sz */
  151.   end
  152.  
  153. call 'SETLAYER 'layer /* Clean up... */
  154. call CUT
  155. call 'SETLAYER 'slayer
  156. call PASTE
  157. exit
  158.  
  159. SYNTAX:
  160. ERROR:
  161.   say 'Sorry, Error #'RC' on line 'SIGL' has been detected.'
  162.    say errortext(rc)
  163.   say sourceline(SIGL)
  164.   t=notify(1,'!Total Bummer Dude!','!An error has been detected.','@'ErrorText(rc),'Line 'SIGL)
  165.   call end_all
  166.   exit
  167.  
  168. Symmetrize:
  169.   arg axis, degree
  170.   astep=360/degree
  171.   a=0
  172.   call 'COPY'      /* Get 0° version */
  173.   do i=1 to degree-1
  174.     call 'ROTATE (astep,'axis',0)
  175.     call 'PASTE'      /* Put down 0° version */
  176.     a=a+astep
  177.     end
  178.   return
  179.  
  180. Transform:
  181.   arg mov, rot, scl, cnt
  182.   parse var rot rx','ry','rz
  183.   if rx~=0 then call 'ROTATE C['cnt'] Axis=X ang'rx  /* Interpret rotations as sequential operations */
  184.   if ry~=0 then call 'ROTATE C['cnt'] Axis=Y ang'ry
  185.   if rz~=0 then call 'ROTATE C['cnt'] Axis=Z ang'rz
  186.   call 'MOVE O['mov']'
  187.   call 'SCALE C['cnt'] F['scl']'
  188.   return
  189.  
  190.  
  191. /* ROTATE(angle<number>, axis<X|Y|Z>, [center<vector>]) */