; docformat = 'rst' ;+ ; Get properties of the MGgrWindow3D. ; ; :Keywords: ; eye_separation : out, optional, type=float ; number of degrees of the cone formed by drawing lines from each eye to ; the origin of the view ; _ref_extra : out, optional, type=keywords ; keyword of IDLgrWindow::getProperty ;- pro mggrwindow3d::getProperty, eye_separation=eyeSeparation, _ref_extra=e compile_opt strictarr if (arg_present(eyeSeparation)) then begin self.converter->getProperty, eye_separation=eyeSeparation endif if (n_elements(e) gt 0) then begin self->IDLgrWindow::getProperty, _strict_extra=e endif end ;+ ; Set properties of the MGgrWindow3D. Must intercept DIMENSIONS property to set ; the converter's buffer size correctly; otherwise, just pass along stuff to ; IDLgrWindow's setProperty method. ; ; :Keywords: ; dimensions : in, optional, type=intarr(2) ; dimensions of the window ; eye_separation {out}{optional, type=float ; number of degrees of the cone formed by drawing lines from each eye to ; the origin of the view ; _extra : in, optional, type=keywords ; keywords of IDLgrWindow's "setProperty" method are accepted ;- pro mggrwindow3d::setProperty, dimensions=dimensions, $ eye_separation=eyeSeparation, _extra=e compile_opt strictarr self->IDLgrWindow::setProperty, _extra=e if (n_elements(dimensions) gt 0) then begin self->IDLgrWindow::setProperty, dimensions=dimensions self.converter->setProperty, dimensions=dimensions endif if (n_elements(eye_separation) gt 0) then begin self.converter->setProperty, eye_separation=eyeSeparation endif end ;+ ; Draw the picture in 3D. ; ; :Params: ; picture : in, optional, type=obj ref ; the view, viewgroup, or scene to be drawn; if the GRAPHICS_TREE ; property is set to a valid picture, then this argument must *not* ; be given ;- pro mggrwindow3d::draw, picture compile_opt strictarr on_error, 2 self->getProperty, graphics_tree=graphicsTree _picture = obj_valid(picture) ? picture : graphicsTree view = self.converter->convert(_picture) self->idlgrwindow::draw, view end ;+ ; Free resources. ;- pro mggrwindow3d::cleanup compile_opt strictarr self->idlgrwindow::cleanup obj_destroy, self.converter end ;+ ; Initialize Window3D. ; ; :Returns: ; 1 for success, o/w for failure ; ; :Keywords: ; eye_separation : in, optional, type=float, default=4.0 ; number of degrees of the cone formed by drawing lines from each eye to ; the origin of the view ; _extra : in, optional, type=keywords ; keywords to IDLgrWindows "init" method are accepted ;- function mggrwindow3d::init, eye_separation=eyeSeparation, $ dimensions=dimensions, _extra=e compile_opt strictarr if (~self->IDLgrWindow::init(dimensions=dimensions, _extra=e)) then return, 0 if (n_elements(dimensions) eq 0) then begin case strlowcase(!version.os_family) of 'unix' : begin dims = [pref_get('idl_gr_x_width'), pref_get('idl_gr_x_height')] end 'windows' : begin dims = [pref_get('idl_gr_win_width'), pref_get('idl_gr_win_height')] end endcase endif else dims = dimensions self.converter = obj_new('MGgr3dConverter', $ eye_separation=eyeSeparation, $ dimensions=dims, _extra=e) return, 1 end ;+ ; Destination for object graphics that automatically creates a 3d anaglyph ; appropriate to view with red-blue glasses. ; ; :Fields: ; converter ; object which takes a view and converts to a 3D anaglyph ;- pro mggrwindow3d__define compile_opt strictarr define = { MGgrWindow3d, inherits IDLgrWindow, $ converter: obj_new() $ } end ; main-level example program view = obj_new('IDLgrView') lightmodel = obj_new('IDLgrModel') view->add, lightmodel light = obj_new('IDLgrLight', type=2, location=[-1, 1, 1]) lightmodel->add, light model = obj_new('IDLgrModel') view->add, model surface = obj_new('IDLgrSurface', hanning(20, 20), style=2, color=[255, 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 model->rotate, [1, 0, 0], -90 model->rotate, [0, 1, 0], 45 model->rotate, [1, 0, 0], 30 window3d = obj_new('MGgrWindow3d') window3d->draw, view end