home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Maximum 3D 3
/
m3d-p3.iso
/
3DS_MAX
/
3DSMAX.2_0
/
SCRIPTS
/
RANDMIZ3.MS
< prev
next >
Wrap
Text File
|
1997-10-19
|
5KB
|
145 lines
utility RandomCopies2 "Random Copies II"
(
local object, -- local var to store the picked source object
count = 0, -- copy count
copies = #(), -- stores current copy set
rotates = #(), -- stores current random moves & rotates
moves = #()
group "About Randomize"
(
label l0 "RANDOMIZE"
label l1 "by Fred Ruff"
label l2 " v 1.0"
)
group "Source Object"
(
pickbutton pick_object "none" width:100
radiobuttons copy_type
labels:#("instance", "reference", "copy")
default:1
)
group "Creation Parameters"
(
spinner numCopies "# of Copies" type:#integer range:[1, 100, 10]
spinner XPos "X Position" range:[0, 1000, 100]
spinner YPos "Y Position" range:[0, 1000, 100]
spinner ZPos "Z Position" range:[0, 1000, 0]
spinner Xrot "X Rotation" range:[0, 360, 0]
spinner Yrot "Y Rotation" range:[0, 360, 0]
spinner Zrot "Z Rotation" range:[0, 360, 45]
edittext prefix "Prefix" width:80
)
button create_it "Create copies" width:80 enabled:false
button randomize "Randomize" width:80 enabled:false
button delete_copies "Delete copies" width:80 enabled:false
fn position_copies =
(
-- moves & rotates all copies by scaling their
-- random xform data by the current xform spinners
for i in 1 to count do
(
-- pick up a copy
local o = copies[i]
-- set rotate relative to source obj rotation
o.pos = [0,0,0]
o.rotation = object.rotation
local angles = rotates[i] * [xrot.value, yrot.value, zrot.value]
rotate o (eulerangles angles.x angles.y angles.z)
-- move relative to source pos
o.pos = object.pos
move o (moves[i] * [xpos.value, ypos.value, zpos.value])
)
)
fn make_copy i = -- make the i'th copy
(
count += 1
-- determine clone operation from radiobutton state
local clone_op = if copy_type.state == 1 then instance else
if copy_type.state == 2 then reference else copy
-- clone, with prefixes if non-empty prefix text box
local o = if prefix.text != "" then
clone_op object prefix:prefix.text
else
clone_op object
-- save copy & its normalized random transforms
copies[i] = o
moves[i] = random [-1,-1,-1] [1,1,1]
rotates[i] = random [-1,-1,-1] [1,1,1]
-- now position according to random weights & spinner vals
position_copies ()
)
on pick_object picked obj do
(
-- remember picked object, set the pickputton label to object'sname
-- and enable the create button
object = obj; pick_object.text = object.name
create_it.enabled = randomize.enabled = delete_copies.enabled = true
)
on create_it pressed do
(
-- create the random copies. init stores
count = 0; copies = #(); moves = #(); rotates = #()
-- loop over copy count, making copies and positioning them
for i in 1 to numcopies.value do make_copy i
)
on delete_copies pressed do
(
for i in 1 to count do delete copies[i]; count = 0
)
on randomize pressed do
(
-- regenerate random xform vals for the copies
for i in 1 to count do
(
moves[i] = random [-1,-1,-1] [1,1,1]
rotates[i] = random [-1,-1,-1] [1,1,1]
)
-- and reposition them
position_copies ()
)
on numcopies changed val do
if count > 0 do
(
-- change the number of copies
if val < count then
-- fewer, delete some scene objects
for i in val + 1 to count do delete copies[i]
else
-- more, add extra copies
for i in count + 1 to val do make_copy i
count = val
)
-- if any xform spinner changes, reposition clones ...
on xpos changed val do position_copies ()
on ypos changed val do position_copies ()
on zpos changed val do position_copies ()
on xrot changed val do position_copies ()
on yrot changed val do position_copies ()
on zrot changed val do position_copies ()
)