From 0c68a6afdd54d8cd29f375c2e31f1b18ac4b104a Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 29 Jul 2021 22:53:57 +0200 Subject: [PATCH] cellGem: improve hue handling --- rpcs3/Emu/Cell/Modules/cellGem.cpp | 43 +++++++++++++++++++++++++++--- rpcs3/Emu/Cell/Modules/cellGem.h | 2 +- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellGem.cpp b/rpcs3/Emu/Cell/Modules/cellGem.cpp index 1740c9d991..3db3dea375 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.cpp +++ b/rpcs3/Emu/Cell/Modules/cellGem.cpp @@ -939,7 +939,7 @@ error_code cellGemGetTrackerHue(u32 gem_num, vm::ptr hue) if (!gem.controllers[gem_num].enabled_tracking || gem.controllers[gem_num].hue > 359) { - return CELL_GEM_ERROR_NOT_A_HUE; + return { CELL_GEM_ERROR_NOT_A_HUE, gem.controllers[gem_num].hue }; } *hue = gem.controllers[gem_num].hue; @@ -1220,14 +1220,42 @@ error_code cellGemTrackHues(vm::cptr req_hues, vm::ptr res_hues) for (u32 i = 0; i < CELL_GEM_MAX_NUM; i++) { - if (req_hues[i] == u32{CELL_GEM_DONT_CARE_HUE}) + if (req_hues[i] == CELL_GEM_DONT_CARE_HUE) { + gem.controllers[i].enabled_tracking = true; + gem.controllers[i].enabled_LED = true; + switch (i) + { + default: + case 0: + gem.controllers[i].hue = 240; // blue + break; + case 1: + gem.controllers[i].hue = 0; // red + break; + case 2: + gem.controllers[i].hue = 120; // green + break; + case 3: + gem.controllers[i].hue = 300; // purple + break; + } + + if (res_hues) + { + res_hues[i] = gem.controllers[i].hue; + } } - else if (req_hues[i] == u32{CELL_GEM_DONT_TRACK_HUE}) + else if (req_hues[i] == CELL_GEM_DONT_TRACK_HUE) { gem.controllers[i].enabled_tracking = false; gem.controllers[i].enabled_LED = false; + + if (res_hues) + { + res_hues[i] = CELL_GEM_DONT_TRACK_HUE; + } } else { @@ -1235,6 +1263,15 @@ error_code cellGemTrackHues(vm::cptr req_hues, vm::ptr res_hues) { cellGem.warning("cellGemTrackHues: req_hues[%d]=%d -> this can lead to unexpected behavior", i, req_hues[i]); } + + gem.controllers[i].enabled_tracking = true; + gem.controllers[i].enabled_LED = true; + gem.controllers[i].hue = req_hues[i]; + + if (res_hues) + { + res_hues[i] = gem.controllers[i].hue; + } } } diff --git a/rpcs3/Emu/Cell/Modules/cellGem.h b/rpcs3/Emu/Cell/Modules/cellGem.h index 6d7d363497..eed3dddf14 100644 --- a/rpcs3/Emu/Cell/Modules/cellGem.h +++ b/rpcs3/Emu/Cell/Modules/cellGem.h @@ -91,7 +91,7 @@ enum }; // Special values for cellGemTrackHues. -enum +enum : u32 { CELL_GEM_DONT_TRACK_HUE = 2 << 24, CELL_GEM_DONT_CARE_HUE = 4 << 24,