end
# Convert the position `x, y` on screen, to UI coordinates
- fun camera_to_ui(x, y: Numeric): Point[Float]
+ 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 Point[Float](wx, -wy)
+ 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 ui_camera = new UICamera(app.display.as(not null)) is lazy
# World sprites drawn as seen by `world_camera`
- var sprites: Set[Sprite] = new SpriteSet
+ var sprites = new SpriteSet
# UI sprites drawn as seen by `ui_camera`, over world `sprites`
- var ui_sprites: Set[Sprite] = new SpriteSet
+ var ui_sprites = new SpriteSet
# Main method to refine in clients to update game logic and `sprites`
fun update(dt: Float) do end
# Draw world sprites from `sprites`
protected fun frame_core_world_sprites(display: GamnitDisplay)
do
- frame_core_sprites(display, sprites.as(SpriteSet), world_camera)
+ frame_core_sprites(display, sprites, world_camera)
end
# Draw UI sprites from `ui_sprites`
# Reset only the depth buffer
glClear gl_DEPTH_BUFFER_BIT
- frame_core_sprites(display, ui_sprites.as(SpriteSet), ui_camera)
+ frame_core_sprites(display, ui_sprites, ui_camera)
end
end
vec3 c; // coords
float end = a_start + a_loops/a_fps*a_n_frames;
- if (a_loops == -1.0 || time < end) {
+ if (a_fps != 0.0 && (a_loops == -1.0 || time < end)) {
// in animation
float frame = mod(floor((time-a_start)*a_fps), a_n_frames);
v_coord = a_tex_coord + a_tex_diff*frame;
end
# Set of sprites sorting them into different `SpriteContext`
-private class SpriteSet
+class SpriteSet
super HashSet[Sprite]
- # Map texture then static vs dynamic to a `SpriteContext`
- var contexts_map = new HashMap4[RootTexture, nullable RootTexture, Bool, Int, Array[SpriteContext]]
-
- # Contexts in `contexts_map`, sorted by draw order
- var contexts_items = new Array[SpriteContext]
-
- # Sprites needing resorting in `contexts_map`
- var sprites_to_remap = new Array[Sprite]
-
# Animation speed multiplier (0.0 to pause, 1.0 for normal speed, etc.)
var time_mod = 1.0 is writable
# Seconds elapsed since the launch of the program, in world time responding to `time_mod`
var time = 0.0
+ # Map texture then static vs dynamic to a `SpriteContext`
+ private var contexts_map = new HashMap4[RootTexture, nullable RootTexture, Bool, Int, Array[SpriteContext]]
+
+ # Contexts in `contexts_map`, sorted by draw order
+ private var contexts_items = new Array[SpriteContext]
+
+ # Sprites needing resorting in `contexts_map`
+ private var sprites_to_remap = new Array[Sprite]
+
# Add a sprite to the appropriate context
- fun map_sprite(sprite: Sprite)
+ private fun map_sprite(sprite: Sprite)
do
assert sprite.context == null else print_error "Sprite {sprite} belongs to another SpriteSet"
end
# Remove a sprite from its context
- fun unmap_sprite(sprite: Sprite)
+ private fun unmap_sprite(sprite: Sprite)
do
var context = sprite.context
assert context != null
end
# Draw all sprites by all contexts
- fun draw
+ private fun draw
do
# Remap sprites that may need to change context
for sprite in sprites_to_remap do
+
+ # Skip if it was removed from this set after being modified
+ if sprite.context != self then continue
+
unmap_sprite sprite
map_sprite sprite
end
data[o+36] = tc[v*2+1]
# a_tex_diff
- var dx = animation.frames[1].texture_coords[0] - animation.frames[0].texture_coords[0]
- var dy = animation.frames[1].texture_coords[1] - animation.frames[0].texture_coords[1]
+ var dx = 0.0
+ var dy = 0.0
+ if animation.frames.length > 1 then
+ dx = animation.frames[1].texture_coords[0] - animation.frames[0].texture_coords[0]
+ dy = animation.frames[1].texture_coords[1] - animation.frames[0].texture_coords[1]
+ end
data[o+37] = dx
data[o+38] = dy