-
Notifications
You must be signed in to change notification settings - Fork 65
/
display_linux.nit
145 lines (113 loc) · 4.06 KB
/
display_linux.nit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# This file is part of NIT (http://www.nitlanguage.org).
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Gamnit display implementation for GNU/Linux using `egl`, `sdl` and `x11`
module display_linux
import sdl2::image
import sdl2::mixer
import egl # local to gamnit
intrude import display
intrude import textures
redef class GamnitDisplay
# Actual width or desired width of the window, can be set before calling `setup`
fun width=(value: Int) do requested_width = value
private var requested_width = 1920
# Actual height or desired height of the window, can be set before calling `setup`
fun height=(value: Int) do requested_height = value
private var requested_height = 1080
redef fun show_cursor do return sdl.show_cursor
redef fun show_cursor=(val) do sdl.show_cursor = val
redef fun lock_cursor=(val) do sdl.relative_mouse_mode = val
redef fun lock_cursor do return sdl.relative_mouse_mode
# Setup SDL, wm, EGL in order
redef fun setup
do
if debug_gamnit then print "Setting up SDL"
self.sdl_window = setup_sdl(requested_width, requested_height)
if debug_gamnit then print "Setting up window manager"
setup_egl_display sdl_window.wm_info.display_handle
if debug_gamnit then print "Setting up EGL context"
select_egl_config(red_bits, green_bits, blue_bits, 8, 8, 0)
setup_egl_context sdl_window.wm_info.window_handle
end
# Close EGL and SDL in reverse order of `setup` (nothing to do for X11)
redef fun close
do
close_egl
close_sdl
end
# ---
# SDL
# The SDL display managing the window and events
var sdl_window: SDLWindow is noautoinit
# Title of the window, must be set before creating the window (or redef)
var window_title = "gamnit game" is lazy, writable
# Setup the SDL display and lib
fun setup_sdl(window_width, window_height: Int): SDLWindow
do
assert sdl.initialize((new SDLInitFlags).video.audio) else
print_error "Failed to initialize SDL2: {sdl.error}"
end
var img_flags = (new SDLImgInitFlags).png.jpg
assert sdl.img.initialize(img_flags) == img_flags else
print_error "Failed to initialize SDL2 IMG: {sdl.error}"
end
var sdl_window = new SDLWindow(window_title.to_cstring, window_width, window_height, sdl_window_flags)
assert not sdl_window.address_is_null else
print_error "Failed to create SDL2 window: {sdl.error}"
end
# Audio support
var inited = mix.initialize(mix_init_flags)
if inited != mix_init_flags then
print_error "Failed to load SDL2 mixer format supports: {mix.error}"
end
var open = mix.open_audio(44100, mix.default_format, 2, 1024)
if not open then
print_error "Failed to initialize SDL2 mixer: {mix.error}"
end
return sdl_window
end
# SDL2 window initialization flags
#
# The default value supports OpenGL and window resizing.
var sdl_window_flags: SDLWindowFlags = (new SDLWindowFlags).opengl.resizable is lazy, writable
# SDL2 mixer initialization flags
#
# Defaults to FLAC, MP3 and OGG.
var mix_init_flags: MixInitFlags = mix.flac | mix.mp3 | mix.ogg is lazy, writable
# Close the SDL display
fun close_sdl
do
sdl_window.destroy
mix.close_audio
mix.quit
sdl.finalize
end
end
redef class TextureAsset
redef fun load_from_platform
do
var path = "assets" / path
var surface = new SDLSurface.load(path.to_cstring)
if surface.address_is_null then
error = new Error("Failed to load texture at '{path}'")
return
end
self.width = surface.w.to_f
self.height = surface.h.to_f
var format = if surface.format.amask > 0u32 then gl_RGBA else gl_RGB
var pixels = surface.pixels
load_from_pixels(pixels, surface.w, surface.h, format)
surface.free
end
end