// Copyright (C) 2010, Guy Barrand. All rights reserved. // See the file tools.license for terms. #ifndef tools_sg_set_plotter_camera #define tools_sg_set_plotter_camera #include "plotter" #include "ortho" namespace tools { namespace sg { inline void set_plotter_camera(float a_XSIZ,float a_YSIZ,float a_ZSIZ, plotter& a_plotter,ortho& a_camera,unsigned int a_ww,unsigned int a_wh) { if(!a_ww || !a_wh) return; a_plotter.width.value(a_XSIZ); a_plotter.height.value(a_YSIZ); a_plotter.depth.value(a_ZSIZ); enum plotter_viewport_mapping { pvp_adjust_viewport, pvp_leave_alone }; plotter_viewport_mapping pvp = pvp_adjust_viewport; //plotter_viewport_mapping pvp = pvp_leave_alone; typedef plotter::shape_type st_t; st_t plotter_shape = plotter::xy; float aspect = float(a_ww)/float(a_wh); {float XSIZ = a_plotter.width.value(); float YSIZ = a_plotter.height.value(); if((plotter_shape==plotter::xy) && (pvp==pvp_adjust_viewport)) { // Adjust the plotter XSIZ and YSIZ so that YSIZ matches viewport height // and plotter XSIZ matches viewport width. // It it the CERN-ROOT and osc-plot logic. if(aspect>=1) { //w>h //Camera must match in height YSIZ. Adjust XSIZ. a_plotter.width.value(YSIZ * aspect); } else { //Camera must match in width XSIZ. Adjust YSIZ. a_plotter.height.value(XSIZ / aspect); } }} {float camera_znear = 0; float camera_zfar = 0; float camera_z_pos = 0; // if camera ortho : float camera_height = 0; float XSIZ = a_plotter.width.value(); float YSIZ = a_plotter.height.value(); float z = 4 * a_plotter.depth.value(); camera_z_pos = z; camera_znear = 0.01F*z; camera_zfar = 100*z; //cam ortho : if(plotter_shape==plotter::xyz) { camera_height = YSIZ; } else { if(pvp==pvp_leave_alone) { // Adjust camera so that plotter XSIZ/YSIZ be not distorded. // If viewport aspect ratio > plotter aspect ratio // the plotter YSIZ matches the viewport height. If not // it is the plotter XSIZ that will match the viewport width. // It is the PAW logic for one region. float plotterAspect = XSIZ/YSIZ; if(aspect