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

  1. -- This is a scripted rollout that opens a modeless window
  2. -- of sliders each with a snap button.  You choose a NURBS CV
  3. -- surface object in the scene and then can 'snap' poses of 
  4. -- CV and weight edits (made in the NURBS Surface CV modifier panel)
  5. -- and then use the sliders as a 'pose mixer' which you can keyframe
  6. -- in the usual way in MAX
  7. --                                    John Wainwright
  8.  
  9. rollout morpher "Morpher"
  10. (
  11.     local talker, tset, surf, snap_pos, set_pos, start, snaps,
  12.           slider = #(0,0,0,0,0)
  13.     
  14.     label pl "Pick object: " align:#left
  15.     pickbutton pickit "none" width:100 offset:[-20,-20]
  16.     button save "Save" offset:[76,-26] enabled:false
  17.     button load "Load" offset:[122,-26] enabled:false
  18.  
  19.     group "Mixer"
  20.     (
  21.         slider oh "Target 1" orient:#vertical across:5 enabled:false
  22.         slider ee "Target 2" orient:#vertical enabled:false
  23.         slider smile "Target 3" orient:#vertical enabled:false
  24.         slider growl "Target 4" orient:#vertical enabled:false
  25.         slider sad "Target 5" orient:#vertical enabled:false
  26.         
  27.         button snapoh "Snap" across:5 enabled:false
  28.         button snapee "Snap" enabled:false
  29.         button snapsmile "Snap" enabled:false
  30.         button snapgrowl "Snap" enabled:false
  31.         button snapsad "Snap" enabled:false
  32.     )
  33.     
  34.     on pickit picked obj do 
  35.     (
  36.         talker = obj; pickit.text = obj.name
  37.         tset = getNURBSSet talker #relational
  38.         surf = getObject tset 1
  39.         start = #()
  40.         for i in 1 to surf.numcvs.x do
  41.             for j in 1 to surf.numcvs.y do
  42.             (
  43.                 cv = getcv surf i j 
  44.                 append start (NURBSControlVertex cv.pos cv.weight)
  45.             )
  46.         snaps = for s in 1 to 5 collect
  47.             for i in 1 to surf.numcvs.x * surf.numcvs.y collect (NURBSControlVertex [0,0,0] 0)
  48.             
  49.         save.enabled   = load.enabled   = true
  50.         oh.enabled     = ee.enabled     = smile.enabled     = growl.enabled     = sad.enabled     = true
  51.         snapoh.enabled = snapee.enabled = snapsmile.enabled = snapgrowl.enabled = snapsad.enabled = true
  52.     )
  53.     
  54.     on snapoh pressed do snap_pos talker 1
  55.     on snapee pressed do snap_pos talker 2
  56.     on snapsmile pressed do snap_pos talker 3
  57.     on snapgrowl pressed do snap_pos talker 4
  58.     on snapsad pressed do snap_pos talker 5
  59.     
  60.     fn snap_pos obj which =
  61.     (
  62.         snaps[which] = #()
  63.         -- snap pos & weight
  64.         local k = 1
  65.         for i in 1 to surf.numcvs.x do
  66.             for j in 1 to surf.numcvs.y do 
  67.             (
  68.                 cv = getcv surf i j
  69.                 append snaps[which] (NURBSControlVertex (cv.pos - start[k].pos) (cv.weight - start[k].weight))
  70.                 k += 1
  71.             )
  72.         -- reset to start config
  73.         k = 1
  74.         for i in 1 to surf.numcvs.x do
  75.             for j in 1 to surf.numcvs.y do 
  76.             (
  77.                 cv = getcv surf i j
  78.                 cv.pos = start[k].pos
  79.                 cv.weight = start[k].weight
  80.                 k += 1
  81.             )
  82.     )
  83.     
  84.     on oh changed val do set_pos 1 val
  85.     on ee changed val do set_pos 2 val
  86.     on smile changed val do set_pos 3 val
  87.     on growl changed val do set_pos 4 val
  88.     on sad changed val do set_pos 5 val
  89.  
  90.     fn set_pos which val =
  91.     (
  92.         slider[which] = val / 100
  93.         local k = 1
  94.         for i in 1 to surf.numcvs.x do
  95.             for j in 1 to surf.numcvs.y do 
  96.             (
  97.                 delta_p = [0,0,0]; delta_w = 0
  98.                 for s in 1 to 5 do
  99.                 (
  100.                     delta_p += snaps[s][k].pos * slider[s]
  101.                     delta_w += snaps[s][k].weight * slider[s]
  102.                 )
  103.                 cv = getcv surf i j
  104.                 if (new_p = start[k].pos + delta_p) != cv.pos then cv.pos = new_p
  105.                 if (new_w = start[k].weight + delta_w) != cv.weight then cv.weight = new_w
  106.                 k += 1
  107.             )
  108.     )
  109.     
  110.     on save pressed do 
  111.     (
  112.         local f = createFile (getSaveFileName ())
  113.         for s in 1 to 5 do for p in snaps[s] do format "% %\n" p.pos p.weight to:f
  114.         close f
  115.     )
  116.     
  117.     on load pressed do
  118.     (
  119.         local f = openFile (getOpenFileName ())
  120.         snaps = for s in 1 to 5 collect 
  121.             for i in 1 to surf.numcvs.x * surf.numcvs.y collect (NURBSControlVertex (readValue f) (readValue f))    
  122.         close f
  123.     )
  124. )
  125.  
  126. -- create the rollout window and add the morpher rollout
  127. tfw = newRolloutFloater "Morph" 320 248
  128. addRollout morpher tfw 
  129.