sokol: fix building of examples and ci tests

pull/3486/head
Delyan Angelov 2020-01-17 21:05:45 +02:00 committed by Alexander Medvednikov
parent 3d57d3bb7b
commit 24d34a4f2c
12 changed files with 181 additions and 183 deletions

View File

@ -0,0 +1,3 @@
fonts
fonts2
drawing

Binary file not shown.

View File

@ -2,28 +2,32 @@ import sokol
import sokol.sapp import sokol.sapp
import sokol.gfx import sokol.gfx
import sokol.sgl import sokol.sgl
import fontstash
struct AppState { struct AppState {
pass_action sg_pass_action pass_action sg_pass_action
} }
const (
used_import = sokol.used_import
)
fn main() { fn main() {
state := &AppState{ state := &AppState{
pass_action: gfx.create_clear_pass(0.1, 0.1, 0.1, 1.0) pass_action: gfx.create_clear_pass(0.1, 0.1, 0.1, 1.0)
} }
title := 'Sokol Drawing Template'
desc := sapp_desc{ desc := sapp_desc{
user_data: state user_data: state
init_userdata_cb: init init_userdata_cb: init
frame_userdata_cb: frame frame_userdata_cb: frame
window_title: 'Sokal Drawing Template'.str window_title: title.str
html5_canvas_name: title.str
} }
sapp.run(&desc) sapp.run(&desc)
} }
fn init(user_data voidptr) { fn init(user_data voidptr) {
desc := sg_desc { desc := sg_desc{
mtl_device: C.sapp_metal_get_device() mtl_device: C.sapp_metal_get_device()
mtl_renderpass_descriptor_cb: sapp_metal_get_renderpass_descriptor mtl_renderpass_descriptor_cb: sapp_metal_get_renderpass_descriptor
mtl_drawable_cb: sapp_metal_get_drawable mtl_drawable_cb: sapp_metal_get_drawable
@ -33,17 +37,14 @@ fn init(user_data voidptr) {
d3d11_depth_stencil_view_cb: sapp_d3d11_get_depth_stencil_view d3d11_depth_stencil_view_cb: sapp_d3d11_get_depth_stencil_view
} }
gfx.setup(&desc) gfx.setup(&desc)
sgl_desc := sgl_desc_t{} sgl_desc := sgl_desc_t{}
sgl.setup(&sgl_desc) sgl.setup(&sgl_desc)
} }
fn frame(user_data voidptr) { fn frame(user_data voidptr) {
//println('frame') // println('frame')
state := &AppState(user_data) state := &AppState(user_data)
draw() draw()
gfx.begin_default_pass(&state.pass_action, sapp.width(), sapp.height()) gfx.begin_default_pass(&state.pass_action, sapp.width(), sapp.height())
sgl.draw() sgl.draw()
gfx.end_pass() gfx.end_pass()
@ -55,30 +56,28 @@ fn draw() {
sgl.defaults() sgl.defaults()
sgl.matrix_mode_projection() sgl.matrix_mode_projection()
sgl.ortho(0.0, f32(sapp.width()), f32(sapp.height()), 0.0, -1.0, 1.0) sgl.ortho(0.0, f32(sapp.width()), f32(sapp.height()), 0.0, -1.0, 1.0)
sgl.c4b(255, 0, 0, 128) sgl.c4b(255, 0, 0, 128)
draw_hollow_rect(10, 10, 100, 30) draw_hollow_rect(10, 10, 100, 30)
sgl.c4b(25, 150, 0, 128) sgl.c4b(25, 150, 0, 128)
draw_filled_rect(10, 150, 80, 40) draw_filled_rect(10, 150, 80, 40)
//line(0, 0, 500, 500) // line(0, 0, 500, 500)
} }
fn draw_hollow_rect(x, y, w, h f32) { fn draw_hollow_rect(x, y, w, h f32) {
sgl.begin_line_strip() sgl.begin_line_strip()
sgl.v2f(x, y) sgl.v2f(x, y)
sgl.v2f(x + w, y) sgl.v2f(x + w, y)
sgl.v2f(x + w, y + h) sgl.v2f(x + w, y + h)
sgl.v2f(x, y + h) sgl.v2f(x, y + h)
sgl.v2f(x, y) sgl.v2f(x, y)
sgl.end() sgl.end()
} }
fn draw_filled_rect(x, y, w, h f32) { fn draw_filled_rect(x, y, w, h f32) {
sgl.begin_quads() sgl.begin_quads()
sgl_v2f(x, y) sgl_v2f(x, y)
sgl_v2f(x + w, y) sgl_v2f(x + w, y)
sgl_v2f(x + w, y + h) sgl_v2f(x + w, y + h)
sgl_v2f(x, y + h) sgl_v2f(x, y + h)
sgl.end() sgl.end()
} }

View File

@ -3,48 +3,45 @@ import sokol.sapp
import sokol.gfx import sokol.gfx
import sokol.sgl import sokol.sgl
import sokol.sfons import sokol.sfons
import fontstash
import os import os
import time import time
struct AppState { struct AppState {
mut: mut:
pass_action C.sg_pass_action pass_action C.sg_pass_action
fons &C.FONScontext fons &C.FONScontext
font_normal int font_normal int
} }
fn main() { fn main() {
mut color_action := sg_color_attachment_action { mut color_action := sg_color_attachment_action{
action: C.SG_ACTION_CLEAR action: C.SG_ACTION_CLEAR
} }
color_action.val[0] = 0.3 color_action.val[0] = 0.3
color_action.val[1] = 0.3 color_action.val[1] = 0.3
color_action.val[2] = 0.32 color_action.val[2] = 0.32
color_action.val[3] = 1.0 color_action.val[3] = 1.0
mut pass_action := sg_pass_action{} mut pass_action := sg_pass_action{}
pass_action.colors[0] = color_action pass_action.colors[0] = color_action
state := &AppState{ state := &AppState{
pass_action: pass_action pass_action: pass_action
fons: &C.FONScontext(0) fons: &C.FONScontext(0)
} }
title := 'V Metal/GL Text Rendering'
desc := sapp_desc{ desc := sapp_desc{
user_data: state user_data: state
init_userdata_cb: init init_userdata_cb: init
frame_userdata_cb: frame frame_userdata_cb: frame
window_title: 'V Metal/GL Text Rendering'.str window_title: title.str
html5_canvas_name: title.str
} }
sapp.run(&desc) sapp.run(&desc)
} }
fn init(user_data voidptr) { fn init(user_data voidptr) {
mut state := &AppState(user_data) mut state := &AppState(user_data)
// dont actually alocate this on the heap in real life // dont actually alocate this on the heap in real life
gfx.setup(&sg_desc { gfx.setup(&sg_desc{
mtl_device: C.sapp_metal_get_device() mtl_device: C.sapp_metal_get_device()
mtl_renderpass_descriptor_cb: sapp_metal_get_renderpass_descriptor mtl_renderpass_descriptor_cb: sapp_metal_get_renderpass_descriptor
mtl_drawable_cb: sapp_metal_get_drawable mtl_drawable_cb: sapp_metal_get_drawable
@ -53,30 +50,25 @@ fn init(user_data voidptr) {
d3d11_render_target_view_cb: sapp_d3d11_get_render_target_view d3d11_render_target_view_cb: sapp_d3d11_get_render_target_view
d3d11_depth_stencil_view_cb: sapp_d3d11_get_depth_stencil_view d3d11_depth_stencil_view_cb: sapp_d3d11_get_depth_stencil_view
}) })
s := &C.sgl_desc_t{} s := &C.sgl_desc_t{}
C.sgl_setup(s) C.sgl_setup(s)
state.fons = C.sfons_create(512, 512, 1)
state.fons = C.sfons_create(512, 512, 1)
// or use DroidSerif-Regular.ttf // or use DroidSerif-Regular.ttf
if bytes := os.read_bytes('assets/ProggyTiny.ttf') { if bytes := os.read_bytes(os.resource_abs_path('assets/ProggyTiny.ttf')) {
println('loaded font: $bytes.len') println('loaded font: $bytes.len')
state.font_normal = C.fonsAddFontMem(state.fons, "sans", bytes.data, bytes.len, false) state.font_normal = C.fonsAddFontMem(state.fons, 'sans', bytes.data, bytes.len, false)
} }
} }
fn frame(user_data voidptr) { fn frame(user_data voidptr) {
t:=time.ticks() t := time.ticks()
mut state := &AppState(user_data) mut state := &AppState(user_data)
state.render_font() state.render_font()
gfx.begin_default_pass(&state.pass_action, sapp_width(), sapp_height()) gfx.begin_default_pass(&state.pass_action, sapp_width(), sapp_height())
sgl.draw() sgl.draw()
gfx.end_pass() gfx.end_pass()
gfx.commit() gfx.commit()
//println(time.ticks()-t) // println(time.ticks()-t)
} }
fn (state &AppState) render_font() { fn (state &AppState) render_font() {
@ -85,21 +77,18 @@ fn (state &AppState) render_font() {
mut dx := 0.0 mut dx := 0.0
mut dy := 0.0 mut dy := 0.0
lh := 0.0 lh := 0.0
white := C.sfons_rgba(255, 255, 255, 255) white := C.sfons_rgba(255, 255, 255, 255)
black := C.sfons_rgba(0, 0, 0, 255) black := C.sfons_rgba(0, 0, 0, 255)
brown := C.sfons_rgba(192, 128, 0, 128) brown := C.sfons_rgba(192, 128, 0, 128)
blue := C.sfons_rgba(0, 192, 255, 255) blue := C.sfons_rgba(0, 192, 255, 255)
state.fons.clear_state() state.fons.clear_state()
sgl.defaults() sgl.defaults()
sgl.matrix_mode_projection() sgl.matrix_mode_projection()
sgl.ortho(0.0, f32(C.sapp_width()), f32(C.sapp_height()), 0.0, -1.0, 1.0) sgl.ortho(0.0, f32(C.sapp_width()), f32(C.sapp_height()), 0.0, -1.0, 1.0)
sx = 0 sx = 0
sy = 50 sy = 50
dx = sx dx = sx
dy = sy dy = sy
state.fons.set_font(state.font_normal) state.fons.set_font(state.font_normal)
state.fons.set_size(100.0) state.fons.set_size(100.0)
ascender := 0.0 ascender := 0.0
@ -109,24 +98,20 @@ fn (state &AppState) render_font() {
dy += lh dy += lh
C.fonsSetColor(state.fons, white) C.fonsSetColor(state.fons, white)
dx = C.fonsDrawText(state.fons, dx, dy, c'The quick ', C.NULL) dx = C.fonsDrawText(state.fons, dx, dy, c'The quick ', C.NULL)
fonsSetFont(state.fons, state.font_normal) fonsSetFont(state.fons, state.font_normal)
fonsSetSize(state.fons, 48.0) fonsSetSize(state.fons, 48.0)
fonsSetColor(state.fons, brown) fonsSetColor(state.fons, brown)
dx = fonsDrawText(state.fons, dx, dy, c"brown ", C.NULL) dx = fonsDrawText(state.fons, dx, dy, c'brown ', C.NULL)
fonsSetFont(state.fons, state.font_normal) fonsSetFont(state.fons, state.font_normal)
fonsSetSize(state.fons, 24.0) fonsSetSize(state.fons, 24.0)
fonsSetColor(state.fons, white) fonsSetColor(state.fons, white)
dx = fonsDrawText(state.fons, dx, dy, c"fox ", C.NULL) dx = fonsDrawText(state.fons, dx, dy, c'fox ', C.NULL)
dx = sx dx = sx
dy += lh * 1.2 dy += lh * 1.2
fonsSetSize(state.fons, 20.0) fonsSetSize(state.fons, 20.0)
fonsSetFont(state.fons, state.font_normal) fonsSetFont(state.fons, state.font_normal)
fonsSetColor(state.fons, blue) fonsSetColor(state.fons, blue)
fonsDrawText(state.fons, dx, dy, c"Now is the time for all good men to come to the aid of the party.", C.NULL) fonsDrawText(state.fons, dx, dy, c'Now is the time for all good men to come to the aid of the party.', C.NULL)
dx = 300 dx = 300
dy = 350 dy = 350
fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BASELINE) fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BASELINE)
@ -135,8 +120,7 @@ fn (state &AppState) render_font() {
fonsSetColor(state.fons, white) fonsSetColor(state.fons, white)
fonsSetSpacing(state.fons, 5.0) fonsSetSpacing(state.fons, 5.0)
fonsSetBlur(state.fons, 6.0) fonsSetBlur(state.fons, 6.0)
fonsDrawText(state.fons, dx, dy, c"Blurry...", C.NULL) fonsDrawText(state.fons, dx, dy, c'Blurry...', C.NULL)
dx = 300 dx = 300
dy += 50.0 dy += 50.0
fonsSetSize(state.fons, 28.0) fonsSetSize(state.fons, 28.0)
@ -144,47 +128,45 @@ fn (state &AppState) render_font() {
fonsSetColor(state.fons, white) fonsSetColor(state.fons, white)
fonsSetSpacing(state.fons, 0.0) fonsSetSpacing(state.fons, 0.0)
fonsSetBlur(state.fons, 3.0) fonsSetBlur(state.fons, 3.0)
fonsDrawText(state.fons, dx,dy + 2, c"DROP SHADOW", C.NULL) fonsDrawText(state.fons, dx, dy + 2, c'DROP SHADOW', C.NULL)
fonsSetColor(state.fons, black) fonsSetColor(state.fons, black)
fonsSetBlur(state.fons, 0) fonsSetBlur(state.fons, 0)
fonsDrawText(state.fons, dx,dy, c"DROP SHADOW", C.NULL) fonsDrawText(state.fons, dx, dy, c'DROP SHADOW', C.NULL)
fonsSetSize(state.fons, 18.0) fonsSetSize(state.fons, 18.0)
fonsSetFont(state.fons, state.font_normal) fonsSetFont(state.fons, state.font_normal)
fonsSetColor(state.fons, white) fonsSetColor(state.fons, white)
dx = 50 dx = 50
dy = 350 dy = 350
line(dx-10,dy,dx+250,dy) line(dx - 10, dy, dx + 250, dy)
C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_TOP) C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_TOP)
dx = C.fonsDrawText(state.fons, dx,dy, c"Top",C.NULL) dx = C.fonsDrawText(state.fons, dx, dy, c'Top', C.NULL)
dx += 10 dx += 10
C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_MIDDLE) C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_MIDDLE)
dx = C.fonsDrawText(state.fons, dx,dy, c"Middle",C.NULL) dx = C.fonsDrawText(state.fons, dx, dy, c'Middle', C.NULL)
dx += 10 dx += 10
C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BASELINE) C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BASELINE)
dx = C.fonsDrawText(state.fons, dx,dy, c"Baseline",C.NULL) dx = C.fonsDrawText(state.fons, dx, dy, c'Baseline', C.NULL)
dx += 10 dx += 10
C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BOTTOM) C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BOTTOM)
C.fonsDrawText(state.fons, dx,dy, c"Bottom",C.NULL) C.fonsDrawText(state.fons, dx, dy, c'Bottom', C.NULL)
dx = 150 dx = 150
dy = 400 dy = 400
line(dx,dy-30,dx,dy+80.0) line(dx, dy - 30, dx, dy + 80.0)
C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BASELINE) C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BASELINE)
C.fonsDrawText(state.fons, dx,dy, c"Left",C.NULL) C.fonsDrawText(state.fons, dx, dy, c'Left', C.NULL)
dy += 30 dy += 30
C.fonsSetAlign(state.fons, C.FONS_ALIGN_CENTER | C.FONS_ALIGN_BASELINE) C.fonsSetAlign(state.fons, C.FONS_ALIGN_CENTER | C.FONS_ALIGN_BASELINE)
C.fonsDrawText(state.fons, dx,dy, c"Center",C.NULL) C.fonsDrawText(state.fons, dx, dy, c'Center', C.NULL)
dy += 30 dy += 30
C.fonsSetAlign(state.fons, C.FONS_ALIGN_RIGHT | C.FONS_ALIGN_BASELINE) C.fonsSetAlign(state.fons, C.FONS_ALIGN_RIGHT | C.FONS_ALIGN_BASELINE)
C.fonsDrawText(state.fons, dx,dy, c"Right",C.NULL) C.fonsDrawText(state.fons, dx, dy, c'Right', C.NULL)
C.sfons_flush(state.fons) C.sfons_flush(state.fons)
} }
fn line(sx f32, sy f32, ex f32, ey f32) { fn line(sx f32, sy f32, ex f32, ey f32) {
sgl.begin_lines() sgl.begin_lines()
sgl.c4b(255, 255, 0, 128) sgl.c4b(255, 255, 0, 128)
sgl.v2f(sx, sy) sgl.v2f(sx, sy)
sgl.v2f(ex, ey) sgl.v2f(ex, ey)
sgl.end() sgl.end()
} }

