dmuratshin 8 лет назад
Родитель
Сommit
85f5eddf93
3 измененных файлов с 39 добавлено и 15 удалено
  1. 1 14
      examples/Demo/src/TestRender2Texture.h
  2. 32 0
      oxygine/src/STDRenderer.cpp
  3. 6 1
      oxygine/src/STDRenderer.h

+ 1 - 14
examples/Demo/src/TestRender2Texture.h

@@ -62,19 +62,9 @@ public:
             return;
 
         STDRenderer& renderer = *STDRenderer::instance;
-        IVideoDriver* driver = IVideoDriver::instance;
-
-
-        Rect viewport(Point(0, 0), content->getSize().cast<Point>());
-        renderer.initCoordinateSystem(viewport.getWidth(), viewport.getHeight(), true);
-
-        spNativeTexture previousRT = driver->getRenderTarget();
-
-        driver->setRenderTarget(texture);
-        driver->setViewport(viewport);
 
 #if 1
-        renderer.begin(0);
+        renderer.begin(texture);
         RectF destRect(te->localPosition - Vector2(16, 16), Vector2(32, 32));
 
         ResAnim* brush = resources.getResAnim(left ? "brush" : "brush_eraser");
@@ -105,8 +95,5 @@ public:
         actor->render(rs);
         Material::setCurrent(0);
 #endif
-
-        //restore to default render target
-        driver->setRenderTarget(previousRT);
     }
 };

+ 32 - 0
oxygine/src/STDRenderer.cpp

@@ -264,6 +264,7 @@ namespace oxygine
 
     void STDRenderer::begin(STDRenderer* prev)
     {
+        //OX_ASSERT(!_drawing);
         OX_ASSERT(_vertices.empty() == true);
         _previous = prev;
         if (_previous)
@@ -278,12 +279,22 @@ namespace oxygine
         resetSettings();
 
         _begin();
+
+        _drawing = true;
     }
 
     void STDRenderer::end()
     {
         drawBatch();
 
+        if (_prevRT)
+        {
+            _driver->setRenderTarget(_prevRT);
+            _prevRT = 0;
+        }
+
+        _drawing = false;
+
         if (_previous)
             _previous->begin(0);
     }
@@ -393,6 +404,7 @@ namespace oxygine
 
         _uberShader = &uberShader;
         _transform.identity();
+        _drawing = false;
     }
 
     void STDRenderer::setBlendMode(blend_mode blend)
@@ -503,6 +515,26 @@ namespace oxygine
         _blend = blend_disabled;
     }
 
+    void STDRenderer::begin(spNativeTexture nt, const Rect *viewport)
+    {
+        OX_ASSERT(!_drawing);
+        OX_ASSERT(_prevRT == 0);
+        _prevRT = _driver->getRenderTarget();
+        _driver->setRenderTarget(nt);
+
+        Rect vp;
+        if (!viewport)
+        {
+            vp = Rect(0, 0, nt->getWidth(), nt->getHeight());
+            viewport = &vp;
+        }
+        _driver->setViewport(*viewport);
+
+
+        initCoordinateSystem(viewport->getWidth(), viewport->getHeight(), true);
+        begin();
+    }
+
     void STDRenderer::_resetSettings()
     {
         _blend = blend_disabled;

+ 6 - 1
oxygine/src/STDRenderer.h

@@ -63,7 +63,8 @@ namespace oxygine
         void drawBatch();
 
         /**Begins rendering into RenderTexture or into primary framebuffer if rt is null*/
-        void begin(STDRenderer* prev);
+        void begin(STDRenderer* prev = 0);
+        void begin(spNativeTexture nt, const Rect *viewport = 0);
         /**Completes started rendering and restores previous Frame Buffer.*/
         void end();
         /**initializes View + Projection matrices where TopLeft is (0,0) and RightBottom is (width, height). use flipU = true for render to texture*/
@@ -112,6 +113,10 @@ namespace oxygine
 
         UberShaderProgram* _uberShader;
         unsigned int _shaderFlags;
+
+        bool _drawing;
+
+        spNativeTexture _prevRT;
     };