Преглед изворни кода

- IVideoDriver::setRenderTarget doesn't restore previous framebuffer anymore, you should do it yourself
- refactoring outline postprocessing

dmuratshin пре 9 година
родитељ
комит
650953fbda

+ 4 - 2
examples/Demo/src/TestRender2Texture.h

@@ -56,10 +56,12 @@ public:
         Rect viewport(Point(0, 0), content->getSize().cast<Point>());
         Rect viewport(Point(0, 0), content->getSize().cast<Point>());
         renderer.initCoordinateSystem(viewport.getWidth(), viewport.getHeight(), true);
         renderer.initCoordinateSystem(viewport.getWidth(), viewport.getHeight(), true);
 
 
+        spNativeTexture previousRT = driver->getRenderTarget();
+
         driver->setRenderTarget(texture);
         driver->setRenderTarget(texture);
         driver->setViewport(viewport);
         driver->setViewport(viewport);
 
 
-#if 0
+#if 1
         renderer.begin(0);
         renderer.begin(0);
         RectF destRect(te->localPosition - Vector2(16, 16), Vector2(32, 32));
         RectF destRect(te->localPosition - Vector2(16, 16), Vector2(32, 32));
 
 
@@ -85,6 +87,6 @@ public:
 #endif
 #endif
 
 
         //restore to default render target
         //restore to default render target
-        driver->setRenderTarget(0);
+        driver->setRenderTarget(previousRT);
     }
     }
 };
 };

+ 49 - 82
oxygine/src/TweenAlphaFade.cpp

@@ -81,13 +81,13 @@ namespace oxygine
         if (!_rt)
         if (!_rt)
         {
         {
             _rt = IVideoDriver::instance->createTexture();
             _rt = IVideoDriver::instance->createTexture();
-            _rt->init(_screen.getWidth(), _screen.getHeight(), TF_R4G4B4A4, true);
+            _rt->init(_screen.getWidth(), _screen.getHeight(), _format, true);
             c = true;
             c = true;
         }
         }
 
 
         if (_rt->getWidth() < _screen.getWidth() || _rt->getHeight() < _screen.getHeight())
         if (_rt->getWidth() < _screen.getWidth() || _rt->getHeight() < _screen.getHeight())
         {
         {
-            _rt->init(_screen.getWidth(), _screen.getHeight(), TF_R4G4B4A4, true);
+            _rt->init(_screen.getWidth(), _screen.getHeight(), _format, true);
             c = true;
             c = true;
         }
         }
 
 
@@ -140,6 +140,7 @@ namespace oxygine
         mat->Material::render(_actor, rs);
         mat->Material::render(_actor, rs);
 
 
         mat->finish();
         mat->finish();
+        log::messageln("render actor to texture");
         //driver->setRenderTarget(0);
         //driver->setRenderTarget(0);
     }
     }
 
 
@@ -192,11 +193,39 @@ namespace oxygine
     ShaderProgram* TweenGlow::shaderBlit = 0;
     ShaderProgram* TweenGlow::shaderBlit = 0;
 
 
 
 
