Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Pixel Bender/AGAL (http://www.flasher.ru/forum/forumdisplay.php?f=100)
-   -   Transition Bender (бабочка) (http://www.flasher.ru/forum/showthread.php?t=147772)

Zebestov 13.12.2010 21:33

Transition Bender (бабочка)
 
UPD: Окончательная рабочая версия с демкой и инструкциями тут.

Код:

<languageVersion : 1.0;>

kernel TransitionBend
<  namespace : "Transitions";
    vendor : "Vadim BELLinSKY";
    version : 1;
    description : "Transition Bend";
>
{
   
    // ширина изображения
    parameter float width
    <
        minValue:      0.0;
        maxValue:      2880.0;
        defaultValue:  0.0;
    >;
   
    // высота изображения
    parameter float height
    <
        minValue:      0.0;
        maxValue:      2880.0;
        defaultValue:  0.0;
    >;
   
    // степень сплющивания при переходе
    parameter float shrinking
    <
        minValue:      0.0;
        maxValue:      1.0;
        defaultValue:  0.25;
    >;

    // степень затенения
    parameter float shading
    <
        minValue:      0.0;
        maxValue:      1.0;
        defaultValue:  0.5;
    >;
   
    // фаза перехода от первого изображения ко второму
    parameter float phase
    <
        minValue:      0.0;
        maxValue:      1.0;
        defaultValue:  0.0;
    >;

    input image4 src1;
    input image4 src2;
    output pixel4 dst;
   
    const float PI    = 3.1415926353;
    const float PI_2  = PI * 0.5;
    const float PI2  = PI * 2.0;
   
    #define width2  float(width * 0.5)
    #define height2  float(height * 0.5)
    #define period1  float(PI_2 / height)
    #define period2  float(PI / width)
   
    void
    evaluatePixel()
    {
        float2 here = outCoord();
       
        float angle1 = here.y * period1 - (phase * 0.75 - 0.5) * PI2;
              angle1 = clamp(angle1, 0.0, PI);
       
        float angle2 = here.x * period2;
       
        float dx  = (width2 - here.x);
              dx /= cos(angle1);
       
        float dy  = (height2 - here.y);
              dy *= 1.0 + shrinking * sin(phase * PI) * (1.0 + sin(angle2));
       
       
        if (angle1 > PI_2)
        {
            dst = sampleNearest(src1, float2(width2 + dx, height2 - dy));
        }
        else
        {
            dst = sampleNearest(src2, float2(width2 - dx, height2 - dy));
        }
       
        if (abs(dx) > width2 || abs(dy) > height2)
        {
            dst.a = 0.0;
        }
       
        dst.rgb *= 1.0 - (1.0 - abs(cos(angle1))) * shading;

    }
}

Код AS3:

shader.data.width.value                = [_ширина изображения_];
shader.data.height.value        = [_высота изображения_];
shader.data.src1.input                = _bitmapData1_;
shader.data.src2.input                = _bitmapData2_;
shader.data.shrinking.value        = [_степень сплющивания от 0 до 1_]; // можно опустить, по умолчанию 0.25;
shader.data.shading.value        = [_степень затенения от 0 до 1_]; // можно опустить, по умолчанию 0.5;
shader.data.phase.value                = [_фаза от 0 до 1_];


iNils 27.01.2011 03:39

Здорово!

Zebestov 27.01.2011 03:51

Спасибо )

Волгоградец 28.01.2011 11:44

Очень круто!
У тебя есть блог, и ты молчишь )?

etc 28.01.2011 14:29

Красиво :)

Zebestov 28.01.2011 15:00

Цитата:

Сообщение от Волгоградец (Сообщение 968484)
Очень круто!
У тебя есть блог, и ты молчишь )?

Спасибо!
Блог я только начал, потому и помалкиваю )

Цитата:

Сообщение от etc (Сообщение 968539)
Красиво :)

И опять-таки благодарю )


Часовой пояс GMT +4, время: 15:39.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.