I have a problem understanding of GUI implementation, camera and render script.
That’s how my project looks like at the moment:

I have specially created debug boxes, which should be located in different corners of game area.
My render_script:
function init(self)
self.tile_pred = render.predicate({ "tile" })
self.gui_pred = render.predicate({ "gui" })
self.text_pred = render.predicate({ "text" })
self.particle_pred = render.predicate({ "particle" })
self.clear_color = vmath.vector4(0, 0, 0, 0)
self.clear_color.x = sys.get_config("render.clear_color_red", 0)
self.clear_color.y = sys.get_config("render.clear_color_green", 0)
self.clear_color.z = sys.get_config("render.clear_color_blue", 0)
self.clear_color.w = sys.get_config("render.clear_color_alpha", 0)
self.view = vmath.matrix4()
end
local RESOLUTION = 300
function update(self)
render.set_depth_mask(true)
render.clear({ [render.BUFFER_COLOR_BIT] = self.clear_color, [render.BUFFER_DEPTH_BIT] = 1, [render.BUFFER_STENCIL_BIT] = 0 })
local w = render.get_window_width()
local h = render.get_window_height()
local min_size = math.min(w, h)
local max_size = math.max(w, h)
local offset = (max_size - min_size) / 2
render.set_viewport(w > h and offset or 0, w < h and offset or 0, min_size, min_size)
render.set_view(self.view)
render.set_depth_mask(false)
render.disable_state(render.STATE_DEPTH_TEST)
render.disable_state(render.STATE_STENCIL_TEST)
render.enable_state(render.STATE_BLEND)
render.set_blend_func(render.BLEND_SRC_ALPHA, render.BLEND_ONE_MINUS_SRC_ALPHA)
render.disable_state(render.STATE_CULL_FACE)
-- camera centered projection
render.set_projection(vmath.matrix4_orthographic(-RESOLUTION / 2, RESOLUTION / 2, -RESOLUTION / 2, RESOLUTION / 2, -1, 1))
render.draw(self.tile_pred)
render.draw(self.particle_pred)
render.draw_debug3d()
-- Render the GUI last
render.set_view(vmath.matrix4())
render.set_projection(vmath.matrix4_orthographic(0, RESOLUTION, 0, RESOLUTION, -1, 1))
render.enable_state(render.STATE_STENCIL_TEST)
render.draw(self.gui_pred)
render.draw(self.text_pred)
render.disable_state(render.STATE_STENCIL_TEST)
render.set_depth_mask(false)
render.draw_debug2d()
end
function on_message(self, message_id, message)
if message_id == hash("clear_color") then
self.clear_color = message.color
elseif message_id == hash("set_view_projection") then
self.view = message.view
self.projection = message.projection
end
end