getPatchsAtQuadrs ps fm id = case IM.lookup id (controlPoints fm) of
  Nothing -> []
  Just cp -> let
    sIDs   = S.elems $ surfaceMembers cp
    func x = do
      s            <- M.lookup x (surfaces fm)
      (patch, pos) <- findVertex (patchs s) id
      tn1          <- normalize <$> tan1 (evalPatch ps patch) pos
      tn2          <- normalize <$> tan2 (evalPatch ps patch) pos
      return (tn1 &+ tn2)
    in mapMaybe func sIDs
getPatchsAtQuadrs ps fm id = case IM.lookup id (controlPoints fm) of
  Nothing -> []
  Just cp -> let
    sIDs   = S.elems $ surfaceMembers cp
    func x = do
      s            <- M.lookup x (surfaces fm)
      (patch, pos) <- findVertex (patchs s) id
      tn1          <- normalize <$> tan1 (evalPatch ps patch) pos
      tn2          <- normalize <$> tan2 (evalPatch ps patch) pos
      return (tn1 &+ tn2)
    in mapMaybe func sIDs
getPatchsAtQuadrs ps fm id = case IM.lookup id (controlPoints fm) of
  Nothing -> []
  Just cp -> let
    sIDs   = S.elems $ surfaceMembers cp
    func x = do
      s            <- M.lookup x (surfaces fm)
      (patch, pos) <- findVertex (patchs s) id
      tn1          <- normalize <$> tan1 (evalPatch ps patch) pos
      tn2          <- normalize <$> tan2 (evalPatch ps patch) pos
      return (tn1 &+ tn2)
    in mapMaybe func sIDs