<Guide du Rootard GeeXLab/>
Fichiers ZIP
Dernière mise à jour: 2018.12.10 par JeGX
>> Retour <<
Depuis la version 0.26+, il est possible de stocker des données (textures, fonts, scripts, etc) dans des
fichiers zip et de charger et utiliser ces
données dans une démo/application GeeXLab.
Données dans un fichier ZIP
Commençons par un cas simple: la creation d'une texture avec la fonction
gh_texture.create_from_zip_file().
zip_filename = gh_utils.get_demo_dir() .. "demo.zip"
image_filename = "assets/image01.jpg"
upload_to_gpu = 1
mipmap = 1
compressed_format = ""
PF_U8_RGB = 1
PF_U8_RGBA = 3
tex_id = gh_texture.create_from_zip_file(zip_filename, image_filename, upload_to_gpu, PF_U8_RGB, 0, mipmap, compressed_format)
Meme chose pour une police TTF:
zip_filename = gh_utils.get_demo_dir() .. "demo.zip"
font_filename = "assets/mykoolfont.ttf"
font_height = 24
atlas_width = 512
atlas_height = 512
char_offset_start = 32
num_chars = 256
font_id = gh_font.create_from_zip(zip_filename, font_filename, font_height, atlas_width, atlas_height, char_offset_start, num_chars)
Il est aussi possible de recupérer le contenu d'un fichier texte et de la parser ligne par ligne (voir l'article sur
Buffers):
zip_filename = demo_dir .. "demo.zip"
filename = "params.txt"
buffer, buffer_size = gh_utils.zip_buffer_create(zip_filename, filename)
offset = 0
line, line_len = gh_utils.buffer_read_line(buffer, buffer_size, size, offset)
while (line_len > 0) do
gh_utils.trace(line)
offset = offset + line_len -- next line please!
line, line_len = gh_utils.buffer_read_line(ptr, size, offset)
end
gh_utils.zip_buffer_kill(buffer)
On peut aussi exécuter du code Lua ou Python stocké dans l'archive zip:
zip_filename = demo_dir .. "demo.zip"
script_filename = "init_textures.lua"
if (gh_utils.do_file_from_zip(zip_filename, script_filename) == 1) then
-- ok
end
Encore une fois, les fonctions buffers peuvent être aussi utilisées:
zip_filename = demo_dir .. "demo.zip"
script_filename = "init_textures.lua"
buffer, buffer_size = gh_utils.zip_buffer_create(zip_filename, script_filename)
if (gh_utils.execute_from_buffer(buffer, buffer_size) == 1) then
-- ok
end
gh_utils.zip_buffer_kill(buffer)
ImageMagick et les fonctions buffers?
zip_filename = demo_dir .. "demo.zip"
image_filename = "assets/image01.jpg"
buffer, buffer_size = gh_utils.zip_buffer_create(zip_filename, image_filename)
PF_U8_RGB = 1
PF_U8_RGBA = 3
pixel_format = PF_U8_RGBA
gen_mipmaps = 1
free_cpu_memory = 1
upload_to_gpu = 1
gh_imagemagick.texture_create_from_buffer(buffer, buffer_size, pixel_format, gen_mipmaps, free_cpu_memory, upload_to_gpu)
gh_utils.zip_buffer_kill(buffer)
Si les buffers ne vous attirent pas:
zip_filename = demo_dir .. "demo.zip"
image_filename = "assets/image01.jpg"
PF_U8_RGB = 1
PF_U8_RGBA = 3
pixel_format = PF_U8_RGBA
gen_mipmaps = 1
free_cpu_memory = 1
upload_to_gpu = 1
gh_imagemagick.texture_create_from_zip_file(zip_filename, image_filename, pixel_format, gen_mipmaps, free_cpu_memory, upload_to_gpu)
Demo complète dans un fichier ZIP
Grâce au support des fichiers ZIP, il est maintenant possible de stocker la demo complète dans une archive zip. Quand je dis démo complète,
je veux dire fichier XML principal, fichiers Lua/Python et assets. Il est donc possible de livrer un unique fichier zip que l'utilisateur se
contentera de lacher dans GeeXLab pour profiter de la nouvelle démo!
Mais il y a une bonne et une mauvaise nouvelle.
La bonne nouvelle c'est qu'il n'y a pas grand chose à faire. Il suffit de zipper la demo complète. Mais il faut respecter une condition: le fichier XML
principal de la démo doit se trouver à la racine du fichier zip et s'appeller
main.xml.
La mauvaise nouvelle c'est que vous devez gérer manuellement le chargement des données depuis le zip. Ce que je veux dire c'est qu'il est toujours possible
de charger une texture depuis un fichier normal (une image utilisateur qui n'est pas dans le zip de la demo) sur le disque ou de charger une texture
depuis le zip de la demo.
GeeXLab 0.26+ vient avec une nouvelle fonction pour gérer ce cas:
gh_utils.get_demo_zip_filename()
get_demo_zip_filename() retourne le nom du fichier zip de la demo. Si get_demo_zip_filename() retourne un chaine de caractères vide, cela veut dire
que la demo a été lancée comme au bon vieux temps, depuis un fichier XML sur le disque. Si get_demo_zip_filename() retourne un chaine de caractères non-vide,
la demo a été lancée depuis un fichier zip.
C'est maintenant au développeur de la démo / application GeeXLab de gérer la source des données: depuis le disque ou depuis un zip.
Un petit example est toujours plus parlant:
local demo_zip_filename = gh_utils.get_demo_zip_filename()
-- A texture
--
local PF_U8_RGB = 1
local PF_U8_RGBA = 3
if (demo_zip_filename == "") then
tex0 = gh_texture.create_from_file_v5(demo_dir .. "./assets/image01.jpg", PF_U8_RGB)
else
local upload_to_gpu = 1
local mipmap = 1
local compressed_format = ""
tex0 = gh_texture.create_from_zip_file(demo_zip_filename, "assets/image01.jpg", upload_to_gpu, PF_U8_RGB, 0, mipmap, compressed_format)
end
tex_width, tex_height = gh_texture.get_size(tex0)
tex_aspect = tex_width / tex_height