美文网首页
Dragon Engine:层

Dragon Engine:层

作者: Dragon_boy | 来源:发表于2020-07-18 23:38 被阅读0次

本文同时发布在我的个人博客上:https://dragon_boy.gitee.io/

层的概念在许多软件中都存在,这里以PS中的为例。在PS中的层代表一个可显示的对象,对层可以执行许多不同的操作,窗口中的图像显示的层之间进行混合的结果。

这里我们借鉴这个概念定义层类:
Layer.h

#include "Dragon/Core/Core.h"
#include "Dragon/Core/Timestep.h"
#include "Dragon/Events/Event.h"

namespace Dragon
{
    class Layer
    {
    public:
        Layer(const std::string& name = "Layer");
        virtual ~Layer() = default;

        virtual void OnAttach() {}
        virtual void OnDetach() {}
        virtual void OnUpdate(Timestep ts) {}
        virtual void OnImGuiRender() {}
        virtual void OnEvent(Event& event){}

        inline const std::string& GetName() const { return m_DebugName; }
    private:
        std::string m_DebugName;
    };
}

该层类上有几个成员方法:绑定和解绑,用于是否显示该层。更新函数用于刷新该层的图像。OnImGuiRender()是该层上可以显示的GUI。接着是事件响应函数。最后是获得该层名的函数。

接着我们定义管理不同层的类,这里使用容器:
LayerStack.h

#include "Dragon/Core/Core.h"
#include "Layer.h"

#include <vector>

namespace Dragon
{
    class LayerStack
    {
    public:
        LayerStack();
        ~LayerStack();

        void PushLayer(Layer* layer);
        void PushOverlay(Layer* overlay);
        void PopLayer(Layer* layer);
        void PopOverlay(Layer* overlay);

        std::vector<Layer*>::iterator begin() { return m_Layers.begin(); }
        std::vector<Layer*>::iterator end() { return m_Layers.end(); }
    private:
        std::vector<Layer*> m_Layers;
        unsigned int m_LayerInsertIndex = 0;
    };
}

这里使用vector容器来存储层,并定义两个头尾迭代器方法。PushLayer和PopLayer方法是传统的入栈出栈方法:

    void LayerStack::PushLayer(Layer* layer)
    {
        m_Layers.emplace(m_Layers.begin() + m_LayerInsertIndex, layer);
        m_LayerInsertIndex++;
        layer->OnAttach();
    }
    void LayerStack::PopLayer(Layer* layer)
    {
        auto it = std::find(m_Layers.begin(), m_Layers.begin() + m_LayerInsertIndex, layer);
        if (it != m_Layers.end() + m_LayerInsertIndex)
        {
            layer->OnDetach();
            m_Layers.erase(it);
            m_LayerInsertIndex--;
        }
    }

PushLayer将层放到头+索引值的指定位置,然后绑定该层。PopLayer通过find()方法找到要弹出的层,然后解绑,擦除层。

PushOverlay和PopOverlay

    void LayerStack::PushOverlay(Layer* overlay)
    {
        m_Layers.emplace_back(overlay);
        overlay->OnAttach();
    }
    void LayerStack::PopOverlay(Layer* overlay)
    {
        auto it = std::find(m_Layers.begin() + m_LayerInsertIndex, m_Layers.end(), overlay);
        if (it != m_Layers.end())
        {
            overlay->OnDetach();
            m_Layers.erase(it);
        }
    }

PushOverlay方法在容器末尾添加一个层,PopOverLay方法在当前层索引和容器末尾间删除一个指定层。

简单来说上面的方法区别是正反加减层。

之后要使用层的时候,就是创建层之后插入LayerStack对象中,然后迭代就行。

下一节介绍窗口实现。

项目github地址(未完成):https://github.com/Dragon-Baby/Dragon

相关文章

  • Dragon Engine:层

    本文同时发布在我的个人博客上:https://dragon_boy.gitee.io/ 层的概念在许多软件中都存在...

  • Dragon Engine:Debug

    本文同时发布在我的个人博客上:https://dragon_boy.gitee.io Debug,或者说日志系统,...

  • Dragon Engine:窗口

    本节介绍窗口的实现。这里使用开源库GLFW,之前也介绍过,只不过这里的主要任务就是将GLFW的API抽象出来,方便...

  • Dragon Engine:GUI

    这一节介绍GUI的实现。我们这里使用开源库ImGui。 首先我们将GUI分离为一个单独的层,创建ImGuiLaye...

  • Dragon Engine:事件系统

    本文同时发布在我的个人博客上:https://dragon_boy.gitee.io 事件系统的范围很广,这里我暂...

  • Dragon Engine:编译项目

    编写大项目的时候,大部分文件可以复用,但构建项目的软件,使用的平台,可使用的外部资源因各种各不相同,所以大部分时候...

  • Dragon Engine:材质系统

    这一节介绍材质系统,主要是进行着色器类的抽象: 这里设计了两个类,一个着色器类,一个着色器库类。着色器类的成员函数...

  • Dragon Engine:纹理模块

    这一节介绍纹理模块的实现。首先是纹理类的抽象: 纹理基类的构造不用多说,这里衍生出了两个纹理类,2D和立方体贴图。...

  • Dragon Engine:帧缓冲

    之前相关的图形学文章介绍过,帧缓冲非常有用,可以用来实现Post-Processing效果,以及阴影效果等,在进行...

  • Dragon Engine:基础渲染架构

    本节的目的是在已有的基础上构建出一个基础渲染架构。主要任务就是抽象。 一个简单的渲染架构包含很多模块,我之前发了许...

网友评论

      本文标题:Dragon Engine:层

      本文链接:https://www.haomeiwen.com/subject/ispqkktx.html