app :: App :: visible_at
Actor
is on screen at x, y
?
# Which `Actor` is on screen at `x, y`?
fun visible_at(x, y: Numeric): nullable Actor
do
var display = display
assert display != null
if not selection_calculated then draw_selection_screen
x = x.to_i
y = y.to_i
y = display.height - y
# Read selection values
var data = once new NativeCByteArray(4)
glReadPixels(x, y, 1, 1, gl_RGBA, gl_UNSIGNED_BYTE, data)
assert_no_gl_error
var r = display.red_bits
var g = display.green_bits
var b = display.blue_bits
# Rebuild ID from pixel color
var rv = data[0].to_i >> (8-r)
var gv = data[1].to_i >> (8-g) << (r)
var bv = data[2].to_i >> (8-b) << (r+g)
if data[0].to_i & (2**(8-r)-1) > (2**(8-r-1)) then rv += 1
if data[1].to_i & (2**(8-g)-1) > (2**(8-g-1)) then gv += 1 << r
if data[2].to_i & (2**(8-b)-1) > (2**(8-b-1)) then bv += 1 << (r+g)
var id = rv + gv + bv
# ID 0 is the background
if id == 0 then return null
# Wrongful selection? This should not happen.
if not selection_map.keys.has(id) then
print_error "Gamnit Warning: Invalid selection {id}"
return null
end
return selection_map[id]
end
lib/gamnit/depth/selection.nit:48,2--88,4