Небольшой шоукейс того, что я могу написать за 2.5 месяца для хроники. Для справки использовались сорцы движка Hazel (сильно)
https://github.com/TheCherno/Hazel
и сорцы MxEngine (немношк).
https://github.com/asc-community/MxEngine
Адекватный 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);
}
}
Платформенная независимость, а точнее основа для нее (реализации только для винды).
Логгер. Типа обертка над библиотекой spdlog, но с кастомным синком вывода на экран эдитора (2 пикча).
Профайлер, вынесенный в отдельную либу. Супер базовый, основанный (+ украденный) на chromium tracing, но удобный.
Entity component system. Обертка над entt.
Какой-никакой 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>();
Сгенерированный сайт с документацией, которой последним коммитам почти не досталось (но это самый задокументированный мой проект).
ImGui кнопочки-окошки, вьюпорт, гизмо.
Интерфейс добавления, удаления, изменения компонентов, системой которого я 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)...);
}
};
Базовая статистика рендерера, типа фпс, вызовов отрисовки и т. п.