+    void pass(spNativeTexture srcTexture, const Rect& srcRect, spNativeTexture destTexture, const Rect& destRect)
+    {
+        IVideoDriver* driver = IVideoDriver::instance;
+
+        const VertexDeclarationGL* decl = static_cast<const VertexDeclarationGL*>(driver->getVertexDeclaration(vertexPCT2::FORMAT));
+        driver->setRenderTarget(destTexture);
+        driver->clear(0);
+
+        driver->setViewport(destRect);
+
+        driver->setTexture(0, srcTexture);
+
+
+        vertexPCT2 v[4];
+
+
+        RectF dst = srcRect.cast<RectF>() / Vector2(srcTexture->getWidth(), srcTexture->getHeight());
+        fillQuadT(v,
+                  dst,
+                  RectF(-1, -1, 2, 2),
+                  AffineTransform::getIdentity(), 0);
+
+
+        driver->draw(IVideoDriver::PT_TRIANGLE_STRIP, decl, v, sizeof(v));
+        driver->setTexture(0, 0);
+    }
+
     void TweenGlow::render2texture()
     void TweenGlow::render2texture()
     {
     {
 
 
-        GLint prevFBO = 0;
-        glGetIntegerv(GL_FRAMEBUFFER_BINDING, &prevFBO);
+        IVideoDriver* driver = IVideoDriver::instance;
+
+        spNativeTexture prevRT = driver->getRenderTarget();
 
 
         TweenPostProcess::render2texture();
         TweenPostProcess::render2texture();
         const VertexDeclarationGL* decl = static_cast<const VertexDeclarationGL*>(IVideoDriver::instance->getVertexDeclaration(vertexPCT2::FORMAT));
         const VertexDeclarationGL* decl = static_cast<const VertexDeclarationGL*>(IVideoDriver::instance->getVertexDeclaration(vertexPCT2::FORMAT));
@@ -221,8 +250,12 @@ namespace oxygine
 
 
 
 
             shaderBlurV = new ShaderProgramGL(ShaderProgramGL::createProgram(v, ps, decl));
             shaderBlurV = new ShaderProgramGL(ShaderProgramGL::createProgram(v, ps, decl));
-            shaderBlurH = new ShaderProgramGL(ShaderProgramGL::createProgram(h, ps, decl));
+            driver->setShaderProgram(shaderBlurV);
+            driver->setUniformInt("s_texture", 0);
 
 
+            shaderBlurH = new ShaderProgramGL(ShaderProgramGL::createProgram(h, ps, decl));
+            driver->setShaderProgram(shaderBlurH);
+            driver->setUniformInt("s_texture", 0);
 
 
 
 
             file::buffer vs_blit;
             file::buffer vs_blit;
@@ -238,111 +271,45 @@ namespace oxygine
             unsigned int fs = ShaderProgramGL::createShader(GL_FRAGMENT_SHADER, (const char*)&fs_blit.front(), "", "");
             unsigned int fs = ShaderProgramGL::createShader(GL_FRAGMENT_SHADER, (const char*)&fs_blit.front(), "", "");
 
 
             shaderBlit = new ShaderProgramGL(ShaderProgramGL::createProgram(vs, fs, decl));
             shaderBlit = new ShaderProgramGL(ShaderProgramGL::createProgram(vs, fs, decl));
+            driver->setShaderProgram(shaderBlit);
+            driver->setUniformInt("s_texture", 0);
         }
         }
 
 
 
 
-
-        Rect vp = _screen;
-        vp.pos = Point(0, 0);
-
-        vertexPCT2 v[4];
-
-
-
         int w = _screen.size.x;
         int w = _screen.size.x;
         int h = _screen.size.y;
         int h = _screen.size.y;
 
 
-        IVideoDriver* driver = IVideoDriver::instance;
 
 
         driver->setState(IVideoDriver::STATE_BLEND, 0);
         driver->setState(IVideoDriver::STATE_BLEND, 0);
-        /*
 
 
-        oxglBindFramebuffer(GL_FRAMEBUFFER, safeCast<NativeTextureGLES*>(_rt2.get())->getFboID());
-        driver->clear(0);
-        driver->setViewport(Rect(0, 0, w / 2, h / 2));
+        /*
         driver->setShaderProgram(shaderBlit);
         driver->setShaderProgram(shaderBlit);
-        driver->setUniformInt("s_texture", 0);
-        driver->setTexture(0, _rt);
-
-
-        fillQuadT(v,
-                  RectF(0, 0, w / (float)_rt->getWidth(), h / (float)_rt->getHeight()),
-                  RectF(-1, -1, 2, 2),
-                  AffineTransform::getIdentity(), 0);
-
+        pass(_rt, Rect(0, 0, w, h), _rt2, Rect(0, 0, w / 2, h / 2));
 
 
-        driver->draw(IVideoDriver::PT_TRIANGLE_STRIP, decl, v, sizeof(v));
-        driver->setTexture(0, 0);
         w /= 2;
         w /= 2;
         h /= 2;
         h /= 2;
+        pass(_rt2, Rect(0, 0, w, h), _rt, Rect(0, 0, w / 2, h / 2));
 
 
-
-        oxglBindFramebuffer(GL_FRAMEBUFFER, safeCast<NativeTextureGLES*>(_rt.get())->getFboID());
-        driver->clear(0);
-        driver->setViewport(Rect(0, 0, w / 2, h / 2));
-        driver->setShaderProgram(shaderBlit);
-        driver->setUniformInt("s_texture", 0);
-        driver->setTexture(0, _rt2);
-
-
-        fillQuadT(v,
-                  RectF(0, 0, w / (float)_rt2->getWidth(), h / (float)_rt2->getHeight()),
-                  RectF(-1, -1, 2, 2),
-                  AffineTransform::getIdentity(), 0);
-
-
-        driver->draw(IVideoDriver::PT_TRIANGLE_STRIP, decl, v, sizeof(v));
-        driver->setTexture(0, 0);
         w /= 2;
         w /= 2;
         h /= 2;
         h /= 2;
-
+        _downsample = 4;
         */
         */
 
 
 
 
