@@ -49,6 +49,7 @@ Camera::Camera(Scene *parentScene) : Entity() {
4949 topLeftOrtho = false ;
5050 orthoSizeX = 1.0 ;
5151 orthoSizeY = 1.0 ;
52+ useGlobalFramebuffer = false ;
5253}
5354
5455Camera::~Camera () {
@@ -60,6 +61,14 @@ Camera::~Camera() {
6061 delete zBufferSceneTexture;
6162}
6263
64+ void Camera::setUseGlobalFramebuffer (bool val) {
65+ useGlobalFramebuffer = val;
66+ }
67+
68+ bool Camera::getUseGlobalFramebuffer () const {
69+ return useGlobalFramebuffer;
70+ }
71+
6372void Camera::setClippingPlanes (Number nearClipPlane, Number farClipPlane) {
6473 this ->nearClipPlane = nearClipPlane;
6574 this ->farClipPlane = farClipPlane;
@@ -361,38 +370,57 @@ void Camera::drawFilter(Texture *targetTexture, Number targetTextureWidth, Numbe
361370 if (!filterShaderMaterial)
362371 return ;
363372
364- Texture *finalTargetColorTexture;
365- Texture *finalTargetZTexture;
373+ Texture *finalTargetColorTexture = NULL ;
374+ Texture *finalTargetZTexture = NULL ;
366375
367376 if (targetTexture) {
368377 finalTargetColorTexture = targetColorTexture;
369378 finalTargetZTexture = targetZTexture;
370379 renderer->setViewportSize (targetTextureWidth, targetTextureHeight);
371380 } else {
372- finalTargetColorTexture = originalSceneTexture;
373- finalTargetZTexture = zBufferSceneTexture;
374- renderer->setViewportSize (renderer->getXRes (), renderer->getYRes ());
381+ if (!useGlobalFramebuffer) {
382+ finalTargetColorTexture = originalSceneTexture;
383+ finalTargetZTexture = zBufferSceneTexture;
384+ }
385+ renderer->setViewportSize (renderer->getXRes (), renderer->getYRes ());
375386 }
376- renderer->bindFrameBufferTexture (finalTargetColorTexture);
377- renderer->bindFrameBufferTextureDepth (finalTargetZTexture);
387+
388+ if (finalTargetColorTexture) {
389+ renderer->bindFrameBufferTexture (finalTargetColorTexture);
390+ }
391+ if (finalTargetZTexture) {
392+ renderer->bindFrameBufferTextureDepth (finalTargetZTexture);
393+ }
378394 parentScene->Render (this );
379- renderer->unbindFramebuffers ();
395+
396+ if (finalTargetColorTexture && finalTargetZTexture) {
397+ renderer->unbindFramebuffers ();
398+ }
380399
381400
382- ShaderBinding* materialBinding;
401+ ShaderBinding* materialBinding;
383402 for (int i=0 ; i < filterShaderMaterial->getNumShaders (); i++) {
384403 materialBinding = filterShaderMaterial->getShaderBinding (i);
385404
386405 for (int j=0 ; j < materialBinding->getNumColorTargetBindings (); j++) {
387406 RenderTargetBinding *colorBinding = materialBinding->getColorTargetBinding (j);
388407 materialBinding->clearTexture (colorBinding->name );
389- materialBinding->addTexture (colorBinding->name , finalTargetColorTexture);
408+
409+ if (finalTargetColorTexture) {
410+ materialBinding->addTexture (colorBinding->name , finalTargetColorTexture);
411+ } else {
412+ materialBinding->addTexture (colorBinding->name , renderer->getGlobalColorFramebuffer ());
413+ }
390414 }
391415
392416 for (int j=0 ; j < materialBinding->getNumDepthTargetBindings (); j++) {
393417 RenderTargetBinding *depthBinding = materialBinding->getDepthTargetBinding (j);
394418 materialBinding->clearTexture (depthBinding->name );
395- materialBinding->addTexture (depthBinding->name , finalTargetZTexture);
419+ if (finalTargetZTexture) {
420+ materialBinding->addTexture (depthBinding->name , finalTargetZTexture);
421+ } else {
422+ materialBinding->addTexture (depthBinding->name , renderer->getGlobalDepthFramebuffer ());
423+ }
396424 }
397425
398426 renderer->applyMaterial (filterShaderMaterial, localShaderOptions[i], i, true );
@@ -406,6 +434,13 @@ void Camera::drawFilter(Texture *targetTexture, Number targetTextureWidth, Numbe
406434 renderer->drawScreenQuad (targetTextureWidth, targetTextureHeight);
407435 renderer->unbindFramebuffers ();
408436 } else {
437+ // global framebuffer ONLY used for input
438+ // we must unbind it here.
439+ // this is a bit of a hack, a better system
440+ // would be to define override buffers
441+ if (useGlobalFramebuffer) {
442+ renderer->unbindFramebuffers ();
443+ }
409444 renderer->setViewportSize (renderer->getXRes (), renderer->getYRes ());
410445 renderer->clearScreen ();
411446 renderer->loadIdentity ();
@@ -494,5 +529,5 @@ void Camera::doCameraTransform() {
494529 Matrix4 camMatrix = getConcatenatedMatrix ();
495530 renderer->setCameraMatrix (camMatrix);
496531 camMatrix = camMatrix.Inverse ();
497- renderer->multModelviewMatrix (camMatrix);
532+ renderer->multModelviewMatrix (camMatrix);
498533}
0 commit comments