Pixel Perfection for Specific Resolution
This post has been updated per Haleth's information below. Thanks Haleth!
I came across an issue I didn't like while designing my UI: in-game pixels were not "real" pixels. They were close, but not exactly. So sometimes textures/borders/etc would get fudged when WoW scales up from its in-game resolution to your monitor's resolution. The solution is to manually set the uiscale CVar (which just stores the value from this slider in the Video Options). Here's the quick'n'dirty macro line: Code:
/run SetCVar("uiScale", 768/string.match(({GetScreenResolutions()})[GetCurrentResolution()], "%d+x(%d+)")) To calculate the value, you need your resolution height (mine was 1050 for a 1680x1050 resolution) and need to know the game's height is always (?) 768. You can verify that your in-game height is 768 by running the following lines: Code:
/console useuiscale 1 Code:
768 / 1050 = 0.731428571 You can see what your resulting size is by: Code:
/run print(GetScreenWidth(), "x", GetScreenHeight()) Disclaimer: This is possibly/probably a bad idea if you plan to package your UI. I use it only for my own UI. |
I too have noticed "fudging" or "blending" with my UI but I always simply thought of it as a limitation of the UI overlay, thanks so much for this! Now my OCD is satiated.
|
@Gsusnme, Glad I could help! Indeed it was also my OCD that led me down this path! ;)
|
It's much easier if you just do:
/script SetCVar("uiScale", 768/string.match(({GetScreenResolutions()})[GetCurrentResolution()], "%d+x(%d+)")) |
Quote:
|
Quote:
|
UI Scale is one way, but when I'm making an addon, I can't set the users UI scale to my value. So I have to make a workaround. If I scale any value with the following function, there comes out the value needed to represent the amount of "virtual pixels" needed by the frame to get the amount of "real pixels".
Code:
local mult = SetCVar("uiScale", 768/string.match(({GetScreenResolutions()})[GetCurrentResolution()], "%d+x(%d+)"))/GetCVar("uiScale") |
If you don't want to override the user's uiScale, you can use the following code to position a frame on real pixel boundaries: http://pastey.net/134131
It includes some test code that renders pixel-wide nested borders. The top one in this screenshot is adjusted, the bottom one isn't. |
Quote:
One problem though, neither GetCVar("uiScale") or UIParent:GetScale() return values instantly, you'll have to hook an event like PLAYER_ENTERING_WORLD(I don't know the first event that they are available, I do know that they are available at PLAYER_ENTERING_WORLD). |
Quote:
|
Quote:
|
Do any of these methods take into consideration using windowed mode (sans Maximized option)? I ask because, say your Windows desktop resolution is 1024x768. If you run WoW at 1024x768 in a non-maximized windowed mode, the actual resolution is a bit lower due to the WoW window's borders, title bar, and even the task bar.
|
Quote:
Quote:
|
Quote:
|
Quote:
In fact, if I understand what you guys are doing here, I highly disapprove. It looks like you guys are making your addons ignore the UI scale... and in my opinion, this is a terrible idea! This is not what I had in mind AT ALL. Your addons should never ignore a user's UI scale. If I found one that did, I would probably promptly trash it. Please correct me if I misunderstood what this code is doing. |
It doesn't ignore the scale. It just (optionally, per element) multiplies the value of a real pixel so that it fits the size of a full ui pixel and won't be anti-aliased.
Both solutions are acceptable, but the fact is not everybody is going to have their UI set to this scale. Also, just as importantly, changing the UI scale modifies your entire UI. When switching to a normalized UI scale I had to drastically modify every individual element of my UI to be ~20% smaller and in a position to match the old. If I'm releasing an addon that requires pixel-perfect borders, should I tell all of my users to change every UI element's scale and position, or should I emulate the value of a pixel in my own UI and leave everything else alone? I'd always choose the latter. |
Quote:
What am I missing here? This is exact code from Saiket. From the looks, it blatantly ignores scale. (It should scale with the map, but it doesn't) Quote:
If an addon developer runs at a UI Scale of 2 and optimizes font sizes, etc for that, it's going to look like hell for someone with a default of 0.9 (no ui scale). And by using the UIScale method when setting up my custom UI or pack, I'm making every addon pixel perfect, not just some random one that I'm creating. This goal isn't to create one pixel perfect addon, but an entire pixel perfect UI regardless of the addons I use. I really believe we're talking about two completely different problems. Hopefully you'll see my intents now. Quote:
|
Quote:
I'm still not entirely sure what you want, or what you don't want. If you want everything pixel perfect, you must either use the uiScale method or hook every SetPoint operation in the API. If you want only your mod to be pixel perfect, position your frames using the formula in my test code. |
Quote:
I also wanted to suggest a method for addon authors to design a more consistent user interface experience. All too often I see an author that designed his options GUI when his scale was set crazy, and it ends up not blending at all with the rest of the UI components. I'm suggesting that by designing at your native monitor resolution, you can deliver a more quality, consistent experience. Quote:
|
Quote:
I'll probably lack knowledge, but all scale(1) does is multiply by 1. So scale(23.124578) is still 23.124578 with this function of yours |
All times are GMT -6. The time now is 12:30 AM. |
vBulletin © 2024, Jelsoft Enterprises Ltd
© 2004 - 2022 MMOUI