История работы над проектом

  • 2015 март. Начало воплощения идеи. Первые пробы на Python.
  • 2015 апрель. Подключение GLSL шейдеров. Процессы расчета координат и построения пространства выделены в отдельный поток от подпроцессов обработки ввода пользователя. Замеры скорости расчета и загрузки координат точек пространства на платформе Python показали неудовлетворительные результаты. Переход на cPython не принес ожидаемого эффекта. Попытки использовать в проекте новый язык программирования nimrod оказались неудачными из-за проблем взаимодействия с графическими С-библиотеками.
  • 2016 январь. Код проекта с нуля разрабатывается на C++.
  • 2016 февраль. Реализован в виде внешней библиотеки класс GLSL - программы и загрузки шейдеров.
  • 2016 апрель. GUI выделен в группу классов, взаимодействие с графическим ядром реализовано через класс интерфейса.
  • 2016 май. Графическое ядро с обработчиком событий ввода вынесено в отдельный поток.
  • 2016 май. В виде отдельной библиотеки реализована система регистрации сообщений отладки и журналирование событий
  • 2016 июнь. Выполнен расчет формата данных для хранения, поиска и обмена между сервером и клиентами.
  • 2016 июнь. Реализована мультиплатформенная мини-библиотека и класс для работы с UDP сокетами.
  • 2016 июнь. Реализован рабочий вариант интерфейса управления положением в пространстве.
  • 2016 июль. Первая сборка всего в комплексе. Общее тестирование построения логики работы движка.
  • 2016 август. Перенос кода в SFML. Большое число зависимостей от SDL2 - почти весь код надо переписывать.
  • 2016 октябрь. SFML понравился простотой и удобством, но разочаровал стабильностью и 3D функционалом.
  • 2016 ноябрь. Разработана обертка C++ к libpng для загрузки изображений.
  • 2016 ноябрь. Реализована поддержка вывода текста на базе libfreetype.
  • 2016 декабрь. Создание окна, контента и обработка событий полностью переведено на использование GLFW.
  • 2017 январь. GLSL шейдерами реализовано базовое освещение сцены.
  • 2017 февраль. Система сборки проекта переведена на cmake.
  • 2017 март. Перевод приложения на профиль сore OpenGL 3.3.
  • 2017 май. Тесты с геометрическим шейдером
  • 2017 июнь. Работа с дублирующим рендером и системами частиц.
  • 2017 июль. Реализован способ динамического изменения содержимого VBO буфера сцены.
  • 2017 август. Настроен рендер 3D сцены во фрейм-буфер.
  • 2017 сентябрь. Реализован рендер текста при помощи библиотеки Freetype.
  • 2017 ноябрь. Переделан основной алгоритм формирования виртуального пространства. В качестве базового элемента теперь используется четырехугольная поверхность (Snip), привязанная к объекту Rig, как опорной точке в 3D коодинатах.
  • 2017 декабрь. Реализован импорт текстурированых объектов из .OBJ файлов.
  • 2017 декабрь. Реализован класс работы с Sqlite3. Хранение настроек перенесено в базу даннх Sqlite.
  • 2018 январь. Разработаны и реализованы в коде базовые принципы построения и хранения геометрии виртуального пространства в реляционной базе данных
  • 2018 февраль. Подключена сетевая библиотека Enet и сделаны базовые элементы класса “обертки” для реализации клиент-серверной архитектуры приложения.
  • 2018 сентябрь. Реализованы классы клиент-серверной архитектуры, разработана консоль для ввода команд на базе ncurses.
  • 2018 ноябрь. Реализован собственный класс для создания и управления элементами графического интерфейса приложения.
  • 2018 ноябрь. Из-за проблем в работе с библиотекой freetype приложение переведено на использование текстурных шрифтов.
  • 2019 февраль. Полностью переработана логика построения объектов - в качестве базового элемента выбран параллелепипед.
  • 2019 май. Еще раз переделана логика построения объектов. Теперь пространство строится из разделяемых вокселей.
  • 2019 октябрь. Начата работа по уменьшению связности модулей. В первую очередь это необходимо для разделения работы движка по потокам.
  • 2019 ноябрь. Благодаря применению шаблона проектирования "Наблюдатель" удалось уменьшить связность и реализовать полностью независимый блок создания контекста OpenGL. Попутно удалось избавиться от общих объектов, через которые передавались данные из контекста OpenGL в разные части движка.
  • 2019 декабрь. Реализована многопоточность - теперь рендер сцены производится из одного потока, а операции обмена информацией с базой данных из другого.
  • 2020 январь. Отказался от текстурных шрифтов и снова подключил библиотеку freetype.
  • 2020 март. Доработан функционал многопоточности, выявлены и устранены причины “падения” приложения на разных графических драйверах. Больше всего работы оказалось с открытым драйвером nouveau под Linux.
  • 2020 май. Рендер шрифтов переведен на библиотеку nuclear.
  • 2020 июнь. Разработан отдельный модуль рендера шрифтов на основе библиотеки freetype.
  • 2020 июль. Принцип рендера шрифтов радикально изменен - теперь все символы строятся как отдельные объекты в 3D пространстве с использованием текстурных шрифтов.
  • 2020 август. Сборка проекта переведена на clang.
  • 2020 август. Полностью переработаны графические интерфейсы приложения. HUD, GUI, меню - все элементы теперь строятся с использованием одного общего модуля.

В процессе работы над проектом изучено

  • Построение, API и принципы работы с OpenGL.
  • Применение математичеких матриц в 3D программировании.
  • Керниган и Ритчи “Язык программирования С”.
  • Бьярне Страуструп “Язык программирования C++”.
  • Питер Готтшлинг “Современный С++”
  • Дэвид Вольф “Open GL 4. Язык шейдеров”
  • Шаблоны проектирования.