-        oxglBindFramebuffer(GL_FRAMEBUFFER, safeCast<NativeTextureGLES*>(_rt2.get())->getFboID());
-        driver->clear(0);
+        Rect rc(0, 0, w, h);
 
 
-        driver->setViewport(Rect(0, 0, w, h));
         driver->setShaderProgram(shaderBlurH);
         driver->setShaderProgram(shaderBlurH);
         driver->setUniform("step", 1.0f / _rt->getWidth());
         driver->setUniform("step", 1.0f / _rt->getWidth());
-        driver->setUniformInt("s_texture", 0);
-        driver->setTexture(0, _rt);
-
-
+        pass(_rt, rc, _rt2, rc);
 
 
-        fillQuadT(v,
-                  RectF(0, 0, w / (float)_rt->getWidth(), h / (float)_rt->getHeight()),
-                  RectF(-1, -1, 2, 2),
-                  AffineTransform::getIdentity(), 0);
-
-
-        driver->draw(IVideoDriver::PT_TRIANGLE_STRIP, decl, v, sizeof(v));
-        driver->setTexture(0, 0);
-
-
-
-        oxglBindFramebuffer(GL_FRAMEBUFFER, safeCast<NativeTextureGLES*>(_rt.get())->getFboID());
-        driver->clear(0);
 
 
-        driver->setViewport(Rect(0, 0, w, h));
         driver->setShaderProgram(shaderBlurV);
         driver->setShaderProgram(shaderBlurV);
         driver->setUniform("step", 1.0f / _rt2->getHeight());
         driver->setUniform("step", 1.0f / _rt2->getHeight());
-        driver->setUniformInt("s_texture", 0);
-        driver->setTexture(0, _rt2);
-
-        fillQuadT(v,
-                  RectF(0, 0, w / (float)_rt2->getWidth(), h / (float)_rt2->getHeight()),
-                  RectF(-1, -1, 2, 2),
-                  AffineTransform::getIdentity(), 0);
-
-
-        driver->draw(IVideoDriver::PT_TRIANGLE_STRIP, decl, v, sizeof(v));
-        driver->setTexture(0, 0);
-
+        pass(_rt2, rc, _rt, rc);
 
 
 
 
 
 
-        oxglBindFramebuffer(GL_FRAMEBUFFER, prevFBO);
+        driver->setRenderTarget(prevRT);
     }
     }
 
 
     void TweenGlow::rtCreated()
     void TweenGlow::rtCreated()
@@ -350,6 +317,6 @@ namespace oxygine
         TweenPostProcess::rtCreated();
         TweenPostProcess::rtCreated();
         _rt2 = IVideoDriver::instance->createTexture();
         _rt2 = IVideoDriver::instance->createTexture();
         //_rt2->init(_screen.getWidth() / 2, _screen.getHeight() / 2, TF_R8G8B8A8, true);
         //_rt2->init(_screen.getWidth() / 2, _screen.getHeight() / 2, TF_R8G8B8A8, true);
-        _rt2->init(_screen.getWidth(), _screen.getHeight(), TF_R4G4B4A4, true);
+        _rt2->init(_screen.getWidth(), _screen.getHeight(), _format, true);
     }
     }
 }
 }

+ 1 - 0
oxygine/src/TweenAlphaFade.h

@@ -31,6 +31,7 @@ namespace oxygine
 
 
         TweenPostProcess(int opt);
         TweenPostProcess(int opt);
         ~TweenPostProcess();
         ~TweenPostProcess();
+
         Rect getScreenRect(const Actor& actor) const;
         Rect getScreenRect(const Actor& actor) const;
         void init(Actor& actor);
         void init(Actor& actor);
         void restore(Restorable* r, void* userData);
         void restore(Restorable* r, void* userData);

+ 2 - 1
oxygine/src/core/gl/NativeTextureGLES.h

