Небольшой шоукейс того, что я могу написать за 2.5 месяца для хроники. Для справки использовались сорцы движка Hazel (сильно)

https://github.com/TheCherno/Hazel

и сорцы MxEngine (немношк).

https://github.com/asc-community/MxEngine

Для начала что есть в основе (последовательность случайна):

  1. Адекватный event-system работающий не на наследовании (слава Богу) и не на function pointers/лямбдах (почти), а на композиции(слоях) + диспатчинге. Типа такого:

    void Application::OnEvent(Event& event)
    {
        EventDispatcher dispatcher{ event };
        dispatcher.Dispatch<WindowClosedEvent>(LT_BIND_EVENT_FN(Application::OnWindowClosed));
        dispatcher.Dispatch<WindowResizedEvent>(LT_BIND_EVENT_FN(Application::OnWindowResized));
    
        for (auto it = m_LayerStack.rbegin(); it != m_LayerStack.rend(); it++)
        {
            if (event.Handled)
                break;
            (*it)->OnEvent(event);
        }
    }
    
  2. Платформенная независимость, а точнее основа для нее (реализации только для винды).

  3. Логгер. Типа обертка над библиотекой spdlog, но с кастомным синком вывода на экран эдитора (2 пикча).

    Untitled

    Untitled

  4. Профайлер, вынесенный в отдельную либу. Супер базовый, основанный (+ украденный) на chromium tracing, но удобный.

    Untitled

  5. Entity component system. Обертка над entt.

  6. Какой-никакой native scripting. (Через такое неочевидное наследование, но я себя прощаю).

    class MyCoolScript : public ScriptableEntity
    {
    public:
        void OnCreate() override
        {
            LITHE_CORE_LOG_INFO("abbaba");
        }
    
        void OnDestroy() override
        {
    
        }
    
        void OnUpdate(const Timestep& ts) override
        {
            GetComponent<TransformComponent>().RotateX(-10.f * (float)ts);
        }
    };
    
    m_Sun = m_CurrentScene->CreateEntity("Dir light");
    m_Sun.AddComponent<DirLightComponent>();
    m_Sun.GetComponent<TransformComponent>().SetPosition({ 0, 3, 0 });
    m_Sun.AddComponent<NativeScriptComponent>().Bind<MyCoolScript>();
    
  7. Сгенерированный сайт с документацией, которой последним коммитам почти не досталось (но это самый задокументированный мой проект).

    Lithe: Main Page

Что есть в эдиторе:

  1. ImGui кнопочки-окошки, вьюпорт, гизмо.

  2. Интерфейс добавления, удаления, изменения компонентов, системой которого я oche горжусь. (Сам придумал решение с базовой метапрогой (тайплисты), но все же). Кусочек реализации тайплиста:

    template<class Hd, class... Tl, template<class T> class StaticFunctor>
    	struct ForEach<TypeList<Hd, Tl...>, StaticFunctor>
    	{
    	public:
            template<class... Args>
            static void Iterate(Args&& ...args)
            {
                StaticFunctor<Hd>::Call(std::forward<Args>(args)...);
    			ForEach<TypeList<Tl...>, StaticFunctor>::Iterate(std::forward<Args>(args)...);
            }
    	};
    
  3. Базовая статистика рендерера, типа фпс, вызовов отрисовки и т. п.

Чего нет в эдиторе, а оно там быть обязано:

  1. Интерфейса для большинства компонентов. (Поменять модельку, текстурку, )
  2. Mouse-picking, чтоб на вьюпорт тыкать и выделять, а не в иерархии.
  3. Интерфейса для недостающих фич из других разделов.