пятница, 9 июля 2010 г.

Генерация текстурного атласа

Давным-давно, в далёкой-далёкой галактике Художники подумали и решили, что слишком много времени они тратят на сборку текстурных атласов. А раз есть у них Программист, то пускай он мучается с этой проблемой. Почесал Программист репу и начал думать. Первой мыслью было использовать программы для автоматической генерации атласов. Мысль вроде хорошая, но Художники народ ленивый, не станут они марать свои творческие руки о прах бытия. Так что Программист решил ввести функцию сборки атласов в движок, дабы С++ отдувался и за него, и за художников :) Что для этого потребовалось: 1. Всего-лишь библиотека FreeLib и немного размышлений. Для начала, нам нужно загрузить PNG текстуру в оперативную память
void C_Texture_Loader::Add(std::wstring Name, std::wstring Path, int Width, int Height){
FIBITMAP *dib = FreeImage_LoadU(FIF_PNG, (wchar_t*)Path.c_str(), PNG_DEFAULT);  
DraftTextures[Name].dib = dib;
DraftTextures[Name].Width = FreeImage_GetWidth(dib);
DraftTextures[Name].Height = FreeImage_GetHeight(dib);
DraftTextures[Name].Pitch = FreeImage_GetPitch(dib);
}
Тут в принципе всё должно быть понятно. В переменную dib загоняем указатель на текстуру, а в ассоциативный массив (std::map) загоняем данные, необходимые для дальнейшего построения атласа.

int main();

В данном блоге буду писать о процессе разработки моего 2D движка (рабочее название Akari Engine).
Работу над движком начал 3 года назад, через месяц была готова первая версия и написана первая казуальная игра. На текущий момент движок предоставляет следующие возможности:
- Загрузка массива NPOT текстур и генерация на основе их текстурных атласов
- Проигрывание звуков и музыки (wav и mp3)
- Спрайты с функцией быстрой настройки анимации
- Собственная система частиц (настройки эффектов хранятся в .ini файле)
- Упаковка INI файлов в бинарный файл для увеличения скорости считывания.
- Поддержка расстровых шрифтов, генерируемых в программе Angelcode BMFont
- Интеграция с LUA (загрузка музыки, звуков, шрифтов, INI создание и отрисовка спрайтов, частиц, шрифтов).
В планах:
- Перевести движок на OpenGL для обеспечения кроссплатформености (пока склоняюсь к использованию SDL).
- Добавить продвинутые возможности задания анимации спрайтов (помимо смены кадров, хочу добавить таймлайны для позиции, скейла, альфы и поворота)
- Оптимизировать создание текстурных атласов, чтобы не оставалось пустых мест на текстуре.