From cb8153ab83ebb422886ee4d11339e5cb1afb8aaa Mon Sep 17 00:00:00 2001 From: Dmitry Marakasov Date: Wed, 18 Dec 2013 06:12:32 +0400 Subject: [PATCH] Add rendertarget demo --- CMakeLists.txt | 1 + demo/rendertarget.cc | 119 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 demo/rendertarget.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index e03220f..edfc797 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,7 @@ IF(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) SET(DEMOS sprites lines + rendertarget ) FOREACH(DEMO ${DEMOS}) diff --git a/demo/rendertarget.cc b/demo/rendertarget.cc new file mode 100644 index 0000000..7147722 --- /dev/null +++ b/demo/rendertarget.cc @@ -0,0 +1,119 @@ +/* + libSDL2pp - C++ wrapper for libSDL2 + Copyright (C) 2013 Dmitry Marakasov + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include + +#include + +#include + +using namespace SDL2pp; + +#define RGBA(r, g, b, a) r, g, b, a +unsigned char pixels[4 * 4 * 4] = { + RGBA(0xff, 0x00, 0x00, 0xff), RGBA(0xff, 0x80, 0x00, 0xff), RGBA(0xff, 0xff, 0x00, 0xff), RGBA(0x80, 0xff, 0x00, 0xff), + RGBA(0xff, 0x00, 0x80, 0xff), RGBA(0xff, 0xff, 0xff, 0xff), RGBA(0x00, 0x00, 0x00, 0x00), RGBA(0x00, 0xff, 0x00, 0xff), + RGBA(0xff, 0x00, 0xff, 0xff), RGBA(0x00, 0x00, 0x00, 0x00), RGBA(0x00, 0x00, 0x00, 0xff), RGBA(0x00, 0xff, 0x80, 0xff), + RGBA(0x80, 0x00, 0xff, 0xff), RGBA(0x00, 0x00, 0xff, 0xff), RGBA(0x00, 0x80, 0xff, 0xff), RGBA(0x00, 0xff, 0xff, 0xff), +}; + +int Run() { + SDL sdl(SDL_INIT_VIDEO); + Window window("libSDL2pp demo: sprites", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_RESIZABLE); + Renderer render(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE); + render.SetDrawBlendMode(SDL_BLENDMODE_BLEND); + + // Necessary checks according to SDL docs + SDL_RendererInfo ri; + render.GetInfo(&ri); + + if (!(ri.flags & SDL_RENDERER_TARGETTEXTURE)) { + std::cerr << "Sorry, your renderer doesn't support texture targets" << std::endl; + return 1; + } + + // Sprite data + Texture sprite(render, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, 4, 4); + + sprite.Update(Rect::Null(), pixels, 4 * 4); + sprite.SetBlendMode(SDL_BLENDMODE_BLEND); + + // Two render target textures + Texture target1(render, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 512, 512); + target1.SetBlendMode(SDL_BLENDMODE_BLEND); + + Texture target2(render, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 512, 512); + target2.SetBlendMode(SDL_BLENDMODE_BLEND); + + while (1) { + // Process input + SDL_Event event; + while (SDL_PollEvent(&event)) + if (event.type == SDL_QUIT || (event.type == SDL_KEYDOWN && (event.key.keysym.sym == SDLK_ESCAPE || event.key.keysym.sym == SDLK_q))) + return 0; + + // Note we fill with transparent color, not black + render.SetDrawColor(0, 0, 0, 0); + + // Fill base texture with sprite texture + render.SetTarget(target1); + render.Clear(); + render.Copy(sprite); + + // Repeat several cycles of flip-flop tiling + for (int i = 0; i < 4; i++) { + render.SetTarget(target2); + render.Clear(); + render.Copy(target1, Rect::Null(), Rect(0, 0, 256, 256), SDL_GetTicks() / 10000.0 * 360.0); + render.Copy(target1, Rect::Null(), Rect(256, 0, 256, 256), SDL_GetTicks() / 10000.0 * 360.0); + render.Copy(target1, Rect::Null(), Rect(0, 256, 256, 256), SDL_GetTicks() / 10000.0 * 360.0); + render.Copy(target1, Rect::Null(), Rect(256, 256, 256, 256), SDL_GetTicks() / 10000.0 * 360.0); + + // Swap textures to copy recursively + target1.Swap(target2); + } + + // Draw result to screen + render.SetTarget(); + render.Clear(); + + render.Copy(target1, Rect::Null(), Rect(80, 0, 480, 480), SDL_GetTicks() / 10000.0 * 360.0); + + render.Present(); + + // Frame limiter + SDL_Delay(1); + } + + return 0; +} + +int main() { + try { + return Run(); + } catch (Exception& e) { + std::cerr << "Error: " << e.what() << " (" << e.GetSDLError() << ")" << std::endl; + } catch (std::exception& e) { + std::cerr << "Error: " << e.what() << std::endl; + } + + return -1; +}