@@ -4,6 +4,7 @@
 
 
 namespace oxygine
 namespace oxygine
 {
 {
+    DECLARE_SMART(NativeTextureGLES, spNativeTextureGLES);
     class NativeTextureGLES : public NativeTexture
     class NativeTextureGLES : public NativeTexture
     {
     {
     public:
     public:
@@ -32,7 +33,7 @@ namespace oxygine
 
 
     protected:
     protected:
         void* _getRestorableObject() {return this;}
         void* _getRestorableObject() {return this;}
-        friend class VideoDriverGLES11;
+        friend class VideoDriverGL;
         friend class VideoDriverGLES20;
         friend class VideoDriverGLES20;
         NativeTextureGLES();
         NativeTextureGLES();
 
 

+ 10 - 6
oxygine/src/core/gl/VideoDriverGL.cpp

@@ -6,10 +6,13 @@
 
 
 namespace oxygine
 namespace oxygine
 {
 {
-    VideoDriverGL::VideoDriverGL(): _prevFBO(0), _batches(0), _triangles(0),
+    VideoDriverGL::VideoDriverGL(): _batches(0), _triangles(0),
         _traceStats(true)
         _traceStats(true)
     {
     {
-
+        _rt = new NativeTextureGLES;
+        GLint fbo = 0;
+        glGetIntegerv(GL_FRAMEBUFFER_BINDING, &fbo);
+        _rt->_fbo = fbo;
     }
     }
 
 
     void    VideoDriverGL::getStats(Stats& s) const
     void    VideoDriverGL::getStats(Stats& s) const
@@ -135,18 +138,19 @@ namespace oxygine
 
 
     void VideoDriverGL::setRenderTarget(spNativeTexture rt)
     void VideoDriverGL::setRenderTarget(spNativeTexture rt)
     {
     {
-        _rt = rt;
+        _rt = safeSpCast<NativeTextureGLES>(rt);
+        /*
         if (!rt)
         if (!rt)
         {
         {
             oxglBindFramebuffer(GL_FRAMEBUFFER, _prevFBO);
             oxglBindFramebuffer(GL_FRAMEBUFFER, _prevFBO);
             CHECKGL();
             CHECKGL();
             return;
             return;
         }
         }
+        */
+
 
 
-        glGetIntegerv(GL_FRAMEBUFFER_BINDING, &_prevFBO);
 
 
-        NativeTextureGLES* gl = safeCast<NativeTextureGLES*>(rt.get());
-        oxglBindFramebuffer(GL_FRAMEBUFFER, gl->getFboID());
+        oxglBindFramebuffer(GL_FRAMEBUFFER, _rt->getFboID());
         CHECKGL();
         CHECKGL();
     }
     }
 
 

+ 2 - 2
oxygine/src/core/gl/VideoDriverGL.h

@@ -7,6 +7,7 @@
 namespace oxygine
 namespace oxygine
 {
 {
     class VertexDeclarationGL;
     class VertexDeclarationGL;
+    DECLARE_SMART(NativeTextureGLES, spNativeTextureGLES);
 
 
     /**intermediate gl driver with some shared gl code*/
     /**intermediate gl driver with some shared gl code*/
     class VideoDriverGL: public IVideoDriver
     class VideoDriverGL: public IVideoDriver
@@ -36,8 +37,7 @@ namespace oxygine
         void setDebugStats(bool enable) {_traceStats = enable;}
         void setDebugStats(bool enable) {_traceStats = enable;}
 
 
         void _begin(const Rect& viewport, const Color* clearColor);
         void _begin(const Rect& viewport, const Color* clearColor);
-        GLint _prevFBO;
-        spNativeTexture _rt;
+        spNativeTextureGLES _rt;
 
 
         mutable VertexDeclarations<VertexDeclarationGL> _vdeclarations;
         mutable VertexDeclarations<VertexDeclarationGL> _vdeclarations;
         bool _traceStats;
         bool _traceStats;

+ 0 - 1
oxygine/src/oxygine-framework.h

@@ -75,7 +75,6 @@
 //#include "core/gl/oxgl.h"
 //#include "core/gl/oxgl.h"
 //#include "core/gl/VertexDeclarationGL.h"
 //#include "core/gl/VertexDeclarationGL.h"
 //#include "core/gl/VideoDriverGL.h"
 //#include "core/gl/VideoDriverGL.h"
-//#include "core/gl/VideoDriverGLES11.h"
 //#include "core/gl/VideoDriverGLES20.h"
 //#include "core/gl/VideoDriverGLES20.h"
 
 
 //dev_tools/
 //dev_tools/