четверг, 28 декабря 2017 г.

Итоги года

Близится конец года, и, значит, настало время для очередного подведения итогов. К сожалению, в связи с постоянными разъездами и дипломной работой у меня было мало времени на хобби-проекты, но какой-то прогресс все же имеется.
  • Для Atrium был разработан новый графический движок Dagon на основе OpenGL 3.3 и SDL2, поддерживающий множество современных технологий, в том числе CSM и кластерный рендеринг.
  • Я написал ради развлечения симулятор автомобиля с использованием физического движка dmech - в итоге, этот код стал частью демонстрационного приложения Dagon.
  • Вышли несколько важных релизов коллекции библиотек dlib - 0.10, 0.11 и 0.12. Появились новые компоненты - например, dlib.async и dlib.memory, поддержка анимированных изображений и APNG, а также загрузчик формата HDR.
  • Вышли три номера журнала "FPS" (46, 47, 48). В 2018 году журналу исполняется уже 10 лет!
  • "Blender. Настольная книга" теперь доступна на GitHub - в виде markdown-исходников, автоматически публикующихся через gh-pages.
  • На сайте LightHouse Software вышла моя статья по D - Векторная графика в dlib.
Напоследок, по сложившейся традиции, перечислю самые значимые для меня события в мире CG, СПО и геймдева:
  • Бэкенд DMD был перелицензирован под лицензией Boost, что наконец-то сделало компилятор полностью свободным.
  • Начало разработки Blender 2.8 с новым фотореалистичным вьюпортом Eevee.
  • Выход OpenGL 4.6.
  • Закрытие Steam Greenlight.
  • Официальное прекращение развития Flash - важный шаг в сторону открытого веба.
  • Анонс нового открытого фильма от Blender Institure - "Agent 327".

вторник, 5 декабря 2017 г.

Motion blur

Работаю над реализацией размытия при движении:


Также доступна демка Dagon 0.6.0 со сборкой под Windows 64-bit. Сборки под остальные платформы будут в ближайшее время.

понедельник, 4 декабря 2017 г.

Dagon 0.6.0

Выпустил новую версию Dagon с экспериментальной поддержкой PBR и рендеринга в линейном цветовом пространстве. В данный момент PBR-материалы не поддерживают текстуры для металличности и шероховатости (принимаются только числовые значения), а также произвольные изображения для освещения среды, но вскоре это будет исправлено.


Также добавлена поддержка HDR-текстур, чтение ввода с джойстика, улучшены многие графические и служебные компоненты.

https://github.com/gecko0307/dagon/releases/tag/v0.6.0

Одновременно обновлена и демка движка - добавлена физика автомобиля, все материалы переведены на PBR. Релиз с готовыми сборками будет в ближайшее время.

вторник, 7 ноября 2017 г.

Dagon + физика автомобиля

Портировал свою автомобильную физику на свежий Dagon и добавил ее в основную демку движка. Чтобы переключиться на управление машиной, нужно подойти к ней и нажать Enter.


воскресенье, 29 октября 2017 г.

Векторная графика в dlib

На сайте LightHouse Software вышла очередная моя гостевая статья - "Векторая графика в dlib". Рассматривается рендеринг многоугольников и фигур Безье средствами dlib.image, dlib.math и dlib.geometry.

четверг, 26 октября 2017 г.

Dagon - обновленная демка

Как и обещал, выкладываю демку Dagon 0.5.0: релиз на GitHub. Есть готовые сборки для 32- и 64-битной Windows.


Пока пришлось отказаться от разделения на сцены с переключением через меню (теперь все, что демонстрировалось в отдельных сценах, объединено в одну), но в будущем я постараюсь это вернуть.

среда, 25 октября 2017 г.

Dagon 0.5.0

Портирование Dagon на OpenGL 3.3 наконец-то завершено - я решил ознаменовать это новым релизом. В данной версии, помимо общего рефакторинга многих компонентов движка, улучшены встроенные шейдеры, стабилизирован движок кластерного освещения, добавлены сферические источники света. Dagon все еще не вполне готов для перевода на него Atrium, но работа проведена колоссальная, и цель уже близка.


