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
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include <stdlib.h>
00044 #include <stdio.h>
00045
00046 #include <OSGConfig.h>
00047 #include <OSGTextureChunk.h>
00048 #include <OSGImage.h>
00049 #include <OSGMatrixCameraDecorator.h>
00050 #include <OSGTileCameraDecorator.h>
00051 #include <OSGRenderAction.h>
00052 #include <OSGSimpleAttachments.h>
00053
00054 #include "OSGFBOViewport.h"
00055
00056
00057
00058 #ifndef GL_ARB_draw_buffers
00059 #define GL_ARB_draw_buffers 1
00060 #endif
00061
00062 #ifndef GL_EXT_framebuffer_object
00063 #define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506
00064 #define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8
00065 #define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6
00066 #define GL_RENDERBUFFER_BINDING_EXT 0x8CA7
00067 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0
00068 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1
00069 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2
00070 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3
00071 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4
00072 #define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5
00073 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6
00074 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7
00075 #define GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT 0x8CD8
00076 #define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9
00077 #define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA
00078 #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB
00079 #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC
00080 #define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD
00081 #define GL_FRAMEBUFFER_STATUS_ERROR_EXT 0x8CDE
00082 #define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF
00083 #define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
00084 #define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
00085 #define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
00086 #define GL_COLOR_ATTACHMENT3_EXT 0x8CE3
00087 #define GL_COLOR_ATTACHMENT4_EXT 0x8CE4
00088 #define GL_COLOR_ATTACHMENT5_EXT 0x8CE5
00089 #define GL_COLOR_ATTACHMENT6_EXT 0x8CE6
00090 #define GL_COLOR_ATTACHMENT7_EXT 0x8CE7
00091 #define GL_COLOR_ATTACHMENT8_EXT 0x8CE8
00092 #define GL_COLOR_ATTACHMENT9_EXT 0x8CE9
00093 #define GL_COLOR_ATTACHMENT10_EXT 0x8CEA
00094 #define GL_COLOR_ATTACHMENT11_EXT 0x8CEB
00095 #define GL_COLOR_ATTACHMENT12_EXT 0x8CEC
00096 #define GL_COLOR_ATTACHMENT13_EXT 0x8CED
00097 #define GL_COLOR_ATTACHMENT14_EXT 0x8CEE
00098 #define GL_COLOR_ATTACHMENT15_EXT 0x8CEF
00099 #define GL_DEPTH_ATTACHMENT_EXT 0x8D00
00100 #define GL_STENCIL_ATTACHMENT_EXT 0x8D20
00101 #define GL_FRAMEBUFFER_EXT 0x8D40
00102 #define GL_RENDERBUFFER_EXT 0x8D41
00103 #define GL_RENDERBUFFER_WIDTH_EXT 0x8D42
00104 #define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43
00105 #define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44
00106 #define GL_STENCIL_INDEX_EXT 0x8D45
00107 #define GL_STENCIL_INDEX1_EXT 0x8D46
00108 #define GL_STENCIL_INDEX4_EXT 0x8D47
00109 #define GL_STENCIL_INDEX8_EXT 0x8D48
00110 #define GL_STENCIL_INDEX16_EXT 0x8D49
00111 #endif
00112
00113 #ifndef GL_TEXTURE_RECTANGLE_ARB
00114 #define GL_TEXTURE_RECTANGLE_ARB 0x84F5
00115 #endif
00116
00117 #ifndef GL_DEPTH_COMPONENT_ARB
00118 #define GL_DEPTH_COMPONENT_ARB 0x1902
00119 #endif
00120
00121 #ifndef GL_ARB_depth_texture
00122 #define GL_DEPTH_COMPONENT16_ARB 0x81A5
00123 #define GL_DEPTH_COMPONENT24_ARB 0x81A6
00124 #define GL_DEPTH_COMPONENT32_ARB 0x81A7
00125 #define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A
00126 #define GL_DEPTH_TEXTURE_MODE_ARB 0x884B
00127 #endif
00128
00129 #ifndef GL_ARB_shadow
00130 #define GL_TEXTURE_COMPARE_MODE_ARB 0x884C
00131 #define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D
00132 #define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E
00133 #endif
00134
00135 #ifndef GL_EXT_depth_stencil
00136 #define GL_DEPTH_STENCIL_EXT 0x84F9
00137 #define GL_UNSIGNED_INT_24_8_EXT 0x84FA
00138 #define GL_DEPTH24_STENCIL8_EXT 0x88F0
00139 #define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1
00140 #endif
00141
00142
00143 #include <OSGShadowViewport.h>
00144 #include <OSGForeground.h>
00145 #include <OSGTextureGrabForeground.h>
00146
00147
00148 OSG_USING_NAMESPACE
00149
00150
00151
00152
00153
00158
00159
00160
00161
00162 UInt32 FBOViewport::_framebuffer_object_extension;
00163 UInt32 FBOViewport::_draw_buffers_extension;
00164
00165 UInt32 FBOViewport::_funcDrawBuffers = Window::invalidFunctionID;
00166
00167 UInt32 FBOViewport::_funcBindFramebuffer = Window::invalidFunctionID;
00168 UInt32 FBOViewport::_funcBindRenderbuffer = Window::invalidFunctionID;
00169 UInt32 FBOViewport::_funcCheckFramebufferStatus = Window::invalidFunctionID;
00170 UInt32 FBOViewport::_funcDeleteFramebuffers = Window::invalidFunctionID;
00171 UInt32 FBOViewport::_funcDeleteRenderbuffers = Window::invalidFunctionID;
00172 UInt32 FBOViewport::_funcFramebufferRenderbuffer = Window::invalidFunctionID;
00173 UInt32 FBOViewport::_funcFramebufferTexture1D = Window::invalidFunctionID;
00174 UInt32 FBOViewport::_funcFramebufferTexture2D = Window::invalidFunctionID;
00175 UInt32 FBOViewport::_funcFramebufferTexture3D = Window::invalidFunctionID;
00176 UInt32 FBOViewport::_funcGenFramebuffers = Window::invalidFunctionID;
00177 UInt32 FBOViewport::_funcGenRenderbuffers = Window::invalidFunctionID;
00178 UInt32 FBOViewport::_funcGenerateMipmap = Window::invalidFunctionID;
00179 UInt32 FBOViewport::_funcGetFramebufferAttachmentParameteriv = Window::invalidFunctionID;
00180 UInt32 FBOViewport::_funcGetRenderbufferParameteriv = Window::invalidFunctionID;
00181 UInt32 FBOViewport::_funcIsFramebuffer = Window::invalidFunctionID;
00182 UInt32 FBOViewport::_funcIsRenderbuffer = Window::invalidFunctionID;
00183 UInt32 FBOViewport::_funcRenderbufferStorage = Window::invalidFunctionID;
00184
00185 FBOViewport::renderparamscbfp FBOViewport::_renderParamsFP = NULL;
00186
00187 typedef void (OSG_APIENTRY * PFNGLDRAWBUFFERSARBPROC)
00188 (GLsizei n, const GLenum* bufs);
00189
00190 typedef void (OSG_APIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC)
00191 (GLenum target, GLuint framebuffer);
00192 typedef void (OSG_APIENTRY * PFNGLBINDRENDERBUFFEREXTPROC)
00193 (GLenum target, GLuint renderbuffer);
00194 typedef GLenum (OSG_APIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)
00195 (GLenum target);
00196 typedef void (OSG_APIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC)
00197 (GLsizei n, const GLuint* framebuffers);
00198 typedef void (OSG_APIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC)
00199 (GLsizei n, const GLuint* renderbuffers);
00200 typedef void (OSG_APIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)
00201 (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
00202 typedef void (OSG_APIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)
00203 (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
00204 typedef void (OSG_APIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)
00205 (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
00206 typedef void (OSG_APIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)
00207 (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
00208 typedef void (OSG_APIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC)
00209 (GLsizei n, GLuint* framebuffers);
00210 typedef void (OSG_APIENTRY * PFNGLGENRENDERBUFFERSEXTPROC)
00211 (GLsizei n, GLuint* renderbuffers);
00212 typedef void (OSG_APIENTRY * PFNGLGENERATEMIPMAPEXTPROC)
00213 (GLenum target);
00214 typedef void (OSG_APIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)
00215 (GLenum target, GLenum attachment, GLenum pname, GLint* params);
00216 typedef void (OSG_APIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)
00217 (GLenum target, GLenum pname, GLint* params);
00218 typedef GLboolean (OSG_APIENTRY * PFNGLISFRAMEBUFFEREXTPROC)
00219 (GLuint framebuffer);
00220 typedef GLboolean (OSG_APIENTRY * PFNGLISRENDERBUFFEREXTPROC)
00221 (GLuint renderbuffer);
00222 typedef void (OSG_APIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC)
00223 (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
00224
00225
00226 namespace
00227 {
00228 bool checkGLError(const char* where)
00229 {
00230 GLenum errCode = 0;
00231 if ((errCode = glGetError()) != GL_NO_ERROR)
00232 {
00233 const GLubyte *errString = gluErrorString(errCode);
00234 FWARNING(("%s OpenGL Error: %s!\n", where, errString));
00235 }
00236
00237 return errCode == GL_NO_ERROR;
00238 }
00239 }
00240
00241
00242
00243
00244
00245 void FBOViewport::initMethod (void)
00246 {
00247 }
00248
00249 void FBOViewport::setRenderParamsCB(renderparamscbfp fp)
00250 {
00251 _renderParamsFP = fp;
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264 FBOViewport::FBOViewport(void) :
00265 Inherited()
00266 {
00267 }
00268
00269 FBOViewport::FBOViewport(const FBOViewport &source) :
00270 Inherited(source)
00271 {
00272 _framebuffer_object_extension = Window::registerExtension("GL_EXT_framebuffer_object");
00273
00274 _draw_buffers_extension = Window::registerExtension("GL_ARB_draw_buffers");
00275
00276 _funcDrawBuffers =
00277 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glDrawBuffers",
00278 GL_ARB_draw_buffers);
00279
00280 _funcBindFramebuffer =
00281 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glBindFramebufferEXT",
00282 _framebuffer_object_extension);
00283 _funcBindRenderbuffer =
00284 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glBindRenderbufferEXT",
00285 _framebuffer_object_extension);
00286 _funcCheckFramebufferStatus =
00287 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glCheckFramebufferStatusEXT",
00288 _framebuffer_object_extension);
00289 _funcDeleteFramebuffers =
00290 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glDeleteFramebuffersEXT",
00291 _framebuffer_object_extension);
00292 _funcDeleteRenderbuffers =
00293 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glDeleteRenderbuffersEXT",
00294 _framebuffer_object_extension);
00295 _funcFramebufferRenderbuffer =
00296 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glFramebufferRenderbufferEXT",
00297 _framebuffer_object_extension);
00298 _funcFramebufferTexture1D =
00299 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glFramebufferTexture1DEXT",
00300 _framebuffer_object_extension);
00301 _funcFramebufferTexture2D =
00302 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glFramebufferTexture2DEXT",
00303 _framebuffer_object_extension);
00304 _funcFramebufferTexture3D =
00305 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glFramebufferTexture3DEXT",
00306 _framebuffer_object_extension);
00307 _funcGenFramebuffers =
00308 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glGenFramebuffersEXT",
00309 _framebuffer_object_extension);
00310 _funcGenRenderbuffers =
00311 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glGenRenderbuffersEXT",
00312 _framebuffer_object_extension);
00313 _funcGenerateMipmap =
00314 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glGenerateMipmapEXT",
00315 _framebuffer_object_extension);
00316 _funcGetFramebufferAttachmentParameteriv =
00317 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glGetFramebufferAttachmentParameterivEXT",
00318 _framebuffer_object_extension);
00319 _funcGetRenderbufferParameteriv =
00320 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glGetRenderbufferParameterivEXT",
00321 _framebuffer_object_extension);
00322 _funcIsFramebuffer =
00323 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glIsFramebufferEXT",
00324 _framebuffer_object_extension);
00325 _funcIsRenderbuffer =
00326 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glIsRenderbufferEXT",
00327 _framebuffer_object_extension);
00328 _funcRenderbufferStorage =
00329 Window::registerFunction (OSG_DLSYM_UNDERSCORE"glRenderbufferStorageEXT",
00330 _framebuffer_object_extension);
00331 }
00332
00333 FBOViewport::~FBOViewport(void)
00334 {
00335 }
00336
00337
00338
00339 void FBOViewport::changed(BitVector whichField, UInt32 origin)
00340 {
00341 Inherited::changed(whichField, origin);
00342 }
00343
00344 void FBOViewport::dump( UInt32 ,
00345 const BitVector ) const
00346 {
00347 SLOG << "Dump FBOViewport NI" << std::endl;
00348 }
00349
00350 void FBOViewport::onCreate(const FBOViewport *source)
00351 {
00352
00353 if (OSG::GlobalSystemState == OSG::Startup)
00354 return;
00355
00356
00357 }
00358
00359 void FBOViewport::onDestroy(void)
00360 {
00361
00362 }
00363
00364 bool FBOViewport::initialize(Window *win, Int32 format)
00365 {
00366 GLuint fbIndex, dbIndex, sbIndex;
00367
00368 Int32 width = getStorageWidth();
00369 Int32 height = getStorageHeight();
00370
00371 if (width <= 0 || height <= 0)
00372 return false;
00373
00374 checkGLError("FBO initalize pre");
00375
00376 if (getFrameBufferIndex() && !getDirty())
00377 return true;
00378
00379 FBOViewportPtr thisP(*this);
00380
00381 beginEditCP(thisP);
00382
00383 setDirty(false);
00384
00385 PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT =
00386 (PFNGLBINDFRAMEBUFFEREXTPROC)win->getFunction(_funcBindFramebuffer);
00387 PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT =
00388 (PFNGLBINDRENDERBUFFEREXTPROC)win->getFunction(_funcBindRenderbuffer);
00389 PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT =
00390 (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)win->getFunction(_funcCheckFramebufferStatus);
00391 PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT =
00392 (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)win->getFunction(_funcFramebufferRenderbuffer);
00393 PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT =
00394 (PFNGLGENFRAMEBUFFERSEXTPROC)win->getFunction(_funcGenFramebuffers);
00395 PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT =
00396 (PFNGLGENRENDERBUFFERSEXTPROC)win->getFunction(_funcGenRenderbuffers);
00397 PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT =
00398 (PFNGLRENDERBUFFERSTORAGEEXTPROC)win->getFunction(_funcRenderbufferStorage);
00399
00400 glGenFramebuffersEXT(1, &fbIndex);
00401 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbIndex);
00402 setFrameBufferIndex(fbIndex);
00403
00404 glDrawBuffer (GL_FALSE);
00405 glReadBuffer (GL_FALSE);
00406
00407 GLuint depth = (format & FBO_DEPTH_16) ? GL_DEPTH_COMPONENT16_ARB :
00408 (format & FBO_DEPTH_24) ? GL_DEPTH_COMPONENT24_ARB :
00409 (format & FBO_DEPTH_32) ? GL_DEPTH_COMPONENT32_ARB : 0;
00410
00411 GLuint stencil = (format & FBO_STENCIL_1 ) ? GL_STENCIL_INDEX1_EXT :
00412 (format & FBO_STENCIL_4 ) ? GL_STENCIL_INDEX4_EXT :
00413 (format & FBO_STENCIL_8 ) ? GL_STENCIL_INDEX8_EXT :
00414 (format & FBO_STENCIL_16) ? GL_STENCIL_INDEX16_EXT : 0;
00415
00416 checkGLError("FBO initalize pre depth");
00417
00418 if (depth)
00419 {
00420 glGenRenderbuffersEXT(1, &dbIndex);
00421 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, dbIndex);
00422 setDepthBufferIndex(dbIndex);
00423
00424 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, depth, width, height);
00425 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
00426 GL_RENDERBUFFER_EXT, dbIndex);
00427 }
00428
00429 checkGLError("FBO initalize pre stencil");
00430
00431 if (stencil)
00432 {
00433 glGenRenderbuffersEXT(1, &sbIndex);
00434 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, sbIndex);
00435 setStencilBufferIndex(sbIndex);
00436
00437 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, stencil, width, height);
00438 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
00439 GL_RENDERBUFFER_EXT, sbIndex);
00440 }
00441
00442 checkGLError("FBO initalize post stencil");
00443
00444 endEditCP(thisP);
00445
00446 bool result = true;
00447
00448 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
00449 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
00450
00451 checkGLError("FBO initalize post");
00452
00453 return result;
00454 }
00455
00456 void FBOViewport::setTarget(Window *win, UInt32 id, GLenum attachment, GLenum target)
00457 {
00458 PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT =
00459 (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)win->getFunction(_funcFramebufferTexture1D);
00460 PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT =
00461 (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)win->getFunction(_funcFramebufferTexture2D);
00462 PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT =
00463 (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)win->getFunction(_funcFramebufferTexture3D);
00464
00465 if (getFrameBufferIndex())
00466 {
00467 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, attachment, target, id, 0);
00468
00469 if (!checkGLError("setTarget post"))
00470 {
00471 SWARNING << "Error with attachment: " << attachment
00472 << ", id: " << id << ", target: " << target
00473 << endLog;
00474 }
00475 }
00476 else
00477 FWARNING(("Invalid FrameBufferObject index!\n"));
00478 }
00479
00480 void FBOViewport::bind(Window *win)
00481 {
00482 PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT =
00483 (PFNGLBINDFRAMEBUFFEREXTPROC)win->getFunction(_funcBindFramebuffer);
00484
00485 if (getFrameBufferIndex())
00486 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, getFrameBufferIndex());
00487 else
00488 FWARNING(("Invalid FrameBufferObject index!\n"));
00489 }
00490
00493 void FBOViewport::stop(Window *win)
00494 {
00495 PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT =
00496 (PFNGLBINDFRAMEBUFFEREXTPROC)win->getFunction(_funcBindFramebuffer);
00497
00498 if (getFrameBufferIndex())
00499 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
00500 }
00501
00502 void FBOViewport::render(RenderActionBase* action)
00503 {
00504 if (!getEnabled())
00505 return;
00506
00507 Window *win = action->getWindow();
00508
00509
00510
00511
00512 win->resizeGL();
00513
00514 static GLenum targets[6] = {
00515 GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB,
00516 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB,
00517 GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB,
00518 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB,
00519 GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB,
00520 GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB,
00521 };
00522
00523 static Matrix transforms[6] = {
00524 Matrix( 1, 0, 0, 0,
00525 0,-1, 0, 0,
00526 0, 0,-1, 0,
00527 0, 0, 0, 1 ),
00528
00529 Matrix(-1, 0, 0, 0,
00530 0,-1, 0, 0,
00531 0, 0, 1, 0,
00532 0, 0, 0, 1 ),
00533
00534 Matrix( 1, 0, 0, 0,
00535 0, 0, 1, 0,
00536 0,-1, 0, 0,
00537 0, 0, 0, 1 ),
00538
00539 Matrix( 1, 0, 0, 0,
00540 0, 0,-1, 0,
00541 0, 1, 0, 0,
00542 0, 0, 0, 1 ),
00543
00544 Matrix( 0, 0,-1, 0,
00545 0,-1, 0, 0,
00546 -1, 0, 0, 0,
00547 0, 0, 0, 1 ),
00548
00549 Matrix( 0, 0, 1, 0,
00550 0,-1, 0, 0,
00551 1, 0, 0, 0,
00552 0, 0, 0, 1 ),
00553 };
00554
00555 if (win == NULL)
00556 {
00557 SWARNING << "FBOViewport::render: no window!" << std::endl;
00558 return;
00559 }
00560 if (getCamera() == NullFC)
00561 {
00562 SWARNING << "FBOViewport::render: no camera!" << std::endl;
00563 return;
00564 }
00565 if (getBackground() == NullFC)
00566 {
00567 SWARNING << "FBOViewport::render: no background!" << std::endl;
00568 return;
00569 }
00570 if (getRoot() == NullFC && getRenderNodes().empty())
00571 {
00572 SWARNING << "FBOViewport::render: no root(s)!" << std::endl;
00573 return;
00574 }
00575
00576 GLint maxTexSize = 0;
00577 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize);
00578
00579 beginEditCP(getPtr(), StorageWidthFieldMask | StorageHeightFieldMask);
00580 if (getStorageWidth() > maxTexSize)
00581 setStorageWidth( maxTexSize );
00582 if (getStorageHeight() > maxTexSize)
00583 setStorageHeight( maxTexSize );
00584 endEditCP(getPtr(), StorageWidthFieldMask | StorageHeightFieldMask);
00585
00586
00587 if (_renderParamsFP != NULL)
00588 _renderParamsFP(FBO_RP_EFFECTS);
00589
00590 bool depth = getGenDepthmaps();
00591 RenderAction *rAct = dynamic_cast<RenderAction*>(action);
00592 bool zWriteTransSave = rAct ? rAct->getZWriteTrans() : true;
00593
00594 if (depth)
00595 rAct->setZWriteTrans(true);
00596
00597 if (!getFboOn() || !extensionCheck())
00598 {
00599 UInt32 i, numBuffers = (getTextures().getSize()) ? 1 : 0;
00600
00601 if ( !win->hasExtension("GL_ARB_texture_non_power_of_two") )
00602 {
00603 beginEditCP(getPtr(), StorageWidthFieldMask | StorageHeightFieldMask);
00604
00605 i = 1;
00606 do {
00607 i <<= 1;
00608 } while (getStorageHeight() >= i);
00609 setStorageHeight( i>>1 );
00610
00611 i = 1;
00612 do {
00613 i <<= 1;
00614 } while (getStorageWidth() >= i);
00615 setStorageWidth( i>>1 );
00616
00617 endEditCP(getPtr(), StorageWidthFieldMask | StorageHeightFieldMask);
00618 }
00619
00620 if (numBuffers > 0)
00621 {
00622 Int32 j, sides = getGenCubemaps() ? 6 : 1;
00623
00624
00625 if (getGenDepthmaps() && getGenCubemaps())
00626 sides = 0;
00627
00628 FDEBUG(( "Using standard GL (%d maxTexSize) with %d %sTextures and %d views...\n",
00629 maxTexSize, numBuffers, (depth ? "depth" : ""), sides ));
00630
00631 for (i=0; i<getExcludeNodes().getSize(); i++)
00632 {
00633 NodePtr exnode = getExcludeNodes()[i];
00634 if (exnode != NullFC)
00635 exnode->setActive(false);
00636 }
00637
00638 CameraPtr cP = getCamera();
00639 CameraDecoratorPtr cdP = CameraDecoratorPtr::dcast(cP);
00640
00641
00642 while (cdP != NullFC)
00643 {
00644 cP = cdP->getDecoratee();
00645 cdP = CameraDecoratorPtr::dcast(cP);
00646 }
00647
00648
00649 action->setBackground(getBackground().getCPtr());
00650 action->setViewport(this);
00651 action->setTravMask(getTravMask());
00652
00653 Int32 winWidth = getParent()->getWidth();
00654 Int32 winHeight = getParent()->getHeight();
00655
00656 Int32 imgWidth = getStorageWidth();
00657 Int32 imgHeight = getStorageHeight();
00658
00659 UInt32 x1, x2, y1, y2, tw, th;
00660
00661 ShadowViewportPtr shadowVptPtr = NullFC;
00662 MFForegroundPtr fgndBag;
00663 MFForegroundPtr::iterator fgndIt;
00664 std::vector< Int32 > pos;
00665 Int32 n = 0;
00666 Real32 svpL, svpB, svpR, svpT;
00667
00668
00669 static bool check = false;
00670
00671 if (!sides)
00672 {
00673 if (imgWidth <= 1 || imgHeight <= 1)
00674 {
00675 imgWidth = winWidth;
00676 imgHeight = winHeight;
00677
00678 }
00679
00680
00681 for (j=0; j<win->getPort().size(); j++)
00682 {
00683 shadowVptPtr = ShadowViewportPtr::dcast(win->getPort(j));
00684
00685 if (shadowVptPtr != NullFC)
00686 break;
00687 }
00688
00689 if (shadowVptPtr != NullFC)
00690 {
00691 n = shadowVptPtr->getForegrounds().size();
00692
00693 for (j=n-1; j>=0; j--) {
00694 TextureGrabForegroundPtr grab = TextureGrabForegroundPtr::dcast(
00695 shadowVptPtr->getForegrounds(j));
00696 if (grab == NullFC) {
00697 fgndBag.push_back(shadowVptPtr->getForegrounds(j));
00698 fgndIt = shadowVptPtr->getForegrounds().begin() + j;
00699 shadowVptPtr->getForegrounds().erase(fgndIt);
00700 }
00701 else {
00702 grab->setActive(false);
00703 pos.push_back(j);
00704 }
00705 }
00706
00707 svpL = shadowVptPtr->getLeft();
00708 svpB = shadowVptPtr->getBottom();
00709 svpR = shadowVptPtr->getRight();
00710 svpT = shadowVptPtr->getTop();
00711
00712 beginEditCP(shadowVptPtr, LeftFieldMask | RightFieldMask |
00713 BottomFieldMask | TopFieldMask);
00714 shadowVptPtr->setSize(0, 0, imgWidth-1, imgHeight-1);
00715 endEditCP(shadowVptPtr, LeftFieldMask | RightFieldMask |
00716 BottomFieldMask | TopFieldMask);
00717
00718 beginEditCP(getPtr(), LeftFieldMask | RightFieldMask |
00719 BottomFieldMask | TopFieldMask);
00720 setSize(0, 0, imgWidth-1, imgHeight-1);
00721 endEditCP(getPtr(), LeftFieldMask | RightFieldMask |
00722 BottomFieldMask | TopFieldMask);
00723
00724 ImagePtr i = getTextures(0)->getImage();
00725
00726 if (i->getWidth() != imgWidth || i->getHeight() != imgHeight)
00727 {
00728 beginEditCP(getTextures(0), TextureChunk::ImageFieldMask);
00729 i->set(i->getPixelFormat(), imgWidth, imgHeight);
00730 endEditCP(getTextures(0), TextureChunk::ImageFieldMask);
00731 }
00732 }
00733 }
00734
00735 TileCameraDecoratorPtr tiledeco = TileCameraDecorator::create();
00736
00737 beginEditCP(tiledeco);
00738 tiledeco->setFullSize(imgWidth, imgHeight);
00739 endEditCP(tiledeco);
00740
00741
00742 if (sides == 6)
00743 {
00744 MatrixCameraDecoratorPtr deco = MatrixCameraDecorator::create();
00745
00746 for (j=0; j<sides; j++)
00747 {
00748 beginEditCP(deco);
00749 deco->setDecoratee(cP);
00750 deco->setPreProjection(transforms[j]);
00751 endEditCP(deco);
00752
00753 beginEditCP(tiledeco);
00754 tiledeco->setDecoratee(deco);
00755 endEditCP(tiledeco);
00756
00757 action->setCamera(tiledeco.getCPtr());
00758
00759 for (y1=0; y1 < imgHeight; y1 += winHeight)
00760 {
00761 y2 = osgMin((float)(y1+winHeight-1), (float)(imgHeight-1));
00762 th = y2 - y1 + 1;
00763
00764 for (x1=0; x1 < imgWidth; x1 += winWidth)
00765 {
00766 x2 = osgMin((float)(x1+winWidth-1), (float)(imgWidth-1));
00767 tw = x2 - x1 + 1;
00768
00769
00770 beginEditCP(tiledeco);
00771 tiledeco->setSize( x1/(float)imgWidth, y1/(float)imgHeight,
00772 (x2+1)/(float)imgWidth, (y2+1)/(float)imgHeight);
00773 endEditCP(tiledeco);
00774
00775 beginEditCP(getPtr(), LeftFieldMask | RightFieldMask |
00776 BottomFieldMask | TopFieldMask);
00777 setSize(0, 0, tw-1, th-1);
00778 endEditCP(getPtr(), LeftFieldMask | RightFieldMask |
00779 BottomFieldMask | TopFieldMask);
00780
00781
00782 activate();
00783
00784
00785 if (getRenderNodes().getSize() == 0)
00786 {
00787 action->apply(getRoot());
00788 }
00789 else
00790 {
00791 for (i=0; i<getRenderNodes().getSize(); i++)
00792 {
00793 NodePtr rdnode = getRenderNodes()[i];
00794 if (rdnode != NullFC)
00795 action->apply(rdnode);
00796 }
00797 }
00798
00799 for (UInt16 fi=0; fi<getForegrounds().size(); fi++)
00800 getForegrounds(fi)->draw(action, this);
00801
00802
00803 deactivate();
00804
00805 win->validateGLObject(getTextures(0)->getGLId());
00806
00807 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB,
00808 win->getGLObjectId(getTextures(0)->getGLId()));
00809
00810 glCopyTexSubImage2D(targets[j], 0, x1, y1, 0, 0, tw, th);
00811
00812 if (glGetError() != GL_NO_ERROR)
00813 SWARNING << "Error in Cube-Texture-Creation!" << endLog;
00814
00815 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0);
00816 }
00817 }
00818 }
00819
00820 subRefCP(deco);
00821 }
00822 else if (sides == 1)
00823 {
00824 beginEditCP(tiledeco);
00825 tiledeco->setDecoratee(cP);
00826 endEditCP(tiledeco);
00827
00828 action->setCamera(tiledeco.getCPtr());
00829
00830 for (y1=0; y1 < imgHeight; y1 += winHeight)
00831 {
00832 y2 = osgMin((float)(y1+winHeight-1), (float)(imgHeight-1));
00833 th = y2 - y1 + 1;
00834
00835 for (x1=0; x1 < imgWidth; x1 += winWidth)
00836 {
00837 x2 = osgMin((float)(x1+winWidth-1), (float)(imgWidth-1));
00838 tw = x2 - x1 + 1;
00839
00840
00841 beginEditCP(tiledeco);
00842 tiledeco->setSize( x1/(float)imgWidth, y1/(float)imgHeight,
00843 (x2+1)/(float)imgWidth, (y2+1)/(float)imgHeight);
00844 endEditCP(tiledeco);
00845
00846 beginEditCP(getPtr(), LeftFieldMask | RightFieldMask |
00847 BottomFieldMask | TopFieldMask);
00848 setSize(0, 0, tw-1, th-1);
00849 endEditCP(getPtr(), LeftFieldMask | RightFieldMask |
00850 BottomFieldMask | TopFieldMask);
00851
00852
00853 activate();
00854
00855
00856 if (getRenderNodes().getSize() == 0)
00857 {
00858 action->apply(getRoot());
00859 }
00860 else
00861 {
00862 for (i=0; i<getRenderNodes().getSize(); i++)
00863 {
00864 NodePtr rdnode = getRenderNodes()[i];
00865 if (rdnode != NullFC)
00866 action->apply(rdnode);
00867 }
00868 }
00869
00870 for (UInt16 fi=0; fi<getForegrounds().size(); fi++)
00871 getForegrounds(fi)->draw(action, this);
00872
00873
00874 deactivate();
00875
00876 win->validateGLObject(getTextures(0)->getGLId());
00877
00878 GLenum target = getTextures(0)->getTarget();
00879
00880
00881 if (target == GL_NONE)
00882 target = GL_TEXTURE_2D;
00883
00884 glBindTexture(target,
00885 win->getGLObjectId(getTextures(0)->getGLId()));
00886
00887 glCopyTexSubImage2D(target, 0, x1, y1, 0, 0, tw, th);
00888
00889 if (glGetError() != GL_NO_ERROR)
00890 SWARNING << "Error in Texture-Creation! " << endLog;
00891
00892 glBindTexture(target, 0);
00893 }
00894 }
00895 }
00896 else if (check && shadowVptPtr != NullFC)
00897 {
00898 action->setCamera(getCamera().getCPtr());
00899
00900 shadowVptPtr->render(action);
00901
00902 win->validateGLObject(getTextures(0)->getGLId());
00903
00904 GLenum target = getTextures(0)->getTarget();
00905
00906 if (target == GL_NONE)
00907 target = GL_TEXTURE_2D;
00908
00909 glBindTexture(target,
00910 win->getGLObjectId(getTextures(0)->getGLId()));
00911
00912 glCopyTexSubImage2D(target, 0, 0, 0, 0, 0, imgWidth, imgHeight);
00913
00914 if (glGetError() != GL_NO_ERROR)
00915 SWARNING << "Error in Texture-Creation of special mode! " << endLog;
00916
00917 glBindTexture(target, 0);
00918 }
00919
00920 if (shadowVptPtr != NullFC)
00921 {
00922 Int32 k = pos.size() - 1,
00923 m = fgndBag.size() - 1;
00924
00925 for (j=0;j<n; j++) {
00926 if (shadowVptPtr->getForegrounds().empty() && m >= 0) {
00927 shadowVptPtr->getForegrounds().push_back(fgndBag[m--]);
00928 }
00929 else if (k >= 0 && pos[k] == j) {
00930 ForegroundPtr fp = shadowVptPtr->getForegrounds(j);
00931 fp->setActive(true);
00932 k--;
00933 }
00934 else if (m>=0) {
00935 fgndIt = shadowVptPtr->getForegrounds().begin() + j;
00936 shadowVptPtr->getForegrounds().insert(fgndIt, fgndBag[m--]);
00937 }
00938 }
00939 fgndBag.clear();
00940
00941 beginEditCP(shadowVptPtr, LeftFieldMask | RightFieldMask |
00942 BottomFieldMask | TopFieldMask);
00943 shadowVptPtr->setSize(svpL, svpB, svpR, svpT);
00944 endEditCP(shadowVptPtr, LeftFieldMask | RightFieldMask |
00945 BottomFieldMask | TopFieldMask);
00946
00947 check++;
00948 }
00949
00950 subRefCP(tiledeco);
00951
00952 beginEditCP(getPtr(), LeftFieldMask | RightFieldMask |
00953 BottomFieldMask | TopFieldMask |
00954 StorageWidthFieldMask | StorageHeightFieldMask);
00955 setSize(0, 0, imgWidth-1, imgHeight-1);
00956 if (sides)
00957 {
00958 setStorageWidth(imgWidth);
00959 setStorageHeight(imgHeight);
00960 }
00961 endEditCP(getPtr(), LeftFieldMask | RightFieldMask |
00962 BottomFieldMask | TopFieldMask |
00963 StorageWidthFieldMask | StorageHeightFieldMask);
00964
00965 for (i=0; i<getExcludeNodes().getSize(); i++)
00966 {
00967 NodePtr exnode = getExcludeNodes()[i];
00968 if (exnode != NullFC)
00969 exnode->setActive(true);
00970 }
00971 }
00972 }
00973 else
00974 {
00975 PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB =
00976 (PFNGLDRAWBUFFERSARBPROC)win->getFunction(_funcDrawBuffers);
00977
00978
00979 Int32 numBuffers = getMaxBuffers();
00980 GLenum *buffers = NULL;
00981
00982 if (getTextures().getSize() < numBuffers)
00983 numBuffers = getTextures().getSize();
00984
00985 if (numBuffers > 0)
00986 {
00987 Int32 i, format;
00988 GLenum target = GL_TEXTURE_2D;
00989
00990
00991 TextureChunkPtr depthTex, stencilTex;
00992 MFTextureChunkPtr colorTextures;
00993
00994 for (i=0; i<numBuffers; i++)
00995 {
00996 format = getTextures(i)->getInternalFormat();
00997
00998 if ( format == GL_DEPTH_COMPONENT ||
00999 (format >= GL_DEPTH_COMPONENT16_ARB &&
01000 format <= GL_DEPTH_COMPONENT32_ARB) )
01001 {
01002 depthTex = getTextures(i);
01003 }
01004 else if (format == GL_STENCIL_INDEX) {
01005 stencilTex = getTextures(i);
01006 }
01007 else if (format == GL_DEPTH_STENCIL_EXT) {
01008 SWARNING << "DEPTH_STENCIL format not yet impl." << endLog;
01009 }
01010 else {
01011 colorTextures.push_back(getTextures(i));
01012 }
01013 }
01014
01015
01016
01017 format = FBO_DEPTH_24;
01018
01019 if (stencilTex && depthTex)
01020 {
01021
01022 FWARNING(( "Rendering to separate depth and stencil textures "
01023 "is not possible. Disabling stencil texture.\n" ));
01024 stencilTex = NullFC;
01025 }
01026
01027 if ( !initialize(win, format) )
01028 assert(0);
01029
01030 checkGLError("FBO render pre\n");
01031
01032 bind(win);
01033
01034 buffers = new GLenum[numBuffers];
01035
01036
01037 if (!colorTextures.empty())
01038 {
01039 if (colorTextures.getSize() < numBuffers)
01040 numBuffers = colorTextures.getSize();
01041
01042 if (depthTex)
01043 {
01044 win->validateGLObject(depthTex->getGLId());
01045
01046 target = depthTex->getTarget();
01047
01048 if (target == GL_NONE)
01049 target = GL_TEXTURE_2D;
01050
01051 setTarget(win, win->getGLObjectId(depthTex->getGLId()),
01052 GL_DEPTH_ATTACHMENT_EXT, target);
01053 }
01054 else if (stencilTex)
01055 {
01056 win->validateGLObject(stencilTex->getGLId());
01057
01058 target = stencilTex->getTarget();
01059
01060 if (target == GL_NONE)
01061 target = GL_TEXTURE_2D;
01062
01063 setTarget(win, win->getGLObjectId(stencilTex->getGLId()),
01064 GL_STENCIL_ATTACHMENT_EXT, target);
01065 }
01066
01067 for (i=0; i<numBuffers; i++)
01068 {
01069 buffers[i] = GL_COLOR_ATTACHMENT0_EXT + i;
01070
01071 win->validateGLObject(colorTextures[i]->getGLId());
01072
01073 target = colorTextures[i]->getTarget();
01074
01075
01076 if (target == GL_NONE)
01077 target = GL_TEXTURE_2D;
01078
01079
01080 setTarget(win, win->getGLObjectId(colorTextures[i]->getGLId()),
01081 buffers[i], target);
01082 }
01083
01084 checkFrameBufferStatus(win);
01085
01086
01087 if (glDrawBuffersARB)
01088 glDrawBuffersARB (numBuffers, buffers);
01089 else {
01090 if (numBuffers > 1) {
01091 FWARNING(( "glDrawBuffersARB not supported, "
01092 "can't render to more than 1 buffer.\n" ));
01093 }
01094 glDrawBuffer ( *buffers );
01095 }
01096 }
01097 else if (depthTex)
01098 {
01099 buffers[0] = GL_DEPTH_ATTACHMENT_EXT;
01100 numBuffers = 1;
01101
01102 win->validateGLObject(depthTex->getGLId());
01103
01104 target = depthTex->getTarget();
01105
01106 if (target == GL_NONE)
01107 target = GL_TEXTURE_2D;
01108
01109 setTarget(win, win->getGLObjectId(depthTex->getGLId()), buffers[0], target);
01110
01111 glDrawBuffer (GL_NONE);
01112 glReadBuffer (GL_NONE);
01113
01114 checkFrameBufferStatus(win);
01115 }
01116 else if (stencilTex)
01117 {
01118 buffers[0] = GL_STENCIL_ATTACHMENT_EXT;
01119 numBuffers = 1;
01120
01121 win->validateGLObject(stencilTex->getGLId());
01122
01123 target = stencilTex->getTarget();
01124
01125 if (target == GL_NONE)
01126 target = GL_TEXTURE_2D;
01127
01128 setTarget(win, win->getGLObjectId(stencilTex->getGLId()), buffers[0], target);
01129
01130 glDrawBuffer (GL_NONE);
01131 glReadBuffer (GL_NONE);
01132
01133 checkFrameBufferStatus(win);
01134 }
01135
01136
01137 for (i=0; i<(Int32)getExcludeNodes().getSize(); i++)
01138 {
01139 NodePtr exnode = getExcludeNodes()[i];
01140 if (exnode != NullFC)
01141 exnode->setActive(false);
01142 }
01143
01144 CameraPtr cP = getCamera();
01145 CameraDecoratorPtr cdP = CameraDecoratorPtr::dcast(cP);
01146
01147
01148 while (cdP != NullFC)
01149 {
01150 cP = cdP->getDecoratee();
01151 cdP = CameraDecoratorPtr::dcast(cP);
01152 }
01153
01154 action->setCamera(cP.getCPtr());
01155 action->setBackground(getBackground().getCPtr());
01156 action->setViewport(this);
01157 action->setTravMask(getTravMask());
01158
01159
01160 activate();
01161
01162 if (getRenderNodes().getSize() == 0)
01163 {
01164 action->apply(getRoot());
01165 }
01166 else
01167 {
01168 for (i=0; i<(Int32)getRenderNodes().getSize(); i++)
01169 {
01170 NodePtr rdnode = getRenderNodes()[i];
01171 if (rdnode != NullFC)
01172 action->apply(rdnode);
01173 }
01174 }
01175
01176 for (UInt16 fi=0; fi<getForegrounds().size(); fi++)
01177 getForegrounds(fi)->draw(action, this);
01178
01179
01180 deactivate();
01181
01182 for (i=0; i<(Int32)getExcludeNodes().getSize(); i++)
01183 {
01184 NodePtr exnode = getExcludeNodes()[i];
01185 if (exnode != NullFC)
01186 exnode->setActive(true);
01187 }
01188
01189 stop(win);
01190
01191 checkGLError("FBO render post");
01192
01193 if (buffers)
01194 delete [] buffers;
01195 }
01196 }
01197
01198 if (depth)
01199 rAct->setZWriteTrans(zWriteTransSave);
01200
01201
01202 if (_renderParamsFP != NULL)
01203 _renderParamsFP(FBO_RP_NONE);
01204 }
01205
01206 Int32 FBOViewport::getMaxBuffers(void)
01207 {
01208 GLint max = 0;
01209
01210 glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &max);
01211 FINFO(("GL_MAX_COLOR_ATTACHMENTS_EXT: %d\n", max));
01212
01213 return max;
01214 }
01215
01217 bool FBOViewport::extensionCheck(void)
01218 {
01219 if ( !getParent()->hasExtension(_framebuffer_object_extension) )
01220 {
01221 FWARNING(("I need GL_EXT_framebuffer_object-Extension!\n"));
01222 return false;
01223 }
01224 else
01225 {
01226 FDEBUG(("Extensions-Check done!\n"));
01227 return true;
01228 }
01229 }
01230
01232 bool FBOViewport::checkFrameBufferStatus(Window *win)
01233 {
01234 PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT =
01235 (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)win->getFunction(_funcCheckFramebufferStatus);
01236 GLenum errCode, status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
01237
01238 switch(status)
01239 {
01240 case GL_FRAMEBUFFER_COMPLETE_EXT:
01241 FINFO(("%x: framebuffer complete!\n", status));
01242 break;
01243 case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
01244 FWARNING(("%x: framebuffer GL_FRAMEBUFFER_UNSUPPORTED_EXT\n", status));
01245
01246 return false;
01247 case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
01248 FWARNING(("%x: framebuffer INCOMPLETE_ATTACHMENT\n", status));
01249 break;
01250 case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
01251 FWARNING(("%x: framebuffer FRAMEBUFFER_MISSING_ATTACHMENT\n", status));
01252 break;
01253 case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
01254 FWARNING(("%x: framebuffer FRAMEBUFFER_DIMENSIONS\n", status));
01255 break;
01261 case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
01262 FWARNING(("%x: framebuffer INCOMPLETE_FORMATS\n", status));
01263 break;
01264 case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
01265 FWARNING(("%x: framebuffer INCOMPLETE_DRAW_BUFFER\n", status));
01266 break;
01267 case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
01268 FWARNING(("%x: framebuffer INCOMPLETE_READ_BUFFER\n", status));
01269 break;
01270 case GL_FRAMEBUFFER_BINDING_EXT:
01271 FWARNING(("%x: framebuffer BINDING_EXT\n", status));
01272 break;
01273 default:
01274 return false;
01275 }
01276
01277 if ((errCode = glGetError()) != GL_NO_ERROR)
01278 {
01279 const GLubyte *errString = gluErrorString(errCode);
01280 FWARNING(("OpenGL Error: %s!\n", errString));
01281 return false;
01282 }
01283 return true;
01284 }
01285
01286
01287 #if 0
01288 PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT =
01289 (PFNGLBINDFRAMEBUFFEREXTPROC)win->getFunction(_funcBindFramebuffer);
01290 PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT =
01291 (PFNGLBINDRENDERBUFFEREXTPROC)win->getFunction(_funcBindRenderbuffer);
01292 PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT =
01293 (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)win->getFunction(_funcCheckFramebufferStatus);
01294 PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT =
01295 (PFNGLDELETEFRAMEBUFFERSEXTPROC)win->getFunction(_funcDeleteFramebuffers);
01296 PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT =
01297 (PFNGLDELETERENDERBUFFERSEXTPROC)win->getFunction(_funcDeleteRenderbuffers);
01298 PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT =
01299 (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)win->getFunction(_funcFramebufferRenderbuffer);
01300 PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT =
01301 (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)win->getFunction(_funcFramebufferTexture1D);
01302 PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT =
01303 (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)win->getFunction(_funcFramebufferTexture2D);
01304 PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT =
01305 (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)win->getFunction(_funcFramebufferTexture3D);
01306 PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT =
01307 (PFNGLGENFRAMEBUFFERSEXTPROC)win->getFunction(_funcGenFramebuffers);
01308 PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT =
01309 (PFNGLGENRENDERBUFFERSEXTPROC)win->getFunction(_funcGenRenderbuffers);
01310 PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT =
01311 (PFNGLGENERATEMIPMAPEXTPROC)win->getFunction(_funcGenerateMipmap);
01312 PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT =
01313 (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)win->getFunction(_funcGetFramebufferAttachmentParameteriv);
01314 PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT =
01315 (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)win->getFunction(_funcGetRenderbufferParameteriv);
01316 PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT =
01317 (PFNGLISFRAMEBUFFEREXTPROC)win->getFunction(_funcIsFramebuffer);
01318 PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT =
01319 (PFNGLISRENDERBUFFEREXTPROC)win->getFunction(_funcIsRenderbuffer);
01320 PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT =
01321 (PFNGLRENDERBUFFERSTORAGEEXTPROC)win->getFunction(_funcRenderbufferStorage);
01322 #endif
01323
01324
01325
01326
01327 #ifdef OSG_SGI_CC
01328 #pragma set woff 1174
01329 #endif
01330
01331 #ifdef OSG_LINUX_ICC
01332 #pragma warning( disable : 177 )
01333 #endif
01334
01335 namespace
01336 {
01337 static Char8 cvsid_cpp [] = "@(#)$Id: OSGFBOViewport.cpp,v 1.8 2007/06/22 00:13:01 dirk Exp $";
01338 static Char8 cvsid_hpp [] = OSGFBOVIEWPORTBASE_HEADER_CVSID;
01339 static Char8 cvsid_inl [] = OSGFBOVIEWPORTBASE_INLINE_CVSID;
01340
01341 static Char8 cvsid_fields_hpp[] = OSGFBOVIEWPORTFIELDS_HEADER_CVSID;
01342 }
01343
01344 #ifdef __sgi
01345 #pragma reset woff 1174
01346 #endif