mirror of
https://github.com/Ed94/VEFontCache-Odin.git
synced 2025-10-08 17:50:54 -07:00
Manually adding thirdparty libs
This commit is contained in:
7
.gitignore
vendored
7
.gitignore
vendored
@@ -1,7 +1,6 @@
|
||||
.vscode
|
||||
ols.json
|
||||
build
|
||||
thirdparty/freetype
|
||||
thirdparty/harfbuzz
|
||||
thirdparty/sokol
|
||||
thirdparty/sokol-tools
|
||||
# thirdparty/harfbuzz
|
||||
# thirdparty/sokol
|
||||
# thirdparty/sokol-tools
|
||||
|
10
thirdparty/harfbuzz/README.md
vendored
Normal file
10
thirdparty/harfbuzz/README.md
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# harfbuzz-odin
|
||||
|
||||
Harbuzz bindings for odin.
|
||||
|
||||
Its not the full amount, just enough to utilize its base shaping functionality.
|
||||
|
||||
## scripts/build.ps1
|
||||
|
||||
I only have support for building on Windows & Linux. However, Mac and Linux technically can just reference the library from their respective package managers.
|
||||
Will pull the latest source from the harfbuzz repository and build requisite libraries. Adjust the code as needed, by default a custom unity build is done (see `Build-RepoWithoutMeson`).
|
345
thirdparty/harfbuzz/harfbuzz.odin
vendored
Normal file
345
thirdparty/harfbuzz/harfbuzz.odin
vendored
Normal file
@@ -0,0 +1,345 @@
|
||||
/*
|
||||
NOTE(Ed): These bindings are currently partial for usage in a VE Font Cache port.
|
||||
*/
|
||||
package harfbuzz
|
||||
|
||||
import "core:c"
|
||||
|
||||
when ODIN_OS == .Windows {
|
||||
// @(extra_linker_flags="/NODEFAULTLIB:msvcrt")
|
||||
// foreign import harfbuzz "./lib/win64/libharfbuzz-0.dll"
|
||||
foreign import harfbuzz "./lib/win64/harfbuzz.lib"
|
||||
// foreign import harfbuzz "./lib/win64/libharfbuzz.a"
|
||||
}
|
||||
else when ODIN_OS == .Linux {
|
||||
// foreign import harfbuzz "./lib/linux64/libharfbuzz.so"
|
||||
foreign import harfbuzz "system:harfbuzz"
|
||||
}
|
||||
else when ODIN_OS == .Darwin {
|
||||
// foreign import harfbuzz { "./lib/osx/libharfbuzz.so" }
|
||||
foreign import harfbuzz "system:harfbuzz"
|
||||
}
|
||||
|
||||
Buffer :: distinct rawptr // hb_buffer_t*
|
||||
Blob :: distinct rawptr // hb_blob_t*
|
||||
Codepoint :: distinct c.uint32_t // hb_codepoint_t
|
||||
Face :: distinct rawptr // hb_face_t*
|
||||
Font :: distinct rawptr // hb_font_t*
|
||||
Language :: distinct rawptr // hb_language_t*
|
||||
Mask :: distinct c.uint32_t // hb_mask_t
|
||||
Position :: distinct c.uint32_t // hb_position_t
|
||||
Tag :: distinct c.uint32_t // hb_tag_t
|
||||
Unicode_Funcs :: distinct rawptr // hb_unicode_funcs_t*
|
||||
|
||||
hb_var_int_t :: struct #raw_union {
|
||||
u32 : c.uint32_t,
|
||||
i32 : c.int32_t,
|
||||
u16 : [2]c.uint16_t,
|
||||
i16 : [2]c.int16_t,
|
||||
u8 : [4]c.uint8_t,
|
||||
i8 : [4]c.int8_t,
|
||||
}
|
||||
|
||||
Feature :: struct {
|
||||
tag : Tag,
|
||||
value : c.uint32_t,
|
||||
start : c.uint,
|
||||
end : c.uint,
|
||||
}
|
||||
|
||||
Glyph_Info :: struct {
|
||||
codepoint : Codepoint,
|
||||
/*< private >*/
|
||||
mask : Mask,
|
||||
/*< public >*/
|
||||
cluster : c.uint32_t,
|
||||
|
||||
/*< private >*/
|
||||
var1 : hb_var_int_t,
|
||||
var2 : hb_var_int_t,
|
||||
}
|
||||
|
||||
Glyph_Position :: struct {
|
||||
x_advance : Position,
|
||||
y_advance : Position,
|
||||
x_offset : Position,
|
||||
y_offset : Position,
|
||||
|
||||
/*< private >*/
|
||||
var : hb_var_int_t,
|
||||
}
|
||||
|
||||
Segment_Properties :: struct {
|
||||
direction : Direction,
|
||||
script : Script,
|
||||
language : Language,
|
||||
reserved1 : rawptr,
|
||||
reserved2 : rawptr,
|
||||
}
|
||||
|
||||
Buffer_Content_Type :: enum c.uint {
|
||||
INVALID = 0,
|
||||
UNICODE,
|
||||
GLYPHS
|
||||
}
|
||||
|
||||
Direction :: enum c.uint {
|
||||
INVALID = 0,
|
||||
LGR = 4,
|
||||
RTL,
|
||||
TTB,
|
||||
BTT,
|
||||
}
|
||||
|
||||
Script :: enum u32 {
|
||||
// ID = ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF))),
|
||||
|
||||
// 1.1
|
||||
COMMON = ( u32('Z') & 0xFF ) << 24 | ( u32('y') & 0xFF ) << 16 | ( u32('y') & 0xFF ) << 8 | ( u32('y') & 0xFF ),
|
||||
INHERITED = ( u32('Z') & 0xFF ) << 24 | ( u32('i') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('h') & 0xFF ),
|
||||
|
||||
// 5.0
|
||||
UNKNOWN = ( u32('Z') & 0xFF ) << 24 | ( u32('z') & 0xFF ) << 16 | ( u32('z') & 0xFF ) << 8 | ( u32('z') & 0xFF ),
|
||||
|
||||
// 1.1
|
||||
ARABIC = ( u32('A') & 0xFF ) << 24 | ( u32('r') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('b') & 0xFF ),
|
||||
ARMENIAN = ( u32('A') & 0xFF ) << 24 | ( u32('r') & 0xFF ) << 16 | ( u32('m') & 0xFF ) << 8 | ( u32('n') & 0xFF ),
|
||||
BENGALI = ( u32('B') & 0xFF ) << 24 | ( u32('e') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('g') & 0xFF ),
|
||||
CYRILLIC = ( u32('C') & 0xFF ) << 24 | ( u32('y') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('l') & 0xFF ),
|
||||
DEVANAGARI = ( u32('D') & 0xFF ) << 24 | ( u32('e') & 0xFF ) << 16 | ( u32('v') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
GEORGIAN = ( u32('G') & 0xFF ) << 24 | ( u32('e') & 0xFF ) << 16 | ( u32('o') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
GREEK = ( u32('G') & 0xFF ) << 24 | ( u32('r') & 0xFF ) << 16 | ( u32('e') & 0xFF ) << 8 | ( u32('k') & 0xFF ),
|
||||
GUJARATI = ( u32('G') & 0xFF ) << 24 | ( u32('u') & 0xFF ) << 16 | ( u32('j') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
GURMUKHI = ( u32('G') & 0xFF ) << 24 | ( u32('u') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('u') & 0xFF ),
|
||||
HANGUL = ( u32('H') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('g') & 0xFF ),
|
||||
HAN = ( u32('H') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
HEBREW = ( u32('H') & 0xFF ) << 24 | ( u32('e') & 0xFF ) << 16 | ( u32('b') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
HIRAGANA = ( u32('H') & 0xFF ) << 24 | ( u32('i') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
KANNADA = ( u32('K') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('d') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
KATAKANA = ( u32('K') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
LAO = ( u32('L') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('o') & 0xFF ) << 8 | ( u32('o') & 0xFF ),
|
||||
LATIN = ( u32('L') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('t') & 0xFF ) << 8 | ( u32('n') & 0xFF ),
|
||||
MALAYALAN = ( u32('M') & 0xFF ) << 24 | ( u32('l') & 0xFF ) << 16 | ( u32('y') & 0xFF ) << 8 | ( u32('m') & 0xFF ),
|
||||
ORIYA = ( u32('O') & 0xFF ) << 24 | ( u32('r') & 0xFF ) << 16 | ( u32('y') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
TAMIL = ( u32('T') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('m') & 0xFF ) << 8 | ( u32('l') & 0xFF ),
|
||||
TELUGU = ( u32('T') & 0xFF ) << 24 | ( u32('e') & 0xFF ) << 16 | ( u32('l') & 0xFF ) << 8 | ( u32('u') & 0xFF ),
|
||||
THAI = ( u32('T') & 0xFF ) << 24 | ( u32('h') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
|
||||
// 2.0
|
||||
TIBETAN = ( u32('T') & 0xFF ) << 24 | ( u32('i') & 0xFF ) << 16 | ( u32('b') & 0xFF ) << 8 | ( u32('t') & 0xFF ),
|
||||
|
||||
// 3.0
|
||||
BOPOMOFO = ( u32('B') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('p') & 0xFF ) << 8 | ( u32('o') & 0xFF ),
|
||||
BRAILLE = ( u32('B') & 0xFF ) << 24 | ( u32('r') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
CANADIAN_SYLLABICS = ( u32('C') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('s') & 0xFF ),
|
||||
CHEROKEE = ( u32('C') & 0xFF ) << 24 | ( u32('h') & 0xFF ) << 16 | ( u32('e') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
ETHIOPIC = ( u32('E') & 0xFF ) << 24 | ( u32('t') & 0xFF ) << 16 | ( u32('h') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
KHMER = ( u32('K') & 0xFF ) << 24 | ( u32('h') & 0xFF ) << 16 | ( u32('m') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
MONGOLIAN = ( u32('M') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('g') & 0xFF ),
|
||||
MYANMAR = ( u32('M') & 0xFF ) << 24 | ( u32('y') & 0xFF ) << 16 | ( u32('m') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
OGHAM = ( u32('O') & 0xFF ) << 24 | ( u32('g') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('n') & 0xFF ),
|
||||
RUNIC = ( u32('R') & 0xFF ) << 24 | ( u32('u') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
SINHALA = ( u32('S') & 0xFF ) << 24 | ( u32('i') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('h') & 0xFF ),
|
||||
SYRIAC = ( u32('S') & 0xFF ) << 24 | ( u32('y') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('c') & 0xFF ),
|
||||
THAANA = ( u32('T') & 0xFF ) << 24 | ( u32('h') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
YI = ( u32('Y') & 0xFF ) << 24 | ( u32('i') & 0xFF ) << 16 | ( u32('i') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
|
||||
// 3.1
|
||||
DESERET = ( u32('D') & 0xFF ) << 24 | ( u32('s') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('t') & 0xFF ),
|
||||
GOTHIC = ( u32('G') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('t') & 0xFF ) << 8 | ( u32('h') & 0xFF ),
|
||||
OLD_ITALIC = ( u32('I') & 0xFF ) << 24 | ( u32('t') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('l') & 0xFF ),
|
||||
|
||||
// 3.2
|
||||
BUHID = ( u32('B') & 0xFF ) << 24 | ( u32('u') & 0xFF ) << 16 | ( u32('h') & 0xFF ) << 8 | ( u32('d') & 0xFF ),
|
||||
HANUNOO = ( u32('H') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('o') & 0xFF ),
|
||||
TAGALOG = ( u32('T') & 0xFF ) << 24 | ( u32('g') & 0xFF ) << 16 | ( u32('l') & 0xFF ) << 8 | ( u32('g') & 0xFF ),
|
||||
TAGBANWA = ( u32('T') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('g') & 0xFF ) << 8 | ( u32('b') & 0xFF ),
|
||||
|
||||
// 4.0
|
||||
CYPRIOT = ( u32('C') & 0xFF ) << 24 | ( u32('p') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('t') & 0xFF ),
|
||||
LIMBU = ( u32('L') & 0xFF ) << 24 | ( u32('i') & 0xFF ) << 16 | ( u32('m') & 0xFF ) << 8 | ( u32('b') & 0xFF ),
|
||||
LINEAR_B = ( u32('L') & 0xFF ) << 24 | ( u32('i') & 0xFF ) << 16 | ( u32('i') & 0xFF ) << 8 | ( u32('b') & 0xFF ),
|
||||
OSMANYA = ( u32('O') & 0xFF ) << 24 | ( u32('m') & 0xFF ) << 16 | ( u32('m') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
SHAVIAN = ( u32('S') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('w') & 0xFF ),
|
||||
TAI_LE = ( u32('T') & 0xFF ) << 24 | ( u32('l') & 0xFF ) << 16 | ( u32('l') & 0xFF ) << 8 | ( u32('e') & 0xFF ),
|
||||
UGARITIC = ( u32('U') & 0xFF ) << 24 | ( u32('g') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
|
||||
// 4.1
|
||||
BUGINESE = ( u32('B') & 0xFF ) << 24 | ( u32('u') & 0xFF ) << 16 | ( u32('g') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
COPTIC = ( u32('C') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('p') & 0xFF ) << 8 | ( u32('t') & 0xFF ),
|
||||
GLAGOLITIC = ( u32('G') & 0xFF ) << 24 | ( u32('l') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('g') & 0xFF ),
|
||||
KHAROSHTHI = ( u32('K') & 0xFF ) << 24 | ( u32('h') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
NEW_TAI_LUE = ( u32('T') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('l') & 0xFF ) << 8 | ( u32('u') & 0xFF ),
|
||||
OLD_PERSIAN = ( u32('X') & 0xFF ) << 24 | ( u32('p') & 0xFF ) << 16 | ( u32('e') & 0xFF ) << 8 | ( u32('o') & 0xFF ),
|
||||
SYLOTI_NAGRI = ( u32('S') & 0xFF ) << 24 | ( u32('y') & 0xFF ) << 16 | ( u32('l') & 0xFF ) << 8 | ( u32('o') & 0xFF ),
|
||||
TIFINAGH = ( u32('T') & 0xFF ) << 24 | ( u32('f') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('g') & 0xFF ),
|
||||
|
||||
// 5.0
|
||||
BALINESE = ( u32('B') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('l') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
CUNEIFORM = ( u32('X') & 0xFF ) << 24 | ( u32('s') & 0xFF ) << 16 | ( u32('u') & 0xFF ) << 8 | ( u32('x') & 0xFF ),
|
||||
NKO = ( u32('N') & 0xFF ) << 24 | ( u32('k') & 0xFF ) << 16 | ( u32('o') & 0xFF ) << 8 | ( u32('o') & 0xFF ),
|
||||
PHAGS_PA = ( u32('P') & 0xFF ) << 24 | ( u32('h') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('g') & 0xFF ),
|
||||
PHOENICIAN = ( u32('P') & 0xFF ) << 24 | ( u32('h') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('x') & 0xFF ),
|
||||
|
||||
// 5.1
|
||||
CARIAN = ( u32('C') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
CHAM = ( u32('C') & 0xFF ) << 24 | ( u32('j') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('m') & 0xFF ),
|
||||
KAYAH_LI = ( u32('K') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('l') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
LEPCHA = ( u32('L') & 0xFF ) << 24 | ( u32('e') & 0xFF ) << 16 | ( u32('p') & 0xFF ) << 8 | ( u32('c') & 0xFF ),
|
||||
LYCIAN = ( u32('L') & 0xFF ) << 24 | ( u32('y') & 0xFF ) << 16 | ( u32('c') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
LYDIAN = ( u32('L') & 0xFF ) << 24 | ( u32('y') & 0xFF ) << 16 | ( u32('d') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
OL_CHIKI = ( u32('O') & 0xFF ) << 24 | ( u32('l') & 0xFF ) << 16 | ( u32('c') & 0xFF ) << 8 | ( u32('k') & 0xFF ),
|
||||
REJANG = ( u32('R') & 0xFF ) << 24 | ( u32('n') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('g') & 0xFF ),
|
||||
SAURASHTRA = ( u32('S') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('u') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
SUNDANESE = ( u32('S') & 0xFF ) << 24 | ( u32('u') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('d') & 0xFF ),
|
||||
VAI = ( u32('V') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('i') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
|
||||
// 5.2
|
||||
AVESTAN = ( u32('A') & 0xFF ) << 24 | ( u32('v') & 0xFF ) << 16 | ( u32('s') & 0xFF ) << 8 | ( u32('t') & 0xFF ),
|
||||
BAMUM = ( u32('B') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('m') & 0xFF ) << 8 | ( u32('u') & 0xFF ),
|
||||
EGYPTIAN_HIEROGLYPHS = ( u32('E') & 0xFF ) << 24 | ( u32('g') & 0xFF ) << 16 | ( u32('y') & 0xFF ) << 8 | ( u32('p') & 0xFF ),
|
||||
IMPERIAL_ARAMAIC = ( u32('A') & 0xFF ) << 24 | ( u32('r') & 0xFF ) << 16 | ( u32('m') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
INSCRIPTIONAL_PAHLAVI = ( u32('P') & 0xFF ) << 24 | ( u32('h') & 0xFF ) << 16 | ( u32('l') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
INSCRIPTIONAL_PARTHAIAN = ( u32('P') & 0xFF ) << 24 | ( u32('r') & 0xFF ) << 16 | ( u32('t') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
JAVANESE = ( u32('J') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('v') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
KAITHI = ( u32('K') & 0xFF ) << 24 | ( u32('t') & 0xFF ) << 16 | ( u32('h') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
LISU = ( u32('L') & 0xFF ) << 24 | ( u32('i') & 0xFF ) << 16 | ( u32('s') & 0xFF ) << 8 | ( u32('u') & 0xFF ),
|
||||
MEETEI_MAYEK = ( u32('M') & 0xFF ) << 24 | ( u32('t') & 0xFF ) << 16 | ( u32('e') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
OLD_SOUTH_ARABIAN = ( u32('S') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('b') & 0xFF ),
|
||||
OLD_TURKIC = ( u32('O') & 0xFF ) << 24 | ( u32('r') & 0xFF ) << 16 | ( u32('k') & 0xFF ) << 8 | ( u32('h') & 0xFF ),
|
||||
SAMARITAN = ( u32('S') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('m') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
TAI_THAM = ( u32('L') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
TAI_VIET = ( u32('T') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('v') & 0xFF ) << 8 | ( u32('t') & 0xFF ),
|
||||
|
||||
// 6.0
|
||||
BATAK = ( u32('B') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('t') & 0xFF ) << 8 | ( u32('k') & 0xFF ),
|
||||
BRAHMI = ( u32('B') & 0xFF ) << 24 | ( u32('r') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('h') & 0xFF ),
|
||||
MANDAIC = ( u32('M') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('d') & 0xFF ),
|
||||
|
||||
// 6.1
|
||||
CHAKMA = ( u32('C') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('k') & 0xFF ) << 8 | ( u32('m') & 0xFF ),
|
||||
MEROITIC_CURSIVE = ( u32('M') & 0xFF ) << 24 | ( u32('e') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('c') & 0xFF ),
|
||||
MEROITIC_HIEROGLYPHS = ( u32('M') & 0xFF ) << 24 | ( u32('e') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('o') & 0xFF ),
|
||||
MIAO = ( u32('P') & 0xFF ) << 24 | ( u32('l') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('d') & 0xFF ),
|
||||
SHARADA = ( u32('S') & 0xFF ) << 24 | ( u32('h') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('d') & 0xFF ),
|
||||
SORA_SOMPENG = ( u32('S') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
TAKRI = ( u32('T') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('k') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
|
||||
// 0.9.30
|
||||
// 7.0
|
||||
BASSA_VAH = ( u32('B') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('s') & 0xFF ) << 8 | ( u32('s') & 0xFF ),
|
||||
CAUCASIAN_ALBANIAN = ( u32('A') & 0xFF ) << 24 | ( u32('g') & 0xFF ) << 16 | ( u32('h') & 0xFF ) << 8 | ( u32('b') & 0xFF ),
|
||||
DUPLOYAN = ( u32('D') & 0xFF ) << 24 | ( u32('u') & 0xFF ) << 16 | ( u32('p') & 0xFF ) << 8 | ( u32('l') & 0xFF ),
|
||||
ELBASAN = ( u32('E') & 0xFF ) << 24 | ( u32('l') & 0xFF ) << 16 | ( u32('b') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
GRANTHA = ( u32('G') & 0xFF ) << 24 | ( u32('r') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('n') & 0xFF ),
|
||||
KHOJKI = ( u32('K') & 0xFF ) << 24 | ( u32('h') & 0xFF ) << 16 | ( u32('o') & 0xFF ) << 8 | ( u32('j') & 0xFF ),
|
||||
KHUDAWADI = ( u32('S') & 0xFF ) << 24 | ( u32('i') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('d') & 0xFF ),
|
||||
LINEAR_A = ( u32('L') & 0xFF ) << 24 | ( u32('i') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
MAHAJANI = ( u32('M') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('h') & 0xFF ) << 8 | ( u32('j') & 0xFF ),
|
||||
MANICHAEAN = ( u32('M') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
MENDE_KIKAKUI = ( u32('M') & 0xFF ) << 24 | ( u32('e') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('d') & 0xFF ),
|
||||
MODI = ( u32('M') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('d') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
MRO = ( u32('M') & 0xFF ) << 24 | ( u32('r') & 0xFF ) << 16 | ( u32('o') & 0xFF ) << 8 | ( u32('o') & 0xFF ),
|
||||
NABATAEAN = ( u32('N') & 0xFF ) << 24 | ( u32('b') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('t') & 0xFF ),
|
||||
OLD_NORTH_ARABIAN = ( u32('N') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('b') & 0xFF ),
|
||||
OLD_PERMIC = ( u32('P') & 0xFF ) << 24 | ( u32('e') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('m') & 0xFF ),
|
||||
PAHAWH_HMONG = ( u32('H') & 0xFF ) << 24 | ( u32('m') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('g') & 0xFF ),
|
||||
PALMYRENE = ( u32('P') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('l') & 0xFF ) << 8 | ( u32('m') & 0xFF ),
|
||||
PAU_CIN_HAU = ( u32('P') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('u') & 0xFF ) << 8 | ( u32('c') & 0xFF ),
|
||||
PSALTER_PAHLAVI = ( u32('P') & 0xFF ) << 24 | ( u32('h') & 0xFF ) << 16 | ( u32('l') & 0xFF ) << 8 | ( u32('p') & 0xFF ),
|
||||
SIDDHAM = ( u32('S') & 0xFF ) << 24 | ( u32('i') & 0xFF ) << 16 | ( u32('d') & 0xFF ) << 8 | ( u32('d') & 0xFF ),
|
||||
TIRHUNTA = ( u32('T') & 0xFF ) << 24 | ( u32('i') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('h') & 0xFF ),
|
||||
WARANG_CITI = ( u32('W') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
|
||||
// 8.0
|
||||
AHOM = ( u32('A') & 0xFF ) << 24 | ( u32('h') & 0xFF ) << 16 | ( u32('o') & 0xFF ) << 8 | ( u32('m') & 0xFF ),
|
||||
ANATOLIAN_HIEROGLYPHS = ( u32('H') & 0xFF ) << 24 | ( u32('l') & 0xFF ) << 16 | ( u32('u') & 0xFF ) << 8 | ( u32('w') & 0xFF ),
|
||||
HATRAN = ( u32('H') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('t') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
MULTANI = ( u32('M') & 0xFF ) << 24 | ( u32('u') & 0xFF ) << 16 | ( u32('l') & 0xFF ) << 8 | ( u32('t') & 0xFF ),
|
||||
OLD_HUNGARIAN = ( u32('H') & 0xFF ) << 24 | ( u32('u') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('g') & 0xFF ),
|
||||
SIGNWRITING = ( u32('S') & 0xFF ) << 24 | ( u32('g') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('w') & 0xFF ),
|
||||
|
||||
// 1.3.0
|
||||
// 9.0
|
||||
ADLAM = ( u32('A') & 0xFF ) << 24 | ( u32('d') & 0xFF ) << 16 | ( u32('l') & 0xFF ) << 8 | ( u32('m') & 0xFF ),
|
||||
BHAIKSUKI = ( u32('B') & 0xFF ) << 24 | ( u32('h') & 0xFF ) << 16 | ( u32('k') & 0xFF ) << 8 | ( u32('s') & 0xFF ),
|
||||
MARCHEN = ( u32('M') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('c') & 0xFF ),
|
||||
OSAGE = ( u32('O') & 0xFF ) << 24 | ( u32('s') & 0xFF ) << 16 | ( u32('g') & 0xFF ) << 8 | ( u32('e') & 0xFF ),
|
||||
TANGUT = ( u32('T') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('g') & 0xFF ),
|
||||
NEWA = ( u32('N') & 0xFF ) << 24 | ( u32('e') & 0xFF ) << 16 | ( u32('w') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
|
||||
// 1.6.0
|
||||
// 10.0
|
||||
MASARAM_GONDI = ( u32('D') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('g') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
NUSHU = ( u32('D') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('g') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
SOYOMBO = ( u32('D') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('g') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
ZANABAZAR_SQUARE = ( u32('D') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('g') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
|
||||
// 1.8.0
|
||||
// 11.0
|
||||
DOGRA = ( u32('D') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('g') & 0xFF ) << 8 | ( u32('r') & 0xFF ),
|
||||
GUNJALA_GONDI = ( u32('G') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('g') & 0xFF ),
|
||||
HANIFI_ROHINGYA = ( u32('R') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('h') & 0xFF ) << 8 | ( u32('g') & 0xFF ),
|
||||
MAKASAR = ( u32('M') & 0xFF ) << 24 | ( u32('k') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('a') & 0xFF ),
|
||||
MEDEFAIDRIN = ( u32('M') & 0xFF ) << 24 | ( u32('e') & 0xFF ) << 16 | ( u32('d') & 0xFF ) << 8 | ( u32('f') & 0xFF ),
|
||||
OLD_SOGDIAN = ( u32('S') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('g') & 0xFF ) << 8 | ( u32('o') & 0xFF ),
|
||||
SOGDIAN = ( u32('S') & 0xFF ) << 24 | ( u32('o') & 0xFF ) << 16 | ( u32('g') & 0xFF ) << 8 | ( u32('d') & 0xFF ),
|
||||
|
||||
// 2.4.0
|
||||
// 12.0
|
||||
ELYMAIC = ( u32('E') & 0xFF ) << 24 | ( u32('l') & 0xFF ) << 16 | ( u32('y') & 0xFF ) << 8 | ( u32('m') & 0xFF ),
|
||||
NANDINAGARI = ( u32('N') & 0xFF ) << 24 | ( u32('a') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('d') & 0xFF ),
|
||||
NYIAKENG_PUACHUE_HMONG = ( u32('H') & 0xFF ) << 24 | ( u32('m') & 0xFF ) << 16 | ( u32('n') & 0xFF ) << 8 | ( u32('p') & 0xFF ),
|
||||
WANCHO = ( u32('W') & 0xFF ) << 24 | ( u32('c') & 0xFF ) << 16 | ( u32('h') & 0xFF ) << 8 | ( u32('o') & 0xFF ),
|
||||
|
||||
// 2.6.7
|
||||
// 13.0
|
||||
CHRASMIAN = ( u32('C') & 0xFF ) << 24 | ( u32('h') & 0xFF ) << 16 | ( u32('r') & 0xFF ) << 8 | ( u32('s') & 0xFF ),
|
||||
DIVES_AKURU = ( u32('D') & 0xFF ) << 24 | ( u32('i') & 0xFF ) << 16 | ( u32('a') & 0xFF ) << 8 | ( u32('k') & 0xFF ),
|
||||
KHITAN_SMALL_SCRIPT = ( u32('K') & 0xFF ) << 24 | ( u32('i') & 0xFF ) << 16 | ( u32('t') & 0xFF ) << 8 | ( u32('s') & 0xFF ),
|
||||
YEZIDI = ( u32('Y') & 0xFF ) << 24 | ( u32('e') & 0xFF ) << 16 | ( u32('z') & 0xFF ) << 8 | ( u32('i') & 0xFF ),
|
||||
|
||||
INVALID= 0,
|
||||
}
|
||||
|
||||
Memory_Mode :: enum c.int {
|
||||
DUPLICATE,
|
||||
READONLY,
|
||||
WRITABLE,
|
||||
READONLY_MAY_MAKE_WRITABLE,
|
||||
}
|
||||
|
||||
Destroy_Func :: proc "c" ( user_data : rawptr )
|
||||
|
||||
@(default_calling_convention="c", link_prefix="hb_")
|
||||
foreign harfbuzz
|
||||
{
|
||||
blob_create :: proc( data : [^]u8, length : c.uint, memory_mode : Memory_Mode, user_data : rawptr, destroy : Destroy_Func ) -> Blob ---
|
||||
blob_destroy :: proc( blob : Blob ) ---
|
||||
|
||||
buffer_create :: proc() -> Buffer ---
|
||||
buffer_destroy :: proc( buffer : Buffer ) ---
|
||||
buffer_add :: proc( buffer : Buffer, codepoint : Codepoint, cluster : c.uint ) ---
|
||||
buffer_clear_contents :: proc( buffer : Buffer ) ---
|
||||
buffer_get_glyph_infos :: proc( buffer : Buffer, length : ^c.uint ) -> [^]Glyph_Info ---
|
||||
buffer_get_glyph_positions :: proc( buffer : Buffer, length : ^c.uint ) -> [^]Glyph_Position ---
|
||||
buffer_set_direction :: proc( buffer : Buffer, direction : Direction ) ---
|
||||
buffer_set_language :: proc( buffer : Buffer, language : Language ) ---
|
||||
buffer_set_script :: proc( buffer : Buffer, script : Script ) ---
|
||||
buffer_set_content_type :: proc( buffer : Buffer, content_type : Buffer_Content_Type ) ---
|
||||
|
||||
face_create :: proc( blob : Blob, index : c.uint ) -> Face ---
|
||||
face_destroy :: proc( face : Face ) ---
|
||||
|
||||
font_create :: proc( face : Face ) -> Font ---
|
||||
font_destroy :: proc( font : Font ) ---
|
||||
|
||||
language_get_default :: proc() -> Language ---
|
||||
|
||||
script_get_horizontal_direction :: proc( script : Script ) -> Direction ---
|
||||
|
||||
shape :: proc( font : Font, buffer : Buffer, features : [^]Feature, num_features : c.uint ) ---
|
||||
|
||||
unicode_funcs_get_default :: proc() -> Unicode_Funcs ---
|
||||
unicode_script :: proc( ufuncs : Unicode_Funcs, unicode : Codepoint ) -> Script ---
|
||||
}
|
BIN
thirdparty/harfbuzz/lib/linux64/libharfbuzz.so
vendored
Normal file
BIN
thirdparty/harfbuzz/lib/linux64/libharfbuzz.so
vendored
Normal file
Binary file not shown.
BIN
thirdparty/harfbuzz/lib/win64/harfbuzz.dll
vendored
Normal file
BIN
thirdparty/harfbuzz/lib/win64/harfbuzz.dll
vendored
Normal file
Binary file not shown.
BIN
thirdparty/harfbuzz/lib/win64/harfbuzz.lib
vendored
Normal file
BIN
thirdparty/harfbuzz/lib/win64/harfbuzz.lib
vendored
Normal file
Binary file not shown.
305
thirdparty/harfbuzz/scripts/build.ps1
vendored
Normal file
305
thirdparty/harfbuzz/scripts/build.ps1
vendored
Normal file
@@ -0,0 +1,305 @@
|
||||
$misc = join-path $PSScriptRoot 'helpers/misc.ps1'
|
||||
. $misc
|
||||
|
||||
$path_root = git rev-parse --show-toplevel
|
||||
$path_lib = join-path $path_root 'lib'
|
||||
$path_win64 = join-path $path_lib 'win64'
|
||||
|
||||
$url_harfbuzz = 'https://github.com/harfbuzz/harfbuzz.git'
|
||||
$path_harfbuzz = join-path $path_root 'harfbuzz'
|
||||
|
||||
function build-repo {
|
||||
verify-path $script:path_lib
|
||||
verify-path $path_win64
|
||||
|
||||
clone-gitrepo $path_harfbuzz $url_harfbuzz
|
||||
|
||||
push-location $path_harfbuzz
|
||||
|
||||
$library_type = "shared"
|
||||
$build_type = "release"
|
||||
|
||||
# Meson configure and build
|
||||
$mesonArgs = @(
|
||||
"build",
|
||||
"--default-library=$library_type",
|
||||
"--buildtype=$build_type",
|
||||
"--wrap-mode=forcefallback",
|
||||
"-Dglib=disabled",
|
||||
"-Dgobject=disabled",
|
||||
"-Dcairo=disabled",
|
||||
"-Dicu=disabled",
|
||||
"-Dgraphite=disabled",
|
||||
"-Dfreetype=disabled",
|
||||
"-Ddirectwrite=disabled",
|
||||
"-Dcoretext=disabled"
|
||||
)
|
||||
& meson $mesonArgs
|
||||
& meson compile -C build
|
||||
|
||||
pop-location
|
||||
|
||||
$path_build = join-path $path_harfbuzz 'build'
|
||||
$path_src = join-path $path_build 'src'
|
||||
$path_dll = join-path $path_src 'harfbuzz.dll'
|
||||
$path_lib = join-path $path_src 'harfbuzz.lib'
|
||||
$path_lib_static = join-path $path_src 'libharfbuzz.a'
|
||||
$path_pdb = join-path $path_src 'harfbuzz.pdb'
|
||||
|
||||
# Copy files based on build type and library type
|
||||
if ($build_type -eq "debug") {
|
||||
copy-item -Path $path_pdb -Destination $path_win64 -Force
|
||||
}
|
||||
|
||||
if ($library_type -eq "static") {
|
||||
copy-item -Path $path_lib_static -Destination (join-path $path_win64 'harfbuzz.lib') -Force
|
||||
}
|
||||
else {
|
||||
copy-item -Path $path_lib -Destination $path_win64 -Force
|
||||
copy-item -Path $path_dll -Destination $path_win64 -Force
|
||||
}
|
||||
|
||||
write-host "Build completed and files copied to $path_win64"
|
||||
}
|
||||
# build-repo
|
||||
|
||||
function Build-RepoWithoutMeson {
|
||||
$devshell = join-path $PSScriptRoot 'helpers/devshell.ps1'
|
||||
& $devshell -arch amd64
|
||||
|
||||
verify-path $script:path_lib
|
||||
verify-path $path_win64
|
||||
|
||||
clone-gitrepo $path_harfbuzz $url_harfbuzz
|
||||
|
||||
$path_harfbuzz_build = join-path $path_harfbuzz 'build'
|
||||
verify-path $path_harfbuzz_build
|
||||
|
||||
$library_type = "shared"
|
||||
$build_type = "release"
|
||||
|
||||
push-location $path_harfbuzz
|
||||
|
||||
$compiler_args = @(
|
||||
"/nologo",
|
||||
"/W3",
|
||||
"/D_CRT_SECURE_NO_WARNINGS",
|
||||
"/DHAVE_FALLBACK=1",
|
||||
"/DHAVE_OT=1",
|
||||
"/DHAVE_SUBSET=1",
|
||||
"/DHB_USE_INTERNAL_PARSER",
|
||||
"/DHB_NO_COLOR",
|
||||
"/DHB_NO_DRAW",
|
||||
"/DHB_NO_PARSE",
|
||||
"/DHB_NO_MT",
|
||||
"/DHB_NO_GRAPHITE2",
|
||||
"/DHB_NO_ICU",
|
||||
"/DHB_NO_DIRECTWRITE",
|
||||
"/I$path_harfbuzz\src",
|
||||
"/I$path_harfbuzz"
|
||||
)
|
||||
|
||||
if ( $library_type -eq "shared" ) {
|
||||
$compiler_args += "/DHAVE_DECLSPEC"
|
||||
$compiler_args += "/DHARFBUZZ_EXPORTS"
|
||||
}
|
||||
|
||||
if ($build_type -eq "debug") {
|
||||
$compiler_args += "/MDd", "/Od", "/Zi"
|
||||
} else {
|
||||
$compiler_args += "/MD", "/O2"
|
||||
}
|
||||
|
||||
$compiler_args = $compiler_args -join " "
|
||||
|
||||
$config_h_content = @"
|
||||
#define HB_VERSION_MAJOR 9
|
||||
#define HB_VERSION_MINOR 0
|
||||
#define HB_VERSION_MICRO 0
|
||||
#define HB_VERSION_STRING "9.0.0"
|
||||
#define HAVE_ROUND 1
|
||||
#define HB_NO_BITMAP 1
|
||||
#define HB_NO_CFF 1
|
||||
#define HB_NO_OT_FONT_CFF 1
|
||||
#define HB_NO_SUBSET_CFF 1
|
||||
#define HB_HAVE_SUBSET 0
|
||||
#define HB_HAVE_OT 0
|
||||
#define HB_USER_DATA_KEY_DEFINE1(_name) extern HB_EXTERN hb_user_data_key_t _name
|
||||
"@
|
||||
set-content -Path (join-path $path_harfbuzz "config.h") -Value $config_h_content
|
||||
|
||||
$unity_content = @"
|
||||
#define HB_EXTERN __declspec(dllexport)
|
||||
|
||||
// base
|
||||
#include "config.h"
|
||||
#include "hb-aat-layout.cc"
|
||||
#include "hb-aat-map.cc"
|
||||
#include "hb-blob.cc"
|
||||
#include "hb-buffer-serialize.cc"
|
||||
#include "hb-buffer-verify.cc"
|
||||
#include "hb-buffer.cc"
|
||||
#include "hb-common.cc"
|
||||
|
||||
//#include "hb-draw.cc"
|
||||
//#include "hb-paint.cc"
|
||||
//#include "hb-paint-extents.cc"
|
||||
|
||||
#include "hb-face.cc"
|
||||
#include "hb-face-builder.cc"
|
||||
#include "hb-fallback-shape.cc"
|
||||
#include "hb-font.cc"
|
||||
#include "hb-map.cc"
|
||||
#include "hb-number.cc"
|
||||
#include "hb-ot-cff1-table.cc"
|
||||
#include "hb-ot-cff2-table.cc"
|
||||
#include "hb-ot-color.cc"
|
||||
#include "hb-ot-face.cc"
|
||||
#include "hb-ot-font.cc"
|
||||
|
||||
#include "hb-outline.cc"
|
||||
#include "OT/Var/VARC/VARC.cc"
|
||||
|
||||
#include "hb-ot-layout.cc"
|
||||
#include "hb-ot-map.cc"
|
||||
#include "hb-ot-math.cc"
|
||||
#include "hb-ot-meta.cc"
|
||||
#include "hb-ot-metrics.cc"
|
||||
#include "hb-ot-name.cc"
|
||||
|
||||
#include "hb-ot-shaper-arabic.cc"
|
||||
#include "hb-ot-shaper-default.cc"
|
||||
#include "hb-ot-shaper-hangul.cc"
|
||||
#include "hb-ot-shaper-hebrew.cc"
|
||||
#include "hb-ot-shaper-indic-table.cc"
|
||||
#include "hb-ot-shaper-indic.cc"
|
||||
#include "hb-ot-shaper-khmer.cc"
|
||||
#include "hb-ot-shaper-myanmar.cc"
|
||||
#include "hb-ot-shaper-syllabic.cc"
|
||||
#include "hb-ot-shaper-thai.cc"
|
||||
#include "hb-ot-shaper-use.cc"
|
||||
#include "hb-ot-shaper-vowel-constraints.cc"
|
||||
|
||||
#include "hb-ot-shape-fallback.cc"
|
||||
#include "hb-ot-shape-normalize.cc"
|
||||
#include "hb-ot-shape.cc"
|
||||
#include "hb-ot-tag.cc"
|
||||
#include "hb-ot-var.cc"
|
||||
|
||||
#include "hb-set.cc"
|
||||
#include "hb-shape-plan.cc"
|
||||
#include "hb-shape.cc"
|
||||
#include "hb-shaper.cc"
|
||||
#include "hb-static.cc"
|
||||
#include "hb-style.cc"
|
||||
#include "hb-ucd.cc"
|
||||
#include "hb-unicode.cc"
|
||||
|
||||
// libharfbuzz-subset
|
||||
//#include "hb-subset-input.cc"
|
||||
//#include "hb-subset-cff-common.cc"
|
||||
//#include "hb-subset-cff1.cc"
|
||||
//#include "hb-subset-cff2.cc"
|
||||
//#include "hb-subset-instancer-iup.cc"
|
||||
//#include "hb-subset-instancer-solver.cc"
|
||||
//#include "hb-subset-plan.cc"
|
||||
//#include "hb-subset-repacker.cc"
|
||||
|
||||
//#include "graph/gsubgpos-context.cc"
|
||||
|
||||
//#include "hb-subset.cc"
|
||||
"@
|
||||
$unity_file = join-path $path_harfbuzz_build "harfbuzz_unity.cc"
|
||||
set-content -Path $unity_file -Value $unity_content
|
||||
|
||||
# Compile unity file
|
||||
$obj_file = "harfbuzz_unity.obj"
|
||||
$command = "cl.exe $compiler_args /c $unity_file /Fo$path_harfbuzz_build\$obj_file"
|
||||
|
||||
write-host "Compiling: $command"
|
||||
invoke-expression $command
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
write-error "Compilation failed for unity build"
|
||||
pop-location
|
||||
return
|
||||
}
|
||||
|
||||
push-location $path_harfbuzz_build
|
||||
|
||||
# Create library
|
||||
if ($library_type -eq "static")
|
||||
{
|
||||
$lib_command = "lib.exe /OUT:harfbuzz.lib $obj_file"
|
||||
|
||||
write-host "Creating static library: $lib_command"
|
||||
invoke-expression $lib_command
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Static library creation failed"
|
||||
pop-location
|
||||
pop-location
|
||||
return
|
||||
}
|
||||
$output_file = "harfbuzz.lib"
|
||||
}
|
||||
else
|
||||
{
|
||||
$linker_args = "/DLL", "/OUT:harfbuzz.dll"
|
||||
|
||||
if ($build_type -eq "debug") {
|
||||
$linker_args += "/DEBUG"
|
||||
}
|
||||
|
||||
$link_command = "link.exe $($linker_args -join ' ') $obj_file"
|
||||
|
||||
write-host "Creating shared library: $link_command"
|
||||
invoke-expression $link_command
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
write-error "Shared library creation failed"
|
||||
pop-location
|
||||
pop-location
|
||||
return
|
||||
}
|
||||
$output_file = "harfbuzz.dll"
|
||||
}
|
||||
|
||||
pop-location # path_harfbuzz_build
|
||||
pop-location # path_harfbuzz
|
||||
|
||||
# Copy files
|
||||
$path_output = join-path $path_harfbuzz_build $output_file
|
||||
|
||||
if (test-path $path_output) {
|
||||
copy-item -Path $path_output -Destination $path_win64 -Force
|
||||
if ($library_type -eq "shared") {
|
||||
$path_lib = join-path $path_harfbuzz_build "harfbuzz.lib"
|
||||
if (test-path $path_lib) {
|
||||
copy-item -Path $path_lib -Destination $path_win64 -Force
|
||||
}
|
||||
}
|
||||
} else {
|
||||
write-warning "Output file not found: $path_output"
|
||||
}
|
||||
|
||||
write-host "Build completed and files copied to $path_win64"
|
||||
}
|
||||
Build-RepoWithoutMeson
|
||||
|
||||
function grab-binaries {
|
||||
verify-path $script:path_lib
|
||||
verify-path $path_win64
|
||||
|
||||
$url_harfbuzz_8_5_0_win64 = 'https://github.com/harfbuzz/harfbuzz/releases/latest/download/harfbuzz-win64-8.5.0.zip'
|
||||
$path_harfbuzz_win64_zip = join-path $path_win64 'harfbuzz-win64-8.5.0.zip'
|
||||
$path_harfbuzz_win64 = join-path $path_win64 'harfbuzz-win64'
|
||||
|
||||
grab-zip $url_harfbuzz_8_5_0_win64 $path_harfbuzz_win64_zip $path_win64
|
||||
get-childitem -path $path_harfbuzz_win64 | move-item -destination $path_win64 -force
|
||||
|
||||
# Clean up the ZIP file and the now empty harfbuzz-win64 directory
|
||||
remove-item $path_harfbuzz_win64_zip -force
|
||||
remove-item $path_harfbuzz_win64 -recurse -force
|
||||
}
|
||||
# grab-binaries
|
284
thirdparty/harfbuzz/scripts/build.sh
vendored
Normal file
284
thirdparty/harfbuzz/scripts/build.sh
vendored
Normal file
@@ -0,0 +1,284 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Source the misc.sh script
|
||||
misc_script="$(dirname "$0")/helpers/misc.sh"
|
||||
chmod +x "$misc_script"
|
||||
source "$misc_script"
|
||||
|
||||
path_root=$(git rev-parse --show-toplevel)
|
||||
path_lib="$path_root/lib"
|
||||
path_osx="$path_lib/osx"
|
||||
path_linux64="$path_lib/linux64"
|
||||
|
||||
OS=$(uname -s)
|
||||
|
||||
# Set the appropriate output directory and file extension
|
||||
case "$OS" in
|
||||
Darwin*)
|
||||
path_output="$path_osx"
|
||||
shared_lib_extension="dylib"
|
||||
;;
|
||||
Linux*)
|
||||
path_output="$path_linux64"
|
||||
shared_lib_extension="so"
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported operating system: $OS"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
url_harfbuzz='https://github.com/harfbuzz/harfbuzz.git'
|
||||
path_harfbuzz="$path_root/harfbuzz"
|
||||
|
||||
build_repo() {
|
||||
verify_path "$path_lib"
|
||||
verify_path "$path_output"
|
||||
|
||||
# grab the actual repo
|
||||
clone_gitrepo "$path_harfbuzz" "$url_harfbuzz"
|
||||
|
||||
pushd "$path_harfbuzz" > /dev/null
|
||||
|
||||
library_type="shared"
|
||||
build_type="release"
|
||||
|
||||
# Check if meson is installed
|
||||
if ! command -v meson &> /dev/null; then
|
||||
echo "Meson is not installed. Please install it and try again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Meson configure and build
|
||||
meson_args=(
|
||||
"build"
|
||||
"--default-library=$library_type"
|
||||
"--buildtype=$build_type"
|
||||
"--wrap-mode=forcefallback"
|
||||
"-Dglib=disabled"
|
||||
"-Dgobject=disabled"
|
||||
"-Dcairo=disabled"
|
||||
"-Dicu=disabled"
|
||||
"-Dgraphite=disabled"
|
||||
"-Dfreetype=disabled"
|
||||
"-Ddirectwrite=disabled"
|
||||
"-Dcoretext=disabled"
|
||||
)
|
||||
meson "${meson_args[@]}"
|
||||
ninja -C build
|
||||
|
||||
popd > /dev/null
|
||||
|
||||
path_build="$path_harfbuzz/build"
|
||||
path_src="$path_build/src"
|
||||
path_so="$path_src/libharfbuzz.so"
|
||||
path_a="$path_src/libharfbuzz.a"
|
||||
|
||||
# Copy files based on build type and library type
|
||||
if [ "$build_type" = "debug" ]; then
|
||||
# Debug symbols are typically embedded in the .so file on Linux
|
||||
# If there's a separate debug file, you would copy it here
|
||||
:
|
||||
fi
|
||||
|
||||
if [ "$library_type" = "static" ]; then
|
||||
cp "$path_a" "$path_linux64/libharfbuzz.a"
|
||||
else
|
||||
cp "$path_so" "$path_linux64/libharfbuzz.so"
|
||||
fi
|
||||
|
||||
echo "Build completed and files copied to $path_linux64"
|
||||
}
|
||||
|
||||
build_repo_without_meson() {
|
||||
# Detect the operating system
|
||||
OS=$(uname -s)
|
||||
|
||||
echo $url_harfbuzz
|
||||
echo $path_harfbuzz
|
||||
echo $path_lib
|
||||
echo $path_linux64
|
||||
verify_path "$path_lib"
|
||||
verify_path "$path_linux64"
|
||||
|
||||
path_harfbuzz_build="$path_harfbuzz/build"
|
||||
echo $path_harfbuzz_build
|
||||
|
||||
# grab the actual repo
|
||||
clone_gitrepo "$path_harfbuzz" "$url_harfbuzz"
|
||||
|
||||
verify_path "$path_harfbuzz_build"
|
||||
|
||||
library_type="shared"
|
||||
build_type="release"
|
||||
|
||||
pushd "$path_harfbuzz" > /dev/null
|
||||
|
||||
# Determine the latest C++ standard supported by the compiler
|
||||
latest_cpp_standard=$(clang++ -dM -E - < /dev/null | grep __cplusplus | awk '{print $3}')
|
||||
case $latest_cpp_standard in
|
||||
201703L) cpp_flag="-std=c++17" ;;
|
||||
202002L) cpp_flag="-std=c++20" ;;
|
||||
202302L) cpp_flag="-std=c++23" ;;
|
||||
*) cpp_flag="-std=c++14" ;; # Default to C++14 if unable to determine
|
||||
esac
|
||||
echo "Using C++ standard: $cpp_flag"
|
||||
|
||||
compiler_args=(
|
||||
"$cpp_flag"
|
||||
"-Wall"
|
||||
"-Wextra"
|
||||
"-D_REENTRANT"
|
||||
"-DHAVE_FALLBACK=1"
|
||||
"-DHAVE_OT=1"
|
||||
"-DHAVE_SUBSET=1"
|
||||
"-DHB_USE_INTERNAL_PARSER"
|
||||
"-DHB_NO_COLOR"
|
||||
"-DHB_NO_DRAW"
|
||||
"-DHB_NO_PARSE"
|
||||
"-DHB_NO_MT"
|
||||
"-DHB_NO_GRAPHITE2"
|
||||
"-DHB_NO_ICU"
|
||||
"-DHB_NO_DIRECTWRITE"
|
||||
"-I$path_harfbuzz/src"
|
||||
"-I$path_harfbuzz"
|
||||
)
|
||||
|
||||
if [ "$library_type" = "shared" ]; then
|
||||
compiler_args+=("-fPIC")
|
||||
compiler_args+=("-DHAVE_DECLSPEC")
|
||||
compiler_args+=("-DHARFBUZZ_EXPORTS")
|
||||
fi
|
||||
|
||||
if [ "$build_type" = "debug" ]; then
|
||||
compiler_args+=("-g" "-O0")
|
||||
else
|
||||
compiler_args+=("-O2")
|
||||
fi
|
||||
|
||||
compiler_args_str="${compiler_args[*]}"
|
||||
|
||||
# Create config.h
|
||||
cat > "$path_harfbuzz/config.h" << EOL
|
||||
#define HB_VERSION_MAJOR 9
|
||||
#define HB_VERSION_MINOR 0
|
||||
#define HB_VERSION_MICRO 0
|
||||
#define HB_VERSION_STRING "9.0.0"
|
||||
#define HAVE_ROUND 1
|
||||
#define HB_NO_BITMAP 1
|
||||
#define HB_NO_CFF 1
|
||||
#define HB_NO_OT_FONT_CFF 1
|
||||
#define HB_NO_SUBSET_CFF 1
|
||||
#define HB_HAVE_SUBSET 0
|
||||
#define HB_HAVE_OT 0
|
||||
#define HB_USER_DATA_KEY_DEFINE1(_name) extern HB_EXTERN hb_user_data_key_t _name
|
||||
EOL
|
||||
|
||||
# Create unity build file
|
||||
cat > "$path_harfbuzz_build/harfbuzz_unity.cc" << EOL
|
||||
#define HB_EXTERN __attribute__((visibility("default")))
|
||||
|
||||
// base
|
||||
#include "config.h"
|
||||
#include "hb-aat-layout.cc"
|
||||
#include "hb-aat-map.cc"
|
||||
#include "hb-blob.cc"
|
||||
#include "hb-buffer-serialize.cc"
|
||||
#include "hb-buffer-verify.cc"
|
||||
#include "hb-buffer.cc"
|
||||
#include "hb-common.cc"
|
||||
#include "hb-face.cc"
|
||||
#include "hb-face-builder.cc"
|
||||
#include "hb-fallback-shape.cc"
|
||||
#include "hb-font.cc"
|
||||
#include "hb-map.cc"
|
||||
#include "hb-number.cc"
|
||||
#include "hb-ot-cff1-table.cc"
|
||||
#include "hb-ot-cff2-table.cc"
|
||||
#include "hb-ot-color.cc"
|
||||
#include "hb-ot-face.cc"
|
||||
#include "hb-ot-font.cc"
|
||||
#include "hb-outline.cc"
|
||||
#include "OT/Var/VARC/VARC.cc"
|
||||
#include "hb-ot-layout.cc"
|
||||
#include "hb-ot-map.cc"
|
||||
#include "hb-ot-math.cc"
|
||||
#include "hb-ot-meta.cc"
|
||||
#include "hb-ot-metrics.cc"
|
||||
#include "hb-ot-name.cc"
|
||||
#include "hb-ot-shaper-arabic.cc"
|
||||
#include "hb-ot-shaper-default.cc"
|
||||
#include "hb-ot-shaper-hangul.cc"
|
||||
#include "hb-ot-shaper-hebrew.cc"
|
||||
#include "hb-ot-shaper-indic-table.cc"
|
||||
#include "hb-ot-shaper-indic.cc"
|
||||
#include "hb-ot-shaper-khmer.cc"
|
||||
#include "hb-ot-shaper-myanmar.cc"
|
||||
#include "hb-ot-shaper-syllabic.cc"
|
||||
#include "hb-ot-shaper-thai.cc"
|
||||
#include "hb-ot-shaper-use.cc"
|
||||
#include "hb-ot-shaper-vowel-constraints.cc"
|
||||
#include "hb-ot-shape-fallback.cc"
|
||||
#include "hb-ot-shape-normalize.cc"
|
||||
#include "hb-ot-shape.cc"
|
||||
#include "hb-ot-tag.cc"
|
||||
#include "hb-ot-var.cc"
|
||||
#include "hb-set.cc"
|
||||
#include "hb-shape-plan.cc"
|
||||
#include "hb-shape.cc"
|
||||
#include "hb-shaper.cc"
|
||||
#include "hb-static.cc"
|
||||
#include "hb-style.cc"
|
||||
#include "hb-ucd.cc"
|
||||
#include "hb-unicode.cc"
|
||||
EOL
|
||||
|
||||
# Compile unity file
|
||||
pushd "$path_harfbuzz_build" > /dev/null
|
||||
g++ $compiler_args_str -c harfbuzz_unity.cc -o harfbuzz_unity.o
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Compilation failed for unity build"
|
||||
popd > /dev/null
|
||||
popd > /dev/null
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Create library
|
||||
if [ "$library_type" = "static" ]; then
|
||||
ar rcs libharfbuzz.a harfbuzz_unity.o
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Static library creation failed"
|
||||
popd > /dev/null
|
||||
popd > /dev/null
|
||||
return 1
|
||||
fi
|
||||
output_file="libharfbuzz.a"
|
||||
else
|
||||
g++ -shared -o libharfbuzz.so harfbuzz_unity.o
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Shared library creation failed"
|
||||
popd > /dev/null
|
||||
popd > /dev/null
|
||||
return 1
|
||||
fi
|
||||
output_file="libharfbuzz.so"
|
||||
fi
|
||||
|
||||
popd > /dev/null # path_harfbuzz_build
|
||||
popd > /dev/null # path_harfbuzz
|
||||
|
||||
# Copy files
|
||||
cp "$path_harfbuzz_build/$output_file" "$path_linux64/"
|
||||
if [ "$library_type" = "shared" ]; then
|
||||
if [ -f "$path_harfbuzz_build/libharfbuzz.so" ]; then
|
||||
cp "$path_harfbuzz_build/libharfbuzz.so" "$path_linux64/"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Build completed and files copied to $path_linux64"
|
||||
}
|
||||
|
||||
# Uncomment the function you want to use
|
||||
# build_repo
|
||||
build_repo_without_meson
|
28
thirdparty/harfbuzz/scripts/helpers/devshell.ps1
vendored
Normal file
28
thirdparty/harfbuzz/scripts/helpers/devshell.ps1
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
if ($env:VCINSTALLDIR) {
|
||||
return
|
||||
}
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
# Use vswhere to find the latest Visual Studio installation
|
||||
$vswhere_out = & "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath
|
||||
if ($null -eq $vswhere_out) {
|
||||
Write-Host "ERROR: Visual Studio installation not found"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Find Launch-VsDevShell.ps1 in the Visual Studio installation
|
||||
$vs_path = $vswhere_out
|
||||
$vs_devshell = Join-Path $vs_path "\Common7\Tools\Launch-VsDevShell.ps1"
|
||||
|
||||
if ( -not (Test-Path $vs_devshell) ) {
|
||||
Write-Host "ERROR: Launch-VsDevShell.ps1 not found in Visual Studio installation"
|
||||
Write-Host Tested path: $vs_devshell
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Launch the Visual Studio Developer Shell
|
||||
Push-Location
|
||||
write-host @args
|
||||
& $vs_devshell @args
|
||||
Pop-Location
|
72
thirdparty/harfbuzz/scripts/helpers/misc.ps1
vendored
Normal file
72
thirdparty/harfbuzz/scripts/helpers/misc.ps1
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
function Clone-Gitrepo { param( [string] $path, [string] $url )
|
||||
if (test-path $path) {
|
||||
# git -C $path pull
|
||||
}
|
||||
else {
|
||||
Write-Host "Cloning $url ..."
|
||||
git clone $url $path
|
||||
}
|
||||
}
|
||||
|
||||
function Grab-Zip { param( $url, $path_file, $path_dst )
|
||||
Invoke-WebRequest -Uri $url -OutFile $path_file
|
||||
Expand-Archive -Path $path_file -DestinationPath $path_dst -Force
|
||||
}
|
||||
|
||||
function Update-GitRepo
|
||||
{
|
||||
param( [string] $path, [string] $url, [string] $build_command )
|
||||
|
||||
if ( $build_command -eq $null ) {
|
||||
write-host "Attempted to call Update-GitRepo without build_command specified"
|
||||
return
|
||||
}
|
||||
|
||||
$repo_name = $url.Split('/')[-1].Replace('.git', '')
|
||||
|
||||
$last_built_commit = join-path $path_build "last_built_commit_$repo_name.txt"
|
||||
if ( -not(test-path -Path $path))
|
||||
{
|
||||
write-host "Cloining repo from $url to $path"
|
||||
git clone $url $path
|
||||
|
||||
write-host "Building $url"
|
||||
push-location $path
|
||||
& "$build_command"
|
||||
pop-location
|
||||
|
||||
git -C $path rev-parse HEAD | out-file $last_built_commit
|
||||
$script:binaries_dirty = $true
|
||||
write-host
|
||||
return
|
||||
}
|
||||
|
||||
git -C $path fetch
|
||||
$latest_commit_hash = git -C $path rev-parse '@{u}'
|
||||
$last_built_hash = if (Test-Path $last_built_commit) { Get-Content $last_built_commit } else { "" }
|
||||
|
||||
if ( $latest_commit_hash -eq $last_built_hash ) {
|
||||
write-host
|
||||
return
|
||||
}
|
||||
|
||||
write-host "Build out of date for: $path, updating"
|
||||
write-host 'Pulling...'
|
||||
git -C $path pull
|
||||
|
||||
write-host "Building $url"
|
||||
push-location $path
|
||||
& $build_command
|
||||
pop-location
|
||||
|
||||
$latest_commit_hash | out-file $last_built_commit
|
||||
$script:binaries_dirty = $true
|
||||
write-host
|
||||
}
|
||||
|
||||
function Verify-Path { param( $path )
|
||||
if (test-path $path) {return $true}
|
||||
|
||||
new-item -ItemType Directory -Path $path
|
||||
return $false
|
||||
}
|
111
thirdparty/harfbuzz/scripts/helpers/misc.sh
vendored
Normal file
111
thirdparty/harfbuzz/scripts/helpers/misc.sh
vendored
Normal file
@@ -0,0 +1,111 @@
|
||||
#!/bin/bash
|
||||
|
||||
clone_gitrepo() {
|
||||
local path="$1"
|
||||
local url="$2"
|
||||
|
||||
if [ -d "$path" ]; then
|
||||
# git -C "$path" pull
|
||||
:
|
||||
else
|
||||
echo "Cloning $url ..."
|
||||
git clone "$url" "$path"
|
||||
fi
|
||||
}
|
||||
|
||||
get_ini_content() {
|
||||
local path_file="$1"
|
||||
declare -A ini
|
||||
|
||||
local current_section=""
|
||||
while IFS= read -r line; do
|
||||
if [[ $line =~ ^\[(.+)\]$ ]]; then
|
||||
current_section="${BASH_REMATCH[1]}"
|
||||
ini["$current_section"]=""
|
||||
elif [[ $line =~ ^([^=]+)=(.*)$ ]]; then
|
||||
local key="${BASH_REMATCH[1]}"
|
||||
local value="${BASH_REMATCH[2]}"
|
||||
if [ -n "$current_section" ]; then
|
||||
ini["$current_section,$key"]="$value"
|
||||
fi
|
||||
fi
|
||||
done < "$path_file"
|
||||
|
||||
# To use this function, you would need to pass the result by reference
|
||||
# and then access it in the calling function
|
||||
}
|
||||
|
||||
invoke_with_color_coded_output() {
|
||||
local command="$1"
|
||||
eval "$command" 2>&1 | while IFS= read -r line; do
|
||||
if [[ "$line" =~ [Ee]rror ]]; then
|
||||
echo -e "\033[0;31m\t$line\033[0m" # Red for errors
|
||||
elif [[ "$line" =~ [Ww]arning ]]; then
|
||||
echo -e "\033[0;33m\t$line\033[0m" # Yellow for warnings
|
||||
else
|
||||
echo -e "\033[0;37m\t$line\033[0m" # White for other output
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
update_git_repo() {
|
||||
local path="$1"
|
||||
local url="$2"
|
||||
local build_command="$3"
|
||||
|
||||
if [ -z "$build_command" ]; then
|
||||
echo "Attempted to call update_git_repo without build_command specified"
|
||||
return
|
||||
fi
|
||||
|
||||
local repo_name=$(basename "$url" .git)
|
||||
|
||||
local last_built_commit="$path_build/last_built_commit_$repo_name.txt"
|
||||
if [ ! -d "$path" ]; then
|
||||
echo "Cloning repo from $url to $path"
|
||||
git clone "$url" "$path"
|
||||
|
||||
echo "Building $url"
|
||||
pushd "$path" > /dev/null
|
||||
eval "$build_command"
|
||||
popd > /dev/null
|
||||
|
||||
git -C "$path" rev-parse HEAD > "$last_built_commit"
|
||||
binaries_dirty=true
|
||||
echo
|
||||
return
|
||||
fi
|
||||
|
||||
git -C "$path" fetch
|
||||
local latest_commit_hash=$(git -C "$path" rev-parse '@{u}')
|
||||
local last_built_hash=""
|
||||
[ -f "$last_built_commit" ] && last_built_hash=$(cat "$last_built_commit")
|
||||
|
||||
if [ "$latest_commit_hash" = "$last_built_hash" ]; then
|
||||
echo
|
||||
return
|
||||
fi
|
||||
|
||||
echo "Build out of date for: $path, updating"
|
||||
echo 'Pulling...'
|
||||
git -C "$path" pull
|
||||
|
||||
echo "Building $url"
|
||||
pushd "$path" > /dev/null
|
||||
eval "$build_command"
|
||||
popd > /dev/null
|
||||
|
||||
echo "$latest_commit_hash" > "$last_built_commit"
|
||||
binaries_dirty=true
|
||||
echo
|
||||
}
|
||||
|
||||
verify_path() {
|
||||
local path="$1"
|
||||
if [ -d "$path" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
mkdir -p "$path"
|
||||
return 1
|
||||
}
|
4
thirdparty/sokol-tools/.gitignore
vendored
Normal file
4
thirdparty/sokol-tools/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
.vscode/
|
||||
.zig-cache/
|
||||
zig-out/
|
||||
*.pyc
|
21
thirdparty/sokol-tools/LICENSE
vendored
Normal file
21
thirdparty/sokol-tools/LICENSE
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 Andre Weissflog
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
2
thirdparty/sokol-tools/README.md
vendored
Normal file
2
thirdparty/sokol-tools/README.md
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# sokol-tools-bin
|
||||
Binaries and fips integration for https://github.com/floooh/sokol-tools
|
2
thirdparty/sokol-tools/bin/linux/readme.txt
vendored
Normal file
2
thirdparty/sokol-tools/bin/linux/readme.txt
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
Precompiled binaries for Linux go here (64-bit statically linked).
|
||||
|
BIN
thirdparty/sokol-tools/bin/linux/sokol-shdc
vendored
Normal file
BIN
thirdparty/sokol-tools/bin/linux/sokol-shdc
vendored
Normal file
Binary file not shown.
BIN
thirdparty/sokol-tools/bin/linux_arm64/sokol-shdc
vendored
Normal file
BIN
thirdparty/sokol-tools/bin/linux_arm64/sokol-shdc
vendored
Normal file
Binary file not shown.
2
thirdparty/sokol-tools/bin/osx/readme.txt
vendored
Normal file
2
thirdparty/sokol-tools/bin/osx/readme.txt
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
Precompiled binaries for macOS go here.
|
||||
|
BIN
thirdparty/sokol-tools/bin/osx/sokol-shdc
vendored
Normal file
BIN
thirdparty/sokol-tools/bin/osx/sokol-shdc
vendored
Normal file
Binary file not shown.
BIN
thirdparty/sokol-tools/bin/osx_arm64/sokol-shdc
vendored
Normal file
BIN
thirdparty/sokol-tools/bin/osx_arm64/sokol-shdc
vendored
Normal file
Binary file not shown.
2
thirdparty/sokol-tools/bin/win32/readme.txt
vendored
Normal file
2
thirdparty/sokol-tools/bin/win32/readme.txt
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
Precompiled binaries for Windows (64-bit) go here.
|
||||
|
BIN
thirdparty/sokol-tools/bin/win32/sokol-shdc.exe
vendored
Normal file
BIN
thirdparty/sokol-tools/bin/win32/sokol-shdc.exe
vendored
Normal file
Binary file not shown.
143
thirdparty/sokol-tools/build.zig
vendored
Normal file
143
thirdparty/sokol-tools/build.zig
vendored
Normal file
@@ -0,0 +1,143 @@
|
||||
//! Helper code to invoke sokol-shdc from the Zig build system.
|
||||
//! See https://github.com/floooh/sokol-zig for an example
|
||||
//! of how to use sokol-tools-bin as a lazy dependency and
|
||||
//! compile shaders (search for `shdc.compile` in the sokol-zig build.zig)
|
||||
const std = @import("std");
|
||||
const builtin = @import("builtin");
|
||||
const Allocator = std.mem.Allocator;
|
||||
const Build = std.Build;
|
||||
|
||||
pub const Options = struct {
|
||||
dep_shdc: *Build.Dependency,
|
||||
input: Build.LazyPath,
|
||||
output: Build.LazyPath,
|
||||
slang: Slang,
|
||||
format: Format = .sokol_zig,
|
||||
tmp_dir: ?Build.LazyPath = null,
|
||||
defines: ?[][]const u8 = null,
|
||||
module: ?[]const u8 = null,
|
||||
reflection: bool = false,
|
||||
bytecode: bool = false,
|
||||
dump: bool = false,
|
||||
genver: ?[]const u8 = null,
|
||||
ifdef: bool = false,
|
||||
noifdef: bool = false,
|
||||
save_intermediate_spirv: bool = false,
|
||||
no_log_cmdline: bool = true,
|
||||
};
|
||||
|
||||
pub fn compile(b: *Build, opts: Options) !*Build.Step.Run {
|
||||
const shdc_path = try getShdcLazyPath(opts.dep_shdc);
|
||||
const args = try optsToArgs(opts, b, shdc_path);
|
||||
var step = b.addSystemCommand(args);
|
||||
step.addFileArg(opts.input);
|
||||
return step;
|
||||
}
|
||||
|
||||
/// target shader languages
|
||||
/// NOTE: make sure that field names match the cmdline arg string
|
||||
pub const Slang = packed struct(u10) {
|
||||
glsl410: bool = false,
|
||||
glsl430: bool = false,
|
||||
glsl300es: bool = false,
|
||||
glsl310es: bool = false,
|
||||
hlsl4: bool = false,
|
||||
hlsl5: bool = false,
|
||||
metal_macos: bool = false,
|
||||
metal_ios: bool = false,
|
||||
metal_sim: bool = false,
|
||||
wgsl: bool = false,
|
||||
};
|
||||
|
||||
fn slangToString(slang: Slang, a: Allocator) ![]const u8 {
|
||||
var strings: [16][]const u8 = undefined;
|
||||
var num_strings: usize = 0;
|
||||
inline for (std.meta.fields(Slang)) |field| {
|
||||
if (@field(slang, field.name)) {
|
||||
strings[num_strings] = field.name;
|
||||
num_strings += 1;
|
||||
}
|
||||
}
|
||||
return std.mem.join(a, ":", strings[0..num_strings]);
|
||||
}
|
||||
|
||||
/// the code-generation target language
|
||||
/// NOTE: make sure that the item names match the cmdline arg string
|
||||
pub const Format = enum {
|
||||
sokol,
|
||||
sokol_impl,
|
||||
sokol_zig,
|
||||
sokol_nim,
|
||||
sokol_odin,
|
||||
sokol_rust,
|
||||
sokol_d,
|
||||
sokol_jai,
|
||||
};
|
||||
|
||||
fn formatToString(f: Format) []const u8 {
|
||||
return @tagName(f);
|
||||
}
|
||||
|
||||
fn getShdcLazyPath(dep_shdc: *Build.Dependency) !Build.LazyPath {
|
||||
const intel = builtin.cpu.arch.isX86();
|
||||
const opt_sub_path: ?[]const u8 = switch (builtin.os.tag) {
|
||||
.windows => "bin/win32/sokol-shdc.exe",
|
||||
.linux => if (intel) "bin/linux/sokol-shdc" else "bin/linux_arm64/sokol-shdc",
|
||||
.macos => if (intel) "bin/osx/sokol-shdc" else "bin/osx_arm64/sokol-shdc",
|
||||
else => null,
|
||||
};
|
||||
if (opt_sub_path) |sub_path| {
|
||||
return dep_shdc.path(sub_path);
|
||||
} else {
|
||||
return error.ShdcUnsupportedPlatform;
|
||||
}
|
||||
}
|
||||
|
||||
fn optsToArgs(opts: Options, b: *Build, tool_path: Build.LazyPath) ![]const []const u8 {
|
||||
const a = b.allocator;
|
||||
var arr: std.ArrayListUnmanaged([]const u8) = .empty;
|
||||
try arr.append(a, tool_path.getPath(b));
|
||||
try arr.appendSlice(a, &.{ "-o", opts.output.getPath(b) });
|
||||
try arr.appendSlice(a, &.{ "-l", try slangToString(opts.slang, a) });
|
||||
try arr.appendSlice(a, &.{ "-f", formatToString(opts.format) });
|
||||
if (opts.tmp_dir) |tmp_dir| {
|
||||
try arr.appendSlice(a, &.{ "--tmpdir", tmp_dir.getPath(b) });
|
||||
}
|
||||
if (opts.defines) |defines| {
|
||||
try arr.appendSlice(a, &.{ "--defines", try std.mem.join(a, ":", defines) });
|
||||
}
|
||||
if (opts.module) |module| {
|
||||
try arr.appendSlice(a, &.{ "--module", b.dupe(module) });
|
||||
}
|
||||
if (opts.reflection) {
|
||||
try arr.append(a, "--reflection");
|
||||
}
|
||||
if (opts.bytecode) {
|
||||
try arr.append(a, "--bytecode");
|
||||
}
|
||||
if (opts.dump) {
|
||||
try arr.append(a, "--dump");
|
||||
}
|
||||
if (opts.genver) |genver| {
|
||||
try arr.appendSlice(a, &.{ "--genver", b.dupe(genver) });
|
||||
}
|
||||
if (opts.ifdef) {
|
||||
try arr.append(a, "--ifdef");
|
||||
}
|
||||
if (opts.noifdef) {
|
||||
try arr.append(a, "--noifdef");
|
||||
}
|
||||
if (opts.save_intermediate_spirv) {
|
||||
try arr.append(a, "--save-intermediate-spirv");
|
||||
}
|
||||
if (opts.no_log_cmdline) {
|
||||
try arr.append(a, "--no-log-cmdline");
|
||||
}
|
||||
// important: keep this last
|
||||
try arr.append(a, "-i");
|
||||
return arr.toOwnedSlice(a);
|
||||
}
|
||||
|
||||
pub fn build(b: *Build) void {
|
||||
_ = b;
|
||||
}
|
7
thirdparty/sokol-tools/build.zig.zon
vendored
Normal file
7
thirdparty/sokol-tools/build.zig.zon
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
.{
|
||||
.name = .sokolshdc,
|
||||
.fingerprint = 0xe0596dde0e9962af,
|
||||
.version = "0.1.0",
|
||||
.minimum_zig_version = "0.14.0",
|
||||
.paths = .{ "bin", "build.zig", "build.zig.zon" },
|
||||
}
|
62
thirdparty/sokol-tools/fips-files/generators/SokolShader.py
vendored
Normal file
62
thirdparty/sokol-tools/fips-files/generators/SokolShader.py
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
#-------------------------------------------------------------------------------
|
||||
# SokolShader.py
|
||||
#
|
||||
# Fips code-generator script for invoking sokol-shdc during the build.
|
||||
#
|
||||
# Use the cmake macro 'sokol_shader([glsl-file] [shader-dialects])' inside a
|
||||
# fips target (fips_begin_* / fips_end_*) to hook the code-generation
|
||||
# build job into the build process.
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
Version = 5
|
||||
|
||||
import os, platform, subprocess
|
||||
import genutil as util
|
||||
from mod import log
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
def find_shdc():
|
||||
shdc_path = os.path.dirname(os.path.abspath(__file__))
|
||||
shdc_path += '/../../bin/'
|
||||
if platform.system() == 'Windows':
|
||||
shdc_path += 'win32/'
|
||||
elif platform.system() == 'Darwin':
|
||||
if platform.machine() == 'arm64':
|
||||
shdc_path += 'osx_arm64/'
|
||||
else:
|
||||
shdc_path += 'osx/'
|
||||
elif platform.system() == 'Linux':
|
||||
if platform.machine() in ['aarch64', 'arm64']:
|
||||
shdc_path += 'linux_arm64/'
|
||||
else:
|
||||
shdc_path += 'linux/'
|
||||
else:
|
||||
log.error('Unknown host system {}'.format(platform.system()))
|
||||
return shdc_path + 'sokol-shdc'
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
def generate(input, out_src, out_hdr, args):
|
||||
errfmt = 'msvc' if args['compiler']=='MSVC' else 'gcc'
|
||||
if util.isDirty(Version, [input], [out_hdr]):
|
||||
print('## sokol-shdc: {} {} {}'.format(input, out_hdr, str(args)))
|
||||
cmd = [find_shdc(),
|
||||
'--input', input,
|
||||
'--output', out_hdr,
|
||||
'--slang', args['slang'],
|
||||
'--genver', str(Version),
|
||||
'--errfmt', errfmt,
|
||||
'--format', 'sokol']
|
||||
if 'defines' in args:
|
||||
cmd.extend(['--defines', args['defines']])
|
||||
if 'module' in args:
|
||||
cmd.extend(['--module', args['module']])
|
||||
if 'reflection' in args:
|
||||
if args['reflection']:
|
||||
cmd.extend(['--reflection'])
|
||||
if 'debuggable' in args and args['debuggable']:
|
||||
pass
|
||||
else:
|
||||
cmd.extend(['--bytecode'])
|
||||
res = subprocess.call(cmd)
|
||||
if res != 0:
|
||||
log.error('sokol-shdc returned with error code {}'.format(res))
|
25
thirdparty/sokol-tools/fips-files/include.cmake
vendored
Normal file
25
thirdparty/sokol-tools/fips-files/include.cmake
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
macro(sokol_shader shd slang)
|
||||
set(args "{slang: '${slang}', compiler: '${CMAKE_C_COMPILER_ID}' }")
|
||||
fips_generate(TYPE SokolShader FROM ${shd} HEADER ${shd}.h OUT_OF_SOURCE ARGS ${args})
|
||||
endmacro()
|
||||
|
||||
# special version which doesn't generate binary output, this allows shaders to be debugged
|
||||
macro(sokol_shader_debuggable shd slang)
|
||||
set(args "{slang: '${slang}', compiler: '${CMAKE_C_COMPILER_ID}', debuggable: true }")
|
||||
fips_generate(TYPE SokolShader FROM ${shd} HEADER ${shd}.h OUT_OF_SOURCE ARGS ${args})
|
||||
endmacro()
|
||||
|
||||
macro(sokol_shader_variant shd slang module defines)
|
||||
set(args "{slang: '${slang}', compiler: '${CMAKE_C_COMPILER_ID}', defines: '${defines}', module: '${module}' }")
|
||||
fips_generate(TYPE SokolShader FROM ${shd} HEADER ${shd}.${module}.h OUT_OF_SOURCE ARGS ${args})
|
||||
endmacro()
|
||||
|
||||
macro(sokol_shader_with_reflection shd slang)
|
||||
set(args "{slang: '${slang}', compiler: '${CMAKE_C_COMPILER_ID}', reflection: true }")
|
||||
fips_generate(TYPE SokolShader FROM ${shd} HEADER ${shd}.h OUT_OF_SOURCE ARGS ${args})
|
||||
endmacro()
|
||||
|
||||
macro(sokol_shader_variant_with_reflection shd slang module defines)
|
||||
set(args "{slang: '${slang}', compiler: '${CMAKE_C_COMPILER_ID}', defines: '${defines}', module: '${module}', reflection: true }")
|
||||
fips_generate(TYPE SokolShader FROM ${shd} HEADER ${shd}.${module}.h OUT_OF_SOURCE ARGS ${args})
|
||||
endmacro()
|
15
thirdparty/sokol/.gitignore
vendored
Normal file
15
thirdparty/sokol/.gitignore
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
.vscode/
|
||||
build/
|
||||
*.a
|
||||
*.o
|
||||
*.lib
|
||||
*.obj
|
||||
*.pdb
|
||||
*.bin
|
||||
*.exp
|
||||
*.ilk
|
||||
*.dll
|
||||
*.dylib
|
||||
*.exe
|
||||
*.dSYM/
|
||||
ols.json
|
12
thirdparty/sokol/CHANGELOG.md
vendored
Normal file
12
thirdparty/sokol/CHANGELOG.md
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
## CHANGELOG
|
||||
|
||||
> NOTE: this changelog is only for changes to the sokol-odin 'scaffolding'.
|
||||
For actual Sokol header changes, see the
|
||||
[sokol changelog](https://github.com/floooh/sokol/blob/master/CHANGELOG.md).
|
||||
|
||||
### 13-Apr-2024
|
||||
|
||||
Merged PR https://github.com/floooh/sokol-odin/pull/11, this changes the
|
||||
directory structure of the bindings repository, adds support to build
|
||||
the Windows bindings as a DLL and a couple of smaller things
|
||||
detailed here: https://github.com/floooh/sokol/pull/1023
|
22
thirdparty/sokol/LICENSE
vendored
Normal file
22
thirdparty/sokol/LICENSE
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
zlib/libpng license
|
||||
|
||||
Copyright (c) 2022 Andre Weissflog
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty.
|
||||
In no event will the authors be held liable for any damages arising from the
|
||||
use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software in a
|
||||
product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
81
thirdparty/sokol/README.md
vendored
Normal file
81
thirdparty/sokol/README.md
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
[](https://github.com/floooh/sokol-odin/actions/workflows/main.yml)
|
||||
|
||||
Auto-generated [Odin](https://github.com/odin-lang/odin) bindings for the [sokol headers](https://github.com/floooh/sokol).
|
||||
|
||||
To include sokol in your project you can copy the [sokol](sokol/) directory.
|
||||
|
||||
## BUILD
|
||||
|
||||
Supported platforms are: Windows, macOS, Linux (with X11)
|
||||
|
||||
On Linux install the following packages: libglu1-mesa-dev, mesa-common-dev, xorg-dev, libasound-dev
|
||||
(or generally: the dev packages required for X11, GL and ALSA development)
|
||||
|
||||
1. First build the required static link libraries:
|
||||
|
||||
```
|
||||
cd sokol
|
||||
# on macOS:
|
||||
./build_clibs_macos.sh
|
||||
# on Linux:
|
||||
./build_clibs_linux.sh
|
||||
# on Windows with MSVC (from a 'Visual Studio Developer Command Prompt')
|
||||
build_clibs_windows.cmd
|
||||
cd ..
|
||||
```
|
||||
|
||||
2. Create a build directory and cd into it:
|
||||
```
|
||||
mkdir build
|
||||
cd build
|
||||
```
|
||||
|
||||
3. Build and run the samples:
|
||||
```
|
||||
odin run ../examples/clear -debug
|
||||
odin run ../examples/triangle -debug
|
||||
odin run ../examples/quad -debug
|
||||
odin run ../examples/bufferoffsets -debug
|
||||
odin run ../examples/cube -debug
|
||||
odin run ../examples/noninterleaved -debug
|
||||
odin run ../examples/texcube -debug
|
||||
odin run ../examples/shapes -debug
|
||||
odin run ../examples/offscreen -debug
|
||||
odin run ../examples/instancing -debug
|
||||
odin run ../examples/mrt -debug
|
||||
odin run ../examples/blend -debug
|
||||
odin run ../examples/debugtext -debug
|
||||
odin run ../examples/debugtext-print -debug
|
||||
odin run ../examples/debugtext-userfont -debug
|
||||
odin run ../examples/saudio -debug
|
||||
odin run ../examples/sgl -debug
|
||||
odin run ../examples/sgl-points -debug
|
||||
odin run ../examples/sgl-context -debug
|
||||
odin run ../examples/vertexpull -debug
|
||||
```
|
||||
|
||||
By default, the backend 3D API will be selected based on the target platform:
|
||||
|
||||
- macOS: Metal
|
||||
- Windows: D3D11
|
||||
- Linux: GL
|
||||
|
||||
To force the GL backend on macOS or Windows, build with ```-define:SOKOL_USE_GL=true```:
|
||||
|
||||
```
|
||||
odin run ../examples/clear -debug -define:SOKOL_USE_GL=true
|
||||
```
|
||||
|
||||
The ```clear``` sample prints the selected backend to the terminal:
|
||||
|
||||
```
|
||||
odin run ../examples/clear -debug -define:SOKOL_USE_GL=true
|
||||
>> using GL backend
|
||||
```
|
||||
|
||||
On Windows, you can get rid of the automatically opened terminal window
|
||||
by building with the ```-subsystem:windows``` option:
|
||||
|
||||
```
|
||||
odin build ../examples/clear -subsystem:windows
|
||||
```
|
2033
thirdparty/sokol/app/app.odin
vendored
Normal file
2033
thirdparty/sokol/app/app.odin
vendored
Normal file
File diff suppressed because it is too large
Load Diff
649
thirdparty/sokol/audio/audio.odin
vendored
Normal file
649
thirdparty/sokol/audio/audio.odin
vendored
Normal file
@@ -0,0 +1,649 @@
|
||||
// machine generated, do not edit
|
||||
|
||||
package sokol_audio
|
||||
|
||||
/*
|
||||
|
||||
sokol_audio.h -- cross-platform audio-streaming API
|
||||
|
||||
Project URL: https://github.com/floooh/sokol
|
||||
|
||||
Do this:
|
||||
#define SOKOL_IMPL or
|
||||
#define SOKOL_AUDIO_IMPL
|
||||
before you include this file in *one* C or C++ file to create the
|
||||
implementation.
|
||||
|
||||
Optionally provide the following defines with your own implementations:
|
||||
|
||||
SOKOL_DUMMY_BACKEND - use a dummy backend
|
||||
SOKOL_ASSERT(c) - your own assert macro (default: assert(c))
|
||||
SOKOL_AUDIO_API_DECL- public function declaration prefix (default: extern)
|
||||
SOKOL_API_DECL - same as SOKOL_AUDIO_API_DECL
|
||||
SOKOL_API_IMPL - public function implementation prefix (default: -)
|
||||
|
||||
SAUDIO_RING_MAX_SLOTS - max number of slots in the push-audio ring buffer (default 1024)
|
||||
SAUDIO_OSX_USE_SYSTEM_HEADERS - define this to force inclusion of system headers on
|
||||
macOS instead of using embedded CoreAudio declarations
|
||||
|
||||
If sokol_audio.h is compiled as a DLL, define the following before
|
||||
including the declaration or implementation:
|
||||
|
||||
SOKOL_DLL
|
||||
|
||||
On Windows, SOKOL_DLL will define SOKOL_AUDIO_API_DECL as __declspec(dllexport)
|
||||
or __declspec(dllimport) as needed.
|
||||
|
||||
Link with the following libraries:
|
||||
|
||||
- on macOS: AudioToolbox
|
||||
- on iOS: AudioToolbox, AVFoundation
|
||||
- on FreeBSD: asound
|
||||
- on Linux: asound
|
||||
- on Android: aaudio
|
||||
- on Windows with MSVC or Clang toolchain: no action needed, libs are defined in-source via pragma-comment-lib
|
||||
- on Windows with MINGW/MSYS2 gcc: compile with '-mwin32' and link with -lole32
|
||||
|
||||
FEATURE OVERVIEW
|
||||
================
|
||||
You provide a mono- or stereo-stream of 32-bit float samples, which
|
||||
Sokol Audio feeds into platform-specific audio backends:
|
||||
|
||||
- Windows: WASAPI
|
||||
- Linux: ALSA
|
||||
- FreeBSD: ALSA
|
||||
- macOS: CoreAudio
|
||||
- iOS: CoreAudio+AVAudioSession
|
||||
- emscripten: WebAudio with ScriptProcessorNode
|
||||
- Android: AAudio
|
||||
|
||||
Sokol Audio will not do any buffer mixing or volume control, if you have
|
||||
multiple independent input streams of sample data you need to perform the
|
||||
mixing yourself before forwarding the data to Sokol Audio.
|
||||
|
||||
There are two mutually exclusive ways to provide the sample data:
|
||||
|
||||
1. Callback model: You provide a callback function, which will be called
|
||||
when Sokol Audio needs new samples. On all platforms except emscripten,
|
||||
this function is called from a separate thread.
|
||||
2. Push model: Your code pushes small blocks of sample data from your
|
||||
main loop or a thread you created. The pushed data is stored in
|
||||
a ring buffer where it is pulled by the backend code when
|
||||
needed.
|
||||
|
||||
The callback model is preferred because it is the most direct way to
|
||||
feed sample data into the audio backends and also has less moving parts
|
||||
(there is no ring buffer between your code and the audio backend).
|
||||
|
||||
Sometimes it is not possible to generate the audio stream directly in a
|
||||
callback function running in a separate thread, for such cases Sokol Audio
|
||||
provides the push-model as a convenience.
|
||||
|
||||
SOKOL AUDIO, SOLOUD AND MINIAUDIO
|
||||
=================================
|
||||
The WASAPI, ALSA and CoreAudio backend code has been taken from the
|
||||
SoLoud library (with some modifications, so any bugs in there are most
|
||||
likely my fault). If you need a more fully-featured audio solution, check
|
||||
out SoLoud, it's excellent:
|
||||
|
||||
https://github.com/jarikomppa/soloud
|
||||
|
||||
Another alternative which feature-wise is somewhere inbetween SoLoud and
|
||||
sokol-audio might be MiniAudio:
|
||||
|
||||
https://github.com/mackron/miniaudio
|
||||
|
||||
GLOSSARY
|
||||
========
|
||||
- stream buffer:
|
||||
The internal audio data buffer, usually provided by the backend API. The
|
||||
size of the stream buffer defines the base latency, smaller buffers have
|
||||
lower latency but may cause audio glitches. Bigger buffers reduce or
|
||||
eliminate glitches, but have a higher base latency.
|
||||
|
||||
- stream callback:
|
||||
Optional callback function which is called by Sokol Audio when it
|
||||
needs new samples. On Windows, macOS/iOS and Linux, this is called in
|
||||
a separate thread, on WebAudio, this is called per-frame in the
|
||||
browser thread.
|
||||
|
||||
- channel:
|
||||
A discrete track of audio data, currently 1-channel (mono) and
|
||||
2-channel (stereo) is supported and tested.
|
||||
|
||||
- sample:
|
||||
The magnitude of an audio signal on one channel at a given time. In
|
||||
Sokol Audio, samples are 32-bit float numbers in the range -1.0 to
|
||||
+1.0.
|
||||
|
||||
- frame:
|
||||
The tightly packed set of samples for all channels at a given time.
|
||||
For mono 1 frame is 1 sample. For stereo, 1 frame is 2 samples.
|
||||
|
||||
- packet:
|
||||
In Sokol Audio, a small chunk of audio data that is moved from the
|
||||
main thread to the audio streaming thread in order to decouple the
|
||||
rate at which the main thread provides new audio data, and the
|
||||
streaming thread consuming audio data.
|
||||
|
||||
WORKING WITH SOKOL AUDIO
|
||||
========================
|
||||
First call saudio_setup() with your preferred audio playback options.
|
||||
In most cases you can stick with the default values, these provide
|
||||
a good balance between low-latency and glitch-free playback
|
||||
on all audio backends.
|
||||
|
||||
You should always provide a logging callback to be aware of any
|
||||
warnings and errors. The easiest way is to use sokol_log.h for this:
|
||||
|
||||
#include "sokol_log.h"
|
||||
// ...
|
||||
saudio_setup(&(saudio_desc){
|
||||
.logger = {
|
||||
.func = slog_func,
|
||||
}
|
||||
});
|
||||
|
||||
If you want to use the callback-model, you need to provide a stream
|
||||
callback function either in saudio_desc.stream_cb or saudio_desc.stream_userdata_cb,
|
||||
otherwise keep both function pointers zero-initialized.
|
||||
|
||||
Use push model and default playback parameters:
|
||||
|
||||
saudio_setup(&(saudio_desc){ .logger.func = slog_func });
|
||||
|
||||
Use stream callback model and default playback parameters:
|
||||
|
||||
saudio_setup(&(saudio_desc){
|
||||
.stream_cb = my_stream_callback
|
||||
.logger.func = slog_func,
|
||||
});
|
||||
|
||||
The standard stream callback doesn't have a user data argument, if you want
|
||||
that, use the alternative stream_userdata_cb and also set the user_data pointer:
|
||||
|
||||
saudio_setup(&(saudio_desc){
|
||||
.stream_userdata_cb = my_stream_callback,
|
||||
.user_data = &my_data
|
||||
.logger.func = slog_func,
|
||||
});
|
||||
|
||||
The following playback parameters can be provided through the
|
||||
saudio_desc struct:
|
||||
|
||||
General parameters (both for stream-callback and push-model):
|
||||
|
||||
int sample_rate -- the sample rate in Hz, default: 44100
|
||||
int num_channels -- number of channels, default: 1 (mono)
|
||||
int buffer_frames -- number of frames in streaming buffer, default: 2048
|
||||
|
||||
The stream callback prototype (either with or without userdata):
|
||||
|
||||
void (*stream_cb)(float* buffer, int num_frames, int num_channels)
|
||||
void (*stream_userdata_cb)(float* buffer, int num_frames, int num_channels, void* user_data)
|
||||
Function pointer to the user-provide stream callback.
|
||||
|
||||
Push-model parameters:
|
||||
|
||||
int packet_frames -- number of frames in a packet, default: 128
|
||||
int num_packets -- number of packets in ring buffer, default: 64
|
||||
|
||||
The sample_rate and num_channels parameters are only hints for the audio
|
||||
backend, it isn't guaranteed that those are the values used for actual
|
||||
playback.
|
||||
|
||||
To get the actual parameters, call the following functions after
|
||||
saudio_setup():
|
||||
|
||||
int saudio_sample_rate(void)
|
||||
int saudio_channels(void);
|
||||
|
||||
It's unlikely that the number of channels will be different than requested,
|
||||
but a different sample rate isn't uncommon.
|
||||
|
||||
(NOTE: there's an yet unsolved issue when an audio backend might switch
|
||||
to a different sample rate when switching output devices, for instance
|
||||
plugging in a bluetooth headset, this case is currently not handled in
|
||||
Sokol Audio).
|
||||
|
||||
You can check if audio initialization was successful with
|
||||
saudio_isvalid(). If backend initialization failed for some reason
|
||||
(for instance when there's no audio device in the machine), this
|
||||
will return false. Not checking for success won't do any harm, all
|
||||
Sokol Audio function will silently fail when called after initialization
|
||||
has failed, so apart from missing audio output, nothing bad will happen.
|
||||
|
||||
Before your application exits, you should call
|
||||
|
||||
saudio_shutdown();
|
||||
|
||||
This stops the audio thread (on Linux, Windows and macOS/iOS) and
|
||||
properly shuts down the audio backend.
|
||||
|
||||
THE STREAM CALLBACK MODEL
|
||||
=========================
|
||||
To use Sokol Audio in stream-callback-mode, provide a callback function
|
||||
like this in the saudio_desc struct when calling saudio_setup():
|
||||
|
||||
void stream_cb(float* buffer, int num_frames, int num_channels) {
|
||||
...
|
||||
}
|
||||
|
||||
Or the alternative version with a user-data argument:
|
||||
|
||||
void stream_userdata_cb(float* buffer, int num_frames, int num_channels, void* user_data) {
|
||||
my_data_t* my_data = (my_data_t*) user_data;
|
||||
...
|
||||
}
|
||||
|
||||
The job of the callback function is to fill the *buffer* with 32-bit
|
||||
float sample values.
|
||||
|
||||
To output silence, fill the buffer with zeros:
|
||||
|
||||
void stream_cb(float* buffer, int num_frames, int num_channels) {
|
||||
const int num_samples = num_frames * num_channels;
|
||||
for (int i = 0; i < num_samples; i++) {
|
||||
buffer[i] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
For stereo output (num_channels == 2), the samples for the left
|
||||
and right channel are interleaved:
|
||||
|
||||
void stream_cb(float* buffer, int num_frames, int num_channels) {
|
||||
assert(2 == num_channels);
|
||||
for (int i = 0; i < num_frames; i++) {
|
||||
buffer[2*i + 0] = ...; // left channel
|
||||
buffer[2*i + 1] = ...; // right channel
|
||||
}
|
||||
}
|
||||
|
||||
Please keep in mind that the stream callback function is running in a
|
||||
separate thread, if you need to share data with the main thread you need
|
||||
to take care yourself to make the access to the shared data thread-safe!
|
||||
|
||||
THE PUSH MODEL
|
||||
==============
|
||||
To use the push-model for providing audio data, simply don't set (keep
|
||||
zero-initialized) the stream_cb field in the saudio_desc struct when
|
||||
calling saudio_setup().
|
||||
|
||||
To provide sample data with the push model, call the saudio_push()
|
||||
function at regular intervals (for instance once per frame). You can
|
||||
call the saudio_expect() function to ask Sokol Audio how much room is
|
||||
in the ring buffer, but if you provide a continuous stream of data
|
||||
at the right sample rate, saudio_expect() isn't required (it's a simple
|
||||
way to sync/throttle your sample generation code with the playback
|
||||
rate though).
|
||||
|
||||
With saudio_push() you may need to maintain your own intermediate sample
|
||||
buffer, since pushing individual sample values isn't very efficient.
|
||||
The following example is from the MOD player sample in
|
||||
sokol-samples (https://github.com/floooh/sokol-samples):
|
||||
|
||||
const int num_frames = saudio_expect();
|
||||
if (num_frames > 0) {
|
||||
const int num_samples = num_frames * saudio_channels();
|
||||
read_samples(flt_buf, num_samples);
|
||||
saudio_push(flt_buf, num_frames);
|
||||
}
|
||||
|
||||
Another option is to ignore saudio_expect(), and just push samples as they
|
||||
are generated in small batches. In this case you *need* to generate the
|
||||
samples at the right sample rate:
|
||||
|
||||
The following example is taken from the Tiny Emulators project
|
||||
(https://github.com/floooh/chips-test), this is for mono playback,
|
||||
so (num_samples == num_frames):
|
||||
|
||||
// tick the sound generator
|
||||
if (ay38910_tick(&sys->psg)) {
|
||||
// new sample is ready
|
||||
sys->sample_buffer[sys->sample_pos++] = sys->psg.sample;
|
||||
if (sys->sample_pos == sys->num_samples) {
|
||||
// new sample packet is ready
|
||||
saudio_push(sys->sample_buffer, sys->num_samples);
|
||||
sys->sample_pos = 0;
|
||||
}
|
||||
}
|
||||
|
||||
THE WEBAUDIO BACKEND
|
||||
====================
|
||||
The WebAudio backend is currently using a ScriptProcessorNode callback to
|
||||
feed the sample data into WebAudio. ScriptProcessorNode has been
|
||||
deprecated for a while because it is running from the main thread, with
|
||||
the default initialization parameters it works 'pretty well' though.
|
||||
Ultimately Sokol Audio will use Audio Worklets, but this requires a few
|
||||
more things to fall into place (Audio Worklets implemented everywhere,
|
||||
SharedArrayBuffers enabled again, and I need to figure out a 'low-cost'
|
||||
solution in terms of implementation effort, since Audio Worklets are
|
||||
a lot more complex than ScriptProcessorNode if the audio data needs to come
|
||||
from the main thread).
|
||||
|
||||
The WebAudio backend is automatically selected when compiling for
|
||||
emscripten (__EMSCRIPTEN__ define exists).
|
||||
|
||||
https://developers.google.com/web/updates/2017/12/audio-worklet
|
||||
https://developers.google.com/web/updates/2018/06/audio-worklet-design-pattern
|
||||
|
||||
"Blob URLs": https://www.html5rocks.com/en/tutorials/workers/basics/
|
||||
|
||||
Also see: https://blog.paul.cx/post/a-wait-free-spsc-ringbuffer-for-the-web/
|
||||
|
||||
THE COREAUDIO BACKEND
|
||||
=====================
|
||||
The CoreAudio backend is selected on macOS and iOS (__APPLE__ is defined).
|
||||
Since the CoreAudio API is implemented in C (not Objective-C) on macOS the
|
||||
implementation part of Sokol Audio can be included into a C source file.
|
||||
|
||||
However on iOS, Sokol Audio must be compiled as Objective-C due to it's
|
||||
reliance on the AVAudioSession object. The iOS code path support both
|
||||
being compiled with or without ARC (Automatic Reference Counting).
|
||||
|
||||
For thread synchronisation, the CoreAudio backend will use the
|
||||
pthread_mutex_* functions.
|
||||
|
||||
The incoming floating point samples will be directly forwarded to
|
||||
CoreAudio without further conversion.
|
||||
|
||||
macOS and iOS applications that use Sokol Audio need to link with
|
||||
the AudioToolbox framework.
|
||||
|
||||
THE WASAPI BACKEND
|
||||
==================
|
||||
The WASAPI backend is automatically selected when compiling on Windows
|
||||
(_WIN32 is defined).
|
||||
|
||||
For thread synchronisation a Win32 critical section is used.
|
||||
|
||||
WASAPI may use a different size for its own streaming buffer then requested,
|
||||
so the base latency may be slightly bigger. The current backend implementation
|
||||
converts the incoming floating point sample values to signed 16-bit
|
||||
integers.
|
||||
|
||||
The required Windows system DLLs are linked with #pragma comment(lib, ...),
|
||||
so you shouldn't need to add additional linker libs in the build process
|
||||
(otherwise this is a bug which should be fixed in sokol_audio.h).
|
||||
|
||||
THE ALSA BACKEND
|
||||
================
|
||||
The ALSA backend is automatically selected when compiling on Linux
|
||||
('linux' is defined).
|
||||
|
||||
For thread synchronisation, the pthread_mutex_* functions are used.
|
||||
|
||||
Samples are directly forwarded to ALSA in 32-bit float format, no
|
||||
further conversion is taking place.
|
||||
|
||||
You need to link with the 'asound' library, and the <alsa/asoundlib.h>
|
||||
header must be present (usually both are installed with some sort
|
||||
of ALSA development package).
|
||||
|
||||
|
||||
MEMORY ALLOCATION OVERRIDE
|
||||
==========================
|
||||
You can override the memory allocation functions at initialization time
|
||||
like this:
|
||||
|
||||
void* my_alloc(size_t size, void* user_data) {
|
||||
return malloc(size);
|
||||
}
|
||||
|
||||
void my_free(void* ptr, void* user_data) {
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
...
|
||||
saudio_setup(&(saudio_desc){
|
||||
// ...
|
||||
.allocator = {
|
||||
.alloc_fn = my_alloc,
|
||||
.free_fn = my_free,
|
||||
.user_data = ...,
|
||||
}
|
||||
});
|
||||
...
|
||||
|
||||
If no overrides are provided, malloc and free will be used.
|
||||
|
||||
This only affects memory allocation calls done by sokol_audio.h
|
||||
itself though, not any allocations in OS libraries.
|
||||
|
||||
Memory allocation will only happen on the same thread where saudio_setup()
|
||||
was called, so you don't need to worry about thread-safety.
|
||||
|
||||
|
||||
ERROR REPORTING AND LOGGING
|
||||
===========================
|
||||
To get any logging information at all you need to provide a logging callback in the setup call
|
||||
the easiest way is to use sokol_log.h:
|
||||
|
||||
#include "sokol_log.h"
|
||||
|
||||
saudio_setup(&(saudio_desc){ .logger.func = slog_func });
|
||||
|
||||
To override logging with your own callback, first write a logging function like this:
|
||||
|
||||
void my_log(const char* tag, // e.g. 'saudio'
|
||||
uint32_t log_level, // 0=panic, 1=error, 2=warn, 3=info
|
||||
uint32_t log_item_id, // SAUDIO_LOGITEM_*
|
||||
const char* message_or_null, // a message string, may be nullptr in release mode
|
||||
uint32_t line_nr, // line number in sokol_audio.h
|
||||
const char* filename_or_null, // source filename, may be nullptr in release mode
|
||||
void* user_data)
|
||||
{
|
||||
...
|
||||
}
|
||||
|
||||
...and then setup sokol-audio like this:
|
||||
|
||||
saudio_setup(&(saudio_desc){
|
||||
.logger = {
|
||||
.func = my_log,
|
||||
.user_data = my_user_data,
|
||||
}
|
||||
});
|
||||
|
||||
The provided logging function must be reentrant (e.g. be callable from
|
||||
different threads).
|
||||
|
||||
If you don't want to provide your own custom logger it is highly recommended to use
|
||||
the standard logger in sokol_log.h instead, otherwise you won't see any warnings or
|
||||
errors.
|
||||
|
||||
|
||||
LICENSE
|
||||
=======
|
||||
|
||||
zlib/libpng license
|
||||
|
||||
Copyright (c) 2018 Andre Weissflog
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty.
|
||||
In no event will the authors be held liable for any damages arising from the
|
||||
use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software in a
|
||||
product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
|
||||
*/
|
||||
|
||||
import "core:c"
|
||||
|
||||
_ :: c
|
||||
|
||||
SOKOL_DEBUG :: #config(SOKOL_DEBUG, ODIN_DEBUG)
|
||||
|
||||
DEBUG :: #config(SOKOL_AUDIO_DEBUG, SOKOL_DEBUG)
|
||||
USE_GL :: #config(SOKOL_USE_GL, false)
|
||||
USE_DLL :: #config(SOKOL_DLL, false)
|
||||
|
||||
when ODIN_OS == .Windows {
|
||||
when USE_DLL {
|
||||
when USE_GL {
|
||||
when DEBUG { foreign import sokol_audio_clib { "../sokol_dll_windows_x64_gl_debug.lib" } }
|
||||
else { foreign import sokol_audio_clib { "../sokol_dll_windows_x64_gl_release.lib" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_audio_clib { "../sokol_dll_windows_x64_d3d11_debug.lib" } }
|
||||
else { foreign import sokol_audio_clib { "../sokol_dll_windows_x64_d3d11_release.lib" } }
|
||||
}
|
||||
} else {
|
||||
when USE_GL {
|
||||
when DEBUG { foreign import sokol_audio_clib { "sokol_audio_windows_x64_gl_debug.lib" } }
|
||||
else { foreign import sokol_audio_clib { "sokol_audio_windows_x64_gl_release.lib" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_audio_clib { "sokol_audio_windows_x64_d3d11_debug.lib" } }
|
||||
else { foreign import sokol_audio_clib { "sokol_audio_windows_x64_d3d11_release.lib" } }
|
||||
}
|
||||
}
|
||||
} else when ODIN_OS == .Darwin {
|
||||
when USE_DLL {
|
||||
when USE_GL && ODIN_ARCH == .arm64 && DEBUG { foreign import sokol_audio_clib { "../dylib/sokol_dylib_macos_arm64_gl_debug.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .arm64 && !DEBUG { foreign import sokol_audio_clib { "../dylib/sokol_dylib_macos_arm64_gl_release.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .amd64 && DEBUG { foreign import sokol_audio_clib { "../dylib/sokol_dylib_macos_x64_gl_debug.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .amd64 && !DEBUG { foreign import sokol_audio_clib { "../dylib/sokol_dylib_macos_x64_gl_release.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .arm64 && DEBUG { foreign import sokol_audio_clib { "../dylib/sokol_dylib_macos_arm64_metal_debug.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .arm64 && !DEBUG { foreign import sokol_audio_clib { "../dylib/sokol_dylib_macos_arm64_metal_release.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .amd64 && DEBUG { foreign import sokol_audio_clib { "../dylib/sokol_dylib_macos_x64_metal_debug.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .amd64 && !DEBUG { foreign import sokol_audio_clib { "../dylib/sokol_dylib_macos_x64_metal_release.dylib" } }
|
||||
} else {
|
||||
when USE_GL {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when DEBUG { foreign import sokol_audio_clib { "sokol_audio_macos_arm64_gl_debug.a", "system:AudioToolbox.framework" } }
|
||||
else { foreign import sokol_audio_clib { "sokol_audio_macos_arm64_gl_release.a", "system:AudioToolbox.framework" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_audio_clib { "sokol_audio_macos_x64_gl_debug.a", "system:AudioToolbox.framework" } }
|
||||
else { foreign import sokol_audio_clib { "sokol_audio_macos_x64_gl_release.a", "system:AudioToolbox.framework" } }
|
||||
}
|
||||
} else {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when DEBUG { foreign import sokol_audio_clib { "sokol_audio_macos_arm64_metal_debug.a", "system:AudioToolbox.framework" } }
|
||||
else { foreign import sokol_audio_clib { "sokol_audio_macos_arm64_metal_release.a", "system:AudioToolbox.framework" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_audio_clib { "sokol_audio_macos_x64_metal_debug.a", "system:AudioToolbox.framework" } }
|
||||
else { foreign import sokol_audio_clib { "sokol_audio_macos_x64_metal_release.a", "system:AudioToolbox.framework" } }
|
||||
}
|
||||
}
|
||||
}
|
||||
} else when ODIN_OS == .Linux {
|
||||
when USE_DLL {
|
||||
when DEBUG { foreign import sokol_audio_clib { "sokol_audio_linux_x64_gl_debug.so", "system:asound", "system:dl", "system:pthread" } }
|
||||
else { foreign import sokol_audio_clib { "sokol_audio_linux_x64_gl_release.so", "system:asound", "system:dl", "system:pthread" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_audio_clib { "sokol_audio_linux_x64_gl_debug.a", "system:asound", "system:dl", "system:pthread" } }
|
||||
else { foreign import sokol_audio_clib { "sokol_audio_linux_x64_gl_release.a", "system:asound", "system:dl", "system:pthread" } }
|
||||
}
|
||||
} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 {
|
||||
// Feed sokol_audio_wasm_gl_debug.a or sokol_audio_wasm_gl_release.a into emscripten compiler.
|
||||
foreign import sokol_audio_clib { "env.o" }
|
||||
} else {
|
||||
#panic("This OS is currently not supported")
|
||||
}
|
||||
|
||||
@(default_calling_convention="c", link_prefix="saudio_")
|
||||
foreign sokol_audio_clib {
|
||||
// setup sokol-audio
|
||||
setup :: proc(#by_ptr desc: Desc) ---
|
||||
// shutdown sokol-audio
|
||||
shutdown :: proc() ---
|
||||
// true after setup if audio backend was successfully initialized
|
||||
isvalid :: proc() -> bool ---
|
||||
// return the saudio_desc.user_data pointer
|
||||
userdata :: proc() -> rawptr ---
|
||||
// return a copy of the original saudio_desc struct
|
||||
query_desc :: proc() -> Desc ---
|
||||
// actual sample rate
|
||||
sample_rate :: proc() -> c.int ---
|
||||
// return actual backend buffer size in number of frames
|
||||
buffer_frames :: proc() -> c.int ---
|
||||
// actual number of channels
|
||||
channels :: proc() -> c.int ---
|
||||
// return true if audio context is currently suspended (only in WebAudio backend, all other backends return false)
|
||||
suspended :: proc() -> bool ---
|
||||
// get current number of frames to fill packet queue
|
||||
expect :: proc() -> c.int ---
|
||||
// push sample frames from main thread, returns number of frames actually pushed
|
||||
push :: proc(frames: ^f32, #any_int num_frames: c.int) -> c.int ---
|
||||
}
|
||||
|
||||
Log_Item :: enum i32 {
|
||||
OK,
|
||||
MALLOC_FAILED,
|
||||
ALSA_SND_PCM_OPEN_FAILED,
|
||||
ALSA_FLOAT_SAMPLES_NOT_SUPPORTED,
|
||||
ALSA_REQUESTED_BUFFER_SIZE_NOT_SUPPORTED,
|
||||
ALSA_REQUESTED_CHANNEL_COUNT_NOT_SUPPORTED,
|
||||
ALSA_SND_PCM_HW_PARAMS_SET_RATE_NEAR_FAILED,
|
||||
ALSA_SND_PCM_HW_PARAMS_FAILED,
|
||||
ALSA_PTHREAD_CREATE_FAILED,
|
||||
WASAPI_CREATE_EVENT_FAILED,
|
||||
WASAPI_CREATE_DEVICE_ENUMERATOR_FAILED,
|
||||
WASAPI_GET_DEFAULT_AUDIO_ENDPOINT_FAILED,
|
||||
WASAPI_DEVICE_ACTIVATE_FAILED,
|
||||
WASAPI_AUDIO_CLIENT_INITIALIZE_FAILED,
|
||||
WASAPI_AUDIO_CLIENT_GET_BUFFER_SIZE_FAILED,
|
||||
WASAPI_AUDIO_CLIENT_GET_SERVICE_FAILED,
|
||||
WASAPI_AUDIO_CLIENT_SET_EVENT_HANDLE_FAILED,
|
||||
WASAPI_CREATE_THREAD_FAILED,
|
||||
AAUDIO_STREAMBUILDER_OPEN_STREAM_FAILED,
|
||||
AAUDIO_PTHREAD_CREATE_FAILED,
|
||||
AAUDIO_RESTARTING_STREAM_AFTER_ERROR,
|
||||
USING_AAUDIO_BACKEND,
|
||||
AAUDIO_CREATE_STREAMBUILDER_FAILED,
|
||||
COREAUDIO_NEW_OUTPUT_FAILED,
|
||||
COREAUDIO_ALLOCATE_BUFFER_FAILED,
|
||||
COREAUDIO_START_FAILED,
|
||||
BACKEND_BUFFER_SIZE_ISNT_MULTIPLE_OF_PACKET_SIZE,
|
||||
}
|
||||
|
||||
/*
|
||||
saudio_logger
|
||||
|
||||
Used in saudio_desc to provide a custom logging and error reporting
|
||||
callback to sokol-audio.
|
||||
*/
|
||||
Logger :: struct {
|
||||
func : proc "c" (a0: cstring, a1: u32, a2: u32, a3: cstring, a4: u32, a5: cstring, a6: rawptr),
|
||||
user_data : rawptr,
|
||||
}
|
||||
|
||||
/*
|
||||
saudio_allocator
|
||||
|
||||
Used in saudio_desc to provide custom memory-alloc and -free functions
|
||||
to sokol_audio.h. If memory management should be overridden, both the
|
||||
alloc_fn and free_fn function must be provided (e.g. it's not valid to
|
||||
override one function but not the other).
|
||||
*/
|
||||
Allocator :: struct {
|
||||
alloc_fn : proc "c" (a0: c.size_t, a1: rawptr) -> rawptr,
|
||||
free_fn : proc "c" (a0: rawptr, a1: rawptr),
|
||||
user_data : rawptr,
|
||||
}
|
||||
|
||||
Desc :: struct {
|
||||
sample_rate : c.int,
|
||||
num_channels : c.int,
|
||||
buffer_frames : c.int,
|
||||
packet_frames : c.int,
|
||||
num_packets : c.int,
|
||||
stream_cb : proc "c" (a0: ^f32, a1: c.int, a2: c.int),
|
||||
stream_userdata_cb : proc "c" (a0: ^f32, a1: c.int, a2: c.int, a3: rawptr),
|
||||
user_data : rawptr,
|
||||
allocator : Allocator,
|
||||
logger : Logger,
|
||||
}
|
||||
|
49
thirdparty/sokol/build_clibs_linux.sh
vendored
Normal file
49
thirdparty/sokol/build_clibs_linux.sh
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
set -e
|
||||
|
||||
build_lib_x64_release() {
|
||||
src=$1
|
||||
dst=$2
|
||||
backend=$3
|
||||
echo $dst
|
||||
# static
|
||||
cc -pthread -c -O2 -DNDEBUG -DIMPL -D$backend c/$src.c
|
||||
ar rcs $dst.a $src.o
|
||||
# shared
|
||||
cc -pthread -shared -O2 -fPIC -DNDEBUG -DIMPL -D$backend -o $dst.so c/$src.c
|
||||
}
|
||||
|
||||
build_lib_x64_debug() {
|
||||
src=$1
|
||||
dst=$2
|
||||
backend=$3
|
||||
echo $dst
|
||||
# static
|
||||
cc -pthread -c -g -DIMPL -D$backend c/$src.c
|
||||
ar rcs $dst.a $src.o
|
||||
# shared
|
||||
cc -pthread -shared -g -fPIC -DIMPL -D$backend -o $dst.so c/$src.c
|
||||
}
|
||||
|
||||
# x64 + GL + Release
|
||||
build_lib_x64_release sokol_log log/sokol_log_linux_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_gfx gfx/sokol_gfx_linux_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_app app/sokol_app_linux_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_glue glue/sokol_glue_linux_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_time time/sokol_time_linux_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_audio audio/sokol_audio_linux_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_debugtext debugtext/sokol_debugtext_linux_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_shape shape/sokol_shape_linux_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_gl gl/sokol_gl_linux_x64_gl_release SOKOL_GLCORE
|
||||
|
||||
# x64 + GL + Debug
|
||||
build_lib_x64_debug sokol_log log/sokol_log_linux_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_gfx gfx/sokol_gfx_linux_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_app app/sokol_app_linux_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_glue glue/sokol_glue_linux_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_time time/sokol_time_linux_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_audio audio/sokol_audio_linux_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_debugtext debugtext/sokol_debugtext_linux_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_shape shape/sokol_shape_linux_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_gl gl/sokol_gl_linux_x64_gl_debug SOKOL_GLCORE
|
||||
|
||||
rm *.o
|
127
thirdparty/sokol/build_clibs_macos.sh
vendored
Normal file
127
thirdparty/sokol/build_clibs_macos.sh
vendored
Normal file
@@ -0,0 +1,127 @@
|
||||
set -e
|
||||
|
||||
build_lib_arm64_release() {
|
||||
src=$1
|
||||
dst=$2
|
||||
backend=$3
|
||||
echo $dst
|
||||
MACOSX_DEPLOYMENT_TARGET=10.13 clang -c -O2 -x objective-c -arch arm64 -DNDEBUG -DIMPL -D$backend c/$src.c
|
||||
ar rcs $dst.a $src.o
|
||||
}
|
||||
|
||||
build_lib_arm64_debug() {
|
||||
src=$1
|
||||
dst=$2
|
||||
backend=$3
|
||||
echo $dst
|
||||
MACOSX_DEPLOYMENT_TARGET=10.13 clang -c -g -x objective-c -arch arm64 -DIMPL -D$backend c/$src.c
|
||||
ar rcs $dst.a $src.o
|
||||
}
|
||||
|
||||
build_lib_x64_release() {
|
||||
src=$1
|
||||
dst=$2
|
||||
backend=$3
|
||||
echo $dst
|
||||
MACOSX_DEPLOYMENT_TARGET=10.13 clang -c -O2 -x objective-c -arch x86_64 -DNDEBUG -DIMPL -D$backend c/$src.c
|
||||
ar rcs $dst.a $src.o
|
||||
}
|
||||
|
||||
build_lib_x64_debug() {
|
||||
src=$1
|
||||
dst=$2
|
||||
backend=$3
|
||||
echo $dst
|
||||
MACOSX_DEPLOYMENT_TARGET=10.13 clang -c -g -x objective-c -arch x86_64 -DIMPL -D$backend c/$src.c
|
||||
ar rcs $dst.a $src.o
|
||||
}
|
||||
|
||||
# ARM + Metal + Release
|
||||
build_lib_arm64_release sokol_log log/sokol_log_macos_arm64_metal_release SOKOL_METAL
|
||||
build_lib_arm64_release sokol_gfx gfx/sokol_gfx_macos_arm64_metal_release SOKOL_METAL
|
||||
build_lib_arm64_release sokol_app app/sokol_app_macos_arm64_metal_release SOKOL_METAL
|
||||
build_lib_arm64_release sokol_glue glue/sokol_glue_macos_arm64_metal_release SOKOL_METAL
|
||||
build_lib_arm64_release sokol_time time/sokol_time_macos_arm64_metal_release SOKOL_METAL
|
||||
build_lib_arm64_release sokol_audio audio/sokol_audio_macos_arm64_metal_release SOKOL_METAL
|
||||
build_lib_arm64_release sokol_debugtext debugtext/sokol_debugtext_macos_arm64_metal_release SOKOL_METAL
|
||||
build_lib_arm64_release sokol_shape shape/sokol_shape_macos_arm64_metal_release SOKOL_METAL
|
||||
build_lib_arm64_release sokol_gl gl/sokol_gl_macos_arm64_metal_release SOKOL_METAL
|
||||
|
||||
# ARM + Metal + Debug
|
||||
build_lib_arm64_debug sokol_log log/sokol_log_macos_arm64_metal_debug SOKOL_METAL
|
||||
build_lib_arm64_debug sokol_gfx gfx/sokol_gfx_macos_arm64_metal_debug SOKOL_METAL
|
||||
build_lib_arm64_debug sokol_app app/sokol_app_macos_arm64_metal_debug SOKOL_METAL
|
||||
build_lib_arm64_debug sokol_glue glue/sokol_glue_macos_arm64_metal_debug SOKOL_METAL
|
||||
build_lib_arm64_debug sokol_time time/sokol_time_macos_arm64_metal_debug SOKOL_METAL
|
||||
build_lib_arm64_debug sokol_audio audio/sokol_audio_macos_arm64_metal_debug SOKOL_METAL
|
||||
build_lib_arm64_debug sokol_debugtext debugtext/sokol_debugtext_macos_arm64_metal_debug SOKOL_METAL
|
||||
build_lib_arm64_debug sokol_shape shape/sokol_shape_macos_arm64_metal_debug SOKOL_METAL
|
||||
build_lib_arm64_debug sokol_gl gl/sokol_gl_macos_arm64_metal_debug SOKOL_METAL
|
||||
|
||||
# x64 + Metal + Release
|
||||
build_lib_x64_release sokol_log log/sokol_log_macos_x64_metal_release SOKOL_METAL
|
||||
build_lib_x64_release sokol_gfx gfx/sokol_gfx_macos_x64_metal_release SOKOL_METAL
|
||||
build_lib_x64_release sokol_app app/sokol_app_macos_x64_metal_release SOKOL_METAL
|
||||
build_lib_x64_release sokol_glue glue/sokol_glue_macos_x64_metal_release SOKOL_METAL
|
||||
build_lib_x64_release sokol_time time/sokol_time_macos_x64_metal_release SOKOL_METAL
|
||||
build_lib_x64_release sokol_audio audio/sokol_audio_macos_x64_metal_release SOKOL_METAL
|
||||
build_lib_x64_release sokol_debugtext debugtext/sokol_debugtext_macos_x64_metal_release SOKOL_METAL
|
||||
build_lib_x64_release sokol_shape shape/sokol_shape_macos_x64_metal_release SOKOL_METAL
|
||||
build_lib_x64_release sokol_gl gl/sokol_gl_macos_x64_metal_release SOKOL_METAL
|
||||
|
||||
# x64 + Metal + Debug
|
||||
build_lib_x64_debug sokol_log log/sokol_log_macos_x64_metal_debug SOKOL_METAL
|
||||
build_lib_x64_debug sokol_gfx gfx/sokol_gfx_macos_x64_metal_debug SOKOL_METAL
|
||||
build_lib_x64_debug sokol_app app/sokol_app_macos_x64_metal_debug SOKOL_METAL
|
||||
build_lib_x64_debug sokol_glue glue/sokol_glue_macos_x64_metal_debug SOKOL_METAL
|
||||
build_lib_x64_debug sokol_time time/sokol_time_macos_x64_metal_debug SOKOL_METAL
|
||||
build_lib_x64_debug sokol_audio audio/sokol_audio_macos_x64_metal_debug SOKOL_METAL
|
||||
build_lib_x64_debug sokol_debugtext debugtext/sokol_debugtext_macos_x64_metal_debug SOKOL_METAL
|
||||
build_lib_x64_debug sokol_shape shape/sokol_shape_macos_x64_metal_debug SOKOL_METAL
|
||||
build_lib_x64_debug sokol_gl gl/sokol_gl_macos_x64_metal_debug SOKOL_METAL
|
||||
|
||||
# ARM + GL + Release
|
||||
build_lib_arm64_release sokol_log log/sokol_log_macos_arm64_gl_release SOKOL_GLCORE
|
||||
build_lib_arm64_release sokol_gfx gfx/sokol_gfx_macos_arm64_gl_release SOKOL_GLCORE
|
||||
build_lib_arm64_release sokol_app app/sokol_app_macos_arm64_gl_release SOKOL_GLCORE
|
||||
build_lib_arm64_release sokol_glue glue/sokol_glue_macos_arm64_gl_release SOKOL_GLCORE
|
||||
build_lib_arm64_release sokol_time time/sokol_time_macos_arm64_gl_release SOKOL_GLCORE
|
||||
build_lib_arm64_release sokol_audio audio/sokol_audio_macos_arm64_gl_release SOKOL_GLCORE
|
||||
build_lib_arm64_release sokol_debugtext debugtext/sokol_debugtext_macos_arm64_gl_release SOKOL_GLCORE
|
||||
build_lib_arm64_release sokol_shape shape/sokol_shape_macos_arm64_gl_release SOKOL_GLCORE
|
||||
build_lib_arm64_release sokol_gl gl/sokol_gl_macos_arm64_gl_release SOKOL_GLCORE
|
||||
|
||||
# ARM + GL + Debug
|
||||
build_lib_arm64_debug sokol_log log/sokol_log_macos_arm64_gl_debug SOKOL_GLCORE
|
||||
build_lib_arm64_debug sokol_gfx gfx/sokol_gfx_macos_arm64_gl_debug SOKOL_GLCORE
|
||||
build_lib_arm64_debug sokol_app app/sokol_app_macos_arm64_gl_debug SOKOL_GLCORE
|
||||
build_lib_arm64_debug sokol_glue glue/sokol_glue_macos_arm64_gl_debug SOKOL_GLCORE
|
||||
build_lib_arm64_debug sokol_time time/sokol_time_macos_arm64_gl_debug SOKOL_GLCORE
|
||||
build_lib_arm64_debug sokol_audio audio/sokol_audio_macos_arm64_gl_debug SOKOL_GLCORE
|
||||
build_lib_arm64_debug sokol_debugtext debugtext/sokol_debugtext_macos_arm64_gl_debug SOKOL_GLCORE
|
||||
build_lib_arm64_debug sokol_shape shape/sokol_shape_macos_arm64_gl_debug SOKOL_GLCORE
|
||||
build_lib_arm64_debug sokol_gl gl/sokol_gl_macos_arm64_gl_debug SOKOL_GLCORE
|
||||
|
||||
# x64 + GL + Release
|
||||
build_lib_x64_release sokol_log log/sokol_log_macos_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_gfx gfx/sokol_gfx_macos_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_app app/sokol_app_macos_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_glue glue/sokol_glue_macos_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_time time/sokol_time_macos_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_audio audio/sokol_audio_macos_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_debugtext debugtext/sokol_debugtext_macos_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_shape shape/sokol_shape_macos_x64_gl_release SOKOL_GLCORE
|
||||
build_lib_x64_release sokol_gl gl/sokol_gl_macos_x64_gl_release SOKOL_GLCORE
|
||||
|
||||
# x64 + GL + Debug
|
||||
build_lib_x64_debug sokol_log log/sokol_log_macos_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_gfx gfx/sokol_gfx_macos_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_app app/sokol_app_macos_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_glue glue/sokol_glue_macos_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_time time/sokol_time_macos_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_audio audio/sokol_audio_macos_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_debugtext debugtext/sokol_debugtext_macos_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_shape shape/sokol_shape_macos_x64_gl_debug SOKOL_GLCORE
|
||||
build_lib_x64_debug sokol_gl gl/sokol_gl_macos_x64_gl_debug SOKOL_GLCORE
|
||||
|
||||
rm *.o
|
50
thirdparty/sokol/build_clibs_macos_dylib.sh
vendored
Normal file
50
thirdparty/sokol/build_clibs_macos_dylib.sh
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
set -e
|
||||
|
||||
FRAMEWORKS_METAL="-framework Metal -framework MetalKit"
|
||||
FRAMEWORKS_OPENGL="-framework OpenGL"
|
||||
FRAMEWORKS_CORE="-framework Foundation -framework CoreGraphics -framework Cocoa -framework QuartzCore -framework CoreAudio -framework AudioToolbox"
|
||||
|
||||
build_lib_release() {
|
||||
src=$1
|
||||
dst=$2
|
||||
backend=$3
|
||||
arch=$4
|
||||
frameworks=""
|
||||
if [ $backend = "SOKOL_METAL" ]; then
|
||||
frameworks="${frameworks} ${FRAMEWORKS_METAL}"
|
||||
else
|
||||
frameworks="${frameworks} ${FRAMEWORKS_OPENGL}"
|
||||
fi
|
||||
echo $dst
|
||||
MACOSX_DEPLOYMENT_TARGET=10.13 clang -c -O2 -x objective-c -arch $arch -DNDEBUG -DIMPL -D$backend c/$src.c
|
||||
clang -dynamiclib -arch $arch $FRAMEWORKS_CORE $frameworks -o $dst.dylib $src.o $dep
|
||||
}
|
||||
|
||||
build_lib_debug() {
|
||||
src=$1
|
||||
dst=$2
|
||||
backend=$3
|
||||
arch=$4
|
||||
frameworks=""
|
||||
if [ $backend = "SOKOL_METAL" ]; then
|
||||
frameworks="${frameworks} ${FRAMEWORKS_METAL}"
|
||||
else
|
||||
frameworks="${frameworks} ${FRAMEWORKS_OPENGL}"
|
||||
fi
|
||||
echo $dst
|
||||
MACOSX_DEPLOYMENT_TARGET=10.13 clang -c -g -x objective-c -arch $arch -DIMPL -D$backend c/$src.c
|
||||
clang -dynamiclib -arch $arch $FRAMEWORKS_CORE $frameworks -o $dst.dylib $src.o $dep
|
||||
}
|
||||
|
||||
mkdir -p dylib
|
||||
|
||||
build_lib_release sokol dylib/sokol_dylib_macos_arm64_metal_release SOKOL_METAL arm64
|
||||
build_lib_debug sokol dylib/sokol_dylib_macos_arm64_metal_debug SOKOL_METAL arm64
|
||||
build_lib_release sokol dylib/sokol_dylib_macos_x64_metal_release SOKOL_METAL x86_64
|
||||
build_lib_debug sokol dylib/sokol_dylib_macos_x64_metal_debug SOKOL_METAL x86_64
|
||||
build_lib_release sokol dylib/sokol_dylib_macos_arm64_gl_release SOKOL_GLCORE arm64
|
||||
build_lib_debug sokol dylib/sokol_dylib_macos_arm64_gl_debug SOKOL_GLCORE arm64
|
||||
build_lib_release sokol dylib/sokol_dylib_macos_x64_gl_release SOKOL_GLCORE x86_64
|
||||
build_lib_debug sokol dylib/sokol_dylib_macos_x64_gl_debug SOKOL_GLCORE x86_64
|
||||
|
||||
rm *.o
|
19
thirdparty/sokol/build_clibs_wasm.bat
vendored
Normal file
19
thirdparty/sokol/build_clibs_wasm.bat
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
@echo off
|
||||
|
||||
set sources=log app gfx glue time audio debugtext shape gl
|
||||
|
||||
REM Debug
|
||||
for %%s in (%sources%) do (
|
||||
echo %%s\sokol_%%s_wasm_gl_debug.a
|
||||
call emcc -c -g -DIMPL -DSOKOL_GLES3 c\sokol_%%s.c
|
||||
call emar rcs %%s\sokol_%%s_wasm_gl_debug.a sokol_%%s.o
|
||||
del sokol_%%s.o
|
||||
)
|
||||
|
||||
REM Release
|
||||
for %%s in (%sources%) do (
|
||||
echo %%s\sokol_%%s_wasm_gl_release.a
|
||||
call emcc -c -O2 -DNDEBUG -DIMPL -DSOKOL_GLES3 c\sokol_%%s.c
|
||||
call emar rcs %%s\sokol_%%s_wasm_gl_release.a sokol_%%s.o
|
||||
del sokol_%%s.o
|
||||
)
|
20
thirdparty/sokol/build_clibs_wasm.sh
vendored
Normal file
20
thirdparty/sokol/build_clibs_wasm.sh
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
declare -a libs=("log" "gfx" "app" "glue" "time" "audio" "debugtext" "shape" "gl")
|
||||
|
||||
for l in "${libs[@]}"
|
||||
do
|
||||
echo "${l}/sokol_${l}_wasm_gl_debug.a"
|
||||
emcc -c -g -DIMPL -DSOKOL_GLES3 c/sokol_$l.c
|
||||
emar rcs $l/sokol_${l}_wasm_gl_debug.a sokol_$l.o
|
||||
rm sokol_$l.o
|
||||
done
|
||||
|
||||
for l in "${libs[@]}"
|
||||
do
|
||||
echo "${l}/sokol_${l}_wasm_gl_release.a"
|
||||
emcc -c -O2 -DNDEBUG -DIMPL -DSOKOL_GLES3 c/sokol_$l.c
|
||||
emar rcs $l/sokol_${l}_wasm_gl_release.a sokol_$l.o
|
||||
rm sokol_$l.o
|
||||
done
|
45
thirdparty/sokol/build_clibs_windows.cmd
vendored
Normal file
45
thirdparty/sokol/build_clibs_windows.cmd
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
@echo off
|
||||
|
||||
set sources=log app gfx glue time audio debugtext shape gl
|
||||
|
||||
REM D3D11 Debug
|
||||
for %%s in (%sources%) do (
|
||||
cl /c /D_DEBUG /DIMPL /DSOKOL_D3D11 c\sokol_%%s.c /Z7
|
||||
lib /OUT:%%s\sokol_%%s_windows_x64_d3d11_debug.lib sokol_%%s.obj
|
||||
del sokol_%%s.obj
|
||||
)
|
||||
|
||||
REM D3D11 Release
|
||||
for %%s in (%sources%) do (
|
||||
cl /c /O2 /DNDEBUG /DIMPL /DSOKOL_D3D11 c\sokol_%%s.c
|
||||
lib /OUT:%%s\sokol_%%s_windows_x64_d3d11_release.lib sokol_%%s.obj
|
||||
del sokol_%%s.obj
|
||||
)
|
||||
|
||||
REM GL Debug
|
||||
for %%s in (%sources%) do (
|
||||
cl /c /D_DEBUG /DIMPL /DSOKOL_GLCORE c\sokol_%%s.c /Z7
|
||||
lib /OUT:%%s\sokol_%%s_windows_x64_gl_debug.lib sokol_%%s.obj
|
||||
del sokol_%%s.obj
|
||||
)
|
||||
|
||||
REM GL Release
|
||||
for %%s in (%sources%) do (
|
||||
cl /c /O2 /DNDEBUG /DIMPL /DSOKOL_GLCORE c\sokol_%%s.c
|
||||
lib /OUT:%%s\sokol_%%s_windows_x64_gl_release.lib sokol_%%s.obj
|
||||
del sokol_%%s.obj
|
||||
)
|
||||
|
||||
REM D3D11 Debug DLL
|
||||
cl /D_DEBUG /DIMPL /DSOKOL_DLL /DSOKOL_D3D11 c\sokol.c /Z7 /LDd /MDd /DLL /Fe:sokol_dll_windows_x64_d3d11_debug.dll /link /INCREMENTAL:NO
|
||||
|
||||
REM D3D11 Release DLL
|
||||
cl /D_DEBUG /DIMPL /DSOKOL_DLL /DSOKOL_D3D11 c\sokol.c /LD /MD /DLL /Fe:sokol_dll_windows_x64_d3d11_release.dll /link /INCREMENTAL:NO
|
||||
|
||||
REM GL Debug DLL
|
||||
cl /D_DEBUG /DIMPL /DSOKOL_DLL /DSOKOL_GLCORE c\sokol.c /Z7 /LDd /MDd /DLL /Fe:sokol_dll_windows_x64_gl_debug.dll /link /INCREMENTAL:NO
|
||||
|
||||
REM GL Release DLL
|
||||
cl /D_DEBUG /DIMPL /DSOKOL_DLL /DSOKOL_GLCORE c\sokol.c /LD /MD /DLL /Fe:sokol_dll_windows_x64_gl_release.dll /link /INCREMENTAL:NO
|
||||
|
||||
del sokol.obj
|
30
thirdparty/sokol/build_shaders_macos.sh
vendored
Normal file
30
thirdparty/sokol/build_shaders_macos.sh
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
set -e
|
||||
|
||||
sokol_tools_root=../sokol-tools-bin
|
||||
|
||||
build_shader() {
|
||||
name=$1
|
||||
dir=examples/$name
|
||||
if [[ $(arch) =~ "arm64" ]]
|
||||
then
|
||||
shdc=$sokol_tools_root/bin/osx_arm64/sokol-shdc
|
||||
else
|
||||
shdc=$sokol_tools_root/bin/osx/sokol-shdc
|
||||
fi
|
||||
echo $dir
|
||||
$shdc -i $dir/shader.glsl -o $dir/shader.odin -l glsl430:metal_macos:hlsl5 -f sokol_odin
|
||||
}
|
||||
|
||||
build_shader blend
|
||||
build_shader bufferoffsets
|
||||
build_shader cube
|
||||
build_shader instancing
|
||||
build_shader instancing-compute
|
||||
build_shader mrt
|
||||
build_shader noninterleaved
|
||||
build_shader offscreen
|
||||
build_shader quad
|
||||
build_shader shapes
|
||||
build_shader texcube
|
||||
build_shader triangle
|
||||
build_shader vertexpull
|
16
thirdparty/sokol/c/sokol.c
vendored
Normal file
16
thirdparty/sokol/c/sokol.c
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
#if defined(IMPL)
|
||||
#define SOKOL_IMPL
|
||||
#endif
|
||||
|
||||
#include "sokol_defines.h"
|
||||
|
||||
#include "sokol_audio.h"
|
||||
#include "sokol_app.h"
|
||||
#include "sokol_gfx.h"
|
||||
#include "sokol_log.h"
|
||||
#include "sokol_time.h"
|
||||
#include "sokol_glue.h"
|
||||
|
||||
#include "sokol_gl.h"
|
||||
#include "sokol_shape.h"
|
||||
#include "sokol_debugtext.h"
|
5
thirdparty/sokol/c/sokol_app.c
vendored
Normal file
5
thirdparty/sokol/c/sokol_app.c
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
#if defined(IMPL)
|
||||
#define SOKOL_APP_IMPL
|
||||
#endif
|
||||
#include "sokol_defines.h"
|
||||
#include "sokol_app.h"
|
12437
thirdparty/sokol/c/sokol_app.h
vendored
Normal file
12437
thirdparty/sokol/c/sokol_app.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
6
thirdparty/sokol/c/sokol_audio.c
vendored
Normal file
6
thirdparty/sokol/c/sokol_audio.c
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
#if defined(IMPL)
|
||||
#define SOKOL_AUDIO_IMPL
|
||||
#endif
|
||||
#include "sokol_defines.h"
|
||||
#include "sokol_audio.h"
|
||||
|
2310
thirdparty/sokol/c/sokol_audio.h
vendored
Normal file
2310
thirdparty/sokol/c/sokol_audio.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
7
thirdparty/sokol/c/sokol_debugtext.c
vendored
Normal file
7
thirdparty/sokol/c/sokol_debugtext.c
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
#if defined(IMPL)
|
||||
#define SOKOL_DEBUGTEXT_IMPL
|
||||
#endif
|
||||
#include "sokol_defines.h"
|
||||
#include "sokol_gfx.h"
|
||||
#include "sokol_debugtext.h"
|
||||
|
4989
thirdparty/sokol/c/sokol_debugtext.h
vendored
Normal file
4989
thirdparty/sokol/c/sokol_debugtext.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8
thirdparty/sokol/c/sokol_defines.h
vendored
Normal file
8
thirdparty/sokol/c/sokol_defines.h
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
#define SOKOL_NO_ENTRY
|
||||
#if defined(_WIN32)
|
||||
#define SOKOL_WIN32_FORCE_MAIN
|
||||
#endif
|
||||
// FIXME: macOS Zig HACK without this, some C stdlib headers throw errors
|
||||
#if defined(__APPLE__)
|
||||
#include <TargetConditionals.h>
|
||||
#endif
|
5
thirdparty/sokol/c/sokol_gfx.c
vendored
Normal file
5
thirdparty/sokol/c/sokol_gfx.c
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
#if defined(IMPL)
|
||||
#define SOKOL_GFX_IMPL
|
||||
#endif
|
||||
#include "sokol_defines.h"
|
||||
#include "sokol_gfx.h"
|
21518
thirdparty/sokol/c/sokol_gfx.h
vendored
Normal file
21518
thirdparty/sokol/c/sokol_gfx.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
6
thirdparty/sokol/c/sokol_gl.c
vendored
Normal file
6
thirdparty/sokol/c/sokol_gl.c
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
#if defined(IMPL)
|
||||
#define SOKOL_GL_IMPL
|
||||
#endif
|
||||
#include "sokol_defines.h"
|
||||
#include "sokol_gfx.h"
|
||||
#include "sokol_gl.h"
|
4811
thirdparty/sokol/c/sokol_gl.h
vendored
Normal file
4811
thirdparty/sokol/c/sokol_gl.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
7
thirdparty/sokol/c/sokol_glue.c
vendored
Normal file
7
thirdparty/sokol/c/sokol_glue.c
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
#if defined(IMPL)
|
||||
#define SOKOL_GLUE_IMPL
|
||||
#endif
|
||||
#include "sokol_defines.h"
|
||||
#include "sokol_app.h"
|
||||
#include "sokol_gfx.h"
|
||||
#include "sokol_glue.h"
|
162
thirdparty/sokol/c/sokol_glue.h
vendored
Normal file
162
thirdparty/sokol/c/sokol_glue.h
vendored
Normal file
@@ -0,0 +1,162 @@
|
||||
#if defined(SOKOL_IMPL) && !defined(SOKOL_GLUE_IMPL)
|
||||
#define SOKOL_GLUE_IMPL
|
||||
#endif
|
||||
#ifndef SOKOL_GLUE_INCLUDED
|
||||
/*
|
||||
sokol_glue.h -- glue helper functions for sokol headers
|
||||
|
||||
Project URL: https://github.com/floooh/sokol
|
||||
|
||||
Do this:
|
||||
#define SOKOL_IMPL or
|
||||
#define SOKOL_GLUE_IMPL
|
||||
before you include this file in *one* C or C++ file to create the
|
||||
implementation.
|
||||
|
||||
...optionally provide the following macros to override defaults:
|
||||
|
||||
SOKOL_ASSERT(c) - your own assert macro (default: assert(c))
|
||||
SOKOL_GLUE_API_DECL - public function declaration prefix (default: extern)
|
||||
SOKOL_API_DECL - same as SOKOL_GLUE_API_DECL
|
||||
SOKOL_API_IMPL - public function implementation prefix (default: -)
|
||||
|
||||
If sokol_glue.h is compiled as a DLL, define the following before
|
||||
including the declaration or implementation:
|
||||
|
||||
SOKOL_DLL
|
||||
|
||||
On Windows, SOKOL_DLL will define SOKOL_GLUE_API_DECL as __declspec(dllexport)
|
||||
or __declspec(dllimport) as needed.
|
||||
|
||||
OVERVIEW
|
||||
========
|
||||
sokol_glue.h provides glue helper functions between sokol_gfx.h and sokol_app.h,
|
||||
so that sokol_gfx.h doesn't need to depend on sokol_app.h but can be
|
||||
used with different window system glue libraries.
|
||||
|
||||
PROVIDED FUNCTIONS
|
||||
==================
|
||||
|
||||
sg_environment sglue_environment(void)
|
||||
|
||||
Returns an sg_environment struct initialized by calling sokol_app.h
|
||||
functions. Use this in the sg_setup() call like this:
|
||||
|
||||
sg_setup(&(sg_desc){
|
||||
.environment = sglue_environment(),
|
||||
...
|
||||
});
|
||||
|
||||
sg_swapchain sglue_swapchain(void)
|
||||
|
||||
Returns an sg_swapchain struct initialized by calling sokol_app.h
|
||||
functions. Use this in sg_begin_pass() for a 'swapchain pass' like
|
||||
this:
|
||||
|
||||
sg_begin_pass(&(sg_pass){ .swapchain = sglue_swapchain(), ... });
|
||||
|
||||
LICENSE
|
||||
=======
|
||||
zlib/libpng license
|
||||
|
||||
Copyright (c) 2018 Andre Weissflog
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty.
|
||||
In no event will the authors be held liable for any damages arising from the
|
||||
use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software in a
|
||||
product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
*/
|
||||
#define SOKOL_GLUE_INCLUDED
|
||||
|
||||
#if defined(SOKOL_API_DECL) && !defined(SOKOL_GLUE_API_DECL)
|
||||
#define SOKOL_GLUE_API_DECL SOKOL_API_DECL
|
||||
#endif
|
||||
#ifndef SOKOL_GLUE_API_DECL
|
||||
#if defined(_WIN32) && defined(SOKOL_DLL) && defined(SOKOL_GLUE_IMPL)
|
||||
#define SOKOL_GLUE_API_DECL __declspec(dllexport)
|
||||
#elif defined(_WIN32) && defined(SOKOL_DLL)
|
||||
#define SOKOL_GLUE_API_DECL __declspec(dllimport)
|
||||
#else
|
||||
#define SOKOL_GLUE_API_DECL extern
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SOKOL_GFX_INCLUDED
|
||||
#error "Please include sokol_gfx.h before sokol_glue.h"
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
SOKOL_GLUE_API_DECL sg_environment sglue_environment(void);
|
||||
SOKOL_GLUE_API_DECL sg_swapchain sglue_swapchain(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
#endif /* SOKOL_GLUE_INCLUDED */
|
||||
|
||||
/*-- IMPLEMENTATION ----------------------------------------------------------*/
|
||||
#ifdef SOKOL_GLUE_IMPL
|
||||
#define SOKOL_GLUE_IMPL_INCLUDED (1)
|
||||
#include <string.h> /* memset */
|
||||
|
||||
#ifndef SOKOL_APP_INCLUDED
|
||||
#error "Please include sokol_app.h before the sokol_glue.h implementation"
|
||||
#endif
|
||||
|
||||
#ifndef SOKOL_API_IMPL
|
||||
#define SOKOL_API_IMPL
|
||||
#endif
|
||||
|
||||
|
||||
SOKOL_API_IMPL sg_environment sglue_environment(void) {
|
||||
sg_environment env;
|
||||
memset(&env, 0, sizeof(env));
|
||||
env.defaults.color_format = (sg_pixel_format) sapp_color_format();
|
||||
env.defaults.depth_format = (sg_pixel_format) sapp_depth_format();
|
||||
env.defaults.sample_count = sapp_sample_count();
|
||||
env.metal.device = sapp_metal_get_device();
|
||||
env.d3d11.device = sapp_d3d11_get_device();
|
||||
env.d3d11.device_context = sapp_d3d11_get_device_context();
|
||||
env.wgpu.device = sapp_wgpu_get_device();
|
||||
return env;
|
||||
}
|
||||
|
||||
SOKOL_API_IMPL sg_swapchain sglue_swapchain(void) {
|
||||
sg_swapchain swapchain;
|
||||
memset(&swapchain, 0, sizeof(swapchain));
|
||||
swapchain.width = sapp_width();
|
||||
swapchain.height = sapp_height();
|
||||
swapchain.sample_count = sapp_sample_count();
|
||||
swapchain.color_format = (sg_pixel_format)sapp_color_format();
|
||||
swapchain.depth_format = (sg_pixel_format)sapp_depth_format();
|
||||
swapchain.metal.current_drawable = sapp_metal_get_current_drawable();
|
||||
swapchain.metal.depth_stencil_texture = sapp_metal_get_depth_stencil_texture();
|
||||
swapchain.metal.msaa_color_texture = sapp_metal_get_msaa_color_texture();
|
||||
swapchain.d3d11.render_view = sapp_d3d11_get_render_view();
|
||||
swapchain.d3d11.resolve_view = sapp_d3d11_get_resolve_view();
|
||||
swapchain.d3d11.depth_stencil_view = sapp_d3d11_get_depth_stencil_view();
|
||||
swapchain.wgpu.render_view = sapp_wgpu_get_render_view();
|
||||
swapchain.wgpu.resolve_view = sapp_wgpu_get_resolve_view();
|
||||
swapchain.wgpu.depth_stencil_view = sapp_wgpu_get_depth_stencil_view();
|
||||
swapchain.gl.framebuffer = sapp_gl_get_framebuffer();
|
||||
return swapchain;
|
||||
}
|
||||
|
||||
#endif /* SOKOL_GLUE_IMPL */
|
5
thirdparty/sokol/c/sokol_log.c
vendored
Normal file
5
thirdparty/sokol/c/sokol_log.c
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
#if defined(IMPL)
|
||||
#define SOKOL_LOG_IMPL
|
||||
#endif
|
||||
#include "sokol_defines.h"
|
||||
#include "sokol_log.h"
|
334
thirdparty/sokol/c/sokol_log.h
vendored
Normal file
334
thirdparty/sokol/c/sokol_log.h
vendored
Normal file
@@ -0,0 +1,334 @@
|
||||
#if defined(SOKOL_IMPL) && !defined(SOKOL_LOG_IMPL)
|
||||
#define SOKOL_LOG_IMPL
|
||||
#endif
|
||||
#ifndef SOKOL_LOG_INCLUDED
|
||||
/*
|
||||
sokol_log.h -- common logging callback for sokol headers
|
||||
|
||||
Project URL: https://github.com/floooh/sokol
|
||||
|
||||
Example code: https://github.com/floooh/sokol-samples
|
||||
|
||||
Do this:
|
||||
#define SOKOL_IMPL or
|
||||
#define SOKOL_LOG_IMPL
|
||||
before you include this file in *one* C or C++ file to create the
|
||||
implementation.
|
||||
|
||||
Optionally provide the following defines when building the implementation:
|
||||
|
||||
SOKOL_ASSERT(c) - your own assert macro (default: assert(c))
|
||||
SOKOL_UNREACHABLE() - a guard macro for unreachable code (default: assert(false))
|
||||
SOKOL_LOG_API_DECL - public function declaration prefix (default: extern)
|
||||
SOKOL_API_DECL - same as SOKOL_GFX_API_DECL
|
||||
SOKOL_API_IMPL - public function implementation prefix (default: -)
|
||||
|
||||
Optionally define the following for verbose output:
|
||||
|
||||
SOKOL_DEBUG - by default this is defined if _DEBUG is defined
|
||||
|
||||
|
||||
OVERVIEW
|
||||
========
|
||||
sokol_log.h provides a default logging callback for other sokol headers.
|
||||
|
||||
To use the default log callback, just include sokol_log.h and provide
|
||||
a function pointer to the 'slog_func' function when setting up the
|
||||
sokol library:
|
||||
|
||||
For instance with sokol_audio.h:
|
||||
|
||||
#include "sokol_log.h"
|
||||
...
|
||||
saudio_setup(&(saudio_desc){ .logger.func = slog_func });
|
||||
|
||||
Logging output goes to stderr and/or a platform specific logging subsystem
|
||||
(which means that in some scenarios you might see logging messages duplicated):
|
||||
|
||||
- Windows: stderr + OutputDebugStringA()
|
||||
- macOS/iOS/Linux: stderr + syslog()
|
||||
- Emscripten: console.info()/warn()/error()
|
||||
- Android: __android_log_write()
|
||||
|
||||
On Windows with sokol_app.h also note the runtime config items to make
|
||||
stdout/stderr output visible on the console for WinMain() applications
|
||||
via sapp_desc.win32_console_attach or sapp_desc.win32_console_create,
|
||||
however when running in a debugger on Windows, the logging output should
|
||||
show up on the debug output UI panel.
|
||||
|
||||
In debug mode, a log message might look like this:
|
||||
|
||||
[sspine][error][id:12] /Users/floh/projects/sokol/util/sokol_spine.h:3472:0:
|
||||
SKELETON_DESC_NO_ATLAS: no atlas object provided in sspine_skeleton_desc.atlas
|
||||
|
||||
The source path and line number is formatted like compiler errors, in some IDEs (like VSCode)
|
||||
such error messages are clickable.
|
||||
|
||||
In release mode, logging is less verbose as to not bloat the executable with string data, but you still get
|
||||
enough information to identify the type and location of an error:
|
||||
|
||||
[sspine][error][id:12][line:3472]
|
||||
|
||||
RULES FOR WRITING YOUR OWN LOGGING FUNCTION
|
||||
===========================================
|
||||
- must be re-entrant because it might be called from different threads
|
||||
- must treat **all** provided string pointers as optional (can be null)
|
||||
- don't store the string pointers, copy the string data instead
|
||||
- must not return for log level panic
|
||||
|
||||
LICENSE
|
||||
=======
|
||||
zlib/libpng license
|
||||
|
||||
Copyright (c) 2023 Andre Weissflog
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty.
|
||||
In no event will the authors be held liable for any damages arising from the
|
||||
use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software in a
|
||||
product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
*/
|
||||
#define SOKOL_LOG_INCLUDED (1)
|
||||
#include <stdint.h>
|
||||
|
||||
#if defined(SOKOL_API_DECL) && !defined(SOKOL_LOG_API_DECL)
|
||||
#define SOKOL_LOG_API_DECL SOKOL_API_DECL
|
||||
#endif
|
||||
#ifndef SOKOL_LOG_API_DECL
|
||||
#if defined(_WIN32) && defined(SOKOL_DLL) && defined(SOKOL_LOG_IMPL)
|
||||
#define SOKOL_LOG_API_DECL __declspec(dllexport)
|
||||
#elif defined(_WIN32) && defined(SOKOL_DLL)
|
||||
#define SOKOL_LOG_API_DECL __declspec(dllimport)
|
||||
#else
|
||||
#define SOKOL_LOG_API_DECL extern
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
Plug this function into the 'logger.func' struct item when initializing any of the sokol
|
||||
headers. For instance for sokol_audio.h it would look like this:
|
||||
|
||||
saudio_setup(&(saudio_desc){
|
||||
.logger = {
|
||||
.func = slog_func
|
||||
}
|
||||
});
|
||||
*/
|
||||
SOKOL_LOG_API_DECL void slog_func(const char* tag, uint32_t log_level, uint32_t log_item, const char* message, uint32_t line_nr, const char* filename, void* user_data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
#endif // SOKOL_LOG_INCLUDED
|
||||
|
||||
// ██ ███ ███ ██████ ██ ███████ ███ ███ ███████ ███ ██ ████████ █████ ████████ ██ ██████ ███ ██
|
||||
// ██ ████ ████ ██ ██ ██ ██ ████ ████ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██
|
||||
// ██ ██ ████ ██ ██████ ██ █████ ██ ████ ██ █████ ██ ██ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██
|
||||
// ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||
// ██ ██ ██ ██ ███████ ███████ ██ ██ ███████ ██ ████ ██ ██ ██ ██ ██ ██████ ██ ████
|
||||
//
|
||||
// >>implementation
|
||||
#ifdef SOKOL_LOG_IMPL
|
||||
#define SOKOL_LOG_IMPL_INCLUDED (1)
|
||||
|
||||
#ifndef SOKOL_API_IMPL
|
||||
#define SOKOL_API_IMPL
|
||||
#endif
|
||||
#ifndef SOKOL_DEBUG
|
||||
#ifndef NDEBUG
|
||||
#define SOKOL_DEBUG
|
||||
#endif
|
||||
#endif
|
||||
#ifndef SOKOL_ASSERT
|
||||
#include <assert.h>
|
||||
#define SOKOL_ASSERT(c) assert(c)
|
||||
#endif
|
||||
|
||||
#ifndef _SOKOL_PRIVATE
|
||||
#if defined(__GNUC__) || defined(__clang__)
|
||||
#define _SOKOL_PRIVATE __attribute__((unused)) static
|
||||
#else
|
||||
#define _SOKOL_PRIVATE static
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef _SOKOL_UNUSED
|
||||
#define _SOKOL_UNUSED(x) (void)(x)
|
||||
#endif
|
||||
|
||||
// platform detection
|
||||
#if defined(__APPLE__)
|
||||
#define _SLOG_APPLE (1)
|
||||
#elif defined(__EMSCRIPTEN__)
|
||||
#define _SLOG_EMSCRIPTEN (1)
|
||||
#elif defined(_WIN32)
|
||||
#define _SLOG_WINDOWS (1)
|
||||
#elif defined(__ANDROID__)
|
||||
#define _SLOG_ANDROID (1)
|
||||
#elif defined(__linux__) || defined(__unix__)
|
||||
#define _SLOG_LINUX (1)
|
||||
#else
|
||||
#error "sokol_log.h: unknown platform"
|
||||
#endif
|
||||
|
||||
#include <stdlib.h> // abort
|
||||
#include <stdio.h> // fputs
|
||||
#include <stddef.h> // size_t
|
||||
|
||||
#if defined(_SLOG_EMSCRIPTEN)
|
||||
#include <emscripten/emscripten.h>
|
||||
#elif defined(_SLOG_WINDOWS)
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#ifndef NOMINMAX
|
||||
#define NOMINMAX
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#elif defined(_SLOG_ANDROID)
|
||||
#include <android/log.h>
|
||||
#elif defined(_SLOG_LINUX) || defined(_SLOG_APPLE)
|
||||
#include <syslog.h>
|
||||
#endif
|
||||
|
||||
// size of line buffer (on stack!) in bytes including terminating zero
|
||||
#define _SLOG_LINE_LENGTH (512)
|
||||
|
||||
_SOKOL_PRIVATE char* _slog_append(const char* str, char* dst, char* end) {
|
||||
if (str) {
|
||||
char c;
|
||||
while (((c = *str++) != 0) && (dst < (end - 1))) {
|
||||
*dst++ = c;
|
||||
}
|
||||
}
|
||||
*dst = 0;
|
||||
return dst;
|
||||
}
|
||||
|
||||
_SOKOL_PRIVATE char* _slog_itoa(uint32_t x, char* buf, size_t buf_size) {
|
||||
const size_t max_digits_and_null = 11;
|
||||
if (buf_size < max_digits_and_null) {
|
||||
return 0;
|
||||
}
|
||||
char* p = buf + max_digits_and_null;
|
||||
*--p = 0;
|
||||
do {
|
||||
*--p = '0' + (x % 10);
|
||||
x /= 10;
|
||||
} while (x != 0);
|
||||
return p;
|
||||
}
|
||||
|
||||
#if defined(_SLOG_EMSCRIPTEN)
|
||||
EM_JS(void, slog_js_log, (uint32_t level, const char* c_str), {
|
||||
const str = UTF8ToString(c_str);
|
||||
switch (level) {
|
||||
case 0: console.error(str); break;
|
||||
case 1: console.error(str); break;
|
||||
case 2: console.warn(str); break;
|
||||
default: console.info(str); break;
|
||||
}
|
||||
})
|
||||
#endif
|
||||
|
||||
SOKOL_API_IMPL void slog_func(const char* tag, uint32_t log_level, uint32_t log_item, const char* message, uint32_t line_nr, const char* filename, void* user_data) {
|
||||
_SOKOL_UNUSED(user_data);
|
||||
|
||||
const char* log_level_str;
|
||||
switch (log_level) {
|
||||
case 0: log_level_str = "panic"; break;
|
||||
case 1: log_level_str = "error"; break;
|
||||
case 2: log_level_str = "warning"; break;
|
||||
default: log_level_str = "info"; break;
|
||||
}
|
||||
|
||||
// build log output line
|
||||
char line_buf[_SLOG_LINE_LENGTH];
|
||||
char* str = line_buf;
|
||||
char* end = line_buf + sizeof(line_buf);
|
||||
char num_buf[32];
|
||||
if (tag) {
|
||||
str = _slog_append("[", str, end);
|
||||
str = _slog_append(tag, str, end);
|
||||
str = _slog_append("]", str, end);
|
||||
}
|
||||
str = _slog_append("[", str, end);
|
||||
str = _slog_append(log_level_str, str, end);
|
||||
str = _slog_append("]", str, end);
|
||||
str = _slog_append("[id:", str, end);
|
||||
str = _slog_append(_slog_itoa(log_item, num_buf, sizeof(num_buf)), str, end);
|
||||
str = _slog_append("]", str, end);
|
||||
// if a filename is provided, build a clickable log message that's compatible with compiler error messages
|
||||
if (filename) {
|
||||
str = _slog_append(" ", str, end);
|
||||
#if defined(_MSC_VER)
|
||||
// MSVC compiler error format
|
||||
str = _slog_append(filename, str, end);
|
||||
str = _slog_append("(", str, end);
|
||||
str = _slog_append(_slog_itoa(line_nr, num_buf, sizeof(num_buf)), str, end);
|
||||
str = _slog_append("): ", str, end);
|
||||
#else
|
||||
// gcc/clang compiler error format
|
||||
str = _slog_append(filename, str, end);
|
||||
str = _slog_append(":", str, end);
|
||||
str = _slog_append(_slog_itoa(line_nr, num_buf, sizeof(num_buf)), str, end);
|
||||
str = _slog_append(":0: ", str, end);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
str = _slog_append("[line:", str, end);
|
||||
str = _slog_append(_slog_itoa(line_nr, num_buf, sizeof(num_buf)), str, end);
|
||||
str = _slog_append("] ", str, end);
|
||||
}
|
||||
if (message) {
|
||||
str = _slog_append("\n\t", str, end);
|
||||
str = _slog_append(message, str, end);
|
||||
}
|
||||
str = _slog_append("\n\n", str, end);
|
||||
if (0 == log_level) {
|
||||
str = _slog_append("ABORTING because of [panic]\n", str, end);
|
||||
(void)str;
|
||||
}
|
||||
|
||||
// print to stderr?
|
||||
#if defined(_SLOG_LINUX) || defined(_SLOG_WINDOWS) || defined(_SLOG_APPLE)
|
||||
fputs(line_buf, stderr);
|
||||
#endif
|
||||
|
||||
// platform specific logging calls
|
||||
#if defined(_SLOG_WINDOWS)
|
||||
OutputDebugStringA(line_buf);
|
||||
#elif defined(_SLOG_ANDROID)
|
||||
int prio;
|
||||
switch (log_level) {
|
||||
case 0: prio = ANDROID_LOG_FATAL; break;
|
||||
case 1: prio = ANDROID_LOG_ERROR; break;
|
||||
case 2: prio = ANDROID_LOG_WARN; break;
|
||||
default: prio = ANDROID_LOG_INFO; break;
|
||||
}
|
||||
__android_log_write(prio, "SOKOL", line_buf);
|
||||
#elif defined(_SLOG_EMSCRIPTEN)
|
||||
slog_js_log(log_level, line_buf);
|
||||
#endif
|
||||
if (0 == log_level) {
|
||||
abort();
|
||||
}
|
||||
}
|
||||
#endif // SOKOL_LOG_IMPL
|
6
thirdparty/sokol/c/sokol_shape.c
vendored
Normal file
6
thirdparty/sokol/c/sokol_shape.c
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
#if defined(IMPL)
|
||||
#define SOKOL_SHAPE_IMPL
|
||||
#endif
|
||||
#include "sokol_defines.h"
|
||||
#include "sokol_gfx.h"
|
||||
#include "sokol_shape.h"
|
1431
thirdparty/sokol/c/sokol_shape.h
vendored
Normal file
1431
thirdparty/sokol/c/sokol_shape.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5
thirdparty/sokol/c/sokol_time.c
vendored
Normal file
5
thirdparty/sokol/c/sokol_time.c
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
#if defined(IMPL)
|
||||
#define SOKOL_TIME_IMPL
|
||||
#endif
|
||||
#include "sokol_defines.h"
|
||||
#include "sokol_time.h"
|
319
thirdparty/sokol/c/sokol_time.h
vendored
Normal file
319
thirdparty/sokol/c/sokol_time.h
vendored
Normal file
@@ -0,0 +1,319 @@
|
||||
#if defined(SOKOL_IMPL) && !defined(SOKOL_TIME_IMPL)
|
||||
#define SOKOL_TIME_IMPL
|
||||
#endif
|
||||
#ifndef SOKOL_TIME_INCLUDED
|
||||
/*
|
||||
sokol_time.h -- simple cross-platform time measurement
|
||||
|
||||
Project URL: https://github.com/floooh/sokol
|
||||
|
||||
Do this:
|
||||
#define SOKOL_IMPL or
|
||||
#define SOKOL_TIME_IMPL
|
||||
before you include this file in *one* C or C++ file to create the
|
||||
implementation.
|
||||
|
||||
Optionally provide the following defines with your own implementations:
|
||||
SOKOL_ASSERT(c) - your own assert macro (default: assert(c))
|
||||
SOKOL_TIME_API_DECL - public function declaration prefix (default: extern)
|
||||
SOKOL_API_DECL - same as SOKOL_TIME_API_DECL
|
||||
SOKOL_API_IMPL - public function implementation prefix (default: -)
|
||||
|
||||
If sokol_time.h is compiled as a DLL, define the following before
|
||||
including the declaration or implementation:
|
||||
|
||||
SOKOL_DLL
|
||||
|
||||
On Windows, SOKOL_DLL will define SOKOL_TIME_API_DECL as __declspec(dllexport)
|
||||
or __declspec(dllimport) as needed.
|
||||
|
||||
void stm_setup();
|
||||
Call once before any other functions to initialize sokol_time
|
||||
(this calls for instance QueryPerformanceFrequency on Windows)
|
||||
|
||||
uint64_t stm_now();
|
||||
Get current point in time in unspecified 'ticks'. The value that
|
||||
is returned has no relation to the 'wall-clock' time and is
|
||||
not in a specific time unit, it is only useful to compute
|
||||
time differences.
|
||||
|
||||
uint64_t stm_diff(uint64_t new, uint64_t old);
|
||||
Computes the time difference between new and old. This will always
|
||||
return a positive, non-zero value.
|
||||
|
||||
uint64_t stm_since(uint64_t start);
|
||||
Takes the current time, and returns the elapsed time since start
|
||||
(this is a shortcut for "stm_diff(stm_now(), start)")
|
||||
|
||||
uint64_t stm_laptime(uint64_t* last_time);
|
||||
This is useful for measuring frame time and other recurring
|
||||
events. It takes the current time, returns the time difference
|
||||
to the value in last_time, and stores the current time in
|
||||
last_time for the next call. If the value in last_time is 0,
|
||||
the return value will be zero (this usually happens on the
|
||||
very first call).
|
||||
|
||||
uint64_t stm_round_to_common_refresh_rate(uint64_t duration)
|
||||
This oddly named function takes a measured frame time and
|
||||
returns the closest "nearby" common display refresh rate frame duration
|
||||
in ticks. If the input duration isn't close to any common display
|
||||
refresh rate, the input duration will be returned unchanged as a fallback.
|
||||
The main purpose of this function is to remove jitter/inaccuracies from
|
||||
measured frame times, and instead use the display refresh rate as
|
||||
frame duration.
|
||||
NOTE: for more robust frame timing, consider using the
|
||||
sokol_app.h function sapp_frame_duration()
|
||||
|
||||
Use the following functions to convert a duration in ticks into
|
||||
useful time units:
|
||||
|
||||
double stm_sec(uint64_t ticks);
|
||||
double stm_ms(uint64_t ticks);
|
||||
double stm_us(uint64_t ticks);
|
||||
double stm_ns(uint64_t ticks);
|
||||
Converts a tick value into seconds, milliseconds, microseconds
|
||||
or nanoseconds. Note that not all platforms will have nanosecond
|
||||
or even microsecond precision.
|
||||
|
||||
Uses the following time measurement functions under the hood:
|
||||
|
||||
Windows: QueryPerformanceFrequency() / QueryPerformanceCounter()
|
||||
MacOS/iOS: mach_absolute_time()
|
||||
emscripten: emscripten_get_now()
|
||||
Linux+others: clock_gettime(CLOCK_MONOTONIC)
|
||||
|
||||
zlib/libpng license
|
||||
|
||||
Copyright (c) 2018 Andre Weissflog
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty.
|
||||
In no event will the authors be held liable for any damages arising from the
|
||||
use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software in a
|
||||
product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
*/
|
||||
#define SOKOL_TIME_INCLUDED (1)
|
||||
#include <stdint.h>
|
||||
|
||||
#if defined(SOKOL_API_DECL) && !defined(SOKOL_TIME_API_DECL)
|
||||
#define SOKOL_TIME_API_DECL SOKOL_API_DECL
|
||||
#endif
|
||||
#ifndef SOKOL_TIME_API_DECL
|
||||
#if defined(_WIN32) && defined(SOKOL_DLL) && defined(SOKOL_TIME_IMPL)
|
||||
#define SOKOL_TIME_API_DECL __declspec(dllexport)
|
||||
#elif defined(_WIN32) && defined(SOKOL_DLL)
|
||||
#define SOKOL_TIME_API_DECL __declspec(dllimport)
|
||||
#else
|
||||
#define SOKOL_TIME_API_DECL extern
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
SOKOL_TIME_API_DECL void stm_setup(void);
|
||||
SOKOL_TIME_API_DECL uint64_t stm_now(void);
|
||||
SOKOL_TIME_API_DECL uint64_t stm_diff(uint64_t new_ticks, uint64_t old_ticks);
|
||||
SOKOL_TIME_API_DECL uint64_t stm_since(uint64_t start_ticks);
|
||||
SOKOL_TIME_API_DECL uint64_t stm_laptime(uint64_t* last_time);
|
||||
SOKOL_TIME_API_DECL uint64_t stm_round_to_common_refresh_rate(uint64_t frame_ticks);
|
||||
SOKOL_TIME_API_DECL double stm_sec(uint64_t ticks);
|
||||
SOKOL_TIME_API_DECL double stm_ms(uint64_t ticks);
|
||||
SOKOL_TIME_API_DECL double stm_us(uint64_t ticks);
|
||||
SOKOL_TIME_API_DECL double stm_ns(uint64_t ticks);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
#endif // SOKOL_TIME_INCLUDED
|
||||
|
||||
/*-- IMPLEMENTATION ----------------------------------------------------------*/
|
||||
#ifdef SOKOL_TIME_IMPL
|
||||
#define SOKOL_TIME_IMPL_INCLUDED (1)
|
||||
#include <string.h> /* memset */
|
||||
|
||||
#ifndef SOKOL_API_IMPL
|
||||
#define SOKOL_API_IMPL
|
||||
#endif
|
||||
#ifndef SOKOL_ASSERT
|
||||
#include <assert.h>
|
||||
#define SOKOL_ASSERT(c) assert(c)
|
||||
#endif
|
||||
#ifndef _SOKOL_PRIVATE
|
||||
#if defined(__GNUC__) || defined(__clang__)
|
||||
#define _SOKOL_PRIVATE __attribute__((unused)) static
|
||||
#else
|
||||
#define _SOKOL_PRIVATE static
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
typedef struct {
|
||||
uint32_t initialized;
|
||||
LARGE_INTEGER freq;
|
||||
LARGE_INTEGER start;
|
||||
} _stm_state_t;
|
||||
#elif defined(__APPLE__) && defined(__MACH__)
|
||||
#include <mach/mach_time.h>
|
||||
typedef struct {
|
||||
uint32_t initialized;
|
||||
mach_timebase_info_data_t timebase;
|
||||
uint64_t start;
|
||||
} _stm_state_t;
|
||||
#elif defined(__EMSCRIPTEN__)
|
||||
#include <emscripten/emscripten.h>
|
||||
typedef struct {
|
||||
uint32_t initialized;
|
||||
double start;
|
||||
} _stm_state_t;
|
||||
#else /* anything else, this will need more care for non-Linux platforms */
|
||||
#ifdef ESP8266
|
||||
// On the ESP8266, clock_gettime ignores the first argument and CLOCK_MONOTONIC isn't defined
|
||||
#define CLOCK_MONOTONIC 0
|
||||
#endif
|
||||
#include <time.h>
|
||||
typedef struct {
|
||||
uint32_t initialized;
|
||||
uint64_t start;
|
||||
} _stm_state_t;
|
||||
#endif
|
||||
static _stm_state_t _stm;
|
||||
|
||||
/* prevent 64-bit overflow when computing relative timestamp
|
||||
see https://gist.github.com/jspohr/3dc4f00033d79ec5bdaf67bc46c813e3
|
||||
*/
|
||||
#if defined(_WIN32) || (defined(__APPLE__) && defined(__MACH__))
|
||||
_SOKOL_PRIVATE int64_t _stm_int64_muldiv(int64_t value, int64_t numer, int64_t denom) {
|
||||
int64_t q = value / denom;
|
||||
int64_t r = value % denom;
|
||||
return q * numer + r * numer / denom;
|
||||
}
|
||||
#endif
|
||||
|
||||
SOKOL_API_IMPL void stm_setup(void) {
|
||||
memset(&_stm, 0, sizeof(_stm));
|
||||
_stm.initialized = 0xABCDABCD;
|
||||
#if defined(_WIN32)
|
||||
QueryPerformanceFrequency(&_stm.freq);
|
||||
QueryPerformanceCounter(&_stm.start);
|
||||
#elif defined(__APPLE__) && defined(__MACH__)
|
||||
mach_timebase_info(&_stm.timebase);
|
||||
_stm.start = mach_absolute_time();
|
||||
#elif defined(__EMSCRIPTEN__)
|
||||
_stm.start = emscripten_get_now();
|
||||
#else
|
||||
struct timespec ts;
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||
_stm.start = (uint64_t)ts.tv_sec*1000000000 + (uint64_t)ts.tv_nsec;
|
||||
#endif
|
||||
}
|
||||
|
||||
SOKOL_API_IMPL uint64_t stm_now(void) {
|
||||
SOKOL_ASSERT(_stm.initialized == 0xABCDABCD);
|
||||
uint64_t now;
|
||||
#if defined(_WIN32)
|
||||
LARGE_INTEGER qpc_t;
|
||||
QueryPerformanceCounter(&qpc_t);
|
||||
now = (uint64_t) _stm_int64_muldiv(qpc_t.QuadPart - _stm.start.QuadPart, 1000000000, _stm.freq.QuadPart);
|
||||
#elif defined(__APPLE__) && defined(__MACH__)
|
||||
const uint64_t mach_now = mach_absolute_time() - _stm.start;
|
||||
now = (uint64_t) _stm_int64_muldiv((int64_t)mach_now, (int64_t)_stm.timebase.numer, (int64_t)_stm.timebase.denom);
|
||||
#elif defined(__EMSCRIPTEN__)
|
||||
double js_now = emscripten_get_now() - _stm.start;
|
||||
now = (uint64_t) (js_now * 1000000.0);
|
||||
#else
|
||||
struct timespec ts;
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||
now = ((uint64_t)ts.tv_sec*1000000000 + (uint64_t)ts.tv_nsec) - _stm.start;
|
||||
#endif
|
||||
return now;
|
||||
}
|
||||
|
||||
SOKOL_API_IMPL uint64_t stm_diff(uint64_t new_ticks, uint64_t old_ticks) {
|
||||
if (new_ticks > old_ticks) {
|
||||
return new_ticks - old_ticks;
|
||||
}
|
||||
else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
SOKOL_API_IMPL uint64_t stm_since(uint64_t start_ticks) {
|
||||
return stm_diff(stm_now(), start_ticks);
|
||||
}
|
||||
|
||||
SOKOL_API_IMPL uint64_t stm_laptime(uint64_t* last_time) {
|
||||
SOKOL_ASSERT(last_time);
|
||||
uint64_t dt = 0;
|
||||
uint64_t now = stm_now();
|
||||
if (0 != *last_time) {
|
||||
dt = stm_diff(now, *last_time);
|
||||
}
|
||||
*last_time = now;
|
||||
return dt;
|
||||
}
|
||||
|
||||
// first number is frame duration in ns, second number is tolerance in ns,
|
||||
// the resulting min/max values must not overlap!
|
||||
static const uint64_t _stm_refresh_rates[][2] = {
|
||||
{ 16666667, 1000000 }, // 60 Hz: 16.6667 +- 1ms
|
||||
{ 13888889, 250000 }, // 72 Hz: 13.8889 +- 0.25ms
|
||||
{ 13333333, 250000 }, // 75 Hz: 13.3333 +- 0.25ms
|
||||
{ 11764706, 250000 }, // 85 Hz: 11.7647 +- 0.25
|
||||
{ 11111111, 250000 }, // 90 Hz: 11.1111 +- 0.25ms
|
||||
{ 10000000, 500000 }, // 100 Hz: 10.0000 +- 0.5ms
|
||||
{ 8333333, 500000 }, // 120 Hz: 8.3333 +- 0.5ms
|
||||
{ 6944445, 500000 }, // 144 Hz: 6.9445 +- 0.5ms
|
||||
{ 4166667, 1000000 }, // 240 Hz: 4.1666 +- 1ms
|
||||
{ 0, 0 }, // keep the last element always at zero
|
||||
};
|
||||
|
||||
SOKOL_API_IMPL uint64_t stm_round_to_common_refresh_rate(uint64_t ticks) {
|
||||
uint64_t ns;
|
||||
int i = 0;
|
||||
while (0 != (ns = _stm_refresh_rates[i][0])) {
|
||||
uint64_t tol = _stm_refresh_rates[i][1];
|
||||
if ((ticks > (ns - tol)) && (ticks < (ns + tol))) {
|
||||
return ns;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
// fallthrough: didn't fit into any buckets
|
||||
return ticks;
|
||||
}
|
||||
|
||||
SOKOL_API_IMPL double stm_sec(uint64_t ticks) {
|
||||
return (double)ticks / 1000000000.0;
|
||||
}
|
||||
|
||||
SOKOL_API_IMPL double stm_ms(uint64_t ticks) {
|
||||
return (double)ticks / 1000000.0;
|
||||
}
|
||||
|
||||
SOKOL_API_IMPL double stm_us(uint64_t ticks) {
|
||||
return (double)ticks / 1000.0;
|
||||
}
|
||||
|
||||
SOKOL_API_IMPL double stm_ns(uint64_t ticks) {
|
||||
return (double)ticks;
|
||||
}
|
||||
#endif /* SOKOL_TIME_IMPL */
|
||||
|
740
thirdparty/sokol/debugtext/debugtext.odin
vendored
Normal file
740
thirdparty/sokol/debugtext/debugtext.odin
vendored
Normal file
@@ -0,0 +1,740 @@
|
||||
// machine generated, do not edit
|
||||
|
||||
package sokol_debugtext
|
||||
|
||||
/*
|
||||
|
||||
sokol_debugtext.h - simple ASCII debug text rendering on top of sokol_gfx.h
|
||||
|
||||
Project URL: https://github.com/floooh/sokol
|
||||
|
||||
Do this:
|
||||
#define SOKOL_IMPL or
|
||||
#define SOKOL_DEBUGTEXT_IMPL
|
||||
before you include this file in *one* C or C++ file to create the
|
||||
implementation.
|
||||
|
||||
The following defines are used by the implementation to select the
|
||||
platform-specific embedded shader code (these are the same defines as
|
||||
used by sokol_gfx.h and sokol_app.h):
|
||||
|
||||
SOKOL_GLCORE
|
||||
SOKOL_GLES3
|
||||
SOKOL_D3D11
|
||||
SOKOL_METAL
|
||||
SOKOL_WGPU
|
||||
|
||||
...optionally provide the following macros to override defaults:
|
||||
|
||||
SOKOL_VSNPRINTF - the function name of an alternative vsnprintf() function (default: vsnprintf)
|
||||
SOKOL_ASSERT(c) - your own assert macro (default: assert(c))
|
||||
SOKOL_DEBUGTEXT_API_DECL - public function declaration prefix (default: extern)
|
||||
SOKOL_API_DECL - same as SOKOL_DEBUGTEXT_API_DECL
|
||||
SOKOL_API_IMPL - public function implementation prefix (default: -)
|
||||
SOKOL_UNREACHABLE() - a guard macro for unreachable code (default: assert(false))
|
||||
|
||||
If sokol_debugtext.h is compiled as a DLL, define the following before
|
||||
including the declaration or implementation:
|
||||
|
||||
SOKOL_DLL
|
||||
|
||||
On Windows, SOKOL_DLL will define SOKOL_DEBUGTEXT_API_DECL as __declspec(dllexport)
|
||||
or __declspec(dllimport) as needed.
|
||||
|
||||
Include the following headers before including sokol_debugtext.h:
|
||||
|
||||
sokol_gfx.h
|
||||
|
||||
FEATURES AND CONCEPTS
|
||||
=====================
|
||||
- renders 8-bit ASCII text as fixed-size 8x8 pixel characters
|
||||
- comes with 6 embedded 8-bit home computer fonts (each taking up 2 KBytes)
|
||||
- easily plug in your own fonts
|
||||
- create multiple contexts for rendering text in different layers or render passes
|
||||
|
||||
STEP BY STEP
|
||||
============
|
||||
|
||||
--- to initialize sokol-debugtext, call sdtx_setup() *after* initializing
|
||||
sokol-gfx:
|
||||
|
||||
sdtx_setup(&(sdtx_desc_t){ ... });
|
||||
|
||||
To see any warnings and errors, you should always install a logging callback.
|
||||
The easiest way is via sokol_log.h:
|
||||
|
||||
#include "sokol_log.h"
|
||||
|
||||
sdtx_setup(&(sdtx_desc_t){
|
||||
.logger.func = slog_func,
|
||||
});
|
||||
|
||||
--- configure sokol-debugtext by populating the sdtx_desc_t struct:
|
||||
|
||||
.context_pool_size (default: 8)
|
||||
The max number of text contexts that can be created.
|
||||
|
||||
.printf_buf_size (default: 4096)
|
||||
The size of the internal text formatting buffer used by
|
||||
sdtx_printf() and sdtx_vprintf().
|
||||
|
||||
.fonts (default: none)
|
||||
An array of sdtx_font_desc_t structs used to configure the
|
||||
fonts that can be used for rendering. To use all builtin
|
||||
fonts call sdtx_setup() like this (in C99):
|
||||
|
||||
sdtx_setup(&(sdtx_desc_t){
|
||||
.fonts = {
|
||||
[0] = sdtx_font_kc853(),
|
||||
[1] = sdtx_font_kc854(),
|
||||
[2] = sdtx_font_z1013(),
|
||||
[3] = sdtx_font_cpc(),
|
||||
[4] = sdtx_font_c64(),
|
||||
[5] = sdtx_font_oric()
|
||||
}
|
||||
});
|
||||
|
||||
For documentation on how to use you own font data, search
|
||||
below for "USING YOUR OWN FONT DATA".
|
||||
|
||||
.context
|
||||
The setup parameters for the default text context. This will
|
||||
be active right after sdtx_setup(), or when calling
|
||||
sdtx_set_context(SDTX_DEFAULT_CONTEXT):
|
||||
|
||||
.max_commands (default: 4096)
|
||||
The max number of render commands that can be recorded
|
||||
into the internal command buffer. This directly translates
|
||||
to the number of render layer changes in a single frame.
|
||||
|
||||
.char_buf_size (default: 4096)
|
||||
The number of characters that can be rendered per frame in this
|
||||
context, defines the size of an internal fixed-size vertex
|
||||
buffer. Any additional characters will be silently ignored.
|
||||
|
||||
.canvas_width (default: 640)
|
||||
.canvas_height (default: 480)
|
||||
The 'virtual canvas size' in pixels. This defines how big
|
||||
characters will be rendered relative to the default framebuffer
|
||||
dimensions. Each character occupies a grid of 8x8 'virtual canvas
|
||||
pixels' (so a virtual canvas size of 640x480 means that 80x60 characters
|
||||
fit on the screen). For rendering in a resizeable window, you
|
||||
should dynamically update the canvas size in each frame by
|
||||
calling sdtx_canvas(w, h).
|
||||
|
||||
.tab_width (default: 4)
|
||||
The width of a tab character in number of character cells.
|
||||
|
||||
.color_format (default: 0)
|
||||
.depth_format (default: 0)
|
||||
.sample_count (default: 0)
|
||||
The pixel format description for the default context needed
|
||||
for creating the context's sg_pipeline object. When
|
||||
rendering to the default framebuffer you can leave those
|
||||
zero-initialized, in this case the proper values will be
|
||||
filled in by sokol-gfx. You only need to provide non-default
|
||||
values here when rendering to render targets with different
|
||||
pixel format attributes than the default framebuffer.
|
||||
|
||||
--- Before starting to render text, optionally call sdtx_canvas() to
|
||||
dynamically resize the virtual canvas. This is recommended when
|
||||
rendering to a resizeable window. The virtual canvas size can
|
||||
also be used to scale text in relation to the display resolution.
|
||||
|
||||
Examples when using sokol-app:
|
||||
|
||||
- to render characters at 8x8 'physical pixels':
|
||||
|
||||
sdtx_canvas(sapp_width(), sapp_height());
|
||||
|
||||
- to render characters at 16x16 physical pixels:
|
||||
|
||||
sdtx_canvas(sapp_width()/2.0f, sapp_height()/2.0f);
|
||||
|
||||
Do *not* use integer math here, since this will not look nice
|
||||
when the render target size isn't divisible by 2.
|
||||
|
||||
--- Optionally define the origin for the character grid with:
|
||||
|
||||
sdtx_origin(x, y);
|
||||
|
||||
The provided coordinates are in character grid cells, not in
|
||||
virtual canvas pixels. E.g. to set the origin to 2 character tiles
|
||||
from the left and top border:
|
||||
|
||||
sdtx_origin(2, 2);
|
||||
|
||||
You can define fractions, e.g. to start rendering half
|
||||
a character tile from the top-left corner:
|
||||
|
||||
sdtx_origin(0.5f, 0.5f);
|
||||
|
||||
--- Optionally set a different font by calling:
|
||||
|
||||
sdtx_font(font_index)
|
||||
|
||||
sokol-debugtext provides 8 font slots which can be populated
|
||||
with the builtin fonts or with user-provided font data, so
|
||||
'font_index' must be a number from 0 to 7.
|
||||
|
||||
--- Position the text cursor with one of the following calls. All arguments
|
||||
are in character grid cells as floats and relative to the
|
||||
origin defined with sdtx_origin():
|
||||
|
||||
sdtx_pos(x, y) - sets absolute cursor position
|
||||
sdtx_pos_x(x) - only set absolute x cursor position
|
||||
sdtx_pos_y(y) - only set absolute y cursor position
|
||||
|
||||
sdtx_move(x, y) - move cursor relative in x and y direction
|
||||
sdtx_move_x(x) - move cursor relative only in x direction
|
||||
sdtx_move_y(y) - move cursor relative only in y direction
|
||||
|
||||
sdtx_crlf() - set cursor to beginning of next line
|
||||
(same as sdtx_pos_x(0) + sdtx_move_y(1))
|
||||
sdtx_home() - resets the cursor to the origin
|
||||
(same as sdtx_pos(0, 0))
|
||||
|
||||
--- Set a new text color with any of the following functions:
|
||||
|
||||
sdtx_color3b(r, g, b) - RGB 0..255, A=255
|
||||
sdtx_color3f(r, g, b) - RGB 0.0f..1.0f, A=1.0f
|
||||
sdtx_color4b(r, g, b, a) - RGBA 0..255
|
||||
sdtx_color4f(r, g, b, a) - RGBA 0.0f..1.0f
|
||||
sdtx_color1i(uint32_t rgba) - ABGR (0xAABBGGRR)
|
||||
|
||||
--- Output 8-bit ASCII text with the following functions:
|
||||
|
||||
sdtx_putc(c) - output a single character
|
||||
|
||||
sdtx_puts(str) - output a null-terminated C string, note that
|
||||
this will *not* append a newline (so it behaves
|
||||
differently than the CRT's puts() function)
|
||||
|
||||
sdtx_putr(str, len) - 'put range' output the first 'len' characters of
|
||||
a C string or until the zero character is encountered
|
||||
|
||||
sdtx_printf(fmt, ...) - output with printf-formatting, note that you
|
||||
can inject your own printf-compatible function
|
||||
by overriding the SOKOL_VSNPRINTF define before
|
||||
including the implementation
|
||||
|
||||
sdtx_vprintf(fmt, args) - same as sdtx_printf() but with the arguments
|
||||
provided in a va_list
|
||||
|
||||
- Note that the text will not yet be rendered, only recorded for rendering
|
||||
at a later time, the actual rendering happens when sdtx_draw() is called
|
||||
inside a sokol-gfx render pass.
|
||||
- This means also you can output text anywhere in the frame, it doesn't
|
||||
have to be inside a render pass.
|
||||
- Note that character codes <32 are reserved as control characters
|
||||
and won't render anything. Currently only the following control
|
||||
characters are implemented:
|
||||
|
||||
\r - carriage return (same as sdtx_pos_x(0))
|
||||
\n - carriage return + line feed (same as stdx_crlf())
|
||||
\t - a tab character
|
||||
|
||||
--- You can 'record' text into render layers, this allows to mix/interleave
|
||||
sokol-debugtext rendering with other rendering operations inside
|
||||
sokol-gfx render passes. To start recording text into a different render
|
||||
layer, call:
|
||||
|
||||
sdtx_layer(int layer_id)
|
||||
|
||||
...outside a sokol-gfx render pass.
|
||||
|
||||
--- finally, from within a sokol-gfx render pass, call:
|
||||
|
||||
sdtx_draw()
|
||||
|
||||
...for non-layered rendering, or to draw a specific layer:
|
||||
|
||||
sdtx_draw_layer(int layer_id)
|
||||
|
||||
NOTE that sdtx_draw() is equivalent to:
|
||||
|
||||
sdtx_draw_layer(0)
|
||||
|
||||
...so sdtx_draw() will *NOT* render all text layers, instead it will
|
||||
only render the 'default layer' 0.
|
||||
|
||||
--- at the end of a frame (defined by the call to sg_commit()), sokol-debugtext
|
||||
will rewind all contexts:
|
||||
|
||||
- the internal vertex index is set to 0
|
||||
- the internal command index is set to 0
|
||||
- the current layer id is set to 0
|
||||
- the current font is set to 0
|
||||
- the cursor position is reset
|
||||
|
||||
|
||||
RENDERING WITH MULTIPLE CONTEXTS
|
||||
================================
|
||||
Use multiple text contexts if you need to render debug text in different
|
||||
sokol-gfx render passes, or want to render text to different layers
|
||||
in the same render pass, each with its own set of parameters.
|
||||
|
||||
To create a new text context call:
|
||||
|
||||
sdtx_context ctx = sdtx_make_context(&(sdtx_context_desc_t){ ... });
|
||||
|
||||
The creation parameters in the sdtx_context_desc_t struct are the same
|
||||
as already described above in the sdtx_setup() function:
|
||||
|
||||
.char_buf_size -- max number of characters rendered in one frame, default: 4096
|
||||
.canvas_width -- the initial virtual canvas width, default: 640
|
||||
.canvas_height -- the initial virtual canvas height, default: 400
|
||||
.tab_width -- tab width in number of characters, default: 4
|
||||
.color_format -- color pixel format of target render pass
|
||||
.depth_format -- depth pixel format of target render pass
|
||||
.sample_count -- MSAA sample count of target render pass
|
||||
|
||||
To make a new context the active context, call:
|
||||
|
||||
sdtx_set_context(ctx)
|
||||
|
||||
...and after that call the text output functions as described above, and
|
||||
finally, inside a sokol-gfx render pass, call sdtx_draw() to actually
|
||||
render the text for this context.
|
||||
|
||||
A context keeps track of the following parameters:
|
||||
|
||||
- the active font
|
||||
- the virtual canvas size
|
||||
- the origin position
|
||||
- the current cursor position
|
||||
- the current tab width
|
||||
- the current color
|
||||
- and the current layer-id
|
||||
|
||||
You can get the currently active context with:
|
||||
|
||||
sdtx_get_context()
|
||||
|
||||
To make the default context current, call sdtx_set_context() with the
|
||||
special SDTX_DEFAULT_CONTEXT handle:
|
||||
|
||||
sdtx_set_context(SDTX_DEFAULT_CONTEXT)
|
||||
|
||||
Alternatively, use the function sdtx_default_context() to get the default
|
||||
context handle:
|
||||
|
||||
sdtx_set_context(sdtx_default_context());
|
||||
|
||||
To destroy a context, call:
|
||||
|
||||
sdtx_destroy_context(ctx)
|
||||
|
||||
If a context is set as active that no longer exists, all sokol-debugtext
|
||||
functions that require an active context will silently fail.
|
||||
|
||||
You can directly draw the recorded text in a specific context without
|
||||
setting the active context:
|
||||
|
||||
sdtx_context_draw(ctx)
|
||||
sdtx_context_draw_layer(ctx, layer_id)
|
||||
|
||||
USING YOUR OWN FONT DATA
|
||||
========================
|
||||
|
||||
Instead of the built-in fonts you can also plug your own font data
|
||||
into sokol-debugtext by providing one or several sdtx_font_desc_t
|
||||
structures in the sdtx_setup call.
|
||||
|
||||
For instance to use a built-in font at slot 0, and a user-font at
|
||||
font slot 1, the sdtx_setup() call might look like this:
|
||||
|
||||
sdtx_setup(&sdtx_desc_t){
|
||||
.fonts = {
|
||||
[0] = sdtx_font_kc853(),
|
||||
[1] = {
|
||||
.data = {
|
||||
.ptr = my_font_data,
|
||||
.size = sizeof(my_font_data)
|
||||
},
|
||||
.first_char = ...,
|
||||
.last_char = ...
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Where 'my_font_data' is a byte array where every character is described
|
||||
by 8 bytes arranged like this:
|
||||
|
||||
bits
|
||||
7 6 5 4 3 2 1 0
|
||||
. . . X X . . . byte 0: 0x18
|
||||
. . X X X X . . byte 1: 0x3C
|
||||
. X X . . X X . byte 2: 0x66
|
||||
. X X . . X X . byte 3: 0x66
|
||||
. X X X X X X . byte 4: 0x7E
|
||||
. X X . . X X . byte 5: 0x66
|
||||
. X X . . X X . byte 6: 0x66
|
||||
. . . . . . . . byte 7: 0x00
|
||||
|
||||
A complete font consists of 256 characters, resulting in 2048 bytes for
|
||||
the font data array (but note that the character codes 0..31 will never
|
||||
be rendered).
|
||||
|
||||
If you provide such a complete font data array, you can drop the .first_char
|
||||
and .last_char initialization parameters since those default to 0 and 255,
|
||||
note that you can also use the SDTX_RANGE() helper macro to build the
|
||||
.data item:
|
||||
|
||||
sdtx_setup(&sdtx_desc_t){
|
||||
.fonts = {
|
||||
[0] = sdtx_font_kc853(),
|
||||
[1] = {
|
||||
.data = SDTX_RANGE(my_font_data)
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
If the font doesn't define all 256 character tiles, or you don't need an
|
||||
entire 256-character font and want to save a couple of bytes, use the
|
||||
.first_char and .last_char initialization parameters to define a sub-range.
|
||||
For instance if the font only contains the characters between the Space
|
||||
(ASCII code 32) and uppercase character 'Z' (ASCII code 90):
|
||||
|
||||
sdtx_setup(&sdtx_desc_t){
|
||||
.fonts = {
|
||||
[0] = sdtx_font_kc853(),
|
||||
[1] = {
|
||||
.data = SDTX_RANGE(my_font_data),
|
||||
.first_char = 32, // could also write ' '
|
||||
.last_char = 90 // could also write 'Z'
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Character tiles that haven't been defined in the font will be rendered
|
||||
as a solid 8x8 quad.
|
||||
|
||||
|
||||
MEMORY ALLOCATION OVERRIDE
|
||||
==========================
|
||||
You can override the memory allocation functions at initialization time
|
||||
like this:
|
||||
|
||||
void* my_alloc(size_t size, void* user_data) {
|
||||
return malloc(size);
|
||||
}
|
||||
|
||||
void my_free(void* ptr, void* user_data) {
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
...
|
||||
sdtx_setup(&(sdtx_desc_t){
|
||||
// ...
|
||||
.allocator = {
|
||||
.alloc_fn = my_alloc,
|
||||
.free_fn = my_free,
|
||||
.user_data = ...;
|
||||
}
|
||||
});
|
||||
...
|
||||
|
||||
If no overrides are provided, malloc and free will be used.
|
||||
|
||||
|
||||
ERROR REPORTING AND LOGGING
|
||||
===========================
|
||||
To get any logging information at all you need to provide a logging callback in the setup call,
|
||||
the easiest way is to use sokol_log.h:
|
||||
|
||||
#include "sokol_log.h"
|
||||
|
||||
sdtx_setup(&(sdtx_desc_t){
|
||||
// ...
|
||||
.logger.func = slog_func
|
||||
});
|
||||
|
||||
To override logging with your own callback, first write a logging function like this:
|
||||
|
||||
void my_log(const char* tag, // e.g. 'sdtx'
|
||||
uint32_t log_level, // 0=panic, 1=error, 2=warn, 3=info
|
||||
uint32_t log_item_id, // SDTX_LOGITEM_*
|
||||
const char* message_or_null, // a message string, may be nullptr in release mode
|
||||
uint32_t line_nr, // line number in sokol_debugtext.h
|
||||
const char* filename_or_null, // source filename, may be nullptr in release mode
|
||||
void* user_data)
|
||||
{
|
||||
...
|
||||
}
|
||||
|
||||
...and then setup sokol-debugtext like this:
|
||||
|
||||
sdtx_setup(&(sdtx_desc_t){
|
||||
.logger = {
|
||||
.func = my_log,
|
||||
.user_data = my_user_data,
|
||||
}
|
||||
});
|
||||
|
||||
The provided logging function must be reentrant (e.g. be callable from
|
||||
different threads).
|
||||
|
||||
If you don't want to provide your own custom logger it is highly recommended to use
|
||||
the standard logger in sokol_log.h instead, otherwise you won't see any warnings or
|
||||
errors.
|
||||
|
||||
|
||||
LICENSE
|
||||
=======
|
||||
zlib/libpng license
|
||||
|
||||
Copyright (c) 2020 Andre Weissflog
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty.
|
||||
In no event will the authors be held liable for any damages arising from the
|
||||
use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software in a
|
||||
product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
|
||||
*/
|
||||
import sg "../gfx"
|
||||
|
||||
import "core:fmt"
|
||||
import "core:strings"
|
||||
printf :: proc(s: string, args: ..any) {
|
||||
fstr := fmt.tprintf(s, ..args)
|
||||
putr(strings.unsafe_string_to_cstring(fstr), len(fstr))
|
||||
}
|
||||
import "core:c"
|
||||
|
||||
_ :: c
|
||||
|
||||
SOKOL_DEBUG :: #config(SOKOL_DEBUG, ODIN_DEBUG)
|
||||
|
||||
DEBUG :: #config(SOKOL_DEBUGTEXT_DEBUG, SOKOL_DEBUG)
|
||||
USE_GL :: #config(SOKOL_USE_GL, false)
|
||||
USE_DLL :: #config(SOKOL_DLL, false)
|
||||
|
||||
when ODIN_OS == .Windows {
|
||||
when USE_DLL {
|
||||
when USE_GL {
|
||||
when DEBUG { foreign import sokol_debugtext_clib { "../sokol_dll_windows_x64_gl_debug.lib" } }
|
||||
else { foreign import sokol_debugtext_clib { "../sokol_dll_windows_x64_gl_release.lib" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_debugtext_clib { "../sokol_dll_windows_x64_d3d11_debug.lib" } }
|
||||
else { foreign import sokol_debugtext_clib { "../sokol_dll_windows_x64_d3d11_release.lib" } }
|
||||
}
|
||||
} else {
|
||||
when USE_GL {
|
||||
when DEBUG { foreign import sokol_debugtext_clib { "sokol_debugtext_windows_x64_gl_debug.lib" } }
|
||||
else { foreign import sokol_debugtext_clib { "sokol_debugtext_windows_x64_gl_release.lib" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_debugtext_clib { "sokol_debugtext_windows_x64_d3d11_debug.lib" } }
|
||||
else { foreign import sokol_debugtext_clib { "sokol_debugtext_windows_x64_d3d11_release.lib" } }
|
||||
}
|
||||
}
|
||||
} else when ODIN_OS == .Darwin {
|
||||
when USE_DLL {
|
||||
when USE_GL && ODIN_ARCH == .arm64 && DEBUG { foreign import sokol_debugtext_clib { "../dylib/sokol_dylib_macos_arm64_gl_debug.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .arm64 && !DEBUG { foreign import sokol_debugtext_clib { "../dylib/sokol_dylib_macos_arm64_gl_release.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .amd64 && DEBUG { foreign import sokol_debugtext_clib { "../dylib/sokol_dylib_macos_x64_gl_debug.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .amd64 && !DEBUG { foreign import sokol_debugtext_clib { "../dylib/sokol_dylib_macos_x64_gl_release.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .arm64 && DEBUG { foreign import sokol_debugtext_clib { "../dylib/sokol_dylib_macos_arm64_metal_debug.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .arm64 && !DEBUG { foreign import sokol_debugtext_clib { "../dylib/sokol_dylib_macos_arm64_metal_release.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .amd64 && DEBUG { foreign import sokol_debugtext_clib { "../dylib/sokol_dylib_macos_x64_metal_debug.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .amd64 && !DEBUG { foreign import sokol_debugtext_clib { "../dylib/sokol_dylib_macos_x64_metal_release.dylib" } }
|
||||
} else {
|
||||
when USE_GL {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when DEBUG { foreign import sokol_debugtext_clib { "sokol_debugtext_macos_arm64_gl_debug.a" } }
|
||||
else { foreign import sokol_debugtext_clib { "sokol_debugtext_macos_arm64_gl_release.a" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_debugtext_clib { "sokol_debugtext_macos_x64_gl_debug.a" } }
|
||||
else { foreign import sokol_debugtext_clib { "sokol_debugtext_macos_x64_gl_release.a" } }
|
||||
}
|
||||
} else {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when DEBUG { foreign import sokol_debugtext_clib { "sokol_debugtext_macos_arm64_metal_debug.a" } }
|
||||
else { foreign import sokol_debugtext_clib { "sokol_debugtext_macos_arm64_metal_release.a" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_debugtext_clib { "sokol_debugtext_macos_x64_metal_debug.a" } }
|
||||
else { foreign import sokol_debugtext_clib { "sokol_debugtext_macos_x64_metal_release.a" } }
|
||||
}
|
||||
}
|
||||
}
|
||||
} else when ODIN_OS == .Linux {
|
||||
when USE_DLL {
|
||||
when DEBUG { foreign import sokol_debugtext_clib { "sokol_debugtext_linux_x64_gl_debug.so" } }
|
||||
else { foreign import sokol_debugtext_clib { "sokol_debugtext_linux_x64_gl_release.so" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_debugtext_clib { "sokol_debugtext_linux_x64_gl_debug.a" } }
|
||||
else { foreign import sokol_debugtext_clib { "sokol_debugtext_linux_x64_gl_release.a" } }
|
||||
}
|
||||
} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 {
|
||||
// Feed sokol_debugtext_wasm_gl_debug.a or sokol_debugtext_wasm_gl_release.a into emscripten compiler.
|
||||
foreign import sokol_debugtext_clib { "env.o" }
|
||||
} else {
|
||||
#panic("This OS is currently not supported")
|
||||
}
|
||||
|
||||
@(default_calling_convention="c", link_prefix="sdtx_")
|
||||
foreign sokol_debugtext_clib {
|
||||
// initialization/shutdown
|
||||
setup :: proc(#by_ptr desc: Desc) ---
|
||||
shutdown :: proc() ---
|
||||
// builtin font data (use to populate sdtx_desc.font[])
|
||||
font_kc853 :: proc() -> Font_Desc ---
|
||||
font_kc854 :: proc() -> Font_Desc ---
|
||||
font_z1013 :: proc() -> Font_Desc ---
|
||||
font_cpc :: proc() -> Font_Desc ---
|
||||
font_c64 :: proc() -> Font_Desc ---
|
||||
font_oric :: proc() -> Font_Desc ---
|
||||
// context functions
|
||||
make_context :: proc(#by_ptr desc: Context_Desc) -> Context ---
|
||||
destroy_context :: proc(ctx: Context) ---
|
||||
set_context :: proc(ctx: Context) ---
|
||||
get_context :: proc() -> Context ---
|
||||
default_context :: proc() -> Context ---
|
||||
// drawing functions (call inside sokol-gfx render pass)
|
||||
draw :: proc() ---
|
||||
context_draw :: proc(ctx: Context) ---
|
||||
draw_layer :: proc(#any_int layer_id: c.int) ---
|
||||
context_draw_layer :: proc(ctx: Context, #any_int layer_id: c.int) ---
|
||||
// switch render layer
|
||||
layer :: proc(#any_int layer_id: c.int) ---
|
||||
// switch to a different font
|
||||
font :: proc(#any_int font_index: c.int) ---
|
||||
// set a new virtual canvas size in screen pixels
|
||||
canvas :: proc(w: f32, h: f32) ---
|
||||
// set a new origin in character grid coordinates
|
||||
origin :: proc(x: f32, y: f32) ---
|
||||
// cursor movement functions (relative to origin in character grid coordinates)
|
||||
home :: proc() ---
|
||||
pos :: proc(x: f32, y: f32) ---
|
||||
pos_x :: proc(x: f32) ---
|
||||
pos_y :: proc(y: f32) ---
|
||||
move :: proc(dx: f32, dy: f32) ---
|
||||
move_x :: proc(dx: f32) ---
|
||||
move_y :: proc(dy: f32) ---
|
||||
crlf :: proc() ---
|
||||
// set the current text color
|
||||
color3b :: proc(r: u8, g: u8, b: u8) ---
|
||||
color3f :: proc(r: f32, g: f32, b: f32) ---
|
||||
color4b :: proc(r: u8, g: u8, b: u8, a: u8) ---
|
||||
color4f :: proc(r: f32, g: f32, b: f32, a: f32) ---
|
||||
color1i :: proc(rgba: u32) ---
|
||||
// text rendering
|
||||
putc :: proc(c: u8) ---
|
||||
puts :: proc(str: cstring) ---
|
||||
putr :: proc(str: cstring, #any_int len: c.int) ---
|
||||
}
|
||||
|
||||
Log_Item :: enum i32 {
|
||||
OK,
|
||||
MALLOC_FAILED,
|
||||
ADD_COMMIT_LISTENER_FAILED,
|
||||
COMMAND_BUFFER_FULL,
|
||||
CONTEXT_POOL_EXHAUSTED,
|
||||
CANNOT_DESTROY_DEFAULT_CONTEXT,
|
||||
}
|
||||
|
||||
/*
|
||||
sdtx_logger_t
|
||||
|
||||
Used in sdtx_desc_t to provide a custom logging and error reporting
|
||||
callback to sokol-debugtext.
|
||||
*/
|
||||
Logger :: struct {
|
||||
func : proc "c" (a0: cstring, a1: u32, a2: u32, a3: cstring, a4: u32, a5: cstring, a6: rawptr),
|
||||
user_data : rawptr,
|
||||
}
|
||||
|
||||
// a rendering context handle
|
||||
Context :: struct {
|
||||
id : u32,
|
||||
}
|
||||
|
||||
/*
|
||||
sdtx_range is a pointer-size-pair struct used to pass memory
|
||||
blobs into sokol-debugtext. When initialized from a value type
|
||||
(array or struct), use the SDTX_RANGE() macro to build
|
||||
an sdtx_range struct.
|
||||
*/
|
||||
Range :: struct {
|
||||
ptr : rawptr,
|
||||
size : c.size_t,
|
||||
}
|
||||
|
||||
Font_Desc :: struct {
|
||||
data : Range,
|
||||
first_char : u8,
|
||||
last_char : u8,
|
||||
}
|
||||
|
||||
/*
|
||||
sdtx_context_desc_t
|
||||
|
||||
Describes the initialization parameters of a rendering context. Creating
|
||||
additional rendering contexts is useful if you want to render in
|
||||
different sokol-gfx rendering passes, or when rendering several layers
|
||||
of text.
|
||||
*/
|
||||
Context_Desc :: struct {
|
||||
max_commands : c.int,
|
||||
char_buf_size : c.int,
|
||||
canvas_width : f32,
|
||||
canvas_height : f32,
|
||||
tab_width : c.int,
|
||||
color_format : sg.Pixel_Format,
|
||||
depth_format : sg.Pixel_Format,
|
||||
sample_count : c.int,
|
||||
}
|
||||
|
||||
/*
|
||||
sdtx_allocator_t
|
||||
|
||||
Used in sdtx_desc_t to provide custom memory-alloc and -free functions
|
||||
to sokol_debugtext.h. If memory management should be overridden, both the
|
||||
alloc_fn and free_fn function must be provided (e.g. it's not valid to
|
||||
override one function but not the other).
|
||||
*/
|
||||
Allocator :: struct {
|
||||
alloc_fn : proc "c" (a0: c.size_t, a1: rawptr) -> rawptr,
|
||||
free_fn : proc "c" (a0: rawptr, a1: rawptr),
|
||||
user_data : rawptr,
|
||||
}
|
||||
|
||||
/*
|
||||
sdtx_desc_t
|
||||
|
||||
Describes the sokol-debugtext API initialization parameters. Passed
|
||||
to the sdtx_setup() function.
|
||||
|
||||
NOTE: to populate the fonts item array with builtin fonts, use any
|
||||
of the following functions:
|
||||
|
||||
sdtx_font_kc853()
|
||||
sdtx_font_kc854()
|
||||
sdtx_font_z1013()
|
||||
sdtx_font_cpc()
|
||||
sdtx_font_c64()
|
||||
sdtx_font_oric()
|
||||
*/
|
||||
Desc :: struct {
|
||||
context_pool_size : c.int,
|
||||
printf_buf_size : c.int,
|
||||
fonts : [8]Font_Desc,
|
||||
ctx : Context_Desc,
|
||||
allocator : Allocator,
|
||||
logger : Logger,
|
||||
}
|
||||
|
4673
thirdparty/sokol/gfx/gfx.odin
vendored
Normal file
4673
thirdparty/sokol/gfx/gfx.odin
vendored
Normal file
File diff suppressed because it is too large
Load Diff
962
thirdparty/sokol/gl/gl.odin
vendored
Normal file
962
thirdparty/sokol/gl/gl.odin
vendored
Normal file
@@ -0,0 +1,962 @@
|
||||
// machine generated, do not edit
|
||||
|
||||
package sokol_gl
|
||||
|
||||
/*
|
||||
|
||||
sokol_gl.h -- OpenGL 1.x style rendering on top of sokol_gfx.h
|
||||
|
||||
Project URL: https://github.com/floooh/sokol
|
||||
|
||||
Do this:
|
||||
#define SOKOL_IMPL or
|
||||
#define SOKOL_GL_IMPL
|
||||
before you include this file in *one* C or C++ file to create the
|
||||
implementation.
|
||||
|
||||
The following defines are used by the implementation to select the
|
||||
platform-specific embedded shader code (these are the same defines as
|
||||
used by sokol_gfx.h and sokol_app.h):
|
||||
|
||||
SOKOL_GLCORE
|
||||
SOKOL_GLES3
|
||||
SOKOL_D3D11
|
||||
SOKOL_METAL
|
||||
SOKOL_WGPU
|
||||
|
||||
...optionally provide the following macros to override defaults:
|
||||
|
||||
SOKOL_ASSERT(c) - your own assert macro (default: assert(c))
|
||||
SOKOL_GL_API_DECL - public function declaration prefix (default: extern)
|
||||
SOKOL_API_DECL - same as SOKOL_GL_API_DECL
|
||||
SOKOL_API_IMPL - public function implementation prefix (default: -)
|
||||
SOKOL_UNREACHABLE() - a guard macro for unreachable code (default: assert(false))
|
||||
|
||||
If sokol_gl.h is compiled as a DLL, define the following before
|
||||
including the declaration or implementation:
|
||||
|
||||
SOKOL_DLL
|
||||
|
||||
On Windows, SOKOL_DLL will define SOKOL_GL_API_DECL as __declspec(dllexport)
|
||||
or __declspec(dllimport) as needed.
|
||||
|
||||
Include the following headers before including sokol_gl.h:
|
||||
|
||||
sokol_gfx.h
|
||||
|
||||
Matrix functions have been taken from MESA and Regal.
|
||||
|
||||
FEATURE OVERVIEW:
|
||||
=================
|
||||
sokol_gl.h implements a subset of the OpenGLES 1.x feature set useful for
|
||||
when you just want to quickly render a bunch of triangles or
|
||||
lines without having to mess with buffers and shaders.
|
||||
|
||||
The current feature set is mostly useful for debug visualizations
|
||||
and simple UI-style 2D rendering:
|
||||
|
||||
What's implemented:
|
||||
- vertex components:
|
||||
- position (x, y, z)
|
||||
- 2D texture coords (u, v)
|
||||
- color (r, g, b, a)
|
||||
- primitive types:
|
||||
- triangle list and strip
|
||||
- line list and strip
|
||||
- quad list (TODO: quad strips)
|
||||
- point list
|
||||
- one texture layer (no multi-texturing)
|
||||
- viewport and scissor-rect with selectable origin (top-left or bottom-left)
|
||||
- all GL 1.x matrix stack functions, and additionally equivalent
|
||||
functions for gluPerspective and gluLookat
|
||||
|
||||
Notable GLES 1.x features that are *NOT* implemented:
|
||||
- vertex lighting (this is the most likely GL feature that might be added later)
|
||||
- vertex arrays (although providing whole chunks of vertex data at once
|
||||
might be a useful feature for a later version)
|
||||
- texture coordinate generation
|
||||
- line width
|
||||
- all pixel store functions
|
||||
- no ALPHA_TEST
|
||||
- no clear functions (clearing is handled by the sokol-gfx render pass)
|
||||
- fog
|
||||
|
||||
Notable differences to GL:
|
||||
- No "enum soup" for render states etc, instead there's a
|
||||
'pipeline stack', this is similar to GL's matrix stack,
|
||||
but for pipeline-state-objects. The pipeline object at
|
||||
the top of the pipeline stack defines the active set of render states
|
||||
- All angles are in radians, not degrees (note the sgl_rad() and
|
||||
sgl_deg() conversion functions)
|
||||
- No enable/disable state for scissor test, this is always enabled
|
||||
|
||||
STEP BY STEP:
|
||||
=============
|
||||
--- To initialize sokol-gl, call:
|
||||
|
||||
sgl_setup(const sgl_desc_t* desc)
|
||||
|
||||
NOTE that sgl_setup() must be called *after* initializing sokol-gfx
|
||||
(via sg_setup). This is because sgl_setup() needs to create
|
||||
sokol-gfx resource objects.
|
||||
|
||||
If you're intending to render to the default pass, and also don't
|
||||
want to tweak memory usage, and don't want any logging output you can
|
||||
just keep sgl_desc_t zero-initialized:
|
||||
|
||||
sgl_setup(&(sgl_desc_t*){ 0 });
|
||||
|
||||
In this case, sokol-gl will create internal sg_pipeline objects that
|
||||
are compatible with the sokol-app default framebuffer.
|
||||
|
||||
I would recommend to at least install a logging callback so that
|
||||
you'll see any warnings and errors. The easiest way is through
|
||||
sokol_log.h:
|
||||
|
||||
#include "sokol_log.h"
|
||||
|
||||
sgl_setup(&(sgl_desc_t){
|
||||
.logger.func = slog_func.
|
||||
});
|
||||
|
||||
If you want to render into a framebuffer with different pixel-format
|
||||
and MSAA attributes you need to provide the matching attributes in the
|
||||
sgl_setup() call:
|
||||
|
||||
sgl_setup(&(sgl_desc_t*){
|
||||
.color_format = SG_PIXELFORMAT_...,
|
||||
.depth_format = SG_PIXELFORMAT_...,
|
||||
.sample_count = ...,
|
||||
});
|
||||
|
||||
To reduce memory usage, or if you need to create more then the default number of
|
||||
contexts, pipelines, vertices or draw commands, set the following sgl_desc_t
|
||||
members:
|
||||
|
||||
.context_pool_size (default: 4)
|
||||
.pipeline_pool_size (default: 64)
|
||||
.max_vertices (default: 64k)
|
||||
.max_commands (default: 16k)
|
||||
|
||||
Finally you can change the face winding for front-facing triangles
|
||||
and quads:
|
||||
|
||||
.face_winding - default is SG_FACEWINDING_CCW
|
||||
|
||||
The default winding for front faces is counter-clock-wise. This is
|
||||
the same as OpenGL's default, but different from sokol-gfx.
|
||||
|
||||
--- Optionally create additional context objects if you want to render into
|
||||
multiple sokol-gfx render passes (or generally if you want to
|
||||
use multiple independent sokol-gl "state buckets")
|
||||
|
||||
sgl_context ctx = sgl_make_context(const sgl_context_desc_t* desc)
|
||||
|
||||
For details on rendering with sokol-gl contexts, search below for
|
||||
WORKING WITH CONTEXTS.
|
||||
|
||||
--- Optionally create pipeline-state-objects if you need render state
|
||||
that differs from sokol-gl's default state:
|
||||
|
||||
sgl_pipeline pip = sgl_make_pipeline(const sg_pipeline_desc* desc)
|
||||
|
||||
...this creates a pipeline object that's compatible with the currently
|
||||
active context, alternatively call:
|
||||
|
||||
sgl_pipeline_pip = sgl_context_make_pipeline(sgl_context ctx, const sg_pipeline_desc* desc)
|
||||
|
||||
...to create a pipeline object that's compatible with an explicitly
|
||||
provided context.
|
||||
|
||||
The similarity with sokol_gfx.h's sg_pipeline type and sg_make_pipeline()
|
||||
function is intended. sgl_make_pipeline() also takes a standard
|
||||
sokol-gfx sg_pipeline_desc object to describe the render state, but
|
||||
without:
|
||||
- shader
|
||||
- vertex layout
|
||||
- color- and depth-pixel-formats
|
||||
- primitive type (lines, triangles, ...)
|
||||
- MSAA sample count
|
||||
Those will be filled in by sgl_make_pipeline(). Note that each
|
||||
call to sgl_make_pipeline() needs to create several sokol-gfx
|
||||
pipeline objects (one for each primitive type).
|
||||
|
||||
'depth.write_enabled' will be forced to 'false' if the context this
|
||||
pipeline object is intended for has its depth pixel format set to
|
||||
SG_PIXELFORMAT_NONE (which means the framebuffer this context is used
|
||||
with doesn't have a depth-stencil surface).
|
||||
|
||||
--- if you need to destroy sgl_pipeline objects before sgl_shutdown():
|
||||
|
||||
sgl_destroy_pipeline(sgl_pipeline pip)
|
||||
|
||||
--- After sgl_setup() you can call any of the sokol-gl functions anywhere
|
||||
in a frame, *except* sgl_draw(). The 'vanilla' functions
|
||||
will only change internal sokol-gl state, and not call any sokol-gfx
|
||||
functions.
|
||||
|
||||
--- Unlike OpenGL, sokol-gl has a function to reset internal state to
|
||||
a known default. This is useful at the start of a sequence of
|
||||
rendering operations:
|
||||
|
||||
void sgl_defaults(void)
|
||||
|
||||
This will set the following default state:
|
||||
|
||||
- current texture coordinate to u=0.0f, v=0.0f
|
||||
- current color to white (rgba all 1.0f)
|
||||
- current point size to 1.0f
|
||||
- unbind the current texture and texturing will be disabled
|
||||
- *all* matrices will be set to identity (also the projection matrix)
|
||||
- the default render state will be set by loading the 'default pipeline'
|
||||
into the top of the pipeline stack
|
||||
|
||||
The current matrix- and pipeline-stack-depths will not be changed by
|
||||
sgl_defaults().
|
||||
|
||||
--- change the currently active renderstate through the
|
||||
pipeline-stack functions, this works similar to the
|
||||
traditional GL matrix stack:
|
||||
|
||||
...load the default pipeline state on the top of the pipeline stack:
|
||||
|
||||
sgl_load_default_pipeline()
|
||||
|
||||
...load a specific pipeline on the top of the pipeline stack:
|
||||
|
||||
sgl_load_pipeline(sgl_pipeline pip)
|
||||
|
||||
...push and pop the pipeline stack:
|
||||
sgl_push_pipeline()
|
||||
sgl_pop_pipeline()
|
||||
|
||||
--- control texturing with:
|
||||
|
||||
sgl_enable_texture()
|
||||
sgl_disable_texture()
|
||||
sgl_texture(sg_image img, sg_sampler smp)
|
||||
|
||||
NOTE: the img and smp handles can be invalid (SG_INVALID_ID), in this
|
||||
case, sokol-gl will fall back to the internal default (white) texture
|
||||
and sampler.
|
||||
|
||||
--- set the current viewport and scissor rect with:
|
||||
|
||||
sgl_viewport(int x, int y, int w, int h, bool origin_top_left)
|
||||
sgl_scissor_rect(int x, int y, int w, int h, bool origin_top_left)
|
||||
|
||||
...or call these alternatives which take float arguments (this might allow
|
||||
to avoid casting between float and integer in more strongly typed languages
|
||||
when floating point pixel coordinates are used):
|
||||
|
||||
sgl_viewportf(float x, float y, float w, float h, bool origin_top_left)
|
||||
sgl_scissor_rectf(float x, float y, float w, float h, bool origin_top_left)
|
||||
|
||||
...these calls add a new command to the internal command queue, so
|
||||
that the viewport or scissor rect are set at the right time relative
|
||||
to other sokol-gl calls.
|
||||
|
||||
--- adjust the transform matrices, matrix manipulation works just like
|
||||
the OpenGL matrix stack:
|
||||
|
||||
...set the current matrix mode:
|
||||
|
||||
sgl_matrix_mode_modelview()
|
||||
sgl_matrix_mode_projection()
|
||||
sgl_matrix_mode_texture()
|
||||
|
||||
...load the identity matrix into the current matrix:
|
||||
|
||||
sgl_load_identity()
|
||||
|
||||
...translate, rotate and scale the current matrix:
|
||||
|
||||
sgl_translate(float x, float y, float z)
|
||||
sgl_rotate(float angle_rad, float x, float y, float z)
|
||||
sgl_scale(float x, float y, float z)
|
||||
|
||||
NOTE that all angles in sokol-gl are in radians, not in degree.
|
||||
Convert between radians and degree with the helper functions:
|
||||
|
||||
float sgl_rad(float deg) - degrees to radians
|
||||
float sgl_deg(float rad) - radians to degrees
|
||||
|
||||
...directly load the current matrix from a float[16] array:
|
||||
|
||||
sgl_load_matrix(const float m[16])
|
||||
sgl_load_transpose_matrix(const float m[16])
|
||||
|
||||
...directly multiply the current matrix from a float[16] array:
|
||||
|
||||
sgl_mult_matrix(const float m[16])
|
||||
sgl_mult_transpose_matrix(const float m[16])
|
||||
|
||||
The memory layout of those float[16] arrays is the same as in OpenGL.
|
||||
|
||||
...more matrix functions:
|
||||
|
||||
sgl_frustum(float left, float right, float bottom, float top, float near, float far)
|
||||
sgl_ortho(float left, float right, float bottom, float top, float near, float far)
|
||||
sgl_perspective(float fov_y, float aspect, float near, float far)
|
||||
sgl_lookat(float eye_x, float eye_y, float eye_z, float center_x, float center_y, float center_z, float up_x, float up_y, float up_z)
|
||||
|
||||
These functions work the same as glFrustum(), glOrtho(), gluPerspective()
|
||||
and gluLookAt().
|
||||
|
||||
...and finally to push / pop the current matrix stack:
|
||||
|
||||
sgl_push_matrix(void)
|
||||
sgl_pop_matrix(void)
|
||||
|
||||
Again, these work the same as glPushMatrix() and glPopMatrix().
|
||||
|
||||
--- perform primitive rendering:
|
||||
|
||||
...set the current texture coordinate and color 'registers' with or
|
||||
point size with:
|
||||
|
||||
sgl_t2f(float u, float v) - set current texture coordinate
|
||||
sgl_c*(...) - set current color
|
||||
sgl_point_size(float size) - set current point size
|
||||
|
||||
There are several functions for setting the color (as float values,
|
||||
unsigned byte values, packed as unsigned 32-bit integer, with
|
||||
and without alpha).
|
||||
|
||||
NOTE that these are the only functions that can be called both inside
|
||||
sgl_begin_*() / sgl_end() and outside.
|
||||
|
||||
Also NOTE that point size is currently hardwired to 1.0f if the D3D11
|
||||
backend is used.
|
||||
|
||||
...start a primitive vertex sequence with:
|
||||
|
||||
sgl_begin_points()
|
||||
sgl_begin_lines()
|
||||
sgl_begin_line_strip()
|
||||
sgl_begin_triangles()
|
||||
sgl_begin_triangle_strip()
|
||||
sgl_begin_quads()
|
||||
|
||||
...after sgl_begin_*() specify vertices:
|
||||
|
||||
sgl_v*(...)
|
||||
sgl_v*_t*(...)
|
||||
sgl_v*_c*(...)
|
||||
sgl_v*_t*_c*(...)
|
||||
|
||||
These functions write a new vertex to sokol-gl's internal vertex buffer,
|
||||
optionally with texture-coords and color. If the texture coordinate
|
||||
and/or color is missing, it will be taken from the current texture-coord
|
||||
and color 'register'.
|
||||
|
||||
...finally, after specifying vertices, call:
|
||||
|
||||
sgl_end()
|
||||
|
||||
This will record a new draw command in sokol-gl's internal command
|
||||
list, or it will extend the previous draw command if no relevant
|
||||
state has changed since the last sgl_begin/end pair.
|
||||
|
||||
--- inside a sokol-gfx rendering pass, call the sgl_draw() function
|
||||
to render the currently active context:
|
||||
|
||||
sgl_draw()
|
||||
|
||||
...or alternatively call:
|
||||
|
||||
sgl_context_draw(ctx)
|
||||
|
||||
...to render an explicitly provided context.
|
||||
|
||||
This will render everything that has been recorded in the context since
|
||||
the last call to sgl_draw() through sokol-gfx, and will 'rewind' the internal
|
||||
vertex-, uniform- and command-buffers.
|
||||
|
||||
--- each sokol-gl context tracks internal error states which can
|
||||
be obtains via:
|
||||
|
||||
sgl_error_t sgl_error()
|
||||
|
||||
...alternatively with an explicit context argument:
|
||||
|
||||
sgl_error_t sgl_context_error(ctx);
|
||||
|
||||
...this returns a struct with the following booleans:
|
||||
|
||||
.any - true if any of the below errors is true
|
||||
.vertices_full - internal vertex buffer is full (checked in sgl_end())
|
||||
.uniforms_full - the internal uniforms buffer is full (checked in sgl_end())
|
||||
.commands_full - the internal command buffer is full (checked in sgl_end())
|
||||
.stack_overflow - matrix- or pipeline-stack overflow
|
||||
.stack_underflow - matrix- or pipeline-stack underflow
|
||||
.no_context - the active context no longer exists
|
||||
|
||||
...depending on the above error state, sgl_draw() may skip rendering
|
||||
completely, or only draw partial geometry
|
||||
|
||||
--- you can get the number of recorded vertices and draw commands in the current
|
||||
frame and active sokol-gl context via:
|
||||
|
||||
int sgl_num_vertices()
|
||||
int sgl_num_commands()
|
||||
|
||||
...this allows you to check whether the vertex or command pools are running
|
||||
full before the overflow actually happens (in this case you could also
|
||||
check the error booleans in the result of sgl_error()).
|
||||
|
||||
RENDER LAYERS
|
||||
=============
|
||||
Render layers allow to split sokol-gl rendering into separate draw-command
|
||||
groups which can then be rendered separately in a sokol-gfx draw pass. This
|
||||
allows to mix/interleave sokol-gl rendering with other render operations.
|
||||
|
||||
Layered rendering is controlled through two functions:
|
||||
|
||||
sgl_layer(int layer_id)
|
||||
sgl_draw_layer(int layer_id)
|
||||
|
||||
(and the context-variant sgl_draw_layer(): sgl_context_draw_layer()
|
||||
|
||||
The sgl_layer() function sets the 'current layer', any sokol-gl calls
|
||||
which internally record draw commands will also store the current layer
|
||||
in the draw command, and later in a sokol-gfx render pass, a call
|
||||
to sgl_draw_layer() will only render the draw commands that have
|
||||
a matching layer.
|
||||
|
||||
The default layer is '0', this is active after sokol-gl setup, and
|
||||
is also restored at the start of a new frame (but *not* by calling
|
||||
sgl_defaults()).
|
||||
|
||||
NOTE that calling sgl_draw() is equivalent with sgl_draw_layer(0)
|
||||
(in general you should either use either use sgl_draw() or
|
||||
sgl_draw_layer() in an application, but not both).
|
||||
|
||||
WORKING WITH CONTEXTS:
|
||||
======================
|
||||
If you want to render to more than one sokol-gfx render pass you need to
|
||||
work with additional sokol-gl context objects (one context object for
|
||||
each offscreen rendering pass, in addition to the implicitly created
|
||||
'default context'.
|
||||
|
||||
All sokol-gl state is tracked per context, and there is always a "current
|
||||
context" (with the notable exception that the currently set context is
|
||||
destroyed, more on that later).
|
||||
|
||||
Using multiple contexts can also be useful if you only render in
|
||||
a single pass, but want to maintain multiple independent "state buckets".
|
||||
|
||||
To create new context object, call:
|
||||
|
||||
sgl_context ctx = sgl_make_context(&(sgl_context_desc){
|
||||
.max_vertices = ..., // default: 64k
|
||||
.max_commands = ..., // default: 16k
|
||||
.color_format = ...,
|
||||
.depth_format = ...,
|
||||
.sample_count = ...,
|
||||
});
|
||||
|
||||
The color_format, depth_format and sample_count items must be compatible
|
||||
with the render pass the sgl_draw() or sgL_context_draw() function
|
||||
will be called in.
|
||||
|
||||
Creating a context does *not* make the context current. To do this, call:
|
||||
|
||||
sgl_set_context(ctx);
|
||||
|
||||
The currently active context will implicitly be used by most sokol-gl functions
|
||||
which don't take an explicit context handle as argument.
|
||||
|
||||
To switch back to the default context, pass the global constant SGL_DEFAULT_CONTEXT:
|
||||
|
||||
sgl_set_context(SGL_DEFAULT_CONTEXT);
|
||||
|
||||
...or alternatively use the function sgl_default_context() instead of the
|
||||
global constant:
|
||||
|
||||
sgl_set_context(sgl_default_context());
|
||||
|
||||
To get the currently active context, call:
|
||||
|
||||
sgl_context cur_ctx = sgl_get_context();
|
||||
|
||||
The following functions exist in two variants, one which use the currently
|
||||
active context (set with sgl_set_context()), and another version which
|
||||
takes an explicit context handle instead:
|
||||
|
||||
sgl_make_pipeline() vs sgl_context_make_pipeline()
|
||||
sgl_error() vs sgl_context_error();
|
||||
sgl_draw() vs sgl_context_draw();
|
||||
|
||||
Except for using the currently active context versus a provided context
|
||||
handle, the two variants are exactlyidentical, e.g. the following
|
||||
code sequences do the same thing:
|
||||
|
||||
sgl_set_context(ctx);
|
||||
sgl_pipeline pip = sgl_make_pipeline(...);
|
||||
sgl_error_t err = sgl_error();
|
||||
sgl_draw();
|
||||
|
||||
vs
|
||||
|
||||
sgl_pipeline pip = sgl_context_make_pipeline(ctx, ...);
|
||||
sgl_error_t err = sgl_context_error(ctx);
|
||||
sgl_context_draw(ctx);
|
||||
|
||||
Destroying the currently active context is a 'soft error'. All following
|
||||
calls which require a currently active context will silently fail,
|
||||
and sgl_error() will return SGL_ERROR_NO_CONTEXT.
|
||||
|
||||
UNDER THE HOOD:
|
||||
===============
|
||||
sokol_gl.h works by recording vertex data and rendering commands into
|
||||
memory buffers, and then drawing the recorded commands via sokol_gfx.h
|
||||
|
||||
The only functions which call into sokol_gfx.h are:
|
||||
- sgl_setup()
|
||||
- sgl_shutdown()
|
||||
- sgl_draw() (and variants)
|
||||
|
||||
sgl_setup() must be called after initializing sokol-gfx.
|
||||
sgl_shutdown() must be called before shutting down sokol-gfx.
|
||||
sgl_draw() must be called once per frame inside a sokol-gfx render pass.
|
||||
|
||||
All other sokol-gl function can be called anywhere in a frame, since
|
||||
they just record data into memory buffers owned by sokol-gl.
|
||||
|
||||
What happens in:
|
||||
|
||||
sgl_setup():
|
||||
Unique resources shared by all contexts are created:
|
||||
- a shader object (using embedded shader source or byte code)
|
||||
- an 8x8 white default texture
|
||||
The default context is created, which involves:
|
||||
- 3 memory buffers are created, one for vertex data,
|
||||
one for uniform data, and one for commands
|
||||
- a dynamic vertex buffer is created
|
||||
- the default sgl_pipeline object is created, which involves
|
||||
creating 5 sg_pipeline objects
|
||||
|
||||
One vertex is 24 bytes:
|
||||
- float3 position
|
||||
- float2 texture coords
|
||||
- uint32_t color
|
||||
|
||||
One uniform block is 128 bytes:
|
||||
- mat4 model-view-projection matrix
|
||||
- mat4 texture matrix
|
||||
|
||||
One draw command is ca. 24 bytes for the actual
|
||||
command code plus command arguments.
|
||||
|
||||
Each sgl_end() consumes one command, and one uniform block
|
||||
(only when the matrices have changed).
|
||||
The required size for one sgl_begin/end pair is (at most):
|
||||
|
||||
(152 + 24 * num_verts) bytes
|
||||
|
||||
sgl_shutdown():
|
||||
- all sokol-gfx resources (buffer, shader, default-texture and
|
||||
all pipeline objects) are destroyed
|
||||
- the 3 memory buffers are freed
|
||||
|
||||
sgl_draw() (and variants)
|
||||
- copy all recorded vertex data into the dynamic sokol-gfx buffer
|
||||
via a call to sg_update_buffer()
|
||||
- for each recorded command:
|
||||
- if the layer number stored in the command doesn't match
|
||||
the layer that's to be rendered, skip to the next
|
||||
command
|
||||
- if it's a viewport command, call sg_apply_viewport()
|
||||
- if it's a scissor-rect command, call sg_apply_scissor_rect()
|
||||
- if it's a draw command:
|
||||
- depending on what has changed since the last draw command,
|
||||
call sg_apply_pipeline(), sg_apply_bindings() and
|
||||
sg_apply_uniforms()
|
||||
- finally call sg_draw()
|
||||
|
||||
All other functions only modify the internally tracked state, add
|
||||
data to the vertex, uniform and command buffers, or manipulate
|
||||
the matrix stack.
|
||||
|
||||
ON DRAW COMMAND MERGING
|
||||
=======================
|
||||
Not every call to sgl_end() will automatically record a new draw command.
|
||||
If possible, the previous draw command will simply be extended,
|
||||
resulting in fewer actual draw calls later in sgl_draw().
|
||||
|
||||
A draw command will be merged with the previous command if "no relevant
|
||||
state has changed" since the last sgl_end(), meaning:
|
||||
|
||||
- no calls to sgl_viewport() and sgl_scissor_rect()
|
||||
- the primitive type hasn't changed
|
||||
- the primitive type isn't a 'strip type' (no line or triangle strip)
|
||||
- the pipeline state object hasn't changed
|
||||
- the current layer hasn't changed
|
||||
- none of the matrices has changed
|
||||
- none of the texture state has changed
|
||||
|
||||
Merging a draw command simply means that the number of vertices
|
||||
to render in the previous draw command will be incremented by the
|
||||
number of vertices in the new draw command.
|
||||
|
||||
MEMORY ALLOCATION OVERRIDE
|
||||
==========================
|
||||
You can override the memory allocation functions at initialization time
|
||||
like this:
|
||||
|
||||
void* my_alloc(size_t size, void* user_data) {
|
||||
return malloc(size);
|
||||
}
|
||||
|
||||
void my_free(void* ptr, void* user_data) {
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
...
|
||||
sgl_setup(&(sgl_desc_t){
|
||||
// ...
|
||||
.allocator = {
|
||||
.alloc_fn = my_alloc,
|
||||
.free_fn = my_free,
|
||||
.user_data = ...;
|
||||
}
|
||||
});
|
||||
...
|
||||
|
||||
If no overrides are provided, malloc and free will be used.
|
||||
|
||||
|
||||
ERROR REPORTING AND LOGGING
|
||||
===========================
|
||||
To get any logging information at all you need to provide a logging callback in the setup call,
|
||||
the easiest way is to use sokol_log.h:
|
||||
|
||||
#include "sokol_log.h"
|
||||
|
||||
sgl_setup(&(sgl_desc_t){
|
||||
// ...
|
||||
.logger.func = slog_func
|
||||
});
|
||||
|
||||
To override logging with your own callback, first write a logging function like this:
|
||||
|
||||
void my_log(const char* tag, // e.g. 'sgl'
|
||||
uint32_t log_level, // 0=panic, 1=error, 2=warn, 3=info
|
||||
uint32_t log_item_id, // SGL_LOGITEM_*
|
||||
const char* message_or_null, // a message string, may be nullptr in release mode
|
||||
uint32_t line_nr, // line number in sokol_gl.h
|
||||
const char* filename_or_null, // source filename, may be nullptr in release mode
|
||||
void* user_data)
|
||||
{
|
||||
...
|
||||
}
|
||||
|
||||
...and then setup sokol-gl like this:
|
||||
|
||||
sgl_setup(&(sgl_desc_t){
|
||||
.logger = {
|
||||
.func = my_log,
|
||||
.user_data = my_user_data,
|
||||
}
|
||||
});
|
||||
|
||||
The provided logging function must be reentrant (e.g. be callable from
|
||||
different threads).
|
||||
|
||||
If you don't want to provide your own custom logger it is highly recommended to use
|
||||
the standard logger in sokol_log.h instead, otherwise you won't see any warnings or
|
||||
errors.
|
||||
|
||||
|
||||
LICENSE
|
||||
=======
|
||||
zlib/libpng license
|
||||
|
||||
Copyright (c) 2018 Andre Weissflog
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty.
|
||||
In no event will the authors be held liable for any damages arising from the
|
||||
use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software in a
|
||||
product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
|
||||
*/
|
||||
import sg "../gfx"
|
||||
|
||||
import "core:c"
|
||||
|
||||
_ :: c
|
||||
|
||||
SOKOL_DEBUG :: #config(SOKOL_DEBUG, ODIN_DEBUG)
|
||||
|
||||
DEBUG :: #config(SOKOL_GL_DEBUG, SOKOL_DEBUG)
|
||||
USE_GL :: #config(SOKOL_USE_GL, false)
|
||||
USE_DLL :: #config(SOKOL_DLL, false)
|
||||
|
||||
when ODIN_OS == .Windows {
|
||||
when USE_DLL {
|
||||
when USE_GL {
|
||||
when DEBUG { foreign import sokol_gl_clib { "../sokol_dll_windows_x64_gl_debug.lib" } }
|
||||
else { foreign import sokol_gl_clib { "../sokol_dll_windows_x64_gl_release.lib" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_gl_clib { "../sokol_dll_windows_x64_d3d11_debug.lib" } }
|
||||
else { foreign import sokol_gl_clib { "../sokol_dll_windows_x64_d3d11_release.lib" } }
|
||||
}
|
||||
} else {
|
||||
when USE_GL {
|
||||
when DEBUG { foreign import sokol_gl_clib { "sokol_gl_windows_x64_gl_debug.lib" } }
|
||||
else { foreign import sokol_gl_clib { "sokol_gl_windows_x64_gl_release.lib" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_gl_clib { "sokol_gl_windows_x64_d3d11_debug.lib" } }
|
||||
else { foreign import sokol_gl_clib { "sokol_gl_windows_x64_d3d11_release.lib" } }
|
||||
}
|
||||
}
|
||||
} else when ODIN_OS == .Darwin {
|
||||
when USE_DLL {
|
||||
when USE_GL && ODIN_ARCH == .arm64 && DEBUG { foreign import sokol_gl_clib { "../dylib/sokol_dylib_macos_arm64_gl_debug.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .arm64 && !DEBUG { foreign import sokol_gl_clib { "../dylib/sokol_dylib_macos_arm64_gl_release.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .amd64 && DEBUG { foreign import sokol_gl_clib { "../dylib/sokol_dylib_macos_x64_gl_debug.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .amd64 && !DEBUG { foreign import sokol_gl_clib { "../dylib/sokol_dylib_macos_x64_gl_release.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .arm64 && DEBUG { foreign import sokol_gl_clib { "../dylib/sokol_dylib_macos_arm64_metal_debug.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .arm64 && !DEBUG { foreign import sokol_gl_clib { "../dylib/sokol_dylib_macos_arm64_metal_release.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .amd64 && DEBUG { foreign import sokol_gl_clib { "../dylib/sokol_dylib_macos_x64_metal_debug.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .amd64 && !DEBUG { foreign import sokol_gl_clib { "../dylib/sokol_dylib_macos_x64_metal_release.dylib" } }
|
||||
} else {
|
||||
when USE_GL {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when DEBUG { foreign import sokol_gl_clib { "sokol_gl_macos_arm64_gl_debug.a" } }
|
||||
else { foreign import sokol_gl_clib { "sokol_gl_macos_arm64_gl_release.a" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_gl_clib { "sokol_gl_macos_x64_gl_debug.a" } }
|
||||
else { foreign import sokol_gl_clib { "sokol_gl_macos_x64_gl_release.a" } }
|
||||
}
|
||||
} else {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when DEBUG { foreign import sokol_gl_clib { "sokol_gl_macos_arm64_metal_debug.a" } }
|
||||
else { foreign import sokol_gl_clib { "sokol_gl_macos_arm64_metal_release.a" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_gl_clib { "sokol_gl_macos_x64_metal_debug.a" } }
|
||||
else { foreign import sokol_gl_clib { "sokol_gl_macos_x64_metal_release.a" } }
|
||||
}
|
||||
}
|
||||
}
|
||||
} else when ODIN_OS == .Linux {
|
||||
when USE_DLL {
|
||||
when DEBUG { foreign import sokol_gl_clib { "sokol_gl_linux_x64_gl_debug.so" } }
|
||||
else { foreign import sokol_gl_clib { "sokol_gl_linux_x64_gl_release.so" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_gl_clib { "sokol_gl_linux_x64_gl_debug.a" } }
|
||||
else { foreign import sokol_gl_clib { "sokol_gl_linux_x64_gl_release.a" } }
|
||||
}
|
||||
} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 {
|
||||
// Feed sokol_gl_wasm_gl_debug.a or sokol_gl_wasm_gl_release.a into emscripten compiler.
|
||||
foreign import sokol_gl_clib { "env.o" }
|
||||
} else {
|
||||
#panic("This OS is currently not supported")
|
||||
}
|
||||
|
||||
@(default_calling_convention="c", link_prefix="sgl_")
|
||||
foreign sokol_gl_clib {
|
||||
// setup/shutdown/misc
|
||||
setup :: proc(#by_ptr desc: Desc) ---
|
||||
shutdown :: proc() ---
|
||||
rad :: proc(deg: f32) -> f32 ---
|
||||
deg :: proc(rad: f32) -> f32 ---
|
||||
error :: proc() -> Error ---
|
||||
context_error :: proc(ctx: Context) -> Error ---
|
||||
// context functions
|
||||
make_context :: proc(#by_ptr desc: Context_Desc) -> Context ---
|
||||
destroy_context :: proc(ctx: Context) ---
|
||||
set_context :: proc(ctx: Context) ---
|
||||
get_context :: proc() -> Context ---
|
||||
default_context :: proc() -> Context ---
|
||||
// get information about recorded vertices and commands in current context
|
||||
num_vertices :: proc() -> c.int ---
|
||||
num_commands :: proc() -> c.int ---
|
||||
// draw recorded commands (call inside a sokol-gfx render pass)
|
||||
draw :: proc() ---
|
||||
context_draw :: proc(ctx: Context) ---
|
||||
draw_layer :: proc(#any_int layer_id: c.int) ---
|
||||
context_draw_layer :: proc(ctx: Context, #any_int layer_id: c.int) ---
|
||||
// create and destroy pipeline objects
|
||||
make_pipeline :: proc(#by_ptr desc: sg.Pipeline_Desc) -> Pipeline ---
|
||||
context_make_pipeline :: proc(ctx: Context, #by_ptr desc: sg.Pipeline_Desc) -> Pipeline ---
|
||||
destroy_pipeline :: proc(pip: Pipeline) ---
|
||||
// render state functions
|
||||
defaults :: proc() ---
|
||||
viewport :: proc(#any_int x: c.int, #any_int y: c.int, #any_int w: c.int, #any_int h: c.int, origin_top_left: bool) ---
|
||||
viewportf :: proc(x: f32, y: f32, w: f32, h: f32, origin_top_left: bool) ---
|
||||
scissor_rect :: proc(#any_int x: c.int, #any_int y: c.int, #any_int w: c.int, #any_int h: c.int, origin_top_left: bool) ---
|
||||
scissor_rectf :: proc(x: f32, y: f32, w: f32, h: f32, origin_top_left: bool) ---
|
||||
enable_texture :: proc() ---
|
||||
disable_texture :: proc() ---
|
||||
texture :: proc(img: sg.Image, smp: sg.Sampler) ---
|
||||
layer :: proc(#any_int layer_id: c.int) ---
|
||||
// pipeline stack functions
|
||||
load_default_pipeline :: proc() ---
|
||||
load_pipeline :: proc(pip: Pipeline) ---
|
||||
push_pipeline :: proc() ---
|
||||
pop_pipeline :: proc() ---
|
||||
// matrix stack functions
|
||||
matrix_mode_modelview :: proc() ---
|
||||
matrix_mode_projection :: proc() ---
|
||||
matrix_mode_texture :: proc() ---
|
||||
load_identity :: proc() ---
|
||||
load_matrix :: proc(m: ^f32) ---
|
||||
load_transpose_matrix :: proc(m: ^f32) ---
|
||||
mult_matrix :: proc(m: ^f32) ---
|
||||
mult_transpose_matrix :: proc(m: ^f32) ---
|
||||
rotate :: proc(angle_rad: f32, x: f32, y: f32, z: f32) ---
|
||||
scale :: proc(x: f32, y: f32, z: f32) ---
|
||||
translate :: proc(x: f32, y: f32, z: f32) ---
|
||||
frustum :: proc(l: f32, r: f32, b: f32, t: f32, n: f32, f: f32) ---
|
||||
ortho :: proc(l: f32, r: f32, b: f32, t: f32, n: f32, f: f32) ---
|
||||
perspective :: proc(fov_y: f32, aspect: f32, z_near: f32, z_far: f32) ---
|
||||
lookat :: proc(eye_x: f32, eye_y: f32, eye_z: f32, center_x: f32, center_y: f32, center_z: f32, up_x: f32, up_y: f32, up_z: f32) ---
|
||||
push_matrix :: proc() ---
|
||||
pop_matrix :: proc() ---
|
||||
// these functions only set the internal 'current texcoord / color / point size' (valid inside or outside begin/end)
|
||||
t2f :: proc(u: f32, v: f32) ---
|
||||
c3f :: proc(r: f32, g: f32, b: f32) ---
|
||||
c4f :: proc(r: f32, g: f32, b: f32, a: f32) ---
|
||||
c3b :: proc(r: u8, g: u8, b: u8) ---
|
||||
c4b :: proc(r: u8, g: u8, b: u8, a: u8) ---
|
||||
c1i :: proc(rgba: u32) ---
|
||||
point_size :: proc(s: f32) ---
|
||||
// define primitives, each begin/end is one draw command
|
||||
begin_points :: proc() ---
|
||||
begin_lines :: proc() ---
|
||||
begin_line_strip :: proc() ---
|
||||
begin_triangles :: proc() ---
|
||||
begin_triangle_strip :: proc() ---
|
||||
begin_quads :: proc() ---
|
||||
v2f :: proc(x: f32, y: f32) ---
|
||||
v3f :: proc(x: f32, y: f32, z: f32) ---
|
||||
v2f_t2f :: proc(x: f32, y: f32, u: f32, v: f32) ---
|
||||
v3f_t2f :: proc(x: f32, y: f32, z: f32, u: f32, v: f32) ---
|
||||
v2f_c3f :: proc(x: f32, y: f32, r: f32, g: f32, b: f32) ---
|
||||
v2f_c3b :: proc(x: f32, y: f32, r: u8, g: u8, b: u8) ---
|
||||
v2f_c4f :: proc(x: f32, y: f32, r: f32, g: f32, b: f32, a: f32) ---
|
||||
v2f_c4b :: proc(x: f32, y: f32, r: u8, g: u8, b: u8, a: u8) ---
|
||||
v2f_c1i :: proc(x: f32, y: f32, rgba: u32) ---
|
||||
v3f_c3f :: proc(x: f32, y: f32, z: f32, r: f32, g: f32, b: f32) ---
|
||||
v3f_c3b :: proc(x: f32, y: f32, z: f32, r: u8, g: u8, b: u8) ---
|
||||
v3f_c4f :: proc(x: f32, y: f32, z: f32, r: f32, g: f32, b: f32, a: f32) ---
|
||||
v3f_c4b :: proc(x: f32, y: f32, z: f32, r: u8, g: u8, b: u8, a: u8) ---
|
||||
v3f_c1i :: proc(x: f32, y: f32, z: f32, rgba: u32) ---
|
||||
v2f_t2f_c3f :: proc(x: f32, y: f32, u: f32, v: f32, r: f32, g: f32, b: f32) ---
|
||||
v2f_t2f_c3b :: proc(x: f32, y: f32, u: f32, v: f32, r: u8, g: u8, b: u8) ---
|
||||
v2f_t2f_c4f :: proc(x: f32, y: f32, u: f32, v: f32, r: f32, g: f32, b: f32, a: f32) ---
|
||||
v2f_t2f_c4b :: proc(x: f32, y: f32, u: f32, v: f32, r: u8, g: u8, b: u8, a: u8) ---
|
||||
v2f_t2f_c1i :: proc(x: f32, y: f32, u: f32, v: f32, rgba: u32) ---
|
||||
v3f_t2f_c3f :: proc(x: f32, y: f32, z: f32, u: f32, v: f32, r: f32, g: f32, b: f32) ---
|
||||
v3f_t2f_c3b :: proc(x: f32, y: f32, z: f32, u: f32, v: f32, r: u8, g: u8, b: u8) ---
|
||||
v3f_t2f_c4f :: proc(x: f32, y: f32, z: f32, u: f32, v: f32, r: f32, g: f32, b: f32, a: f32) ---
|
||||
v3f_t2f_c4b :: proc(x: f32, y: f32, z: f32, u: f32, v: f32, r: u8, g: u8, b: u8, a: u8) ---
|
||||
v3f_t2f_c1i :: proc(x: f32, y: f32, z: f32, u: f32, v: f32, rgba: u32) ---
|
||||
end :: proc() ---
|
||||
}
|
||||
|
||||
Log_Item :: enum i32 {
|
||||
OK,
|
||||
MALLOC_FAILED,
|
||||
MAKE_PIPELINE_FAILED,
|
||||
PIPELINE_POOL_EXHAUSTED,
|
||||
ADD_COMMIT_LISTENER_FAILED,
|
||||
CONTEXT_POOL_EXHAUSTED,
|
||||
CANNOT_DESTROY_DEFAULT_CONTEXT,
|
||||
}
|
||||
|
||||
/*
|
||||
sgl_logger_t
|
||||
|
||||
Used in sgl_desc_t to provide a custom logging and error reporting
|
||||
callback to sokol-gl.
|
||||
*/
|
||||
Logger :: struct {
|
||||
func : proc "c" (a0: cstring, a1: u32, a2: u32, a3: cstring, a4: u32, a5: cstring, a6: rawptr),
|
||||
user_data : rawptr,
|
||||
}
|
||||
|
||||
// sokol_gl pipeline handle (created with sgl_make_pipeline())
|
||||
Pipeline :: struct {
|
||||
id : u32,
|
||||
}
|
||||
|
||||
// a context handle (created with sgl_make_context())
|
||||
Context :: struct {
|
||||
id : u32,
|
||||
}
|
||||
|
||||
/*
|
||||
sgl_error_t
|
||||
|
||||
Errors are reset each frame after calling sgl_draw(),
|
||||
get the last error code with sgl_error()
|
||||
*/
|
||||
Error :: struct {
|
||||
any : bool,
|
||||
vertices_full : bool,
|
||||
uniforms_full : bool,
|
||||
commands_full : bool,
|
||||
stack_overflow : bool,
|
||||
stack_underflow : bool,
|
||||
no_context : bool,
|
||||
}
|
||||
|
||||
/*
|
||||
sgl_context_desc_t
|
||||
|
||||
Describes the initialization parameters of a rendering context.
|
||||
Creating additional contexts is useful if you want to render
|
||||
in separate sokol-gfx passes.
|
||||
*/
|
||||
Context_Desc :: struct {
|
||||
max_vertices : c.int,
|
||||
max_commands : c.int,
|
||||
color_format : sg.Pixel_Format,
|
||||
depth_format : sg.Pixel_Format,
|
||||
sample_count : c.int,
|
||||
}
|
||||
|
||||
/*
|
||||
sgl_allocator_t
|
||||
|
||||
Used in sgl_desc_t to provide custom memory-alloc and -free functions
|
||||
to sokol_gl.h. If memory management should be overridden, both the
|
||||
alloc and free function must be provided (e.g. it's not valid to
|
||||
override one function but not the other).
|
||||
*/
|
||||
Allocator :: struct {
|
||||
alloc_fn : proc "c" (a0: c.size_t, a1: rawptr) -> rawptr,
|
||||
free_fn : proc "c" (a0: rawptr, a1: rawptr),
|
||||
user_data : rawptr,
|
||||
}
|
||||
|
||||
Desc :: struct {
|
||||
max_vertices : c.int,
|
||||
max_commands : c.int,
|
||||
context_pool_size : c.int,
|
||||
pipeline_pool_size : c.int,
|
||||
color_format : sg.Pixel_Format,
|
||||
depth_format : sg.Pixel_Format,
|
||||
sample_count : c.int,
|
||||
face_winding : sg.Face_Winding,
|
||||
allocator : Allocator,
|
||||
logger : Logger,
|
||||
}
|
||||
|
164
thirdparty/sokol/glue/glue.odin
vendored
Normal file
164
thirdparty/sokol/glue/glue.odin
vendored
Normal file
@@ -0,0 +1,164 @@
|
||||
// machine generated, do not edit
|
||||
|
||||
package sokol_glue
|
||||
|
||||
/*
|
||||
|
||||
sokol_glue.h -- glue helper functions for sokol headers
|
||||
|
||||
Project URL: https://github.com/floooh/sokol
|
||||
|
||||
Do this:
|
||||
#define SOKOL_IMPL or
|
||||
#define SOKOL_GLUE_IMPL
|
||||
before you include this file in *one* C or C++ file to create the
|
||||
implementation.
|
||||
|
||||
...optionally provide the following macros to override defaults:
|
||||
|
||||
SOKOL_ASSERT(c) - your own assert macro (default: assert(c))
|
||||
SOKOL_GLUE_API_DECL - public function declaration prefix (default: extern)
|
||||
SOKOL_API_DECL - same as SOKOL_GLUE_API_DECL
|
||||
SOKOL_API_IMPL - public function implementation prefix (default: -)
|
||||
|
||||
If sokol_glue.h is compiled as a DLL, define the following before
|
||||
including the declaration or implementation:
|
||||
|
||||
SOKOL_DLL
|
||||
|
||||
On Windows, SOKOL_DLL will define SOKOL_GLUE_API_DECL as __declspec(dllexport)
|
||||
or __declspec(dllimport) as needed.
|
||||
|
||||
OVERVIEW
|
||||
========
|
||||
sokol_glue.h provides glue helper functions between sokol_gfx.h and sokol_app.h,
|
||||
so that sokol_gfx.h doesn't need to depend on sokol_app.h but can be
|
||||
used with different window system glue libraries.
|
||||
|
||||
PROVIDED FUNCTIONS
|
||||
==================
|
||||
|
||||
sg_environment sglue_environment(void)
|
||||
|
||||
Returns an sg_environment struct initialized by calling sokol_app.h
|
||||
functions. Use this in the sg_setup() call like this:
|
||||
|
||||
sg_setup(&(sg_desc){
|
||||
.environment = sglue_environment(),
|
||||
...
|
||||
});
|
||||
|
||||
sg_swapchain sglue_swapchain(void)
|
||||
|
||||
Returns an sg_swapchain struct initialized by calling sokol_app.h
|
||||
functions. Use this in sg_begin_pass() for a 'swapchain pass' like
|
||||
this:
|
||||
|
||||
sg_begin_pass(&(sg_pass){ .swapchain = sglue_swapchain(), ... });
|
||||
|
||||
LICENSE
|
||||
=======
|
||||
zlib/libpng license
|
||||
|
||||
Copyright (c) 2018 Andre Weissflog
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty.
|
||||
In no event will the authors be held liable for any damages arising from the
|
||||
use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software in a
|
||||
product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
|
||||
*/
|
||||
import sg "../gfx"
|
||||
|
||||
import "core:c"
|
||||
|
||||
_ :: c
|
||||
|
||||
SOKOL_DEBUG :: #config(SOKOL_DEBUG, ODIN_DEBUG)
|
||||
|
||||
DEBUG :: #config(SOKOL_GLUE_DEBUG, SOKOL_DEBUG)
|
||||
USE_GL :: #config(SOKOL_USE_GL, false)
|
||||
USE_DLL :: #config(SOKOL_DLL, false)
|
||||
|
||||
when ODIN_OS == .Windows {
|
||||
when USE_DLL {
|
||||
when USE_GL {
|
||||
when DEBUG { foreign import sokol_glue_clib { "../sokol_dll_windows_x64_gl_debug.lib" } }
|
||||
else { foreign import sokol_glue_clib { "../sokol_dll_windows_x64_gl_release.lib" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_glue_clib { "../sokol_dll_windows_x64_d3d11_debug.lib" } }
|
||||
else { foreign import sokol_glue_clib { "../sokol_dll_windows_x64_d3d11_release.lib" } }
|
||||
}
|
||||
} else {
|
||||
when USE_GL {
|
||||
when DEBUG { foreign import sokol_glue_clib { "sokol_glue_windows_x64_gl_debug.lib" } }
|
||||
else { foreign import sokol_glue_clib { "sokol_glue_windows_x64_gl_release.lib" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_glue_clib { "sokol_glue_windows_x64_d3d11_debug.lib" } }
|
||||
else { foreign import sokol_glue_clib { "sokol_glue_windows_x64_d3d11_release.lib" } }
|
||||
}
|
||||
}
|
||||
} else when ODIN_OS == .Darwin {
|
||||
when USE_DLL {
|
||||
when USE_GL && ODIN_ARCH == .arm64 && DEBUG { foreign import sokol_glue_clib { "../dylib/sokol_dylib_macos_arm64_gl_debug.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .arm64 && !DEBUG { foreign import sokol_glue_clib { "../dylib/sokol_dylib_macos_arm64_gl_release.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .amd64 && DEBUG { foreign import sokol_glue_clib { "../dylib/sokol_dylib_macos_x64_gl_debug.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .amd64 && !DEBUG { foreign import sokol_glue_clib { "../dylib/sokol_dylib_macos_x64_gl_release.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .arm64 && DEBUG { foreign import sokol_glue_clib { "../dylib/sokol_dylib_macos_arm64_metal_debug.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .arm64 && !DEBUG { foreign import sokol_glue_clib { "../dylib/sokol_dylib_macos_arm64_metal_release.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .amd64 && DEBUG { foreign import sokol_glue_clib { "../dylib/sokol_dylib_macos_x64_metal_debug.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .amd64 && !DEBUG { foreign import sokol_glue_clib { "../dylib/sokol_dylib_macos_x64_metal_release.dylib" } }
|
||||
} else {
|
||||
when USE_GL {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when DEBUG { foreign import sokol_glue_clib { "sokol_glue_macos_arm64_gl_debug.a" } }
|
||||
else { foreign import sokol_glue_clib { "sokol_glue_macos_arm64_gl_release.a" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_glue_clib { "sokol_glue_macos_x64_gl_debug.a" } }
|
||||
else { foreign import sokol_glue_clib { "sokol_glue_macos_x64_gl_release.a" } }
|
||||
}
|
||||
} else {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when DEBUG { foreign import sokol_glue_clib { "sokol_glue_macos_arm64_metal_debug.a" } }
|
||||
else { foreign import sokol_glue_clib { "sokol_glue_macos_arm64_metal_release.a" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_glue_clib { "sokol_glue_macos_x64_metal_debug.a" } }
|
||||
else { foreign import sokol_glue_clib { "sokol_glue_macos_x64_metal_release.a" } }
|
||||
}
|
||||
}
|
||||
}
|
||||
} else when ODIN_OS == .Linux {
|
||||
when USE_DLL {
|
||||
when DEBUG { foreign import sokol_glue_clib { "sokol_glue_linux_x64_gl_debug.so" } }
|
||||
else { foreign import sokol_glue_clib { "sokol_glue_linux_x64_gl_release.so" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_glue_clib { "sokol_glue_linux_x64_gl_debug.a" } }
|
||||
else { foreign import sokol_glue_clib { "sokol_glue_linux_x64_gl_release.a" } }
|
||||
}
|
||||
} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 {
|
||||
// Feed sokol_glue_wasm_gl_debug.a or sokol_glue_wasm_gl_release.a into emscripten compiler.
|
||||
foreign import sokol_glue_clib { "env.o" }
|
||||
} else {
|
||||
#panic("This OS is currently not supported")
|
||||
}
|
||||
|
||||
@(default_calling_convention="c", link_prefix="sglue_")
|
||||
foreign sokol_glue_clib {
|
||||
environment :: proc() -> sg.Environment ---
|
||||
swapchain :: proc() -> sg.Swapchain ---
|
||||
}
|
||||
|
38
thirdparty/sokol/helpers/allocator.odin
vendored
Normal file
38
thirdparty/sokol/helpers/allocator.odin
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
package sokol_helpers
|
||||
|
||||
// Use native odin allocators in sokol allocator interface
|
||||
|
||||
import sapp "../app"
|
||||
import sg "../gfx"
|
||||
import "base:runtime"
|
||||
import "core:c"
|
||||
|
||||
Allocator :: struct {
|
||||
alloc_fn: proc "c" (size: c.size_t, user_data: rawptr) -> rawptr,
|
||||
free_fn: proc "c" (ptr: rawptr, user_data: rawptr),
|
||||
user_data: rawptr,
|
||||
}
|
||||
|
||||
// context_ptr: a pointer to a context which persists during the lifetime of the program.
|
||||
// Note: you can transmute() this into a logger for any specific sokol library.
|
||||
allocator :: proc(context_ptr: ^runtime.Context) -> Allocator {
|
||||
return {
|
||||
alloc_fn = allocator_alloc_proc,
|
||||
free_fn = allocator_free_proc,
|
||||
user_data = cast(rawptr)context_ptr,
|
||||
}
|
||||
}
|
||||
|
||||
allocator_alloc_proc :: proc "c" (size: c.size_t, user_data: rawptr) -> rawptr {
|
||||
context = (cast(^runtime.Context)user_data)^
|
||||
bytes, err := runtime.mem_alloc(size = int(size))
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return raw_data(bytes)
|
||||
}
|
||||
|
||||
allocator_free_proc :: proc "c" (ptr: rawptr, user_data: rawptr) {
|
||||
context = (cast(^runtime.Context)user_data)^
|
||||
runtime.mem_free(ptr)
|
||||
}
|
37
thirdparty/sokol/helpers/glue.odin
vendored
Normal file
37
thirdparty/sokol/helpers/glue.odin
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
package sokol_helpers
|
||||
|
||||
// Alternative native odin implementation of sokol_glue.h, in case you want to minimize C dependencies
|
||||
// (since sokol_glue is only a few lines of code)
|
||||
|
||||
import sapp "../app"
|
||||
import sg "../gfx"
|
||||
|
||||
glue_environment :: proc() -> (env: sg.Environment) {
|
||||
env.defaults.color_format = cast(sg.Pixel_Format)sapp.color_format()
|
||||
env.defaults.depth_format = cast(sg.Pixel_Format)sapp.depth_format()
|
||||
env.defaults.sample_count = sapp.sample_count()
|
||||
env.metal.device = sapp.metal_get_device()
|
||||
env.d3d11.device = sapp.d3d11_get_device()
|
||||
env.d3d11.device_context = sapp.d3d11_get_device_context()
|
||||
env.wgpu.device = sapp.wgpu_get_device()
|
||||
return env
|
||||
}
|
||||
|
||||
glue_swapchain :: proc() -> (swapchain: sg.Swapchain) {
|
||||
swapchain.width = sapp.width()
|
||||
swapchain.height = sapp.height()
|
||||
swapchain.sample_count = sapp.sample_count()
|
||||
swapchain.color_format = cast(sg.Pixel_Format)sapp.color_format()
|
||||
swapchain.depth_format = cast(sg.Pixel_Format)sapp.depth_format()
|
||||
swapchain.metal.current_drawable = sapp.metal_get_current_drawable()
|
||||
swapchain.metal.depth_stencil_texture = sapp.metal_get_depth_stencil_texture()
|
||||
swapchain.metal.msaa_color_texture = sapp.metal_get_msaa_color_texture()
|
||||
swapchain.d3d11.render_view = sapp.d3d11_get_render_view()
|
||||
swapchain.d3d11.resolve_view = sapp.d3d11_get_resolve_view()
|
||||
swapchain.d3d11.depth_stencil_view = sapp.d3d11_get_depth_stencil_view()
|
||||
swapchain.wgpu.render_view = sapp.wgpu_get_render_view()
|
||||
swapchain.wgpu.resolve_view = sapp.wgpu_get_resolve_view()
|
||||
swapchain.wgpu.depth_stencil_view = sapp.wgpu_get_depth_stencil_view()
|
||||
swapchain.gl.framebuffer = sapp.gl_get_framebuffer()
|
||||
return swapchain
|
||||
}
|
59
thirdparty/sokol/helpers/logger.odin
vendored
Normal file
59
thirdparty/sokol/helpers/logger.odin
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
package sokol_helpers
|
||||
|
||||
// Pass sokol logs into native odin logging system
|
||||
|
||||
import sapp "../app"
|
||||
import sg "../gfx"
|
||||
import "base:runtime"
|
||||
import "core:log"
|
||||
|
||||
Logger :: struct {
|
||||
func: proc "c" (
|
||||
tag: cstring,
|
||||
log_level: u32,
|
||||
log_item: u32,
|
||||
message: cstring,
|
||||
line_nr: u32,
|
||||
filename: cstring,
|
||||
user_data: rawptr,
|
||||
),
|
||||
user_data: rawptr,
|
||||
}
|
||||
|
||||
// context_ptr: a pointer to a context which persists during the lifetime of the program.
|
||||
// Note: you can transmute() this into a logger for any specific sokol library.
|
||||
logger :: proc "contextless" (context_ptr: ^runtime.Context) -> Logger {
|
||||
return {func = logger_proc, user_data = cast(rawptr)context_ptr}
|
||||
}
|
||||
|
||||
logger_proc :: proc "c" (
|
||||
tag: cstring,
|
||||
log_level: u32,
|
||||
log_item: u32,
|
||||
message: cstring,
|
||||
line_nr: u32,
|
||||
filename: cstring,
|
||||
user_data: rawptr,
|
||||
) {
|
||||
context = (cast(^runtime.Context)user_data)^
|
||||
|
||||
loc := runtime.Source_Code_Location {
|
||||
file_path = string(filename),
|
||||
line = i32(line_nr),
|
||||
}
|
||||
|
||||
level: log.Level
|
||||
switch log_level {
|
||||
case 0:
|
||||
log.panicf("Sokol Panic: (%i) %s: %s", log_item, tag, message, location = loc)
|
||||
|
||||
case 1:
|
||||
level = .Error
|
||||
case 2:
|
||||
level = .Warning
|
||||
case:
|
||||
level = .Info
|
||||
}
|
||||
|
||||
log.logf(level, "(%i) %s: %s", log_item, tag, message, location = loc)
|
||||
}
|
193
thirdparty/sokol/log/log.odin
vendored
Normal file
193
thirdparty/sokol/log/log.odin
vendored
Normal file
@@ -0,0 +1,193 @@
|
||||
// machine generated, do not edit
|
||||
|
||||
package sokol_log
|
||||
|
||||
/*
|
||||
|
||||
sokol_log.h -- common logging callback for sokol headers
|
||||
|
||||
Project URL: https://github.com/floooh/sokol
|
||||
|
||||
Example code: https://github.com/floooh/sokol-samples
|
||||
|
||||
Do this:
|
||||
#define SOKOL_IMPL or
|
||||
#define SOKOL_LOG_IMPL
|
||||
before you include this file in *one* C or C++ file to create the
|
||||
implementation.
|
||||
|
||||
Optionally provide the following defines when building the implementation:
|
||||
|
||||
SOKOL_ASSERT(c) - your own assert macro (default: assert(c))
|
||||
SOKOL_UNREACHABLE() - a guard macro for unreachable code (default: assert(false))
|
||||
SOKOL_LOG_API_DECL - public function declaration prefix (default: extern)
|
||||
SOKOL_API_DECL - same as SOKOL_GFX_API_DECL
|
||||
SOKOL_API_IMPL - public function implementation prefix (default: -)
|
||||
|
||||
Optionally define the following for verbose output:
|
||||
|
||||
SOKOL_DEBUG - by default this is defined if _DEBUG is defined
|
||||
|
||||
|
||||
OVERVIEW
|
||||
========
|
||||
sokol_log.h provides a default logging callback for other sokol headers.
|
||||
|
||||
To use the default log callback, just include sokol_log.h and provide
|
||||
a function pointer to the 'slog_func' function when setting up the
|
||||
sokol library:
|
||||
|
||||
For instance with sokol_audio.h:
|
||||
|
||||
#include "sokol_log.h"
|
||||
...
|
||||
saudio_setup(&(saudio_desc){ .logger.func = slog_func });
|
||||
|
||||
Logging output goes to stderr and/or a platform specific logging subsystem
|
||||
(which means that in some scenarios you might see logging messages duplicated):
|
||||
|
||||
- Windows: stderr + OutputDebugStringA()
|
||||
- macOS/iOS/Linux: stderr + syslog()
|
||||
- Emscripten: console.info()/warn()/error()
|
||||
- Android: __android_log_write()
|
||||
|
||||
On Windows with sokol_app.h also note the runtime config items to make
|
||||
stdout/stderr output visible on the console for WinMain() applications
|
||||
via sapp_desc.win32_console_attach or sapp_desc.win32_console_create,
|
||||
however when running in a debugger on Windows, the logging output should
|
||||
show up on the debug output UI panel.
|
||||
|
||||
In debug mode, a log message might look like this:
|
||||
|
||||
[sspine][error][id:12] /Users/floh/projects/sokol/util/sokol_spine.h:3472:0:
|
||||
SKELETON_DESC_NO_ATLAS: no atlas object provided in sspine_skeleton_desc.atlas
|
||||
|
||||
The source path and line number is formatted like compiler errors, in some IDEs (like VSCode)
|
||||
such error messages are clickable.
|
||||
|
||||
In release mode, logging is less verbose as to not bloat the executable with string data, but you still get
|
||||
enough information to identify the type and location of an error:
|
||||
|
||||
[sspine][error][id:12][line:3472]
|
||||
|
||||
RULES FOR WRITING YOUR OWN LOGGING FUNCTION
|
||||
===========================================
|
||||
- must be re-entrant because it might be called from different threads
|
||||
- must treat **all** provided string pointers as optional (can be null)
|
||||
- don't store the string pointers, copy the string data instead
|
||||
- must not return for log level panic
|
||||
|
||||
LICENSE
|
||||
=======
|
||||
zlib/libpng license
|
||||
|
||||
Copyright (c) 2023 Andre Weissflog
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty.
|
||||
In no event will the authors be held liable for any damages arising from the
|
||||
use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software in a
|
||||
product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
|
||||
*/
|
||||
|
||||
import "core:c"
|
||||
|
||||
_ :: c
|
||||
|
||||
SOKOL_DEBUG :: #config(SOKOL_DEBUG, ODIN_DEBUG)
|
||||
|
||||
DEBUG :: #config(SOKOL_LOG_DEBUG, SOKOL_DEBUG)
|
||||
USE_GL :: #config(SOKOL_USE_GL, false)
|
||||
USE_DLL :: #config(SOKOL_DLL, false)
|
||||
|
||||
when ODIN_OS == .Windows {
|
||||
when USE_DLL {
|
||||
when USE_GL {
|
||||
when DEBUG { foreign import sokol_log_clib { "../sokol_dll_windows_x64_gl_debug.lib" } }
|
||||
else { foreign import sokol_log_clib { "../sokol_dll_windows_x64_gl_release.lib" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_log_clib { "../sokol_dll_windows_x64_d3d11_debug.lib" } }
|
||||
else { foreign import sokol_log_clib { "../sokol_dll_windows_x64_d3d11_release.lib" } }
|
||||
}
|
||||
} else {
|
||||
when USE_GL {
|
||||
when DEBUG { foreign import sokol_log_clib { "sokol_log_windows_x64_gl_debug.lib" } }
|
||||
else { foreign import sokol_log_clib { "sokol_log_windows_x64_gl_release.lib" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_log_clib { "sokol_log_windows_x64_d3d11_debug.lib" } }
|
||||
else { foreign import sokol_log_clib { "sokol_log_windows_x64_d3d11_release.lib" } }
|
||||
}
|
||||
}
|
||||
} else when ODIN_OS == .Darwin {
|
||||
when USE_DLL {
|
||||
when USE_GL && ODIN_ARCH == .arm64 && DEBUG { foreign import sokol_log_clib { "../dylib/sokol_dylib_macos_arm64_gl_debug.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .arm64 && !DEBUG { foreign import sokol_log_clib { "../dylib/sokol_dylib_macos_arm64_gl_release.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .amd64 && DEBUG { foreign import sokol_log_clib { "../dylib/sokol_dylib_macos_x64_gl_debug.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .amd64 && !DEBUG { foreign import sokol_log_clib { "../dylib/sokol_dylib_macos_x64_gl_release.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .arm64 && DEBUG { foreign import sokol_log_clib { "../dylib/sokol_dylib_macos_arm64_metal_debug.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .arm64 && !DEBUG { foreign import sokol_log_clib { "../dylib/sokol_dylib_macos_arm64_metal_release.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .amd64 && DEBUG { foreign import sokol_log_clib { "../dylib/sokol_dylib_macos_x64_metal_debug.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .amd64 && !DEBUG { foreign import sokol_log_clib { "../dylib/sokol_dylib_macos_x64_metal_release.dylib" } }
|
||||
} else {
|
||||
when USE_GL {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when DEBUG { foreign import sokol_log_clib { "sokol_log_macos_arm64_gl_debug.a" } }
|
||||
else { foreign import sokol_log_clib { "sokol_log_macos_arm64_gl_release.a" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_log_clib { "sokol_log_macos_x64_gl_debug.a" } }
|
||||
else { foreign import sokol_log_clib { "sokol_log_macos_x64_gl_release.a" } }
|
||||
}
|
||||
} else {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when DEBUG { foreign import sokol_log_clib { "sokol_log_macos_arm64_metal_debug.a" } }
|
||||
else { foreign import sokol_log_clib { "sokol_log_macos_arm64_metal_release.a" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_log_clib { "sokol_log_macos_x64_metal_debug.a" } }
|
||||
else { foreign import sokol_log_clib { "sokol_log_macos_x64_metal_release.a" } }
|
||||
}
|
||||
}
|
||||
}
|
||||
} else when ODIN_OS == .Linux {
|
||||
when USE_DLL {
|
||||
when DEBUG { foreign import sokol_log_clib { "sokol_log_linux_x64_gl_debug.so" } }
|
||||
else { foreign import sokol_log_clib { "sokol_log_linux_x64_gl_release.so" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_log_clib { "sokol_log_linux_x64_gl_debug.a" } }
|
||||
else { foreign import sokol_log_clib { "sokol_log_linux_x64_gl_release.a" } }
|
||||
}
|
||||
} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 {
|
||||
// Feed sokol_log_wasm_gl_debug.a or sokol_log_wasm_gl_release.a into emscripten compiler.
|
||||
foreign import sokol_log_clib { "env.o" }
|
||||
} else {
|
||||
#panic("This OS is currently not supported")
|
||||
}
|
||||
|
||||
@(default_calling_convention="c", link_prefix="slog_")
|
||||
foreign sokol_log_clib {
|
||||
/*
|
||||
Plug this function into the 'logger.func' struct item when initializing any of the sokol
|
||||
headers. For instance for sokol_audio.h it would look like this:
|
||||
|
||||
saudio_setup(&(saudio_desc){
|
||||
.logger = {
|
||||
.func = slog_func
|
||||
}
|
||||
});
|
||||
*/
|
||||
func :: proc(tag: cstring, log_level: u32, log_item: u32, message: cstring, line_nr: u32, filename: cstring, user_data: rawptr) ---
|
||||
}
|
||||
|
581
thirdparty/sokol/shape/shape.odin
vendored
Normal file
581
thirdparty/sokol/shape/shape.odin
vendored
Normal file
@@ -0,0 +1,581 @@
|
||||
// machine generated, do not edit
|
||||
|
||||
package sokol_shape
|
||||
|
||||
/*
|
||||
|
||||
sokol_shape.h -- create simple primitive shapes for sokol_gfx.h
|
||||
|
||||
Project URL: https://github.com/floooh/sokol
|
||||
|
||||
Do this:
|
||||
#define SOKOL_IMPL or
|
||||
#define SOKOL_SHAPE_IMPL
|
||||
before you include this file in *one* C or C++ file to create the
|
||||
implementation.
|
||||
|
||||
Include the following headers before including sokol_shape.h:
|
||||
|
||||
sokol_gfx.h
|
||||
|
||||
...optionally provide the following macros to override defaults:
|
||||
|
||||
SOKOL_ASSERT(c) - your own assert macro (default: assert(c))
|
||||
SOKOL_SHAPE_API_DECL- public function declaration prefix (default: extern)
|
||||
SOKOL_API_DECL - same as SOKOL_SHAPE_API_DECL
|
||||
SOKOL_API_IMPL - public function implementation prefix (default: -)
|
||||
|
||||
If sokol_shape.h is compiled as a DLL, define the following before
|
||||
including the declaration or implementation:
|
||||
|
||||
SOKOL_DLL
|
||||
|
||||
On Windows, SOKOL_DLL will define SOKOL_SHAPE_API_DECL as __declspec(dllexport)
|
||||
or __declspec(dllimport) as needed.
|
||||
|
||||
FEATURE OVERVIEW
|
||||
================
|
||||
sokol_shape.h creates vertices and indices for simple shapes and
|
||||
builds structs which can be plugged into sokol-gfx resource
|
||||
creation functions:
|
||||
|
||||
The following shape types are supported:
|
||||
|
||||
- plane
|
||||
- cube
|
||||
- sphere (with poles, not geodesic)
|
||||
- cylinder
|
||||
- torus (donut)
|
||||
|
||||
Generated vertices look like this:
|
||||
|
||||
typedef struct sshape_vertex_t {
|
||||
float x, y, z;
|
||||
uint32_t normal; // packed normal as BYTE4N
|
||||
uint16_t u, v; // packed uv coords as USHORT2N
|
||||
uint32_t color; // packed color as UBYTE4N (r,g,b,a);
|
||||
} sshape_vertex_t;
|
||||
|
||||
Indices are generally 16-bits wide (SG_INDEXTYPE_UINT16) and the indices
|
||||
are written as triangle-lists (SG_PRIMITIVETYPE_TRIANGLES).
|
||||
|
||||
EXAMPLES:
|
||||
=========
|
||||
|
||||
Create multiple shapes into the same vertex- and index-buffer and
|
||||
render with separate draw calls:
|
||||
|
||||
https://github.com/floooh/sokol-samples/blob/master/sapp/shapes-sapp.c
|
||||
|
||||
Same as the above, but pre-transform shapes and merge them into a single
|
||||
shape that's rendered with a single draw call.
|
||||
|
||||
https://github.com/floooh/sokol-samples/blob/master/sapp/shapes-transform-sapp.c
|
||||
|
||||
STEP-BY-STEP:
|
||||
=============
|
||||
|
||||
Setup an sshape_buffer_t struct with pointers to memory buffers where
|
||||
generated vertices and indices will be written to:
|
||||
|
||||
```c
|
||||
sshape_vertex_t vertices[512];
|
||||
uint16_t indices[4096];
|
||||
|
||||
sshape_buffer_t buf = {
|
||||
.vertices = {
|
||||
.buffer = SSHAPE_RANGE(vertices),
|
||||
},
|
||||
.indices = {
|
||||
.buffer = SSHAPE_RANGE(indices),
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
To find out how big those memory buffers must be (in case you want
|
||||
to allocate dynamically) call the following functions:
|
||||
|
||||
```c
|
||||
sshape_sizes_t sshape_plane_sizes(uint32_t tiles);
|
||||
sshape_sizes_t sshape_box_sizes(uint32_t tiles);
|
||||
sshape_sizes_t sshape_sphere_sizes(uint32_t slices, uint32_t stacks);
|
||||
sshape_sizes_t sshape_cylinder_sizes(uint32_t slices, uint32_t stacks);
|
||||
sshape_sizes_t sshape_torus_sizes(uint32_t sides, uint32_t rings);
|
||||
```
|
||||
|
||||
The returned sshape_sizes_t struct contains vertex- and index-counts
|
||||
as well as the equivalent buffer sizes in bytes. For instance:
|
||||
|
||||
```c
|
||||
sshape_sizes_t sizes = sshape_sphere_sizes(36, 12);
|
||||
uint32_t num_vertices = sizes.vertices.num;
|
||||
uint32_t num_indices = sizes.indices.num;
|
||||
uint32_t vertex_buffer_size = sizes.vertices.size;
|
||||
uint32_t index_buffer_size = sizes.indices.size;
|
||||
```
|
||||
|
||||
With the sshape_buffer_t struct that was setup earlier, call any
|
||||
of the shape-builder functions:
|
||||
|
||||
```c
|
||||
sshape_buffer_t sshape_build_plane(const sshape_buffer_t* buf, const sshape_plane_t* params);
|
||||
sshape_buffer_t sshape_build_box(const sshape_buffer_t* buf, const sshape_box_t* params);
|
||||
sshape_buffer_t sshape_build_sphere(const sshape_buffer_t* buf, const sshape_sphere_t* params);
|
||||
sshape_buffer_t sshape_build_cylinder(const sshape_buffer_t* buf, const sshape_cylinder_t* params);
|
||||
sshape_buffer_t sshape_build_torus(const sshape_buffer_t* buf, const sshape_torus_t* params);
|
||||
```
|
||||
|
||||
Note how the sshape_buffer_t struct is both an input value and the
|
||||
return value. This can be used to append multiple shapes into the
|
||||
same vertex- and index-buffers (more on this later).
|
||||
|
||||
The second argument is a struct which holds creation parameters.
|
||||
|
||||
For instance to build a sphere with radius 2, 36 "cake slices" and 12 stacks:
|
||||
|
||||
```c
|
||||
sshape_buffer_t buf = ...;
|
||||
buf = sshape_build_sphere(&buf, &(sshape_sphere_t){
|
||||
.radius = 2.0f,
|
||||
.slices = 36,
|
||||
.stacks = 12,
|
||||
});
|
||||
```
|
||||
|
||||
If the provided buffers are big enough to hold all generated vertices and
|
||||
indices, the "valid" field in the result will be true:
|
||||
|
||||
```c
|
||||
assert(buf.valid);
|
||||
```
|
||||
|
||||
The shape creation parameters have "useful defaults", refer to the
|
||||
actual C struct declarations below to look up those defaults.
|
||||
|
||||
You can also provide additional creation parameters, like a common vertex
|
||||
color, a debug-helper to randomize colors, tell the shape builder function
|
||||
to merge the new shape with the previous shape into the same draw-element-range,
|
||||
or a 4x4 transform matrix to move, rotate and scale the generated vertices:
|
||||
|
||||
```c
|
||||
sshape_buffer_t buf = ...;
|
||||
buf = sshape_build_sphere(&buf, &(sshape_sphere_t){
|
||||
.radius = 2.0f,
|
||||
.slices = 36,
|
||||
.stacks = 12,
|
||||
// merge with previous shape into a single element-range
|
||||
.merge = true,
|
||||
// set vertex color to red+opaque
|
||||
.color = sshape_color_4f(1.0f, 0.0f, 0.0f, 1.0f),
|
||||
// set position to y = 2.0
|
||||
.transform = {
|
||||
.m = {
|
||||
{ 1.0f, 0.0f, 0.0f, 0.0f },
|
||||
{ 0.0f, 1.0f, 0.0f, 0.0f },
|
||||
{ 0.0f, 0.0f, 1.0f, 0.0f },
|
||||
{ 0.0f, 2.0f, 0.0f, 1.0f },
|
||||
}
|
||||
}
|
||||
});
|
||||
assert(buf.valid);
|
||||
```
|
||||
|
||||
The following helper functions can be used to build a packed
|
||||
color value or to convert from external matrix types:
|
||||
|
||||
```c
|
||||
uint32_t sshape_color_4f(float r, float g, float b, float a);
|
||||
uint32_t sshape_color_3f(float r, float g, float b);
|
||||
uint32_t sshape_color_4b(uint8_t r, uint8_t g, uint8_t b, uint8_t a);
|
||||
uint32_t sshape_color_3b(uint8_t r, uint8_t g, uint8_t b);
|
||||
sshape_mat4_t sshape_mat4(const float m[16]);
|
||||
sshape_mat4_t sshape_mat4_transpose(const float m[16]);
|
||||
```
|
||||
|
||||
After the shape builder function has been called, the following functions
|
||||
are used to extract the build result for plugging into sokol_gfx.h:
|
||||
|
||||
```c
|
||||
sshape_element_range_t sshape_element_range(const sshape_buffer_t* buf);
|
||||
sg_buffer_desc sshape_vertex_buffer_desc(const sshape_buffer_t* buf);
|
||||
sg_buffer_desc sshape_index_buffer_desc(const sshape_buffer_t* buf);
|
||||
sg_vertex_buffer_layout_state sshape_vertex_buffer_layout_state(void);
|
||||
sg_vertex_attr_state sshape_position_vertex_attr_state(void);
|
||||
sg_vertex_attr_state sshape_normal_vertex_attr_state(void);
|
||||
sg_vertex_attr_state sshape_texcoord_vertex_attr_state(void);
|
||||
sg_vertex_attr_state sshape_color_vertex_attr_state(void);
|
||||
```
|
||||
|
||||
The sshape_element_range_t struct contains the base-index and number of
|
||||
indices which can be plugged into the sg_draw() call:
|
||||
|
||||
```c
|
||||
sshape_element_range_t elms = sshape_element_range(&buf);
|
||||
...
|
||||
sg_draw(elms.base_element, elms.num_elements, 1);
|
||||
```
|
||||
|
||||
To create sokol-gfx vertex- and index-buffers from the generated
|
||||
shape data:
|
||||
|
||||
```c
|
||||
// create sokol-gfx vertex buffer
|
||||
sg_buffer_desc vbuf_desc = sshape_vertex_buffer_desc(&buf);
|
||||
sg_buffer vbuf = sg_make_buffer(&vbuf_desc);
|
||||
|
||||
// create sokol-gfx index buffer
|
||||
sg_buffer_desc ibuf_desc = sshape_index_buffer_desc(&buf);
|
||||
sg_buffer ibuf = sg_make_buffer(&ibuf_desc);
|
||||
```
|
||||
|
||||
The remaining functions are used to populate the vertex-layout item
|
||||
in sg_pipeline_desc, note that these functions don't depend on the
|
||||
created geometry, they always return the same result:
|
||||
|
||||
```c
|
||||
sg_pipeline pip = sg_make_pipeline(&(sg_pipeline_desc){
|
||||
.layout = {
|
||||
.buffers[0] = sshape_vertex_buffer_layout_state(),
|
||||
.attrs = {
|
||||
[0] = sshape_position_vertex_attr_state(),
|
||||
[1] = ssape_normal_vertex_attr_state(),
|
||||
[2] = sshape_texcoord_vertex_attr_state(),
|
||||
[3] = sshape_color_vertex_attr_state()
|
||||
}
|
||||
},
|
||||
...
|
||||
});
|
||||
```
|
||||
|
||||
Note that you don't have to use all generated vertex attributes in the
|
||||
pipeline's vertex layout, the sg_vertex_buffer_layout_state struct returned
|
||||
by sshape_vertex_buffer_layout_state() contains the correct vertex stride
|
||||
to skip vertex components.
|
||||
|
||||
WRITING MULTIPLE SHAPES INTO THE SAME BUFFER
|
||||
============================================
|
||||
You can merge multiple shapes into the same vertex- and
|
||||
index-buffers and either render them as a single shape, or
|
||||
in separate draw calls.
|
||||
|
||||
To build a single shape made of two cubes which can be rendered
|
||||
in a single draw-call:
|
||||
|
||||
```
|
||||
sshape_vertex_t vertices[128];
|
||||
uint16_t indices[16];
|
||||
|
||||
sshape_buffer_t buf = {
|
||||
.vertices.buffer = SSHAPE_RANGE(vertices),
|
||||
.indices.buffer = SSHAPE_RANGE(indices)
|
||||
};
|
||||
|
||||
// first cube at pos x=-2.0 (with default size of 1x1x1)
|
||||
buf = sshape_build_cube(&buf, &(sshape_box_t){
|
||||
.transform = {
|
||||
.m = {
|
||||
{ 1.0f, 0.0f, 0.0f, 0.0f },
|
||||
{ 0.0f, 1.0f, 0.0f, 0.0f },
|
||||
{ 0.0f, 0.0f, 1.0f, 0.0f },
|
||||
{-2.0f, 0.0f, 0.0f, 1.0f },
|
||||
}
|
||||
}
|
||||
});
|
||||
// ...and append another cube at pos pos=+1.0
|
||||
// NOTE the .merge = true, this tells the shape builder
|
||||
// function to not advance the current shape start offset
|
||||
buf = sshape_build_cube(&buf, &(sshape_box_t){
|
||||
.merge = true,
|
||||
.transform = {
|
||||
.m = {
|
||||
{ 1.0f, 0.0f, 0.0f, 0.0f },
|
||||
{ 0.0f, 1.0f, 0.0f, 0.0f },
|
||||
{ 0.0f, 0.0f, 1.0f, 0.0f },
|
||||
{-2.0f, 0.0f, 0.0f, 1.0f },
|
||||
}
|
||||
}
|
||||
});
|
||||
assert(buf.valid);
|
||||
|
||||
// skipping buffer- and pipeline-creation...
|
||||
|
||||
sshape_element_range_t elms = sshape_element_range(&buf);
|
||||
sg_draw(elms.base_element, elms.num_elements, 1);
|
||||
```
|
||||
|
||||
To render the two cubes in separate draw-calls, the element-ranges used
|
||||
in the sg_draw() calls must be captured right after calling the
|
||||
builder-functions:
|
||||
|
||||
```c
|
||||
sshape_vertex_t vertices[128];
|
||||
uint16_t indices[16];
|
||||
sshape_buffer_t buf = {
|
||||
.vertices.buffer = SSHAPE_RANGE(vertices),
|
||||
.indices.buffer = SSHAPE_RANGE(indices)
|
||||
};
|
||||
|
||||
// build a red cube...
|
||||
buf = sshape_build_cube(&buf, &(sshape_box_t){
|
||||
.color = sshape_color_3b(255, 0, 0)
|
||||
});
|
||||
sshape_element_range_t red_cube = sshape_element_range(&buf);
|
||||
|
||||
// append a green cube to the same vertex-/index-buffer:
|
||||
buf = sshape_build_cube(&bud, &sshape_box_t){
|
||||
.color = sshape_color_3b(0, 255, 0);
|
||||
});
|
||||
sshape_element_range_t green_cube = sshape_element_range(&buf);
|
||||
|
||||
// skipping buffer- and pipeline-creation...
|
||||
|
||||
sg_draw(red_cube.base_element, red_cube.num_elements, 1);
|
||||
sg_draw(green_cube.base_element, green_cube.num_elements, 1);
|
||||
```
|
||||
|
||||
...that's about all :)
|
||||
|
||||
LICENSE
|
||||
=======
|
||||
zlib/libpng license
|
||||
|
||||
Copyright (c) 2020 Andre Weissflog
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty.
|
||||
In no event will the authors be held liable for any damages arising from the
|
||||
use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software in a
|
||||
product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
|
||||
*/
|
||||
import sg "../gfx"
|
||||
|
||||
import "core:c"
|
||||
|
||||
_ :: c
|
||||
|
||||
SOKOL_DEBUG :: #config(SOKOL_DEBUG, ODIN_DEBUG)
|
||||
|
||||
DEBUG :: #config(SOKOL_SHAPE_DEBUG, SOKOL_DEBUG)
|
||||
USE_GL :: #config(SOKOL_USE_GL, false)
|
||||
USE_DLL :: #config(SOKOL_DLL, false)
|
||||
|
||||
when ODIN_OS == .Windows {
|
||||
when USE_DLL {
|
||||
when USE_GL {
|
||||
when DEBUG { foreign import sokol_shape_clib { "../sokol_dll_windows_x64_gl_debug.lib" } }
|
||||
else { foreign import sokol_shape_clib { "../sokol_dll_windows_x64_gl_release.lib" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_shape_clib { "../sokol_dll_windows_x64_d3d11_debug.lib" } }
|
||||
else { foreign import sokol_shape_clib { "../sokol_dll_windows_x64_d3d11_release.lib" } }
|
||||
}
|
||||
} else {
|
||||
when USE_GL {
|
||||
when DEBUG { foreign import sokol_shape_clib { "sokol_shape_windows_x64_gl_debug.lib" } }
|
||||
else { foreign import sokol_shape_clib { "sokol_shape_windows_x64_gl_release.lib" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_shape_clib { "sokol_shape_windows_x64_d3d11_debug.lib" } }
|
||||
else { foreign import sokol_shape_clib { "sokol_shape_windows_x64_d3d11_release.lib" } }
|
||||
}
|
||||
}
|
||||
} else when ODIN_OS == .Darwin {
|
||||
when USE_DLL {
|
||||
when USE_GL && ODIN_ARCH == .arm64 && DEBUG { foreign import sokol_shape_clib { "../dylib/sokol_dylib_macos_arm64_gl_debug.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .arm64 && !DEBUG { foreign import sokol_shape_clib { "../dylib/sokol_dylib_macos_arm64_gl_release.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .amd64 && DEBUG { foreign import sokol_shape_clib { "../dylib/sokol_dylib_macos_x64_gl_debug.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .amd64 && !DEBUG { foreign import sokol_shape_clib { "../dylib/sokol_dylib_macos_x64_gl_release.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .arm64 && DEBUG { foreign import sokol_shape_clib { "../dylib/sokol_dylib_macos_arm64_metal_debug.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .arm64 && !DEBUG { foreign import sokol_shape_clib { "../dylib/sokol_dylib_macos_arm64_metal_release.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .amd64 && DEBUG { foreign import sokol_shape_clib { "../dylib/sokol_dylib_macos_x64_metal_debug.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .amd64 && !DEBUG { foreign import sokol_shape_clib { "../dylib/sokol_dylib_macos_x64_metal_release.dylib" } }
|
||||
} else {
|
||||
when USE_GL {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when DEBUG { foreign import sokol_shape_clib { "sokol_shape_macos_arm64_gl_debug.a" } }
|
||||
else { foreign import sokol_shape_clib { "sokol_shape_macos_arm64_gl_release.a" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_shape_clib { "sokol_shape_macos_x64_gl_debug.a" } }
|
||||
else { foreign import sokol_shape_clib { "sokol_shape_macos_x64_gl_release.a" } }
|
||||
}
|
||||
} else {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when DEBUG { foreign import sokol_shape_clib { "sokol_shape_macos_arm64_metal_debug.a" } }
|
||||
else { foreign import sokol_shape_clib { "sokol_shape_macos_arm64_metal_release.a" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_shape_clib { "sokol_shape_macos_x64_metal_debug.a" } }
|
||||
else { foreign import sokol_shape_clib { "sokol_shape_macos_x64_metal_release.a" } }
|
||||
}
|
||||
}
|
||||
}
|
||||
} else when ODIN_OS == .Linux {
|
||||
when USE_DLL {
|
||||
when DEBUG { foreign import sokol_shape_clib { "sokol_shape_linux_x64_gl_debug.so" } }
|
||||
else { foreign import sokol_shape_clib { "sokol_shape_linux_x64_gl_release.so" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_shape_clib { "sokol_shape_linux_x64_gl_debug.a" } }
|
||||
else { foreign import sokol_shape_clib { "sokol_shape_linux_x64_gl_release.a" } }
|
||||
}
|
||||
} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 {
|
||||
// Feed sokol_shape_wasm_gl_debug.a or sokol_shape_wasm_gl_release.a into emscripten compiler.
|
||||
foreign import sokol_shape_clib { "env.o" }
|
||||
} else {
|
||||
#panic("This OS is currently not supported")
|
||||
}
|
||||
|
||||
@(default_calling_convention="c", link_prefix="sshape_")
|
||||
foreign sokol_shape_clib {
|
||||
// shape builder functions
|
||||
build_plane :: proc(#by_ptr buf: Buffer, #by_ptr params: Plane) -> Buffer ---
|
||||
build_box :: proc(#by_ptr buf: Buffer, #by_ptr params: Box) -> Buffer ---
|
||||
build_sphere :: proc(#by_ptr buf: Buffer, #by_ptr params: Sphere) -> Buffer ---
|
||||
build_cylinder :: proc(#by_ptr buf: Buffer, #by_ptr params: Cylinder) -> Buffer ---
|
||||
build_torus :: proc(#by_ptr buf: Buffer, #by_ptr params: Torus) -> Buffer ---
|
||||
// query required vertex- and index-buffer sizes in bytes
|
||||
plane_sizes :: proc(tiles: u32) -> Sizes ---
|
||||
box_sizes :: proc(tiles: u32) -> Sizes ---
|
||||
sphere_sizes :: proc(slices: u32, stacks: u32) -> Sizes ---
|
||||
cylinder_sizes :: proc(slices: u32, stacks: u32) -> Sizes ---
|
||||
torus_sizes :: proc(sides: u32, rings: u32) -> Sizes ---
|
||||
// extract sokol-gfx desc structs and primitive ranges from build state
|
||||
element_range :: proc(#by_ptr buf: Buffer) -> Element_Range ---
|
||||
vertex_buffer_desc :: proc(#by_ptr buf: Buffer) -> sg.Buffer_Desc ---
|
||||
index_buffer_desc :: proc(#by_ptr buf: Buffer) -> sg.Buffer_Desc ---
|
||||
vertex_buffer_layout_state :: proc() -> sg.Vertex_Buffer_Layout_State ---
|
||||
position_vertex_attr_state :: proc() -> sg.Vertex_Attr_State ---
|
||||
normal_vertex_attr_state :: proc() -> sg.Vertex_Attr_State ---
|
||||
texcoord_vertex_attr_state :: proc() -> sg.Vertex_Attr_State ---
|
||||
color_vertex_attr_state :: proc() -> sg.Vertex_Attr_State ---
|
||||
// helper functions to build packed color value from floats or bytes
|
||||
color_4f :: proc(r: f32, g: f32, b: f32, a: f32) -> u32 ---
|
||||
color_3f :: proc(r: f32, g: f32, b: f32) -> u32 ---
|
||||
color_4b :: proc(r: u8, g: u8, b: u8, a: u8) -> u32 ---
|
||||
color_3b :: proc(r: u8, g: u8, b: u8) -> u32 ---
|
||||
// adapter function for filling matrix struct from generic float[16] array
|
||||
mat4 :: proc(m: ^f32) -> Mat4 ---
|
||||
mat4_transpose :: proc(m: ^f32) -> Mat4 ---
|
||||
}
|
||||
|
||||
/*
|
||||
sshape_range is a pointer-size-pair struct used to pass memory
|
||||
blobs into sokol-shape. When initialized from a value type
|
||||
(array or struct), use the SSHAPE_RANGE() macro to build
|
||||
an sshape_range struct.
|
||||
*/
|
||||
Range :: struct {
|
||||
ptr : rawptr,
|
||||
size : c.size_t,
|
||||
}
|
||||
|
||||
// a 4x4 matrix wrapper struct
|
||||
Mat4 :: struct {
|
||||
m : [4][4]f32,
|
||||
}
|
||||
|
||||
// vertex layout of the generated geometry
|
||||
Vertex :: struct {
|
||||
x : f32,
|
||||
y : f32,
|
||||
z : f32,
|
||||
normal : u32,
|
||||
u : u16,
|
||||
v : u16,
|
||||
color : u32,
|
||||
}
|
||||
|
||||
// a range of draw-elements (sg_draw(int base_element, int num_element, ...))
|
||||
Element_Range :: struct {
|
||||
base_element : c.int,
|
||||
num_elements : c.int,
|
||||
}
|
||||
|
||||
// number of elements and byte size of build actions
|
||||
Sizes_Item :: struct {
|
||||
num : u32,
|
||||
size : u32,
|
||||
}
|
||||
|
||||
Sizes :: struct {
|
||||
vertices : Sizes_Item,
|
||||
indices : Sizes_Item,
|
||||
}
|
||||
|
||||
// in/out struct to keep track of mesh-build state
|
||||
Buffer_Item :: struct {
|
||||
buffer : Range,
|
||||
data_size : c.size_t,
|
||||
shape_offset : c.size_t,
|
||||
}
|
||||
|
||||
Buffer :: struct {
|
||||
valid : bool,
|
||||
vertices : Buffer_Item,
|
||||
indices : Buffer_Item,
|
||||
}
|
||||
|
||||
// creation parameters for the different shape types
|
||||
Plane :: struct {
|
||||
width : f32,
|
||||
depth : f32,
|
||||
tiles : u16,
|
||||
color : u32,
|
||||
random_colors : bool,
|
||||
merge : bool,
|
||||
transform : Mat4,
|
||||
}
|
||||
|
||||
Box :: struct {
|
||||
width : f32,
|
||||
height : f32,
|
||||
depth : f32,
|
||||
tiles : u16,
|
||||
color : u32,
|
||||
random_colors : bool,
|
||||
merge : bool,
|
||||
transform : Mat4,
|
||||
}
|
||||
|
||||
Sphere :: struct {
|
||||
radius : f32,
|
||||
slices : u16,
|
||||
stacks : u16,
|
||||
color : u32,
|
||||
random_colors : bool,
|
||||
merge : bool,
|
||||
transform : Mat4,
|
||||
}
|
||||
|
||||
Cylinder :: struct {
|
||||
radius : f32,
|
||||
height : f32,
|
||||
slices : u16,
|
||||
stacks : u16,
|
||||
color : u32,
|
||||
random_colors : bool,
|
||||
merge : bool,
|
||||
transform : Mat4,
|
||||
}
|
||||
|
||||
Torus :: struct {
|
||||
radius : f32,
|
||||
ring_radius : f32,
|
||||
sides : u16,
|
||||
rings : u16,
|
||||
color : u32,
|
||||
random_colors : bool,
|
||||
merge : bool,
|
||||
transform : Mat4,
|
||||
}
|
||||
|
196
thirdparty/sokol/time/time.odin
vendored
Normal file
196
thirdparty/sokol/time/time.odin
vendored
Normal file
@@ -0,0 +1,196 @@
|
||||
// machine generated, do not edit
|
||||
|
||||
package sokol_time
|
||||
|
||||
/*
|
||||
|
||||
sokol_time.h -- simple cross-platform time measurement
|
||||
|
||||
Project URL: https://github.com/floooh/sokol
|
||||
|
||||
Do this:
|
||||
#define SOKOL_IMPL or
|
||||
#define SOKOL_TIME_IMPL
|
||||
before you include this file in *one* C or C++ file to create the
|
||||
implementation.
|
||||
|
||||
Optionally provide the following defines with your own implementations:
|
||||
SOKOL_ASSERT(c) - your own assert macro (default: assert(c))
|
||||
SOKOL_TIME_API_DECL - public function declaration prefix (default: extern)
|
||||
SOKOL_API_DECL - same as SOKOL_TIME_API_DECL
|
||||
SOKOL_API_IMPL - public function implementation prefix (default: -)
|
||||
|
||||
If sokol_time.h is compiled as a DLL, define the following before
|
||||
including the declaration or implementation:
|
||||
|
||||
SOKOL_DLL
|
||||
|
||||
On Windows, SOKOL_DLL will define SOKOL_TIME_API_DECL as __declspec(dllexport)
|
||||
or __declspec(dllimport) as needed.
|
||||
|
||||
void stm_setup();
|
||||
Call once before any other functions to initialize sokol_time
|
||||
(this calls for instance QueryPerformanceFrequency on Windows)
|
||||
|
||||
uint64_t stm_now();
|
||||
Get current point in time in unspecified 'ticks'. The value that
|
||||
is returned has no relation to the 'wall-clock' time and is
|
||||
not in a specific time unit, it is only useful to compute
|
||||
time differences.
|
||||
|
||||
uint64_t stm_diff(uint64_t new, uint64_t old);
|
||||
Computes the time difference between new and old. This will always
|
||||
return a positive, non-zero value.
|
||||
|
||||
uint64_t stm_since(uint64_t start);
|
||||
Takes the current time, and returns the elapsed time since start
|
||||
(this is a shortcut for "stm_diff(stm_now(), start)")
|
||||
|
||||
uint64_t stm_laptime(uint64_t* last_time);
|
||||
This is useful for measuring frame time and other recurring
|
||||
events. It takes the current time, returns the time difference
|
||||
to the value in last_time, and stores the current time in
|
||||
last_time for the next call. If the value in last_time is 0,
|
||||
the return value will be zero (this usually happens on the
|
||||
very first call).
|
||||
|
||||
uint64_t stm_round_to_common_refresh_rate(uint64_t duration)
|
||||
This oddly named function takes a measured frame time and
|
||||
returns the closest "nearby" common display refresh rate frame duration
|
||||
in ticks. If the input duration isn't close to any common display
|
||||
refresh rate, the input duration will be returned unchanged as a fallback.
|
||||
The main purpose of this function is to remove jitter/inaccuracies from
|
||||
measured frame times, and instead use the display refresh rate as
|
||||
frame duration.
|
||||
NOTE: for more robust frame timing, consider using the
|
||||
sokol_app.h function sapp_frame_duration()
|
||||
|
||||
Use the following functions to convert a duration in ticks into
|
||||
useful time units:
|
||||
|
||||
double stm_sec(uint64_t ticks);
|
||||
double stm_ms(uint64_t ticks);
|
||||
double stm_us(uint64_t ticks);
|
||||
double stm_ns(uint64_t ticks);
|
||||
Converts a tick value into seconds, milliseconds, microseconds
|
||||
or nanoseconds. Note that not all platforms will have nanosecond
|
||||
or even microsecond precision.
|
||||
|
||||
Uses the following time measurement functions under the hood:
|
||||
|
||||
Windows: QueryPerformanceFrequency() / QueryPerformanceCounter()
|
||||
MacOS/iOS: mach_absolute_time()
|
||||
emscripten: emscripten_get_now()
|
||||
Linux+others: clock_gettime(CLOCK_MONOTONIC)
|
||||
|
||||
zlib/libpng license
|
||||
|
||||
Copyright (c) 2018 Andre Weissflog
|
||||
|
||||
This software is provided 'as-is', without any express or implied warranty.
|
||||
In no event will the authors be held liable for any damages arising from the
|
||||
use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software in a
|
||||
product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
|
||||
2. Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
|
||||
*/
|
||||
|
||||
import "core:c"
|
||||
|
||||
_ :: c
|
||||
|
||||
SOKOL_DEBUG :: #config(SOKOL_DEBUG, ODIN_DEBUG)
|
||||
|
||||
DEBUG :: #config(SOKOL_TIME_DEBUG, SOKOL_DEBUG)
|
||||
USE_GL :: #config(SOKOL_USE_GL, false)
|
||||
USE_DLL :: #config(SOKOL_DLL, false)
|
||||
|
||||
when ODIN_OS == .Windows {
|
||||
when USE_DLL {
|
||||
when USE_GL {
|
||||
when DEBUG { foreign import sokol_time_clib { "../sokol_dll_windows_x64_gl_debug.lib" } }
|
||||
else { foreign import sokol_time_clib { "../sokol_dll_windows_x64_gl_release.lib" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_time_clib { "../sokol_dll_windows_x64_d3d11_debug.lib" } }
|
||||
else { foreign import sokol_time_clib { "../sokol_dll_windows_x64_d3d11_release.lib" } }
|
||||
}
|
||||
} else {
|
||||
when USE_GL {
|
||||
when DEBUG { foreign import sokol_time_clib { "sokol_time_windows_x64_gl_debug.lib" } }
|
||||
else { foreign import sokol_time_clib { "sokol_time_windows_x64_gl_release.lib" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_time_clib { "sokol_time_windows_x64_d3d11_debug.lib" } }
|
||||
else { foreign import sokol_time_clib { "sokol_time_windows_x64_d3d11_release.lib" } }
|
||||
}
|
||||
}
|
||||
} else when ODIN_OS == .Darwin {
|
||||
when USE_DLL {
|
||||
when USE_GL && ODIN_ARCH == .arm64 && DEBUG { foreign import sokol_time_clib { "../dylib/sokol_dylib_macos_arm64_gl_debug.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .arm64 && !DEBUG { foreign import sokol_time_clib { "../dylib/sokol_dylib_macos_arm64_gl_release.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .amd64 && DEBUG { foreign import sokol_time_clib { "../dylib/sokol_dylib_macos_x64_gl_debug.dylib" } }
|
||||
else when USE_GL && ODIN_ARCH == .amd64 && !DEBUG { foreign import sokol_time_clib { "../dylib/sokol_dylib_macos_x64_gl_release.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .arm64 && DEBUG { foreign import sokol_time_clib { "../dylib/sokol_dylib_macos_arm64_metal_debug.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .arm64 && !DEBUG { foreign import sokol_time_clib { "../dylib/sokol_dylib_macos_arm64_metal_release.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .amd64 && DEBUG { foreign import sokol_time_clib { "../dylib/sokol_dylib_macos_x64_metal_debug.dylib" } }
|
||||
else when !USE_GL && ODIN_ARCH == .amd64 && !DEBUG { foreign import sokol_time_clib { "../dylib/sokol_dylib_macos_x64_metal_release.dylib" } }
|
||||
} else {
|
||||
when USE_GL {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when DEBUG { foreign import sokol_time_clib { "sokol_time_macos_arm64_gl_debug.a" } }
|
||||
else { foreign import sokol_time_clib { "sokol_time_macos_arm64_gl_release.a" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_time_clib { "sokol_time_macos_x64_gl_debug.a" } }
|
||||
else { foreign import sokol_time_clib { "sokol_time_macos_x64_gl_release.a" } }
|
||||
}
|
||||
} else {
|
||||
when ODIN_ARCH == .arm64 {
|
||||
when DEBUG { foreign import sokol_time_clib { "sokol_time_macos_arm64_metal_debug.a" } }
|
||||
else { foreign import sokol_time_clib { "sokol_time_macos_arm64_metal_release.a" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_time_clib { "sokol_time_macos_x64_metal_debug.a" } }
|
||||
else { foreign import sokol_time_clib { "sokol_time_macos_x64_metal_release.a" } }
|
||||
}
|
||||
}
|
||||
}
|
||||
} else when ODIN_OS == .Linux {
|
||||
when USE_DLL {
|
||||
when DEBUG { foreign import sokol_time_clib { "sokol_time_linux_x64_gl_debug.so" } }
|
||||
else { foreign import sokol_time_clib { "sokol_time_linux_x64_gl_release.so" } }
|
||||
} else {
|
||||
when DEBUG { foreign import sokol_time_clib { "sokol_time_linux_x64_gl_debug.a" } }
|
||||
else { foreign import sokol_time_clib { "sokol_time_linux_x64_gl_release.a" } }
|
||||
}
|
||||
} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 {
|
||||
// Feed sokol_time_wasm_gl_debug.a or sokol_time_wasm_gl_release.a into emscripten compiler.
|
||||
foreign import sokol_time_clib { "env.o" }
|
||||
} else {
|
||||
#panic("This OS is currently not supported")
|
||||
}
|
||||
|
||||
@(default_calling_convention="c", link_prefix="stm_")
|
||||
foreign sokol_time_clib {
|
||||
setup :: proc() ---
|
||||
now :: proc() -> u64 ---
|
||||
diff :: proc(new_ticks: u64, old_ticks: u64) -> u64 ---
|
||||
since :: proc(start_ticks: u64) -> u64 ---
|
||||
laptime :: proc(last_time: ^u64) -> u64 ---
|
||||
round_to_common_refresh_rate :: proc(frame_ticks: u64) -> u64 ---
|
||||
sec :: proc(ticks: u64) -> f64 ---
|
||||
ms :: proc(ticks: u64) -> f64 ---
|
||||
us :: proc(ticks: u64) -> f64 ---
|
||||
ns :: proc(ticks: u64) -> f64 ---
|
||||
}
|
||||
|
BIN
thirdparty/stb/lib/stb_truetype.lib
vendored
BIN
thirdparty/stb/lib/stb_truetype.lib
vendored
Binary file not shown.
Reference in New Issue
Block a user