home *** CD-ROM | disk | FTP | other *** search
/ Maximum 3D 3 / m3d-p3.iso / 3DS_MAX / 3DSMAX.2_0 / SCRIPTS / RANDMIZ3.MS < prev    next >
Text File  |  1997-10-19  |  5KB  |  145 lines

  1. utility RandomCopies2 "Random Copies II"
  2. (
  3.     local object,           -- local var to store the picked source object
  4.           count = 0,        -- copy count
  5.           copies = #(),     -- stores current copy set
  6.           rotates = #(),    -- stores current random moves & rotates
  7.           moves = #() 
  8.     group "About Randomize"
  9.     (
  10.     label l0 "RANDOMIZE"
  11.     label l1 "by Fred Ruff"
  12.     label l2 " v 1.0"
  13.     
  14.  
  15.     )
  16.     
  17.     
  18.     group "Source Object"
  19.     (
  20.         pickbutton pick_object "none" width:100
  21.     
  22.         radiobuttons copy_type
  23.             labels:#("instance", "reference", "copy")
  24.             default:1
  25.     )
  26.     
  27.     group "Creation Parameters"
  28.     (
  29.         spinner numCopies "# of Copies" type:#integer range:[1, 100, 10]
  30.         spinner XPos "X Position" range:[0, 1000, 100]
  31.         spinner YPos "Y Position" range:[0, 1000, 100]
  32.         spinner ZPos "Z Position" range:[0, 1000, 0]
  33.         
  34.         spinner Xrot "X Rotation" range:[0, 360, 0]
  35.         spinner Yrot "Y Rotation" range:[0, 360, 0] 
  36.         spinner Zrot "Z Rotation" range:[0, 360, 45]
  37.         
  38.         edittext prefix "Prefix" width:80
  39.     )
  40.     
  41.     button create_it "Create copies" width:80 enabled:false
  42.     button randomize "Randomize" width:80 enabled:false
  43.     button delete_copies "Delete copies" width:80 enabled:false
  44.     
  45.     fn position_copies = 
  46.     (
  47.         -- moves & rotates all copies by scaling their
  48.         -- random xform data by the current xform spinners
  49.         for i in 1 to count do
  50.         (
  51.             -- pick up a copy 
  52.             local o = copies[i]
  53.             -- set rotate relative to source obj rotation
  54.             o.pos = [0,0,0]
  55.             o.rotation = object.rotation
  56.             local angles = rotates[i] * [xrot.value, yrot.value, zrot.value]
  57.             rotate o (eulerangles angles.x angles.y angles.z)
  58.             -- move relative to source pos
  59.             o.pos = object.pos
  60.             move o (moves[i] * [xpos.value, ypos.value, zpos.value])
  61.         )
  62.     )
  63.     
  64.     fn make_copy i =        -- make the i'th copy
  65.     (
  66.         count += 1
  67.         -- determine clone operation from radiobutton state
  68.         local clone_op = if copy_type.state == 1 then instance else
  69.                          if copy_type.state == 2 then reference else copy
  70.                          
  71.         -- clone, with prefixes if non-empty prefix text box
  72.         local o = if prefix.text != "" then
  73.             clone_op object prefix:prefix.text
  74.         else
  75.             clone_op object
  76.             
  77.         -- save copy & its normalized random transforms
  78.         copies[i] = o
  79.         moves[i] = random [-1,-1,-1] [1,1,1]
  80.         rotates[i] = random [-1,-1,-1] [1,1,1]
  81.         -- now position according to random weights & spinner vals
  82.         position_copies ()
  83.     )
  84.     
  85.     on pick_object picked obj do
  86.     (
  87.         -- remember picked object, set the pickputton label to object'sname
  88.         -- and enable the create button
  89.         object = obj; pick_object.text = object.name
  90.         create_it.enabled = randomize.enabled = delete_copies.enabled = true
  91.     )
  92.  
  93.     on create_it pressed do
  94.     (
  95.         -- create the random copies.  init stores
  96.         count = 0; copies = #(); moves = #(); rotates = #()
  97.         -- loop over copy count, making copies and positioning them
  98.         for i in 1 to numcopies.value do make_copy i
  99.     )
  100.     
  101.     on delete_copies pressed do
  102.     (
  103.         for i in 1 to count do delete copies[i]; count = 0
  104.     )
  105.     
  106.     on randomize pressed do
  107.     (
  108.         -- regenerate random xform vals for the copies
  109.         for i in 1 to count do
  110.         (
  111.             moves[i] = random [-1,-1,-1] [1,1,1]
  112.             rotates[i] = random [-1,-1,-1] [1,1,1]
  113.         )
  114.         -- and reposition them
  115.         position_copies ()
  116.     )
  117.     
  118.     on numcopies changed val do
  119.         if count > 0 do
  120.         (
  121.             -- change the number of copies
  122.             if val < count then
  123.                 -- fewer, delete some scene objects
  124.                 for i in val + 1 to count do delete copies[i]
  125.             else
  126.                 -- more, add extra copies
  127.                 for i in count + 1 to val do make_copy i
  128.             count = val
  129.         )
  130.     
  131.     -- if any xform spinner changes, reposition clones ...
  132.     on xpos changed val do position_copies ()
  133.     on ypos changed val do position_copies ()
  134.     on zpos changed val do position_copies ()
  135.         
  136.     on xrot changed val do position_copies ()
  137.     on yrot changed val do position_copies ()
  138.     on zrot changed val do position_copies ()
  139. )
  140.  
  141.    
  142.  
  143.     
  144.  
  145.