В ближайшее время ждите обновленную демку.

среда, 20 сентября 2017 г.

Облака

Моделирую новую тестовую сцену для Dagon. Добавил простейшие облака - две плоскости со скроллящимися текстурами и динамически рассчитываемым цветом в зависимости от положения солнца:


вторник, 19 сентября 2017 г.

Анимированные модели в Dagon/gl33

Портировал загрузчик формата IQM и реализовал рендеринг анимированных мешей:


Осталось только переписать систему частиц, и ветку gl33 можно будет сделать основной.

понедельник, 18 сентября 2017 г.

суббота, 16 сентября 2017 г.

Прогресс по Dagon/gl33

В ветке gl33 реализован кластерный рендеринг и шейдер неба. Добавлена оптимизация кластерного рендеринга, заключающаяся в том, чтобы хранить позиции источников света в world-space и не обновлять буферы, если источники света на сцене не меняются.


четверг, 14 сентября 2017 г.

Dagon 0.4.0 и прогресс по gl33

Выпустил новую версию Dagon - 0.4.0. Основное нововведение релиза - встроенные каскадные тени на основе массива текстур (поддержка обычных теневых карт удалена). Исправлен баг с parallax mapping, из-за которого сдвиг текстурных координат происходил для всех материалов, даже тех, которые не используют эту технику. Кроме того, появилась возможность отключать динамическии рассчитываемый цвет неба/фона. Движок теперь использует OpenGL 2.1.

Это последняя версия Dagon, использующая старый OpenGL - дальнейшая разработка будет сосредоточена на ветке gl33. Новый Dagon будет максимально совместим со старым, но будет несколько косметических изменений в некоторых интерфейсах. Картинка останется неизменной, все шейдеры напрямую портируются из старой кодовой базы.


В ветке gl33, между тем, реализованы вывод текста, постобработка, рендеринг теней, добавлен стандартный бэкенд материала BlinnPhongBackend, в котором реализованы normal mapping и parallax occlusion mapping. Демка ветки приближается по графике к сцене First Person из стандартного демонстрационного приложения Dagon.

среда, 13 сентября 2017 г.

Dagon + OpenGL 3.3

Рано или поздно я должен был перейти на современный OpenGL, и этот "час X" наступил. Поводом стали вскрывшиеся проблемы с расширением GL_EXT_gpu_shader4 для старых версий OpenGL на видеокартах AMD и Intel (плохо не иметь много разных конфигураций для тестов!). Решив больше не мучаться с расширениями в попытках сохранить совместимость с железом эпохи OpenGL 2.x, я начал портировать Dagon на OpenGL 3.3 core profile. Переход оказался не слишком сложным - движок почти не использует устаревшую функциональность и по архитектуре неплохо вписывается в современные версии стандарта. Разработка порта ведется в отдельной ветке - gl33. На данный момент готовы рендеринг статических мешей и загрузка текстур, а также заготовка для стандартных бэкендов материалов.

четверг, 7 сентября 2017 г.

Dagon 0.3.0

Выпустил новую версию Dagon - 0.3.0. Главное нововведение релиза - поддержка кластерного рендеринга, а также эффектов постобрабоки (реализованы FXAA и lens distortion). Кроме того, появился шейдер неба.


Соответственно, обновлена демка - улучшен пример движка от первого лица, куда добавлены почти все фичи Dagon. Скачать ее можно тут.

Осталось реализовать PBR-материалы и поддержку формата DGL3 (хотя, скорее всего, я сделаю новый формат для хранения сцен, с учетом всех возможностей Dagon).

среда, 6 сентября 2017 г.

Динамическое небо

Экспериментирую с шейдером неба и солнца. Используется простая модель с линейной интерполяцией - полноценный физически корректный Rayleigh мне показался слишком тяжелым для реалтайма.

Сверточные фильтры в dlib с выводом в QtE

Очередной замечательный материал по dlib от LightHouse Software - продолжение серии статей по обработке изображений в dlib.

От автора:
"В этой статье мы попытаемся подружить QtE5 и dlib, сделав несложный и удобный интерфейс для накладывания фильтров на изображения, оставив при этом возможность для пользователя добавлять свои фильтры".

http://lhs-blog.info/programming/dlang/digital-filters

вторник, 5 сентября 2017 г.

Кластерный рендеринг - обновленная демка

Доступна обновленная демонстрация clustered forward shading в Dagon. Повышена плотность кластеров, добавлена поддержка normal mapping и parallax mapping, а вместо бликов по Фонгу теперь используется модель Кука-Торренса.

Скачать для Windows


среда, 30 августа 2017 г.

Кластерный рендеринг - демка

Доступна демка кластерного рендеринга на основе Dagon:

Скачать для Windows



Clustered Forward Shading

Уже давно пытаюсь решить проблему множества источников света в классическом прямом рендере (честно говоря, очень не хочется переходить на deferred). И недавно я открыл для себя отличную технику, которую теперь хочу попробовать применить в Dagon - clustered forward shading. Суть ее заключается в индексировании пространства при помощи 3D-текстуры, ячейки которой (кластеры) ссылаются на источники света в буфере, влияющие на пространство внутри данной ячейки (фактически, в ячейке можно хранить срез индексов - смещение и количество источников света - в виде двух 16-битных значений). Пиксельный шейдер, зная позицию точки в world space, сэмплирует ячейку из 3D-текстуры, получает срез и проходит по нему циклом, считывая атрибуты источников света - позицию в eye space, цвет и радиус.


Метод очень перспективный - минимальная нагрузка на GPU, всего две дополнительные служебные текстуры (кластер и буфер источников света), хорошая масштабируемость и почти полная независимость от сложности сцены (есть лишь зависимость от ее размера - чем больше сцена, тем выше разрешение кластера).
Есть, впрочем, и недостатки - во-первых, небольшая дополнительная нагрузка на CPU при обновлении 3D-текстуры и буфера. Но обновлять их нужно только при движении источников света - если у вас статичный свет, то оверхед будет нулевой. Другое узкое место - передача буфера источников света в видеопамять. У меня это текстура GL_RGB32F шириной N * 8, где N - количество ячеек кластера, и высотой 4 - по одной строке на атрибут. N может достигать 1024 и выше - передавать такой буфер из системной памяти каждый кадр может показаться малоэффективным, но можно обновлять не весь буфер, а только те его части, где меняется список источников света (маловероятно, что в обычной игровой ситуации будут сотни движущихся ламп).


Надеюсь вскоре доделать и выложить демку с реализацией данного метода.

воскресенье, 13 августа 2017 г.

Шейдерные эффекты в Dagon

Работаю над убер-шейдером и тенями, а также сделал постобработку, добавил FXAA, SSAO и хроматическую аберрацию:



суббота, 12 августа 2017 г.

Dagon 0.2.0

Выпустил новую версию Dagon - 0.2.0. Релиз включает изменения, сделанные в рамках демы с автомобильной физикой и различных других примеров, а именно:
  • Система частиц с поддержкой векторных полей
  • Шейдерный бэкенд для материалов
  • Экспериментальная поддержка теневых карт
  • Демонстрационный пример Dagon также обновлен - в сцену с механикой от первого лица добавлены тени.
Также скоро в основную ветку будет внесена система постобработки и поддержка сглаживания FXAA. Следующим шагом будет реализация PBR-бэкенда и поддержки формата DGL3, а затем на Dagon можно будет портировать Atrium.

Скачать демку Dagon 0.2.0 для Windows и Linux можно тут.

вторник, 8 августа 2017 г.

Новая книга по D на русском

Когда уже казалось, что dlang.ru окончательно сгинул, сайт неожиданно вернулся к жизни с новым проектом - русскоязычной книгой по языку D для начинающих: http://dlang.ru/book. Доступны первые две главы, посвященные основным синтаксическим конструкциям, системе типов, ООП, стандартному вводу/выводу и т.д.

понедельник, 31 июля 2017 г.

Запретители сравняли счет

Когда в России ввели досудебную блокировку и "реестр запрещенных сайтов", многие только посмеялись - мол, есть же VPN и TOR. И действительно, какое-то время нам удавалось уживаться с блокировками. Но полагать, что власти будут долго закрывать на это глаза, было наивно: 1 ноября в России вступают в силу новые поправки к федеральному закону "Об информации, информационных технологиях и о защите информации", которые уже прозвали "законом о запрете анонимайзеров"...

Данные поправки включают меры противодействия обходу блокировок - всем владельцам VPN и прокси запрещается предоставлять своим клиентам на территории РФ доступ к заблокированным сайтам. Это значит, что можно попрощаться с большинством крупных коммерческих VPN - они либо прогнутся, либо, вероятнее всего, просто перестанут предоставлять услуги резидентам РФ. С бесплатными прокси все не так однозначно - они обычно предоставляют дополнения для популярных браузеров, и главный вопрос заключается в том, будут ли владельцы каталогов дополнений сотрудничать с российскими властями, удаляя "неугодные" аддоны. С Google все, в принципе, понятно - вся надежда на Mozilla. Впрочем, все прокси могут быть заблокированы по IP, поэтому на браузерных решениях, в долгосрочной перспективе, можно все равно ставить крест.

В случае с TOR под этот закон попадают все так называемые exit nodes (выходные узлы), выводящие TOR-трафик за пределы сети. О том, что эти узлы принадлежат частным лицам и не контролируются разработчиками TOR, законотворцы, похоже, не в курсе - неужели власти собираются рассылать уведомления кажому из них? Непонятно только, как - владельцы узлов анонимны, ничего, кроме IP, о них неизвестно. Кончится это, естественно, блокировкой официального сайта TOR Project и набора выходных узлов из списков, предоставляемых центральными серверами каталогов (чьи адреса вшиты в клиент TOR). Такая ситуация сейчас наблюдается, например, в Турции. Для решения этой проблемы были введены мосты (bridge relays) - непубличные ретрансляторы, адреса которых можно получать порциями по три штуки на сайте https://bridges.torproject.org, либо отправив письмо на bridges@torproject.org. Маловероятно, что власти будут пытаться выяснить адреса всех мостов, чтобы заблокировать их - тем более, что мост не является выходным узлом, не попадает под действие закона, и его блокировка неправомерна (во всяком случае, пока). Дополнительным бонусом от использования мостов является маскировка трафика - так что, в принципе, даже введение DPI пользователям TOR не особо страшно.

Одновременно "железный занавес" смыкается на мессенджерах: с 1 января 2018 года вступает в силу набор поправок к тому же закону, регулирующий работу систем обмена мгновенными сообщениями. В частности, они будут обязаны идентифицировать пользователей по номеру телефона, ограничивать обмен запрещенной информацией, а также организовывать массовую рассылку сообщений от госорганов. Конечно, большинство популярных мобильных мессенджеров и без того используют телефонный номер для идентификации, но, например, судьба тех же Jabber/XMMS, IRC, Bitmessage и пр. не совсем ясна. Крупные сервис-провайдеры типа Google или социальных сетей, надо полагать, введут обязательную аутентификацию по SMS. Что будет с множеством мелких XMMS-серверов, тоже понятно. Telegram, скорее всего, откажется выполнять требования и будет заблокирован. Для защищенного от государства обмена информацией остаются только TOR и I2P - в десктопном клиенте Telegram, кстати, можно настроить пользовательский прокси и, соответственно, сделать маршрутизацию через TOR.

Подводя итог: возможно, власти не будут заморачиваться с массовыми блокировками "всего и вся", и этот процесс будет идти намного медленнее, чем кажется. Но, как всегда, надо готовиться к худшему...

P.S. Я не призываю обходить блокировки для скачивания пиратского контента или обмена экстремистскими материалами. Дело в том, что в настоящее время в России заблокировано множество полезных и совершенно безобидных сайтов, включая, например, LinkedIn и Issuu, многие сайты оппозиции и независимые СМИ, были также попытки заблокировать GitHub. Те же торрент-трекеры используются отнюдь не только для обмена пиратским контентом, но и вполне легальным. Опять же, блокировка прокси усложнит доступ к ресурсам, по политическим или иным причинам недоступным на территории РФ (некоторые видео на YouTube, музыкальные сайты типа Spotify и т.д.). Таким образом, неподконтрольные государству прокси-системы и независимые мессенджеры просто необходимы любому честному человеку для обеспечения собственного права на доступ к легальной информации и обмен ей, а также права на тайну переписки. Власти же эти права явно не уважают, и потому не могут рассчитывать на ответное уважение к их сомнительным репрессивным инициативам, которые, ко всему прочему, совершенно неэффективны для решения декларируемых задач. Террористы продолжают совершать теракты, сами-знаете-что спокойно продается в Deep Web'е, а страдают больше всех законопослушные граждане. Мне лично надоело заходить на Issuu через TOR для того, чтобы выложить туда очередной номер "FPS" - только потому, что когда-то, видите ли, там нашли запрещенную исламистскую книжку. Той книжки уже давно нет, а одно из крупнейших онлайн-издательств до сих пор заблокировано. Нежелание властей отказаться от блокировки целиком HTTPS-сайтов я рассматриваю как вредное отрицание прогресса, попрание гуманистических ценностей и преступление против общества - а никакое преступление нельзя оправдать благими намерениями.

вторник, 4 июля 2017 г.

Физика автомобиля на D

Давно мечтал написать собственный автосимулятор, хотя бы простенький. Насколько я знаю, на D ничего подобного никто еще не делал, и вот вам proof-of-concept: с использованием dmech можно реализовать вполне сносную физику автомобиля с моделированием колес и подвески на основе лучей (raycast car).

Я, впрочем, не планирую создание полноценной гоночной игры, поэтому не стал моделировать реальные характеристики двигателя, тормозов и т.д. - автомобиль движется под действием двух сил на каждое колесо, продольной и боковой, основанных на взятых "с потолка" константах. В принципе, ничто не мешает сделать точные расчеты этих сил.

Демка использует модифицированную версию dmech, а также Dagon в качестве графического движка (опять-таки с модификациями, которые совсем скоро войдут в основной репозиторий - к примеру, реализованы тени и шейдерный бэкенд для материалов). Все зависимости включены в архив, кроме dlib 0.11.1. Прилагается сборка для Windows. Можете использовать демку в своих проектах (код доступен под лицензией Boost).

Скачать (9,65 Мб)

суббота, 6 мая 2017 г.

Текущий статус и планы по проекту Dagon

Ненадолго получив доступ к Windows-машине, я наконец-то собрал под ней Dagon. К сожалению, большую часть времени сейчас мне приходится работать под старым железом, поэтому работа над движком продвигается медленнее, чем хотелось бы. Надеюсь, что этим летом у меня будет возможность довести его до ума и продолжить работу над Atrium. В первую очередь, планирую написать шейдерный бэкенд для системы материалов и загрузчик файлов формата DGL. Также будет поддержка FXAA, SSAO, CSM, DoF, Motion Blur.

Демки Dagon переместились в отдельный репозиторий: https://github.com/gecko0307/dagon-demo. Теперь это всего одно приложение, включающее несколько сцен и меню для переключения между ними. Появилась новая демка с реализацией системы частиц, которая, надеюсь, скоро станет частью движка. Система включает очень быстрый отрисовщик биллбордов для частиц, поддерживает стандартные векторные поля (аттрактор, дефлектор, "черная дыра", вихрь) и позволяет добавлять новые.

среда, 26 апреля 2017 г.

Идеальный язык - это миф

Прошло семь лет с тех пор, как я опубликовал свою первую статью о языке D в журнале "FPS" (№12 за 2010 г.). Первоначальный восторг и энтузиазм за это время, конечно, поугас, но в целом мое отношение к языку не поменялось, я все еще остаюсь убежденным дишником - ничего лучше D я пока не вижу. Но я отнюдь не считаю D идеальным языком. За эти годы у меня накопилось много соображений по этому поводу, которыми сейчас и хочу поделиться.

Есть популярное мнение, что программисты СПО не должны распылять усилия на персональные проекты и разрабатывать только один, чтобы получился идеальный инструмент. Отчасти это мнение распространяется и на языки - кого-то раздражает "зоопарк" языков, среди которых, мол, нет однозначно лучшего. Так вот, идеальный язык программирования - это нонсенс, он не может существовать. По той простой причине, что языки - это инструменты, предназначенные для решения определенных задач. Немыслим такой инструмент, который решал бы все возможные задачи. Более того, по мере развития информационных технологий появляются новые задачи, для решения которых создаются новые инструменты. И это нормально, так было всегда. Чем больше языков, тем лучше - те, кто считает иначе, гонятся за иллюзией.
Можно выразить это через биологическую аналогию. Языки (и вообще все свободные программы) существуют в некоем подобии экосистемы, и к ним отчасти применимы законы естественного отбора. Выживают наиболее приспособленные - в данном случае, приспособленные к решению определенного набора задач. Схожие задачи объединяют языки в "ареалы обитания", где они конкурируют друг с другом. Подобно живым организмам, языки в принципе не способны охватить все ареалы - нет существ, которые были бы одинаково хорошо приспособлены к жизни в пустыне, в тропиках, в арктических льдах и в океане.
Поэтому мне всегда казалась нелепой тенденция учить один-единственный язык, чтобы затем использовать его для любых целей. Если язык пригоден для решения вашей задачи - используйте, если нет - берите более подходящий.

Когда люди спрашивают что-то вроде: "Почему D непопулярен несмотря на то, что он такой идеальный?" - некорректна сама постановка вопроса. D - неидеальный язык. И C++ неидеальный, и Java, и Python, и все остальные. D спроектирован лучше, чем C++, Java или Python - но этот факт сам по себе не означает, что D решает все задачи однозначно лучше, чем C++, Java или Python.
Практическая ценность языка вообще мало коррелирует с его дизайнерскими достоинствами. D - очень красивый язык, вобравший в себя множество потрясающих архитектурных решений. На D можно писать образцово эффективный и читаемый код. Но это дизайнерское достоинство, которое сделало бы D идеальным языком только в идеальном мире, где нет необходимости линковаться с библиотеками на C++, взаимодействовать с морально устаревшими API типа Win32, писать клиентский код под браузеры, разрабатывать мобильные приложения под Android с его урезанным libc и отсутствием полной поддержки Posix. Список можно продолжать бесконечно: мир IT - это архитектурный хаос. Есть хорошо продуманные стандарты, ставшие популярными, но они теряются на фоне нагромождения разнородных поделок, "склеенных скотчем", наспех написанных по принципу "лишь бы работало".
Популярными становятся те инструменты, которые помогают уживаться со всем этим, не стремясь быть "вещью в себе". Есть инструменты, безупречные с точки зрения дизайна, но совершенно бесполезные на практике - например, язык Haskell или ОС Plan 9. Это классические примеры "вещей в себе", интересные лишь в эстетическом отношении. На практике никто не использует красивые языки и красивые операционные системы только из-за их красоты. В этом причина популярности Windows и C++. Никто не говорит, что они идеальны, но все ими пользуются - потому что они решают задачи большинства.

Но вернемся к D. Решает ли он какие-то задачи лучше, чем C++? Если да, то почему непопулярен? Это непростой вопрос, на который, наверное, нельзя ответить однозначно, но я попробую.
Я не раз сталкивался с необходимостью написать небольшую утилиту, эффективно выполняющую одну-единственную задачу. Например, сортировщик файлов, переименовывающий их в определенной последовательности. На D без дополнительных библиотек написать такое намного проще, чем на C++ без дополнительных библиотек. И работать оно будет значительно быстрее, чем, скажем, вариант на Python или Bash (и я бы еще поспорил, что проще - Bash или D).
D позволяет без особых телодвижений взять и реализовать с нуля любую идею - в этом его главная практическая ценность. Конечно, без библиотек это не всегда так просто, поэтому я и начал проект dlib - это, в первую очередь, именно библиотека для прототипирования. Суть в том, что D как язык располагает к быстрому воплощению идей, при этом предоставляя нужную производительность - с D не требуется переписывать прототип на язык с более низким уровнем абстракции, прототип с минимальными трудозатратами превращается в законченный продукт.
Может ли D конкурировать с C++ на вышеупомянутом хаотическом поприще? Да, но только при создании нового. Нет смысла писать на нем, если ваш код будет мешаниной из библиотечных вызовов, C-шных идиом и разных костылей типа toStringz. В таком случае вы просто усложните себе жизнь - намного проще использовать C++. D - это язык не для рутины, а для творчества. И в этом у него нет конкурентов.

Вопрос в том, насколько много программистов сейчас занимаются чистым творчеством. По моим впечатлениям, большинство pet-проектов на GitHub - это какие-то мелкие веб-приложения, разного рода "хеллоуворлды", бессмысленные порты с одного языка на другой, какие-то врапперы и биндинги. Серьезные открытые проекты давно переросли стадию чьего-то хобби - творчеством там, конечно, и не пахнет. Даже на D чего-то нового и интересного не так уж много, и это меня искренне расстраивает. Был легендарный h3r3tic с его потрясающими программными растеризаторами и трассировщиками лучей времени компиляции. Была Higgs, JavaScript-машина с JIT-компиляцией. Был игровой движок Dash. Была пара-тройка мини-игр. И это, по большому счету, все. Сейчас репозиторий DUB забит какими-то унылыми библиотеками для веба, драйверами СУБД и реализациями малоизвестных протоколов. Скучно, ребята, скучно. На D можно писать удивительные штуки - почему никто этого не делает?

пятница, 7 апреля 2017 г.

DMD полностью свободен!

Свершилось историческое событие: бэкенд DMD перелицензирован под лицензией Boost - это значит, что компилятор теперь полностью отвечает критериям свободного ПО по Столлману и OSI (то есть, разрешается создание производных работ и передача кода третьим лицам).

Долгое время бэкенд распространялся по несвободной лицензии, оставляя исключительное право на распространение кода за правообладателем (компанией Symantec) - для распространения кода лицензиатом требовалось получить явное разрешение, что формально делало бэкенд прориетарным при открытых исходниках. Данный нелицеприятный факт долгое время служил еще одной антирекламой D, и, хотя де-факто все игнорировали лицензию бэкенда и спокойно форкали DMD на Гитхабе, несвободная лицензия ограничивала возможность включения бинарников DMD в стандартные репозитории Linux-дистрибутивов. Наверное, в некоторой степени это и сделало язык менее популярным, чем Go, Rust и другие новинки последних лет (да, есть изначально свободные LDC и GDC, но они всегда отставали на несколько релизов, к тому же играет роль психологический фактор - к референсной реализации всегда больше доверия). Надеюсь, теперь ситуация начнет меняться, если еще не слишком поздно - из реальных, ненадуманных недостатков D остается только сборщик мусора.

среда, 5 апреля 2017 г.

Фокусы с Compound

Недавно столкнулся с интересной задачей: описанием класса, который инкапсулирует неизвестный заранее набор объектов. Типы этих объектов задаются через variadic template - то есть, шаблон с переменным количеством параметров. Статические массивы для этой задачи, ясное дело, не годятся, но тут идеально подошел Compound из dlib.core.compound. Это своеобразный "гибрид" кортежа и структуры - составной тип данных, который можно создавать в шаблонах. Ему можно передавать кортеж параметров variadic-шаблона, и это позволяет проделывать замечательные вещи.

class Collection(C...)
{
    protected Compound!C _components;

    this(C comps)
    {
        _components = comps;
    }
}

auto inc = new Collection!(int, char, bool)(10, 'a', false); 

Проблема с обычными кортежами (Tuple) в том, что их нельзя возвращать из функции. Но Compound - можно. Таким образом, для ридонли-доступа к _components мы можем объявить следующий метод:

