AUI Framework  develop
Cross-platform base for C++ UI apps
Loading...
Searching...
No Matches
RenderHints.h
    1/*
    2 * AUI Framework - Declarative UI toolkit for modern C++20
    3 * Copyright (C) 2020-2025 Alex2772 and Contributors
    4 *
    5 * SPDX-License-Identifier: MPL-2.0
    6 *
    7 * This Source Code Form is subject to the terms of the Mozilla Public
    8 * License, v. 2.0. If a copy of the MPL was not distributed with this
    9 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
   10 */
   11
   12#pragma once
   13
   14#include <glm/glm.hpp>
   15#include <AUI/Views.h>
   16#include <AUI/Common/AColor.h>
   17#include <AUI/GL/gl.h>
   18#include "IRenderer.h"
   19
   20namespace RenderHints {
   28    template<aui::invocable Callable>
   29    static void pushMask(IRenderer& render, Callable&& maskRenderer) {
   30        render.pushMaskBefore();
   31        maskRenderer();
   32        render.pushMaskAfter();
   33    }
   34
   42    template<aui::invocable Callable>
   43    static void popMask(IRenderer& render, Callable&& maskRenderer) {
   44        render.popMaskBefore();
   45        maskRenderer();
   46        render.popMaskAfter();
   47    }
   48
   49    template<aui::invocable Callable>
   50    struct PushMask {
   51    public:
   52        inline explicit PushMask(IRenderer& render, Callable&& maskRenderer) :
   53                render(render),
   54                maskRenderer(std::forward<Callable>(maskRenderer)) {
   55            pushMask(render, std::forward<Callable>(maskRenderer));
   56        }
   57
   58        inline ~PushMask() {
   59            popMask(render, std::forward<Callable>(maskRenderer));
   60        }
   61
   62    private:
   63        IRenderer& render;
   64        Callable maskRenderer;
   65    };
   66
   67    struct PushMatrix {
   68    public:
   69        inline explicit PushMatrix(IRenderer& render) : render(render), stored(render.getTransform()) {
   70        }
   71
   72        inline ~PushMatrix() {
   73            render.setTransformForced(stored);
   74        }
   75
   76    private:
   77        IRenderer& render;
   78        glm::mat4 stored;
   79    };
   80
   81    struct PushColor {
   82    public:
   83        inline explicit PushColor(IRenderer& render): render(render), stored(render.getColor()) {
   84        }
   85
   86        inline ~PushColor() {
   87            render.setColorForced(stored);
   88        }
   89
   90    private:
   91        IRenderer& render;
   92        AColor stored;
   93    };
   94
   95    class PushState : PushColor, PushMatrix {
   96    public:
   97        inline explicit PushState(IRenderer& render): PushColor(render), PushMatrix(render) {}
   98    };
   99}
Represents a 4-component floating point color (RGBA).
Definition AColor.h:26
Base class for rendering.
Definition IRenderer.h:149
virtual void popMaskAfter()=0
Switches drawing to the color buffer back from the stencil. Decreases stencil depth.
virtual void popMaskBefore()=0
Switches drawing to the stencil buffer instead of color buffer.
virtual void pushMaskAfter()=0
Switches drawing to the color buffer back from the stencil. Increases stencil depth.
virtual void pushMaskBefore()=0
witches drawing to the stencil buffer instead of color buffer.