00001 /** 00002 \file Robots/LoBot/ui/LoRenderBuffer.H 00003 \brief An OpenGL framebuffer object. 00004 00005 This file defines a class that uses parts of OpenGL's framebuffer 00006 object API to implement an off-screen rendering buffer for the 00007 Robolocust UI. All rendering takes place in this off-screen buffer and 00008 is then transferred to the screen. This architecture allows us to 00009 easily implement screen captures for later encoding as an MPEG so that 00010 users can obtain a record of a particular run/experiment of the robot. 00011 */ 00012 00013 // //////////////////////////////////////////////////////////////////// // 00014 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2000-2005 // 00015 // by the University of Southern California (USC) and the iLab at USC. // 00016 // See http://iLab.usc.edu for information about this project. // 00017 // //////////////////////////////////////////////////////////////////// // 00018 // Major portions of the iLab Neuromorphic Vision Toolkit are protected // 00019 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency // 00020 // in Visual Environments, and Applications'' by Christof Koch and // 00021 // Laurent Itti, California Institute of Technology, 2001 (patent // 00022 // pending; application number 09/912,225 filed July 23, 2001; see // 00023 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status). // 00024 // //////////////////////////////////////////////////////////////////// // 00025 // This file is part of the iLab Neuromorphic Vision C++ Toolkit. // 00026 // // 00027 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can // 00028 // redistribute it and/or modify it under the terms of the GNU General // 00029 // Public License as published by the Free Software Foundation; either // 00030 // version 2 of the License, or (at your option) any later version. // 00031 // // 00032 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope // 00033 // that it will be useful, but WITHOUT ANY WARRANTY; without even the // 00034 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // 00035 // PURPOSE. See the GNU General Public License for more details. // 00036 // // 00037 // You should have received a copy of the GNU General Public License // 00038 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write // 00039 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, // 00040 // Boston, MA 02111-1307 USA. // 00041 // //////////////////////////////////////////////////////////////////// // 00042 // 00043 // Primary maintainer for this file: mviswana usc edu 00044 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/Robots/LoBot/ui/LoRenderBuffer.H $ 00045 // $Id: LoRenderBuffer.H 13838 2010-08-27 20:42:20Z mviswana $ 00046 // 00047 00048 #ifndef LOBOT_RENDER_BUFFER_DOT_H 00049 #define LOBOT_RENDER_BUFFER_DOT_H 00050 00051 //----------------------------- NAMESPACE ------------------------------- 00052 00053 namespace lobot { 00054 00055 //------------------------- CLASS DEFINITION ---------------------------- 00056 00057 /** 00058 \class lobot::RenderBuffer 00059 \brief An encapsulation of an OpenGL framebuffer object. 00060 00061 This class implements an off-screen rendering buffer using OpenGL's 00062 FBO API. Instead of rendering directly to the OpenGL (on-screen) back 00063 buffer, the Robolocust main window first renders to this off-screen 00064 buffer and then copies the contents of the off-screen render buffer to 00065 the on-screen back buffer. 00066 00067 If available, this class will use the OpenGL blitting API to copy the 00068 off-screen buffer to the on-screen buffer so that this operation takes 00069 place within the GL driver via DMA. However, if blitting is not 00070 supported, then it will fall back to reading the pixels from the 00071 off-screen buffer into main memory and then drawing them to the back 00072 buffer. 00073 00074 Furthermore, this class takes care of the details of dealing with the 00075 OpenGL FBO API regardless of whether it is part of the GL core is 00076 available as an extension. 00077 00078 This somewhat indirect and convoluted architecture allows us to easily 00079 implement screen captures. 00080 */ 00081 class RenderBuffer { 00082 /// When rendering to an off-screen buffer, we need to know the size 00083 /// of the drawing area (just as we would for an on-screen buffer). 00084 const int m_width, m_height ; 00085 00086 /// We cache the contents of the off-screen buffer so as to avoid 00087 /// copying more than absolutely required. 00088 //@{ 00089 const int m_size ; 00090 unsigned char* m_cache ; 00091 //@} 00092 00093 /// A flag to indicate whether the internal cache of the off-screen 00094 /// buffer's contents maintained by this object is in a state that can 00095 /// be retrieved by clients or not. 00096 mutable bool m_dirty ; 00097 00098 /// The off-screen buffer is identified by the following IDs supplied 00099 /// by OpenGL. 00100 /// 00101 /// DEVNOTE: fbo = framebuffer object 00102 /// rbo = renderbuffer object 00103 unsigned int m_fbo, m_rbo ; 00104 00105 public: 00106 /// Initialization: when clients create an off-screen render buffer, 00107 /// they should specify its dimensions. Usually, these dimensions 00108 /// would equal those of the UI window. 00109 RenderBuffer(int width, int height) ; 00110 00111 /// Setup off-screen rendering: before performing regular rendering, 00112 /// clients should call this method so that rendering can be 00113 /// redirected to the off-screen buffer. 00114 void setup() ; 00115 00116 /// Retrieve the off-screen buffer's pixels: clients can use this 00117 /// method after rendering is done to get the results of the rendering 00118 /// process that ended up in the off-screen buffer. 00119 /// 00120 /// This function returns a pointer to the internal pixel data buffer. 00121 /// Clients should not store this pointer for later use, delete it, or 00122 /// write to the buffer it points to. Instead, they should only copy 00123 /// the contents of the data buffer returned by this function. 00124 /// 00125 /// The size of the buffer will be W*H*4, where W and H are the width 00126 /// and height respectively of the off-screen buffer. These two 00127 /// parameters would have been specified by the client during 00128 /// instantiation of the lobot::RenderBuffer object. 00129 /// 00130 /// The off-screen buffer's pixels are stored in the GL_BGRA format. 00131 /// The pixel data type is GL_UNSIGNED_BYTE. 00132 /// 00133 /// NOTE: If the OpenGL driver is missing support for framebuffer 00134 /// objects, the pixel data returned by this function could be 00135 /// corrupt, i.e., contain random garbage. This would usually occur 00136 /// when the Robolocust window is wholly or partially obscured by 00137 /// another window. 00138 const unsigned char* pixels() const ; 00139 00140 /// Helper function to return the size (in bytes) of the off-screen 00141 /// buffer's pixel data array. 00142 int size() const {return m_size ;} 00143 00144 /// Helper functions to return the dimensions of the off-screen 00145 /// buffer. 00146 /// 00147 /// NOTE: In general, a client should not really need to use these 00148 /// functions because they ought to already know this information and 00149 /// would have passed the width and height to the lobot::RenderBuffer 00150 /// constructor. 00151 //@{ 00152 int width() const {return m_width ;} 00153 int height() const {return m_height ;} 00154 //@} 00155 00156 /// Copy contents of off-screen buffer to on-screen buffer. 00157 void to_screen() ; 00158 00159 private: 00160 /// Helper function to release OpenGL resources. 00161 void clean_up() ; 00162 00163 public: 00164 /// Clean-up. 00165 ~RenderBuffer() ; 00166 } ; 00167 00168 //----------------------------------------------------------------------- 00169 00170 } // end of namespace encapsulating this file's definitions 00171 00172 #endif 00173 00174 /* So things look consistent in everyone's emacs... */ 00175 /* Local Variables: */ 00176 /* indent-tabs-mode: nil */ 00177 /* End: */