1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

sokol: fix building of examples and ci tests

This commit is contained in:
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

3
examples/sokol_examples/.gitignore vendored Normal file
View File

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

Binary file not shown.

Binary file not shown.

View File

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

View File

@ -3,48 +3,45 @@ import sokol.sapp
import sokol.gfx
import sokol.sgl
import sokol.sfons
import fontstash
import os
import time
struct AppState {
mut:
pass_action C.sg_pass_action
fons &C.FONScontext
fons &C.FONScontext
font_normal int
}
fn main() {
mut color_action := sg_color_attachment_action {
mut color_action := sg_color_attachment_action{
action: C.SG_ACTION_CLEAR
}
color_action.val[0] = 0.3
color_action.val[1] = 0.3
color_action.val[2] = 0.32
color_action.val[3] = 1.0
mut pass_action := sg_pass_action{}
pass_action.colors[0] = color_action
state := &AppState{
pass_action: pass_action
fons: &C.FONScontext(0)
}
title := 'V Metal/GL Text Rendering'
desc := sapp_desc{
user_data: state
init_userdata_cb: init
frame_userdata_cb: frame
window_title: 'V Metal/GL Text Rendering'.str
window_title: title.str
html5_canvas_name: title.str
}
sapp.run(&desc)
}
fn init(user_data voidptr) {
mut state := &AppState(user_data)
// 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_renderpass_descriptor_cb: sapp_metal_get_renderpass_descriptor
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_depth_stencil_view_cb: sapp_d3d11_get_depth_stencil_view
})
s := &C.sgl_desc_t{}
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
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')
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) {
t:=time.ticks()
t := time.ticks()
mut state := &AppState(user_data)
state.render_font()
gfx.begin_default_pass(&state.pass_action, sapp_width(), sapp_height())
sgl.draw()
gfx.end_pass()
gfx.commit()
//println(time.ticks()-t)
// println(time.ticks()-t)
}
fn (state &AppState) render_font() {
@ -85,21 +77,18 @@ fn (state &AppState) render_font() {
mut dx := 0.0
mut dy := 0.0
lh := 0.0
white := C.sfons_rgba(255, 255, 255, 255)
black := C.sfons_rgba(0, 0, 0, 255)
brown := C.sfons_rgba(192, 128, 0, 128)
blue := C.sfons_rgba(0, 192, 255, 255)
state.fons.clear_state()
white := C.sfons_rgba(255, 255, 255, 255)
black := C.sfons_rgba(0, 0, 0, 255)
brown := C.sfons_rgba(192, 128, 0, 128)
blue := C.sfons_rgba(0, 192, 255, 255)
state.fons.clear_state()
sgl.defaults()
sgl.matrix_mode_projection()
sgl.ortho(0.0, f32(C.sapp_width()), f32(C.sapp_height()), 0.0, -1.0, 1.0)
sgl.matrix_mode_projection()
sgl.ortho(0.0, f32(C.sapp_width()), f32(C.sapp_height()), 0.0, -1.0, 1.0)
sx = 0
sy = 50
dx = sx
dx = sx
dy = sy
state.fons.set_font(state.font_normal)
state.fons.set_size(100.0)
ascender := 0.0
@ -109,24 +98,20 @@ fn (state &AppState) render_font() {
dy += lh
C.fonsSetColor(state.fons, white)
dx = C.fonsDrawText(state.fons, dx, dy, c'The quick ', C.NULL)
fonsSetFont(state.fons, state.font_normal)
fonsSetSize(state.fons, 48.0)
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)
fonsSetSize(state.fons, 24.0)
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
dy += lh * 1.2
fonsSetSize(state.fons, 20.0)
fonsSetFont(state.fons, state.font_normal)
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
dy = 350
fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BASELINE)
@ -135,8 +120,7 @@ fn (state &AppState) render_font() {
fonsSetColor(state.fons, white)
fonsSetSpacing(state.fons, 5.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
dy += 50.0
fonsSetSize(state.fons, 28.0)
@ -144,47 +128,45 @@ fn (state &AppState) render_font() {
fonsSetColor(state.fons, white)
fonsSetSpacing(state.fons, 0.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)
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)
fonsSetFont(state.fons, state.font_normal)
fonsSetColor(state.fons, white)
dx = 50
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)
dx = C.fonsDrawText(state.fons, dx,dy, c"Top",C.NULL)
dx = C.fonsDrawText(state.fons, dx, dy, c'Top', C.NULL)
dx += 10
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
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
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
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.fonsDrawText(state.fons, dx,dy, c"Left",C.NULL)
C.fonsDrawText(state.fons, dx, dy, c'Left', C.NULL)
dy += 30
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
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)
}
fn line(sx f32, sy f32, ex f32, ey f32) {
sgl.begin_lines()
sgl.c4b(255, 255, 0, 128)
sgl.v2f(sx, sy)
sgl.v2f(ex, ey)
sgl.end()
sgl.begin_lines()
sgl.c4b(255, 255, 0, 128)
sgl.v2f(sx, sy)
sgl.v2f(ex, ey)
sgl.end()
}

View File

