Display.cpp

Go to the documentation of this file.
00001 /*************** <auto-copyright.pl BEGIN do not edit this line> **************
00002  *
00003  * VR Juggler is (C) Copyright 1998-2005 by Iowa State University
00004  *
00005  * Original Authors:
00006  *   Allen Bierbaum, Christopher Just,
00007  *   Patrick Hartling, Kevin Meinert,
00008  *   Carolina Cruz-Neira, Albert Baker
00009  *
00010  * This library is free software; you can redistribute it and/or
00011  * modify it under the terms of the GNU Library General Public
00012  * License as published by the Free Software Foundation; either
00013  * version 2 of the License, or (at your option) any later version.
00014  *
00015  * This library is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018  * Library General Public License for more details.
00019  *
00020  * You should have received a copy of the GNU Library General Public
00021  * License along with this library; if not, write to the
00022  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00023  * Boston, MA 02111-1307, USA.
00024  *
00025  * -----------------------------------------------------------------
00026  * File:          $RCSfile$
00027  * Date modified: $Date: 2006-09-07 10:03:57 -0500 (Thu, 07 Sep 2006) $
00028  * Version:       $Revision: 19313 $
00029  * -----------------------------------------------------------------
00030  *
00031  *************** <auto-copyright.pl END do not edit this line> ***************/
00032 
00033 #include <vrj/vrjConfig.h>
00034 
00035 #include <iomanip>
00036 
00037 #include <jccl/Config/ConfigElement.h>
00038 #include <vrj/Display/Viewport.h>
00039 #include <vrj/Display/SimViewport.h>
00040 #include <vrj/Display/SurfaceViewport.h>
00041 #include <vrj/Display/Display.h>
00042 
00043 
00044 namespace vrj
00045 {
00046 
00047 Display::~Display()
00048 {
00049    for ( std::vector<vrj::Viewport*>::iterator i = mViewports.begin();
00050          i != mViewports.end();
00051          ++i )
00052    {
00053       delete *i;
00054    }
00055 
00056    mViewports.clear();
00057 }
00058 
00059 void Display::updateProjections(const float positionScale)
00060 {
00061    for(unsigned i=0;i<mViewports.size();i++)
00062    {
00063       mViewports[i]->updateProjections(positionScale);
00064    }
00065 }
00066 
00067 void Display::setOriginAndSize(const int originX, const int originY,
00068                                const int width, const int height,
00069                                const bool updateConfig)
00070 { 
00071    mOriginX = originX;
00072    mOriginY = originY;
00073    mWidth   = width;
00074    mHeight  = height;
00075 
00076    if(updateConfig)
00077    {
00078       mDisplayElement->setProperty<int>("origin", 0, originX);
00079       mDisplayElement->setProperty<int>("origin", 1, originY);
00080       mDisplayElement->setProperty<int>("size", 0, width);
00081       mDisplayElement->setProperty<int>("size", 1, height);
00082    }
00083 }
00084 
00085 
00086 void Display::config(jccl::ConfigElementPtr element)
00087 {
00088    vprASSERT(element.get() != NULL);
00089 
00090    configDisplayWindow(element);
00091    configViewports(element);
00092 }
00093 
00094 void Display::configDisplayWindow(jccl::ConfigElementPtr element)
00095 {
00096    vprASSERT(element.get() != NULL);
00097 
00098    // -- Get config info from element -- //
00099    int originX      = element->getProperty<int>("origin", 0);
00100    int originY      = element->getProperty<int>("origin", 1);
00101    int sizeX        = element->getProperty<int>("size", 0);
00102    int sizeY        = element->getProperty<int>("size", 1);
00103    std::string name = element->getName();
00104    mBorder          = element->getProperty<bool>("border");
00105    mHideMouse       = element->getProperty<bool>("hide_mouse");
00106    int pipe         = element->getProperty<int>("pipe");
00107    mActive          = element->getProperty<bool>("active");
00108    mStereoRequested = element->getProperty<bool>("stereo");
00109 
00110    // -- Check for error in configuration -- //
00111    // NOTE: If there are errors, set them to some default value
00112    if(sizeX <= 0)
00113    {
00114       vprDEBUG(vrjDBG_DISP_MGR, vprDBG_WARNING_LVL)
00115          << "WARNING: window sizeX set to: " << sizeX
00116          << ".  Setting to 10." << std::endl << vprDEBUG_FLUSH;
00117       sizeX = 10;
00118    }
00119 
00120    if(sizeY <= 0)
00121    {
00122       vprDEBUG(vrjDBG_DISP_MGR, vprDBG_WARNING_LVL)
00123          << "WARNING: window sizeY set to: " << sizeY
00124          << ".  Setting to 10." << std::endl << vprDEBUG_FLUSH;
00125       sizeY = 10;
00126    }
00127 
00128    if(pipe < 0)
00129    {
00130       vprDEBUG(vrjDBG_DISP_MGR, vprDBG_WARNING_LVL)
00131          << "WARNING: pipe was negative, pipe set to: " << pipe
00132          << ".  Setting to 0.\n" << vprDEBUG_FLUSH;
00133       pipe = 0;
00134    }
00135 
00136       // -- Set local window attributes --- //
00137     setOriginAndSize(originX, originY, sizeX, sizeY);
00138 
00139     setName(name);
00140     setPipe(pipe);
00141 
00142     mDisplayElement = element;        // Save the element for later use
00143 }
00144 
00145 void Display::configViewports(jccl::ConfigElementPtr element)
00146 {
00147    vprASSERT(element.get() != NULL);
00148 
00149    unsigned num_sim_vps = element->getNum("simulator_viewports");
00150    unsigned num_surface_vps = element->getNum("surface_viewports");
00151 
00152    jccl::ConfigElementPtr vp_elt;
00153    SimViewport* sim_vp = NULL;
00154    SurfaceViewport* surf_vp = NULL;
00155 
00156    unsigned i(0);
00157 
00158    // Create sim viewports
00159    // - Set the parent display
00160    // - Configure it
00161    for(i=0;i<num_sim_vps;i++)
00162    {
00163       vp_elt = element->getProperty<jccl::ConfigElementPtr>("simulator_viewports",i);
00164       sim_vp = new SimViewport;
00165       sim_vp->setDisplay(this);
00166       if ( sim_vp->config(vp_elt) )
00167       {
00168          mViewports.push_back(sim_vp);
00169       }
00170       else
00171       {
00172          vprDEBUG(vrjDBG_DISP_MGR, vprDBG_CRITICAL_LVL)
00173             << clrOutBOLD(clrRED, "ERROR")
00174             << ": Failed to configure simulator viewport named\n"
00175             << vprDEBUG_FLUSH;
00176          vprDEBUG_NEXT(vrjDBG_DISP_MGR, vprDBG_CRITICAL_LVL)
00177             << "       '" << vp_elt->getName() << "'\n" << vprDEBUG_FLUSH;
00178          delete sim_vp;
00179       }
00180    }
00181 
00182    // Create surface viewports
00183    // - Set the parent display
00184    // - Configure it
00185    for(i=0;i<num_surface_vps;i++)
00186    {
00187       vp_elt = element->getProperty<jccl::ConfigElementPtr>("surface_viewports",i);
00188       surf_vp = new SurfaceViewport;
00189       surf_vp->setDisplay(this);
00190 
00191       if ( surf_vp->config(vp_elt) )
00192       {
00193          mViewports.push_back(surf_vp);
00194       }
00195       else
00196       {
00197          vprDEBUG(vrjDBG_DISP_MGR, vprDBG_CRITICAL_LVL)
00198             << clrOutBOLD(clrRED, "ERROR")
00199             << ": Failed to configure surface viewport named\n"
00200             << vprDEBUG_FLUSH;
00201          vprDEBUG_NEXT(vrjDBG_DISP_MGR, vprDBG_CRITICAL_LVL)
00202             << "       '" << vp_elt->getName() << "'\n" << vprDEBUG_FLUSH;
00203          delete surf_vp;
00204       }
00205    }
00206 }
00207 
00208 jccl::ConfigElementPtr Display::getGlFrameBufferConfig() const
00209 {
00210    jccl::ConfigElementPtr element;
00211 
00212    // XXX: Refactor this to allow different frame buffer child elements.  Right
00213    // now, this assumes that the child element type is OpenGLFBConfig.
00214    if ( mDisplayElement->getNum("frame_buffer_config") == 1 )
00215    {
00216       element =
00217          mDisplayElement->getProperty<jccl::ConfigElementPtr>("frame_buffer_config");
00218    }
00219 
00220    return element;
00221 }
00222 
00223 std::ostream& operator<<(std::ostream& out, Display& disp)
00224 {
00225    out.setf(std::ios::left);
00226 
00227    char fill_char(out.fill());
00228    out.fill('.');
00229 
00230    const unsigned int indent_level(2);
00231    const std::string indent_text(indent_level, ' ');
00232    const int pad_width_dot(20 - indent_level);
00233 
00234    out << indent_text << std::setw(pad_width_dot)
00235        << "Name " << " " << disp.mName.c_str() << std::endl;
00236    out << indent_text << std::setw(pad_width_dot)
00237        << "Origin " << " " << disp.mOriginX << ", " << disp.mOriginY
00238        << std::endl;
00239    out << indent_text << std::setw(pad_width_dot)
00240        << "Size " << " " << disp.mWidth << "x" << disp.mHeight << std::endl;
00241    out << indent_text << std::setw(pad_width_dot)
00242        << "Pipe number " << " " << disp.mPipe << std::endl;
00243    out << indent_text << std::setw(pad_width_dot)
00244        << "Stereo requested " << " " << (disp.mStereoRequested ? "Yes" : "No")
00245        << std::endl;
00246    out << indent_text << std::setw(pad_width_dot)
00247        << "Active " << " " << (disp.mActive ? "Yes" : "No") << std::endl;
00248 
00249    for(unsigned i=0;i<disp.mViewports.size();i++)
00250    {
00251       out << indent_text << "Viewport " << i << ":\n";
00252       disp.mViewports[i]->outStream(out, 4);
00253    }
00254 
00255    // Restore the previous state.
00256    out.fill(fill_char);
00257 
00258    return out;
00259 }
00260 
00261 }

Generated on Thu Jan 4 10:56:51 2007 for VR Juggler by  doxygen 1.5.1