home *** CD-ROM | disk | FTP | other *** search
/ Best of Blender / bestofblender.iso / pc / blender / files / beastvr / beastvrm.dir / 00068_Script_68 < prev    next >
Text File  |  1996-04-25  |  29KB  |  738 lines

  1.  
  2. -- ⌐ 1992-1995 Apple Computer, Inc.  All rights reserved.
  3.  
  4. --=============================================================================
  5. -- Routines for initializing and cleaning up the Director movie.
  6. -------------------------------------------------------------------------------
  7.  
  8.  
  9. --=============================================================================
  10. -- StartMovie
  11. --
  12. -- Runs at movie start time.  Initializes key globals, opens the external code
  13. -- library, registers the QuickTime VR components, and sets up the XCMD Callback
  14. -- Factory.
  15. -------------------------------------------------------------------------------
  16. on StartMovie
  17.   global gPanoMovieID, gNavMovieID, gPathName, gLastTimeRollover, gPanoFrame, DEST
  18.   put empty into gPanoMovieID
  19.   put empty into gNavMovieID
  20.   put empty into gPathName
  21.   put false into gLastTimeRollover
  22.   put empty into gPanoFrame
  23.   
  24.   -- Need to open up the external xlib so that we don't have the
  25.   -- XCMD floating-point bug problem when we save.
  26.   -- This would be commented out just before we turn this into a projector.
  27.   
  28.   openxlib "BLENDER1:FILES:QuickTime VR XCMDs"
  29.   openxlib "BLENDER1:FILES:QuickTime VR Components"
  30.   
  31.   -- Register the QuickTime VR component
  32.   -- This would turn into RegisterComponent (":", empty) when the components are
  33.   -- embedded in the projector.
  34.   
  35.   RegisterComponent ("BLENDER1:FILES:QuickTime VR Components", empty)
  36.   
  37.   -- Need to set up the XCMD Callback Factory so that we can execute callbacks
  38.   -- to Lingo handlers from PanoMovie
  39.   
  40.   global gQTVRCallBackFactory
  41.   put CallBackTracer(mNew) into gQTVRCallBackFactory
  42.   SetCallBack PanoMovie,gQTVRCallBackFactory
  43. end StartMovie
  44.  
  45.  
  46. --=============================================================================
  47. -- StopMovie
  48. --
  49. -- Runs at movie stop time.  Closes any open pano or nav movies.  Disposes
  50. -- of the XCMD Callback Factory and closes the external code library.
  51. -------------------------------------------------------------------------------
  52. on StopMovie
  53.   -- Close any open panoramic or object movies
  54.   ClosePanoMovie
  55.   CloseNavMovie
  56.   
  57.   -- Close the external XCMD library
  58.   -- This would be commented out just before we turn this into a projector.
  59.   
  60.   closexlib "BLENDER1:FILES:QuickTime VR XCMDs"
  61.   closexlib "BLENDER1:FILES:QuickTime VR Components"
  62.   -- Dispose of the XCMD Callback Factory
  63.   global gQTVRCallBackFactory
  64.   if objectP(gQTVRCallBackFactory) then gQTVRCallBackFactory (mDispose)
  65. end
  66.  
  67.  
  68. --=============================================================================
  69. -- Routines for managing navigable movies
  70. -------------------------------------------------------------------------------
  71.  
  72.  
  73. --=============================================================================
  74. -- OpenNavMovie:
  75. --      pFilename is the full file path of the file
  76. --      pSpriteNum is the sprite associated with the direct Nav Movie
  77. --      pShowOnOpen is a boolean for showing the movie on screen immediately
  78. --
  79. -- Opens the file pFileName as a nav movie at the top left corner of sprite
  80. -- pSpriteNum.  Shows it on the screen as dictated by pShowOnOpen.
  81. -------------------------------------------------------------------------------
  82. on OpenNavMovie pFilename, pSpriteNum, pShowOnOpen
  83.   global gNavMovieID
  84.   
  85.   -- The use of a single global gNavMovieID constrains these routines 
  86.   -- to only allow one pano movie to be open at a time.
  87.   -- Close any other open nav movie.
  88.   CloseNavMovie
  89.   
  90.   -- Load in the movie.  Assume the underlying sprite is the correct size.
  91.   put NavMovie ("openMovie", "Direct", pFilename ,¼
  92.                 the left of sprite pSpriteNum & "," & the top of sprite pSpriteNum, ¼
  93.                 "ShowPoster", "Invisible") into gNavMovieID
  94.   if gNavMovieID contains "error" then 
  95.     put gNavMovieID
  96.     put empty into gNavMovieID
  97.     beep
  98.     exit
  99.   end if
  100.   
  101.   if pShowOnOpen then
  102.     -- Show the poster frame of the nav movie on screen
  103.     NavMovie "Direct", gNavMovieID, "update"
  104.   end if
  105. end OpenNavMovie
  106.  
  107.  
  108. --=============================================================================
  109. -- ShowNavMovie
  110. --
  111. -- Updates the nav movie display on screen.
  112. -------------------------------------------------------------------------------
  113. on ShowNavMovie
  114.   global gNavMovieID
  115.   if gNavMovieID <> empty then
  116.     NavMovie "Direct", gNavMovieID, "update"
  117.   end if
  118. end ShowNavMovie
  119.  
  120.  
  121. --=============================================================================
  122. -- ZoomNavMovie:
  123. --      pStartZoomRect specifies the start rect as a string rect
  124. --      [pSkipFirstFrame] is "true" if the first zoom frame should not be shown
  125. --      [pClipRect] is the screen string rect to which the zoom should be clipped
  126. --
  127. -- Zooms the nav movie out from the start rect specified, possibly skipping
  128. -- the first frame and clipping to a given rect.
  129. -------------------------------------------------------------------------------
  130. on ZoomNavMovie pStartZoomRect, pSkipFirstFrame, pClipRect
  131.   global gNavMovieID
  132.   if gNavMovieID <> empty then
  133.     put "ZoomOutMovie" && quote & pStartZoomRect & quote into tCommand
  134.     if not voidP(pSkipFirstFrame) then
  135.       put tCommand & "," & pSkipFirstFrame into tCommand
  136.     end if
  137.     if not voidP(pClipRect) then
  138.       put tCommand & "," & quote & pClipRect & quote into tCommand
  139.     end if  
  140.     NavMovie "Direct", gNavMovieID, tCommand
  141.     -- Send an idle so that if MoviesTask() is called, we don't get a
  142.     -- spurious update
  143.     NavMovie "Direct", gNavMovieID, "idle"
  144.   end if
  145. end ZoomNavMovie
  146.  
  147.  
  148. --=============================================================================
  149. -- SetNavMovieView:
  150. --      pHPan is the horizontal pan angle
  151. --      pVPan is the vertical pan angle
  152. --
  153. -- Sets the nav movie view to the specified pan angles.
  154. -------------------------------------------------------------------------------
  155. on SetNavMovieView pHPan, pVPan
  156.   global gNavMovieID
  157.   if gNavMovieID <> empty then
  158.     NavMovie "Direct", gNavMovieID, "set", "hPanAngle", pHPan
  159.     NavMovie "Direct", gNavMovieID, "set", "vPanAngle", pVPan
  160.   end if
  161. end SetNavMovieView
  162.  
  163.  
  164. --=============================================================================
  165. -- CloseNavMovie
  166. --
  167. -- Disposes an open nav movie.  This does not remove the image from
  168. -- the screen.
  169. -------------------------------------------------------------------------------
  170. on CloseNavMovie
  171.   global gNavMovieID
  172.   if gNavMovieID <> empty then
  173.     NavMovie "Direct", gNavMovieID, "dispose"
  174.     put empty into gNavMovieID
  175.   end if 
  176. end CloseNavMovie
  177.  
  178.  
  179. --=============================================================================
  180. -- NavFrameScript
  181. --      pSpriteNum is the sprite which lies under the nav movie
  182. --
  183. -- When run frequently, provides cursor feedback over the nav movie
  184. -- and handles mouse down and keyboard actions.
  185. -------------------------------------------------------------------------------
  186. on NavFrameScript pSpriteNum
  187.   global gNavMovieID
  188.   if gNavMovieID <> empty and RunningInForeground() = "true" then 
  189.     if rollover (pSpriteNum) then
  190.       NavMovie "Direct", gNavMovieID, "mouseOver"
  191.       
  192.       -- Set the cursor twice because Director tries to be smart and
  193.       -- doesn't change the cursor if your current cursor command
  194.       -- is the same as the last one.  It doesn't realize of course,
  195.       -- that QTVR has changed the cursor in between.
  196.       
  197.       -- KNOWN BUG: It appears that the cursor command is ignored if the mouse
  198.       -- is not over the stage, so if you move out of the movie window
  199.       -- fast enough and off the stage, the cursor will remain unchanged.
  200.       
  201.       cursor 200
  202.       cursor -1
  203.     else
  204.       NavMovie "Direct", gNavMovieID, "idle"
  205.     end if
  206.   end if
  207. end NavFrameScript
  208.  
  209.  
  210. --=============================================================================
  211. -- Routines for managing panoramic movies
  212. -------------------------------------------------------------------------------
  213.  
  214.  
  215. --=============================================================================
  216. -- OpenPanoMovie
  217. --      pFilename is the full file path of the file
  218. --      pSpriteNum is the sprite associated with the direct Pano Movie
  219. --      pShowOnOpen is a boolean for showing the movie on screen immediately
  220. --
  221. -- Opens the file pFileName as a panoramic movie, and sets up callback
  222. -- handlers as specified.  Updates the screen with the movie's default
  223. -- view if requested by pShowOnOpen
  224. -------------------------------------------------------------------------------
  225. on OpenPanoMovie pFileName, pSpriteNum, pShowOnOpen
  226.   global gPanoMovieID, gPathName
  227.   
  228.   -- The use of a single global gPanoMovieID constrains these routines 
  229.   -- to only allow one pano movie to be open at a time.
  230.   -- Close any other open pano movie.
  231.   ClosePanoMovie
  232.   
  233.   -- Make the pano movie display in the rect covered by sprite pSpriteNum
  234.   put the left of sprite pSpriteNum & "," & the top of sprite pSpriteNum & "," &¼
  235. the right of sprite pSpriteNum & "," & the bottom of sprite pSpriteNum into tPanoRect
  236.   
  237.   put PanoMovie("openMovie", "Direct", pFileName, tPanoRect) into gPanoMovieID
  238.   if gPanoMovieID contains "error" then
  239.     -- Display the error in the message window
  240.     put gPanoMovieID
  241.     put empty into gPanoMovieID
  242.     beep
  243.     exit
  244.   end if 
  245.   
  246.   put ExtractPathName(pFileName) into gPathName
  247.   
  248.   InitPanoCallbacks
  249.   
  250.   if pShowOnOpen then
  251.     PanoMovie "Direct", gPanoMovieID, "update"
  252.   end if
  253.   
  254. end OpenPanoMovie
  255.  
  256.  
  257. --=============================================================================
  258. -- InitPanoCallbacks
  259. --
  260. -- Initializes the callbacks used for panoramic movies.
  261. -------------------------------------------------------------------------------
  262. on InitPanoCallbacks
  263.   global gPanoMovieID
  264.   if gPanoMovieID <> empty then
  265.     -- Set up callback handlers for panoramic movies.  
  266.     
  267.     -- We reset each callback to empty if we're not setting it to a handler name;
  268.     -- this resets callbacks which may have been set in the Pano Callbacks frames.
  269.     -- The default value for each callback property is empty.
  270.     
  271.     PanoMovie "Direct", gPanoMovieID, "set", "mouseOverHandler", empty
  272.     -- PanoMovie "Direct", gPanoMovieID, "set", "mouseOverHandler", "sampleMouseOverHandler"
  273.     
  274.     -- PanoMovie "Direct", gPanoMovieID, "set", "rolloverHotSpotHandler", empty
  275.     PanoMovie "Direct", gPanoMovieID, "set", "rolloverHotSpotHandler", "sampleRolloverHandler"
  276.     
  277.     PanoMovie "Direct", gPanoMovieID, "set", "mouseDownHandler", empty
  278.     -- PanoMovie "Direct", gPanoMovieID, "set", "mouseDownHandler", "sampleMouseDownHandler"
  279.     
  280.     PanoMovie "Direct", gPanoMovieID, "set", "panZoomStartHandler", empty
  281.     -- PanoMovie "Direct", gPanoMovieID, "set", "panZoomStartHandler", "samplePanZoomStartHandler"
  282.     
  283.     PanoMovie "Direct", gPanoMovieID, "set", "mouseStillDownHandler", empty
  284.     -- PanoMovie "Direct", gPanoMovieID, "set", "mouseStillDownHandler", "sampleMouseStillDownHandler"
  285.     
  286.     PanoMovie "Direct", gPanoMovieID, "set", "nodeLeaveHandler", empty
  287.     -- PanoMovie "Direct", gPanoMovieID, "set", "nodeLeaveHandler", "sampleNodeLeaveHandler"
  288.   end if
  289. end InitPanoCallbacks
  290.  
  291.  
  292.  
  293. --=============================================================================
  294. -- ShowPanoMovie
  295. --      [pQuality] is the quality level at which to display the update
  296. --
  297. -- Updates the pano movie display.  Has the side effect of changing
  298. -- the current quality level to pQuality, if specified.
  299. -------------------------------------------------------------------------------
  300. on ShowPanoMovie pQuality
  301.   global gPanoMovieID
  302.   if gPanoMovieID <> empty then
  303.     if not voidP(pQuality) then PanoMovie "Direct", gPanoMovieID, "set", "quality", pQuality 
  304.     PanoMovie "Direct", gPanoMovieID, "update"
  305.   end if
  306. end ShowPanoMovie
  307.  
  308.  
  309. --=============================================================================
  310. -- SetPanoNode
  311. --      pNodeID is the number of the node to go to
  312. --      pUpdate is true if a screen update is to be performed
  313. --      [pQuality] is the quality level at which to display the update
  314. --
  315. -- Changes the current node as specified.  If pUpdate is true, updates the
  316. -- screen to reflect that node's default view.  Has the side effect of changing
  317. -- the current quality level to pQuality, if specified.
  318. -------------------------------------------------------------------------------
  319. on SetPanoNode pNodeID, pUpdate, pQuality
  320.   global gPanoMovieID
  321.   if gPanoMovieID <> empty then
  322.     PanoMovie "Direct", gPanoMovieID, "set", "nodeID", pNodeID
  323.     if not voidP(pQuality) then PanoMovie "Direct", gPanoMovieID, "set", "quality", pQuality 
  324.     if pUpdate then PanoMovie "Direct", gPanoMovieID, "Update" 
  325.   end if
  326. end SetPanoNode
  327.  
  328.  
  329. --=============================================================================
  330. -- SwingPanoMovie
  331. --      pHPan is the destination horizontal pan angle
  332. --      pVPan is the destination vertical pan angle
  333. --      pZoom is the destination zoom angle
  334. --      pSwingSpeed is the speed at which to swing
  335. --      pSwingQuality is the quality at which to swing
  336. --      pFinalQuality is the quality at which to re-update the destination view
  337. --
  338. -- Swings the view around to a specified direction.  Has the side effect of
  339. -- changing the current quality level to pFinalQuality
  340. -------------------------------------------------------------------------------
  341. on SwingPanoMovie pHPan, pVPan, pZoom, pSwingSpeed, pSwingQuality, pFinalQuality
  342.   global gPanoMovieID
  343.   if gPanoMovieID <> empty then
  344.     -- Set up the destination pan and zoom angles
  345.     PanoMovie "Direct", gPanoMovieID, "set", "zoomAngle", pZoom 
  346.     PanoMovie "Direct", gPanoMovieID, "set", "vPanAngle", pVPan
  347.     PanoMovie "Direct", gPanoMovieID, "set", "hPanAngle", pHPan 
  348.     
  349.     -- For performance, you can use lower quality during the swing
  350.     PanoMovie "Direct", gPanoMovieID, "set", "quality", pSwingQuality
  351.     PanoMovie "Direct", gPanoMovieID, "set", "transitionMode", "swing" 
  352.     PanoMovie "Direct", gPanoMovieID, "set", "transitionSpeed", pSwingSpeed
  353.     PanoMovie "Direct", gPanoMovieID, "update"
  354.     
  355.     -- Set transition mode to normal
  356.     PanoMovie "Direct", gPanoMovieID, "set", "transitionMode", "normal"
  357.     
  358.     -- Only do a reupdate if the quality values are different
  359.     if pFinalQuality <> pSwingQuality then
  360.       PanoMovie "Direct", gPanoMovieID, "set", "quality", pFinalQuality 
  361.       PanoMovie "Direct", gPanoMovieID, "update" 
  362.     end if
  363.   end if
  364. end SwingPanoMovie
  365.  
  366.  
  367. --=============================================================================
  368. -- CollapsePanoMovie
  369. --
  370. -- Collapses to the currently selected hot spot.
  371. -------------------------------------------------------------------------------
  372. on CollapsePanoMovie
  373.   global gPanoMovieID
  374.   if gPanoMovieID <> empty then
  375.     PanoMovie "Direct", gPanoMovieID, "CollapseToHotSpotRgn"
  376.   end if
  377. end CollapsePanoMovie
  378.  
  379.  
  380. --=============================================================================
  381. -- SetPanoMovieView
  382. --      pHPan is the destination horizontal pan angle
  383. --      pVPan is the destination vertical pan angle
  384. --      pZoom is the destination zoom angle
  385. --      [pQuality] is the quality at which to display the view
  386. --
  387. -- Displays a new view in the current node.  Has the side effect of changing
  388. -- the current quality level to pQuality, if specified.
  389. -------------------------------------------------------------------------------
  390. on SetPanoMovieView pHPan, pVPan, pZoom, pQuality
  391.   global gPanoMovieID
  392.   if gPanoMovieID <> empty then
  393.     PanoMovie "Direct", gPanoMovieID, "set", "zoomAngle", pZoom
  394.     PanoMovie "Direct", gPanoMovieID, "set", "vPanAngle", pVPan
  395.     PanoMovie "Direct", gPanoMovieID, "set", "hPanAngle", pHPan
  396.     if not voidP(pQuality) then PanoMovie "Direct", gPanoMovieID, "set", "quality", pQuality 
  397.     PanoMovie "Direct", gPanoMovieID, "update"
  398.   end if
  399. end SetPanoMovieView
  400.  
  401.  
  402. --=============================================================================
  403. -- ClosePanoMovie
  404. --
  405. -- Disposes an open pano movie.  This does not remove the image from
  406. -- the screen.
  407. -------------------------------------------------------------------------------
  408. on ClosePanoMovie
  409.   global gPanoMovieID
  410.   if gPanoMovieID <> empty then
  411.     PanoMovie "Direct", gPanoMovieID, "dispose"
  412.     put empty into gPanoMovieID
  413.   end if
  414. end ClosePanoMovie
  415.  
  416.  
  417.  
  418. --=============================================================================
  419. -- PanoFrameScript
  420. --
  421. -- When run frequently, provides cursor feedback over the pano movie
  422. -- and handles mouse down and keyboard actions.
  423. -------------------------------------------------------------------------------
  424. on PanoFrameScript pSpriteNum
  425.   global gLastTimeRollover
  426.   if rollover(pSpriteNum) then
  427.     global gPanoMovieID
  428.     
  429.     -- Only run mouseOver if there's a movie AND Director is in the foreground
  430.     if gPanoMovieID <> empty and RunningInForeground() = "true" then 
  431.       
  432.       PanoMovie "Direct", gPanoMovieID, "mouseOver"
  433.       -- Result is 0 if you just wandered over the window
  434.       -- without mousing down, if you zoomed in or out without
  435.       -- mousing down, if you used the arrow keys, or if there
  436.       -- was an unhandled event
  437.       put the result into tMouseOverResult
  438.       
  439.       if tMouseOverResult <> 0 then
  440.         put item 1 of tMouseOverResult into tAction
  441.         if tAction = "jump" then
  442.           put item 2 of tMouseOverResult into cast "Current Node ID"
  443.         else if tAction = "stil" then
  444.           put item 2 of tMouseOverResult into cast "Current Hot Spot ID"
  445.         else if tAction = "navg" then
  446.           global gLastPanoMovieData, gPathName
  447.           
  448.           put item 2 of tMouseOverResult into tHotSpotID
  449.           put tHotSpotID into cast "Current Hot Spot ID"
  450.           
  451.           -- We rely on all navigable objects having their all their properties
  452.           -- correctly authored.  It is unclear what will happen if the properties
  453.           -- aren't set up correctly.
  454.           
  455.           put PanoMovie ("Direct", gPanoMovieID, "get", "navgZoomRect") into tStartZoom
  456.           put PanoMovie ("Direct", gPanoMovieID, "get", "navgViewAngles") into tViewAngles
  457.           put PanoMovie ("Direct", gPanoMovieID, "get", "hotSpotName") into tFileName
  458.           
  459.           CollapsePanoMovie
  460.           
  461.           OpenNavMovie gPathName & ":" & tFileName, 2, false
  462.           global gNavMovieID
  463.           if gNavMovieID <> empty then
  464.             -- Remember the last marked frame so we can come back to where we
  465.             -- are now (including proper initialization)
  466.             global gPanoFrame
  467.             put marker(0) into gPanoFrame
  468.             
  469.             -- Show the object controls and take us to the right view of the object
  470.             go to frame "Object From Pano"
  471.             SetNavMovieView item 1 of tViewAngles, item 2 of tViewAngles
  472.             -- Clip the zoom out effect to the movie rect
  473.             put the left of sprite 2 & "," & the top of sprite 2 & "," & ¼
  474. the right of sprite 2 & "," & the bottom of sprite 2 into tClipRect
  475.             ZoomNavMovie tStartZoom, "true", tClipRect
  476.           else
  477.             -- Well, we couldn't open the object, so reupdate the panorama
  478.             PanoMovie ("Direct", gPanoMovieID, "update")
  479.           end if
  480.         else if tAction = "misc" then
  481.           put item 2 of tMouseOverResult into cast "Current Hot Spot ID"
  482.         else if tAction = "undf" then
  483.           put item 2 of tMouseOverResult into cast "Current Hot Spot ID"
  484.         else if tAction = "pan " then   -- Watch out for that space!
  485.           
  486.         end if
  487.         put true into gLastTimeRollover
  488.       else if rollover(pSpriteNum) then
  489.         -- There was an arrow key event or some unhandlable event,
  490.         -- but cursor is still over panoramic window
  491.         put true into gLastTimeRollover
  492.       else
  493.         -- The cursor is no longer over the panoramic window
  494.         
  495.         -- Set the cursor twice because Director tries to be smart and
  496.         -- doesn't change the cursor if your current cursor command
  497.         -- is the same as the last one.  It doesn't realize of course,
  498.         -- that QTVR has changed the cursor in between.
  499.         
  500.         -- KNOWN BUG: It appears that the cursor command is ignored if the mouse
  501.         -- is not over the stage, so if you move out of the movie window
  502.         -- fast enough and off the stage, the cursor will remain unchanged.
  503.         
  504.         cursor 200
  505.         cursor -1
  506.         put false into gLastTimeRollover
  507.       end if
  508.     end if
  509.   else if gLastTimeRollover then
  510.     -- See comment(s) above
  511.     cursor 200
  512.     cursor -1
  513.     put false into gLastTimeRollover
  514.     -- Allow a high quality update in pano window if needed
  515.     if gPanoMovieID <> empty then PanoMovie "Direct", gPanoMovieID, "idle"
  516.   end if
  517.   put PanoMovie("Direct", gPanoMovieID, "Get", "hPanAngle") into cast "HPanAngle"
  518. end PanoFrameScript
  519.  
  520.  
  521.  
  522. --=============================================================================
  523. -- Sample PanoMovie callback handler routines
  524. -------------------------------------------------------------------------------
  525.  
  526. --=============================================================================
  527. -- SampleMouseOverHandler
  528. --
  529. -- Called by PanoMovie periodically during mouseOver.
  530. -------------------------------------------------------------------------------
  531. on SampleMouseOverHandler
  532.   put "Mouse over panoramic movie"
  533.   -- If you want to exit from mouseOver, use this line
  534.   global gPanoMovieID
  535.   if gPanoMovieID <> empty then
  536.     --PanoMovie "Direct", gPanoMovieID, "ExitMouseOver" 
  537.   end if
  538. end SampleMouseOverHandler
  539.  
  540. --=============================================================================
  541. -- SampleRolloverHandler
  542. --      pHotSpotID is the id of the hot spot the user is over
  543. --
  544. -- Called by PanoMovie whenever the hot spot the cursor is over changes.
  545. -------------------------------------------------------------------------------
  546. on SampleRolloverHandler pHotSpotID
  547.   put pHotSpotID into cast "Current Hot Spot ID"
  548. end SampleRolloverHandler
  549.  
  550. --=============================================================================
  551. -- SampleMouseDownHandler
  552. --
  553. -- Called by PanoMovie when a mouseDown event occurs during a mouseOver call
  554. -------------------------------------------------------------------------------
  555. on SampleMouseDownHandler
  556.   put "Mouse down during mouseOver call"
  557.   
  558.   global gPanoMovieID
  559.   if gPanoMovieID <> empty then
  560.     PanoMovie "Direct", gPanoMovieID, "PassMouseDown"
  561.   end if
  562. end SampleMouseDownHandler
  563.  
  564. --=============================================================================
  565. -- SamplePanZoomStartHandler
  566. --
  567. -- Called once by PanoMovie when the user starts to pan or zoom.
  568. -------------------------------------------------------------------------------
  569. on SamplePanZoomStartHandler
  570.   put "About to pan or zoom in panoramic movie"
  571. end SamplePanZoomStartHandler
  572.  
  573. --=============================================================================
  574. -- SampleMouseStillDownHandler
  575. --
  576. -- Called by PanoMovie periodically during while the mouse is down within
  577. -- mouseOver or mouseDown.
  578. -------------------------------------------------------------------------------
  579. on SampleMouseStillDownHandler
  580.   put "Enter mouse still down from panoramic movie"
  581.   global gPanoMovieID
  582.   if gPanoMovieID <> empty then
  583.     --put PanoMovie("Direct", gPanoMovieID, "Get", "HPanAngle") into tHPanAngle 
  584.     --put "HPanAngle is currently: " & tHPanAngle
  585.   end if
  586.   put "Leave mouse still down from panoramic movie"
  587. end SampleMouseStillDownHandler
  588.  
  589. --=============================================================================
  590. -- SampleNodeLeaveHandler
  591. --      pToNodeID is the id of the node the user is leaving
  592. --
  593. -- Called by PanoMovie when the user moves between nodes by clicking on link
  594. -- hot spots.
  595. -------------------------------------------------------------------------------
  596. on SampleNodeLeaveHandler pToNode
  597.   put "Jumping to node " & pToNode & " in panoramic movie"
  598. end SampleNodeLeaveHandler
  599.  
  600.  
  601.  
  602.  
  603. --=============================================================================
  604. -- Utility routines
  605. -------------------------------------------------------------------------------
  606.  
  607.  
  608. --=============================================================================
  609. -- ExtractPathName
  610. --      pFileName is the full file path of the file
  611. -- Returns the path component of pFileName
  612. --
  613. -- Extracts and returns the path component of a file specifier.
  614. -------------------------------------------------------------------------------
  615. on ExtractPathName pPathName
  616.   put ":" into tDelimiter
  617.   if pPathName contains tDelimiter then
  618.     put length(pPathName) into tCharPos
  619.     repeat while tCharPos >= 1
  620.       if char tCharPos of pPathName = tDelimiter then return char 1 to tCharPos - 1 of pPathName
  621.       put tCharPos - 1 into tCharPos
  622.     end repeat
  623.     return empty
  624.   else
  625.     return empty
  626.   end if
  627. end ExtractPathName
  628.  
  629.  
  630.  
  631. --=============================================================================
  632. -- XCMD Callback Factory
  633. -------------------------------------------------------------------------------
  634.  
  635.  
  636.  
  637. --=============================================================================
  638. -- CallBackTracer
  639. --
  640. -- As described in "Using Lingo", Appendix A.  Pass any mSendCardMessage
  641. -- commands on to Lingo so that callbacks can be handled.
  642. -------------------------------------------------------------------------------
  643. factory CallBackTracer
  644.   
  645. method mNew
  646.   
  647. method mEvalExpr pExpr
  648.   
  649. method mSendHCMessage pMessage
  650.   
  651. method mSendCardMessage pMessage
  652.   do pMessage
  653.   
  654. method mGetFieldByName pCard, pName
  655.   
  656. method mGetFieldByNum pCard, pNum
  657.   
  658. method mGetFieldByID pCard, pID
  659.   
  660. method mSetFieldByName pCard, pName, pValue
  661.   
  662. method mSetFieldByNum pCard, pNum, pValue
  663.   
  664. method mSetFieldByID pCard, pID, pValue
  665.   
  666. end
  667.  
  668.  
  669.  
  670.  
  671. --=============================================================================
  672. -- Routines used by Pano Callbacks pages
  673. -------------------------------------------------------------------------------
  674.  
  675.  
  676. --=============================================================================
  677. -- SetupHandler
  678. --      pHandlerName is the identifying name of the callback to be set up
  679. --
  680. -- Used to install and de-install callbacks on the Pano Callbacks pages
  681. -------------------------------------------------------------------------------
  682. on SetupHandler pHandlerName
  683.   global gPanoMovieID
  684.   if the hilite of cast (pHandlerName && "Check") then
  685.     PanoMovie "Direct", gPanoMovieID, "set", pHandlerName, "test" & pHandlerName
  686.   else
  687.     PanoMovie "Direct", gPanoMovieID, "set", pHandlerName, empty
  688.   end if
  689. end SetupHandler
  690.  
  691. on TestMouseOverHandler
  692.   global gPanoMovieID
  693.   if gPanoMovieID <> empty then
  694.     put "In mouse over at: " & the ticks into cast "MouseOverHandler Message"
  695.   end if
  696. end TestMouseOverHandler
  697.  
  698. on TestRolloverHotSpotHandler pHotSpotID
  699.   global gPanoMovieID
  700.   if gPanoMovieID <> empty then
  701.     put "Rolling over hot spot: " & pHotSpotID into cast "RolloverHotSpotHandler Message"
  702.   end if
  703. end TestRolloverHotSpotHandler
  704.  
  705. on TestMouseDownHandler
  706.   global gPanoMovieID
  707.   if gPanoMovieID <> empty then
  708.     put "In mouse down at: " & the ticks into cast "MouseDownHandler Message"
  709.     PanoMovie "Direct", gPanoMovieID, "PassMouseDown"
  710.   end if
  711. end TestMouseDownHandler
  712.  
  713. on TestPanZoomStartHandler
  714.   global gPanoMovieID
  715.   if gPanoMovieID <> empty then
  716.     put "In pan zoom start at: " & the ticks into cast "PanZoomStartHandler Message"
  717.   end if
  718. end TestPanZoomStartHandler
  719.  
  720. on TestMouseStillDownHandler
  721.   global gPanoMovieID
  722.   if gPanoMovieID <> empty then
  723.     put "In mouse still down at: " & the ticks into cast "MouseStillDownHandler Message"
  724.     put PanoMovie("Direct", gPanoMovieID, "get", "hpanangle") into cast "MouseStillDownHandler Message"
  725.   end if
  726. end TestMouseStillDownHandler
  727.  
  728. on TestNodeLeaveHandler pToNode
  729.   global gPanoMovieID
  730.   if gPanoMovieID <> empty then
  731.     put "Leaving node ID: " & pToNode into cast "NodeLeaveHandler Message"
  732.   end if
  733. end TestNodeLeaveHandler
  734.  
  735.  
  736.  
  737.  
  738.