-- GUI on a surface, pointed at: the scene37 monitor again, with sceneProbeGui asked where on the -- GUI the ray through several overlay points lands. The four corners of the screen plane are -- projected with sceneProject and probed back, which must give the GUI's corners; a point off the -- monitor must give nil. The same probe is what the engine uses when the mouse or a light gun -- points at a screen in the scene while that GUI takes input, so a click on the 3D monitor presses -- the button under it. Results go to the console and the overlay. local font = fontLoad("Singe/FreeSansBold.ttf", 22) local frames = 0 local lines = {} fontSelect(font) discPlay() sceneEnable(true) sceneSetBackground(20, 20, 40, 255) sceneSetAmbient(80, 80, 90) local gui = guiNew(720, 480) local doc = guiLoad(gui, "testScripts/scene38.rml") guiSetInput(gui, true) guiSetHandler(gui, doc, "go", "click", function() lines[#lines + 1] = "Start pressed on the monitor" end) local screen = materialNew() materialSetGui(screen, gui) materialSetUnlit(screen, true) local cabinet = materialNew() materialSetColor(cabinet, 60, 60, 70) local body = nodeNew() nodeSetMesh(body, meshBox(3.2, 2.4, 0.4), cabinet) nodeSetPosition(body, -0.6, 0.2, -0.3) nodeSetRotation(body, 0, 25, 0) local tv = nodeNew(body) nodeSetMesh(tv, meshPlane(3.0, 2.0), screen) nodeSetPosition(tv, 0, 0, 0.21) nodeSetRotation(tv, 90, 0, 0) local camera = nodeNew() nodeSetPosition(camera, 0, 0.8, 5.5) nodeLookAt(camera, 0, 0, 0) cameraSet(camera) -- Helper nodes at the plane's corners and centre (the plane is 3 by 2 in its node's XZ plane before -- the 90 degree turn), made now so their world positions exist by the time they are read. local w, h = guiGetWidth(gui), guiGetHeight(gui) local corners = { { "top left", -1.5, 0, -1, 0, 0 }, { "top right", 1.5, 0, -1, w, 0 }, { "bottom left", -1.5, 0, 1, 0, h }, { "bottom right", 1.5, 0, 1, w, h }, { "centre", 0, 0, 0, w / 2, h / 2 } } for _, c in ipairs(corners) do c.node = nodeNew(tv) nodeSetPosition(c.node, c[2], c[3], c[4]) end local function probe(label, sx, sy, expectX, expectY) local g, x, y = sceneProbeGui(sx, sy) local text if g == nil then text = label .. ": off the monitor" if expectX ~= nil then text = text .. " FAIL" end else text = string.format("%s: gui %d at %d,%d", label, g, x, y) if expectX ~= nil and (math.abs(x - expectX) > 12 or math.abs(y - expectY) > 12) then text = text .. string.format(" FAIL (expected %d,%d)", expectX, expectY) end end lines[#lines + 1] = text debugPrint("scene39 " .. text) end function onOverlayUpdate() frames = frames + 1 overlayClear() colorForeground(255, 255, 255, 255) if frames == 20 then for _, c in ipairs(corners) do local hx, hy, hz = nodeGetWorldPosition(c.node) local sx, sy = sceneProject(hx, hy, hz) probe(c[1], sx, sy, c[5], c[6]) end probe("far corner of the overlay", 5, 5, nil, nil) end for i, text in ipairs(lines) do fontPrint(10, 10 + (i - 1) * 24, text) end if frames == 40 then singeScreenshot() end if frames == 60 then singeQuit() end return OVERLAY_UPDATED end