View File

@ -3,51 +3,45 @@ import sokol.sapp
import sokol.gfx import sokol.gfx
import sokol.sgl import sokol.sgl
import sokol.sfons import sokol.sfons
import fontstash
import os import os
import time // import time
import filepath
#define FONS_USE_FREETYPE 1 #define FONS_USE_FREETYPE 1
struct AppState { struct AppState {
mut: mut:
pass_action C.sg_pass_action pass_action C.sg_pass_action
fons &C.FONScontext fons &C.FONScontext
font_normal int font_normal int
} }
fn main() { fn main() {
mut color_action := sg_color_attachment_action { mut color_action := sg_color_attachment_action{
action: C.SG_ACTION_CLEAR action: C.SG_ACTION_CLEAR
} }
color_action.val[0] = 0.3 color_action.val[0] = 0.3
color_action.val[1] = 0.3 color_action.val[1] = 0.3
color_action.val[2] = 0.32 color_action.val[2] = 0.32
color_action.val[3] = 1.0 color_action.val[3] = 1.0
mut pass_action := sg_pass_action{} mut pass_action := sg_pass_action{}
pass_action.colors[0] = color_action pass_action.colors[0] = color_action
state := &AppState{ state := &AppState{
pass_action: pass_action pass_action: pass_action
fons: &C.FONScontext(0) fons: &C.FONScontext(0)
} }
title := 'V Metal/GL Text Rendering'
desc := sapp_desc{ desc := sapp_desc{
user_data: state user_data: state
init_userdata_cb: init init_userdata_cb: init
frame_userdata_cb: frame frame_userdata_cb: frame
window_title: 'V Metal/GL Text Rendering'.str window_title: title.str
html5_canvas_name: title.str
} }
sapp.run(&desc) sapp.run(&desc)
} }
fn init(user_data voidptr) { fn init(user_data voidptr) {
mut state := &AppState(user_data) mut state := &AppState(user_data)
// dont actually alocate this on the heap in real life // dont actually alocate this on the heap in real life
gfx.setup(&sg_desc { gfx.setup(&sg_desc{
mtl_device: C.sapp_metal_get_device() mtl_device: C.sapp_metal_get_device()
mtl_renderpass_descriptor_cb: sapp_metal_get_renderpass_descriptor mtl_renderpass_descriptor_cb: sapp_metal_get_renderpass_descriptor
mtl_drawable_cb: sapp_metal_get_drawable mtl_drawable_cb: sapp_metal_get_drawable
@ -56,67 +50,53 @@ fn init(user_data voidptr) {
d3d11_render_target_view_cb: sapp_d3d11_get_render_target_view d3d11_render_target_view_cb: sapp_d3d11_get_render_target_view
d3d11_depth_stencil_view_cb: sapp_d3d11_get_depth_stencil_view d3d11_depth_stencil_view_cb: sapp_d3d11_get_depth_stencil_view
}) })
s := &C.sgl_desc_t{} s := &C.sgl_desc_t{}
C.sgl_setup(s) C.sgl_setup(s)
state.fons = C.sfons_create(512, 512, 1)
state.fons = C.sfons_create(512, 512, 1) mut font_path := os.resource_abs_path('assets/DroidSerif-Regular.ttf')
//mut font_path := cfg.font_path
//if font_path == '' {
mut font_path := 'RobotoMono-Regular.ttf'
//}
if !os.exists(font_path) { if !os.exists(font_path) {
exe_path := os.executable() font_path = os.resource_abs_path('../tetris/RobotoMono-Regular.ttf')
exe_dir := filepath.basedir(exe_path)
font_path = filepath.basedir(exe_dir) + '/tetris/$font_path'
println(font_path) println(font_path)
} }
if !os.exists(font_path) { if !os.exists(font_path) {
println('failed to load $font_path') println('failed to load $font_path')
return return
} }
if bytes := os.read_bytes(font_path) { if bytes := os.read_bytes(font_path) {
println('loaded font: $bytes.len') println('loaded font: $bytes.len')
state.font_normal = C.fonsAddFontMem(state.fons, "sans", bytes.data, bytes.len, false) state.font_normal = C.fonsAddFontMem(state.fons, 'sans', bytes.data, bytes.len, false)
} }
} }
fn frame(user_data voidptr) { fn frame(user_data voidptr) {
t:=time.ticks() // t:=time.ticks()
mut state := &AppState(user_data) mut state := &AppState(user_data)
state.render_font() state.render_font()
gfx.begin_default_pass(&state.pass_action, sapp_width(), sapp_height()) gfx.begin_default_pass(&state.pass_action, sapp_width(), sapp_height())
sgl.draw() sgl.draw()
gfx.end_pass() gfx.end_pass()
gfx.commit() gfx.commit()
//println(time.ticks()-t) // println(time.ticks()-t)
} }
fn (state &AppState) render_font() { fn (state mut AppState) render_font() {
mut sx := 0.0 mut sx := 0.0
mut sy := 0.0 mut sy := 0.0
mut dx := 0.0 mut dx := 0.0
mut dy := 0.0 mut dy := 0.0
lh := 0.0 lh := 0.0
white := C.sfons_rgba(255, 255, 255, 255) white := C.sfons_rgba(255, 255, 255, 255)
black := C.sfons_rgba(0, 0, 0, 255) black := C.sfons_rgba(0, 0, 0, 255)
brown := C.sfons_rgba(192, 128, 0, 128) brown := C.sfons_rgba(192, 128, 0, 128)
blue := C.sfons_rgba(0, 192, 255, 255) blue := C.sfons_rgba(0, 192, 255, 255)
state.fons.clear_state() state.fons.clear_state()
sgl.defaults() sgl.defaults()
sgl.matrix_mode_projection() sgl.matrix_mode_projection()
sgl.ortho(0.0, f32(C.sapp_width()), f32(C.sapp_height()), 0.0, -1.0, 1.0) sgl.ortho(0.0, f32(C.sapp_width()), f32(C.sapp_height()), 0.0, -1.0, 1.0)
sx = 0 sx = 0
sy = 50 sy = 50
dx = sx dx = sx
dy = sy dy = sy
state.fons.set_font(state.font_normal) state.fons.set_font(state.font_normal)
state.fons.set_size(100.0) state.fons.set_size(100.0)
ascender := 0.0 ascender := 0.0
@ -126,24 +106,20 @@ fn (state &AppState) render_font() {
dy += lh dy += lh
C.fonsSetColor(state.fons, white) C.fonsSetColor(state.fons, white)
dx = C.fonsDrawText(state.fons, dx, dy, c'The quick ', C.NULL) dx = C.fonsDrawText(state.fons, dx, dy, c'The quick ', C.NULL)
fonsSetFont(state.fons, state.font_normal) fonsSetFont(state.fons, state.font_normal)
fonsSetSize(state.fons, 48.0) fonsSetSize(state.fons, 48.0)
fonsSetColor(state.fons, brown) fonsSetColor(state.fons, brown)
dx = fonsDrawText(state.fons, dx, dy, c"brown ", C.NULL) dx = fonsDrawText(state.fons, dx, dy, c'brown ', C.NULL)
fonsSetFont(state.fons, state.font_normal) fonsSetFont(state.fons, state.font_normal)
fonsSetSize(state.fons, 24.0) fonsSetSize(state.fons, 24.0)
fonsSetColor(state.fons, white) fonsSetColor(state.fons, white)
dx = fonsDrawText(state.fons, dx, dy, c"fox ", C.NULL) dx = fonsDrawText(state.fons, dx, dy, c'fox ', C.NULL)
dx = sx dx = sx
dy += lh * 1.2 dy += lh * 1.2
fonsSetSize(state.fons, 20.0) fonsSetSize(state.fons, 20.0)
fonsSetFont(state.fons, state.font_normal) fonsSetFont(state.fons, state.font_normal)
fonsSetColor(state.fons, blue) fonsSetColor(state.fons, blue)
fonsDrawText(state.fons, dx, dy, c"Now is the time for all good men to come to the aid of the party.", C.NULL) fonsDrawText(state.fons, dx, dy, c'Now is the time for all good men to come to the aid of the party.', C.NULL)
dx = 300 dx = 300
dy = 350 dy = 350
fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BASELINE) fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BASELINE)
@ -152,8 +128,7 @@ fn (state &AppState) render_font() {
fonsSetColor(state.fons, white) fonsSetColor(state.fons, white)
fonsSetSpacing(state.fons, 5.0) fonsSetSpacing(state.fons, 5.0)
fonsSetBlur(state.fons, 6.0) fonsSetBlur(state.fons, 6.0)
fonsDrawText(state.fons, dx, dy, c"Blurry...", C.NULL) fonsDrawText(state.fons, dx, dy, c'Blurry...', C.NULL)
dx = 300 dx = 300
dy += 50.0 dy += 50.0
fonsSetSize(state.fons, 28.0) fonsSetSize(state.fons, 28.0)
@ -161,47 +136,45 @@ fn (state &AppState) render_font() {
fonsSetColor(state.fons, white) fonsSetColor(state.fons, white)
fonsSetSpacing(state.fons, 0.0) fonsSetSpacing(state.fons, 0.0)
fonsSetBlur(state.fons, 3.0) fonsSetBlur(state.fons, 3.0)
fonsDrawText(state.fons, dx,dy + 2, c"DROP SHADOW", C.NULL) fonsDrawText(state.fons, dx, dy + 2, c'DROP SHADOW', C.NULL)
fonsSetColor(state.fons, black) fonsSetColor(state.fons, black)
fonsSetBlur(state.fons, 0) fonsSetBlur(state.fons, 0)
fonsDrawText(state.fons, dx,dy, c"DROP SHADOW", C.NULL) fonsDrawText(state.fons, dx, dy, c'DROP SHADOW', C.NULL)
fonsSetSize(state.fons, 18.0) fonsSetSize(state.fons, 18.0)
fonsSetFont(state.fons, state.font_normal) fonsSetFont(state.fons, state.font_normal)
fonsSetColor(state.fons, white) fonsSetColor(state.fons, white)
dx = 50 dx = 50
dy = 350 dy = 350
line(dx-10,dy,dx+250,dy) line(dx - 10, dy, dx + 250, dy)
C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_TOP) C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_TOP)
dx = C.fonsDrawText(state.fons, dx,dy, c"Top",C.NULL) dx = C.fonsDrawText(state.fons, dx, dy, c'Top', C.NULL)
dx += 10 dx += 10
C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_MIDDLE) C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_MIDDLE)
dx = C.fonsDrawText(state.fons, dx,dy, c"Middle",C.NULL) dx = C.fonsDrawText(state.fons, dx, dy, c'Middle', C.NULL)
dx += 10 dx += 10
C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BASELINE) C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BASELINE)
dx = C.fonsDrawText(state.fons, dx,dy, c"Baseline",C.NULL) dx = C.fonsDrawText(state.fons, dx, dy, c'Baseline', C.NULL)
dx += 10 dx += 10
C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BOTTOM) C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BOTTOM)
C.fonsDrawText(state.fons, dx,dy, c"Bottom",C.NULL) C.fonsDrawText(state.fons, dx, dy, c'Bottom', C.NULL)
dx = 150 dx = 150
dy = 400 dy = 400
line(dx,dy-30,dx,dy+80.0) line(dx, dy - 30, dx, dy + 80.0)
C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BASELINE) C.fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BASELINE)
C.fonsDrawText(state.fons, dx,dy, c"Left",C.NULL) C.fonsDrawText(state.fons, dx, dy, c'Left', C.NULL)
dy += 30 dy += 30
C.fonsSetAlign(state.fons, C.FONS_ALIGN_CENTER | C.FONS_ALIGN_BASELINE) C.fonsSetAlign(state.fons, C.FONS_ALIGN_CENTER | C.FONS_ALIGN_BASELINE)
C.fonsDrawText(state.fons, dx,dy, c"Center",C.NULL) C.fonsDrawText(state.fons, dx, dy, c'Center', C.NULL)
dy += 30 dy += 30
C.fonsSetAlign(state.fons, C.FONS_ALIGN_RIGHT | C.FONS_ALIGN_BASELINE) C.fonsSetAlign(state.fons, C.FONS_ALIGN_RIGHT | C.FONS_ALIGN_BASELINE)
C.fonsDrawText(state.fons, dx,dy, c"Right",C.NULL) C.fonsDrawText(state.fons, dx, dy, c'Right', C.NULL)
C.sfons_flush(state.fons) C.sfons_flush(state.fons)
} }
fn line(sx f32, sy f32, ex f32, ey f32) { fn line(sx f32, sy f32, ex f32, ey f32) {
sgl.begin_lines() sgl.begin_lines()
sgl.c4b(255, 255, 0, 128) sgl.c4b(255, 255, 0, 128)
sgl.v2f(sx, sy) sgl.v2f(sx, sy)
sgl.v2f(ex, ey) sgl.v2f(ex, ey)
sgl.end() sgl.end()
} }

