interactors.tcl
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:23k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. ######################################################################
  2. #
  3. # interactors.tcl
  4. # created 10/29/98  magi
  5. #
  6. # manage responses to user actions without explicit -command bindings
  7. #
  8. ######################################################################
  9. #
  10. # exports:
  11. #   traceUIVariables
  12. #   bindMouse
  13. #
  14. ######################################################################
  15. ######################################################################
  16. #
  17. # setup variable traces
  18. #
  19. ######################################################################
  20. proc traceUIVariables {} {
  21.     if {[globalset noui]} return
  22.     globaltrace theMesh              w changeCurrentMesh
  23.     globaltrace theMover             w changeTheMover
  24.     globaltrace theColorMode         w changeColorMode
  25.     globaltrace theBackfaceMode      w changeBackfaceMode
  26.     globaltrace thePolygonMode       w changePolygonMode
  27.     globaltrace drawResolution       w changeOverallResolution
  28.     globaltrace transparentSelection w changeTransparentSelection
  29.     globaltrace styleTStrip          w changeTStrip
  30.     globaltrace styleDispList        w changeDispList
  31.     globaltrace styleCacheRender     w changeCacheRender
  32.     globaltrace slowPolyCount        w changeSlowPolyCount
  33.     globaltrace rotationConstraint   w changeRotationConstraint
  34.     globaltrace manipRender          w changeManipRenderMode
  35.     globaltrace ui_showToolbar       w changeUIShowElement
  36.     globaltrace ui_showStatusbar     w changeUIShowElement
  37.     globaltrace stylePointSize       w changePointSize
  38.     globaltrace meshControlsSort     w changeMeshControlsSort
  39.     globaltrace renderOnlyActiveMesh w changeRenderOnlyActiveMesh
  40.     globaltrace theCoR               w changeCenterOfRotation
  41. }
  42. ######################################################################
  43. #
  44. # Mouse bindings: main entry point is bindMouse
  45. # bindMouse calls unbindMouse, then, based on value of theMover,
  46. # calls bindMouseToXXX to set up the appropriate bindings.
  47. #
  48. ######################################################################
  49. set prevMover ""
  50. set oldMover "mesh"
  51. set mouse_state_1 0
  52. set mouse_state_2 0
  53. set mouse_state_x 0
  54. set mouse_state_y 0
  55. proc bindMouse {widget} {
  56.     unbindMouse $widget
  57.     if {[globalset mouse_state_1]} {
  58. event generate $widget <ButtonRelease-1> 
  59.     -x [globalset mouse_state_x] -y [globalset mouse_state_y]
  60. puts "faking b1-up"
  61.     }
  62.     if {[globalset mouse_state_2]} {
  63. event generate $widget <ButtonRelease-2> 
  64.     -x [globalset mouse_state_x] -y [globalset mouse_state_y]
  65. puts "faking b2-up"
  66.     }
  67.     
  68.     global theMover
  69.     # theMover values: mesh, viewer, light, clipRect, rotCenter, ptChooser
  70.     switch -exact -- $theMover {
  71. mesh        { bindMouseToTrackball $widget mesh }
  72. viewer      { bindMouseToTrackball $widget viewer }
  73. light       { bindMouseToMoveLight $widget }
  74. clipLine    { bindMouseToSelectLine  $widget }
  75. clipRect    { bindMouseToSelectRect  $widget }
  76. clipShape   { bindMouseToSelectShape $widget }
  77. selectScan  { bindMouseToSelectScans $widget }
  78. selectScreenScan { bindMouseToScreenSelectScans $widget }
  79. rotCenter   { bindMouseToChooseCenter $widget }
  80. ptChooser   { bindMouseToDisplayPoint $widget }
  81. pickScan    { bindMouseToPickScan  $widget }
  82. pickColor   { bindMouseToPickColor $widget }
  83. zoomer      { bindMouseToZoomer $widget }
  84.     }
  85.     globalset prevMover [globalset oldMover]
  86.     globalset oldMover $theMover
  87.     bind . <KeyPress-space>   {
  88. if {$theMover == "viewer"} {
  89.     if {$prevMover != "" && $prevMover != "viewer"} {
  90. set theMover $prevMover
  91.     } else {
  92. set theMover mesh
  93.     }
  94.         } else {set theMover viewer}
  95.     }
  96.     if {[globalset mouse_state_1]} {
  97. event generate $widget <ButtonPress-1> 
  98.     -x [globalset mouse_state_x] -y [globalset mouse_state_y]
  99. puts "faking b1-dn"
  100.     }
  101.     if {[globalset mouse_state_2]} {
  102. event generate $widget <ButtonPress-2> 
  103.     -x [globalset mouse_state_x] -y [globalset mouse_state_y]
  104. puts "faking b2-dn"
  105.     }
  106.     # track mouse state since we can't query it
  107.     prebind $widget <ButtonPress-1>   {set mouse_state_1 1}
  108.     prebind $widget <ButtonRelease-1> {set mouse_state_1 0}
  109.     prebind $widget <ButtonPress-2>   {set mouse_state_2 1}
  110.     prebind $widget <ButtonRelease-2> {set mouse_state_2 0}
  111.     prebind $widget <B1-Motion>       {set mouse_state_x %x;
  112.                                set mouse_state_y %y}
  113.     prebind $widget <B2-Motion>       {set mouse_state_x %x;
  114.                                set mouse_state_y %y}
  115.     prebind $widget    <Motion>       {set mouse_state_x %x;
  116.                                set mouse_state_y %y}
  117. }
  118. proc unbindMouse {widget} {
  119.     bind $widget <ButtonPress-1> {}
  120.     bind $widget <B1-Motion> {}
  121.     bind $widget <Shift-B1-Motion> {}
  122.     bind $widget <ButtonRelease-1> {}
  123.     bind $widget <ButtonPress-2> {}
  124.     bind $widget <B2-Motion> {}
  125.     bind $widget <ButtonRelease-2> {}
  126.     bind $widget <Motion> {}
  127.     global unbindUnwindProc
  128.     if {[info exists unbindUnwindProc]} {
  129. eval $unbindUnwindProc
  130.     }
  131.     resetToglMenu
  132. }
  133. proc resetToglMenu {} {
  134.     global toglMenu
  135.     global toglSubmenu
  136.     $toglMenu delete 0 end
  137.     $toglMenu add cascade -label "Render options" -menu $toglSubmenu(render)
  138.     $toglMenu add separator
  139.     $toglMenu add cascade -label "Reset transform" -menu $toglSubmenu(reset)
  140.     $toglMenu add cascade -label "Go home" -menu $toglSubmenu(gohome)
  141.     $toglMenu add separator
  142.     $toglMenu add cascade -label "Rotation center" -menu $toglSubmenu(CoR)
  143.     $toglMenu add separator
  144.     $toglMenu add command -label Exit -command confirmQuit
  145. }
  146. proc bindMouseToTrackball {widget mode} {
  147.     bind $widget <ButtonPress-1> 
  148. "setTBCursor $widget %s p1;
  149.          resetRotationCenter;
  150.          plv_rotxyviewmouse $widget %x %y %t start"
  151.     bind $widget <B1-Motion> 
  152. "plv_rotxyviewmouse $widget %x %y %t"
  153.     bind $widget <ButtonRelease-1> 
  154. "setTBCursor $widget %s r1;
  155.          plv_rotxyviewmouse $widget %x %y %t stop"
  156.     bind $widget <ButtonPress-2> 
  157. "setTBCursor $widget %s p2;
  158.          plv_transxyviewmouse $widget %x %y %t start"
  159.     bind $widget <B2-Motion> 
  160. "plv_transxyviewmouse $widget %x %y %t"
  161.     bind $widget <ButtonRelease-2> 
  162. "setTBCursor $widget %s r2;
  163.          resetRotationCenter;
  164.          plv_transxyviewmouse $widget %x %y %t stop"
  165.     # these bindings allow Ctrl and Alt to act as the shortcuts to
  166.     # lighting and clipping controls like they used to, without
  167.     # having to permanently bind Alt-B1-Motion and so on.
  168.     bind $widget <Alt-Motion> 
  169. "bindMouseToTemporary $widget bindMouseToSelectRect"
  170.     bind $widget <Control-Motion> 
  171. "bindMouseToTemporary $widget bindMouseToMoveLight"
  172.     setTBCursor $widget 0 none
  173.     globalset unbindUnwindProc "plv_rotxyviewmouse $widget stopspin"
  174.     if {$mode == "mesh"} {
  175. # screenCenter rotation is illegal
  176. .tools.screenCenter config -state disabled
  177. globalset unbindUnwindProc "[globalset unbindUnwindProc]; 
  178.                      .tools.screenCenter config -state normal"
  179.     }
  180.     # zoom in/out on context menu
  181.     global toglMenu
  182.     $toglMenu insert 1 command -label "Zoom in" 
  183. -command {eval zoomInClick $toglContextClick}
  184.     $toglMenu insert 2 command -label "Zoom out" 
  185. -command {eval zoomOutClick $toglContextClick}
  186.     $toglMenu insert 3 separator
  187. }
  188. proc bindMouseToMoveLight {widget} {
  189.     bind $widget <ButtonPress-1> 
  190. "plv_rotlight $widget %x %y"
  191.     bind $widget <B1-Motion> 
  192. "plv_rotlight $widget %x %y"
  193.     global cursor
  194.     $widget config -cursor "circle$cursor(Fore)"
  195. }
  196. proc bindMouseToTemporary {widget binding} {
  197.     unbindMouse $widget
  198.     $binding $widget
  199.     bind $widget <Motion> "bindMouse $widget"
  200. }
  201. proc bindMouseToSelectRect {widget} {
  202.     global theMesh
  203.     bind $widget <ButtonPress-1> 
  204. "plv_drawboxselection $widget %x %y start"
  205.     bind $widget <B1-Motion> 
  206. "set clipEnabled 1; 
  207.  plv_drawboxselection $widget %x %y move"
  208.     bind $widget <ButtonRelease-1> 
  209. "plv_drawboxselection $widget %x %y stop"
  210.     bind $widget <Motion> "setSelectionCursor $widget %x %y"
  211.     global toglMenu toglSubmenu
  212.     $toglMenu insert 1 command -label "Zoom to rect" 
  213. -command plv_zoom_to_rect
  214.     if {[globalset oldMover] == "mesh"} {
  215. $toglMenu insert 2 command -label "Align mesh to plane" 
  216.     -command "alignToFitPlane mesh"
  217.     } else {
  218. $toglMenu insert 2 command -label "Align viewer to plane" 
  219.     -command "alignToFitPlane camera"
  220.     }
  221.     $toglMenu insert 3 command -label "Clear selection" 
  222. -command clearSelection
  223.     $toglMenu insert 4 cascade -label "Clip" -menu $toglSubmenu(clip)
  224.     $toglMenu insert 5 separator
  225.     # added menu option for printing voxels - for voxel display feature
  226.     $toglMenu insert 6 command -label "Print voxel info - for ply file only" 
  227. -command "plv_print_voxels $theMesh"
  228.     $toglMenu insert 7 separator
  229. }
  230. proc bindMouseToSelectLine {widget} {
  231.     bind $widget <ButtonPress-1> 
  232. "plv_drawlineselection %x %y start"
  233.     bind $widget <B1-Motion> 
  234. "set clipEnabled 1; plv_drawlineselection %x %y move"
  235.     bind $widget <Shift-B1-Motion> 
  236. "set clipEnabled 1; plv_drawlineselection %x %y move constrain"
  237.     bind $widget <ButtonRelease-1> 
  238. "plv_drawlineselection %x %y stop"
  239.     bind $widget <Motion> "setSelectionCursor $widget %x %y"
  240.     global toglMenu
  241.     $toglMenu insert 1 command -label "Analyze line..." 
  242. -command analyze_line_depth
  243.     $toglMenu insert 2 command -label "Clear selection" 
  244. -command clearSelection
  245.     $toglMenu insert 3 separator
  246. }
  247. proc bindMouseToSelectShape {widget} {
  248.     bind $widget <ButtonPress-1> 
  249. "plv_drawshapeselection %x %y start"
  250.     bind $widget <B1-Motion> 
  251. "plv_drawshapeselection %x %y move"
  252.     bind $widget <ButtonRelease-1> 
  253. "plv_drawshapeselection %x %y stop"
  254.     bind $widget <ButtonPress-2> 
  255. "plv_drawshapeselection %x %y modify"
  256.     bind $widget <B2-Motion> 
  257. "plv_drawshapeselection %x %y move"
  258.     bind $widget <ButtonRelease-2> 
  259. "plv_drawshapeselection %x %y remove"
  260.     bind $widget <Motion> "setSelectionCursor $widget %x %y"
  261.     bind $widget <ButtonPress-2> "+setSelectionCursor $widget %x %y"
  262.     bind $widget <ButtonRelease-2> "+setSelectionCursor $widget %x %y"
  263.     global toglMenu toglSubmenu
  264.     $toglMenu insert 1 cascade -label "Clip" -menu $toglSubmenu(clip)
  265.     $toglMenu insert 2 command -label "Clear selection" 
  266. -command clearSelection
  267.     $toglMenu insert 3 separator
  268. }
  269. proc _bmtss_helper {widget x y mode} {
  270.     set clipEnabled 1
  271.     plv_drawboxselection $widget $x $y $mode
  272.     eval plv_hilitescan [plv_get_selected_meshes silent]
  273. }
  274. proc _bmtss_release_helper {widget} {
  275.     plv_drawboxselection $widget 0 0 stop
  276.     eval showOnlyMesh [plv_get_selected_meshes]
  277.     clearSelection
  278.     plv_hilitescan
  279. }
  280. proc bindMouseToSelectScans {widget} {
  281.     bind $widget <ButtonPress-1>   "_bmtss_helper $widget %x %y start"
  282.     bind $widget <B1-Motion>       "_bmtss_helper $widget %x %y move"
  283.     bind $widget <ButtonRelease-1> "_bmtss_helper $widget %x %y stop"
  284.     puts "nB1-drag to select meshes; B2 to confirm"
  285.     bind $widget <ButtonRelease-2> "_bmtss_release_helper $widget"
  286.     bind $widget <Motion> "setSelectionCursor $widget %x %y"
  287.     # remove any hilites
  288.     globalset unbindUnwindProc "plv_hilitescan"
  289. }
  290. proc _bmtss_screen_helper {widget x y mode} {
  291.     set clipEnabled 1
  292.     plv_drawboxselection $widget $x $y $mode
  293.     #eval plv_hilitescan [plv_get_selected_meshes silent]
  294. }
  295. proc _bmtss_screen_release_helper {widget} {
  296.     plv_drawboxselection $widget 0 0 stop
  297.     eval showOnlyMesh [plv_getVisiblyRenderedScans selected]
  298.     clearSelection
  299.     plv_hilitescan
  300. }
  301. proc bindMouseToScreenSelectScans {widget} {
  302.     bind $widget <ButtonPress-1>   "_bmtss_screen_helper $widget %x %y start"
  303.     bind $widget <B1-Motion>       "_bmtss_screen_helper $widget %x %y move"
  304.     bind $widget <ButtonRelease-1> "_bmtss_screen_helper $widget %x %y stop"
  305.     puts "nB1-drag to select meshes; B2 to confirm"
  306.     bind $widget <ButtonRelease-2> "_bmtss_screen_release_helper $widget"
  307.     bind $widget <Motion> "setSelectionCursor $widget %x %y"
  308.     # remove any hilites
  309.     globalset unbindUnwindProc "plv_hilitescan"
  310. }
  311. proc _pick_scan_click_helper {x y b {s ""}} {
  312.     set selected [plv_pickscan get $x $y]
  313.     if {$selected == ""} {
  314. puts "Sorry, you missed."
  315.     } else {
  316. if {$b == 1} {
  317.     # select mesh
  318.     globalset theMesh $selected
  319.     # Updates the context pickscan
  320.     vg_pickScanContextHelper $selected $s
  321. } elseif {$b == 2} {
  322.     # toggle visibility
  323.     global meshVisible
  324.     changeVis $selected [expr !$meshVisible($selected)]
  325. }
  326.     }
  327. }
  328. proc _pick_scan_icp_helper {mode} {
  329.     set selected [eval plv_pickscan get [globalset toglContextClick]]
  330.     if {$selected == ""} {
  331. puts "Sorry, you missed."
  332.     } else {
  333. globalset regICP$mode $selected
  334.     }
  335. }
  336. proc _pick_scan_move_helper {x y} {
  337.     set selected [plv_pickscan get $x $y]
  338.     if {$selected == ""} {
  339. plv_hilitescan
  340. setWindowTitle pick
  341. set color [lindex [.tools.pickScan config -selectcolor] 3]
  342.     } else {
  343. plv_hilitescan $selected
  344. setWindowTitle "pick $selected"
  345. set color [GetMeshFalseColor $selected]
  346.     }
  347.     .tools.pickScan config -selectcolor $color
  348. }
  349. proc _pick_color_click_helper {x y {s ""}} {
  350.    
  351.     set selected [plv_pickscan get $x $y]
  352.     if {$selected == ""} {
  353. puts "Sorry, you missed."
  354.     } else {
  355. # Update the context of pickscan
  356. vg_pickScanContextHelper $selected $s
  357. # Set mesh in colorvis
  358. color_vis_set_mesh $selected
  359. color_vis_proj_color $x $y
  360. # set the current mesh
  361. globalset theMesh $selected
  362.     }  
  363. }
  364. proc bindMouseToPickScan {widget} {
  365.     cursor watch
  366.     plv_pickscan init
  367.     cursor restore
  368.     puts "B1 to activate mesh; B2 to toggle visibility"
  369.     puts "Shift-B1 to append to PICK_SCAN context mesh list."
  370.     bind $widget <ButtonPress-1> 
  371. "_pick_scan_click_helper %x %y 1 %s"
  372.     bind $widget <ButtonPress-2> 
  373. "_pick_scan_click_helper %x %y 2"
  374.     bind $widget <Motion> 
  375. "_pick_scan_move_helper %x %y"
  376.     global cursor
  377.     $widget config -cursor "diamond_cross$cursor(Fore)$cursor(Back)"
  378.     globalset onMainResizeProc { plv_pickscan init }
  379.     globalset unbindUnwindProc {
  380. plv_pickscan exit
  381.         plv_hilitescan
  382.         setWindowTitle
  383.         resetBGcolor .tools.pickScan
  384. globalset onMainResizeProc ""
  385.     }
  386.     global toglMenu
  387.     $toglMenu insert 1 command -label "Pick as ICP from" 
  388. -command "_pick_scan_icp_helper From"
  389.     $toglMenu insert 2 command -label "Pick as ICP to" 
  390. -command "_pick_scan_icp_helper To"
  391.     $toglMenu insert 3 separator
  392. }
  393. proc bindMouseToPickColor {widget} {
  394.     cursor watch
  395.     plv_pickscan init
  396.     cursor restore
  397.     bind $widget <ButtonPress-1> 
  398. "_pick_color_click_helper %x %y %s"
  399.     
  400.     global cursor
  401.     $widget config -cursor "diamond_cross$cursor(Fore)$cursor(Back)"
  402.     globalset unbindUnwindProc "plv_pickscan exit; 
  403.       
  404.         resetBGcolor .tools.pickColor"
  405. }
  406. proc bindMouseToZoomer {widget} {
  407.     bind $widget <ButtonPress-1> "zoomInClick %x %y %s"
  408.     bind $widget <ButtonPress-2> "zoomOutClick %x %y %s"
  409.     global cursor
  410.     $widget config -cursor "diamond_cross$cursor(Fore)$cursor(Back)"
  411. }
  412. proc setSelectionCursor {widget x y} {
  413.     global cursor
  414.     set type [plv_getselectioncursor $x $y]
  415.     $widget config -cursor "$type$cursor(Fore)"
  416. }
  417. proc bindMouseToChooseCenter {widget} {
  418.     puts "Choose new rotation center: B1 to confirm, B2 to cancel"
  419.     # set up bindings for choosing new center
  420.     bind $widget <ButtonRelease-1> "setRotationCenter %x %y"
  421.     bind $widget <ButtonRelease-2> "setRotationCenter none"
  422.     global cursor
  423.     $widget config -cursor "diamond_cross$cursor(Fore)$cursor(Back)"
  424. }
  425. proc bindMouseToDisplayPoint {widget} {
  426.     bind $widget <ButtonPress-1> 
  427. {puts "(%x,%y): [plv_screentoworld %x %y]"
  428.     # addxyzpoint is for imageAlignment tool
  429.     addxyzpoint [plv_screentoworld %x %y] %x %y
  430. }
  431.     global cursor
  432.     $widget config -cursor "diamond_cross$cursor(Fore)$cursor(Back)"
  433. }
  434. ######################################################################
  435. #
  436. # changeXXX functions -- variable trace event handlers
  437. #
  438. ######################################################################
  439. proc changeVis {mesh {val ""}} {
  440.     global meshVisible
  441.     # if val is empty, this means someone else already changed
  442.     # meshVisible and wants to update the C code on that fact.
  443.     if {$val != ""} {
  444. # but if val is non-empty and the same as the current state,
  445. # someone's just being daft and we don't actually have to
  446. # do anything.
  447. if {$val == $meshVisible($mesh)} {return}
  448. # ok, it's a real change
  449. set meshVisible($mesh) $val
  450.     }
  451.     if {[globalset selectionFollowsVisibility]} {
  452. # if the active mesh is invisible, need to do something about it
  453. if {!$meshVisible([globalset theMesh])} {
  454.     if {$meshVisible($mesh)} {
  455. # if this mesh just gained visibility, select it
  456. globalset theMesh $mesh
  457.     } else {
  458. # this mesh just hid... select the first mesh
  459. foreach maybe [array names meshVisible] {
  460.     if {$meshVisible($maybe)} {
  461. globalset theMesh $maybe
  462. break
  463.     }
  464. }
  465.     }
  466. }
  467.     }
  468.     plv_setvisible $mesh $meshVisible($mesh)
  469.     updatePolyCount
  470.     redraw 1
  471. }
  472. proc changeLoaded {mesh {val ""}} {
  473.     global meshLoaded
  474.     
  475.     # if val is empty, this means someone else already changed
  476.     # meshLoaded and wants to update the C code on that fact.
  477.     if {$val != ""} {
  478. # but if val is non-empty and the same as the current state,
  479. # someone's just being daft and we don't actually have to
  480. # do anything.
  481. if {$val == $meshLoaded($mesh)} {return}
  482. # ok, it's a real change
  483. set meshLoaded($mesh) $val
  484.     }
  485.     
  486.     scz_session activate $mesh $meshLoaded($mesh)
  487.     updatePolyCount
  488.     set f [globalset meshFrame($mesh)]
  489.     set max [buildUI_ResizeResBars $mesh $f]
  490.     $f.title.pad config -width [expr 45 - $max]
  491.     
  492.     redraw 1
  493. }
  494. proc changeColorMode {var dummy1 op} {
  495.     plv_material -colormode [globalset theColorMode]
  496.     redraw
  497. }
  498. proc changeBackfaceMode {var dummy1 op} {
  499.     plv_material -backfacemode [globalset theBackfaceMode]
  500.     redraw
  501. }
  502. proc changePolygonMode {var dummy1 op} {
  503.     plv_drawstyle -polymode [globalset thePolygonMode]
  504.     redraw
  505. }
  506. proc changeOverallResolution {var dummy1 op} {
  507.     global drawResolution
  508.     cursor watch
  509.     plv_setoverallres $drawResolution
  510.     redraw
  511.     cursor restore
  512.     # drawResolution is only allowed to be temphigh/templow/default
  513.     # if any other, that was just to run the code above via the trace
  514.     # so now that we've done it, go back to default
  515.     if {$drawResolution != "reshigh" && $drawResolution != "reslow"} {
  516. # BUGBUG this doesn't help reset the radio button if the menu
  517. # is torn off, because other traces are disabled while this runs
  518. set drawResolution default
  519.     }
  520.     updatePolyCount
  521. }
  522. proc changeTransparentSelection {var dummy1 op} {
  523.     # called when transparentSelection changes
  524.     global transparentSelection
  525.     global theMesh
  526.     if {$transparentSelection} {
  527. plv_drawstyle -blend on
  528. set trans .5
  529.     } else {
  530. plv_drawstyle -blend off
  531. set trans 0
  532.     }
  533.     if {[globalset theMover] == "mesh"} {
  534. if {$theMesh != ""} {
  535.     plv_blendmesh $theMesh $trans
  536. }
  537.     }
  538.     redraw
  539. }
  540. proc changeTStrip {var dummy1 op} {
  541.     global styleTStrip
  542.     plv_drawstyle -tstrip $styleTStrip
  543.     redraw
  544.     if {[winfo exists .status]} {
  545. if {$styleTStrip} {
  546.     .status.info.tstrips config -fg darkgreen
  547. } else {
  548.     .status.info.tstrips config -fg darkred
  549. }
  550.     }
  551. }
  552. proc changeDispList {var dummy1 op} {
  553.     global styleDispList
  554.     plv_drawstyle -displaylist $styleDispList
  555.     redraw
  556.     if {$styleDispList} {
  557. .status.info.displist config -fg darkgreen
  558.     } else {
  559. .status.info.displist config -fg darkred
  560.     }
  561. }
  562. proc changeCacheRender {var dummy1 op} {
  563.     plv_drawstyle -cachetogl [globalset styleCacheRender]
  564. }
  565. proc changeSlowPolyCount {var dummy1 op} {
  566.     plv_setslowpolycount [globalset slowPolyCount]
  567. }
  568. proc changeRotationConstraint {var dummy1 op} {
  569.     plv_constrain_rotation [globalset rotationConstraint]
  570. }
  571. proc changeManipRenderMode {var dummy1 op} {
  572.     global manipRender
  573.     plv_setManipRenderMode 
  574. $manipRender(Points) 
  575. $manipRender(TinyPoints) 
  576. $manipRender(Unlit) 
  577. $manipRender(Lores) 
  578. $manipRender(SkipDisplayList) 
  579. $manipRender(Thresh)
  580. }
  581. proc changeCurrentMesh {var dummy1 op} {
  582.     # called when theMesh changes
  583.     global theMesh
  584.     global prevMesh
  585.     global transparentSelection
  586.     global theMover
  587.     if {$transparentSelection} {
  588. if {$prevMesh != ""} {
  589.     plv_blendmesh $prevMesh 0
  590. }
  591. if {$theMesh != ""} {
  592.     if {$theMover == "mesh"} {
  593. plv_blendmesh $theMesh .5
  594.     }
  595. }
  596.     }
  597.     # this forces all necessary redraws
  598.     plv_selectscan $theMesh
  599.     if {$theMover == "mesh"} {
  600. plv_selectscan $theMesh manipulate
  601.     }
  602.     set prevMesh [globalset oldMesh]
  603.     globalset oldMesh $theMesh
  604.     setWindowTitle
  605.     resetRotationMode
  606. }
  607. proc changeTheMover {var dummy1 op} {
  608.     # called when theMover changes
  609.     global transparentSelection
  610.     global theMesh
  611.     global theMover
  612.     if {$theMover == [globalset oldMover]} {
  613. return
  614.     }
  615.     bindMouse [globalset toglPane]
  616.     if {$transparentSelection != 0} {
  617. if {$theMesh != ""} {
  618.     if {$theMover == "mesh"} {
  619. plv_blendmesh $theMesh .5
  620.     } else {
  621. plv_blendmesh $theMesh 0
  622.     }
  623. }
  624.     }
  625.     if {$theMover == "mesh"} {
  626. if {$theMesh != ""} {
  627.     manipulateScan $theMesh
  628. }
  629.     } elseif {$theMover == "viewer"} {
  630. manipulateScan ""
  631.     }
  632.     # and, since theMover changed...
  633.     setWindowTitle
  634.     resetRotationMode
  635.     # any necessary redraws happened in manipulateScan
  636. }
  637. proc setTBCursor {widget state {change none}} {
  638.     # stupid state from event gives what the state was before this event...
  639.     set b1 [expr $state & 256]
  640.     set b2 [expr $state & 512]
  641.     switch -exact -- $change {
  642. p1 {set b1 1}
  643. r1 {set b1 0}
  644. p2 {set b2 1}
  645. r2 {set b2 0}
  646.     }
  647.     global cursor
  648.     if {[globalset theMover] == "mesh"} {
  649. set fore AltFore
  650.     } else {
  651. set fore Fore
  652.     }
  653.     if {$b2} {
  654. if {$b1} {
  655.     # zooming: pointing hand
  656.     $widget config -cursor "$cursor(PointingHand)$cursor($fore)"
  657. } else {
  658.     # panning: flat hand
  659.     $widget config -cursor "$cursor(FlatHand)$cursor($fore)"
  660. }
  661.     } else {
  662. # nothing, or rotating: curved hand
  663. $widget config -cursor "$cursor(CurvedHand)$cursor($fore)"
  664.     }
  665. }
  666. proc changeUIShowElement {var dummy1 op} {
  667.     if {$var == "ui_showToolbar"} {
  668. buildUI_ShowToolbar [globalset ui_showToolbar]
  669.     } elseif {$var == "ui_showStatusbar"} {
  670. buildUI_ShowStatusbar [globalset ui_showStatusbar]
  671.     }
  672. }
  673. proc changePointSize {var dummy1 op} {
  674.     plv_drawstyle -pointsize [globalset stylePointSize]
  675.     redraw
  676. }
  677. proc changeMeshControlsSort {var dummy1 op} {
  678.     resizeMCscrollbar
  679. }
  680. proc changeRenderOnlyActiveMesh {var dummy1 op} {
  681.     redraw 1
  682. }
  683. proc changeCenterOfRotation {var dummy1 op} {
  684.     hiliteRotationMode
  685.     
  686.     # BUGBUG -- magi -- this should call resetRotationCenter as below,
  687.     # since it obviously needs an update.  Mouse rotations won't be hurt,
  688.     # since they reset it themselves on lbuttondown anyway, but keyboard
  689.     # rotation commands will use wrong center.  And maybe other things too.
  690.     # Problem is: in certain cases (notably Invert), somehow this gets
  691.     # called at a time when nothing is visible ?!? and in
  692.     # PlvResetCenterOfRotation, (object, moveView), theScene->worldCenter
  693.     # returns origin since the scene bbox will be empty.
  694.     # Then lots of things get hosed.  This needs fixing but it doesn't
  695.     # seem easy, offhand.
  696.     #resetRotationCenter 1
  697. }