[email protected] пре 8 година
родитељ
комит
54a8ca4023

+ 1 - 0
oxygine/src/oxygine/MaterialX.cpp

@@ -6,6 +6,7 @@
 namespace oxygine
 {
     spMaterialX MaterialX::current;
+    spMaterialX MaterialX::null;
 
     bool STDMaterialX::cmp(const STDMaterialX& a, const STDMaterialX& b)
     {

+ 8 - 0
oxygine/src/oxygine/MaterialX.h

@@ -31,6 +31,7 @@ namespace oxygine
     public:
 
         static spMaterialX current;
+        static spMaterialX null;
 
         typedef bool(*compare)(const MaterialX* a, const MaterialX* b);
 
@@ -72,6 +73,13 @@ namespace oxygine
     typedef intrusive_ptr<MaterialX> spMaterialX;
 
 
+    class NullMaterialX : public MaterialX
+    {
+    public:
+        MATX(NullMaterialX);
+        static bool cmp(const NullMaterialX& a, const NullMaterialX& b) { return false; }
+        void rehash(size_t& hash) const override {}
+    };
 
     class STDMaterialX: public MaterialX
     {

+ 6 - 1
oxygine/src/oxygine/PostProcess.cpp

@@ -298,7 +298,7 @@ namespace oxygine
             Material::setCurrent(0);
 
             IVideoDriver* driver = IVideoDriver::instance;
-            driver->setState(IVideoDriver::STATE_BLEND, 0);
+            //driver->setState(IVideoDriver::STATE_BLEND, 0);
             spNativeTexture prevRT = driver->getRenderTarget();
 
             for (size_t i = 0; i < postProcessItems.size(); ++i)
@@ -398,6 +398,8 @@ namespace oxygine
 
 
         Material::setCurrent(0);
+        MaterialX::current = 0;
+
 
         IVideoDriver* driver = IVideoDriver::instance;
 
@@ -432,7 +434,10 @@ namespace oxygine
 
         rs.material->Material::render(actor, rs);
 
+        STDRenderer::current->flush();
+
         Material::setCurrent(0);
+        MaterialX::current = 0;
     }
 
 

+ 9 - 4
oxygine/src/oxygine/TweenAlphaFade.cpp

@@ -14,6 +14,11 @@ namespace oxygine
             if (!_pp._rt)
                 return;
 
+            spSTDMaterialX mat = new STDMaterialX;
+            mat->_base = _pp._rt;
+            mat->_blend = blend_premultiplied_alpha;
+            mat->apply();
+
             int _a = lerp(_fadeIn ? 0 : 255, _fadeIn ? 255 : 0, _progress);
             STDRenderer* renderer = STDRenderer::getCurrent();
 
@@ -23,14 +28,14 @@ namespace oxygine
                       _pp._screen.getHeight() / (float)rt->getHeight());
             RectF dest = _pp._screen.cast<RectF>();
 
-            renderer->setBlendMode(blend_premultiplied_alpha);
-            AffineTransform tr = _pp._transform * _actor->computeGlobalTransform();
 
+
+            AffineTransform tr = _pp._transform * _actor->computeGlobalTransform();
             renderer->setTransform(tr);
-            renderer->applySimpleMode(true);
+
+
             Color color = Color(Color::White).withAlpha(_a).premultiplied();
             renderer->draw(rt, color.rgba(), src, dest);
-            renderer->flush();
         }
 
         bool _fadeIn;

+ 15 - 9
oxygine/src/oxygine/TweenOutline.cpp

@@ -16,28 +16,34 @@ namespace oxygine
 
         void render(Actor* actor, const RenderState& rs) override
         {
-            STDMaterial* mat = STDMaterial::instance;
+            if (!_pp._rt)
+                return;
+
+            spSTDMaterialX mat = new STDMaterialX;
+            mat->_base = _pp._rt;
+            mat->_blend = blend_premultiplied_alpha;
+            mat->apply();
+
             STDRenderer* renderer = STDRenderer::getCurrent();
 
+            spNativeTexture rt = _pp._rt;
             RectF src(0, 0,
-                      _pp._screen.getWidth() / (float)_pp._rt->getWidth() / _downsample,
-                      _pp._screen.getHeight() / (float)_pp._rt->getHeight() / _downsample);
-
+                      _pp._screen.getWidth() / (float)rt->getWidth(),
+                      _pp._screen.getHeight() / (float)rt->getHeight());
             RectF dest = _pp._screen.cast<RectF>();
 
-            renderer->setBlendMode(blend_premultiplied_alpha);
 
 
             AffineTransform tr = _pp._transform * _actor->computeGlobalTransform();
             renderer->setTransform(tr);
-            renderer->applySimpleMode(true);
+
+
             Color color = Color(Color::White).withAlpha(255).premultiplied();
-            renderer->draw(_pp._rt, color.rgba(), src, dest);
-            renderer->flush();
+            renderer->draw(rt, color.rgba(), src, dest);
 
 
             RenderState r = rs;
-            r.material = mat;
+            r.material = STDMaterial::instance;
             actor->setMaterial(_prevMaterial);
             actor->render(r);
             actor->setMaterial(this);

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

@@ -492,6 +492,7 @@ namespace oxygine
 
             STDRenderer::instance = new STDRenderer;
             STDMaterial::instance = new STDMaterial;
+            MaterialX::null       = new NullMaterialX;
 
             STDRenderer::current = STDRenderer::instance;