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

3D图形编程

开发平台:

Visual C++

  1. proc deleteMeshRes {mesh meshResList res {mode unload}} {
  2.     if {$mode == "permanent"} {
  3. plv_mesh_res_delete $mesh $res
  4.     } else {
  5. plv_mesh_res_unload $mesh $res
  6.     }
  7.     load_resolutions $mesh $meshResList
  8.     set res [plv_getcurrentres $mesh]
  9.     hiliteResolution $meshResList $res
  10. }
  11. proc meshDecimateDialog {mesh} {
  12.     # create dialog
  13.     global uniqueInt
  14.     set decimator [toplevel .meshDecimate$uniqueInt]
  15.     incr uniqueInt
  16.     wm title $decimator "$mesh resolutions"
  17.     window_Register $decimator
  18.     set tf [frame $decimator.topframe]
  19.     pack $tf -side top
  20.     set meshScaleFrame [frame $tf.meshScaleFrame]
  21.     set meshResFrame [frame $tf.meshResFrame]
  22.     
  23.     set meshResList [Scrolled_Listbox $meshResFrame.listFrame 
  24.  -width 16 -height 6]
  25.     set meshResListFrame $meshResFrame.listFrame
  26.     set meshResButtonFrame [frame $meshResFrame.buttonFrame]
  27.     
  28.     set decimateButton [button $meshResButtonFrame.decButton 
  29.     -text "Decimate now" 
  30.     -command "render_decimated $mesh $meshResList
  31.                                         $meshScaleFrame.scaleMesh" 
  32.     -padx 0 -pady 0]
  33.     set deleteBtn [button $meshResButtonFrame.delete 
  34.        -text "Delete" -padx 0 -pady 0 
  35.        -command "deleteMeshRes $mesh $meshResList 
  36.                                  [plv_getcurrentres $mesh] permanent"]
  37.     pack $decimateButton $deleteBtn -side left
  38.     pack $meshResButtonFrame $meshResListFrame -side top
  39.     set scaleMesh [scale $meshScaleFrame.scaleMesh -from 1 -to 0 
  40.        -variable $decimator -length 120 -relief groove 
  41.        -sliderlength 10 -activebackground "medium sea green"
  42.        -tickinterval 1]
  43.     pack $scaleMesh -side right -padx 5 -fill y -expand true
  44.     $scaleMesh set 1
  45.     pack $meshScaleFrame $meshResFrame -side left -fill both -expand true
  46.     set method [frame $decimator.method]
  47.     label $method.l -text Method:
  48.     radiobutton $method.slim -text qslim 
  49. -variable globalDecimator -value qslim
  50.     radiobutton $method.crunch -text plycrunch 
  51. -variable globalDecimator -value plycrunch
  52.     pack $method.l $method.slim $method.crunch -side left
  53.     pack $method -side top
  54.     globalset globalDecimator qslim
  55.     bind $meshResList <ButtonRelease-1> 
  56. "switchMeshResolutionFromList $mesh $meshResList $scaleMesh"
  57.     bind $meshResList <ButtonRelease-3> 
  58. "meshResModify $mesh $meshResList %x %y"
  59.     # fill resolution list
  60.     set maxres [getPolyCount_maxres $mesh]
  61.     load_resolutions $mesh $meshResList
  62.         $scaleMesh configure -state normal -foreground "Black"
  63.     hiliteResolution $meshResList [plv_getcurrentres $mesh]
  64.     $scaleMesh configure -relief groove -troughcolor "Light Grey"
  65.     $scaleMesh configure -from $maxres -tickinterval $maxres
  66.     $scaleMesh set [getPolyCount_currentres $meshResList]
  67. }
  68. proc meshResModify {mesh list x y} {
  69.     set select [$list nearest $y]
  70.     set curpolys [getPolyCount_indexedres $list $select]
  71.     if {$x < 18} {
  72. toggleResPreload $mesh $list $select
  73.     } elseif {$x < 36} {
  74. set current [plv_getcurrentres $mesh]
  75. if {$current == $curpolys} {
  76.     puts "Error: cannot unload current res"
  77. } else {
  78.     deleteMeshRes $mesh $list $curpolys unload
  79. }
  80.     } else {
  81. # do nothing
  82.     }
  83. }
  84. proc switchMeshResolutionFromList {mesh meshResList scaleMesh} {
  85.     #set level [lindex [$meshResList curselection] 0]
  86.     set level [getPolyCount_currentres $meshResList]
  87.     switchMeshResolution $mesh $level $scaleMesh $meshResList
  88. }
  89. proc hiliteResolution {meshResList res} {
  90.     set resList [$meshResList get 0 end]
  91.     $meshResList selection clear 0 end
  92.     for {set i 0} {$i < [llength $resList]} {incr i} {
  93. if {$res == [extractPolyCount [lindex $resList $i]]} {
  94.     $meshResList selection set $i
  95.     $meshResList activate $i
  96.     return
  97. }
  98.     }
  99. }
  100. proc load_resolutions {theMesh meshResList} {
  101.     set level [$meshResList cursel]
  102.     $meshResList delete 0 end;
  103.     set resstring [plv_getreslist $theMesh]
  104.     while {[string compare $resstring ""] != 0} {
  105. scan $resstring {%s} token
  106. set resstring [string trimleft $resstring $token]
  107. set resstring [string trimleft $resstring]
  108. $meshResList insert end $token
  109.     }
  110.     if {$level != ""} {
  111. $meshResList selection set $level
  112.     }
  113. }
  114. proc extractPolyCount {resstring} {
  115.     set polys 0
  116.     scan $resstring {%[()AL-]:%d} modes polys
  117.     return $polys
  118. }
  119. proc getPolyCount_maxres {theMesh} {
  120.     set resstring [plv_getreslist $theMesh]
  121.     return [extractPolyCount $resstring]
  122. }
  123. proc getPolyCount_indexedres {list index} {
  124.     set resstring [lindex [$list get $index] 0]
  125.     return [extractPolyCount $resstring]
  126. }
  127. proc getPolyCount_currentres {meshResList} {
  128.     set level [$meshResList cursel]
  129.     if {$level == ""} {set level 0}
  130.     return [getPolyCount_indexedres $meshResList $level]
  131. }
  132. proc toggleResPreload {theMesh meshResList level} {
  133.     set resstring [lindex [$meshResList get $level] 0]
  134.     scan $resstring {%[()-AL]:%d} modes polys
  135.     if {[string index $modes 1] == "A"} {
  136. set opposite 0
  137.     } else {
  138. set opposite 1
  139.     }
  140.     plv_setmeshpreload $theMesh $polys $opposite
  141.     load_resolutions $theMesh $meshResList
  142. }
  143. proc switchMeshResolution {theMesh theMeshLevel scaleMesh meshResList} {
  144.     global toglPane
  145.     # update the meshset with current resolution
  146.     setMeshResolution $theMesh $theMeshLevel
  147.     
  148.     # reset the position of the resolution slider
  149.     $scaleMesh set [getPolyCount_currentres $meshResList]
  150.     # rebuild the mesh list in case this forced us to fetch an unloaded mesh
  151.     load_resolutions $theMesh $meshResList
  152. }
  153. proc render_decimated {theMesh meshResList resSlider} {
  154.     set newpolys [plv_decimate $theMesh [$resSlider get]
  155.       [globalset globalDecimator]]
  156.     setMeshResolution $theMesh $newpolys
  157.     load_resolutions $theMesh $meshResList
  158.     hiliteResolution $meshResList $newpolys
  159. }
  160. proc setMeshResolution {mesh resolution} {
  161.     cursor watch
  162.     plv_resolution $mesh $resolution
  163.     if {![globalset noui]} {
  164. redraw
  165. refreshCorrespRegWindows $mesh
  166. updatePolyCount
  167. global meshFrame
  168. buildUI_ResizeResBars $mesh $meshFrame($mesh)
  169.     }
  170.     cursor restore
  171. }
  172. proc buildMeshResList {mesh menu} {
  173.     global toglPane
  174.     global theMeshLevel
  175.     # clear resolution list
  176.     $menu delete 0 end
  177.     # attempt to get current res; bail gracefully on failure
  178.     # tcl8.0.5 appears to call this as the -postcommand even for
  179.     # disabled menus, so just graying it out when it doesn't apply
  180.     # isn't enough.
  181.     if {[catch {set theMeshLevel [plv_getcurrentres $mesh]}]} {
  182.         $menu add command -label "(No current mesh)" -state disabled
  183.         return
  184.     }
  185.     # then add all resolutions available
  186.     set resolutions [plv_getreslist $mesh]
  187.     foreach res $resolutions {
  188. set polys [string range $res [expr [string first : $res] + 1] end]
  189. $menu add radiobutton -label $polys -command "
  190.     setMeshResolution $mesh $polys
  191.     $toglPane render
  192. " -value $polys -variable theMeshLevel
  193.     }
  194.     $menu add separator
  195.     $menu add command -label "Highest" -accelerator "Ctrl+." 
  196. -command "setMeshResolution $mesh highest"
  197.     $menu add command -label "Higher" -accelerator . 
  198. -command "setMeshResolution $mesh higher"
  199.     $menu add command -label "Lower" -accelerator , 
  200. -command "setMeshResolution $mesh lower"
  201.     $menu add command -label "Lowest" -accelerator "Ctrl+," 
  202. -command "setMeshResolution $mesh lowest"
  203.     $menu add separator
  204.     $menu add command -label "Other..." 
  205. -command "meshDecimateDialog $mesh"
  206.     $menu config -tearoffcommand "setMenuTitle "$mesh resolutions""
  207. }