Browse Source

refactoring PostProcess

dmuratshin 9 years ago
parent
commit
2e528f36e4

+ 1 - 1
examples/Demo/src/TestDrag.h

@@ -1,7 +1,7 @@
 #pragma once
 #include "test.h"
 #include "Draggable.h"
-#include "TweenAlphaFade.h"
+#include "TweenOutline.h"
 class DraggableSprite: public Sprite
 {
 public:

+ 4 - 3
oxygine/SDL/win32/oxygine.vcxproj

@@ -169,6 +169,7 @@
     <ClCompile Include="..\..\src\minizip\ioapi.c" />
     <ClCompile Include="..\..\src\minizip\ioapi_mem.c" />
     <ClCompile Include="..\..\src\minizip\unzip.c" />
+    <ClCompile Include="..\..\src\PostProcess.cpp" />
     <ClCompile Include="..\..\src\ThreadLoader.cpp" />
     <ClCompile Include="..\..\src\PointerState.cpp" />
     <ClCompile Include="..\..\src\Polygon.cpp" />
@@ -198,7 +199,7 @@
     <ClCompile Include="..\..\src\Tween.cpp" />
     <ClCompile Include="..\..\src\TweenAlphaFade.cpp" />
     <ClCompile Include="..\..\src\TweenAnim.cpp" />
-    <ClCompile Include="..\..\src\TweenGlow.cpp" />
+    <ClCompile Include="..\..\src\TweenOutline.cpp" />
     <ClCompile Include="..\..\src\TweenQueue.cpp" />
     <ClCompile Include="..\..\src\utils\cdecode.c" />
     <ClCompile Include="..\..\src\utils\stringUtils.cpp" />
@@ -281,6 +282,7 @@
     <ClInclude Include="..\..\src\minizip\ioapi.h" />
     <ClInclude Include="..\..\src\minizip\ioapi_mem.h" />
     <ClInclude Include="..\..\src\minizip\unzip.h" />
+    <ClInclude Include="..\..\src\PostProcess.h" />
     <ClInclude Include="..\..\src\ThreadLoader.h" />
     <ClInclude Include="..\..\src\oxygine-framework.h" />
     <ClInclude Include="..\..\src\oxygine_include.h" />
@@ -308,7 +310,6 @@
     <ClInclude Include="..\..\src\Sprite.h" />
     <ClInclude Include="..\..\src\STDMaterial.h" />
     <ClInclude Include="..\..\src\STDRenderer.h" />
-    <ClInclude Include="..\..\src\TextActor.h" />
     <ClInclude Include="..\..\src\TextField.h" />
     <ClInclude Include="..\..\src\TextStyle.h" />
     <ClInclude Include="..\..\src\text_utils\Aligner.h" />
@@ -319,7 +320,7 @@
     <ClInclude Include="..\..\src\TweenAlphaFade.h" />
     <ClInclude Include="..\..\src\TweenAnim.h" />
     <ClInclude Include="..\..\src\Tweener.h" />
-    <ClInclude Include="..\..\src\TweenGlow.h" />
+    <ClInclude Include="..\..\src\TweenOutline.h" />
     <ClInclude Include="..\..\src\TweenQueue.h" />
     <ClInclude Include="..\..\src\UpdateState.h" />
     <ClInclude Include="..\..\src\utils\cdecode.h" />

+ 12 - 9
oxygine/SDL/win32/oxygine.vcxproj.filters

@@ -327,9 +327,6 @@
     <ClCompile Include="..\..\src\TweenAlphaFade.cpp">
       <Filter>src</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\src\TweenGlow.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\src\Material.cpp">
       <Filter>src</Filter>
     </ClCompile>
@@ -342,6 +339,12 @@
     <ClCompile Include="..\..\src\ThreadLoader.cpp">
       <Filter>src</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\PostProcess.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\src\TweenOutline.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\src\closure\closure.h">
@@ -620,9 +623,6 @@
     <ClInclude Include="..\..\src\Sprite.h">
       <Filter>src</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\src\TextActor.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\src\TextStyle.h">
       <Filter>src</Filter>
     </ClInclude>
@@ -722,9 +722,6 @@
     <ClInclude Include="..\..\src\TweenAlphaFade.h">
       <Filter>src</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\src\TweenGlow.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="..\..\src\Material.h">
       <Filter>src</Filter>
     </ClInclude>
@@ -740,6 +737,12 @@
     <ClInclude Include="..\..\src\math\OBBox.h">
       <Filter>src\math</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\PostProcess.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\TweenOutline.h">
+      <Filter>src</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="ReadMe.txt" />

+ 361 - 0
oxygine/src/PostProcess.cpp

@@ -0,0 +1,361 @@
+#include "PostProcess.h"
+#include "Actor.h"
+#include "core/gl/VertexDeclarationGL.h"
+#include "core/oxygine.h"
+#include "RenderState.h"
+#include "STDMaterial.h"
+
+namespace oxygine
+{
+    ShaderProgram* PostProcess::shaderBlurV = 0;
+    ShaderProgram* PostProcess::shaderBlurH = 0;
+    ShaderProgram* PostProcess::shaderBlit = 0;
+
+
+
+    const int ALIGN_SIZE = 256;
+    const int TEXTURE_LIVE = 3000;
+    const int MAX_FREE_TEXTURES = 3;
+
+    using namespace std;
+
+    DECLARE_SMART(TweenPostProcess, spTweenPostProcess);
+
+    vector<spTweenPostProcess> postProcessItems;
+
+    int alignTextureSize(int v)
+    {
+        int n = (v - 1) / ALIGN_SIZE;
+        return (n + 1) * ALIGN_SIZE;
+    }
+
+    class NTP
+    {
+    public:
+        int _w;
+        int _h;
+        TextureFormat _tf;
+        NTP(int w, int h, TextureFormat tf) : _w(w), _h(h), _tf(tf) {}
+
+        bool operator()(const spNativeTexture& t1, const spNativeTexture& t2) const
+        {
+            if (t1->getFormat() < _tf)
+                return true;
+            if (t1->getWidth() < _w)
+                return true;
+            return t1->getHeight() < _h;
+        }
+
+        static bool cmp(const spNativeTexture& t2, const spNativeTexture& t1)
+        {
+            if (t1->getFormat() > t2->getFormat())
+                return true;
+            if (t1->getWidth() > t2->getWidth())
+                return true;
+            return t1->getHeight() > t2->getHeight();
+        }
+    };
+
+
+    RenderTargetsManager::RenderTargetsManager()
+    {
+        //get(10, 15, TF_R8G8B8A8);
+        //get(10, 15, TF_R8G8B8A8);
+    }
+
+    void RenderTargetsManager::print()
+    {
+        log::messageln("print");
+        for (size_t i = 0, sz = _free.size(); i < sz; ++i)
+        {
+            spNativeTexture t = _free[i];
+            log::messageln("texture %d %d", t->getWidth(), t->getHeight());
+        }
+    }
+    bool RenderTargetsManager::isGood(const spNativeTexture& t, int w, int h, TextureFormat tf) const
+    {
+        if (!t)
+            return false;
+
+        if (!t->getHandle())
+            return false;
+
+        if (t->getFormat() == tf &&
+                t->getWidth() >= w && t->getHeight() >= h &&
+                t->getWidth() <= (w + ALIGN_SIZE) && t->getHeight() <= (h + ALIGN_SIZE))
+            return true;
+        return false;
+    }
+
+    spNativeTexture RenderTargetsManager::get(spNativeTexture current, int w, int h, TextureFormat tf)
+    {
+        w = alignTextureSize(w);
+        h = alignTextureSize(h);
+        if (isGood(current, w, h, tf))
+            return current;
+
+        spNativeTexture result;
+
+        free::iterator it = lower_bound(_free.begin(), _free.end(), result, NTP(w, h, tf));
+        if (it != _free.end())
+        {
+            spNativeTexture& t = *it;
+            if (isGood(t, w, h, tf))
+            {
+                result = t;
+                _free.erase(it);
+            }
+        }
+
+        if (!result)
+        {
+            //if texture wasn't found create it
+            result = IVideoDriver::instance->createTexture();
+            result->init(w, h, tf, true);
+        }
+
+        result->setUserData((void*)getTimeMS());
+        _rts.push_back(result);
+
+        //print();
+
+        return result;
+    }
+
+
+
+    void RenderTargetsManager::update()
+    {
+        timeMS tm = getTimeMS();
+        for (size_t i = 0, sz = _rts.size(); i < sz; ++i)
+        {
+            spNativeTexture& texture = _rts[i];
+            if (texture->_ref_counter == 1)
+            {
+                free::iterator it = lower_bound(_free.begin(), _free.end(), texture, NTP::cmp);
+                _free.insert(it, texture);
+                _rts.erase(_rts.begin() + i);
+                --i;
+                --sz;
+                continue;
+            }
+        }
+
+        for (size_t i = 0, sz = _free.size(); i < sz; ++i)
+        {
+            spNativeTexture& t = _free[i];
+            timeMS createTime = (timeMS)t->getUserData();
+            if (createTime + TEXTURE_LIVE > tm)
+                continue;
+            _free.erase(_free.begin() + i);
+            --i;
+            --sz;
+        }
+
+        if (_free.size() > MAX_FREE_TEXTURES)
+        {
+            _free.erase(_free.begin(), _free.begin() + _free.size() - MAX_FREE_TEXTURES);
+        }
+    }
+
+    void RenderTargetsManager::reset()
+    {
+        _free.clear();
+        _rts.clear();
+    }
+
+    RenderTargetsManager _rtm;
+    RenderTargetsManager& getRTManager()
+    {
+        return _rtm;
+    }
+
+
+
+
+
+
+    void updatePortProcessItems()
+    {
+        if (!postProcessItems.empty())
+        {
+            IVideoDriver* driver = IVideoDriver::instance;
+            spNativeTexture prevRT = driver->getRenderTarget();
+
+            for (size_t i = 0; i < postProcessItems.size(); ++i)
+            {
+                spTweenPostProcess p = postProcessItems[i];
+                p->renderPP();
+                p->getActor()->releaseRef();
+            }
+
+            postProcessItems.clear();
+            driver->setRenderTarget(prevRT);
+        }
+
+        _rtm.update();
+    }
+
+    void clearPostProcessItems()
+    {
+        postProcessItems.clear();
+        _rtm.reset();
+    }
+
+
+    void pass(spNativeTexture srcTexture, const Rect& srcRect, spNativeTexture destTexture, const Rect& destRect, const Color& color)
+    {
+        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(), color.rgba());
+
+
+        driver->draw(IVideoDriver::PT_TRIANGLE_STRIP, decl, v, sizeof(v));
+        driver->setTexture(0, 0);
+    }
+
+    PostProcess::PostProcess(const PostProcessOptions& opt) : _options(opt), _format(TF_R4G4B4A4), _extend(2, 2)
+    {
+    }
+
+    PostProcess::~PostProcess()
+    {
+    }
+
+    void PostProcess::free()
+    {
+        _rt = 0;
+    }
+
+    Rect PostProcess::getScreenRect(const Actor& actor) const
+    {
+        Rect screen;
+
+        Rect display(Point(0, 0), core::getDisplaySize());
+
+        if (_options._flags & PostProcessOptions::flag_fullscreen)
+            return display;
+
+        screen = actor.computeBounds(actor.computeGlobalTransform()).cast<Rect>();
+        screen.size += Point(1, 1);
+        screen.expand(_extend, _extend);
+
+        if (!(_options._flags & PostProcessOptions::flag_singleR2T))
+            screen.clip(display);
+
+        return screen.cast<Rect>();
+    }
+
+    void PostProcess::update(Actor* actor)
+    {
+        _screen = getScreenRect(*actor);
+
+        OX_ASSERT(actor->_getStage());
+        _rt = getRTManager().get(_rt, _screen.getWidth(), _screen.getHeight(), _format);
+
+
+        _transform = actor->computeGlobalTransform().inverted();
+
+
+
+
+        IVideoDriver* driver = IVideoDriver::instance;
+
+        driver->setRenderTarget(_rt);
+
+        Rect vp = _screen;
+        vp.pos = Point(0, 0);
+        driver->setViewport(vp);
+        driver->clear(0);
+
+
+        RenderState rs;
+        STDMaterial* mat = STDMaterial::instance;
+        STDRenderer* renderer = mat->getRenderer();
+        rs.material = mat;
+
+        RectF clip = vp.cast<RectF>();
+        rs.clip = &clip;
+
+        renderer->initCoordinateSystem(vp.getWidth(), vp.getHeight(), true);
+
+        rs.transform = actor->getParent()->computeGlobalTransform();
+
+
+        if (!(_options._flags & PostProcessOptions::flag_fullscreen))
+        {
+            AffineTransform offset;
+            offset.identity();
+            offset.translate(-_screen.pos);
+            rs.transform = rs.transform * offset;
+        }
+
+        mat->Material::render(actor, rs);
+
+        mat->finish();
+    }
+
+
+
+
+
+    TweenPostProcess::TweenPostProcess(const PostProcessOptions& opt) : _pp(opt), _prevMaterial(0), _actor(0)
+    {
+    }
+
+    TweenPostProcess::~TweenPostProcess()
+    {
+        if (_actor)
+            _actor->setMaterial(_prevMaterial);
+    }
+
+
+    void TweenPostProcess::renderPP()
+    {
+        if (_pp._options._flags & PostProcessOptions::flag_singleR2T && _pp._rt)
+            return;
+
+        _pp.update(_actor);
+        _renderPP();
+    }
+
+    void TweenPostProcess::init(Actor& actor)
+    {
+        _actor = &actor;
+        _prevMaterial = _actor->getMaterial();
+        _actor->setMaterial(this);
+    }
+
+    void TweenPostProcess::update(Actor& actor, float p, const UpdateState& us)
+    {
+        _progress = p;
+
+        if (find(postProcessItems.begin(), postProcessItems.end(), this) == postProcessItems.end())
+        {
+            _actor->addRef();
+            postProcessItems.push_back(this);
+        }
+    }
+
+    void TweenPostProcess::done(Actor& actor)
+    {
+        _actor->setMaterial(_prevMaterial);
+    }
+
+}

