fix(ui): the pointer in the renderer's pixels - macOS reports it in window points, so on Retina every hit landed at half the cursor's position
The old kit read Input.mouse_x() * gl_scale; ludic.ui read it raw against a layout sized in drawable pixels. A backend says how many screen pixels one pointer unit is (pointer_scale); render3d's is gl_pixel_scale(), 1 on Windows and headless. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
5df0747642
commit
40a91f39ed
3 changed files with 12 additions and 2 deletions
|
|
@ -37,8 +37,9 @@ function in_read(ui_st: mut UiState) -> void {
|
|||
ui_st.in_last = ui_st.in_now
|
||||
let i = new UiInput
|
||||
if ui_st.ui_be != null and ui_st.ui_be.input {
|
||||
i.x = float(Input.mouse_x())
|
||||
i.y = float(Input.mouse_y())
|
||||
let ps = in_pointer_scale(ui_st)
|
||||
i.x = float(Input.mouse_x()) * ps
|
||||
i.y = float(Input.mouse_y()) * ps
|
||||
i.down = Input.mouse_down(0)
|
||||
i.down_right = Input.mouse_down(1)
|
||||
i.down_middle = Input.mouse_down(2)
|
||||
|
|
@ -60,6 +61,12 @@ function in_read(ui_st: mut UiState) -> void {
|
|||
in_repeat(ui_st, i)
|
||||
ui_st.in_now = i
|
||||
}
|
||||
# the platform reports the pointer in window points and a renderer draws in pixels: on Retina the
|
||||
# layout is twice the pointer's numbers, and every hit landed up and to the left of the cursor
|
||||
function in_pointer_scale(ui_st: UiState) -> float {
|
||||
if ui_st.ui_be.pointer_scale == null { return 1.0 }
|
||||
return ui_st.ui_be.pointer_scale()
|
||||
}
|
||||
function in_any_key() -> int {
|
||||
for k in 8 .. 167 {
|
||||
if Input.key_pressed(k) { return k }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue