#import "extra/glwindow"
Warning: This module is currently available only on Windows as experimental.
Set of tools to handle creation of the operating system native window with OpenGL context and handling of user inputs.
The window creation does not cover OpenGL initialization, since its API must be loaded dynamically in runtime, thus the gl_init
must
be called after a window is successfully created (the propper context is set) and before any rendering.
#import "extra/glwindow"
main :: fn () s32 {
// Initialize the glwindow module first.
glwindow.init();
// And don't forget to terminate it at the end.
defer glwindow.terminate();
// Create default instance of window options and override some values.
opt := glwindow.make_default_create_window_options();
// Text shown in the window title.
opt.title = "My Window";
// Window resolution
opt.width = 1024;
opt.height = 768;
// Uncommnet this to enable fullscreen mode.
//opt.fullscreen = true;
// Create new window using our options and handle all possible errors.
window, window_err :: glwindow.create_window(&opt);
if window_err {
// Kill the app on error.
panic(window_err);
}
// Destroy the window at the end of the scope.
defer glwindow.destroy_window(window);
// Make the window's GL context the current one.
glwindow.set_window_context_current(window);
gl_init();
defer gl_terminate();
// The "game loop" is looping until the should_quit is false.
should_quit := false;
loop !should_quit {
// Poll all pending window events.
glwindow.poll_window_events();
// Process user input events here.
loop i := 0; i < glwindow.frame_events.len; i += 1 {
event :: &glwindow.frame_events[i];
using glwindow.EventKind;
switch event.kind {
QUIT { should_quit = true; }
default;
}
}
// Draw one frame.
gl.ClearColor(1.f, 0.f, 0.f, 1.f);
gl.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Don't forget to swap gl buffers at the end of the frame.
glwindow.swap_buffers(window);
}
print("DONE\n");
return 0;
}
Window :: win32.HWND
File: glwindow.win32.bl
EventKind :: enum {
QUIT;
MOUSE_LB_DOWN;
MOUSE_LB_UP;
MOUSE_MB_DOWN;
MOUSE_MB_UP;
MOUSE_RB_DOWN;
MOUSE_RB_UP;
MOUSE_MOVE;
KEY_PRESS;
KEY_RELEASE;
}
File: glwindow.win32.bl
KeyCode :: enum u32 {
LBUTTON = 1;
RBUTTON = 2;
CANCEL = 3;
BACK = 8;
TAB = 9;
CLEAR = 12;
RETURN = 13;
SHIFT = 16;
CONTROL = 17;
MENU = 18;
PAUSE = 19;
CAPITAL = 20;
KANA = 21;
HANGEUL = 21;
HANGUL = 21;
IME_ON = 22;
JUNJA = 23;
FINAL = 24;
HANJA = 25;
KANJI = 25;
IME_OFF = 26;
ESCAPE = 27;
CONVERT = 28;
NONCONVERT = 29;
ACCEPT = 30;
MODECHANGE = 31;
SPACE = 32;
PRIOR = 33;
NEXT = 34;
END = 35;
HOME = 36;
LEFT = 37;
UP = 38;
RIGHT = 39;
DOWN = 40;
SELECT = 41;
PRINT = 42;
EXECUTE = 43;
SNAPSHOT = 44;
INSERT = 45;
DELETE = 46;
HELP = 47;
LWIN = 91;
RWIN = 92;
APPS = 93;
SLEEP = 95;
NUMPAD0 = 96;
NUMPAD1 = 97;
NUMPAD2 = 98;
NUMPAD3 = 99;
NUMPAD4 = 100;
NUMPAD5 = 101;
NUMPAD6 = 102;
NUMPAD7 = 103;
NUMPAD8 = 104;
NUMPAD9 = 105;
MULTIPLY = 106;
ADD = 107;
SEPARATOR = 108;
SUBTRACT = 109;
DECIMAL = 110;
DIVIDE = 111;
F1 = 112;
F2 = 113;
F3 = 114;
F4 = 115;
F5 = 116;
F6 = 117;
F7 = 118;
F8 = 119;
F9 = 120;
F10 = 121;
F11 = 122;
F12 = 123;
F13 = 124;
F14 = 125;
F15 = 126;
F16 = 127;
F17 = 128;
F18 = 129;
F19 = 130;
F20 = 131;
F21 = 132;
F22 = 133;
F23 = 134;
F24 = 135;
NUMBER_0 = 48;
NUMBER_1 = 49;
NUMBER_2 = 50;
NUMBER_3 = 51;
NUMBER_4 = 52;
NUMBER_5 = 53;
NUMBER_6 = 54;
NUMBER_7 = 55;
NUMBER_8 = 56;
NUMBER_9 = 57;
A = 65;
B = 66;
C = 67;
D = 68;
E = 69;
F = 70;
G = 71;
H = 72;
I = 73;
J = 74;
K = 75;
L = 76;
M = 77;
N = 78;
O = 79;
P = 80;
Q = 81;
R = 82;
S = 83;
T = 84;
U = 85;
V = 86;
W = 87;
X = 88;
Y = 89;
Z = 90;
}
File: glwindow.win32.bl
Event :: struct {
kind: EventKind;
sender: Window;
data: union {
mouse_move: struct {
x: s32;
y: s32;
};
key_code: KeyCode;
};
}
General window event representation.
kind
- Window event kind.sender
- Window which recieved this event.x
- Related to MOUSE_MOVE event.key_code
- Related to KEY_* events.File: glwindow.win32.bl
frame_events : [..]Event =
Array of all collected window events in the current frame, this array is updated by calling poll_window_events.
File: glwindow.win32.bl
init :: fn ()
Initialize module internals.
File: glwindow.win32.bl
terminate :: fn ()
Release all module internals.
File: glwindow.win32.bl
CreateWindowOptions :: struct {
title: string_view;
width: s32;
height: s32;
position_x: s32;
position_y: s32;
gl_major_version: s32;
gl_minor_version: s32;
vsync: bool;
fullscreen: bool;
}
Window initialization options. Use make_default_create_window_options to create default options.
title
- Window title text shown in the title bar.width
- Window width in pixels. (Must be greater than 0.)height
- Window height in pixels. (Must be greater than 0.)position_x
- Window initial X position in pixels.position_y
- Window initial Y position in pixels.gl_major_version
- Required OpenGL major version.gl_minor_version
- Required OpenGL minor version.vsync
- Enable VSync.fullscreen
- Enable fullscreen mode.File: glwindow.win32.bl
make_default_create_window_options :: fn () CreateWindowOptions #inline
Creates instance of default CreateWindowOptions
File: glwindow.win32.bl
create_window :: fn (options: *CreateWindowOptions) (window: Window, error: Error)
Create a new instance of window with OpenGL buffer initialized; the OpenGL API initialization must be handled
explicitly on caller side with gl_init
and gl_terminate
.
File: glwindow.win32.bl
destroy_window :: fn (window: Window)
Destroy window created by create_window.
File: glwindow.win32.bl
set_window_context_current :: fn (window: Window) Error
Set the OpenGL window context as current used context. This must be called before OpenGL is initialized.
File: glwindow.win32.bl
swap_buffers :: fn (window: Window) #inline
Swaps current buffers (presents changes to the window's OpenGL viewport).
File: glwindow.win32.bl
poll_window_events :: fn ()
Poll all window events and update frame_events array.
File: glwindow.win32.bl