00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef VRS_GLCANVAS_H
00021 #define VRS_GLCANVAS_H
00022
00023 #include <vrs/sg/canvas.h>
00024 #include <vrs/opengl/openglconfig.h>
00025
00026 namespace VRS {
00027
00028 class AttributeComposite;
00029 class FrameBufferObjectGL;
00030 class Image;
00031
00033 class VRS_CORE_API GLCanvas : public Canvas {
00034 public:
00035
00036 enum CanvasProperties {
00037 RGB_BUFFER = 1<<0,
00038 ALPHA_BUFFER = 1<<1,
00039 DEPTH_BUFFER = 1<<2,
00040 DOUBLE_BUFFER = 1<<3,
00041 STENCIL_BUFFER = 1<<4,
00042 ACCUM_BUFFER = 1<<5,
00043 STEREO_VIEWING = 1<<6,
00044 MULTISAMPLING = 1<<7,
00045 UBYTE_BUFFER = 0x0000,
00046 FLOAT_BUFFER = 0x0300,
00047 FLOAT16_BUFFER = 0x0100,
00048 FLOAT32_BUFFER = 0x0200,
00049
00050 RGBA_BUFFER = RGB_BUFFER | ALPHA_BUFFER,
00051
00052
00053 RGBD = RGB_BUFFER | DEPTH_BUFFER,
00054 RGBDS = RGB_BUFFER | DEPTH_BUFFER | STENCIL_BUFFER,
00055 RGBDD = RGB_BUFFER | DEPTH_BUFFER | DOUBLE_BUFFER,
00056 RGBDDS = RGB_BUFFER | DEPTH_BUFFER | DOUBLE_BUFFER | STENCIL_BUFFER,
00057 RGBA = RGB_BUFFER | ALPHA_BUFFER,
00058 RGBAD = RGB_BUFFER | ALPHA_BUFFER | DEPTH_BUFFER,
00059 RGBADS = RGB_BUFFER | ALPHA_BUFFER | DEPTH_BUFFER | STENCIL_BUFFER,
00060 RGBADD = RGB_BUFFER | ALPHA_BUFFER | DEPTH_BUFFER | DOUBLE_BUFFER,
00061 RGBADDS = RGB_BUFFER | ALPHA_BUFFER | DEPTH_BUFFER | DOUBLE_BUFFER | STENCIL_BUFFER
00062 };
00063 VRS_SERIALIZABLE_CLASS_ENUM(CanvasProperties);
00064
00065
00066
00067 enum BufferSelection {
00068 CURRENT_BUFFER = 0, FRONT_BUFFER, BACK_BUFFER, LEFT_BUFFER, RIGHT_BUFFER, FRONT_LEFT_BUFFER, FRONT_RIGHT_BUFFER, BACK_LEFT_BUFFER, BACK_RIGHT_BUFFER,
00069 AUX_BUFFER_0 = 20, AUX_BUFFER_1, AUX_BUFFER_2, AUX_BUFFER_3, AUX_BUFFER_4, AUX_BUFFER_5, AUX_BUFFER_6, AUX_BUFFER_7,
00070 COLOR_ATTACHMENT_BUFFER_0 = 80, COLOR_ATTACHMENT_BUFFER_1, COLOR_ATTACHMENT_BUFFER_2, COLOR_ATTACHMENT_BUFFER_3, COLOR_ATTACHMENT_BUFFER_4, COLOR_ATTACHMENT_BUFFER_5, COLOR_ATTACHMENT_BUFFER_6, COLOR_ATTACHMENT_BUFFER_7
00071 };
00072 VRS_SERIALIZABLE_CLASS_ENUM(BufferSelection);
00073
00074 virtual SO<Image> snapshot(
00075 CanvasProperties buffer = GLCanvas::RGB_BUFFER,
00076 BufferSelection readBuffer = GLCanvas::CURRENT_BUFFER,
00077 const Area& subRegion = Area()
00078 );
00079 virtual void snapshot(
00080 SO<Image> destination,
00081 CanvasProperties buffer = GLCanvas::RGB_BUFFER,
00082 BufferSelection readBuffer = GLCanvas::CURRENT_BUFFER,
00083 const Area& subRegion = Area()
00084 );
00085 virtual bool largeScaleSnapshot(
00086 SO<Image> destination,
00087 CanvasProperties buffer = GLCanvas::RGB_BUFFER,
00088 SO<FrameBufferObjectGL> fbo = NULL
00089 );
00115 virtual void create();
00126 virtual void destroy();
00130 virtual int getProperties() const = 0;
00133 virtual bool hasProperty(CanvasProperties prop) const;
00136 virtual Engine* engine() const;
00138 virtual TechniqueProcessor* processor() const;
00140 virtual void createEngine();
00143 virtual void createProcessor();
00147 virtual AttributeComposite* standardGLSettings() const;
00152 enum InfoAspects {
00153 GLVERSION = 1<<0,
00154 GLUVERSION = 1<<1,
00155 BUFFERS = 1<<2,
00156 BUFFERBITS = 1<<3,
00157 STACKDEPTHS = 1<<4,
00158 POINTLINEINFO = 1<<5,
00159 MISCINFO = 1<<6,
00160 ALL = GLVERSION | GLUVERSION | BUFFERS | BUFFERBITS | STACKDEPTHS | POINTLINEINFO | MISCINFO
00161 };
00162 VRS_SERIALIZABLE_CLASS_ENUM(InfoAspects);
00163
00164 std::string glInfo(int infoAspects = GLCanvas::ALL);
00168 bool hasExtension(const ID& extensionID) const;
00170
00171 bool isVersion(int major, int minor) const;
00173
00174 void allowSoftwareEmulation(bool onOff);
00176
00177 void setSharedContextWith(GLCanvas* canvas);
00179 GLCanvas* getSharedContextWith() const;
00181
00182 virtual bool prepareRedisplay();
00184
00186 virtual void finishRedisplay();
00188
00191 VRS_TYPEINFO(GLCanvas, Canvas);
00192
00193 protected:
00194 GLCanvas();
00195
00196 virtual void shareContext();
00198
00208 SO<Engine> engine_;
00209 SO<TechniqueProcessor> processor_;
00210
00211 private:
00212 bool allowSWEmu_;
00213 SO<GLCanvas> shareContextWith_;
00214 };
00215
00216 inline Engine* GLCanvas::engine() const {
00217 return engine_;
00218 }
00219
00220 inline TechniqueProcessor* GLCanvas::processor() const {
00221 return processor_;
00222 }
00223
00224 }
00225
00226 #endif // VRS_GLCANVAS_H