@@ -1,5 +1,8 @@
when ODIN_OS == "linux" do foreign import glfw "system:glfw";
when ODIN_OS == "windows" do foreign import glfw "system:glfw3dll.lib";
package glfw

// when ODIN_OS == "linux" do foreign import glfw "system:glfw";
// when ODIN_OS == "windows" do foreign import glfw "system:glfw3dll.lib";
foreign import glfw "system:glfw3dll.lib";

/*** Structs/types ***/
Window_Handle :: rawptr;
@@ -33,7 +36,7 @@ Window_Close_Proc :: #type proc "c" (window: Window_Handle);
Window_Size_Proc :: #type proc "c" (window: Window_Handle, width, height: i32);
Window_Pos_Proc :: #type proc "c" (window: Window_Handle, xpos, ypos: i32);
Framebuffer_Size_Proc :: #type proc "c" (window: Window_Handle, width, height: i32);
Drop_Proc :: #type proc "c" (window: Window_Handle, count: i32, paths: ^^u8);
Drop_Proc :: #type proc "c" (window: Window_Handle, count: i32, paths: ^cstring);
Monitor_Proc :: #type proc "c" (window: Window_Handle);

Key_Proc :: #type proc "c" (window: Window_Handle, key: Key, scancode: i32, action: Action, mods: i32);
@@ -45,7 +48,7 @@ Char_Mods_Proc :: #type proc "c" (window: Window_Handle, codepoint: u32,
Cursor_Enter_Proc :: #type proc "c" (window: Window_Handle, entered: i32);
Joystick_Proc :: #type proc "c" (joy, event: i32);

Error_Proc :: #type proc "c" (error: i32, description: ^u8);
Error_Proc :: #type proc "c" (error: i32, description: cstring);

