import performance_analysis
import gamnit
-import gamnit::cameras_cache
+intrude import gamnit::cameras
+intrude import gamnit::cameras_cache
import gamnit::dynamic_resolution
import gamnit::limit_fps
import gamnit::camera_control
do
texture.load
- var splash = new Sprite(texture, ui_camera.center)
+ var splash = new Sprite(texture, ui_camera.center.offset(0.0, 0.0, 0.0))
ui_sprites.add splash
var display = display
if display != null then display.close
end
- redef fun frame_core(display)
+ redef fun on_resize(display)
do
- # Prepare to draw, clear buffers
- glClear(gl_COLOR_BUFFER_BIT | gl_DEPTH_BUFFER_BIT)
+ super
+
+ world_camera.mvp_matrix_cache = null
+ ui_camera.mvp_matrix_cache = null
+
+ # Update all sprites in the UI
+ for sprite in ui_sprites do sprite.needs_update
+ end
+ redef fun frame_core(display)
+ do
# Check errors
var gl_error = glGetError
assert gl_error == gl_NO_ERROR else print_error gl_error
perf_clock_main.lapse
var dt = clock.lapse.to_f
update dt
+ frame_dt = dt
sys.perfs["gamnit flat update client"].add perf_clock_main.lapse
# Draw and flip screen
assert gl_error == gl_NO_ERROR else print_error gl_error
end
+ private var frame_dt = 0.0
+
# Draw the whole screen, all `glDraw...` calls should be executed here
protected fun frame_core_draw(display: GamnitDisplay)
do
simple_2d_program.use
simple_2d_program.mvp.uniform camera.mvp_matrix
+ sprite_set.time += frame_dt*sprite_set.time_mod
+ simple_2d_program.time.uniform sprite_set.time
+
# draw
sprite_set.draw
end
// Model view projection matrix
uniform mat4 mvp;
+ // Current world time, in seconds
+ uniform float time;
+
// Rotation matrix
attribute vec4 rotation_row0;
attribute vec4 rotation_row1;
end
end
+redef class OffsetPoint3d
+ redef fun x=(v)
+ do
+ if isset _x and v != x then needs_update
+ super
+ end
+
+ redef fun y=(v)
+ do
+ if isset _y and v != y then needs_update
+ super
+ end
+
+ redef fun z=(v)
+ do
+ if isset _z and v != z then needs_update
+ super
+ end
+end
+
# Set of sprites sorting them into different `SpriteContext`
private class SpriteSet
super HashSet[Sprite]
# 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
+
# Add a sprite to the appropriate context
fun map_sprite(sprite: Sprite)
do