pro mg_surfview_event, event
compile_opt strictarr
widget_control, event.top, get_uvalue=pstate
uname = widget_info(event.id, /uname)
case uname of
'tlb' : begin
tlbG = widget_info(event.top, /geometry)
new_x = event.x - 2 * tlbG.xpad
new_y = event.y - 2 * tlbG.ypad
widget_control, (*pstate).draw, xsize=new_x, ysize=new_y
(*pstate).owindow->draw, (*pstate).oview
(*pstate).otrack->reset, [new_x, new_y] / 2, (new_x > new_y) / 2
end
'draw' : begin
update = (*pstate).otrack->update(event, transform=rotation)
if update then begin
(*pstate).omodel->getProperty, transform=transform
(*pstate).omodel->setProperty, transform=transform # rotation
(*pstate).owindow->draw, (*pstate).oview
endif
end
endcase
end
pro mg_surfview_cleanup, tlb
compile_opt strictarr
widget_control, tlb, get_uvalue=pstate
obj_destroy, [(*pstate).otrack, (*pstate).oview]
ptr_free, pstate
end
pro mg_surfview, z, renderer=renderer
compile_opt strictarr
_z = n_elements(z) eq 0 ? hanning(20, 20) : z
xsize = 400
ysize = 400
tlb = widget_base(title='Surface view', /column, $
/tlb_size_events, uname='tlb')
draw = widget_draw(tlb, xsize=xsize, ysize=ysize, $
graphics_level=2, renderer=renderer, $
/motion_events, /button_events, uname='draw')
widget_control, tlb, /realize
widget_control, draw, get_value=owindow
oview = obj_new('IDLgrView', color=[0, 0, 0])
omodel = obj_new('IDLgrModel')
oview->add, omodel
osurface = obj_new('IDLgrSurface', _z, style=2, $
color=[255, 0, 0], bottom=[100, 0, 0])
omodel->add, osurface
olightmodel = obj_new('IDLgrModel')
oview->add, olightmodel
olight = obj_new('IDLgrLight', type=2, location=[-1, 1, 1])
olightmodel->add, olight
osurface->getProperty, xrange=xr, yrange=yr, zrange=zr
xc = norm_coord(xr)
xc[0] -= 0.5
yc = norm_coord(yr)
yc[0] -= 0.5
zc = norm_coord(zr)
zc[0] -= 0.5
osurface->setProperty, xcoord_conv=xc, ycoord_conv=yc, zcoord_conv=zc
omodel->rotate, [1, 0, 0], -90
omodel->rotate, [0, 1, 0], -30
omodel->rotate, [1, 0, 0], 30
owindow->draw, oview
otrack = obj_new('Trackball', [xsize, ysize] / 2, (xsize > ysize) / 2)
state = { oview: oview, $
omodel: omodel, $
owindow: owindow, $
otrack: otrack, $
draw: draw $
}
pstate = ptr_new(state, /no_copy)
widget_control, tlb, set_uvalue=pstate
xmanager, 'mg_surfview', tlb, /no_block, $
event_handler='mg_surfview_event', $
cleanup='mg_surfview_cleanup'
end