gg: fix image rendering

pull/6074/head
Alexander Medvednikov 2020-08-05 14:34:28 +02:00
parent bf20d6d3db
commit 67aafd03c6
2 changed files with 54 additions and 49 deletions

View File

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

View File

@ -2,61 +2,44 @@
// Use of this source code is governed by an MIT license that can be found in the LICENSE file. // Use of this source code is governed by an MIT license that can be found in the LICENSE file.
module gg module gg
import gx
import os import os
import sokol import sokol
import sokol.sapp
import sokol.sgl import sokol.sgl
import sokol.gfx
import stbi import stbi
pub struct Image { pub struct Image {
pub mut: pub mut:
//id int
width int width int
height int height int
nr_channels int nr_channels int
ok bool ok bool
data voidptr data voidptr
ext string ext string
simg_ok bool
simg C.sg_image
path string path string
cache_slot &ImageCacheSlot = 0
} }
//
struct ImageCacheSlot { /*
id int
mut:
is_simg_ok bool
simg C.sg_image
}
fn (mut cs ImageCacheSlot) set_sokol_image(simg C.sg_image) {
cs.simg = simg
cs.is_simg_ok = true
}
//
[ref_only]
struct ImageCache { struct ImageCache {
id int
mut: mut:
current_image_id int = -1 simg C.sg_image
slots []ImageCacheSlot ok bool
} }
fn (ic &ImageCache) get_new_cache_slot() &ImageCacheSlot { */
mut mic := &ImageCache(0)
unsafe { //pub fn (mut ctx Context) create_image(file string) Image {
mic = ic
}
mic.current_image_id++
mic.slots << ImageCacheSlot {
id: mic.current_image_id
is_simg_ok: false
}
return &mic.slots[mic.slots.len-1]
}
const (
image_cache = &ImageCache{}
)
//
pub fn create_image(file string) Image { pub fn create_image(file string) Image {
if !os.exists(file) { if !os.exists(file) {
println('gg.create_image(): file not found: $file') println('gg.create_image(): file not found: $file')
return Image{} // none return Image{} // none
} }
//id := ctx.img_buf.len
stb_img := stbi.load(file) stb_img := stbi.load(file)
mut img := Image{ mut img := Image{
width: stb_img.width width: stb_img.width
@ -66,8 +49,12 @@ pub fn create_image(file string) Image {
data: stb_img.data data: stb_img.data
ext: stb_img.ext ext: stb_img.ext
path: file path: file
cache_slot: image_cache.get_new_cache_slot() //id: id
} }
img.init_sokol_image()
//ctx.img_buf << ImageCache {
//id: id
//}
return img return img
} }
@ -80,7 +67,6 @@ pub fn create_image_from_memory(buf byteptr, bufsize int) Image {
ok: stb_img.ok ok: stb_img.ok
data: stb_img.data data: stb_img.data
ext: stb_img.ext ext: stb_img.ext
cache_slot: image_cache.get_new_cache_slot()
} }
return img return img
} }
@ -89,8 +75,8 @@ pub fn create_image_from_byte_array(b []byte) Image {
return create_image_from_memory(b.data, b.len) return create_image_from_memory(b.data, b.len)
} }
pub fn (img &Image) new_sokol_image() C.sg_image { pub fn (mut img Image) init_sokol_image() &Image {
//eprintln('> new_sokol_image from img: $img') println('\n init sokol image $img.path ok=$img.simg_ok')
mut img_desc := C.sg_image_desc{ mut img_desc := C.sg_image_desc{
width: img.width width: img.width
height: img.height height: img.height
@ -104,25 +90,41 @@ pub fn (img &Image) new_sokol_image() C.sg_image {
ptr: img.data ptr: img.data
size: img.nr_channels * img.width * img.height size: img.nr_channels * img.width * img.height
} }
simg := C.sg_make_image(&img_desc) img.simg = C.sg_make_image(&img_desc)
return simg img.simg_ok = true
return img
} }
pub fn (img &Image) get_sokol_image() C.sg_image { fn (mut ctx Context) cache_sokol_image(img &Image) {
slot := img.cache_slot //println('\ncache sokol image $img.path ok=$img.simg_ok')
if slot.is_simg_ok { mut img_desc := C.sg_image_desc{
return slot.simg 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
} }
simg := img.new_sokol_image() img_desc.content.subimage[0][0] = C.sg_subimage_content{
unsafe { ptr: img.data
mut cs := slot size: img.nr_channels * img.width * img.height
cs.set_sokol_image(simg)
} }
return simg //ctx.img_cache[img.id].simg = C.sg_make_image(&img_desc)
//ctx.img_cache[img.id].ok = true
} }
pub fn (ctx &Context) draw_image(x, y, width, height f32, img &Image) { pub fn (ctx &Context) draw_image(x, y, width, height f32, img &Image) {
simg := img.get_sokol_image() if !img.simg_ok {
return
//ctx.cache_sokol_image(img)
/*
unsafe {
mut image := img
image.init_sokol_image()
}
*/
}
u0 := f32(0.0) u0 := f32(0.0)
v0 := f32(0.0) v0 := f32(0.0)
u1 := f32(1.0) u1 := f32(1.0)
@ -134,7 +136,7 @@ pub fn (ctx &Context) draw_image(x, y, width, height f32, img &Image) {
// //
sgl.load_pipeline(ctx.timage_pip) sgl.load_pipeline(ctx.timage_pip)
sgl.enable_texture() sgl.enable_texture()
sgl.texture(simg) sgl.texture(img.simg)
sgl.begin_quads() sgl.begin_quads()
sgl.c4b(255, 255, 255, 255) sgl.c4b(255, 255, 255, 255)
sgl.v2f_t2f(x0, y0, u0, v0) sgl.v2f_t2f(x0, y0, u0, v0)
@ -144,3 +146,5 @@ pub fn (ctx &Context) draw_image(x, y, width, height f32, img &Image) {
sgl.end() sgl.end()
sgl.disable_texture() sgl.disable_texture()
} }