+ 115 - 0
oxygine/src/PostProcess.h

@@ -0,0 +1,115 @@
+#pragma once
+#include "oxygine_include.h"
+#include "math/Rect.h"
+#include "core/NativeTexture.h"
+#include "core/Renderer.h"
+#include "Material.h"
+#include "Tween.h"
+
+namespace oxygine
+{
+    class Actor;
+    class ShaderProgram;
+    class PostProcessOptions;
+
+
+    class PostProcessOptions
+    {
+    public:
+        enum
+        {
+            flag_singleR2T = 1,
+            flag_fullscreen = 1 << 1,
+        };
+
+        PostProcessOptions(int flags = 0) : _flags(flags), _downscale(1) {}
+        PostProcessOptions& fullscreen(bool enable = true) { _flags = enable ? (_flags | flag_fullscreen) : (_flags  & (~flag_fullscreen)); return *this; }
+        PostProcessOptions& singleRender(bool enable = true) { _flags = enable ? (_flags | flag_singleR2T) : (_flags  & (~flag_singleR2T)); return *this; }
+        //loops -(2, 3, 4, ...),  final size: 2^loops
+        PostProcessOptions& downscale(int loops = 2) { _downscale = loops; return *this; }
+
+        int _flags;
+        int _downscale;
+    };
+
+
+    class PostProcess
+    {
+    public:
+
+        static ShaderProgram* shaderBlurV;
+        static ShaderProgram* shaderBlurH;
+        static ShaderProgram* shaderBlit;
+
+        PostProcess(const PostProcessOptions& opt);
+        ~PostProcess();
+
+        void free();
+
+        void update(Actor* actor);
+        Rect getScreenRect(const Actor& actor) const;
+
+        Point _extend;
+        spNativeTexture _rt;
+        TextureFormat _format;
+        Transform _transform;
+        Rect _screen;
+
+        PostProcessOptions _options;
+    };
+
+
+    DECLARE_SMART(TweenPostProcess, spTweenPostProcess);
+
+    class TweenPostProcess : public TweenObj, public Material
+    {
+    public:
+        TweenPostProcess(const PostProcessOptions& opt);
+        ~TweenPostProcess();
+
+        Actor* getActor() const { return _actor; }
+
+        void renderPP();
+
+    protected:
+        void init(Actor& actor) OVERRIDE;
+        void update(Actor& actor, float p, const UpdateState& us) OVERRIDE;
+        void done(Actor& actor) OVERRIDE;
+        virtual void _renderPP() {}
+
+
+        Actor* _actor;
+        PostProcess _pp;
+        float _progress;
+
+        Material* _prevMaterial;
+    };
+
+
+    class RenderTargetsManager
+    {
+    public:
+        RenderTargetsManager();
+
+        spNativeTexture get(spNativeTexture current, int w, int h, TextureFormat tf);
+        void update();
+        void reset();
+
+    protected:
+        void print();
+        bool isGood(const spNativeTexture& t, int w, int h, TextureFormat tf) const;
+
+        typedef std::vector<spNativeTexture> rts;
+        rts _rts;
+
+        typedef std::vector<spNativeTexture> free;
+        free _free;
+    };
+
+    void pass(spNativeTexture srcTexture, const Rect& srcRect, spNativeTexture destTexture, const Rect& destRect, const Color& color = Color::White);
+
+    RenderTargetsManager& getRTManager();
+
+    void updatePortProcessItems();
+    void clearPostProcessItems();
+}

