-- MESHCHECK.MS
--  Copyright © Martijn Buijs, 2008
--  http://www.bytehazard.com

-- clean up
clearlistener()
if fMeshCheck != undefined do
(
 closeRolloutFloater fMeshCheck
)


-- returns angle between two normalized vectors
fn mcAngleBetweenVectors v1 v2 =
(
 ------fuck!! 3dsmax acos already converts to degrees (rather than radians!)
 return (acos (dot (normalize v1) (normalize v2))) --* (180 / pi)
)


-- selects degenerate mesh faces
fn fhxMeshCheck threshold =
(
 if selection.count != 1 do (
  messagebox "Please select one node!"
  return false
 )
 
 local obj = selection[1]
 
 -- add modifier if needed
 if (classof obj) != Editable_mesh do
 (
  addModifier obj (Edit_mesh())
 )
 
 local facesel = #()
 for i=1 to obj.numFaces do
 (
  f = getFace obj i
  v1 = getVert obj f[1]
  v2 = getVert obj f[2]
  v3 = getVert obj f[3]
  
  a1 = mcAngleBetweenVectors (v2 - v1) (v3 - v1)
  a2 = mcAngleBetweenVectors (v3 - v2) (v1 - v2)
  a3 = mcAngleBetweenVectors (v1 - v3) (v2 - v3)
  
  local badtri = false
  if a1 < threshold do badtri = true
  if a2 < threshold do badtri = true
  if a3 < threshold do badtri = true
  
  if badtri == true do append facesel i
 )
 
 -- set face selection
 if facesel.count > 0 then
 (
  max modify mode
  subobjectlevel = 3
  setFaceSelection obj facesel
 ) else (
  setFaceSelection obj #()
  redrawViews()
  messagebox "No thin triangles found!"
 )
)


-- about rollout
rollout rMeshCheck_About "About"
(
 label lab1 "Mesh Check"
 label lab2 "Version 1.0.0"
 label lab3 "by Martijn Buijs, 2010"
)

-- output rollout
rollout rMeshCheck_Main "Main"
(
 spinner spnThreshold "Threshold: " type:#float range:[0,90,0.1] scale:0.01
 button cmdCheck "Check" width:140
 
 on cmdCheck pressed do
 (
  try (
   undo on (
    fhxMeshCheck spnThreshold.value
   )
  ) catch (
   messageBox "Error occurred, please report this to [FH]Remdul!"
  )
 )
)

-- floater
fMeshCheck = newRolloutFloater "Mesh Check" 180 110
addRollout rMeshCheck_Main fMeshCheck
addRollout rMeshCheck_About fMeshCheck rolledup:true

-- END OF FILE
