From ebfb6e239a2941de44f1c4085d7061e01f78a0ac Mon Sep 17 00:00:00 2001 From: IXtreme Date: Sun, 12 Jan 2025 01:56:55 -0500 Subject: [PATCH] the go back commit --- Makefile | 7 ++++ src/main.cpp | 84 +++++++++++++++++++++++++++++++--------- src/mpris_connection.cpp | 40 +++++++++++++++++++ src/mpris_connection.hpp | 5 +++ 4 files changed, 118 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index ac083bb..aaa291c 100644 --- a/Makefile +++ b/Makefile @@ -58,8 +58,15 @@ CPP_SRC += $(wildcard $(SRC_DIR)/material-colors/cpp/quantize/wsmeans.cpp) CPP_SRC += $(wildcard $(SRC_DIR)/material-colors/cpp/quantize/wu.cpp) CPP_SRC += $(wildcard $(SRC_DIR)/material-colors/cpp/quantize/lab.cpp) CPP_SRC += $(wildcard $(SRC_DIR)/material-colors/cpp/utils/utils.cpp) +CPP_SRC += $(wildcard $(SRC_DIR)/material-colors/cpp/cam/cam.cpp) +CPP_SRC += $(wildcard $(SRC_DIR)/material-colors/cpp/cam/hct.cpp) +CPP_SRC += $(wildcard $(SRC_DIR)/material-colors/cpp/cam/hct_solver.cpp) +CPP_SRC += $(wildcard $(SRC_DIR)/material-colors/cpp/cam/viewing_conditions.cpp) +CPP_SRC += $(wildcard $(SRC_DIR)/material-colors/cpp/score/score.cpp) EXTRA_DIRS += $(OBJ_DIR)/material-colors/cpp/quantize EXTRA_DIRS += $(OBJ_DIR)/material-colors/cpp/utils +EXTRA_DIRS += $(OBJ_DIR)/material-colors/cpp/score +EXTRA_DIRS += $(OBJ_DIR)/material-colors/cpp/cam ifeq ($(IMGUI_MODE), BUILD) CPP_SRC += $(wildcard $(SRC_DIR)/imgui/*.cpp) #GET LIST OF ALL CPP FILES diff --git a/src/main.cpp b/src/main.cpp index eed9b88..1d6bf20 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,8 +7,8 @@ #include #define IMGUI_DEFINE_MATH_OPERATORS #include "raylib.h" -#include "rlgl.h" #include "raymath.h" +#include "rlgl.h" #include #include #include @@ -233,18 +233,22 @@ float ScaleToFit(Vector2 src, Vector2 dst) { // return Vector2Scale(src, ratio); } -void GenCircleOverlay(RenderTexture tex, bool trans) { +void GenCircleOverlay(MprisPlayer *current_player, RenderTexture tex, bool trans, bool accent) { BeginTextureMode(tex); if (trans) { ClearBackground(WHITE); } else { - ClearBackground(BLACK); + if (accent) { + ClearBackground(current_player->GetPrimaryColor()); + } else { + ClearBackground(BLACK); + } } BeginBlendMode(BLEND_SUBTRACT_COLORS); if (trans) { - DrawCircle(GetScreenWidth()/2, GetScreenHeight()/2, std::min(GetScreenWidth()/2, GetScreenHeight()/2), WHITE); + DrawCircle(GetScreenWidth() / 2, GetScreenHeight() / 2, std::min(GetScreenWidth() / 2, GetScreenHeight() / 2), WHITE); } else { - DrawCircle(GetScreenWidth()/2, GetScreenHeight()/2, std::min(GetScreenWidth()/2, GetScreenHeight()/2), (Color{0,0,0,0})); + DrawCircle(GetScreenWidth() / 2, GetScreenHeight() / 2, std::min(GetScreenWidth() / 2, GetScreenHeight() / 2), (Color{0, 0, 0, 0})); } EndBlendMode(); EndTextureMode(); @@ -257,13 +261,13 @@ int main(int argc, char *argv[]) { int screenHeight = 800; // SetConfigFlags(FLAG_MSAA_4X_HINT | FLAG_WINDOW_RESIZABLE); - //SetConfigFlags(FLAG_MSAA_4X_HINT | FLAG_VSYNC_HINT | FLAG_WINDOW_RESIZABLE); - SetConfigFlags(FLAG_WINDOW_TRANSPARENT | FLAG_MSAA_4X_HINT | FLAG_WINDOW_RESIZABLE); + // SetConfigFlags(FLAG_MSAA_4X_HINT | FLAG_VSYNC_HINT | FLAG_WINDOW_RESIZABLE); + SetConfigFlags(FLAG_WINDOW_TRANSPARENT | FLAG_MSAA_4X_HINT | FLAG_WINDOW_RESIZABLE | FLAG_VSYNC_HINT); InitWindow(screenWidth, screenHeight, "raylib-Extras [ImGui] example - Docking"); SetTargetFPS(244); rlImGuiSetup(true); ImGui::GetStyle().AntiAliasedLinesUseTex = false; - //SetWindowState(FLAG_WINDOW_UNDECORATED); + // SetWindowState(FLAG_WINDOW_UNDECORATED); TestC(); TestCPPFunc(); @@ -284,17 +288,28 @@ int main(int argc, char *argv[]) { // Main game loop bool goodstate = false; bool trans = false; + bool accent = true; + + long imagecount = -1; + + bool showMetricsWindow = false; RenderTexture recordoverlay = LoadRenderTexture(screenWidth, screenHeight); - GenCircleOverlay(recordoverlay, trans); + GenCircleOverlay(¤t_player, recordoverlay, trans, accent); while (!WindowShouldClose() && run) // Detect window close button or ESC key, or a quit from the menu { if (IsWindowResized()) { UnloadRenderTexture(recordoverlay); recordoverlay = LoadRenderTexture(GetScreenWidth(), GetScreenHeight()); - GenCircleOverlay(recordoverlay, trans); + GenCircleOverlay(¤t_player, recordoverlay, trans, accent); } + + if (current_player.imagecount > imagecount) { + imagecount = current_player.imagecount; + GenCircleOverlay(¤t_player, recordoverlay, trans, accent); + } + if (GetTime() > lasttime + 3) { lasttime = GetTime(); current_player.Refresh(); @@ -302,7 +317,7 @@ int main(int argc, char *argv[]) { BeginDrawing(); if (trans) { - ClearBackground((Color) {0,0,0,0}); + ClearBackground((Color){0, 0, 0, 0}); } else { ClearBackground(BLACK); } @@ -353,7 +368,7 @@ int main(int argc, char *argv[]) { } else if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) && CheckCollisionPointCircle(GetMousePosition(), back, 0.05 * GetScreenWidth())) { current_player.Prev(); current_player.playstate = current_player.playstate == "Playing" ? "Paused" : "Playing"; - } else if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { + } else if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) && disc.enabled) { float initmouserot; Vector2 initmousepos; if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { @@ -380,16 +395,16 @@ int main(int argc, char *argv[]) { } disc.accel = disc.target - disc.velo; } - if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT)) { - goodstate = false; - } + if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT)) { + goodstate = false; + } if (disc.active) { if (trans) { - rlSetBlendFactors(1,1, 0x800B); + rlSetBlendFactors(1, 1, 0x800B); BeginBlendMode(BLEND_CUSTOM); } - DrawTexture(recordoverlay.texture, 0, 0 , WHITE); + DrawTexture(recordoverlay.texture, 0, 0, WHITE); if (trans) { EndBlendMode(); } @@ -402,6 +417,7 @@ int main(int argc, char *argv[]) { // start ImGui content if (showIMgui) { + disc.enabled = false; rlImGuiBegin(); // if you want windows to dock to the viewport, call this. @@ -421,6 +437,9 @@ int main(int argc, char *argv[]) { current_player = MprisPlayer(item); } } + if (ImGui::MenuItem("Refresh")) { + serviceList = GetMprisServices(); + } ImGui::EndMenu(); } @@ -432,11 +451,26 @@ int main(int argc, char *argv[]) { } if (ImGui::MenuItem("Trans Mode !!", nullptr, trans)) { trans = !trans; - GenCircleOverlay(recordoverlay, trans); + GenCircleOverlay(¤t_player, recordoverlay, trans, accent); + } + if (ImGui::MenuItem("Accent Mode !!", nullptr, accent)) { + accent = !accent; + GenCircleOverlay(¤t_player, recordoverlay, trans, accent); } ImGui::EndMenu(); } + if (ImGui::BeginMenu("Tools")) { + if (ImGui::MenuItem("Debug Window", nullptr, showMetricsWindow)) { + showMetricsWindow = !showMetricsWindow; + } + ImGui::EndMenu(); + } + ImGui::EndMainMenuBar(); + + if (showMetricsWindow) { + ImGui::ShowMetricsWindow(); + } } // show some windows @@ -466,6 +500,18 @@ int main(int argc, char *argv[]) { ImGui::Separator(); ImGui::LabelText("Disc Info", "P: %f, V: %f, A: %f", disc.pos, disc.velo, disc.accel); rlImGuiImageSize(¤t_player.tex.tex, 300, 300); + + ImGui::Separator(); + int inc = 0; + for (auto obj : current_player.accent_colors) { + + float col[3] = {0, 0, 0}; + col[0] = ((float)obj.r) / 255; + col[1] = ((float)obj.g) / 255; + col[2] = ((float)obj.b) / 255; + ImGui::ColorEdit3(("lf" + std::to_string(inc)).c_str(), col); + inc++; + } } ImGui::End(); @@ -474,6 +520,8 @@ int main(int argc, char *argv[]) { // end ImGui Content rlImGuiEnd(); + } else { + disc.enabled = true; } EndDrawing(); diff --git a/src/mpris_connection.cpp b/src/mpris_connection.cpp index a99b3d1..7212d23 100644 --- a/src/mpris_connection.cpp +++ b/src/mpris_connection.cpp @@ -5,6 +5,7 @@ #define IMGUI_DEFINE_MATH_OPERATORS #include "imgui.h" +#include #include #include #include @@ -19,6 +20,7 @@ MprisPlayer::MprisPlayer(std::string servicename) { image_path_cache = "NULL"; PlayerProxy = sdbus::createProxy(dest, objec); mp2 = "org.mpris.MediaPlayer2.Player"; + imagecount = 0; Refresh(); } @@ -62,6 +64,33 @@ void MprisPlayer::Refresh() { if (current_metadata["mpris:artUrl"].get() != image_path_cache) { image_path_cache = current_metadata["mpris:artUrl"].get(); UpdateTexture(); + auto img = LoadImageFromTexture(tex.tex); + + std::vector argbs; + material_color_utilities::QuantizerResult res; + if (img.format == PIXELFORMAT_UNCOMPRESSED_R8G8B8A8) { + auto data = (char*) img.data; + for (int i = 0; i < img.width * img.height * 4; i += 4) { + material_color_utilities::Argb color = (data[i] << 16) | (data[i + 1] << 8) | (data[i + 2]) | (data[i + 3] << 24); + argbs.push_back(color); + } + res = material_color_utilities::QuantizeCelebi(argbs, 16); + } else if (img.format == PIXELFORMAT_UNCOMPRESSED_R8G8B8) { + auto data = (char*) img.data; + for (int i = 0; i < img.width * img.height * 3; i += 3) { + material_color_utilities::Argb color = (data[i] << 16) | (data[i + 1] << 8) | (data[i + 2] | (0xFF << 24)); + argbs.push_back(color); + } + res = material_color_utilities::QuantizeCelebi(argbs, 16); + } + + auto colors = material_color_utilities::RankedSuggestions(res.color_to_count, material_color_utilities::ScoreOptions()); + accent_colors.clear(); + for (auto obj : colors) { + accent_colors.push_back((Color) {.r=(unsigned char) ((obj >> 16) & 0xFF), .g=(unsigned char)( (obj >> 8) & 0xFF ), .b=(unsigned char)((obj >> 0) & 0xFF), .a=(unsigned char)((obj>>24) & 0xFF) }); + } + imagecount = imagecount + 1; + } } catch (const std::exception& e) {} return; @@ -177,6 +206,16 @@ void MprisPlayer::UpdateTexture() { } } +Color MprisPlayer::GetPrimaryColor() { + if (accent_colors.empty()) { + return BLACK; + } else { + std::cout << "here" << std::endl; + return accent_colors[0]; + } +} + + DiscObject::DiscObject(float ia) { pos = 0; prevouspos = 0; @@ -184,6 +223,7 @@ DiscObject::DiscObject(float ia) { accel = 0; target = ia; active = true; + enabled = true; } void DiscObject::Activate() { diff --git a/src/mpris_connection.hpp b/src/mpris_connection.hpp index c48e43f..30c98bd 100644 --- a/src/mpris_connection.hpp +++ b/src/mpris_connection.hpp @@ -10,6 +10,7 @@ #include #include #include +#include "cpp/quantize/celebi.h" class RayTexture { public: @@ -30,6 +31,7 @@ public: float accel; float target; bool active; + bool enabled; DiscObject(float ia); void UpdatePos(float dtime); void UpdatePos(float pos, float dtime); @@ -45,7 +47,9 @@ class MprisPlayer { sdbus::InterfaceName mp2; sdbus::MethodName playpause; RayTexture tex; + std::vector accent_colors; std::string image_path_cache; + long imagecount; explicit MprisPlayer(std::string servicename); void PausePlay(); void Refresh(); @@ -57,6 +61,7 @@ class MprisPlayer { std::string GetIdentity(); std::unordered_map current_metadata; std::unordered_map GetCurrentMetadata(); + Color GetPrimaryColor(); };