+ 0 - 24
oxygine/src/TextActor.h

@@ -1,24 +0,0 @@
-#pragma once
-#include "oxygine_include.h"
-#include "TextField.h"
-namespace oxygine
-{
-    /*
-    WARNING! Class TextActor was renamed to TextField.
-    TextActor name is deprecated.
-    */
-
-    DECLARE_SMART(TextActor, spTextActor);
-    class TextActor : public TextField
-    {
-    public:
-        DECLARE_COPYCLONE_NEW(TextActor);
-//      OXYGINE_DEPRECATED
-        TextActor() {}
-    };
-
-    inline void TextActor::copyFrom(const TextActor& src, cloneOptions opt)
-    {
-        TextField::copyFrom(src, opt);
-    }
-}

+ 1 - 0
oxygine/src/TouchEvent.h

@@ -1,5 +1,6 @@
 #pragma once
 #include "Event.h"
+#undef OUT
 namespace oxygine
 {
     typedef char pointer_index;

+ 2 - 586
oxygine/src/TweenAlphaFade.cpp

@@ -1,580 +1,9 @@
 #include "TweenAlphaFade.h"
-#include "core/file.h"
-#include "core/gl/ShaderProgramGL.h"
-#include "core/gl/oxgl.h"
-#include "core/gl/VertexDeclarationGL.h"
-#include "core/gl/NativeTextureGLES.h"
-#include <vector>
+#include "STDMaterial.h"
+#include "Actor.h"
 
 namespace oxygine
 {
-    const int ALIGN_SIZE = 256;
-    const int TEXTURE_LIVE = 3000;
-    const int MAX_FREE_TEXTURES = 3;
-
-    using namespace std;
-
-    DECLARE_SMART(TweenPostProcess, spTweenPostProcess);
-
-    vector<spTweenPostProcess> postProcessItems;
-
-    int alignTextureSize(int v)
-    {
-        int n = (v - 1) / ALIGN_SIZE;
-        return (n + 1) * ALIGN_SIZE;
-    }
-
-    class NTP
-    {
-    public:
-        int _w;
-        int _h;
-        TextureFormat _tf;
-        NTP(int w, int h, TextureFormat tf): _w(w), _h(h), _tf(tf) {}
-
-        bool operator()(const spNativeTexture& t1, const spNativeTexture& t2) const
-        {
-            if (t1->getFormat() < _tf)
-                return true;
-            if (t1->getWidth() < _w)
-                return true;
-            return t1->getHeight() < _h;
-        }
-
-        static bool cmp(const spNativeTexture& t2, const spNativeTexture& t1)
-        {
-            if (t1->getFormat() > t2->getFormat())
-                return true;
-            if (t1->getWidth() > t2->getWidth())
-                return true;
-            return t1->getHeight() > t2->getHeight();
-        }
-    };
-
-    class RTManager
-    {
-    public:
-        RTManager()
-        {
-            //get(10, 15, TF_R8G8B8A8);
-            //get(10, 15, TF_R8G8B8A8);
-        }
-
-        void print()
-        {
-            log::messageln("print");
-            for (size_t i = 0, sz = _free.size(); i < sz; ++i)
-            {
-                spNativeTexture t = _free[i];
-                log::messageln("texture %d %d", t->getWidth(), t->getHeight());
-            }
-        }
-        bool isGood(const spNativeTexture& t, int w, int h, TextureFormat tf)
-        {
-            if (!t)
-                return false;
-
-            if (t->getFormat() == tf &&
-                    t->getWidth() >= w && t->getHeight() >= h &&
-                    t->getWidth() <= (w + ALIGN_SIZE) && t->getHeight() <= (h + ALIGN_SIZE))
-                return true;
-            return false;
-        }
-
-        spNativeTexture get(spNativeTexture current, int w, int h, TextureFormat tf)
-        {
-            w = alignTextureSize(w);
-            h = alignTextureSize(h);
-            if (isGood(current, w, h, tf))
-                return current;
-
-            spNativeTexture result;
-
-            free::iterator it = lower_bound(_free.begin(), _free.end(), result, NTP(w, h, tf));
-            if (it != _free.end())
-            {
-                spNativeTexture& t = *it;
-                if (isGood(t, w, h, tf))
-                {
-                    result = t;
-                    _free.erase(it);
-                }
-            }
-
-            if (!result)
-            {
-                //if texture wasn't found create it
-                result = IVideoDriver::instance->createTexture();
-                result->init(w, h, tf, true);
-            }
-
-            result->setUserData((void*)getTimeMS());
-            _rts.push_back(result);
-
-            //print();
-
-            return result;
-        }
-
-
-
-        void update()
-        {
-            timeMS tm = getTimeMS();
-            for (size_t i = 0, sz = _rts.size(); i < sz; ++i)
-            {
-                spNativeTexture& texture = _rts[i];
-                if (texture->_ref_counter == 1)
-                {
-                    free::iterator it = lower_bound(_free.begin(), _free.end(), texture, NTP::cmp);
-                    _free.insert(it, texture);
-                    _rts.erase(_rts.begin() + i);
-                    --i;
-                    --sz;
-                    continue;
-                }
-            }
-
-            for (size_t i = 0, sz = _free.size(); i < sz; ++i)
-            {
-                spNativeTexture& t = _free[i];
-                timeMS createTime = (timeMS)t->getUserData();
-                if (createTime + TEXTURE_LIVE > tm)
-                    continue;
-                _free.erase(_free.begin() + i);
-                --i;
-                --sz;
-            }
-
-            if (_free.size() > MAX_FREE_TEXTURES)
-            {
-                _free.erase(_free.begin(), _free.begin() + _free.size() - MAX_FREE_TEXTURES);
-            }
-        }
-
-        void reset()
-        {
-            _free.clear();
-            _rts.clear();
-        }
-        /*
-        spNativeTexture abc(spNativeTexture t)
-        {
-            return t;
-            //if (t->getHandle() == 0)
-            //return
-            for (size_t i = 0; i < _rts.size(); ++i)
-            {
-                spNativeTexture& r = _rts[i];
-                if (r.texture == t)
-                {
-                    _free.push_back(r.texture);
-                    _rts.erase(_rts.begin() + i);
-                    i--;
-                    break;
-                }
-            }
-
-            return t;
-        }*/
-
-    protected:
-
-        typedef std::vector<spNativeTexture> rts;
-        rts _rts;
-
-        typedef std::vector<spNativeTexture> free;
-        free _free;
-    };
-
-    RTManager rtm;
-    RTManager& getRTManager()
-    {
-        return rtm;
-    }
-
-    class PostProcess
-    {
-    public:
-
-        static ShaderProgram* shaderBlurV;
-        static ShaderProgram* shaderBlurH;
-        static ShaderProgram* shaderBlit;
-
-        PostProcess(const PostProcessOptions& opt);
-        ~PostProcess();
-
-        void free();
-
-        void update(Actor* actor);
-        Rect getScreenRect(const Actor& actor) const;
-
-        Point _extend;
-        spNativeTexture _rt;
-        TextureFormat _format;
-        Transform _transform;
-        Rect _screen;
-
-        PostProcessOptions _options;
-    };
-
-
-
-
-    ShaderProgram* PostProcess::shaderBlurV = 0;
-    ShaderProgram* PostProcess::shaderBlurH = 0;
-    ShaderProgram* PostProcess::shaderBlit = 0;
-
-
-
-    DECLARE_SMART(TweenPostProcess, spTweenPostProcess);
-
-    class TweenPostProcess : public TweenObj, public Material
-    {
-    public:
-        TweenPostProcess(const PostProcessOptions& opt);
-        ~TweenPostProcess();
-
-
-        void renderPP();
-
-
-        Actor* _actor;
-
-    protected:
-        void init(Actor& actor) OVERRIDE;
-        void update(Actor& actor, float p, const UpdateState& us) OVERRIDE;
-        void done(Actor& actor) OVERRIDE;
-        virtual void _renderPP() {}
-
-        PostProcess _pp;
-        float _progress;
-
-        Material* _prevMaterial;
-    };
-
-    void renderPostProcessItems()
-    {
-        if (!postProcessItems.empty())
-        {
-            IVideoDriver* driver = IVideoDriver::instance;
-            spNativeTexture prevRT = driver->getRenderTarget();
-
-            for (size_t i = 0; i < postProcessItems.size(); ++i)
-            {
-                spTweenPostProcess p = postProcessItems[i];
-                p->renderPP();
-                p->_actor->releaseRef();
-            }
-
-            postProcessItems.clear();
-            driver->setRenderTarget(prevRT);
-        }
-        getRTManager().update();
-    }
-
-
-    void pass(spNativeTexture srcTexture, const Rect& srcRect, spNativeTexture destTexture, const Rect& destRect, const Color& color = Color::White)
-    {
-        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(), color.rgba());
-
-
-        driver->draw(IVideoDriver::PT_TRIANGLE_STRIP, decl, v, sizeof(v));
-        driver->setTexture(0, 0);
-    }
-
-    PostProcess::PostProcess(const PostProcessOptions& opt): _options(opt), _format(TF_R4G4B4A4), _extend(2, 2)
-    {
-    }
-
-    PostProcess::~PostProcess()
-    {
-    }
-
-    void PostProcess::free()
-    {
-        _rt = 0;
-    }
-
-    Rect PostProcess::getScreenRect(const Actor& actor) const
-    {
-        Rect screen;
-
-        Rect display(Point(0, 0), core::getDisplaySize());
-
-        if (_options._flags & PostProcessOptions::flag_fullscreen)
-            return display;
-
-        screen = actor.computeBounds(actor.computeGlobalTransform()).cast<Rect>();
-        screen.size += Point(1, 1);
-        screen.expand(_extend, _extend);
-
-        if (!(_options._flags & PostProcessOptions::flag_singleR2T))
-            screen.clip(display);
-
-        return screen.cast<Rect>();
-    }
-
-    void PostProcess::update(Actor* actor)
-    {
-        _screen = getScreenRect(*actor);
-
-        OX_ASSERT(actor->_getStage());
-        _rt = getRTManager().get(_rt, _screen.getWidth(), _screen.getHeight(), _format);
-
-
-        _transform = actor->computeGlobalTransform().inverted();
-
-
-
-
-        IVideoDriver* driver = IVideoDriver::instance;
-
-        driver->setRenderTarget(_rt);
-
-        Rect vp = _screen;
-        vp.pos = Point(0, 0);
-        driver->setViewport(vp);
-        driver->clear(0);
-
-
-        RenderState rs;
-        STDMaterial* mat = STDMaterial::instance;
-        STDRenderer* renderer = mat->getRenderer();
-        rs.material = mat;
-
-        RectF clip = vp.cast<RectF>();
-        rs.clip = &clip;
-
-        renderer->initCoordinateSystem(vp.getWidth(), vp.getHeight(), true);
-
-        rs.transform = actor->getParent()->computeGlobalTransform();
-
-
-        if (!(_options._flags & PostProcessOptions::flag_fullscreen))
-        {
-            AffineTransform offset;
-            offset.identity();
-            offset.translate(-_screen.pos);
-            rs.transform = rs.transform * offset;
-        }
-
-        mat->Material::render(actor, rs);
-
-        mat->finish();
-    }
-
-
-
-
-
-    TweenPostProcess::TweenPostProcess(const PostProcessOptions& opt) : _pp(opt), _prevMaterial(0), _actor(0)
-    {
-    }
-
-    TweenPostProcess::~TweenPostProcess()
-    {
-        if (_actor)
-            _actor->setMaterial(_prevMaterial);
-    }
-
-
-    void TweenPostProcess::renderPP()
-    {
-        if (_pp._options._flags & PostProcessOptions::flag_singleR2T && _pp._rt)
-            return;
-
-        _pp.update(_actor);
-        _renderPP();
-    }
-
-    void TweenPostProcess::init(Actor& actor)
-    {
-        _actor = &actor;
-        _prevMaterial = _actor->getMaterial();
-        _actor->setMaterial(this);
-    }
-
-    void TweenPostProcess::update(Actor& actor, float p, const UpdateState& us)
-    {
-        //_pp.update(_actor);
-        _progress = p;
-
-        if (find(postProcessItems.begin(), postProcessItems.end(), this) == postProcessItems.end())
-        {
-            _actor->addRef();
-            postProcessItems.push_back(this);
-        }
-    }
-
-    void TweenPostProcess::done(Actor& actor)
-    {
-        _actor->setMaterial(_prevMaterial);
-    }
-
-
-
-
-    class TweenOutlineImpl : public TweenPostProcess
-    {
-    public:
-        Color _color;
-        int _downsample;
-
-        TweenOutlineImpl(const Color& c, const PostProcessOptions& opt) : TweenPostProcess(opt), _color(c), _downsample(1) {}
-
-        void render(Actor* actor, const RenderState& rs) OVERRIDE
-        {
-            STDMaterial* mat = STDMaterial::instance;
-            STDRenderer* renderer = mat->getRenderer();
-
-            RectF src(0, 0,
-            _pp._screen.getWidth() / (float)_pp._rt->getWidth() / _downsample,
-            _pp._screen.getHeight() / (float)_pp._rt->getHeight() / _downsample);
-
-            RectF dest = _pp._screen.cast<RectF>();
-
-            renderer->setBlendMode(blend_premultiplied_alpha);
-
-
-            AffineTransform tr = _pp._transform * _actor->computeGlobalTransform();
-            renderer->setTransform(tr);
-            renderer->beginElementRendering(true);
-            Color color = Color(Color::White).withAlpha(255).premultiplied();
-            renderer->drawElement(_pp._rt, color.rgba(), src, dest);
-            renderer->drawBatch();
-
-
-            RenderState r = rs;
-            r.material = mat;
-            actor->setMaterial(_prevMaterial);
-            actor->render(r);
-            actor->setMaterial(this);
-        }
-
-        void _renderPP() OVERRIDE
-        {
-            IVideoDriver* driver = IVideoDriver::instance;
-
-            const VertexDeclarationGL* decl = static_cast<const VertexDeclarationGL*>(IVideoDriver::instance->getVertexDeclaration(vertexPCT2::FORMAT));
-
-            if (!PostProcess::shaderBlurH)
-            {
-                file::buffer vs_h;
-                file::buffer vs_v;
-                file::buffer fs_blur;
-                file::read("pp_hblur_vs.glsl", vs_h);
-                file::read("pp_vblur_vs.glsl", vs_v);
-                file::read("pp_rast_fs.glsl", fs_blur);
-
-                vs_h.push_back(0);
-                vs_v.push_back(0);
-                fs_blur.push_back(0);
-
-
-                unsigned int h = ShaderProgramGL::createShader(GL_VERTEX_SHADER, (const char*)&vs_h.front(), "", "");
-                unsigned int v = ShaderProgramGL::createShader(GL_VERTEX_SHADER, (const char*)&vs_v.front(), "", "");
-                unsigned int ps = ShaderProgramGL::createShader(GL_FRAGMENT_SHADER, (const char*)&fs_blur.front(), "", "");
-
-
-                PostProcess::shaderBlurV = new ShaderProgramGL(ShaderProgramGL::createProgram(v, ps, decl));
-                driver->setShaderProgram(PostProcess::shaderBlurV);
-                driver->setUniformInt("s_texture", 0);
-
-                PostProcess::shaderBlurH = new ShaderProgramGL(ShaderProgramGL::createProgram(h, ps, decl));
-                driver->setShaderProgram(PostProcess::shaderBlurH);
-                driver->setUniformInt("s_texture", 0);
-
-
-                file::buffer vs_blit;
-                file::buffer fs_blit;
-                file::read("pp_blit_vs.glsl", vs_blit);
-                file::read("pp_blit_fs.glsl", fs_blit);
-
-                vs_blit.push_back(0);
-                fs_blit.push_back(0);
-
-
-                unsigned int vs = ShaderProgramGL::createShader(GL_VERTEX_SHADER, (const char*)&vs_blit.front(), "", "");
-                unsigned int fs = ShaderProgramGL::createShader(GL_FRAGMENT_SHADER, (const char*)&fs_blit.front(), "", "");
-
-                PostProcess::shaderBlit = new ShaderProgramGL(ShaderProgramGL::createProgram(vs, fs, decl));
-                driver->setShaderProgram(PostProcess::shaderBlit);
-                driver->setUniformInt("s_texture", 0);
-            }
-
-
-            int w = _pp._screen.size.x;
-            int h = _pp._screen.size.y;
-
-
-            driver->setState(IVideoDriver::STATE_BLEND, 0);
-
-            _downsample = 1;
-
-
-            spNativeTexture rt = _pp._rt;
-            spNativeTexture rt2 = getRTManager().get(0, w, h, _pp._format);
-
-#if 0
-            driver->setShaderProgram(PostProcess::shaderBlit);
-            pass(rt, Rect(0, 0, w, h), rt2, Rect(0, 0, w / 2, h / 2));
-
-            w /= 2;
-            h /= 2;
-            _downsample *= 2;
-#endif
-
-#if 0
-
-            rt = getRTManager().get(w / 2, h / 2, _pp._format);
-            _pp._rt = rt;
-            pass(rt2, Rect(0, 0, w, h), rt, Rect(0, 0, w / 2, h / 2));
-
-            w /= 2;
-            h /= 2;
-            _downsample *= 2;
-#endif
-
-
-            Rect rc(0, 0, w, h);
-
-
-            driver->setShaderProgram(PostProcess::shaderBlurH);
-            driver->setUniform("step", 1.0f / rt->getWidth());
-            pass(rt, rc, rt2, rc);
-
-
-            int alpha = lerp(255, 0, _progress);
-
-            Color c = _color.withAlpha(alpha).premultiplied();
-
-            driver->setShaderProgram(PostProcess::shaderBlurV);
-            driver->setUniform("step", 1.0f / rt2->getHeight());
-
-            pass(rt2, rc, rt, rc, c);
-        }
-    };
-
-
     class TweenAlphaFadeImpl : public TweenPostProcess
     {
     public:
@@ -606,20 +35,7 @@ namespace oxygine
     };
 
 
-
-
-
-
-
-
-
-
-
     TweenAlphaFade::TweenAlphaFade(bool fadeIn, const PostProcessOptions& opt): TweenProxy(new TweenAlphaFadeImpl(fadeIn, opt))
     {
     }
-
-    TweenOutline::TweenOutline(const Color& color, const PostProcessOptions& opt) : TweenProxy(new TweenOutlineImpl(color, opt))
-    {
-    }
 }