View File

@ -2,6 +2,13 @@ module fontstash
#flag -I @VROOT/thirdparty/fontstash #flag -I @VROOT/thirdparty/fontstash
#define FONTSTASH_IMPLEMENTATION
#include "fontstash.h"
pub const (
// TODO: fontstash.used_import is used to keep v from warning about unused imports
used_import = 1
)
// Contructor and destructor. // Contructor and destructor.
[inline] [inline]

33
vlib/sokol/c/c.v 100644
View File

@ -0,0 +1,33 @@
module c
pub const (
used_import = 1
)
#flag -I @VROOT/thirdparty/sokol
#flag -I @VROOT/thirdparty/sokol/util
#flag darwin -fobjc-arc
#flag linux -lX11 -lGL
// METAL
// #flag -DSOKOL_METAL
// #flag darwin -framework Metal -framework Cocoa -framework MetalKit -framework QuartzCore
// OPENGL
#flag -DSOKOL_GLCORE33
#flag darwin -framework OpenGL -framework Cocoa -framework QuartzCore
// for simplicity, all header includes are here because import order matters and we dont have any way
// to ensure import order with V yet
#define SOKOL_IMPL
#define SOKOL_NO_ENTRY
#include "sokol_app.h"
#define SOKOL_IMPL
#define SOKOL_NO_DEPRECATED
#include "sokol_gfx.h"
#define SOKOL_GL_IMPL
#include "util/sokol_gl.h"

