package game import rl "vendor:raylib" VIEWPORT_W :: 1280 VIEWPORT_H :: 720 WINDOW_W :: 2560 WINDOW_H :: 1440 WINDOW_TITLE :: "Pong" Game :: struct { viewport: rl.RenderTexture2D, // base scene (gameplay, mainmenu) scene: Scene, // active overlay (pause, settings, or nil) overlay_scene: Maybe(Overlay_Scene), } // ------------------------------------------------------------------------------ // Game Lifecycle // ------------------------------------------------------------------------------ game_init :: proc(game: ^Game) { rl.InitWindow(WINDOW_W, WINDOW_H, WINDOW_TITLE) rl.SetTargetFPS(60) game.viewport = rl.LoadRenderTexture(VIEWPORT_W, VIEWPORT_H) game.scene = init_gameplay_scene() } game_update :: proc(game: ^Game) { dt := rl.GetFrameTime() input := poll_input() // update the overlay if active, otherwise update base scene if game.overlay_scene != nil { overlay_update(game, input, dt) } else { scene_update(game, input, dt) } } game_render :: proc(game: ^Game) { rl.BeginDrawing() rl.ClearBackground(rl.BLACK) // offscreen pass render everything into virtual 1280x720 target rl.BeginTextureMode(game.viewport) rl.ClearBackground(rl.BLACK) scene_render(game) // Renders base scene (Level field or Main Menu) overlay_render(game) // Renders active overlay on top if present rl.EndTextureMode() // upscale pass stretch virtual buffer onto physical window display render_game_to_window(game.viewport.texture) rl.EndDrawing() } game_quit :: proc(game: ^Game) { rl.UnloadRenderTexture(game.viewport) rl.CloseWindow() } game_should_run :: proc() -> bool { return !rl.WindowShouldClose() } // ------------------------------------------------------------------------------ // Window Upscale Render // ------------------------------------------------------------------------------ render_game_to_window :: proc(texture: rl.Texture) { rl.DrawTexturePro( texture, // src: inverted y coordinate flips opengl texture buffer correctly rl.Rectangle{0, 0, f32(texture.width), -f32(texture.height)}, // dst: scales viewport canvas to fill window resolution rl.Rectangle{0, 0, f32(WINDOW_W), f32(WINDOW_H)}, rl.Vector2{}, 0, rl.WHITE, ) }