logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

pixel_fractal_anim.h (2622B)


  1. // Copyright (C) 2022 @filterpaper
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. // Inspired by 4x12 fractal from @GEIGEIGEIST
  4. #ifdef ENABLE_RGB_MATRIX_PIXEL_FRACTAL
  5. RGB_MATRIX_EFFECT(PIXEL_FRACTAL)
  6. # ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
  7. static bool PIXEL_FRACTAL(effect_params_t* params) {
  8. # if MATRIX_COLS < 2
  9. # define MID_COL 1
  10. # else
  11. # define MID_COL MATRIX_COLS / 2
  12. # endif
  13. static bool led[MATRIX_ROWS][MID_COL];
  14. static uint32_t wait_timer = 0;
  15. inline uint32_t interval(void) {
  16. return 3000 / scale16by8(qadd8(rgb_matrix_config.speed, 16), 16);
  17. }
  18. if (params->init) {
  19. rgb_matrix_set_color_all(0, 0, 0);
  20. }
  21. RGB_MATRIX_USE_LIMITS(led_min, led_max);
  22. if (g_rgb_timer > wait_timer) {
  23. rgb_t rgb = rgb_matrix_hsv_to_rgb(rgb_matrix_config.hsv);
  24. for (uint8_t h = 0; h < MATRIX_ROWS; ++h) {
  25. // Light and copy columns outward
  26. for (uint8_t l = 0; l < MID_COL - 1; ++l) {
  27. rgb_t index_rgb = led[h][l] ? (rgb_t){rgb.r, rgb.g, rgb.b} : (rgb_t){0, 0, 0};
  28. if (HAS_ANY_FLAGS(g_led_config.flags[g_led_config.matrix_co[h][l]], params->flags)) {
  29. rgb_matrix_set_color(g_led_config.matrix_co[h][l], index_rgb.r, index_rgb.g, index_rgb.b);
  30. }
  31. if (HAS_ANY_FLAGS(g_led_config.flags[g_led_config.matrix_co[h][MATRIX_COLS - 1 - l]], params->flags)) {
  32. rgb_matrix_set_color(g_led_config.matrix_co[h][MATRIX_COLS - 1 - l], index_rgb.r, index_rgb.g, index_rgb.b);
  33. }
  34. led[h][l] = led[h][l + 1];
  35. }
  36. // Light both middle columns
  37. rgb_t index_rgb = led[h][MID_COL - 1] ? (rgb_t){rgb.r, rgb.g, rgb.b} : (rgb_t){0, 0, 0};
  38. if (HAS_ANY_FLAGS(g_led_config.flags[g_led_config.matrix_co[h][MID_COL - 1]], params->flags)) {
  39. rgb_matrix_set_color(g_led_config.matrix_co[h][MID_COL - 1], index_rgb.r, index_rgb.g, index_rgb.b);
  40. }
  41. if (HAS_ANY_FLAGS(g_led_config.flags[g_led_config.matrix_co[h][MATRIX_COLS - MID_COL]], params->flags)) {
  42. rgb_matrix_set_color(g_led_config.matrix_co[h][MATRIX_COLS - MID_COL], index_rgb.r, index_rgb.g, index_rgb.b);
  43. }
  44. // Generate new random fractal column
  45. led[h][MID_COL - 1] = (random8() & 3) ? false : true;
  46. }
  47. wait_timer = g_rgb_timer + interval();
  48. }
  49. return rgb_matrix_check_finished_leds(led_max);
  50. }
  51. # endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
  52. #endif // ENABLE_RGB_MATRIX_PIXEL_FRACTAL