/*** Functions ***/
@(default_calling_convention="c")
@@ -66,7 +69,7 @@ foreign glfw {
@(link_name="glfwGetGammaRamp") GetGammaRamp :: proc(monitor: Monitor_Handle) -> ^Gamma_Ramp ---;
@(link_name="glfwSetGammaRamp") SetGammaRamp :: proc(monitor: Monitor_Handle, ramp: ^Gamma_Ramp) ---;

glfwCreateWindow :: proc "c"(width, height: i32, title: ^u8, monitor: Monitor_Handle, share: Window_Handle) -> Window_Handle ---;
glfwCreateWindow :: proc "c"(width, height: i32, title: cstring, monitor: Monitor_Handle, share: Window_Handle) -> Window_Handle ---;
@(link_name="glfwDestroyWindow") DestroyWindow :: proc(window: Window_Handle) ---;

@(link_name="glfwWindowHint") WindowHint :: proc(hint, value: i32) ---;
@@ -77,7 +80,7 @@ foreign glfw {
@(link_name="glfwSwapInterval") SwapInterval :: proc(interval: i32) ---;
@(link_name="glfwSwapBuffers") SwapBuffers :: proc(window: Window_Handle) ---;

glfwSetWindowTitle :: proc(window: Window_Handle, title: ^u8) ---;
glfwSetWindowTitle :: proc(window: Window_Handle, title: cstring) ---;
@(link_name="glfwSetWindowIcon") SetWindowIcon :: proc(window: Window_Handle, count: i32, images: ^Image) ---;
@(link_name="glfwSetWindowPos") SetWindowPos :: proc(window: Window_Handle, xpos, ypos: i32) ---;
@(link_name="glfwSetWindowSizeLimits") SetWindowSizeLimits :: proc(window: Window_Handle, minwidth, minheight, maxwidth, maxheight: i32) ---;
@@ -121,7 +124,7 @@ foreign glfw {
glfwGetJoystickAxes :: proc(joy: i32, count: ^i32) -> ^f32 ---;
glfwGetJoystickButtons :: proc(joy: i32, count: ^i32) -> ^u8 ---;

@(link_name="glfwSetClipboardString") SetClipboardString :: proc(window: Window_Handle, str: ^u8) ---;
@(link_name="glfwSetClipboardString") SetClipboardString :: proc(window: Window_Handle, str: cstring) ---;

@(link_name="glfwGetTime") GetTime :: proc() -> f64 ---;
@(link_name="glfwSetTime") SetTime :: proc(time: f64) ---;
@@ -130,10 +133,10 @@ foreign glfw {

@(link_name="glfwMakeContextCurrent") MakeContextCurrent :: proc(window: Window_Handle) ---;
@(link_name="glfwGetCurrentContext") GetCurrentContext :: proc() -> Window_Handle ---;
@(link_name="glfwGetProcAddress") GetProcAddress :: proc(name : ^u8) -> rawptr ---;
@(link_name="glfwExtensionSupported") ExtensionSupported :: proc(extension: ^u8) -> i32 ---;
@(link_name="glfwGetProcAddress") GetProcAddress :: proc(name : cstring) -> rawptr ---;
@(link_name="glfwExtensionSupported") ExtensionSupported :: proc(extension: cstring) -> i32 ---;

@(link_name="glfwGetRequiredInstanceExtensions") GetRequiredInstanceExtensions :: proc(count: ^u32) -> ^^u8 ---;
@(link_name="glfwGetRequiredInstanceExtensions") GetRequiredInstanceExtensions :: proc(count: ^u32) -> ^cstring ---;

@(link_name="glfwSetWindowIconifyCallback") SetWindowIconifyCallback :: proc(window: Window_Handle, cbfun: Window_Iconify_Proc) -> Window_Iconify_Proc ---;
@(link_name="glfwSetWindowRefreshCallback") SetWindowRefreshCallback :: proc(window: Window_Handle, cbfun: Window_Refresh_Proc) -> Window_Refresh_Proc ---;
@@ -159,10 +162,10 @@ foreign glfw {

// Odin Wrappers

import "core:fmt.odin"
import "core:math.odin"
import "core:strings.odin"
import "core:mem.odin"
import "core:fmt"
import "core:math"
import "core:strings"
import "core:mem"

GetVersion :: proc() -> (major, minor, rev: i32) {
glfwGetVersion(&major, &minor, &rev);
@@ -171,9 +174,9 @@ GetVersion :: proc() -> (major, minor, rev: i32) {

GetVersionString :: proc() -> string {
foreign glfw {
glfwGetVersionString :: proc "c" () -> ^u8 ---;
glfwGetVersionString :: proc "c" () -> cstring ---;
}
return cast(string)cast(cstring)(glfwGetVersionString());
return string(cstring(glfwGetVersionString()));
}

GetMonitors :: proc() -> []Monitor_Handle {
@@ -192,20 +195,20 @@ GetMonitorPhysicalSize :: proc(monitor: Monitor_Handle) -> (widthMM, heightMM: i

GetMonitorName :: proc(monitor: Monitor_Handle) -> string {
foreign glfw {
glfwGetMonitorName :: proc "c" (monitor: Monitor_Handle) -> ^u8 ---;
glfwGetMonitorName :: proc "c" (monitor: Monitor_Handle) -> cstring ---;
}
return cast(string)cast(cstring)(glfwGetMonitorName(monitor));
return string(cstring(glfwGetMonitorName(monitor)));
}

CreateWindow :: inline proc(width, height: i32, title: string, monitor: Monitor_Handle, share: Window_Handle) -> Window_Handle {
return glfwCreateWindow(width, height, &title[0], monitor, share);
return glfwCreateWindow(width, height, cstring(&title[0]), monitor, share);
}

GetClipboardString :: proc(window: Window_Handle) -> string {
foreign glfw {
glfwGetClipboardString :: proc "c" (window: Window_Handle) -> ^u8 ---;
glfwGetClipboardString :: proc "c" (window: Window_Handle) -> cstring ---;
}
return cast(string)cast(cstring)(glfwGetClipboardString(window));
return string(cstring(glfwGetClipboardString(window)));
}

GetVideoModes :: proc(monitor: Monitor_Handle) -> []Vid_Mode {
@@ -227,9 +230,9 @@ GetKey :: inline proc(window: Window_Handle, key: Key) -> Action {
}
GetKeyName :: proc(key, scancode: i32) -> string {
foreign glfw {
glfwGetKeyName :: proc "c" (key, scancode: i32) -> ^u8 ---;
glfwGetKeyName :: proc "c" (key, scancode: i32) -> cstring ---;
}
return cast(string)cast(cstring)(glfwGetKeyName(key, scancode));
return string(cstring(glfwGetKeyName(key, scancode)));
}


@@ -257,7 +260,7 @@ SetWindowTitle :: proc(window: Window_Handle, fmt_string: string, args: ...any)
}
buf: [1024]u8;
title := fmt.bprintf(buf[..], fmt_string, ...args);
glfwSetWindowTitle(window, &title[0]);
glfwSetWindowTitle(window, cstring(&title[0]));
}

GetWindowPos :: proc(window: Window_Handle) -> (xpos, ypos: i32) {
@@ -305,9 +308,9 @@ GetJoystickButtons :: proc(joy: i32) -> []u8 {

GetJoystickName :: proc(joy: i32) -> string {
foreign glfw {
glfwGetJoystickName :: proc "c" (joy: i32) -> ^u8 ---;
glfwGetJoystickName :: proc "c" (joy: i32) -> cstring ---;
}
return cast(string)cast(cstring)(glfwGetJoystickName(joy));
return string(cstring(glfwGetJoystickName(joy)));
}


@@ -348,8 +351,8 @@ calculate_frame_timings :: proc(window: Window_Handle) {

init_helper :: proc(resx := 1280, resy := 720, title := "Window title", version_major := 3, version_minor := 3, samples := 0, vsync := false) -> Window_Handle {
//
error_callback :: proc"c"(error: i32, desc: ^u8) {
fmt.printf("Error code %d: %s\n", error, cast(string)cast(cstring)(desc));
error_callback :: proc"c"(error: i32, desc: cstring) {
fmt.printf("Error code %d: %s\n", error, desc);
}
SetErrorCallback(error_callback);

@@ -373,8 +376,8 @@ init_helper :: proc(resx := 1280, resy := 720, title := "Window title", version_
return window;
}

set_proc_address :: proc(p: rawptr, name: string) {
(cast(^rawptr)p)^ = GetProcAddress(&name[0]);
set_proc_address :: proc(p: rawptr, name: cstring) {
(cast(^rawptr)p)^ = GetProcAddress(name);
}

/*** Constants ***/
@@ -1,6 +1,6 @@
import "glfw.odin"
using import "basic.odin"
using import "logging.odin"
package workbench

import "shared:workbench/glfw"

Key :: glfw.Key;
Mouse :: glfw.Mouse;
@@ -1,8 +1,9 @@
import "core:fmt.odin"
import "basic.odin"
package workbench

import "core:fmt"

logln :: proc(args: ...any, location := #caller_location) {
file := basic.file_from_path(location.file_path);
file := file_from_path(location.file_path);
fmt.printf("<%s.%s():%d> ", file, location.procedure, location.line);
fmt.print(...args);
fmt.printf("\n");
@@ -1,4 +1,6 @@
export "core:math.odin"
package workbench

using import "core:math"

Vec2i :: distinct [2]int;
Vec3i :: distinct [3]int;
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -1,8 +1,11 @@
package stb

/*
Taken from https://gist.github.com/gingerBill/17ed98d3312a56d3e515f35e093a1b8f, with some minor modifications
*/
when ODIN_OS == "windows" do foreign import stbi "lib/stb_image.lib"
when ODIN_OS == "linux" do foreign import stbi "lib/stb_image.a"
foreign import stbi "lib/stb_image.lib"
// when ODIN_OS == "windows" do foreign import stbi "lib/stb_image.lib"
// when ODIN_OS == "linux" do foreign import stbi "lib/stb_image.a"

//
// load image by filename, open file, or memory buffer
@@ -83,5 +86,5 @@ foreign stbi {


main :: proc() {

}
@@ -1,5 +1,8 @@
when ODIN_OS == "windows" do foreign import stbi "lib/stb_image_write.lib"
when ODIN_OS == "linux" do foreign import stbi "lib/stb_image_write.a"
package stb

foreign import stbi "lib/stb_image_write.lib"
// when ODIN_OS == "windows" do foreign import stbi "lib/stb_image_write.lib"
// when ODIN_OS == "linux" do foreign import stbi "lib/stb_image_write.a"

// bind
@(default_calling_convention="c")
@@ -1,7 +1,10 @@
when ODIN_OS == "windows" do foreign import stbtt "lib/stb_truetype.lib"
when ODIN_OS == "linux" do foreign import stbtt "lib/stb_truetype.a"
package stb

import "core:mem.odin";
foreign import stbtt "lib/stb_truetype.lib"
// when ODIN_OS == "windows" do foreign import stbtt "lib/stb_truetype.lib"
// when ODIN_OS == "linux" do foreign import stbtt "lib/stb_truetype.a"

import "core:mem";

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
@@ -78,7 +81,7 @@ stbtt_pack_range :: struct {
num_chars: i32,
chardata_for_range: ^stbtt_packedchar,
_, _: u8, // used internally to store oversample info
}
}

stbtt_pack_context :: struct {
user_allocator_context, pack_info: rawptr,
@@ -154,7 +157,7 @@ stbtt_fontinfo :: struct {
fontstart: i32,

numGlyphs: i32,

loca,head,glyf,hhea,hmtx,kern: i32,
index_map: i32,
indexToLocFormat: i32,
@@ -1,20 +1,18 @@
import "core:raw.odin"
import "core:mem.odin"
import "core:fmt.odin"
package workbench

export "shared:odin-stb/stb_image.odin"
import "core:raw"
import "core:mem"
import "core:fmt"

import "types.odin"
import "shared:workbench/stb"

load :: proc[load_wrapper, stbi.load];

load_wrapper :: inline proc(filename: cstring) -> ([]types.Colori, i32, i32) {
stbi.set_flip_vertically_on_load(0);
load_wrapper :: inline proc(filename: cstring) -> ([]Colori, i32, i32) {
stb.set_flip_vertically_on_load(0);
w, h, num_channels: i32;
image_data := stbi.load((cast(^raw.Cstring)&filename).data, &w, &h, &num_channels, 4);
image_data := stb.load((cast(^raw.Cstring)&filename).data, &w, &h, &num_channels, 4);
assert(num_channels == 4);
slice := mem.slice_ptr(image_data, cast(int)(w * h));
pixels := (cast(^[]types.Colori)&slice)^;
pixels := (cast(^[]Colori)&slice)^;

return pixels, w, h;
}
@@ -1,4 +1,6 @@
import w32 "core:sys/windows.odin"
package workbench

import w32 "core:sys/win32"

Stopwatch :: struct {
started: bool,
@@ -1,3 +1,5 @@
package workbench

Colorf :: struct {
r, g, b, a: f32,
}

This file was deleted.

300 wb.odin

Large diffs are not rendered by default.