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

gg: cache sokol C.sg_image handles

This commit is contained in:
Delyan Angelov 2020-08-05 08:09:25 +03:00
parent ab7936f514
commit 221a777a80
2 changed files with 56 additions and 57 deletions

View File

@ -3,7 +3,6 @@
module gg
import gx
import os
import sokol
import sokol.sapp
import sokol.sgl

View File

@ -2,46 +2,71 @@
// Use of this source code is governed by an MIT license that can be found in the LICENSE file.
module gg
import gx
import os
import sokol
import sokol.sapp
import sokol.sgl
import sokol.gfx
import stbi
pub struct Image {
pub mut:
//id int
id int // used as an index in image_cache.slots
width int
height int
nr_channels int
ok bool
data voidptr
ext string
simg_ok bool
simg C.sg_image
path string
}
/*
struct ImageCache {
id int
mut:
simg C.sg_image
ok bool
//
struct ImageCacheSlot {
id int
simg_ok bool
simg C.sg_image
}
*/
//pub fn (mut ctx Context) create_image(file string) Image {
[ref_only]
struct ImageCache {
mut:
current_image_id int = -1
slots []ImageCacheSlot
}
fn new_image_cache() &ImageCache {
return &ImageCache{}
}
fn (ic &ImageCache) get_new_id() int {
mut mic := &ImageCache(0)
unsafe {
mic = ic
}
mic.current_image_id++
mic.slots << ImageCacheSlot {
id: mic.current_image_id
simg_ok: false
}
return ic.current_image_id
}
fn (ic &ImageCache) set_simg(id int, simg C.sg_image) {
if id >= ic.slots.len {
panic('invalid image cache id: $id, slots.len: $ic.slots.len')
}
mut mic := &ImageCache(0)
unsafe {
mic = ic
}
mic.slots[id] = ImageCacheSlot{ id: id, simg_ok: true, simg: simg }
}
const (
image_cache = new_image_cache()
)
//
pub fn create_image(file string) Image {
if !os.exists(file) {
println('gg.create_image(): file not found: $file')
return Image{} // none
}
//id := ctx.img_buf.len
stb_img := stbi.load(file)
mut img := Image{
id: image_cache.get_new_id()
width: stb_img.width
height: stb_img.height
nr_channels: stb_img.nr_channels
@ -49,18 +74,14 @@ pub fn create_image(file string) Image {
data: stb_img.data
ext: stb_img.ext
path: file
//id: id
}
img.init_sokol_image()
//ctx.img_buf << ImageCache {
//id: id
//}
return img
}
pub fn create_image_from_memory(buf byteptr, bufsize int) Image {
stb_img := stbi.load_from_memory(buf, bufsize)
mut img := Image{
id: image_cache.get_new_id()
width: stb_img.width
height: stb_img.height
nr_channels: stb_img.nr_channels
@ -75,8 +96,8 @@ pub fn create_image_from_byte_array(b []byte) Image {
return create_image_from_memory(b.data, b.len)
}
pub fn (mut img Image) init_sokol_image() &Image {
println('\n init sokol image $img.path ok=$img.simg_ok')
pub fn (img &Image) new_sokol_image() C.sg_image {
//eprintln('> new_sokol_image from img: $img')
mut img_desc := C.sg_image_desc{
width: img.width
height: img.height
@ -90,41 +111,22 @@ pub fn (mut img Image) init_sokol_image() &Image {
ptr: img.data
size: img.nr_channels * img.width * img.height
}
img.simg = C.sg_make_image(&img_desc)
img.simg_ok = true
return img
simg := C.sg_make_image(&img_desc)
return simg
}
fn (mut ctx Context) cache_sokol_image(img &Image) {
//println('\ncache sokol image $img.path ok=$img.simg_ok')
mut img_desc := C.sg_image_desc{
width: img.width
height: img.height
num_mipmaps: 0
wrap_u: .clamp_to_edge
wrap_v: .clamp_to_edge
label: &byte(0)
d3d11_texture: 0
pub fn (img &Image) get_sokol_image() C.sg_image {
slot := image_cache.slots[img.id]
if slot.simg_ok {
return slot.simg
}
img_desc.content.subimage[0][0] = C.sg_subimage_content{
ptr: img.data
size: img.nr_channels * img.width * img.height
}
//ctx.img_cache[img.id].simg = C.sg_make_image(&img_desc)
//ctx.img_cache[img.id].ok = true
simg := img.new_sokol_image()
image_cache.set_simg(img.id, simg)
return simg
}
pub fn (ctx &Context) draw_image(x, y, width, height f32, img &Image) {
if !img.simg_ok {
return
//ctx.cache_sokol_image(img)
/*
unsafe {
mut image := img
image.init_sokol_image()
}
*/
}
simg := img.get_sokol_image()
u0 := f32(0.0)
v0 := f32(0.0)
u1 := f32(1.0)
@ -136,7 +138,7 @@ pub fn (ctx &Context) draw_image(x, y, width, height f32, img &Image) {
//
sgl.load_pipeline(ctx.timage_pip)
sgl.enable_texture()
sgl.texture(img.simg)
sgl.texture(simg)
sgl.begin_quads()
sgl.c4b(255, 255, 255, 255)
sgl.v2f_t2f(x0, y0, u0, v0)
@ -146,5 +148,3 @@ pub fn (ctx &Context) draw_image(x, y, width, height f32, img &Image) {
sgl.end()
sgl.disable_texture()
}