Browse Source

refactoring pp

dmuratshin 9 years ago
parent
commit
c5ce4046ea

+ 1 - 1
examples/Demo/proj.win32/Demo.vcxproj

@@ -146,7 +146,7 @@
     <ClInclude Include="../src/test.h" />
     <ClInclude Include="..\src\TestEdges.h" />
     <ClInclude Include="..\src\TestTweenAlphaFade.h" />
-    <ClInclude Include="..\src\TestTweenGlow.h" />
+    <ClInclude Include="..\src\TestTweenPostProcessing.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">

+ 1 - 1
examples/Demo/proj.win32/Demo.vcxproj.filters

@@ -35,7 +35,7 @@
     <ClInclude Include="../src/example.h" />
     <ClInclude Include="../src/test.h" />
     <ClInclude Include="..\src\TestTweenAlphaFade.h" />
-    <ClInclude Include="..\src\TestTweenGlow.h" />
     <ClInclude Include="..\src\TestEdges.h" />
+    <ClInclude Include="..\src\TestTweenPostProcessing.h" />
   </ItemGroup>
 </Project>

+ 2 - 2
examples/Demo/src/TestTweenGlow.h → examples/Demo/src/TestTweenPostProcessing.h

@@ -4,11 +4,11 @@
 #undef OUT
 
 
-class TestTweenGlow : public Test
+class TestTweenPostProcessing : public Test
 {
 public:
     spActor _test;
-    TestTweenGlow()
+    TestTweenPostProcessing()
     {
         spSprite sprite = new Sprite;
         sprite->setResAnim(resources.getResAnim("t2p"));

+ 3 - 3
examples/Demo/src/example.cpp

@@ -26,7 +26,7 @@
 #include "TestTouches.h"
 #include "TestColorFont.h"
 #include "TestTweenAlphaFade.h"
-#include "TestTweenGlow.h"
+#include "TestTweenPostProcessing.h"
 
 #ifdef __S3E__
 #include "s3eKeyboard.h"
@@ -82,7 +82,7 @@ public:
         addButton("openbrowser", "Open Browser");
         addButton("http", "Http requests");
         addButton("tweenfade", "Tween Alpha Fade");
-        addButton("tweenglow", "Tween Glow");
+        addButton("tweenpp", "Post Processing Tweens");
 
         _color = Color::Red;
         _txtColor = Color::White;
@@ -133,7 +133,7 @@ public:
         if (id == "tweenshine") showTest(new TestTweenShine);
         if (id == "multicolorfont") showTest(new TestColorFont);
         if (id == "tweenfade") showTest(new TestTweenAlphaFade);
-        if (id == "tweenglow") showTest(new TestTweenGlow);
+        if (id == "tweenpp") showTest(new TestTweenPostProcessing);
         if (id == "openbrowser")
         {
             core::execute("http://oxygine.org/");

+ 69 - 0
oxygine/src/PostProcess.cpp

@@ -1,9 +1,11 @@
 #include "PostProcess.h"
 #include "Actor.h"
 #include "core/gl/VertexDeclarationGL.h"
+#include "core/gl/ShaderProgramGL.h"
 #include "core/oxygine.h"
 #include "RenderState.h"
 #include "STDMaterial.h"
+#include "core/file.h"
 
 namespace oxygine
 {
@@ -11,7 +13,69 @@ namespace oxygine
     ShaderProgram* PostProcess::shaderBlurH = 0;
     ShaderProgram* PostProcess::shaderBlit = 0;
 
+    void PostProcess::initShaders()
+    {
+        if (PostProcess::shaderBlurH)
+            return;
+
+        const VertexDeclarationGL* decl = static_cast<const VertexDeclarationGL*>(IVideoDriver::instance->getVertexDeclaration(vertexPCT2::FORMAT));
+
+        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(), "", "");
+
+
+        IVideoDriver* driver = IVideoDriver::instance;
+
+        shaderBlurV = new ShaderProgramGL(ShaderProgramGL::createProgram(v, 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 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(), "", "");
+
+        shaderBlit = new ShaderProgramGL(ShaderProgramGL::createProgram(vs, fs, decl));
+        driver->setShaderProgram(shaderBlit);
+        driver->setUniformInt("s_texture", 0);
+    }
+
+    void PostProcess::freeShaders()
+    {
+        delete shaderBlit;
+        shaderBlit = 0;
+
+        delete shaderBlurH;
+        shaderBlurH = 0;
+
+        delete shaderBlurV;
+        shaderBlurV = 0;
+    }
 
     const int ALIGN_SIZE = 256;
     const int TEXTURE_LIVE = 3000;
@@ -92,7 +156,11 @@ namespace oxygine
         w = alignTextureSize(w);
         h = alignTextureSize(h);
         if (isGood(current, w, h, tf))
+        {
+            current->setUserData((void*)getTimeMS());
             return current;
+        }
+
 
         spNativeTexture result;
 
@@ -180,6 +248,7 @@ namespace oxygine
         if (!postProcessItems.empty())
         {
             IVideoDriver* driver = IVideoDriver::instance;
+            driver->setState(IVideoDriver::STATE_BLEND, 0);
             spNativeTexture prevRT = driver->getRenderTarget();
 
             for (size_t i = 0; i < postProcessItems.size(); ++i)

+ 3 - 0
oxygine/src/PostProcess.h

@@ -41,6 +41,9 @@ namespace oxygine
         static ShaderProgram* shaderBlurH;
         static ShaderProgram* shaderBlit;
 
+        static void initShaders();
+        static void freeShaders();
+
         PostProcess(const PostProcessOptions& opt);
         ~PostProcess();
 

+ 4 - 52
oxygine/src/TweenOutline.cpp

@@ -4,8 +4,7 @@
 #include "RenderState.h"
 
 #include "core/gl/VertexDeclarationGL.h"
-#include "core/gl/ShaderProgramGL.h"
-#include "core/file.h"
+
 
 
 namespace oxygine
@@ -52,61 +51,14 @@ namespace oxygine
 
         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);
-            }
-
+            PostProcess::initShaders();
 
             int w = _pp._screen.size.x;
             int h = _pp._screen.size.y;
 
 
-            driver->setState(IVideoDriver::STATE_BLEND, 0);
+            IVideoDriver* driver = IVideoDriver::instance;
+            const VertexDeclarationGL* decl = static_cast<const VertexDeclarationGL*>(IVideoDriver::instance->getVertexDeclaration(vertexPCT2::FORMAT));
 
             _downsample = 1;
 

+ 2 - 0
oxygine/src/core/oxygine.cpp

@@ -505,6 +505,7 @@ namespace oxygine
             log::messageln("core::reset()");
             clearPostProcessItems();
             Restorable::releaseAll();
+            PostProcess::freeShaders();
             STDRenderer::reset();
             IVideoDriver::instance->reset();
             log::messageln("core::reset() done");
@@ -764,6 +765,7 @@ namespace oxygine
         void release()
         {
             clearPostProcessItems();
+            PostProcess::freeShaders();
 
             Event ev(EVENT_EXIT);
             _dispatcher->dispatchEvent(&ev);