X axis: left to right of the screen, from position.x
to position.x + width
Y axis: top to bottom of the screen, from position.y
to position.y + height
Z axis: far to near the camera (usually when values are higher), from far
to near
gamnit :: UICamera :: bottom_left
Bottom left corner of the screen, at z = 0gamnit :: UICamera :: bottom_left=
Bottom left corner of the screen, at z = 0gamnit :: UICamera :: bottom_right
Bottom right corner of the screen, at z = 0gamnit :: UICamera :: bottom_right=
Bottom right corner of the screen, at z = 0gamnit :: UICamera :: camera_to_ui
Convert the positionx, y
on screen, to UI coordinates
gamnit :: UICamera :: defaultinit
gamnit :: UICamera :: reset_height
Reset the camera position so thatheight
world units are visible on the Y axis
gamnit :: UICamera :: top_right=
Top right corner of the screen, at z = 0gamnit $ UICamera :: mvp_matrix
The Model-View-Projection matrix created by this cameragamnit :: cameras_cache $ UICamera :: mvp_matrix
The returned matrix must not be modified as it is cached.gamnit :: UICamera :: bottom_left
Bottom left corner of the screen, at z = 0gamnit :: UICamera :: bottom_left=
Bottom left corner of the screen, at z = 0gamnit :: UICamera :: bottom_right
Bottom right corner of the screen, at z = 0gamnit :: UICamera :: bottom_right=
Bottom right corner of the screen, at z = 0gamnit :: UICamera :: camera_to_ui
Convert the positionx, y
on screen, to UI coordinates
core :: Object :: class_factory
Implementation used byget_class
to create the specific class.
gamnit :: Camera :: defaultinit
gamnit :: UICamera :: defaultinit
core :: Object :: defaultinit
core :: Object :: is_same_instance
Return true ifself
and other
are the same instance (i.e. same identity).
core :: Object :: is_same_serialized
Isself
the same as other
in a serialization context?
core :: Object :: is_same_type
Return true ifself
and other
have the same dynamic type.
gamnit :: Camera :: mvp_matrix
The Model-View-Projection matrix created by this cameracore :: Object :: output_class_name
Display class name on stdout (debug only).gamnit :: UICamera :: reset_height
Reset the camera position so thatheight
world units are visible on the Y axis
gamnit :: UICamera :: top_right=
Top right corner of the screen, at z = 0
# Orthogonal camera to draw UI objects with services to work with screens of different sizes
#
# X axis: left to right of the screen, from `position.x` to `position.x + width`
# Y axis: top to bottom of the screen, from `position.y` to `position.y + height`
# Z axis: far to near the camera (usually when values are higher), from `far` to `near`
class UICamera
super Camera
# Clipping wall near the camera, defaults to 100.0
var near = 100.0 is writable
# Clipping wall the farthest of the camera, defaults to -100.0
var far: Float = -100.0 is writable
# Width in world units, calculated from `height` and the screen aspect ratio
fun width: Float do return height * display.aspect_ratio
# Height in world units, defaults to 1080.0
#
# Set this value using `reset_height`.
var height = 1080.0
# Reset the camera position so that `height` world units are visible on the Y axis
#
# This can be used to set standardized UI units independently from the screen resolution.
fun reset_height(height: nullable Float)
do
if height == null then height = display.height.to_f
self.height = height
end
# Convert the position `x, y` on screen, to UI coordinates
fun camera_to_ui(x, y: Numeric): Point3d[Float]
do
# FIXME this kind of method should use something like a canvas
# instead of being hard coded on the display.
var wx = x.to_f * width / display.width.to_f - position.x
var wy = y.to_f * height / display.height.to_f - position.y
return new Point3d[Float](wx, -wy, 0.0)
end
# Center of the screen, from the point of view of the camera, at z = 0
var center: IPoint3d[Float] = new CameraAnchor(self, 0.5, -0.5)
# Center of the top of the screen, at z = 0
var top: IPoint3d[Float] = new CameraAnchor(self, 0.5, 0.0)
# Center of the bottom of the screen, at z = 0
var bottom: IPoint3d[Float] = new CameraAnchor(self, 0.5, -1.0)
# Center of the left border of the screen, at z = 0
var left: IPoint3d[Float] = new CameraAnchor(self, 0.0, -0.5)
# Center of the right border of the screen, at z = 0
var right: IPoint3d[Float] = new CameraAnchor(self, 1.0, -0.5)
# Top left corner of the screen, at z = 0
var top_left: IPoint3d[Float] = new CameraAnchor(self, 0.0, 0.0)
# Top right corner of the screen, at z = 0
var top_right: IPoint3d[Float] = new CameraAnchor(self, 1.0, 0.0)
# Bottom left corner of the screen, at z = 0
var bottom_left: IPoint3d[Float] = new CameraAnchor(self, 0.0, -1.0)
# Bottom right corner of the screen, at z = 0
var bottom_right: IPoint3d[Float] = new CameraAnchor(self, 1.0, -1.0)
redef fun mvp_matrix
do
var view = new Matrix.identity(4)
# Translate the world away from the camera
view.translate(-position.x, -position.y, -position.z)
# Use a projection matrix with a depth
var projection = new Matrix.orthogonal(0.0, width, -height, 0.0, near, far)
return view * projection
end
end
lib/gamnit/cameras.nit:196,1--277,3
redef class UICamera
# The returned matrix must not be modified as it is cached.
redef fun mvp_matrix
do
var m = mvp_matrix_cache
if m == null or check_position_changed then
m = super
mvp_matrix_cache = m
end
return m
end
redef fun near=(value)
do
super
mvp_matrix_cache = null
end
redef fun far=(value)
do
super
mvp_matrix_cache = null
end
redef fun height=(value)
do
super
mvp_matrix_cache = null
end
end
lib/gamnit/cameras_cache.nit:89,1--118,3