Recent

Author Topic: Hyperspace Jump and Exit(raylib)  (Read 131 times)

Guva

  • Full Member
  • ***
  • Posts: 173
  • 🌈 ZX-Spectrum !!!
Hyperspace Jump and Exit(raylib)
« on: April 26, 2025, 03:24:10 am »
Hyperspace Jump
Code: Pascal  [Select][+][-]
  1. program HyperspaceShaderRaylib;
  2.  
  3. uses
  4.   raylib, math;
  5.  
  6. const
  7.   SCREEN_WIDTH = 800;
  8.   SCREEN_HEIGHT = 600;
  9.  
  10. var
  11. Shader: TShader;
  12. StartTime: Single;
  13. iTimeLoc: Integer;
  14. iResolutionLoc: Integer;
  15. iMouseLoc: Integer;
  16. currentTime: Single;
  17. mousePos: TVector2;
  18. mouseDown: Single;
  19. mouse: array[0..2] of Single;
  20. resolution: array[0..1] of Single;
  21.  
  22. const
  23.   SHADER_CODE =
  24.   // shader author blue_max
  25.   // https://www.shadertoy.com/user/blue_max
  26.   '#version 330'#10 +
  27.   'uniform float iTime;'#10 +
  28.   'uniform vec2 iResolution;'#10 +
  29.   'uniform vec3 iMouse;'#10 +
  30.   'out vec4 fragColor;'#10 +
  31.   '#define TAU 6.28318'#10 +
  32.   '#define FLARE 1'#10 +
  33.   '#define NUM_SLICES 125.0'#10 +
  34.   'const float MAX_SLICE_OFFSET = 0.4;'#10 +
  35.   'const float T_MAX = 2.0;'#10 +
  36.   'const float T_JUMP = 0.75;'#10 +
  37.   'const float jump_speed = 15.0;'#10 +
  38.   'const vec3 blue_col = vec3(0.3, 0.3, 0.5);'#10 +
  39.   'const vec3 white_col = vec3(0.85, 0.85, 0.9);'#10 +
  40.   'const vec3 flare_col = vec3(0.9, 0.9, 1.4);'#10 +
  41.   'float sdLine(in vec2 p, in vec2 a, in vec2 b, in float ring)'#10 +
  42.   '{'#10 +
  43.   '    vec2 pa = p-a, ba = b-a;'#10 +
  44.   '    float h = clamp(dot(pa,ba)/dot(ba,ba), 0.0, 1.0);'#10 +
  45.   '    return length(pa - ba*h) - ring;'#10 +
  46.   '}'#10 +
  47.   'float rand(vec2 co)'#10 +
  48.   '{'#10 +
  49.   '    return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);'#10 +
  50.   '}'#10 +
  51.   'vec3 lensflare(vec3 uv, vec3 pos, float flare_size, float ang_offset)'#10 +
  52.   '{'#10 +
  53.   '    float z = uv.z / length(uv.xy);'#10 +
  54.   '    vec2 main = uv.xy - pos.xy;'#10 +
  55.   '    float dist = length(main);'#10 +
  56.   '    float num_points = 2.71;'#10 +
  57.   '    float disk_size = 0.2;'#10 +
  58.   '    float inv_size = 1.0 / flare_size;'#10 +
  59.   '    float ang = atan(main.y, main.x) + ang_offset;'#10 +
  60.   '    float fade = (z < 0.0) ? -z : 1.0;'#10 +
  61.   '    float f0 = 1.0/(dist * inv_size + 1.0);'#10 +
  62.   '    f0 = f0 + f0 * (0.1 * sin((sin(ang*2.0 + pos.x)*4.0 - cos(ang*3.0 + pos.y)) * num_points) + disk_size);'#10 +
  63.   '    if (z < 0.0)'#10 +
  64.   '        return clamp(mix(vec3(f0), vec3(0.0), 0.75 * fade), 0.0, 1.0);'#10 +
  65.   '    else'#10 +
  66.   '        return vec3(f0);'#10 +
  67.   '}'#10 +
  68.   'vec3 cc(vec3 color, float factor, float factor2)'#10 +
  69.   '{'#10 +
  70.   '    float w = color.x+color.y+color.z;'#10 +
  71.   '    return mix(color, vec3(w)*factor, w*factor2);'#10 +
  72.   '}'#10 +
  73.   'void main()'#10 +
  74.   '{'#10 +
  75.   '    vec3 color = vec3(0.0);'#10 +
  76.   '    float time = mod(iTime, T_MAX);'#10 +
  77.   '    float t = time / T_MAX;'#10 +
  78.   '    vec2 p = (2.0 * gl_FragCoord.xy - iResolution.xy) / min(iResolution.x, iResolution.y);'#10 +
  79.   '    vec2 mo = (2.0 * iMouse.xy - iResolution.xy) / min(iResolution.x, iResolution.y);'#10 +
  80.   '    p += vec2(0, -0.2);'#10 +
  81.   '    float ay = 0.0, ax = 0.0;'#10 +
  82.   '    if (iMouse.z > 0.0) {'#10 +
  83.   '        ay = 3.0 * mo.x;'#10 +
  84.   '        ax = 3.0 * mo.y;'#10 +
  85.   '    }'#10 +
  86.   '    mat3 mY = mat3('#10 +
  87.   '         cos(ay), 0.0,  sin(ay),'#10 +
  88.   '         0.0,     1.0,      0.0,'#10 +
  89.   '        -sin(ay), 0.0,  cos(ay)'#10 +
  90.   '    );'#10 +
  91.   '    mat3 mX = mat3('#10 +
  92.   '        1.0,      0.0,     0.0,'#10 +
  93.   '        0.0,  cos(ax), sin(ax),'#10 +
  94.   '        0.0, -sin(ax), cos(ax)'#10 +
  95.   '    );'#10 +
  96.   '    mat3 m = mX * mY;'#10 +
  97.   '    vec3 v = vec3(p, 1.0);'#10 +
  98.   '    v = m * v;'#10 +
  99.   '    float fade = clamp(mix(0.1, 1.1, t * 2.0), 0.0, 2.0);'#10 +
  100.   '    for(float i = 0.0; i < 80.0; i++)'#10 +
  101.   '    {'#10 +
  102.   '        vec3 trail_color = vec3(0.0);'#10 +
  103.   '        float angle = atan(v.y, v.x) / 3.141592 / 2.0 + 0.13 * i;'#10 +
  104.   '        float slice = floor(angle * NUM_SLICES);'#10 +
  105.   '        float slice_fract = fract(angle * NUM_SLICES);'#10 +
  106.   '        float slice_offset = MAX_SLICE_OFFSET * '#10 +
  107.   '            rand(vec2(slice, 4.0 + i * 25.0)) - (MAX_SLICE_OFFSET / 2.0);'#10 +
  108.   '        float dist = 10.0 * rand(vec2(slice, 1.0 + i * 10.0)) - 5.0;'#10 +
  109.   '        float z = dist * v.z / length(v.xy);'#10 +
  110.   '        float f = sign(dist);'#10 +
  111.   '        if (f == 0.0) f = 1.0;'#10 +
  112.   '        float fspeed = f * (0.1 * rand(vec2(slice, 1.0 + i * 10.0)) + i * 0.01);'#10 +
  113.   '        float fjump_speed = f * jump_speed;'#10 +
  114.   '        float trail_start = 10.0 * rand(vec2(slice, 0.0 + i * 10.0)) - 5.0;'#10 +
  115.   '        trail_start -= mix(0.0, fjump_speed, smoothstep(T_JUMP, 1.0, t));'#10 +
  116.   '        float trail_end = trail_start - t * fspeed;'#10 +
  117.   '        float trail_x = smoothstep(trail_start, trail_end, z);'#10 +
  118.   '        trail_color = mix(blue_col, white_col, trail_x);'#10 +
  119.   '        float h = sdLine('#10 +
  120.   '            vec2(slice_fract + slice_offset, z),'#10 +
  121.   '            vec2(0.5, trail_start), '#10 +
  122.   '            vec2(0.5, trail_end),'#10 +
  123.   '            mix(0.0, 0.015, t * z));'#10 +
  124.   '        float threshold = 0.09;'#10 +
  125.   '        h = (h < 0.01) ? 1.0 : 0.85 * smoothstep(threshold, 0.0, abs(h));'#10 +
  126.   '        trail_color *= fade * h;'#10 +
  127.   '        color = max(color, trail_color);'#10 +
  128.   '    }'#10 +
  129.   '#ifdef FLARE'#10 +
  130.   '    float flare_size = mix(0.0, 0.1, smoothstep(0.35, T_JUMP + 0.2, t));'#10 +
  131.   '    flare_size += mix(0.0, 20.0, smoothstep(T_JUMP + 0.05, 1.0, t));'#10 +
  132.   '    vec3 flare = flare_col * lensflare(v, vec3(0.0), flare_size, t);'#10 +
  133.   '    color += cc(flare, 0.5, 0.1);'#10 +
  134.   '    color += mix(0.0, 1.0, smoothstep(T_JUMP + 0.1, 1.0, t));'#10 +
  135.   '#else'#10 +
  136.   '    color += mix(0.0, 1.0, smoothstep(T_JUMP - 0.0, 1.0, t));'#10 +
  137.   '#endif'#10 +
  138.   '    fragColor = vec4(color, 1.0);'#10 +
  139.   '}';
  140.  
  141. begin
  142.   // Инициализация окна
  143.   InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, 'Hyperspace Shader with Raylib');
  144.   SetTargetFPS(60);
  145.  
  146.   // Загрузка шейдера из строки
  147.   Shader := LoadShaderFromMemory(nil, PChar(SHADER_CODE));
  148.  
  149.   // Получение локаций uniform-переменных
  150.   iTimeLoc := GetShaderLocation(Shader, 'iTime');
  151.   iResolutionLoc := GetShaderLocation(Shader, 'iResolution');
  152.   iMouseLoc := GetShaderLocation(Shader, 'iMouse');
  153.  
  154.   // Установка разрешения
  155.   resolution[0] := SCREEN_WIDTH;
  156.   resolution[1] := SCREEN_HEIGHT;
  157.   SetShaderValue(Shader, iResolutionLoc, @resolution, SHADER_UNIFORM_VEC2);
  158.  
  159.   StartTime := GetTime();
  160.  
  161.   // Главный цикл
  162.   while not WindowShouldClose() do
  163.   begin
  164.     // Обновление
  165.     currentTime := GetTime() - StartTime;
  166.     SetShaderValue(Shader, iTimeLoc, @currentTime, SHADER_UNIFORM_FLOAT);
  167.  
  168.     // Установка позиции мыши
  169.     mousePos := GetMousePosition();
  170.     if IsMouseButtonDown(MOUSE_LEFT_BUTTON) then
  171.       mouseDown := 1.0
  172.     else
  173.       mouseDown := 0.0;
  174.  
  175.     mouse[0] := mousePos.x;
  176.     mouse[1] := mousePos.y;
  177.     mouse[2] := mouseDown;
  178.     SetShaderValue(Shader, iMouseLoc, @mouse, SHADER_UNIFORM_VEC3);
  179.  
  180.     // Рендеринг
  181.     BeginDrawing();
  182.       ClearBackground(BLACK);
  183.  
  184.       // Рисуем шейдер на весь экран
  185.       BeginShaderMode(Shader);
  186.         DrawRectangle(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, WHITE);
  187.       EndShaderMode();
  188.  
  189.       // Выводим инструкции
  190.       DrawText('Click and drag mouse to rotate hyperspace effect', 10, 10, 20, LIGHTGRAY);
  191.     EndDrawing();
  192.   end;
  193.  
  194.   // Очистка
  195.   UnloadShader(Shader);
  196.   CloseWindow();
  197. end.
  198.  

