История работы над проектом
- 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
, меню - все элементы теперь строятся с использованием одного общего модуля.
- 2020 сентябрь. Работа над проектом заморожена на неопределнное время. Причина - невозможность реализовать идеи по работе с LOD. Поиск будет продолжаться.
В процессе работы над проектом изучено
- Построение, API и принципы работы с
OpenGL
.
- Применение математичеких матриц в 3D программировании.
- Керниган и Ритчи “Язык программирования С”.
- Бьярне Страуструп “Язык программирования C++”.
- Питер Готтшлинг “Современный С++”
- Дэвид Вольф “Open GL 4. Язык шейдеров”
- Шаблоны проектирования.