; docformat = 'rst' ;+ ; Program to demonstrate the changes to the transformation matrix as the ; the model is rotate, translated, and scaled. ; ; Controls: ; * Click and drag to rotate ; * Click and drag while holding SHIFT key to translate ; * Use mouse wheel to scale ;- ;+ ; Event handler for all event generated by the application. ; ; :Params: ; event : in, required, type=structure ; events generated by the application ;- 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 ; rotate 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 ; scale if (event.type eq 7) then begin s = 2.0 ^ event.clicks (*pstate).model->scale, s, s, s (*pstate).window->draw, (*pstate).view endif ; update table (*pstate).model->getProperty, transform=newTransform table = widget_info(event.top, find_by_uname='table') widget_control, table, set_value=newTransform end endcase end ;+ ; Free resources of the application. ; ; :Params: ; tlb : in, required, type=long ; top-level base widget identifier ;- 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 ;+ ; Launch the transformation matrix demo. ;- 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