Sistema completo de packaging para distribuir ViBe3 Physics:
**Core - ResourcePack:**
- source/resource_pack.{h,cpp}: Clase para empaquetar/desempaquetar recursos
- Header binario "VBE3" con índice de archivos
- Encriptación XOR simple para ofuscar contenido
- Checksums para verificar integridad
**Integración en Texture:**
- source/external/texture.cpp: Carga desde pack con fallback a disco
- Método estático Texture::initResourceSystem()
- 1. Intenta cargar desde resources.pack
- 2. Si falla, carga desde carpeta data/ (modo desarrollo)
**Herramienta de empaquetado:**
- tools/pack_resources.cpp: Herramienta CLI para generar .pack
- tools/README.md: Documentación actualizada para ViBe3
- make pack_tool: Compila herramienta
- make resources.pack: Genera pack desde data/
**Sistema de releases (Makefile):**
- Makefile: Adaptado de Coffee Crisis a ViBe3 Physics
- Targets: windows_release, macos_release, linux_release
- APP_SOURCES actualizado con archivos de ViBe3
- Variables: TARGET_NAME=vibe3_physics, APP_NAME="ViBe3 Physics"
- Elimina carpeta config (no usada en ViBe3)
**Recursos de release:**
- release/vibe3.rc: Resource file para Windows (icono)
- release/Info.plist: Bundle info para macOS (.app)
- release/icon.{ico,icns,png}: Iconos multiplataforma
- release/frameworks/SDL3.xcframework: Framework macOS
- release/SDL3.dll: DLL Windows
- release/create_icons.py: Script generador de iconos
**Resultado:**
- resources.pack generado (5 recursos, ~1.3KB)
- Compila correctamente con CMake
- Listo para make windows_release / macos_release
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
151 lines
5.1 KiB
Python
151 lines
5.1 KiB
Python
#!/usr/bin/env python3
|
||
|
||
import os
|
||
import sys
|
||
import shutil
|
||
import subprocess
|
||
from pathlib import Path
|
||
|
||
|
||
def check_dependencies():
|
||
"""Verifica que ImageMagick esté instalado"""
|
||
try:
|
||
subprocess.run(['magick', '--version'], capture_output=True, check=True)
|
||
except (subprocess.CalledProcessError, FileNotFoundError):
|
||
print("Error: ImageMagick no está instalado o no se encuentra en el PATH")
|
||
print("Instala ImageMagick desde: https://imagemagick.org/script/download.php")
|
||
sys.exit(1)
|
||
|
||
# Verificar iconutil solo en macOS
|
||
if sys.platform == 'darwin':
|
||
try:
|
||
# iconutil no tiene --version, mejor usar which o probar con -h
|
||
result = subprocess.run(['which', 'iconutil'], capture_output=True, check=True)
|
||
if result.returncode == 0:
|
||
print("✓ iconutil disponible - se crearán archivos .ico e .icns")
|
||
except (subprocess.CalledProcessError, FileNotFoundError):
|
||
print("Error: iconutil no está disponible (solo funciona en macOS)")
|
||
print("Solo se creará el archivo .ico")
|
||
else:
|
||
print("ℹ️ Sistema no-macOS detectado - solo se creará archivo .ico")
|
||
|
||
|
||
def create_icons(input_file):
|
||
"""Crea archivos .icns e .ico a partir de un PNG"""
|
||
|
||
# Verificar que el archivo existe
|
||
if not os.path.isfile(input_file):
|
||
print(f"Error: El archivo {input_file} no existe.")
|
||
return False
|
||
|
||
# Obtener información del archivo
|
||
file_path = Path(input_file)
|
||
file_dir = file_path.parent
|
||
file_name = file_path.stem # Nombre sin extensión
|
||
file_extension = file_path.suffix
|
||
|
||
if file_extension.lower() not in ['.png', '.jpg', '.jpeg', '.bmp', '.tiff']:
|
||
print(f"Advertencia: {file_extension} puede no ser compatible. Se recomienda usar PNG.")
|
||
|
||
# Crear archivo .ico usando el método simplificado
|
||
ico_output = file_dir / f"{file_name}.ico"
|
||
try:
|
||
print(f"Creando {ico_output}...")
|
||
subprocess.run([
|
||
'magick', str(input_file),
|
||
'-define', 'icon:auto-resize=256,128,64,48,32,16',
|
||
str(ico_output)
|
||
], check=True)
|
||
print(f"✓ Archivo .ico creado: {ico_output}")
|
||
except subprocess.CalledProcessError as e:
|
||
print(f"Error creando archivo .ico: {e}")
|
||
return False
|
||
|
||
# Crear archivo .icns (solo en macOS)
|
||
if sys.platform == 'darwin':
|
||
try:
|
||
# Crear carpeta temporal para iconset
|
||
temp_folder = file_dir / "icon.iconset"
|
||
|
||
# Eliminar carpeta temporal si existe
|
||
if temp_folder.exists():
|
||
shutil.rmtree(temp_folder)
|
||
|
||
# Crear carpeta temporal
|
||
temp_folder.mkdir(parents=True)
|
||
|
||
# Definir los tamaños y nombres de archivo para .icns
|
||
icon_sizes = [
|
||
(16, "icon_16x16.png"),
|
||
(32, "icon_16x16@2x.png"),
|
||
(32, "icon_32x32.png"),
|
||
(64, "icon_32x32@2x.png"),
|
||
(128, "icon_128x128.png"),
|
||
(256, "icon_128x128@2x.png"),
|
||
(256, "icon_256x256.png"),
|
||
(512, "icon_256x256@2x.png"),
|
||
(512, "icon_512x512.png"),
|
||
(1024, "icon_512x512@2x.png")
|
||
]
|
||
|
||
print("Generando imágenes para .icns...")
|
||
# Crear cada tamaño de imagen
|
||
for size, output_name in icon_sizes:
|
||
output_path = temp_folder / output_name
|
||
subprocess.run([
|
||
'magick', str(input_file),
|
||
'-resize', f'{size}x{size}',
|
||
str(output_path)
|
||
], check=True)
|
||
|
||
# Crear archivo .icns usando iconutil
|
||
icns_output = file_dir / f"{file_name}.icns"
|
||
print(f"Creando {icns_output}...")
|
||
subprocess.run([
|
||
'iconutil', '-c', 'icns',
|
||
str(temp_folder),
|
||
'-o', str(icns_output)
|
||
], check=True)
|
||
|
||
# Limpiar carpeta temporal
|
||
if temp_folder.exists():
|
||
shutil.rmtree(temp_folder)
|
||
|
||
print(f"✓ Archivo .icns creado: {icns_output}")
|
||
|
||
except subprocess.CalledProcessError as e:
|
||
print(f"Error creando archivo .icns: {e}")
|
||
# Limpiar carpeta temporal en caso de error
|
||
if temp_folder.exists():
|
||
shutil.rmtree(temp_folder)
|
||
return False
|
||
else:
|
||
print("ℹ️ Archivo .icns no creado (solo disponible en macOS)")
|
||
|
||
return True
|
||
|
||
|
||
def main():
|
||
"""Función principal"""
|
||
# Verificar argumentos
|
||
if len(sys.argv) != 2:
|
||
print(f"Uso: {sys.argv[0]} ARCHIVO")
|
||
print("Ejemplo: python3 create_icons.py imagen.png")
|
||
sys.exit(0)
|
||
|
||
input_file = sys.argv[1]
|
||
|
||
# Verificar dependencias
|
||
check_dependencies()
|
||
|
||
# Crear iconos
|
||
if create_icons(input_file):
|
||
print("\n✅ Proceso completado exitosamente")
|
||
else:
|
||
print("\n❌ El proceso falló")
|
||
sys.exit(1)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|