+ 1 - 30
oxygine/src/TweenAlphaFade.h

@@ -1,39 +1,10 @@
 #pragma once
 #include "oxygine_include.h"
 #include "Tween.h"
-#include "STDMaterial.h"
-#include "core/NativeTexture.h"
-#include "Actor.h"
-#include "core/oxygine.h"
-#include "RenderState.h"
+#include "PostProcess.h"
 
 namespace oxygine
 {
-    class PostProcessOptions
-    {
-    public:
-        enum
-        {
-            flag_singleR2T = 1,
-            flag_fullscreen = 1 << 1,
-        };
-
-        PostProcessOptions(int flags = 0): _flags(flags), _downscale(1) {}
-        PostProcessOptions& fullscreen(bool enable = true) { _flags = enable ? (_flags | flag_fullscreen) : (_flags  & (~flag_fullscreen)); return *this; }
-        PostProcessOptions& singleRender(bool enable = true) { _flags = enable ? (_flags | flag_singleR2T) : (_flags  & (~flag_singleR2T)); return *this; }
-        //loops -(2, 3, 4, ...),  final size: 2^loops
-        PostProcessOptions& downscale(int loops = 2) { _downscale = loops; return *this; }
-
-        int _flags;
-        int _downscale;
-    };
-
-    class TweenOutline : public TweenProxy
-    {
-    public:
-        TweenOutline(const Color& color, const PostProcessOptions& opt = PostProcessOptions());
-    };
-
     class TweenAlphaFade: public TweenProxy
     {
     public:

+ 0 - 0
oxygine/src/TweenGlow.cpp


+ 0 - 0
oxygine/src/TweenGlow.h


+ 161 - 0
oxygine/src/TweenOutline.cpp

@@ -0,0 +1,161 @@
+#include "TweenOutline.h"
+#include "STDMaterial.h"
+#include "Actor.h"
+#include "RenderState.h"
+
+#include "core/gl/VertexDeclarationGL.h"
+#include "core/gl/ShaderProgramGL.h"
+#include "core/file.h"
+
+
+namespace oxygine
+{
+
+
+
+    class TweenOutlineImpl : public TweenPostProcess
+    {
+    public:
+        Color _color;
+        int _downsample;
+
+        TweenOutlineImpl(const Color& c, const PostProcessOptions& opt) : TweenPostProcess(opt), _color(c), _downsample(1) {}
+
+        void render(Actor* actor, const RenderState& rs) OVERRIDE
+        {
+            STDMaterial* mat = STDMaterial::instance;
+            STDRenderer* renderer = mat->getRenderer();
+
+            RectF src(0, 0,
+            _pp._screen.getWidth() / (float)_pp._rt->getWidth() / _downsample,
+            _pp._screen.getHeight() / (float)_pp._rt->getHeight() / _downsample);
+
+            RectF dest = _pp._screen.cast<RectF>();
+
+            renderer->setBlendMode(blend_premultiplied_alpha);
+
+
+            AffineTransform tr = _pp._transform * _actor->computeGlobalTransform();
+            renderer->setTransform(tr);
+            renderer->beginElementRendering(true);
+            Color color = Color(Color::White).withAlpha(255).premultiplied();
+            renderer->drawElement(_pp._rt, color.rgba(), src, dest);
+            renderer->drawBatch();
+
+
+            RenderState r = rs;
+            r.material = mat;
+            actor->setMaterial(_prevMaterial);
+            actor->render(r);
+            actor->setMaterial(this);
+        }
+
+        void _renderPP() OVERRIDE
+        {
+            IVideoDriver* driver = IVideoDriver::instance;
+
+            const VertexDeclarationGL* decl = static_cast<const VertexDeclarationGL*>(IVideoDriver::instance->getVertexDeclaration(vertexPCT2::FORMAT));
+
+            if (!PostProcess::shaderBlurH)
+            {
+                file::buffer vs_h;
+                file::buffer vs_v;
+                file::buffer fs_blur;
+                file::read("pp_hblur_vs.glsl", vs_h);
+                file::read("pp_vblur_vs.glsl", vs_v);
+                file::read("pp_rast_fs.glsl", fs_blur);
+
+                vs_h.push_back(0);
+                vs_v.push_back(0);
+                fs_blur.push_back(0);
+
+
+                unsigned int h = ShaderProgramGL::createShader(GL_VERTEX_SHADER, (const char*)&vs_h.front(), "", "");
+                unsigned int v = ShaderProgramGL::createShader(GL_VERTEX_SHADER, (const char*)&vs_v.front(), "", "");
+                unsigned int ps = ShaderProgramGL::createShader(GL_FRAGMENT_SHADER, (const char*)&fs_blur.front(), "", "");
+
+
+                PostProcess::shaderBlurV = new ShaderProgramGL(ShaderProgramGL::createProgram(v, ps, decl));
+                driver->setShaderProgram(PostProcess::shaderBlurV);
+                driver->setUniformInt("s_texture", 0);
+
+                PostProcess::shaderBlurH = new ShaderProgramGL(ShaderProgramGL::createProgram(h, ps, decl));
+                driver->setShaderProgram(PostProcess::shaderBlurH);
+                driver->setUniformInt("s_texture", 0);
+
+
+                file::buffer vs_blit;
+                file::buffer fs_blit;
+                file::read("pp_blit_vs.glsl", vs_blit);
+                file::read("pp_blit_fs.glsl", fs_blit);
+
+                vs_blit.push_back(0);
+                fs_blit.push_back(0);
+
+
+                unsigned int vs = ShaderProgramGL::createShader(GL_VERTEX_SHADER, (const char*)&vs_blit.front(), "", "");
+                unsigned int fs = ShaderProgramGL::createShader(GL_FRAGMENT_SHADER, (const char*)&fs_blit.front(), "", "");
+
+                PostProcess::shaderBlit = new ShaderProgramGL(ShaderProgramGL::createProgram(vs, fs, decl));
+                driver->setShaderProgram(PostProcess::shaderBlit);
+                driver->setUniformInt("s_texture", 0);
+            }
+
+
+            int w = _pp._screen.size.x;
+            int h = _pp._screen.size.y;
+
+
+            driver->setState(IVideoDriver::STATE_BLEND, 0);
+
+            _downsample = 1;
+
+
+            spNativeTexture rt = _pp._rt;
+            spNativeTexture rt2 = getRTManager().get(0, w, h, _pp._format);
+
+#if 0
+            driver->setShaderProgram(PostProcess::shaderBlit);
+            pass(rt, Rect(0, 0, w, h), rt2, Rect(0, 0, w / 2, h / 2));
+
+            w /= 2;
+            h /= 2;
+            _downsample *= 2;
+#endif
+
+#if 0
+
+            rt = getRTManager().get(w / 2, h / 2, _pp._format);
+            _pp._rt = rt;
+            pass(rt2, Rect(0, 0, w, h), rt, Rect(0, 0, w / 2, h / 2));
+
+            w /= 2;
+            h /= 2;
+            _downsample *= 2;
+#endif
+
+
+            Rect rc(0, 0, w, h);
+
+
+            driver->setShaderProgram(PostProcess::shaderBlurH);
+            driver->setUniform("step", 1.0f / rt->getWidth());
+            pass(rt, rc, rt2, rc);
+
+
+            int alpha = lerp(255, 0, _progress);
+
+            Color c = _color.withAlpha(alpha).premultiplied();
+
+            driver->setShaderProgram(PostProcess::shaderBlurV);
+            driver->setUniform("step", 1.0f / rt2->getHeight());
+
+            pass(rt2, rc, rt, rc, c);
+        }
+    };
+
+
+    TweenOutline::TweenOutline(const Color& color, const PostProcessOptions& opt) : TweenProxy(new TweenOutlineImpl(color, opt))
+    {
+    }
+}

+ 12 - 0
oxygine/src/TweenOutline.h

@@ -0,0 +1,12 @@
+#pragma once
+#include "oxygine_include.h"
+#include "PostProcess.h"
+
+namespace oxygine
+{
+    class TweenOutline : public TweenProxy
+    {
+    public:
+        TweenOutline(const Color& color, const PostProcessOptions& opt = PostProcessOptions());
+    };
+}

+ 0 - 4
oxygine/src/Tweener.h

@@ -1,4 +0,0 @@
-#pragma once
-//Tweener.h header was deprecated
-//You should include Tween.h
-#include "Tween.h"

+ 5 - 4
oxygine/src/core/oxygine.cpp

@@ -23,6 +23,7 @@
 #include "gl/oxgl.h"
 #include "winnie_alloc/winnie_alloc.h"
 #include "ThreadMessages.h"
+#include "PostProcess.h"
 
 #ifdef __S3E__
 #include "s3e.h"
@@ -86,9 +87,6 @@ namespace oxygine
         void free();
     }
 
-
-    void renderPostProcessItems();
-
     IVideoDriver::Stats _videoStats;
 
     static ThreadMessages _threadMessages;
@@ -505,6 +503,7 @@ namespace oxygine
         void reset()
         {
             log::messageln("core::reset()");
+            clearPostProcessItems();
             Restorable::releaseAll();
             STDRenderer::reset();
             IVideoDriver::instance->reset();
@@ -539,7 +538,7 @@ namespace oxygine
             bool ready = STDRenderer::isReady();
             if (ready)
             {
-                renderPostProcessItems();
+                updatePortProcessItems();
             }
 
             return ready;
@@ -764,6 +763,8 @@ namespace oxygine
 
         void release()
         {
+            clearPostProcessItems();
+
             Event ev(EVENT_EXIT);
             _dispatcher->dispatchEvent(&ev);
 

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

@@ -33,7 +33,6 @@
 #include "Sprite.h"
 #include "MaskedSprite.h"
 #include "TextField.h"
-#include "TextActor.h"//deprecated
 #include "TextStyle.h"
 #include "Tween.h"
 #include "TweenQueue.h"