Get rid of memcopies in codegen, improve Multimedia
This commit is contained in:
@@ -57,6 +57,11 @@ DrawBitmapInCompatibleDC :: (b: *Bitmap)
|
||||
SelectObject(b.hdc, b.dib)
|
||||
BitBlt(b.compatible_dc, 0, 0, b.size.x->int, b.size.y->int, b.hdc, 0, 0, SRCCOPY)
|
||||
|
||||
GetWindowStyle :: (resizable: Bool): DWORD
|
||||
style: DWORD = WS_SYSMENU | WS_OVERLAPPED | WS_CAPTION
|
||||
if resizable ;; style |= WS_MAXIMIZEBOX | WS_THICKFRAME | WS_MINIMIZEBOX
|
||||
return style
|
||||
|
||||
GetWindowSize :: (window: HWND): Vec2I
|
||||
result: Vec2I
|
||||
window_rect: RECT
|
||||
@@ -88,18 +93,18 @@ SetWindowPosition :: (window: HWND, style: DWORD, pos: Vec2I): void
|
||||
AdjustWindowRect(window, style, &rect)
|
||||
SetWindowPos(window, 0, rect.left, rect.top, 0, 0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE)
|
||||
|
||||
StartMultimedia :: (x: S64 = 1280, y: S64 = 720, title: String = "Hello people!"): Mu
|
||||
mu: Mu
|
||||
StartMultimedia :: (x: S64 = 1280, y: S64 = 720, title: String = "Hello people!", target_ms: F64 = 0.0166666)
|
||||
Mu.time.delta = target_ms
|
||||
if timeBeginPeriod(1) == TIMERR_NOERROR
|
||||
mu.os.good_scheduling = true
|
||||
Mu.os.good_scheduling = true
|
||||
|
||||
dpi_aware := SetProcessDPIAware()
|
||||
Assert(dpi_aware != 0)
|
||||
|
||||
mu.time.start = Time()
|
||||
Mu.time.start = Time()
|
||||
|
||||
hInstance := GetModuleHandleA(0)
|
||||
window_name := StringToString16(&mu.frame_arena, title)
|
||||
window_name := StringToString16(&Mu.frame_arena, title)
|
||||
w := WNDCLASSW{
|
||||
lpfnWndProc = WindowProc,
|
||||
hInstance = hInstance,
|
||||
@@ -108,54 +113,197 @@ StartMultimedia :: (x: S64 = 1280, y: S64 = 720, title: String = "Hello people!"
|
||||
}
|
||||
Assert(RegisterClassW(&w) != 0)
|
||||
|
||||
style: DWORD = 0
|
||||
mu.os.window = CreateWindowExW(
|
||||
style: DWORD = GetWindowStyle(false)
|
||||
Mu.os.window = CreateWindowExW(
|
||||
dwExStyle = 0, hWndParent = 0, hMenu = 0, lpParam = 0,
|
||||
X = CW_USEDEFAULT, Y = CW_USEDEFAULT, nWidth = x->int, nHeight = y->int,
|
||||
lpClassName = window_name.str,
|
||||
lpWindowName = window_name.str,
|
||||
dwStyle = WS_OVERLAPPEDWINDOW,
|
||||
dwStyle = style,
|
||||
hInstance = hInstance
|
||||
)
|
||||
Assert(mu.os.window != 0)
|
||||
SetWindowSize(mu.os.window, style, {x,y})
|
||||
ShowWindow(mu.os.window, SW_SHOW)
|
||||
Assert(Mu.os.window != 0)
|
||||
SetWindowSize(Mu.os.window, style, {x,y})
|
||||
ShowWindow(Mu.os.window, SW_SHOW)
|
||||
|
||||
size := GetWindowSize(mu.os.window)
|
||||
size := GetWindowSize(Mu.os.window)
|
||||
Assert(size.x == x && size.y == y)
|
||||
|
||||
mu.os.window_dc = GetDC(mu.os.window)
|
||||
mu.os.bitmap = W32.CreateBitmap(mu.os.window_dc, size)
|
||||
|
||||
mu.scrn = mu.os.bitmap.data
|
||||
mu.x = mu.os.bitmap.size.x
|
||||
mu.y = mu.os.bitmap.size.y
|
||||
Mu.os.window_dc = GetDC(Mu.os.window)
|
||||
Mu.os.bitmap = W32.CreateBitmap(Mu.os.window_dc, size)
|
||||
|
||||
return mu
|
||||
Mu.scrn = Mu.os.bitmap.data
|
||||
Mu.x = Mu.os.bitmap.size.x
|
||||
Mu.y = Mu.os.bitmap.size.y
|
||||
|
||||
UpdateMultimedia :: (mu: *Mu): Bool
|
||||
mu.frame_count += 1
|
||||
frame_time := Time() - mu.time.frame_start
|
||||
mu.time.total += frame_time
|
||||
if frame_time < mu.time.delta
|
||||
if mu.os.good_scheduling
|
||||
time_to_sleep := (mu.time.delta - frame_time) * 1000
|
||||
UpdateMultimedia :: (): Bool
|
||||
Mu.frame_count += 1
|
||||
frame_time := Time() - Mu.time.frame_start
|
||||
Mu.time.total += frame_time
|
||||
if frame_time < Mu.time.delta
|
||||
if Mu.os.good_scheduling
|
||||
time_to_sleep := (Mu.time.delta - frame_time) * 1000
|
||||
if time_to_sleep > 0
|
||||
time_to_sleep_dword := time_to_sleep->DWORD
|
||||
// @check if time_to_sleep_dword truncates down
|
||||
Sleep(time_to_sleep_dword)
|
||||
|
||||
new_frame_time := Time()
|
||||
for new_frame_time < mu.time.delta
|
||||
new_frame_time = Time() - mu.time.frame_start
|
||||
for new_frame_time < Mu.time.delta
|
||||
new_frame_time = Time() - Mu.time.frame_start
|
||||
|
||||
mu.time.frame_start = Time()
|
||||
return !mu.quit
|
||||
Mu.time.frame_start = Time()
|
||||
return !Mu.quit
|
||||
|
||||
AppIsRunning := true
|
||||
WindowProc :: (hwnd: HWND, msg: UINT, wparam: WPARAM, lparam: LPARAM): LRESULT
|
||||
if msg == WM_DESTROY
|
||||
PostQuitMessage(0)
|
||||
AppIsRunning = false
|
||||
return 0
|
||||
elif msg == WM_KEYDOWN || msg == WM_SYSKEYDOWN
|
||||
key := MapVKToKey(msg)
|
||||
Mu.key[key].is_down = true
|
||||
elif msg == WM_KEYUP || msg == WM_SYSKEYUP
|
||||
key := MapVKToKey(msg)
|
||||
Mu.key[key].is_down = false
|
||||
|
||||
|
||||
else;; return DefWindowProcW(hwnd, msg, wparam, lparam)
|
||||
|
||||
|
||||
/*#
|
||||
mapping = [
|
||||
["Up", "VK_UP"],
|
||||
["Down", "VK_DOWN"],
|
||||
["Left", "VK_LEFT"],
|
||||
["Right", "VK_RIGHT"],
|
||||
["Escape", "VK_ESCAPE"],
|
||||
["Control", "VK_CONTROL"],
|
||||
["Backspace", "VK_BACK"],
|
||||
["Alt", "VK_MENU"],
|
||||
["Shift", "VK_SHIFT"],
|
||||
["Tab", "VK_TAB"],
|
||||
["F1", "VK_F1"],
|
||||
["F2", "VK_F2"],
|
||||
["F3", "VK_F3"],
|
||||
["F4", "VK_F4"],
|
||||
["F5", "VK_F5"],
|
||||
["F6", "VK_F6"],
|
||||
["F7", "VK_F7"],
|
||||
["F8", "VK_F8"],
|
||||
["F9", "VK_F9"],
|
||||
["F10", "VK_F10"],
|
||||
["F11", "VK_F11"],
|
||||
["F12", "VK_F12"],
|
||||
["A", "'A'"],
|
||||
["B", "'B'"],
|
||||
["C", "'C'"],
|
||||
["D", "'D'"],
|
||||
["E", "'E'"],
|
||||
["F", "'F'"],
|
||||
["G", "'G'"],
|
||||
["H", "'H'"],
|
||||
["I", "'I'"],
|
||||
["J", "'J'"],
|
||||
["K", "'K'"],
|
||||
["L", "'L'"],
|
||||
["M", "'M'"],
|
||||
["N", "'N'"],
|
||||
["O", "'O'"],
|
||||
["P", "'P'"],
|
||||
["Q", "'Q'"],
|
||||
["R", "'R'"],
|
||||
["S", "'S'"],
|
||||
["T", "'T'"],
|
||||
["U", "'U'"],
|
||||
["V", "'V'"],
|
||||
["W", "'W'"],
|
||||
["X", "'X'"],
|
||||
["Y", "'Y'"],
|
||||
["Z", "'Z'"],
|
||||
["K0", "'0'"],
|
||||
["K1", "'1'"],
|
||||
["K2", "'2'"],
|
||||
["K3", "'3'"],
|
||||
["K4", "'4'"],
|
||||
["K5", "'5'"],
|
||||
["K6", "'6'"],
|
||||
["K7", "'7'"],
|
||||
["K8", "'8'"],
|
||||
["K9", "'9'"],
|
||||
]
|
||||
|
||||
r = "Key :: enum\n "
|
||||
for i,val in enumerate(mapping):
|
||||
r += val[0]
|
||||
if (i+1) % 10 == 0: r += "\n "
|
||||
elif i != len(mapping)-1: r += ";"
|
||||
print(r)
|
||||
|
||||
print("MapVKToKey :: (vk: U32): Key")
|
||||
el = ""
|
||||
for val,map in mapping:
|
||||
print(f" {el}if vk == {map} ;; return Key.{val}")
|
||||
el = "el"
|
||||
print(" Assert(false, \"Unidentified Virtual Key\")")
|
||||
*/
|
||||
MapVKToKey :: (vk: U32): Key
|
||||
if vk == VK_UP ;; return Key.Up
|
||||
elif vk == VK_DOWN ;; return Key.Down
|
||||
elif vk == VK_LEFT ;; return Key.Left
|
||||
elif vk == VK_RIGHT ;; return Key.Right
|
||||
elif vk == VK_ESCAPE ;; return Key.Escape
|
||||
elif vk == VK_CONTROL ;; return Key.Control
|
||||
elif vk == VK_BACK ;; return Key.Backspace
|
||||
elif vk == VK_MENU ;; return Key.Alt
|
||||
elif vk == VK_SHIFT ;; return Key.Shift
|
||||
elif vk == VK_TAB ;; return Key.Tab
|
||||
elif vk == VK_F1 ;; return Key.F1
|
||||
elif vk == VK_F2 ;; return Key.F2
|
||||
elif vk == VK_F3 ;; return Key.F3
|
||||
elif vk == VK_F4 ;; return Key.F4
|
||||
elif vk == VK_F5 ;; return Key.F5
|
||||
elif vk == VK_F6 ;; return Key.F6
|
||||
elif vk == VK_F7 ;; return Key.F7
|
||||
elif vk == VK_F8 ;; return Key.F8
|
||||
elif vk == VK_F9 ;; return Key.F9
|
||||
elif vk == VK_F10 ;; return Key.F10
|
||||
elif vk == VK_F11 ;; return Key.F11
|
||||
elif vk == VK_F12 ;; return Key.F12
|
||||
elif vk == 'A' ;; return Key.A
|
||||
elif vk == 'B' ;; return Key.B
|
||||
elif vk == 'C' ;; return Key.C
|
||||
elif vk == 'D' ;; return Key.D
|
||||
elif vk == 'E' ;; return Key.E
|
||||
elif vk == 'F' ;; return Key.F
|
||||
elif vk == 'G' ;; return Key.G
|
||||
elif vk == 'H' ;; return Key.H
|
||||
elif vk == 'I' ;; return Key.I
|
||||
elif vk == 'J' ;; return Key.J
|
||||
elif vk == 'K' ;; return Key.K
|
||||
elif vk == 'L' ;; return Key.L
|
||||
elif vk == 'M' ;; return Key.M
|
||||
elif vk == 'N' ;; return Key.N
|
||||
elif vk == 'O' ;; return Key.O
|
||||
elif vk == 'P' ;; return Key.P
|
||||
elif vk == 'Q' ;; return Key.Q
|
||||
elif vk == 'R' ;; return Key.R
|
||||
elif vk == 'S' ;; return Key.S
|
||||
elif vk == 'T' ;; return Key.T
|
||||
elif vk == 'U' ;; return Key.U
|
||||
elif vk == 'V' ;; return Key.V
|
||||
elif vk == 'W' ;; return Key.W
|
||||
elif vk == 'X' ;; return Key.X
|
||||
elif vk == 'Y' ;; return Key.Y
|
||||
elif vk == 'Z' ;; return Key.Z
|
||||
elif vk == '0' ;; return Key.K0
|
||||
elif vk == '1' ;; return Key.K1
|
||||
elif vk == '2' ;; return Key.K2
|
||||
elif vk == '3' ;; return Key.K3
|
||||
elif vk == '4' ;; return Key.K4
|
||||
elif vk == '5' ;; return Key.K5
|
||||
elif vk == '6' ;; return Key.K6
|
||||
elif vk == '7' ;; return Key.K7
|
||||
elif vk == '8' ;; return Key.K8
|
||||
elif vk == '9' ;; return Key.K9
|
||||
Assert(false, "Unidentified Virtual Key")
|
||||
/*END*/
|
||||
Reference in New Issue
Block a user