Browse Source

improved render2texture example with Eraser demo

dmuratshin 9 years ago
parent
commit
4620d4eefa

BIN
examples/Demo/data/images/brush_eraser.png


File diff suppressed because it is too large
+ 0 - 0
examples/Demo/data/res.xml.ox/meta.xml


+ 2 - 0
examples/Demo/data/xmls/res.xml

@@ -7,6 +7,8 @@
 	<atlas id = "primary" format="8888">
 	<atlas id = "primary" format="8888">
 		<image file="gray.png"/>
 		<image file="gray.png"/>
 		<image file="brush.png"/>
 		<image file="brush.png"/>
+
+		<image file="brush_eraser.png"/>
 		<image file="palette.png"/>		
 		<image file="palette.png"/>		
 		<image file="snow.png"/>
 		<image file="snow.png"/>
 		<image file="edges.png"/>
 		<image file="edges.png"/>

+ 25 - 5
examples/Demo/src/TestRender2Texture.h

@@ -13,6 +13,14 @@ public:
     {
     {
         notify("touch to draw", 100000);
         notify("touch to draw", 100000);
 
 
+
+        spSprite back = new Sprite;
+        back->setResAnim(resources.getResAnim("bg"));
+        back->attachTo(content);
+        back->setPosition(content->getSize() / 2 - back->getSize() / 2);
+
+
+
         color = Color(255, 255, 255, 32);
         color = Color(255, 255, 255, 32);
 
 
         Vector2 size = content->getSize();
         Vector2 size = content->getSize();
@@ -27,14 +35,16 @@ public:
         AnimationFrame frame;
         AnimationFrame frame;
         Diffuse df;
         Diffuse df;
         df.base = texture;
         df.base = texture;
+        df.premultiplied = false;
         frame.init(0, df,
         frame.init(0, df,
                    RectF(0, 0, size.x / texture->getWidth(), size.y / texture->getHeight()),
                    RectF(0, 0, size.x / texture->getWidth(), size.y / texture->getHeight()),
                    RectF(Vector2(0, 0), size), size);
                    RectF(Vector2(0, 0), size), size);
         preview->setAnimFrame(frame);
         preview->setAnimFrame(frame);
-        preview->setBlendMode(blend_disabled);
+
 
 
         content->addEventListener(TouchEvent::MOVE, CLOSURE(this, &TestRender2Texture::onMove));
         content->addEventListener(TouchEvent::MOVE, CLOSURE(this, &TestRender2Texture::onMove));
         content->addEventListener(TouchEvent::TOUCH_DOWN, CLOSURE(this, &TestRender2Texture::onDown));
         content->addEventListener(TouchEvent::TOUCH_DOWN, CLOSURE(this, &TestRender2Texture::onDown));
+
     }
     }
 
 
     void onDown(Event* ev)
     void onDown(Event* ev)
@@ -46,7 +56,9 @@ public:
     void onMove(Event* ev)
     void onMove(Event* ev)
     {
     {
         TouchEvent* te = (TouchEvent*)ev;
         TouchEvent* te = (TouchEvent*)ev;
-        if (!te->getPointer()->isPressed())
+        bool left = te->getPointer()->isPressed();
+        bool right = te->getPointer()->isPressed(MouseButton_Right);
+        if (!left && !right)
             return;
             return;
 
 
         STDRenderer& renderer = *STDRenderer::instance;
         STDRenderer& renderer = *STDRenderer::instance;
@@ -65,11 +77,19 @@ public:
         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));
 
 
-        ResAnim* brush = resources.getResAnim("brush");
+        ResAnim* brush = resources.getResAnim(left ? "brush" : "brush_eraser");
         AnimationFrame frame = brush->getFrame(0);
         AnimationFrame frame = brush->getFrame(0);
         const Diffuse& df = frame.getDiffuse();
         const Diffuse& df = frame.getDiffuse();
-        renderer.setTexture(df.base, 0, true);
-        renderer.setBlendMode(blend_premultiplied_alpha);
+        renderer.setTexture(df.base, 0);
+        if (left)
+            renderer.setBlendMode(blend_premultiplied_alpha);
+        else
+        {
+            color = Color::White;
+            renderer.setBlendMode(blend_erase);
+        }
+
+
         renderer.draw(color, frame.getSrcRect(), destRect);
         renderer.draw(color, frame.getSrcRect(), destRect);
         renderer.end();
         renderer.end();
 #else
 #else

+ 6 - 0
oxygine/src/STDRenderer.cpp

@@ -434,12 +434,18 @@ namespace oxygine
                 case blend_add:
                 case blend_add:
                     _driver->setBlendFunc(IVideoDriver::BT_ONE, IVideoDriver::BT_ONE);
                     _driver->setBlendFunc(IVideoDriver::BT_ONE, IVideoDriver::BT_ONE);
                     break;
                     break;
+                case blend_screen:
+                    _driver->setBlendFunc(IVideoDriver::BT_ONE, IVideoDriver::BT_ONE_MINUS_SRC_COLOR);
+                    break;
                 case blend_multiply:
                 case blend_multiply:
                     _driver->setBlendFunc(IVideoDriver::BT_DST_COLOR, IVideoDriver::BT_ONE_MINUS_SRC_ALPHA);
                     _driver->setBlendFunc(IVideoDriver::BT_DST_COLOR, IVideoDriver::BT_ONE_MINUS_SRC_ALPHA);
                     break;
                     break;
                 case blend_inverse:
                 case blend_inverse:
                     _driver->setBlendFunc(IVideoDriver::BT_ONE_MINUS_DST_COLOR, IVideoDriver::BT_ZERO);
                     _driver->setBlendFunc(IVideoDriver::BT_ONE_MINUS_DST_COLOR, IVideoDriver::BT_ZERO);
                     break;
                     break;
+                case blend_erase:
+                    _driver->setBlendFunc(IVideoDriver::BT_ONE, IVideoDriver::BT_ZERO);
+                    break;
 
 
                 //case blend_sub:
                 //case blend_sub:
                 //_driver->setBlendFunc(IVideoDriver::BT_ONE, IVideoDriver::BT_ONE);
                 //_driver->setBlendFunc(IVideoDriver::BT_ONE, IVideoDriver::BT_ONE);

+ 2 - 0
oxygine/src/core/Renderer.h

@@ -24,8 +24,10 @@ namespace oxygine
         blend_premultiplied_alpha,
         blend_premultiplied_alpha,
         blend_alpha,
         blend_alpha,
         blend_add,
         blend_add,
+		blend_screen,
         blend_multiply,
         blend_multiply,
         blend_inverse,
         blend_inverse,
+		blend_erase,
     };
     };
 
 
 
 

Some files were not shown because too many files changed in this diff