Browse Source

refactoring blend mode, now it could be easy customized

dmuratshin 9 years ago
parent
commit
d75b0d046d
2 changed files with 16 additions and 42 deletions
  1. 6 34
      oxygine/src/STDRenderer.cpp
  2. 10 8
      oxygine/src/core/Renderer.h

+ 6 - 34
oxygine/src/STDRenderer.cpp

@@ -420,43 +420,15 @@ namespace oxygine
         {
         {
             drawBatch();
             drawBatch();
 
 
-            switch (blend)
+            if (blend == 0)
             {
             {
-                case blend_disabled:
-                    _driver->setState(IVideoDriver::STATE_BLEND, 0);
-                    break;
-                case blend_premultiplied_alpha:
-                    _driver->setBlendFunc(IVideoDriver::BT_ONE, IVideoDriver::BT_ONE_MINUS_SRC_ALPHA);
-                    break;
-                case blend_alpha:
-                    _driver->setBlendFunc(IVideoDriver::BT_SRC_ALPHA, IVideoDriver::BT_ONE_MINUS_SRC_ALPHA);
-                    break;
-                case blend_add:
-                    _driver->setBlendFunc(IVideoDriver::BT_ONE, IVideoDriver::BT_ONE);
-                    break;
-                case blend_screen:
-                    _driver->setBlendFunc(IVideoDriver::BT_ONE, IVideoDriver::BT_ONE_MINUS_SRC_COLOR);
-                    break;
-                case blend_multiply:
-                    _driver->setBlendFunc(IVideoDriver::BT_DST_COLOR, IVideoDriver::BT_ONE_MINUS_SRC_ALPHA);
-                    break;
-                case blend_inverse:
-                    _driver->setBlendFunc(IVideoDriver::BT_ONE_MINUS_DST_COLOR, IVideoDriver::BT_ZERO);
-                    break;
-                case blend_erase:
-                    _driver->setBlendFunc(IVideoDriver::BT_ONE, IVideoDriver::BT_ZERO);
-                    break;
-
-                //case blend_sub:
-                //_driver->setBlendFunc(IVideoDriver::BT_ONE, IVideoDriver::BT_ONE);
-                //glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
-                //  break;
-                default:
-                    OX_ASSERT(!"unknown blend");
+                _driver->setState(IVideoDriver::STATE_BLEND, 0);
             }
             }
-
-            if (_blend == blend_disabled)
+            else
             {
             {
+                IVideoDriver::BLEND_TYPE src  = static_cast<IVideoDriver::BLEND_TYPE>(blend >> 16);
+                IVideoDriver::BLEND_TYPE dest = static_cast<IVideoDriver::BLEND_TYPE>(blend & 0xFFFF);
+                _driver->setBlendFunc(src, dest);
                 _driver->setState(IVideoDriver::STATE_BLEND, 1);
                 _driver->setState(IVideoDriver::STATE_BLEND, 1);
             }
             }
             _blend = blend;
             _blend = blend;

+ 10 - 8
oxygine/src/core/Renderer.h

@@ -18,16 +18,18 @@ namespace oxygine
 {
 {
     typedef AffineTransform Transform;
     typedef AffineTransform Transform;
 
 
+#define MAKE_BLEND_MODE(source, dest) ((IVideoDriver::BT_##source << 16) | (IVideoDriver::BT_##dest))
+
+
     enum blend_mode
     enum blend_mode
     {
     {
-        blend_disabled,
-        blend_premultiplied_alpha,
-        blend_alpha,
-        blend_add,
-        blend_screen,
-        blend_multiply,
-        blend_inverse,
-        blend_erase,
+        blend_disabled              = 0,
+        blend_premultiplied_alpha   = MAKE_BLEND_MODE(ONE, ONE_MINUS_SRC_ALPHA),
+        blend_alpha                 = MAKE_BLEND_MODE(SRC_ALPHA, ONE_MINUS_SRC_ALPHA),
+        blend_add                   = MAKE_BLEND_MODE(ONE, ONE),
+        blend_screen                = MAKE_BLEND_MODE(ONE, ONE_MINUS_SRC_COLOR),
+        blend_multiply              = MAKE_BLEND_MODE(DST_COLOR, ONE_MINUS_SRC_ALPHA),
+        blend_inverse               = MAKE_BLEND_MODE(ONE_MINUS_DST_COLOR, ZERO),
     };
     };