gg: cache sokol C.sg_image handles
							parent
							
								
									ab7936f514
								
							
						
					
					
						commit
						221a777a80
					
				|  | @ -3,7 +3,6 @@ | |||
| module gg | ||||
| 
 | ||||
| import gx | ||||
| import os | ||||
| import sokol | ||||
| import sokol.sapp | ||||
| import sokol.sgl | ||||
|  |  | |||
							
								
								
									
										112
									
								
								vlib/gg/image.v
								
								
								
								
							
							
						
						
									
										112
									
								
								vlib/gg/image.v
								
								
								
								
							|  | @ -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() | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue