Винтажные фильтры — обновление

Обновилась коллекция винтажных фильтров для GIMP: добавлены три новых фильтра (Amaro, Brannan, Toaster), а также поддержка виньетирования. Все фильтры теперь объединены в один: при запуске скрипта выводится диалоговое окно с выбором фильтра и другими опциями.

Скачать можно здесь.

Составные тела в dmech

В физическом движке dmech реализованы составные тела (поддержка нескольких геометрий на тело). Корректировка позиции теперь основана на псевдоскоростях. Кроме того, устранен артефакт дрожания (jittering), возникающий в некоторых ситуациях.
Также dmech теперь использует последнюю версию dlib.

Сборка для Windows
Сборка для Linux
Исходники

Репозиторий на GitHub будет обновлен в ближайшее время.

dlib 0.3

Состоялся релиз коллекции библиотек dlib 0.3. Нововведения этой версии:

  • Добавлены абстрактные потоки ввода/вывода (dlib.core.stream), независимые от Phobos, а также интерфейс файловой системы (dlib.filesystem) с готовыми реализациями для POSIX и Windows — этот интерфейс можно использовать, например, для построения виртуальных ФС.
  • Добавлена начальная поддержка HDRI в dlib.image (реализация формата изображений с плавающей запятой в dlib.image.hdri). Кроме того, обеспечена поддержка распараллеливания обработки изображений (dlib.image.parallel), добавлена поддержка чтения форматов TGA и BMP. Чтение/запись графических форматов теперь основаны на потоках, поэтому имеется возможность загружать изображения, например, напрямую из архивов.
  • Элементы матриц (dlib.math.matrix) теперь располагаются по столбцам, а не по строкам. Это серьезно нарушило обратную совместимость, но если вы не используете внутренние данные матриц и пользуетесь только внешним API, то это изменение не должно повлечь никаких проблем.

Более полный чейнджлог, а также исходники релиза вы можете найти на GitHub:
https://github.com/gecko0307/dlib/releases/tag/v0.3.0

Журнал «FPS» №28

К выходу FPS №28 мы решили приурочить открытие сайта-блога http://fps-magazine.blogspot.ru, в котором постепенно собираемся разместить всю информацию из нашего старого, ныне несуществующего сайта (fpsmag.zymichost.com). Надеемся, этот ресурс поможет читателям, не зарегистрированным в Google+, не терять нас на просторах Интернета и быть в курсе обо всех событиях из жизни журнала.

А в этом выпуске FPS вы найдете следующие материалы:

  • Подборка новостей по Blender
  • Интервью с Ларри Гритцем, создателем OSL
  • Рисуем фрактал на D
  • Обзор альтернативных ОС
  • Игровые новости из мира Linux
  • Кому нужен Linux? Правда и вымыслы
  • Культовые игры: The Elder Scrolls V
  • Angry Birds в России
  • Как создавались игры 80-х и 90-х
  • Каково быть гиком в тюрьме? Исповедь Анонимуса

Журнал доступен для онлайн-чтения и загрузки на Документах Google, на Dropbox, а также на Issuu.com.

Последние новости по проекту вы можете узнать в публичной странице журнала в социальной сети Google+: http://gplus.to/fpsmag. Добавляйте нас в круги, оставляйте свои комментарии и отписывайтесь в нашем сообществе.

Архив номеров журнала вы можете найти здесь.

GScript — скриптовый язык для D

В игровом движке трудно обойтись без какого-либо способа динамического задания логики и поведения объектов, поэтому я решил написать для Atrium скриптовый язык. Это очень простой императивный язык с динамической типизацией и (пока) всего одним внутренним типом – float.

Что уже реализовано:

  • Модульная система, как в D;
  • Функции (есть поддержка рекурсии);
  • Локальные переменные;
  • Передача аргументов по значению и по ссылке. Что интересно, передача по ссылке возможна в любую функцию, так как ссылочный тип указывается при конкретном вызове функции, а не при ее объявлении;
  • Условный переход if…else;
  • Цикл while;
  • Возможность расширять язык собственными функциями на D.

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

Пример кода на GScript:

import myPackage.myModule;

func main()
{
    var x = 10;
    var a, b;

    a = x * 2 + 1;

    while(a > 0)
    {
        a = a - 1;
        b = b + 1;
    }

    writeln(x, a, b);
}

Исходники проекта доступны на GitHub:
https://github.com/gecko0307/gscript
Примеры скриптов

Приветствуются предлолжения и пожелания – какую функциональность вы бы хотели видеть в языке (оговорка: поддержка ООП в ближайшее время не планируется).

Распараллеливание обработки изображений

API dlib.image позволяет создавать фильтры, которые легко распараллеливать на несколько процессоров. Изображение условно разбивается на несколько блоков заданного размера, которые затем обрабатываются фильтром через std.parallelism.

import std.parallelism;
import dlib.functional.range;
import dlib.image.image;

struct Block
{
    uint x1, y1;
    uint x2, y2;
}

alias Range!uint PixRange;

void parallelFilter(
     SuperImage img, 
     void delegate(PixRange blockRow, PixRange blockCol) ffunc, 
     uint bw = 100,
     uint bh = 100)
{
    if (bw > img.width)
        bw = img.width;
    if (bh > img.height)
        bh = img.height;

    uint numBlocksX = img.width / bw + ((img.width % bw) > 0);
    uint numBlocksY = img.height / bh + ((img.height % bh) > 0);

    Block[] blocks = new Block[numBlocksX * numBlocksY];
    foreach(x; 0..numBlocksX)
    foreach(y; 0..numBlocksY)
    {
        uint bx = x * bw;
        uint by = y * bh;

        uint bw1 = bw;
        uint bh1 = bh;

        if ((img.width - bx) < bw)
            bw1 = img.width - bx;
        if ((img.height - by) < bh)
            bh1 = img.height - by;

        blocks[y * numBlocksX + x] = Block(bx, by, bx + bw1, by + bh1);
    }

    foreach(i, ref b; taskPool.parallel(blocks))
    {
        ffunc(range!uint(b.x1, b.x2),
              range!uint(b.y1, b.y2));
    }
}

Пример (закрашивание сплошным цветом):

SuperImage filterTestMultithreaded(SuperImage img)
{
    auto res = img.dup;
    
    img.parallelFilter((PixRange row, PixRange col)
    {
        foreach(x; row)
        foreach(y; col)
        {
            res[x, y] = hsv(180.0f, 1.0f, 0.5f);
        }
    });
    
    return res;
}

Для сравнения — однопоточный вариант:

SuperImage filterTestSinglethreaded(SuperImage img)
{
    auto res = img.dup;
    
    foreach(x; img.row)
    foreach(y; img.col)
    {
        res[x, y] = hsv(180.0f, 1.0f, 0.5f);
    }
   
    return res;
}

На двухъядерном Intel Dual Core T2390 (1.86 ГГц) многопоточный вариант показывает прирост производительности на 70%.

Интернационализация в D

Представляю вашему вниманию i18n.d – простое и минималистичное решение для интернационализации программ на языке D. Работает по принципу GNU gettext и других аналогичных инструментов: для перевода строки, ее нужно обернуть в функцию “_”.
В данный момент модуль имеет поддержку Windows и всех POSIX-систем.

Пример использования:

import std.stdio;
import i18n;

void main()
{
    Locale.readLang("locale", ".lang");

    writeln("Hello, world!"._);
}

Программа будет искать файлы локализации (*.lang) в каталоге locale. Имена файлов должны соответствовать RFC 3066 (в POSIX-варианте). Кодировка – UTF-8.

Вот пример русской локали (ru_RU.lang):

"Hello, world!" = "Привет, мир!"
"Some text" = "Какой-то текст"

Исходный код i18n.d:
https://gist.github.com/gecko0307/8419717

Итоги 2013 года

Завершился 2013 год, в течение которого я всеми силами старался выкроить свободное время для работы над Atrium и сопутствующими инструментами. Подведу итоги: что было сделано, какие в прошедшем году произошли важные релизы и достижения.

  • Сециально для Atrium был разработан игровой физический движок dmech с поддержкой нескольких видов геометрических тел и сочленений. Он еще далек от совершенства, но уже пригоден для использования в простых задачах игровой динамики;
  • Было выпущено 6 номеров электронно-познавательного журнала «FPS» (№№ 22, 23, 24, 25, 26, 27). Кстати, в феврале 2014 года журналу исполняется 6 лет!
  • Состоялось серьезное обновление dlib: в частности, пакетов dlib.math и dlib.image. Библиотека обогатилась новой функциональностью, переехала на GitHub и обзавелась поддержкой DUB;
  • Вышла Cook2, экспериментальная ветка программы сборки проектов Cook со значительными изменениями и улучшениями;
  • Вышла альфа-версия Arrow — тетрисоподобной игры-головоломки с оригинальной механикой.

Огромное спасибо всем, кто так или иначе помогал мне в течение года:

  • Андрею Пенечко (MrSmith33) — за багрепорты и багфиксы в dlib;
  • Наталии Чумаковой (d_o_r_i_a_n_a) — за помощь по матчасти и тестирование всех программ на Windows 7, а также за сотрудничество по журналу;
  • Александру Санникову (Suslik) — за советы и помощь по физике.

    Редактор уровней для Atrium

    После долгого перерыва я вновь возвращаюсь к работе над Atrium. Будущей игре нужны инструменты для подготовки контента, и я решил начать с редактора уровней. Конечно, в качестве редактора уровней можно было использовать один из существующих 3D-пакетов — например, Blender — но я отказался от этой идеи по следующим соображениям:

    • Blender «заточен» под моделирование, а не сборку сцен из готовых моделей. Нет встроенной системы ассетов, библиотеки материалов и т.д.;
    • В существующих программах нет возможности создавать новые классы объектов с нестандартными свойствами и функциональностью, специализированные для конкретного игрового движка;
    • Нет полноценного WYSIWYG, в то время как в собственном редакторе уровней используется графический движок от своей же игры, и картинка в редакторе совпадает с картинкой в игре;
    • Собственный редактор можно распространять параллельно с игрой, на тех же лицензионных условиях, а сторонний инструмент — не всегда.

    Для разработки редактора я, как обычно, использую D и OpenGL, а в качестве тулкита — GTK+ (через биндинг GtkD). Планируется выпустить версии для Linux и Windows.

    Журнал «FPS» №27

    Вышел 27 номер электронного PDF-журнала «FPS», посвященного разработке игр, программированию, компьютерной графике и звуку.

    Читайте в этом номере:

    > Подборка новостей по Blender
    > Тон Розендаль о будущем интерфейса Blender
    > GIMP: цветокоррекция на Python
    > От мольберта — к дисплею. Заметки о цифровой живописи
    > Физический движок своими руками. Часть IV
    > Математика в dlib
    > Ranges: диапазоны в D
    > Игровые новости из мира Linux
    > Право на творчество

    Номер доступен для онлайн-чтения и загрузки на сервисе Issuu.com, Документах Google и Dropbox.

    Последние новости по проекту вы можете узнать в публичной странице журнала в социальной сети Google+: http://gplus.to/fpsmag. Добавляйте нас в круги, оставляйте свои комментарии и отписывайтесь в нашем сообществе.

    Архив номеров журнала здесь.