pro free_polygon_array,poly_array

  npolys=n_elements(poly_array)

  for i=0L,npolys-1 do begin 
    if ptr_valid(poly_array[i]) then ptr_free,poly_array[i]
  end
end

function polygon_array_to_list_in_order,poly_array,order

  npolys=n_elements(order)
  if (npolys eq 0) then return, [0]

  polys=*(poly_array[order[0]])
  ptr_free,poly_array[order[0]]

  tenpercent=long(npolys/10.)

  for i=1L,npolys-1 do begin 
    ipoly=order[i]
    polys=[polys,*(poly_array[ipoly])]
    ptr_free,poly_array[ipoly]
  end

  return,polys
end

function polygon_array_to_list,poly_array

  npolys=n_elements(poly_array)
  if (npolys eq 0) then return, [0]

  polys=*(poly_array[0])
  ptr_free,poly_array[0]

  for i=1L,npolys-1 do begin 
    polys=[polys,*(poly_array[i])]
    ptr_free,poly_array[i]
    print,i
  end

  return,polys
end

function polygon_list_to_array,polys

  npolys=count_polygons(polys)
  poly_array=ptrarr(npolys) 

  ipoly=0L
  for i=0L,n_elements(polys)-1 do begin 
    if polys[i] lt 0L then break
    if polys[i] eq 0L then continue
    poly_array[ipoly]=ptr_new(polys[i:i+polys[i]])
  
    ipoly=ipoly+1
    i=i+polys[i]
  end
  return,poly_array
end

function get_polygon,polys,n

  ipoly=0L
  for i=0L,n_elements(polys)-1 do begin 
    if polys[i] lt 0L then break
    if polys[i] eq 0L then continue
  
    if ipoly eq n then begin
      return,polys[i:i+polys[i]]
    endif
  
    ipoly=ipoly+1
    i=i+polys[i]
  end

  return,[0]
end

function get_polygon,polys,n

  ipoly=0L
  for i=0L,n_elements(polys)-1 do begin 
    if polys[i] lt 0L then break
    if polys[i] eq 0L then continue
  
    if ipoly eq n then begin
      return,polys[i:i+polys[i]]
    endif
  
    ipoly=ipoly+1
    i=i+polys[i]
  end

  return,[0]
end

pro reorder_by_depth,object,tmat=tmat
  
  object->GetProperty, DATA=verts, POLYGONS=polys, $
                       XCOORD_CONV=xcc, $
                       YCOORD_CONV=ycc, $
                       ZCOORD_CONV=zcc

  if (keyword_set(tmat)) then tmat=reform(tmat)
  
  npolys=count_polygons(polys)
  distance=fltarr(npolys) 
 
  normverts=verts
  normverts[*,0]=xcc[0]+verts[*,0]*xcc[1]
  normverts[*,1]=ycc[0]+verts[*,1]*ycc[1]
  normverts[*,2]=zcc[0]+verts[*,2]*zcc[1]
  
  
  if keyword_set(tmat) then begin
    verts=vert_t3d(normverts,matrix=tmat,/no_copy)
  endif else begin
    verts=normverts
    normverts=0
  endelse
  
  vert_dist=reform(verts[2,*])
  
  ipoly=0L
  for i=0L,n_elements(polys)-1 do begin 
    if polys[i] lt 0L then break
    if polys[i] eq 0L then continue
  
    meandist=0.
    for j=i+1,i+polys[i] do begin
      meandist=meandist+vert_dist[polys[j]]  
    end
    meandist=meandist/polys[i]
    distance[ipoly]=meandist
  
    ipoly=ipoly+1
    i=i+polys[i]
  end
  
  order=sort(distance)

  poly_array=polygon_list_to_array(polys)
  newpolys=polygon_array_to_list_in_order(poly_array,order)

  free_polygon_array,poly_array
;  newpolys=get_polygon(polys,order[0L])
;  for ipoly=1L,npolys-1 do begin
;    newpolys=[newpolys,get_polygon(polys,order[ipoly])]
;  end

  object->SetProperty, POLYGONS=newpolys
  
end