/* This file is purely documentational. It is generated from the contents of 'karl2d.odin'.*/ #+build ignore package karl2d //-----------------------------------------------// // SETUP, WINDOW MANAGEMENT AND FRAME MANAGEMENT // //-----------------------------------------------// /* Opens a window and initializes some internal state. The internal state will use `allocator` for all dynamically allocated memory. The return value can be ignored unless you need to later call `set_internal_state`. */ init :: proc(window_width: int, window_height: int, window_title: string, allocator := context.allocator, loc := #caller_location) -> ^State /* Returns true if the program wants to shut down. This happens when for example pressing the close button on the window. The application can decide if it wants to shut down or if it wants to show some kind of confirmation dialogue and shut down later. Commonly used for creating the "main loop" of a game.*/ shutdown_wanted :: proc() -> bool // Closes the window and cleans up the internal state. shutdown :: proc() // Clear the backbuffer with supplied color. clear :: proc(color: Color) // Present the backbuffer. Call at end of frame to make everything you've drawn appear on the screen. present :: proc() /* Call at start or end of frame to process all events that have arrived to the window. WARNING: Not calling this will make your program impossible to interact with. */ process_events :: proc() get_screen_width :: proc() -> int get_screen_height :: proc() -> int set_window_position :: proc(x: int, y: int) set_window_size :: proc(width: int, height: int) /* Flushes the current batch. This sends off everything to the GPU that has been queued in the current batch. Normally, you do not need to do this manually. It is done automatically when these procedures run: present set_camera set_shader TODO: complete this list and motivate why it needs to happen on those procs (or do that in the docs for those procs). */ draw_current_batch :: proc() //-------// // INPUT // //-------// /* Returns true if a keyboard key went down between the current and the previous frame. Set when 'process_events' runs (probably once per frame). */ key_went_down :: proc(key: Keyboard_Key) -> bool /* Returns true if a keyboard key went up (was released) between the current and the previous frame. Set when 'process_events' runs (probably once per frame). */ key_went_up :: proc(key: Keyboard_Key) -> bool /* Returns true if a keyboard is currently being held down. Set when 'process_events' runs (probably once per frame). */ key_is_held :: proc(key: Keyboard_Key) -> bool mouse_button_went_down :: proc(button: Mouse_Button) -> bool mouse_button_went_up :: proc(button: Mouse_Button) -> bool mouse_button_is_held :: proc(button: Mouse_Button) -> bool get_mouse_wheel_delta :: proc() -> f32 get_mouse_position :: proc() -> Vec2 //---------// // DRAWING // //---------// draw_rect :: proc(r: Rect, c: Color) draw_rect_ex :: proc(r: Rect, origin: Vec2, rot: f32, c: Color) draw_rect_outline :: proc(r: Rect, thickness: f32, color: Color) draw_circle :: proc(center: Vec2, radius: f32, color: Color, segments := 16) draw_line :: proc(start: Vec2, end: Vec2, thickness: f32, color: Color) draw_texture :: proc(tex: Texture, pos: Vec2, tint := WHITE) draw_texture_rect :: proc(tex: Texture, rect: Rect, pos: Vec2, tint := WHITE) draw_texture_ex :: proc(tex: Texture, src: Rect, dst: Rect, origin: Vec2, rotation: f32, tint := WHITE) draw_text :: proc(text: string, pos: Vec2, font_size: f32, color: Color) //--------------------// // TEXTURE MANAGEMENT // //--------------------// load_texture_from_file :: proc(filename: string) -> Texture destroy_texture :: proc(tex: Texture) //---------// // SHADERS // //---------// load_shader :: proc(shader_source: string, layout_formats: []Shader_Input_Format = {}) -> Shader destroy_shader :: proc(shader: Shader) get_default_shader :: proc() -> Shader set_shader :: proc(shader: Maybe(Shader)) set_shader_constant :: proc(shd: Shader, loc: Shader_Constant_Location, val: any) override_shader_input :: proc(shader: Shader, input: int, val: any) shader_input_format_size :: proc(f: Shader_Input_Format) -> int //-------------------------------// // CAMERA AND COORDINATE SYSTEMS // //-------------------------------// set_camera :: proc(camera: Maybe(Camera)) screen_to_world :: proc(pos: Vec2, camera: Camera) -> Vec2 //------// // MISC // //------// set_scissor_rect :: proc(scissor_rect: Maybe(Rect)) /* Restore the internal state using the pointer returned by `init`. Useful after reloading the library (for example, when doing code hot reload). */ set_internal_state :: proc(state: ^State) //---------------------// // TYPES AND CONSTANTS // //---------------------// // A RGBA (Red, Greeen, Blue, Alpha) color. Each channel can have a value between 0 and 255. Color :: [4]u8 // A two dimensinal vector. Vec2 :: [2]f32 // A three dimensinal vector. Vec3 :: [3]f32 // A 4x4 column-major matrix. Mat4 :: matrix[4,4]f32 // A two dimensional vector of integer numeric type. Vec2i :: [2]int // A rectangle that sits at position (x, y) and has size (w, h). Rect :: struct { x, y: f32, w, h: f32, } Texture :: struct { handle: Texture_Handle, width: int, height: int, } Camera :: struct { target: Vec2, origin: Vec2, rotation: f32, zoom: f32, } Shader_Handle :: distinct Handle SHADER_NONE :: Shader_Handle {} Shader :: struct { handle: Shader_Handle, constant_buffers: []Shader_Constant_Buffer, constant_lookup: map[string]Shader_Constant_Location, constant_builtin_locations: [Shader_Builtin_Constant]Maybe(Shader_Constant_Location), inputs: []Shader_Input, input_overrides: []Shader_Input_Value_Override, default_input_offsets: [Shader_Default_Inputs]int, vertex_size: int, } Shader_Constant_Buffer :: struct { cpu_data: []u8, } SHADER_INPUT_VALUE_MAX_SIZE :: 256 Shader_Input_Value_Override :: struct { val: [SHADER_INPUT_VALUE_MAX_SIZE]u8, used: int, } Shader_Input_Type :: enum { F32, Vec2, Vec3, Vec4, } Shader_Builtin_Constant :: enum { MVP, } Shader_Default_Inputs :: enum { Unknown, Position, UV, Color, } Shader_Input :: struct { name: string, register: int, type: Shader_Input_Type, format: Shader_Input_Format, } Shader_Constant_Location :: struct { buffer_idx: u32, offset: u32, } Shader_Input_Format :: enum { Unknown, RGBA32_Float, RGBA8_Norm, RGBA8_Norm_SRGB, RGB32_Float, RG32_Float, R32_Float, } Handle :: hm.Handle Texture_Handle :: distinct Handle TEXTURE_NONE :: Texture_Handle {} /* This keeps track of the internal state of the library. Usually, you do not need to poke at it. It is created and kept as a global variable when 'init' is called. However, 'init' also returns the pointer to it, so you can later use 'set_internal_state' to restore it (after for example hot reload). */ State :: struct { allocator: runtime.Allocator, custom_context: runtime.Context, win: Window_Interface, window_state: rawptr, rb: Rendering_Backend_Interface, rb_state: rawptr, shutdown_wanted: bool, mouse_position: Vec2, mouse_delta: Vec2, mouse_wheel_delta: f32, keys_went_down: #sparse [Keyboard_Key]bool, keys_went_up: #sparse [Keyboard_Key]bool, keys_is_held: #sparse [Keyboard_Key]bool, window: Window_Handle, width: int, height: int, shape_drawing_texture: Texture_Handle, batch_camera: Maybe(Camera), batch_shader: Maybe(Shader), batch_texture: Texture_Handle, view_matrix: Mat4, proj_matrix: Mat4, vertex_buffer_cpu: []u8, vertex_buffer_cpu_used: int, default_shader: Shader, } // Support for up to 255 mouse buttons. Cast an int to type `Mouse_Button` to use things outside the // options presented here. Mouse_Button :: enum { Left, Right, Middle, Max = 255, } WHITE :: Color { 255, 255, 255, 255 } BLACK :: Color { 0, 0, 0, 255 } BLANK :: Color { 0, 0, 0, 0} // These are from Raylib. They are here so you can easily port a Raylib program to Karl2D. RL_LIGHTGRAY :: Color { 200, 200, 200, 255 } RL_GRAY :: Color { 130, 130, 130, 255 } RL_DARKGRAY :: Color { 80, 80, 80, 255 } RL_YELLOW :: Color { 253, 249, 0, 255 } RL_GOLD :: Color { 255, 203, 0, 255 } RL_ORANGE :: Color { 255, 161, 0, 255 } RL_PINK :: Color { 255, 109, 194, 255 } RL_RED :: Color { 230, 41, 55, 255 } RL_MAROON :: Color { 190, 33, 55, 255 } RL_GREEN :: Color { 0, 228, 48, 255 } RL_LIME :: Color { 0, 158, 47, 255 } RL_DARKGREEN :: Color { 0, 117, 44, 255 } RL_SKYBLUE :: Color { 102, 191, 255, 255 } RL_BLUE :: Color { 0, 121, 241, 255 } RL_DARKBLUE :: Color { 0, 82, 172, 255 } RL_PURPLE :: Color { 200, 122, 255, 255 } RL_VIOLET :: Color { 135, 60, 190, 255 } RL_DARKPURPLE :: Color { 112, 31, 126, 255 } RL_BEIGE :: Color { 211, 176, 131, 255 } RL_BROWN :: Color { 127, 106, 79, 255 } RL_DARKBROWN :: Color { 76, 63, 47, 255 } RL_WHITE :: WHITE RL_BLACK :: BLACK RL_BLANK :: BLANK RL_MAGENTA :: Color { 255, 0, 255, 255 } RL_RAYWHITE :: Color { 245, 245, 245, 255 } // Based on Raylib / GLFW Keyboard_Key :: enum { None = 0, // Alphanumeric keys Apostrophe = 39, Comma = 44, Minus = 45, Period = 46, Slash = 47, Zero = 48, One = 49, Two = 50, Three = 51, Four = 52, Five = 53, Six = 54, Seven = 55, Eight = 56, Nine = 57, Semicolon = 59, Equal = 61, 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, Left_Bracket = 91, Backslash = 92, Right_Bracket = 93, Grave = 96, // Function keys Space = 32, Escape = 256, Enter = 257, Tab = 258, Backspace = 259, Insert = 260, Delete = 261, Right = 262, Left = 263, Down = 264, Up = 265, Page_Up = 266, Page_Down = 267, Home = 268, End = 269, Caps_Lock = 280, Scroll_Lock = 281, Num_Lock = 282, Print_Screen = 283, Pause = 284, F1 = 290, F2 = 291, F3 = 292, F4 = 293, F5 = 294, F6 = 295, F7 = 296, F8 = 297, F9 = 298, F10 = 299, F11 = 300, F12 = 301, Left_Shift = 340, Left_Control = 341, Left_Alt = 342, Left_Super = 343, Right_Shift = 344, Right_Control = 345, Right_Alt = 346, Right_Super = 347, Menu = 348, // Keypad keys KP_0 = 320, KP_1 = 321, KP_2 = 322, KP_3 = 323, KP_4 = 324, KP_5 = 325, KP_6 = 326, KP_7 = 327, KP_8 = 328, KP_9 = 329, KP_Decimal = 330, KP_Divide = 331, KP_Multiply = 332, KP_Subtract = 333, KP_Add = 334, KP_Enter = 335, KP_Equal = 336, }