pro mg_transform_demo_event, event
compile_opt strictarr
widget_control, event.top, get_uvalue=pstate
uname = widget_info(event.id, /uname)
case uname of
'draw': begin
translate = event.modifiers and 1
update = (*pstate).track->update(event, transform=rotTransform, translate=translate)
if (update) then begin
(*pstate).model->getProperty, transform=curTransform
newTransform = curTransform # rotTransform
(*pstate).model->setProperty, transform=newTransform
(*pstate).window->draw, (*pstate).view
endif
if (event.type eq 7) then begin
s = 2.0 ^ event.clicks
(*pstate).model->scale, s, s, s
(*pstate).window->draw, (*pstate).view
endif
(*pstate).model->getProperty, transform=newTransform
table = widget_info(event.top, find_by_uname='table')
widget_control, table, set_value=newTransform
end
endcase
end
pro mg_transform_demo_cleanup, tlb
compile_opt strictarr
widget_control, tlb, get_uvalue=pstate
obj_destroy, [(*pstate).view, (*pstate).window, (*pstate).track]
ptr_free, pstate
end
pro mg_transform_demo
compile_opt strictarr
xsize = 350
ysize = 350
tlb = widget_base(title='Transformation matrix demo', /column)
draw = widget_draw(tlb, xsize=xsize, ysize=ysize, graphics_level=2, $
/button_events, /motion_events, /wheel_events, $
uname='draw')
controls = ['Controls:', $
' * Click and drag to rotate', $
' * Click and drag while holding SHIFT key to translate', $
' * Use mouse wheel to scale']
text = widget_text(tlb, value=controls, ysize=4)
table = widget_table(tlb, value=identity(4), uname='table')
widget_control, tlb, /realize
widget_control, draw, get_value=window
view = obj_new('IDLgrView', color=[0, 0, 0])
model = obj_new('IDLgrModel')
view->add, model
surface = obj_new('IDLgrSurface', hanning(20, 20), style=2, $
color=[255, 0, 0], bottom=[100, 0, 0])
model->add, surface
surface->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
surface->setProperty, xcoord_conv=xc, ycoord_conv=yc, zcoord_conv=zc
lightModel = obj_new('IDLgrModel')
view->add, lightModel
dirLight = obj_new('IDLgrLight', type=2, location=[-1, +1, +1])
lightModel->add, dirLight
ambientLight = obj_new('IDLgrLight', type=0, intensity=0.5)
lightModel->add, ambientLight
track = obj_new('Trackball', [xsize, ysize] / 2, (xsize < ysize) / 2)
window->draw, view
state = { view: view, $
model: model, $
window: window, $
track: track $
}
pstate = ptr_new(state, /no_copy)
widget_control, tlb, set_uvalue=pstate
xmanager, 'mg_transform_demo', tlb, /no_block, $
cleanup='mg_transform_demo_cleanup', $
event_handler='mg_transform_demo_event'
end