00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
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
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
00111
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
00137 setOriginAndSize(originX, originY, sizeX, sizeY);
00138
00139 setName(name);
00140 setPipe(pipe);
00141
00142 mDisplayElement = element;
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
00159
00160
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
00183
00184
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
00213
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
00256 out.fill(fill_char);
00257
00258 return out;
00259 }
00260
00261 }