LINUX.ORG.RU

Сообщения kapitan-amerika

 

Что делать дальше с проектом?

Форум — Development

Здравствуйте!

Краткая предыстория. ОС FreeBSD, нет программы-рисовалки для создания 2D растровой анимации, быстрая оценка сложности реализации проекта и ... .
Итог: родил нечто (https://bitbucket.org/rndfax/sdp) - OpenGL программа с поддержкой (по крайней мере) планшетов Wacom. Писано на Си с классами, а то и хуже.
По сути, был вдохновлён программой Plastic Animation Paper (http://animationpaper.com/), но которая обладала фатальными недостатками.

Это нечто получилось в виде тестовой площадки (i.e. помойка) со следующими вытекающими:
1) из blender'а вытащил библиотеку GHOST (https://bitbucket.org/rndfax/libghost) - это как GLUT, только с плюшками. Пришлось, правда, отключить фичу drag-n-drop (кажись, она тянет за собой половину blender'а);
2) make происходит с информированием о том, сколько файлов осталось откомпилировать - реализовано через создание директории, которая используются в качестве лока (lock). cmake выводит информацию в процентах, я хотел такое же, но только на голом Makefile. Фигня, но прикольно;
3) есть слои, есть фрэймы, есть заливка, можно как-то рисовать.

На чём застрял.
Этот проект обладает фатальными недостатками:
1) нет GUI. А нужно выводить: слои, фреймы, инструменты и ещё всего разного полезного.
Пробовал CEGUI (http://cegui.org.uk/) и libRocket (http://librocket.com/). CEGUI - типа самая крутая вещь, которая может быть для создания GUI на OpenGL. Поднял, потом посмотрел, показалось, что шаг влево-вправо от стандартных вещей - всё, приехали. Чтобы сделать какой-то свой стиль нужно создать километровый файл с его описанием. Да, может быть, это есть неотъемлемая часть любого создания стиля. Но выглядит всё это устрашающе. Резюме: неосилил.
libRocket - HTML/CSS прямо в OpenGL. Но как оказалось, CSS совсем не тот CSS, который в интернетах, отсутствуют некоторые важные вещи, попытался их исправить и обнаружил, что там много нужно переписывать в самой библиотеки, а разработчики сказали типа «ну пока нам не надо, делать этого не будем» (https://github.com/libRocket/libRocket/pull/202).
Начал реализовывать свой вариант видения GUI для OpenGL (с некоторыми идеями из libRocket);
2) нет хороших кистей (brushes) для рисования. А по-хорошему нужно иметь в наборе простой карандаш, улучшенную версию того, какая сейчас кисть реализована (типа ручки что-ли), а так же smudge какой-нибудь tool (сейчас он есть, но, кажется, работает не так как надо) + lasso tool и трансформации выделенной области;
3) нет умной заливки. Те, кто пользуется GIMP'ом, наверное, заметили, что если что-то нарисовать, а потом залить, то возле контура останутся непрокрашенные части. Здесь у меня сейчас заливка умнее того, что в GIMP'е. У неё есть пороговое значение, когда нужно остановиться - простая константа. Но для решения задачи заливки нужна ещё более продвинутая логика - отслеживание прозрачности контура.

Почему свой проект-рисования-анимации.
1) PAP (http://animationpaper.com) - Windows/Linux/MacOS, больше не поддерживается, нет слоёв, ущербный карандаш, lasso-tool чрезмерно кривой, только контуры, ограниченное пространство для рисования (а у меня типа бесконечное). Из плюх: простота.
2) Pencil2D (http://www.pencil2d.org) - глючное поделие, страшный код (хотя чё я на него, смотреть что ли должен?), разработчик его куда-то делся, бесконечное пространство для рисования, но нет границ кадра (один дядька уже писал, типа не видно где начало, а где конец. Ответ был: «используй слой камеры для этого» или как-то так, что не подходит для нормального пользования). В топку такое.
3) Krita (https://krita.org) - в составе комбайна calligra, что под KDE. Заявлена поддержка анимации. Во FreeBSD поставил её, там ещё старая версия, анимации нет, но рисовать настолько неудобно, по сравнению с тем же PAP, что ну его нафиг. Так же очень перегружен интерфейс. Патчить KDE под FreeBSD у меня желания нет, потому что комбайн.
4) TVPaint (http://www.tvpaint.com) - платный (АРРРР, где мой попугай?!) комбайн для анимации. Нет бесконечного поля для рисования, перегружен настолько сильно, что всасывается сам в себя.

TL;DR
Имея у себя силы что-то делать, сделал инструмент, который, с точки зрения меня, является удобным и простым в использовании. Теперь, чтобы довести его до логического завершения, нужно восполнить его фатальные недостатки, и тогда можно будет показать его людям, вдруг кому-то он тоже покажется удобнее, чем XXX. Но как организовать работу? По реализации своего GUI есть вопросы. По реализации кистей есть вопросы. По вообще организации проекта есть вопросы. Но как их разрешить, если чтобы их задать, боюсь, понадобится столь же большой монолог, а то и больше?

 , ,

kapitan-amerika
()

2D frame-by-frame bitmap-based animation program

Форум — Development

Здравствуйте.

Случилось как-то мне родить некое поделие: $subj (берёшь мышь или планшет типа wacom, рисуешь по-кадрово и получается в итоге анимация). Вроде как работает, делает что нужно и т.д.. Написано на Си с использованием X-ов (если компилировать под *nix) + OpenGL.

В программе реализованы слои и некий аналог «Symbol» из Adobe Flash. Как происходит отображение слоёв и этого аналога «Symbol» (все текстуры и картинки в RGBA формате):

1. Созданный фрэймбуффер, полученный из glGenFramebuffersEXT, очищаю в цвет (0.0, 0.0, 0.0, 0.0). К этому фрэймбуфферу цепляю текстуру.

2. GL_BLEND включён, glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA).

3. Иду по всем слоям, начиная с нижнего слоя, и загружаю картинку из данного слоя в текстуру и отрисовываю квадрат с этой текстурой.

4. После завершения всех слоёв, выставляю glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) и отрисовываю фон цветом (0.7, 0.7, 0.7, 1.0), «белый лист бумаги» - квадрат цветом (1.0, 1.0, 1.0, 1.0), и прикреплённую к тому фрэймбуфферу текстуру.

Для аналога «Symbol» сначала выполняются такие же шаги (внутри него тоже есть слои), но кладутся они (в кратце) в отдельную текстуру. Потом, когда дело в отрисовке всей сцены доходит до слоя, где находится этот «Symbol», просто отрисовывается его текстура.

Всё бы ничего, но такой алгоритм отрисовки не подходит. Ибо если на картинку с альфой 1.0 ложится картинка с альфой < 1.0, то получается итоговая текстура с альфой < 1.0 и на шаге 4 видно сквозь картинку задний фон. А если отрисовывать ещё и «Symbol», то получается двойной alpha-blending и картинка из «Symbol» получается темнее, чем должна быть на самом деле.

Вот и встаёт вопрос, как же сделать правильную отрисовку? Есть идеи? Например, gimp даёт правильные результаты, но в суть его отрисовки я ещё не вникал, потому что он-то не маленький и боюсь закопаться в нём с головой.

 , ,

kapitan-amerika
()

RSS подписка на новые темы