sokol: fix building of examples and ci tests
parent
3d57d3bb7b
commit
24d34a4f2c
|
@ -0,0 +1,3 @@
|
||||||
|
fonts
|
||||||
|
fonts2
|
||||||
|
drawing
|
Binary file not shown.
Binary file not shown.
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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"
|
|
@ -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"
|
|
@ -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 */
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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"
|
|
||||||
|
|
Loading…
Reference in New Issue