28
vlib/sokol/f/f.v 100644
View File

@ -0,0 +1,28 @@
module f
import fontstash
pub const (
used_import = 1 + fontstash.used_import
)
#flag windows -I @VROOT/thirdparty/freetype/include
#flag windows -L @VROOT/thirdparty/freetype/win64
#flag linux -I/usr/include/freetype2
#flag darwin -I/usr/local/include/freetype2
#flag darwin -I/opt/local/include/freetype2
#flag darwin -I/usr/local/Cellar/freetype/2.10.0/include/freetype2/
#flag freebsd -I/usr/local/include/freetype2
#flag freebsd -Wl -L/usr/local/lib
#flag -lfreetype
#flag darwin -lpng -lbz2 -lz
#flag linux -I.
#include "ft2build.h"
#define FONS_USE_FREETYPE
#define SOKOL_FONTSTASH_IMPL
#include "util/sokol_fontstash.h"

View File

@ -27,7 +27,7 @@ pub:
enable_clipboard bool /* enable clipboard access, default is false */ enable_clipboard bool /* enable clipboard access, default is false */
clipboard_size int /* max size of clipboard content in bytes */ clipboard_size int /* max size of clipboard content in bytes */
html5_canvas_name byteptr /* the name (id) of the HTML5 canvas element, default is "canvas" */ html5_canvas_name byteptr /* the name (id) of the HTML5 canvas element, default is "canvas" */
html5_canvas_resize bool /* if true, the HTML5 canvas size is set to sapp_desc.width/height, otherwise canvas size is tracked */ html5_canvas_resize bool /* if true, the HTML5 canvas size is set to sapp_desc.width/height, otherwise canvas size is tracked */
html5_preserve_drawing_buffer bool /* HTML5 only: whether to preserve default framebuffer content between frames */ html5_preserve_drawing_buffer bool /* HTML5 only: whether to preserve default framebuffer content between frames */
html5_premultiplied_alpha bool /* HTML5 only: whether the rendered pixels use premultiplied alpha convention */ html5_premultiplied_alpha bool /* HTML5 only: whether the rendered pixels use premultiplied alpha convention */

