diff --git a/modules/automapaper/default.nix b/modules/automapaper/default.nix index a82f4f4..d3c80dd 100644 --- a/modules/automapaper/default.nix +++ b/modules/automapaper/default.nix @@ -5,39 +5,42 @@ in { options.modules.automapaper = { enable = lib.mkEnableOption "enable automapaper"; + displays = lib.mkOption { + type = with lib.types; listOf str; + }; configurations = lib.mkOption { description = "automapaper configurations per monitor"; type = with lib.types; attrsOf (submodule { options = { - init = mkOption { + init = lib.mkOption { type = str; description = "the shader executed to get the state for the initialisation, and re-initialisation steps"; }; - state = mkOption { + state = lib.mkOption { type = str; description = "the shader executed to increment the state to the next generation"; }; - display = mkOption { + display = lib.mkOption { type = str; description = "the shader executed to display the state to the monitor"; }; - horizontal = mkOption { + horizontal = lib.mkOption { type = int; description = "the amount of horizontal cells in the state"; }; - vertical = mkOption { + vertical = lib.mkOption { type = int; description = "the amount of vertical cells in the state"; }; - tps = { + tps = lib.mkOption { type = int; - description = "the amount of ticks to simulate each second"; + description = "the target amount of ticks to simulate each second"; }; - cycles = { + cycles = lib.mkOption { type = int; description = "the amount of state increments before the init shader is called again"; }; - frames_per_tick = { + frames_per_tick = lib.mkOption { type = int; description = "the amount of times to call the display shader for each iteration of the state shader"; }; @@ -57,27 +60,126 @@ in '' [display] name="${displayName}" - horizontal=${displayConfig.horizontal} - vertical=${displayConfig.vertical} - tps=${displayConfig.tps} + horizontal=${builtins.toString displayConfig.horizontal} + vertical=${builtins.toString displayConfig.vertical} + tps=${builtins.toString displayConfig.tps} state_frag="${state}" init_frag="${init}" display_frag="${display}" - cycles=${displayConfig.cycles} - frames_per_tick=${displayConfig.frames_per_tick} + cycles=${builtins.toString displayConfig.cycles} + frames_per_tick=${builtins.toString displayConfig.frames_per_tick} '' ) cfg.configurations; - in - { - wayland.windowManager.hyprland.exec-once = - lib.mkIf config.modules.hyprland.enable ( - lib.mapAttrsToList (name: config: - "${ - inputs.automapaper.packages.${pkgs.system}.default - }/bin/automapaper -C ${ - builtins.toFile "${name}.toml" config - }") cfg.displays - ); - }); + in { + modules.automapaper.configurations = + let + conf = { + horizontal = 256; + vertical = 144; + tps = 30; + init = '' + #version 310 es + precision highp float; + uniform float time; + uniform vec2 resolution; + + out vec4 stateColor; + + float PHI = 1.61803398874989484820459; // Φ = Golden Ratio + + float gold_noise(in vec2 xy, in float seed){ + return fract(tan(distance(xy*PHI, xy)*seed)*xy.x); + } + + void main( void ) { + + vec2 position = gl_FragCoord.xy; + float color = gold_noise(position.xy, fract(time)); + + + stateColor = vec4(step(0.3, color), 0,0,step(0.3, color)); + }''; + state= '' + #version 310 es + precision highp float; + + uniform sampler2D state; + uniform vec2 scale; + + out vec4 stateColor; + + vec4 get(int x, int y) { + return texture(state, (gl_FragCoord.xy + vec2(x, y)) / scale); + } + + void main() { + int sum = int(get(-1, -1).r + + get(-1, 0).r + + get(-1, 1).r + + get( 0, -1).r + + get( 0, 1).r + + get( 1, -1).r + + get( 1, 0).r + + get( 1, 1).r); + vec4 current = get(0,0); + if (sum == 3) { + stateColor.r = 1.0; + stateColor.g = 1.0; + } else if (sum == 2) { + stateColor = current; + if (current.r == 0.0) { + stateColor.g = max(current.g - 0.01, 0.0); + } + } else { + stateColor = vec4(0.0, max(current.g - 0.01, 0.0), 0.0, 1.0); + } + + }''; + display = '' + #version 310 es + precision highp float; + + uniform sampler2D tex2D; + uniform sampler2D old2D; + uniform ivec2 resolution; + uniform float frame_part; + + in highp vec2 texCoords; + out vec4 stateColor; + + const vec4 bgColor = vec4(38.0/255.0, 5.0/255.0, 46.0/255.0, 1.0); // #26052e + const vec4 fgColor = vec4(148.0/255.0, 15.0/255.0, 173.0/255.0, 1.0); // #950fad + + void main() { + vec2 canvasSize = vec2(textureSize(tex2D, 0)); + vec4 state = texture(tex2D, texCoords); + vec4 ostate = texture(old2D, texCoords); + + vec2 localCoords = fract(gl_FragCoord.xy / vec2(resolution) * canvasSize); + localCoords = localCoords - 0.5; + float dist = sqrt(dot(localCoords, localCoords)); + + float size = smoothstep(0.0, 1.0, pow(mix(ostate.g,state.g, frame_part), 3.0)) * 0.35; + float mask = 1.0 - step(size, dist); + + float brightness = mix(ostate.r,state.r, frame_part) + 0.2 * pow(mix(ostate.g,state.g, frame_part), 3.0); + stateColor = mix(bgColor, fgColor, brightness * mask); + }''; + cycles = 2500; + frames_per_tick = 1; + }; + in + { + "DP-3" = conf; + "DP-2" = conf; + }; + modules.automapaper.displays = + lib.mapAttrsToList (name: config: + "${ + inputs.automapaper.packages.${pkgs.system}.default + }/bin/automapaper -C ${ + builtins.toFile "${name}.toml" config + }") displays; + }); } diff --git a/modules/hyprland.nix b/modules/hyprland.nix index ac05e4b..0c38838 100644 --- a/modules/hyprland.nix +++ b/modules/hyprland.nix @@ -30,130 +30,132 @@ in config = lib.mkIf cfg.enable { modules = { automapaper = { - enable = lib.mkDefault true; + enable = lib.mkDefault true; }; waybar = { - modules = { - left = [ "hyprland/workspaces" "tray" "hyprland/window" ]; - center = [ "clock" ]; + modules = { + left = [ "hyprland/workspaces" "tray" "hyprland/window" ]; + center = [ "clock" ]; right = [ "custom/vpn" "wireplumber" "network" "cpu" "memory" "custom/poweroff" ]; - }; - enable = lib.mkDefault true; - }; - wofi.enable = lib.mkDefault true; - dunst.enable = lib.mkDefault true; - }; - # these are necessary for the config to function correctly - home.packages = with pkgs; [ - # I always want these with hyprland anyways - libnotify # to enable the notify-send command - wl-clipboard + }; + enable = lib.mkDefault true; + }; + wofi.enable = lib.mkDefault true; + dunst.enable = lib.mkDefault true; + }; + # these are necessary for the config to function correctly + home.packages = with pkgs; [ + # I always want these with hyprland anyways + libnotify # to enable the notify-send command + wl-clipboard - inputs.hyprpicker + inputs.hyprpicker - hypridle # TODO: remove when fixed with config - playerctl - ]; + hypridle # TODO: remove when fixed with config + playerctl + ]; - xdg.portal.configPackages = [ cfg.package ]; + xdg.portal.configPackages = [ cfg.package ]; - services.playerctld.enable = true; - wayland.windowManager.hyprland = { - enable = true; - package = cfg.package; - settings = { - monitor = [ - "DP-3,2560x1440@360,2560x0,1" - "DP-2,2560x1440@144,0x0,1" - "Unknown-1,disable" # NOTE: due to a driver bug a third monitor appears - ]; - windowrulev2 = [ - "opacity 1.0 0.6,class:^(kitty)$" - "stayfocused,class:^(wofi)$" - ]; - env = [ - "WLR_NO_HARDWARE_CURSORS,1" - ]; - exec-once = [ - "${pkgs.waybar}/bin/waybar" - "${pkgs.dunst}/bin/dunst" - "${cfg.package}/bin/hyprctl dispatcher focusmonitor 1" - "${pkgs.hypridle}/bin/hypridle" - ]; - general = { - sensitivity = "1.2"; - gaps_in = "2"; - gaps_out = "3"; - border_size = "3"; - "col.active_border"="0xff950fad"; - "col.inactive_border"="0xff26052e"; - }; - misc = { - key_press_enables_dpms = true; - }; - decoration = { - rounding = "6"; - active_opacity = "1"; - inactive_opacity = "1"; - }; - workspace = [ - "DP-3,1" - "DP-2,2" - ]; - animations = { - enabled = "1"; - animation = [ - "windows,1,2,default" - "border,1,10,default" - "fade,0,5,default" - "workspaces,1,4,default" - ]; - }; - "$mod" = "SUPER"; - bind = [ - "$mod,Return,exec,${cfg.terminal}/bin/${cfg.terminal.pname}" - "$mod,tab,cyclenext" - "SUPERSHIFT,Q,killactive" - "$mod,SPACE,exec,wofi-launch" - "$mod,P,exec,wofi-power" - "SUPERSHIFT,m,exit" - "$mod,H,movefocus,l" - "$mod,J,movefocus,u" - "$mod,K,movefocus,d" - "$mod,L,movefocus,r" - "SUPERSHIFT,H,movewindow,l" - "SUPERSHIFT,J,movewindow,u" - "SUPERSHIFT,K,movewindow,d" - "SUPERSHIFT,L,movewindow,r" - "$mod,F,togglefloating" - "$mod,X,togglespecialworkspace" - "SUPERSHIFT,X,movetoworkspace,special" - "SUPERSHIFT,S,exec,${pkgs.hyprshot}/bin/hyprshot -m region --clipboard-only" - "$mod,f11,fullscreen,0" - ",XF86AudioLowerVolume,exec,${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_SINK@ 1%-" - ",XF86AudioRaiseVolume,exec,${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_SINK@ 1%+" - ",XF86AudioMute,exec,${pkgs.wireplumber}/bin/wpctl set-mute @DEFAULT_SINK@ toggle" - ",XF86AudioPlay,exec,${pkgs.playerctl}/bin/playerctl play-pause" - ",XF86AudioPrev,exec,${pkgs.playerctl}/bin/playerctl previous" - ",XF86AudioNext,exec,${pkgs.playerctl}/bin/playerctl next" - ] - ++ ( - builtins.concatLists (builtins.genList ( - x: let - ws = builtins.toString (x); - in [ - "$mod,${ws},workspace,${ws}" - "ALT,${ws},movetoworkspace,${ws}" - ] - ) - 10) - ); - bindm = [ - "$mod,mouse:272,movewindow" - "$mod,mouse:273,resizewindow" - ]; - }; + services.playerctld.enable = true; + wayland.windowManager.hyprland = { + enable = true; + package = cfg.package; + settings = { + monitor = [ + "DP-3,2560x1440@360,2560x0,1" + "DP-2,2560x1440@144,0x0,1" + "Unknown-1,disable" # NOTE: due to a driver bug a third monitor appears + ]; + windowrulev2 = [ + "opacity 1.0 0.6,class:^(kitty)$" + "stayfocused,class:^(wofi)$" + ]; + env = [ + "WLR_NO_HARDWARE_CURSORS,1" + ]; + exec-once = [ + "${pkgs.waybar}/bin/waybar" + "${pkgs.dunst}/bin/dunst" + "${cfg.package}/bin/hyprctl dispatcher focusmonitor 1" + "${pkgs.hypridle}/bin/hypridle" + ] ++ builtins.map (name: + "${inputs.automapaper.packages.${pkgs.system}.default}/bin/automapaper -C ${name}" + ) config.modules.automapaper.displays; + general = { + sensitivity = "1.2"; + gaps_in = "2"; + gaps_out = "3"; + border_size = "3"; + "col.active_border"="0xff950fad"; + "col.inactive_border"="0xff26052e"; + }; + misc = { + key_press_enables_dpms = true; + }; + decoration = { + rounding = "6"; + active_opacity = "1"; + inactive_opacity = "1"; + }; + workspace = [ + "DP-3,1" + "DP-2,2" + ]; + animations = { + enabled = "1"; + animation = [ + "windows,1,2,default" + "border,1,10,default" + "fade,0,5,default" + "workspaces,1,4,default" + ]; + }; + "$mod" = "SUPER"; + bind = [ + "$mod,Return,exec,${cfg.terminal}/bin/${cfg.terminal.pname}" + "$mod,tab,cyclenext" + "SUPERSHIFT,Q,killactive" + "$mod,SPACE,exec,wofi-launch" + "$mod,P,exec,wofi-power" + "SUPERSHIFT,m,exit" + "$mod,H,movefocus,l" + "$mod,J,movefocus,u" + "$mod,K,movefocus,d" + "$mod,L,movefocus,r" + "SUPERSHIFT,H,movewindow,l" + "SUPERSHIFT,J,movewindow,u" + "SUPERSHIFT,K,movewindow,d" + "SUPERSHIFT,L,movewindow,r" + "$mod,F,togglefloating" + "$mod,X,togglespecialworkspace" + "SUPERSHIFT,X,movetoworkspace,special" + "SUPERSHIFT,S,exec,${pkgs.hyprshot}/bin/hyprshot -m region --clipboard-only" + "$mod,f11,fullscreen,0" + ",XF86AudioLowerVolume,exec,${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_SINK@ 1%-" + ",XF86AudioRaiseVolume,exec,${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_SINK@ 1%+" + ",XF86AudioMute,exec,${pkgs.wireplumber}/bin/wpctl set-mute @DEFAULT_SINK@ toggle" + ",XF86AudioPlay,exec,${pkgs.playerctl}/bin/playerctl play-pause" + ",XF86AudioPrev,exec,${pkgs.playerctl}/bin/playerctl previous" + ",XF86AudioNext,exec,${pkgs.playerctl}/bin/playerctl next" + ] + ++ ( + builtins.concatLists (builtins.genList ( + x: let + ws = builtins.toString (x); + in [ + "$mod,${ws},workspace,${ws}" + "ALT,${ws},movetoworkspace,${ws}" + ] + ) + 10) + ); + bindm = [ + "$mod,mouse:272,movewindow" + "$mod,mouse:273,resizewindow" + ]; + }; }; }; }