@ -3,51 +3,45 @@ import sokol.sapp
import sokol.gfx
import sokol.sgl
import sokol.sfons
import fontstash
import os
import time
import filepath
// import time
#define FONS_USE_FREETYPE 1
struct AppState {
mut:
pass_action C.sg_pass_action
fons &C.FONScontext
fons &C.FONScontext
font_normal int
}
fn main() {
mut color_action := sg_color_attachment_action {
mut color_action := sg_color_attachment_action{
action: C.SG_ACTION_CLEAR
}
color_action.val[0] = 0.3
color_action.val[1] = 0.3
color_action.val[2] = 0.32
color_action.val[3] = 1.0
mut pass_action := sg_pass_action{}
pass_action.colors[0] = color_action
state := &AppState{
pass_action: pass_action
fons: &C.FONScontext(0)
}
title := 'V Metal/GL Text Rendering'
desc := sapp_desc{
user_data: state
init_userdata_cb: init
frame_userdata_cb: frame
window_title: 'V Metal/GL Text Rendering'.str
window_title: title.str
html5_canvas_name: title.str
}
sapp.run(&desc)
}
fn init(user_data voidptr) {
mut state := &AppState(user_data)
// 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_renderpass_descriptor_cb: sapp_metal_get_renderpass_descriptor
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_depth_stencil_view_cb: sapp_d3d11_get_depth_stencil_view
})
s := &C.sgl_desc_t{}
C.sgl_setup(s)
state.fons = C.sfons_create(512, 512, 1)
//mut font_path := cfg.font_path
//if font_path == '' {
mut font_path := 'RobotoMono-Regular.ttf'
//}
state.fons = C.sfons_create(512, 512, 1)
mut font_path := os.resource_abs_path('assets/DroidSerif-Regular.ttf')
if !os.exists(font_path) {
exe_path := os.executable()
exe_dir := filepath.basedir(exe_path)
font_path = filepath.basedir(exe_dir) + '/tetris/$font_path'
font_path = os.resource_abs_path('../tetris/RobotoMono-Regular.ttf')
println(font_path)
}
if !os.exists(font_path) {
println('failed to load $font_path')
return
}
if bytes := os.read_bytes(font_path) {
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) {
t:=time.ticks()
// t:=time.ticks()
mut state := &AppState(user_data)
state.render_font()
gfx.begin_default_pass(&state.pass_action, sapp_width(), sapp_height())
sgl.draw()
gfx.end_pass()
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 sy := 0.0
mut dx := 0.0
mut dy := 0.0
lh := 0.0
white := C.sfons_rgba(255, 255, 255, 255)
black := C.sfons_rgba(0, 0, 0, 255)
brown := C.sfons_rgba(192, 128, 0, 128)
blue := C.sfons_rgba(0, 192, 255, 255)
state.fons.clear_state()
white := C.sfons_rgba(255, 255, 255, 255)
black := C.sfons_rgba(0, 0, 0, 255)
brown := C.sfons_rgba(192, 128, 0, 128)
blue := C.sfons_rgba(0, 192, 255, 255)
state.fons.clear_state()
sgl.defaults()
sgl.matrix_mode_projection()
sgl.ortho(0.0, f32(C.sapp_width()), f32(C.sapp_height()), 0.0, -1.0, 1.0)
sgl.matrix_mode_projection()
sgl.ortho(0.0, f32(C.sapp_width()), f32(C.sapp_height()), 0.0, -1.0, 1.0)
sx = 0
sy = 50
dx = sx
dx = sx
dy = sy
state.fons.set_font(state.font_normal)
state.fons.set_size(100.0)
ascender := 0.0
@ -126,24 +106,20 @@ fn (state &AppState) render_font() {
dy += lh
C.fonsSetColor(state.fons, white)
dx = C.fonsDrawText(state.fons, dx, dy, c'The quick ', C.NULL)
fonsSetFont(state.fons, state.font_normal)
fonsSetSize(state.fons, 48.0)
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)
fonsSetSize(state.fons, 24.0)
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
dy += lh * 1.2
fonsSetSize(state.fons, 20.0)
fonsSetFont(state.fons, state.font_normal)
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
dy = 350
fonsSetAlign(state.fons, C.FONS_ALIGN_LEFT | C.FONS_ALIGN_BASELINE)
@ -152,8 +128,7 @@ fn (state &AppState) render_font() {
fonsSetColor(state.fons, white)
fonsSetSpacing(state.fons, 5.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
dy += 50.0
fonsSetSize(state.fons, 28.0)
@ -161,47 +136,45 @@ fn (state &AppState) render_font() {
fonsSetColor(state.fons, white)
fonsSetSpacing(state.fons, 0.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)
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)
fonsSetFont(state.fons, state.font_normal)
fonsSetColor(state.fons, white)
dx = 50
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)
dx = C.fonsDrawText(state.fons, dx,dy, c"Top",C.NULL)
dx = C.fonsDrawText(state.fons, dx, dy, c'Top', C.NULL)
dx += 10
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
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
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
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.fonsDrawText(state.fons, dx,dy, c"Left",C.NULL)
C.fonsDrawText(state.fons, dx, dy, c'Left', C.NULL)
dy += 30
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
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)
}
fn line(sx f32, sy f32, ex f32, ey f32) {
sgl.begin_lines()
sgl.c4b(255, 255, 0, 128)
sgl.v2f(sx, sy)
sgl.v2f(ex, ey)
sgl.end()
sgl.begin_lines()
sgl.c4b(255, 255, 0, 128)
sgl.v2f(sx, sy)
sgl.v2f(ex, ey)
sgl.end()
}