auto components() @property
{
    return _components;
}

А еще мы можем заполнять Compound в цикле, читая значения, например, из массива:

this(int[] arr)
{
    foreach(i, T; C)
    {
        _components[i] = cast(T)arr[i];
    }
}

auto inc = new Collection!(int, char, bool)([5, 40, 0]);

Пример бессмысленный, но наглядный - мы проходим по всем типам кортежа C и записываем входное значение в наш Compound, конвертируя в нужный тип. Без дополнительных проверок это небезопасно, но если вы знаете, что делаете - очень полезно.

Dagon

Прошу читателей этого блога извинить меня за редкие посты. Более полугода я не отчитывался по работе над Atrium - спешу заверить, что проект не похоронен, прогресс понемногу идет, просто чуть медленнее, чем хотелось бы. Последние несколько месяцев я был занят дипломной работой в институте, поэтому свободного времени для геймдева было крайне мало.

Те, кто следит за моей активностью на GitHub, могли заметить, что у меня появился новый репозиторий dagon - проект, который позиционируется как новая эволюционная ступень DGL. В процессе работы над Atrium я пришел к выводу, что в движке не хватает средств автоматизации некоторых рутинных задач. Например, управление памятью в типичном игровом приложении может быть почти полностью автоматизировано, поскольку выделение и высвобождение памяти происходит в специально задуманных паузах, таких как переключение между локациями (это не относится к играм с открытым миром с фоновой подгрузкой, но это уже специфический случай). Кроме того, в обсуждении на Reddit звучал вопрос, почему DGL не использует SDL2. Так родилась новая ветка движка, которую я решил сделать отдельным экспериментальным проектом.

На сегодняшний день Dagon включает следующие возможности:
  • Использование SDL2
  • Новая модель памяти на основе концепции владельца (owner), позаимствованной из Delphi
  • Модель образцов и компонентов (entity-component), позволяющая расширять функциональность объектов динамически, без наследования классов
  • Динамическая перезагрузка ресурсов при их модификации сторонним приложением без перезапуска игры
  • Поддержка форматов OBJ и IQM
  • Поддержка текстур PNG, JPG, TGA, BMP
  • Поддержка контейнера Box для ресурсов
  • Новая система материалов с разделением на фронтенд (набор параметров) и бэкенд (передатчик параметров графическому конвейеру - фиксированному или шейдерному, в зависимости от выбранной реализации бэкенда). Система позволяет использовать как стандартные материалы с известным набором параметров, так и создавать свои, специализированные
  • Некоторые компоненты, напрямую портированные из DGL - например, система событий, система освещения, рендеринг текста.
Как только будет дописана система материалов и поддержка формата DGL3, я начну портировать Atrium на новый движок.

воскресенье, 19 марта 2017 г.

Анимация в dlib

Меня внезапно осенило, как можно добавить в dlib.image поддержку анимации без существенного рефакторинга библиотеки. Классы анимированных изображений (SuperAnimatedImage) могут быть простым расширением базового класса SuperImage с возможностью хранить несколько кадров и переключаться между ними. Такие изображения полностью совместимы с любым кодом, работающим с SuperImage - чтению и записи через привычный интерфейс SuperImage подлежит срез данных, относящийся к текущему кадру.
Также естественным образом вводится класс-фабрика для создания анимированных изображений, и в результате стало возможным расширить декодер PNG до поддержки APNG:

AnimatedImageFactory imgFac = new AnimatedImageFactory;
auto res = loadPNG(openForInput("animation.apng"), imgFac);
if (res[0])
{
    SuperAnimatedImage animImg = cast(SuperAnimatedImage)res[0];
}

понедельник, 23 января 2017 г.

Компиляторы D в Travis

Nick Sabalausky aka Abscissa, один из разработчиков DMD/Phobos, хостит на своем сайте автогенерируемую таблицу со всеми компиляторами, которые на данный момент поддерживаются Travis CI - очень удобно, можно периодически заглядывать и обновлять свой .travis.yml:

https://semitwist.com/travis-d-compilers