home *** CD-ROM | disk | FTP | other *** search
/ GameStar Special 2002 April / GSSH42002.iso / EDITOREN / DS / gmax / gmaxinst_1-1.exe / gmaxsetup11.cab / slidermanip.ms < prev    next >
Text File  |  2002-02-13  |  9KB  |  273 lines

  1. -- This manipulator creates a slider helper object that manipulates
  2. -- itself.  
  3.  
  4. -- Written by Scott Morrison, July 25, 2000
  5. -- Based on Peter Watje's 2d slider object
  6.  
  7. -- The slider uses a param block to store the slider value.  
  8. -- This can be used in conjunction with parameter wiring to control
  9. -- other objects in the scene.
  10.  
  11. plugin simpleManipulator sliderManipulator
  12.     name:"Slider"
  13.     classID:#(0x47db14ef, 0x4e9b5990)
  14.     category:"Manipulators"
  15. (
  16.     -- Set the yellow and red colors for the gizmo
  17.     local greenColor =  colorMan.getColor #manipulatorsActive
  18.     local redColor =    colorMan.getColor #manipulatorsSelected
  19.     local yellowColor = colorMan.getColor #manipulatorsInactive
  20.  
  21.     -- sliderOffset is the distance in pixels from the "+" to the slider bar
  22.     local sliderOffset = 9
  23.  
  24.     -- textYOffset is the vertical distance from the slider to the text
  25.     local textYOffset = 10
  26.  
  27.     -- textXOffset is the horizantal distance from the slider to the text
  28.     local textXOffset = -5
  29.  
  30.     -- The minimum width a slider can have in pixels
  31.     local minWidth = 10
  32.  
  33.  
  34.     parameters main rollout:paramRollout
  35.     ( 
  36.          -- The value of the slider
  37.          value      type:#float   animatable:true  ui:spnValue  default: 0.0
  38.          on value set val do
  39.          (
  40.             -- Adjust the min and max accordingly
  41.              if ((val < this.minVal)) then this.minVal = val
  42.             if ((val > this.maxVal)) then this.maxVal = val
  43.             )
  44.  
  45.          -- The min and max values for the slider
  46.          minVal     type:#float   animatable:true  ui:spnMin    default: 0.0
  47.          maxVal     type:#float   animatable:true  ui:spnMax    default: 100.0
  48.           on minVal set val do
  49.          (
  50.              if ((val > this.maxVal)) then this.minVal = this.maxVal
  51.             if (this.value < val) then this.value = val
  52.          )
  53.          on maxVal set val do
  54.          (
  55.              if ((val < this.minVal)) then this.maxVal = this.minVal
  56.             if (this.value > val) then this.value = val
  57.          )
  58.  
  59.          -- The slider position as a percentage of screen space
  60.          xPos       type:#float   animatable:false ui:spnXPos   default: 0.0
  61.          yPos       type:#float   animatable:false ui:spnYPos   default: 0.0
  62.  
  63.          -- The width of the slider in pixels
  64.          width      type:#float   animatable:false ui:spnWidth  default: 100.0
  65.  
  66.          -- When the hide flag is true, the slider bar and value are not draw
  67.          hide       type:#boolean animatable:false ui:checkHide default: false
  68.  
  69.          -- The display name of the slider
  70.          sldName   type:#string  animatable:false ui:labelEdit default: ""
  71.  
  72.         -- Snap toggle
  73.          snapToggle type:#boolean animatable:false ui:checkSnap default: true
  74.  
  75.          -- snap value
  76.          snapVal    type:#float   animatable:false  ui:spnSnapVal default: 0.01
  77.     )
  78.  
  79.     -- The rollout for the slider parameters
  80.     rollout paramRollout "Parameters"
  81.     (
  82.         Edittext labelEdit   "Label:"        text:""
  83.  
  84.         Spinner  spnValue   "Value:"       range:[-1.0e30, 1.0e30, 0.0] 
  85.         Spinner  spnMin     "Minimum:"     range:[-1.0e30, 1.0e30, 0.0] 
  86.         Spinner  spnMax     "Maximum:"     range:[-1.0e30, 1.0e30, 100.0] 
  87.         Spinner  spnXPos    "X Position:"  range:[0.0, 1.0, 0.0] scale:0.01
  88.         Spinner  spnYPos    "Y Position:"  range:[0.0, 1.0, 0.0] scale:0.01
  89.         Spinner  spnWidth   "Width:"       range:[10.0, 1000.0, 100.0] 
  90.  
  91.         Checkbox checkSnap  "Snap:"        checked:false
  92.         Spinner  spnSnapVal "Snap Value:"  range:[0.0, 10000.0, 0.1]
  93.  
  94.         Checkbox checkHide  "Hide:"        checked:false
  95.  
  96.     )
  97.  
  98.     -- This manipualtor manipulates itself
  99.     on canManipulate target  return (classOf target) == sliderManipulator
  100.  
  101.     -- Creation mouse procedure
  102.     tool create
  103.     (
  104.         on mousePoint click do
  105.            case click of
  106.            (
  107.               1: 
  108.               (
  109.                 -- Compute the percentage of of the mouse point in screen space
  110.                 this.xPos = viewPoint.x / gw.getWinSizeX()
  111.                 this.yPos = viewPoint.y / gw.getWinSizeY()
  112.  
  113.                 #stop 
  114.               )
  115.            )
  116.  
  117.     )
  118.  
  119.     -- Create the manipulator gizmos.
  120.     on updateGizmos do
  121.     (
  122.         -- Clear the current gizmo cache
  123.         this.clearGizmos()
  124.  
  125.         -- If this is not a stand-alone manip, get values from the manip target
  126.         if (target != undefined) then 
  127.         (
  128.            this.value      = target.value
  129.            this.minVal     = target.minVal
  130.            this.maxVal     = target.maxVal
  131.            this.xPos       = target.xPos
  132.            this.yPos       = target.yPos
  133.            this.width      = target.width
  134.            this.hide       = target.hide
  135.            this.sldName    = target.sldName
  136.            this.snapToggle = target.snapToggle
  137.            this.snapVal    = target.snapVal
  138.            unselColor  = greenColor
  139.         ) 
  140.         else
  141.         (
  142.            unselColor  = yellowColor
  143.         )
  144.  
  145.  
  146.         -- Compute the origin of the slider in screen space
  147.         local x = xPos * gw.getWinSizeX()
  148.         local y = yPos * gw.getWinSizeY()
  149.  
  150.         -- These flags are used for all the gizmos
  151.         local flags = (gizmoUseScreenSpace + gizmoActiveViewportOnly)
  152.  
  153.         -- Gizmo 0
  154.         -- This is the box that you use the move the slider
  155.         local pos = [x, y, 0.0]
  156.         this.addGizmoMarker #hollowBox pos flags unselColor redColor
  157.  
  158.         -- Gizmo 1
  159.         -- This is the plus-sign used to toggle the hide flag
  160.         pos =  [x + sliderOffset, y, 0.0]
  161.         this.addGizmoMarker #plusSign pos flags unselColor redColor
  162.  
  163.         -- Compute the text label
  164.         local str
  165.  
  166.         if (hide) then str = sldName
  167.         else 
  168.         (
  169.             if sldName.count > 0 then str = sldName + ": " + (value as string)
  170.             else str = value as string
  171.         )
  172.  
  173.         local textLoc = [x + textXOffset, y - textYOffset, 0.0f]
  174.  
  175.         -- Gizmo 2
  176.         -- The text with the name and value
  177.         this.addGizmoText str textLoc flags unselColor redColor
  178.  
  179.         -- If the slider is hidden, don't draw any more
  180.         if hide then return ""
  181.  
  182.         -- Draw the slider bar
  183.         local barStart = x + 2 * sliderOffset
  184.         local barPos = [barStart, y, 0.0]
  185.         local barEnd = [barStart + this.width, y, 0.0]
  186.  
  187.         -- Create a polyline gizmo
  188.         local giz = manip.makeGizmoShape()
  189.         giz.AddPoint barPos
  190.         giz.AddPoint barEnd
  191.  
  192.         -- Gizmo 3
  193.         -- The slider bar
  194.         this.addGizmoShape giz flags unselColor unselColor
  195.         
  196.         -- Draw the slider "thumb" gizmo
  197.         local relVal = (value - minVal) / (maxVal - minVal)
  198.         local valPos = [barStart + relVal * width, y + 10, 0.0f]
  199.  
  200.         -- Gizmo 4
  201.         -- The slider thumb triangle
  202.         this.addGizmoMarker #triangle valPos flags unselColor redColor
  203.  
  204.         local resizePos = [barStart + width + sliderOffset, y, 0.0f]
  205.         
  206.         -- Gizmo 5
  207.         -- The slider resize diamond
  208.         this.addGizmoMarker #diamond resizePos flags unselColor redColor
  209.  
  210.         -- return an empty string so no tool tip is displayed
  211.         return ""
  212.     )
  213.  
  214.     -- mouseMove is called on every mouse move when dragging the manip
  215.     -- It needs to convert the mouse position 'm' into a new value for the slider
  216.     on mouseMove m which do
  217.     (
  218.         local xSize = gw.getWinSizeX()
  219.         local ySize = gw.getWinSizeY()
  220.  
  221.         if (which == 0)  then 
  222.         (
  223.             -- Gizmo 0
  224.  
  225.             -- Set the slider postition
  226.             target.xPos = m.x / xSize
  227.             target.yPos = m.y / ySize
  228.         ) 
  229.         else if (which == 4) then 
  230.         (
  231.             -- Gizmo 4
  232.  
  233.             -- Set the slider value
  234.             local x = xPos * xSize
  235.             local barStart = x + 2.0 * (sliderOffset as float)
  236.             local newVal = ((m.x as float) - barStart) / width
  237.             newVal = minVal + newVal * (maxVal - minVal)
  238.         
  239.             -- Clamp the value
  240.             if (newVal < minVal) then newVal = minVal
  241.             if (newVal > maxVal) then newVal = maxVal
  242.  
  243.             -- Snap, if needed
  244.             if (snapToggle) then 
  245.                 if (snapVal != 0) then newVal = newVal - (mod newVal snapVal)
  246.  
  247.             -- Set the value in the target
  248.             target.value = newVal
  249.         ) 
  250.         else if (which == 5) then 
  251.         (
  252.            -- Gizmo 4
  253.  
  254.             -- Set the slider width
  255.             local x = xPos * xSize
  256.             local barStart = x + 2.0 * sliderOffset
  257.             local newWidth = m.x - sliderOffset - barStart
  258.  
  259.             -- Clamp the width
  260.             if (newWidth < minWidth) then newWidth = 10.0
  261.  
  262.             -- Set the width in the target
  263.             target.width = newWidth
  264.         )
  265.     )
  266.  
  267.     on mouseDown m which do
  268.     (
  269.       -- Toggle the value of the "Hide" state
  270.       if (which == 1) then target.hide = not hide 
  271.     )
  272. )
  273.