View File

@ -1,7 +1,11 @@
module sfons module sfons
import fontstash import fontstash
#flag -I fontstash/thirdparty const (
// keep v from warning about unused imports
used_import = fontstash.used_import + 1
)
[inline] [inline]
pub fn sfons_create(width int, height int, flags int) &C.FONScontext { pub fn sfons_create(width int, height int, flags int) &C.FONScontext {

View File

@ -1,39 +1,8 @@
module sokol module sokol
#flag -I @VROOT/thirdparty/sokol import sokol.c
#flag -I @VROOT/thirdparty/sokol/util import sokol.f
#flag darwin -fobjc-arc pub const (
#flag linux -lX11 -lGL used_import = c.used_import + f.used_import
)
#flag darwin -I/usr/local/Cellar/freetype/2.10.0/include/freetype2/
#flag -lfreetype
// METAL
// #flag -DSOKOL_METAL
// #flag darwin -framework Metal -framework Cocoa -framework MetalKit -framework QuartzCore
// OPENGL
#flag -DSOKOL_GLCORE33
#flag darwin -framework OpenGL -framework Cocoa -framework QuartzCore
// for simplicity, all header includes are here because import order matters and we dont have any way
// to ensure import order with V yet
#define SOKOL_IMPL
#define SOKOL_NO_ENTRY
#include "sokol_app.h"
#define SOKOL_IMPL
#define SOKOL_NO_DEPRECATED
#include "sokol_gfx.h"
#define SOKOL_GL_IMPL
#include "util/sokol_gl.h"
#define FONS_USE_FREETYPE
#define FONTSTASH_IMPLEMENTATION
#include "fontstash.h"
#define SOKOL_FONTSTASH_IMPL
#include "util/sokol_fontstash.h"