Здравствуйте, McSeem2, Вы писали:
MS>Тема представляет интерес для узкого круга людей, но может кому-то пригодится.
MS>Нарисовать сцену из Flash — задача очень непростая. Несмотря на то, что формат полностью открыт, но я пока что не видел ни одного флаш-плеера (кроме самого Flash), который бы делал все правильно. Дело в том, что формат данных завязан на алгоритм растеризации. Так называемая compound shape состоит не из замкнутых полигонов, закрашенных неким цветом, а из набора ребер с аттрибутами — цвет слева от ребра и цвет справа. Например:
MS>
MS>Формат данных для этого примерно таков:
MS>MS>BeginShape()
MS> BeginPath(left=none, right=green)
MS> Add Edges 1,2,3,4
MS> EndPath()
MS> BeginPath(left=blue, right=none)
MS> Add Edges 7,8,9,10
MS> EndPath()
MS> BeginPath(left=blue, right=green)
MS> Add Edges 5,6
MS> EndPath()
MS>EndShape()
MS>
MS>Все, никакой другой информации о полигонах нас нет.
MS>Чтобы нарисовать сцену, например при помощи WinAPI PolyPolygon, придется реконструировать замкнутые области в вектороном виде. Это является нетривиальной задачей и возможно даже вообще нерешаемой. Дело в том, что формат допускает некоторые глюки — например, самопересечения, хотя их по идее быть не должно. Оригинальный растеризатор Flash является зверски устойчивым к таким вещам, но добиться этого нелегко. Общая проблема всех попыток воспроизвести самопальный Flash Player — это "горизонтальные протечки".
MS>Думаю, что мне удалось решить проблему устойчивого растаризатора так же надежно, как и Flash. При этом качество
MS>сглаживания — гораздо лучше и возможно даже, что мой растеризатор быстрее работает (но не факт).
MS>А самое главное — модель данных Flash позволяет рисовать смежные области со сглаживанием (anti-alias) и без видимых швов. Но в данном примере это не реализовано — швы видны.
MS>Вот типичная compound shape:
MS>
MS>"Нестыковки" — это не глюки алгоритма, оно просто так изначально нарисовано Олегом Куваевым.
MS>Исходник здесь: http://antigrain.com/stuff/agg_flash.zip
MS>Он зависит от AGG, но кому сильно надо — разобраться несложно. Там всего два файла — agg_rasterizer_compound_aa.cpp, agg_rasterizer_compound_aa.h. Ну и маленькая функция рендерера, render_scanlines_compound_solid в flash.cpp.
MS>Для успешной компиляции надо положить, например, в agg23/research/win32/agg_flash/*.*
MS>Файл shapes — это "препарированная" Масяня. Запускаем и нажимаем пробел для рисования следующей compound shape. Навигации назад — нету. Кнопками +/- можно масштабировать относительно курсора. Векторого отсечения тоже нету, поэтому на очень больших масштабах — тормозит.
А как будет вести себя Flash Player при пересечении рёбер?