Hyperspace Exit
Code: Pascal  [Select][+][-]
  1. program HyperspaceShader;
  2.  
  3. uses
  4.   raylib, math;
  5.  
  6. const
  7.   SCREEN_WIDTH = 800;
  8.   SCREEN_HEIGHT = 600;
  9.  
  10.   SHADER_CODE =
  11.   '#version 330'#10 +
  12.   'uniform float iTime;'#10 +
  13.   'uniform vec2 iResolution;'#10 +
  14.   'uniform vec3 iMouse;'#10 +
  15.   'out vec4 fragColor;'#10 +
  16.   '#define TAU 6.28318'#10 +
  17.   '#define NUM_SLICES 125.0'#10 +
  18.   'const float MAX_SLICE_OFFSET = 0.4;'#10 +
  19.   'const float T_MAX = 2.0;'#10 +
  20.   'const float T_JUMP = 0.90;'#10 +
  21.   'const float jump_speed = 5.0;'#10 +
  22.   'const vec3 blue_col = vec3(0.3, 0.3, 0.6);'#10 +
  23.   'const vec3 white_col = vec3(0.8, 0.8, 0.95);'#10 +
  24.   'float sdLine(in vec2 p, in vec2 a, in vec2 b, in float ring)'#10 +
  25.   '{'#10 +
  26.   '    vec2 pa = p-a, ba = b-a;'#10 +
  27.   '    float h = clamp(dot(pa,ba)/dot(ba,ba), 0.0, 1.0);'#10 +
  28.   '    return length(pa - ba*h) - ring;'#10 +
  29.   '}'#10 +
  30.   'float rand(vec2 co)'#10 +
  31.   '{'#10 +
  32.   '    return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);'#10 +
  33.   '}'#10 +
  34.   'void main()'#10 +
  35.   '{'#10 +
  36.   '    vec3 color = vec3(0.0);'#10 +
  37.   '    float time = mod(iTime, T_MAX);'#10 +
  38.   '    float t = time / T_MAX;'#10 +
  39.   '    vec2 mo = (2.0 * iMouse.xy - iResolution.xy) / min(iResolution.x, iResolution.y);'#10 +
  40.   '    vec2 p = (2.0 * gl_FragCoord.xy - iResolution.xy) / min(iResolution.x, iResolution.y);'#10 +
  41.   '    float p_len = length(p);'#10 +
  42.   '    p += vec2(0, -0.2);'#10 +
  43.   '    float ta = TAU * mod(iTime, 8.0) / 8.0;'#10 +
  44.   '    float ay = 0.0, ax = 0.0, az = 0.0;'#10 +
  45.   '    if (iMouse.z > 0.0) {'#10 +
  46.   '        ay = 3.0 * mo.x;'#10 +
  47.   '        ax = 3.0 * mo.y;'#10 +
  48.   '    }'#10 +
  49.   '    mat3 mY = mat3('#10 +
  50.   '         cos(ay), 0.0,  sin(ay),'#10 +
  51.   '         0.0,     1.0,      0.0,'#10 +
  52.   '        -sin(ay), 0.0,  cos(ay)'#10 +
  53.   '    );'#10 +
  54.   '    mat3 mX = mat3('#10 +
  55.   '        1.0,      0.0,     0.0,'#10 +
  56.   '        0.0,  cos(ax), sin(ax),'#10 +
  57.   '        0.0, -sin(ax), cos(ax)'#10 +
  58.   '    );'#10 +
  59.   '    mat3 m = mX * mY;'#10 +
  60.   '    vec3 v = vec3(p, 1.0);'#10 +
  61.   '    v = m * v;'#10 +
  62.   '    float trail_start, trail_end, trail_length = 1.0, trail_x;'#10 +
  63.   '    float fade = mix(1.4, 0.0, smoothstep(0.65, 0.95, t));'#10 +
  64.   '    for(float i = 0.0; i < 60.0; i++)'#10 +
  65.   '    {'#10 +
  66.   '        vec3 trail_color = vec3(0.0);'#10 +
  67.   '        float angle = atan(v.y, v.x) / 3.141592 / 2.0 + 0.13 * i;'#10 +
  68.   '        float slice = floor(angle * NUM_SLICES);'#10 +
  69.   '        float slice_fract = fract(angle * NUM_SLICES);'#10 +
  70.   '        float slice_offset = MAX_SLICE_OFFSET * '#10 +
  71.   '            rand(vec2(slice, 4.0 + i * 25.0)) - (MAX_SLICE_OFFSET / 2.0);'#10 +
  72.   '        float dist = 10.0 * rand(vec2(slice, 1.0 + i * 2.0)) - 5.0;'#10 +
  73.   '        float z = dist * v.z / length(v.xy);'#10 +
  74.   '        float f = sign(dist);'#10 +
  75.   '        if (f == 0.0) f = 1.0;'#10 +
  76.   '        float fspeed = f * (rand(vec2(slice, 1.0 + i * 0.1)) + i * 0.01);'#10 +
  77.   '        float fjump_speed = f * jump_speed;'#10 +
  78.   '        float ftrail_length = f * trail_length;'#10 +
  79.   '        trail_end = 10.0 * rand(vec2(slice, i + 10.0)) - 5.0;'#10 +
  80.   '        trail_end -= t * fspeed;'#10 +
  81.   '        trail_start = trail_end + ftrail_length;'#10 +
  82.   '        if (f >= 0.0) {'#10 +
  83.   '            trail_start = max(trail_end,'#10 +
  84.   '                              trail_start - (t * fspeed) - '#10 +
  85.   '                                mix(0.0, fjump_speed, '#10 +
  86.   '                                    smoothstep(0.5, 1.0, t))'#10 +
  87.   '                              );'#10 +
  88.   '        } else {'#10 +
  89.   '            trail_start = min(trail_end,'#10 +
  90.   '                              trail_start - (t * fspeed) -'#10 +
  91.   '                                mix(0.0, fjump_speed, '#10 +
  92.   '                                    smoothstep(0.5, 1.0, t))'#10 +
  93.   '                              );'#10 +
  94.   '        }'#10 +
  95.   '        trail_x = smoothstep(trail_start, trail_end, z);'#10 +
  96.   '        trail_color = mix(blue_col, white_col, trail_x);'#10 +
  97.   '        float h = sdLine('#10 +
  98.   '            vec2(slice_fract + slice_offset, z),'#10 +
  99.   '            vec2(0.5, trail_start), '#10 +
  100.   '            vec2(0.5, trail_end),'#10 +
  101.   '            mix(0.0, 0.015, z));'#10 +
  102.   '        float threshold = mix(0.12, 0.0, smoothstep(0.5, 0.8, t));'#10 +
  103.   '        h = (h < 0.01) ? 1.0 : 0.75 * smoothstep(threshold, 0.0, abs(h));'#10 +
  104.   '        trail_color *= fade * h;'#10 +
  105.   '        color = max(color, trail_color);'#10 +
  106.   '    }'#10 +
  107.   '    color += mix(1.0, 0.0, smoothstep(0.0, 0.2, t));'#10 +
  108.   '    fragColor = vec4(color, 1.0);'#10 +
  109.   '}';
  110.  
  111. var
  112.   Shader: TShader;
  113.   StartTime: Single;
  114.   iTimeLoc: Integer;
  115.   iResolutionLoc: Integer;
  116.   iMouseLoc: Integer;
  117.   currentTime: Single;
  118.   mousePos: TVector2;
  119.   mouseDown: Single;
  120.   mouse: array[0..2] of Single;
  121.   resolution: array[0..1] of Single;
  122.  
  123. begin
  124.   // Инициализация окна
  125.   InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, 'Hyperspace Shader with Raylib');
  126.   SetTargetFPS(60);
  127.  
  128.   // Загрузка шейдера из строки
  129.   Shader := LoadShaderFromMemory(nil, PChar(SHADER_CODE));
  130.  
  131.   // Получение локаций uniform-переменных
  132.   iTimeLoc := GetShaderLocation(Shader, 'iTime');
  133.   iResolutionLoc := GetShaderLocation(Shader, 'iResolution');
  134.   iMouseLoc := GetShaderLocation(Shader, 'iMouse');
  135.  
  136.   // Установка разрешения
  137.   resolution[0] := SCREEN_WIDTH;
  138.   resolution[1] := SCREEN_HEIGHT;
  139.   SetShaderValue(Shader, iResolutionLoc, @resolution, SHADER_UNIFORM_VEC2);
  140.  
  141.   StartTime := GetTime();
  142.  
  143.   // Главный цикл
  144.   while not WindowShouldClose() do
  145.   begin
  146.     // Обновление
  147.     currentTime := GetTime() - StartTime;
  148.     SetShaderValue(Shader, iTimeLoc, @currentTime, SHADER_UNIFORM_FLOAT);
  149.  
  150.     // Установка позиции мыши
  151.     mousePos := GetMousePosition();
  152.     if IsMouseButtonDown(MOUSE_LEFT_BUTTON) then
  153.       mouseDown := 1.0
  154.     else
  155.       mouseDown := 0.0;
  156.  
  157.     mouse[0] := mousePos.x;
  158.     mouse[1] := mousePos.y;
  159.     mouse[2] := mouseDown;
  160.     SetShaderValue(Shader, iMouseLoc, @mouse, SHADER_UNIFORM_VEC3);
  161.  
  162.     // Рендеринг
  163.     BeginDrawing();
  164.       ClearBackground(BLACK);
  165.  
  166.       // Рисуем шейдер на весь экран
  167.       BeginShaderMode(Shader);
  168.         DrawRectangle(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, WHITE);
  169.       EndShaderMode();
  170.  
  171.       // Выводим инструкции
  172.       DrawText('Click and drag mouse to rotate hyperspace effect', 10, 10, 20, LIGHTGRAY);
  173.     EndDrawing();
  174.   end;
  175.  
  176.   // Очистка
  177.   UnloadShader(Shader);
  178.   CloseWindow();
  179. end.
  180.  
« Last Edit: April 26, 2025, 03:55:20 am by Guva »

 

TinyPortal © 2005-2018