Hi, I'm the lead software dev of the PhobGCC project, an open-source GCC primarily targeted at Melee. (https://github.com/PhobGCC)
In Melee, many advanced techniques are close to, if not, coordinate precise, such as shield dropping, 1.0 magnitude inputs in cardinal directions, crouch/walk option select versus jab cancel, achieving angles extremely close to the deadzone... all sorts of things. It's a very sensitive game.
As the potentiometers wear, the values drift around a little, and the console compensates for this by measuring the origin on plugging in.
On a Gamecube or Wii, the console sends an origin poll on detecting a controller and zeroes to that; OEM GCCs will respond with their current coordinates so if the stick's neutral position is not 128, 128, the stick's drift will be canceled out. The current trigger analog values are also set as a zero point, which allows for disabling of analog via holding the trigger down on plugin which we call "trigger tricking".
Specialized third-party controllers such as button-based digital controllers and the PhobGCC on firmware v0.25 and later will send a fixed value for the origin that doesn't depend on the current controller's position (though the PhobGCC itself handles trigger tricking internally).
One struggle many Melee players have with Dolphin is that the controller zeroing for GCCs on the official Nintendo adapter (and clones) is inconsistent. This partially stems from the adapter never sending an origin poll, but it's partly due to Dolphin's own behavior.
The only reliable way to get a good origin is to start Dolphin, plug in the controller, and then start the emulation. If you plug in afterwards, it usually works but not always.
One way I tested it is by using the homebrew app Smashscope, which you can get here: https://goomwave.com/2020/06/28/smashscope-guide/
This tool can tell you the port 1 controller's outputs after subtracting the origin, and for the left stick in particular the Notch Visualizer page will tell you the origin coordinate. (if the Controller Test page doesn't show stick movement for you, disable Wiimotes by setting them to "none" in the controller menu of Dolphin)
What we've found is that if you plug in after the emulation begins, the origin will seem to be polled properly, but if you actually try to hold the stick off-center, it won't register quite properly.
On unplugging and replugging the controller into the same port, it almost never re-measures the origin, but occasionally it gets totally borked and ends up with a really weird offset that also doesen't register the position of the stick on initialization.
Is there any way the controller plug-in origin setting can be changed so that it zeroes perhaps a quarter second after plug-in (to allow for snapback suppression capacitors to reach steady-state), and to reliably re-zero every time it is plugged in?
I went looking at the source code in Core/InputCommon/GCAdapter.cpp and the code seems like it *should* work, but I suspect that there's some sort of race condition involved and it doesn't always function, and I can't tell why it usually only works the first time you plug in after beginning emulation, and why it's only mostly functional then.
In Melee, many advanced techniques are close to, if not, coordinate precise, such as shield dropping, 1.0 magnitude inputs in cardinal directions, crouch/walk option select versus jab cancel, achieving angles extremely close to the deadzone... all sorts of things. It's a very sensitive game.
As the potentiometers wear, the values drift around a little, and the console compensates for this by measuring the origin on plugging in.
On a Gamecube or Wii, the console sends an origin poll on detecting a controller and zeroes to that; OEM GCCs will respond with their current coordinates so if the stick's neutral position is not 128, 128, the stick's drift will be canceled out. The current trigger analog values are also set as a zero point, which allows for disabling of analog via holding the trigger down on plugin which we call "trigger tricking".
Specialized third-party controllers such as button-based digital controllers and the PhobGCC on firmware v0.25 and later will send a fixed value for the origin that doesn't depend on the current controller's position (though the PhobGCC itself handles trigger tricking internally).
One struggle many Melee players have with Dolphin is that the controller zeroing for GCCs on the official Nintendo adapter (and clones) is inconsistent. This partially stems from the adapter never sending an origin poll, but it's partly due to Dolphin's own behavior.
The only reliable way to get a good origin is to start Dolphin, plug in the controller, and then start the emulation. If you plug in afterwards, it usually works but not always.
One way I tested it is by using the homebrew app Smashscope, which you can get here: https://goomwave.com/2020/06/28/smashscope-guide/
This tool can tell you the port 1 controller's outputs after subtracting the origin, and for the left stick in particular the Notch Visualizer page will tell you the origin coordinate. (if the Controller Test page doesn't show stick movement for you, disable Wiimotes by setting them to "none" in the controller menu of Dolphin)
What we've found is that if you plug in after the emulation begins, the origin will seem to be polled properly, but if you actually try to hold the stick off-center, it won't register quite properly.
On unplugging and replugging the controller into the same port, it almost never re-measures the origin, but occasionally it gets totally borked and ends up with a really weird offset that also doesen't register the position of the stick on initialization.
Is there any way the controller plug-in origin setting can be changed so that it zeroes perhaps a quarter second after plug-in (to allow for snapback suppression capacitors to reach steady-state), and to reliably re-zero every time it is plugged in?
I went looking at the source code in Core/InputCommon/GCAdapter.cpp and the code seems like it *should* work, but I suspect that there's some sort of race condition involved and it doesn't always function, and I can't tell why it usually only works the first time you plug in after beginning emulation, and why it's only mostly functional then.