eepp es un marco de desarrollo de aplicaciones y juegos multiplataforma de código abierto centrado en gran medida en el desarrollo de interfaces gráficas de usuario enriquecidas.
Soporte oficial para Linux, Windows, macOS, Android e iOS.
Exporta a HTML5 usando emscripten con algunas limitaciones menores.
También funciona en BSD y Haiku.
Widgets básicos para administrar los objetos de la aplicación/juego como nodos, con todos los eventos básicos de interacción de entrada (clics, pulsaciones de teclas, desplazamiento del mouse, enfoque, etc.).
Sistema de interfaz de usuario con todas las funciones, soporte de animación, escalado, rotación, recorte, eventos, mensajes, etc.
Soporte de temas y máscaras/decoraciones.
Soporte de densidad de píxeles (escalado de elementos de la interfaz de usuario definidos por la densidad de píxeles de la pantalla).
Se implementan todos los widgets básicos (botón, cuadro de texto, cuadro combinado, cuadro de entrada, menú, cuadro de lista, barras de desplazamiento, etc.).
Soporte de invalidación de sorteos. Se puede utilizar para crear aplicaciones reales, con bajo uso de recursos (solo se vuelve a dibujar cuando es necesario).
Sistema de diseño similar a los diseños de Android (LinearLayout, RelativeLayout, GridLayout).
Funciones avanzadas como selección de texto, copiar y pegar y combinaciones de teclas.
Cargar y diseñar diseños desde XML
Estilo con hojas de estilo en cascada
Representadores para OpenGL 2 (canalización fija), OpenGL 3 (canalización programable), OpenGL ES 2, OpenGL ES 1 y OpenGL Core Profile.
Renderizador por lotes (el motor procesa por lotes automáticamente todo el renderizado).
Compatibilidad con fuentes (TrueType, BMFont y XNA Fonts).
Soporte de búfer de cuadros.
Soporte de sombreadores (con sombreadores automáticos de canalización fija a conversor programable).
Compatibilidad con objetos de búfer de vértices.
Sistema de partículas.
Consola extensible.
Sprites animados.
Soporte de Texture Atlas (creación y actualización automática del atlas de texturas, editor incluido).
Máscaras de recorte (stencil, tijeras, planos)
Compatibilidad con nueve parches de mapas de bits redimensionables.
Dibujables primitivos.
Se admiten muchos formatos de imagen (incluido SVG rasterizado), compatibilidad con texturas comprimidas (carga directa a la GPU cuando sea posible).
Módulo basado en backend, esto significa que puede crear fácilmente un backend para el manejo de ventanas/entradas.
Actualmente admite SDL 2 como backend.
Soporte para portapapeles.
Cursores de hardware.
Administrador de visualización
Soporte para joystick.
Proporciona todos los elementos básicos para el soporte completo de subprocesos múltiples de la biblioteca, soporte de formatos de archivo para empaquetado, relojes, administrador de recursos, traductor y mucho más.
Clase de sistema de archivos virtual (proveedores de activos abstractos en un único sistema de archivos virtual, abstrayendo archivos zip y sistema de archivos local en uno para una carga transparente de recursos, similar a PhysicsFS).
Administrador de memoria personalizable. Se utiliza de forma predeterminada en el modo de depuración para realizar un seguimiento de las pérdidas de memoria.
Soporte UTF8, UTF-16, UTF-32, Ansi, Wide Char.
Clase de cadena que utiliza caracteres UTF-32 internamente.
Macros de depuración
Funciones y plantillas de propósito general (vector, quad, polígono, etc.).
Clases de interpolación con flexibilización.
Algunas utilidades matemáticas menores incluyen la implementación del generador de números aleatorios Mersenne Twister, ruido perlin y más.
Solicitudes web con cliente HTTP, con soporte TLS (proporcionado por mbedtls o openssl).
Solicitudes HTTP asincrónicas.
Transferencias de archivos con cliente FTP y cliente FTPS (FTP con TLS explícito).
Conectores TCP y UDP.
Compatibilidad con codificación de contenido HTTP y codificación de transferencia.
Soporte de proxy HTTP.
Soporte de respuesta comprimida HTTP.
También admite reanudación/continuación de descarga HTTP y redirecciones de seguimiento automáticas.
Sistema basado en nodos para una fácil gestión de escenas.
Control total de los eventos de los nodos (clics, pasar el mouse, enfocar, etc.).
Sistema de eventos.
Sistema de mensajes de nodo.
Acciones programables para nodos (fundir, rotar, mover, escalar, etc.).
Mapas en mosaico con luces dinámicas de software.
Editor de mapas con todas las funciones.
Editor de interfaz de usuario muy simple. Cargue diseños desde un archivo XML y vea los cambios realizados en tiempo real.
Editor de atlas de texturas. Una herramienta muy sencilla que permite al desarrollador crear y editar atlas de texturas.
Editor de mapas: un editor de mapas avanzado pero sencillo para el motor del juego. Carece de varias características ya que no tuve tiempo para trabajar en ello, esta herramienta en particular probablemente dejará de ser compatible con mapas TMX en un futuro cercano (pero no soy un fanático de los mapas TMX, por lo que no hay una decisión para el momento).
La documentación se encuentra aquí. Actualmente estoy trabajando para mejorarlo. Alrededor del 50% del proyecto está actualmente documentado, por lo que todavía necesita mucho trabajo. Consulte los ejemplos de código ubicados en src/examples
y también puede consultar la prueba ( src/test
) y las herramientas ( src/tools
).
Estoy poniendo mis esfuerzos en mejorar la documentación del módulo UI ya que actualmente es el módulo más importante y complejo pero carece de la documentación adecuada. Si tienes alguna pregunta puedes contactarme en cualquier momento.
El repositorio utiliza submódulos de git, por lo que necesitarás clonar el repositorio y sus submódulos. Para lograr esto fácilmente, simplemente puedes clonarlo con:
git clone --recurse-submodules https://github.com/SpartanJ/eepp.git
ecode es un editor de código inspirado en lite. Está utilizando el tema CSS puro más nuevo basado en el tema oscuro predeterminado de Plasma: Breeze Dark.
Editor que muestra en tiempo real los cambios en cualquier diseño y CSS para ayudar a acelerar el desarrollo de interfaces de usuario. En la captura de pantalla se muestran algunos de los widgets predeterminados disponibles en eepp.
Pequeña herramienta, utilizada para crear y editar atlas de texturas.
Editor de mapas 2D que utiliza el tema de aspecto predeterminado (utiliza un atlas de textura único con imágenes de 9 parches).
Debería resultarle realmente familiar a cualquier desarrollador de Android. Esta es una ventana con los widgets más básicos en una pantalla de diseño lineal vertical.
< window layout_width = " 300dp " layout_height = " 300dp " window-flags = " default|maximize|shadow " >
< LinearLayout id = " testlayout " orientation = " vertical " layout_width = " match_parent " layout_height = " match_parent " layout_margin = " 8dp " >
< TextView text = " Hello World! " gravity = " center " layout_gravity = " center_horizontal " layout_width = " match_parent " layout_height = " wrap_content " backgroundColor = " black " />
< PushButton text = " OK! " textSize = " 16dp " icon = " ok " gravity = " center " layout_gravity = " center_horizontal " layout_width = " match_parent " layout_height = " wrap_content " />
< Image src = " thecircle " layout_width = " match_parent " layout_height = " 32dp " flags = " clip " />
< Sprite src = " gn " />
< TextInput text = " test " layout_width = " match_parent " layout_height = " wrap_content " />
< DropDownList layout_width = " match_parent " layout_height = " wrap_content " selectedIndex = " 0 " >
< item >Test Item</ item >
< item >@string/test_item</ item >
</ DropDownList >
< ListBox layout_width = " match_parent " layout_height = " match_parent " layout_weight = " 1 " >
< item >Hello!</ item >
< item >World!</ item >
</ ListBox >
</ LinearLayout >
</ window >
La introducción a la interfaz de usuario se puede encontrar aquí .
¿Cómo se ve con código real?
UITextView::New ()->setText( " Text on test 1 " )
->setCharacterSize( 12 )
->setLayoutMargin( Rect ( 10 , 10 , 10 , 10 ) )
->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent )
->setParent( layout );
El estilo de elementos se puede realizar con una implementación personalizada de hojas de estilo en cascada, las reglas CSS2 más comunes están disponibles, además de varias reglas CSS3 (algunos ejemplos: animaciones, transiciones, propiedades personalizadas, consultas de medios, @font-face en la regla, elemento :root). . Aquí hay un pequeño ejemplo de cómo se ve el CSS:
@font-face {
font-family : "OpenSans Regular" ;
src : url ( "https://raw.githubusercontent.com/SpartanJ/eepp/develop/bin/assets/fonts/OpenSans-Regular.ttf" );
}
@import url ( "assets/layouts/imported.css" ) screen and ( min-width : 800 px );
: root {
--font-color : black;
--background-input-color : rgba ( 255 , 255 , 255 , 0.7 );
--border-color : black;
--border-width : 1 dp ;
}
. screen TextView {
color : var ( --font-color );
}
. form {
background-image : @drawable /back;
background-repeat : no-repeat;
background-size : cover;
}
. form . form_inputs {
background-color : var ( --non-existent , var ( --background-input-color ));
margin-left : 100 dp ;
margin-right : 100 dp ;
padding-top : 72 dp ;
padding-left : 57 dp ;
padding-right : 57 dp ;
padding-bottom : 115 dp ;
}
. screen TextView . input ,
. screen TextInput . input {
font-family : AkzidenzGroteskBQ-Cnd;
layout-width : match_parent;
layout-height : 80 dp ;
border-color : var ( --border-color );
border-width : var ( --border-width );
color : var ( --font-color );
padding-left : 40 dp ;
padding-right : 40 dp ;
margin-bottom : 32 dp ;
skin : none;
hint-font-family : AkzidenzGroteskBQ-Cnd;
hint-font-size : 46 dp ;
hint-color : # 818285 ;
background-color : # FFFFFF00 ;
transition : all 0.125 s ;
}
. screen TextInput . input : focus {
background-color : # FFFFFF66 ;
border-color : # 796500 ;
}
. screen TextInput . input : hover {
background-color : # FFFFFF66 ;
}
@media screen and ( max-width : 1024 px ) {
. form . form_inputs {
background-color : red;
}
}
La especificación CSS completa se puede encontrar en los documentos: aquí.
También puedes comprobar cómo se ve un tema CSS puro en eepp: aquí.
Dado que eepp admite emscripten, puede echar un vistazo rápido a algunos de los ejemplos, demostraciones y herramientas que la biblioteca proporciona actualmente. Tenga en cuenta que encontrará algunas diferencias basadas en las limitaciones que tienen emscripten en este momento (sin acceso al sistema de archivos, sin cursores personalizados, etc.) y además las demostraciones no están optimizadas para el tamaño y son más grandes de lo que deberían. ser. Nota: utilice un navegador moderno con buena compatibilidad con WebGL y WASM (Chrome/ium 70+ o Firefox 80+).
ecode - Editor de código
Editor de interfaz de usuario
Interfaz de usuario Hola mundo
Editor de atlas de texturas
Editor de mapas
Ejemplo de fuentes
Demostración del módulo de física
Ejemplo de sprites
Prueba completa
7GUIs se conoce como un "punto de referencia de programación de GUI" que se utiliza para comparar diferentes bibliotecas de GUI y explorar cada enfoque de biblioteca para la programación de GUI. Las 7 tareas propuestas en 7GUI se han implementado para eepp. Las tareas son muy buenas representativas de lo que se puede lograr con la GUI de eepp y también son muy útiles para demostrar cómo implementar diferentes tareas con la biblioteca.
Las 7GUI están compuestas por las siguientes tareas:
Contador: Demostración e implementación de código.
Convertidor de temperatura: demostración e implementación de código.
Flight Booker: Demostración e implementación de código.
Temporizador: Demostración e implementación de código.
CRUD: Demostración e implementación de código.
Circle Drawer: Demostración e implementación de código.
Cells: Demostración e implementación de código.
La biblioteca tiene sólo una dependencia externa. Sólo necesitarás la biblioteca SDL2 con los encabezados instalados. También se necesita premake5 o premake4 para generar los Makefiles o archivos de proyecto para construir la biblioteca. Asumiré que sabes lo que estás haciendo y me saltaré lo básico.
Aviso: eepp usa mojoAL de forma predeterminada como reemplazo directo de OpenAL. OpenAL está disponible opcionalmente como backend de audio. Si deseas utilizarlo, tienes la alternativa de habilitarlo. Para habilitarlo y deshabilitar el reemplazo directo de mojoAL, debe agregar el parámetro --without-mojoal
a cualquier llamada premake
(por ejemplo: premake5 --without-mojoal gmake2
).
En un sistema Ubuntu sería algo como (también necesitarás gcc pero se instalará de todos modos):
sudo apt-get install premake5 libsdl2-2.0-0 libsdl2-dev libopenal1 libopenal-dev
Clona el repositorio y ejecuta en el directorio raíz del repositorio:
premake5 gmake2
o si tienes premake4 instalado puedes ejecutar:
premake4 gmake
Luego simplemente construye la biblioteca:
make -C make/linux
Eso es todo. Eso construirá todo el proyecto.
Tienes dos opciones: compilar con Visual Studio o con MinGW. Para poder construir el proyecto con cualquiera de estas opciones, primero deberá generar los archivos del proyecto con premake4 o premake5. Luego deberá agregar el archivo binario a cualquiera de las rutas ejecutables definidas en PATH
(o agregar una, o utilizarla desde una ruta local). Descargue archivos de Visual Studio o MinGW según sus necesidades.
Necesitará usar premake5 y ejecutar:
premake5.exe --windows-vc-build vs2022
Luego, los archivos del proyecto deberían encontrarse en make/windows/
. Una solución completa y todo el proyecto estará disponible. Una vez instalado todo, podrá crear la solución Visual Studio como cualquier otro proyecto.
El uso del argumento de la línea de comando --windows-vc-build
descargará la dependencia SDL2 automáticamente y agregará las rutas al proceso de compilación para vincularla sin la necesidad de descargar manualmente ninguna dependencia externa.
Luego simplemente cree la solución en Visual Studio o ejecute MSBuild
manualmente en una consola:
"%MSBUILD_PATH%MSBuild.exe" .makewindowseepp.sln -m
Donde %MSBUILD_PATH%
es la ruta de Visual Studio de MSBuild.exe, por ejemplo, para VS2022 Community Edition la ruta suele ser:
C:Program FilesMicrosoft Visual Studio2022CommunityMSBuildCurrentBin
Las compilaciones de Windows MinGW se están produciendo y probando con la distribución w64devkit. Actualmente, MSYS no cuenta con soporte oficial debido a algunos problemas encontrados en el proceso de compilación (pero es posible compilar con algunos pasos adicionales).
Si está utilizando w64devkit, tendrá que descargarlo y extraerlo; asumiremos que está extraído en C:w64devkit
.
Ejecute C:w64devkitw64devkit.exe
como administrador ( right click
-> Run as administrator
).
Luego vaya al directorio del repositorio clonado eepp
y ejecute:
premake5.exe --windows-mingw-build gmake2
--windows-mingw-build
descargará y vinculará automáticamente las dependencias externas (SDL2).
Luego simplemente construye el proyecto ubicado en make/windows/
con mingw32-make.exe
o cualquier equivalente:
mingw32-make.exe -C make\windows config=release_x86_64
Para crear una ejecución de compilación de depuración:
mingw32-make.exe -C make\windows config=debug_x86_64
Y luego asegúrese de copiar el archivo SDL2.dll
ubicado en src/thirdparty/SDL2-2.XX.X/x86_64-w64-mingw32/bin/SDL2.dll
a bin
. Si por alguna razón eepp.dll
(o eepp-debug.dll
) no se copia automáticamente, puede copiarlos desde libs/windows/x86_64/
a bin
.
Necesitará los binarios precompilados y las bibliotecas de desarrollo de SDL2; OpenAL está incluido con el sistema operativo. Instale el marco SDL2 y debería poder construir el proyecto.
Tienes dos opciones para construir el proyecto: con XCode o con Makefiles . Para compilar con cualquiera de ambas opciones primero, también necesitarás compilar los archivos del proyecto con premake4 o premake5.
Generar el proyecto:
premake5 --use-frameworks gmake2
Y constrúyelo:
make -C make/macosx
Puede utilizar el script projects/osx/make.sh
, que genera los Makefiles y construye el proyecto.
Correr:
premake5 --use-frameworks xcode4
Y abra el proyecto XCode generado en make/macosx/
o simplemente compílelo desde la línea de comando con:
xcodebuild -project make/macosx/project-name.xcodeproj
Hay un proyecto gradle en projects/android-project/
. Construirá la biblioteca con todas las dependencias incluidas. Utilice el proyecto de ejemplo como base para su proyecto. Observe que hay un archivo de proyecto eepp.mk
que construye la biblioteca. Ese archivo se puede utilizar en sus proyectos.
El proyecto proporciona dos archivos para construir la biblioteca y las demostraciones. Puedes utilizar cualquiera de ellos según tus necesidades. Los archivos se encuentran en projects/ios
:
Este script se puede utilizar para generar los proyectos xcode y la solución de todos los proyectos incluidos en eepp (demostraciones, herramientas, biblioteca compartida, biblioteca estática, etc.). También descargará y creará la biblioteca estática fat SDL2 para poder hacer referencia a la biblioteca con el proyecto. Después de construir los proyectos, lamentablemente necesitarás realizar algunos cambios menores en cualquiera o todos los proyectos que no deseas construir o probar, ya que el proyecto generado carece de algunas configuraciones menores. Después de ejecutar este script, deberá abrir la solución ubicada en make/ios/eepp.xcworkspace
. Para construir las bibliotecas estáticas no encontrará ningún problema (eso funcionará de inmediato). Pero para probar algunos de los ejemplos es necesario:
Seleccione (haga clic en el nombre del proyecto) el proyecto que desea probar, por ejemplo eepp-empty-window
. Verá varias pestañas/opciones, vaya a Configuración de compilación y busque la opción Archivo Info.plist , haga doble clic para editar y escribir: Info.plist
. Esto indicará leer ese archivo que se encuentra en el mismo directorio que el proyecto. Vaya a la pestaña General y complete el Identificador de paquete con un nombre de identificador del paquete de aplicación que se generará; para este ejemplo puede usar algo como: eepp-empty-window
. Eso le permitirá construir y ejecutar el proyecto.
Esta demostración eepp-empty-window
no utiliza ningún activo/recurso, pero otras demostraciones necesitarán cargar activos, y estos activos deben agregarse al proyecto para que estén disponibles para el paquete de aplicaciones. Por ejemplo, el proyecto eepp-ui-hello-world
requerirá que agregue la carpeta assets
al proyecto. Lo que debe hacer es: seleccionar el proyecto y ir a la pestaña Fases de compilación , en Copiar recursos de paquetes , hacer clic en el ícono más (+), luego ir a Agregar otro... y ubicar y seleccionar la carpeta bin/assets/
y Finalizar . Eso debería ser suficiente.
Este script se puede utilizar para construir SDL2 y eepp como dos bibliotecas estáticas con arquitecturas arm64 y x86_64 (arm64 para iPhone/iPad y x86_64 para los simuladores). Para generar una compilación de lanzamiento, pase config=release
como parámetro del script ( sh compile-all.sh config=release
). Los archivos compilados se ubicarán en libs/ios/
, como libSDL2.a
y libeepp.a
(o libeepp-debug.a
para la compilación de depuración). Estos dos archivos se pueden integrar en su proyecto.
Primero deberá descargar e instalar emscripten. Luego hay un script para construir el proyecto emscripten en projects/emscripten/make.sh
. Antes de ejecutar este script, recuerde configurar el entorno emsdk, que debería ser algo como: source /path/to/emsdk/emsdk_env.sh
. Eso debería ser suficiente en GNU/Linux o macOS (solo probé esto en GNU/Linux).
Todos los archivos binarios se encuentran en el directorio bin
una vez compilados. Los binarios requieren dos archivos: la biblioteca eepp y la biblioteca SDL2. La biblioteca eepp estará ubicada en libs/{OS}/
. El script de compilación intentará vincular simbólicamente la biblioteca eepp a bin
; si eso falla, se debe copiar o vincular simbólicamente manualmente. En cuanto a la biblioteca SDL2, no se proporciona en el repositorio, por lo que para ejecutar las demostraciones deberá descargar la versión y la arquitectura correctas del sistema operativo de la biblioteca SDL2.
La biblioteca lleva varios años desarrollándose, sufrió muchos cambios desde sus inicios, estoy haciendo los cambios que creo necesarios para mejorarla, por lo que la API aún no es totalmente estable (pero está cerca de serlo). Está siendo utilizado en varias aplicaciones orientadas a campañas publicitarias desarrolladas principalmente para dispositivos Android y PC con Windows.
Personalmente, nunca tuve tiempo de usarlo para desarrollar un juego complejo con la biblioteca (varios proyectos frustrados), pero hice varios juegos orientados a la interfaz de usuario para clientes.
El foco actual del proyecto está en el módulo UI. Y seguiré trabajando poniendo mi foco en esto.
El plan es proporcionar un kit de herramientas de interfaz de usuario alternativo totalmente acelerado por hardware similar al kit de herramientas de Android pero más simple (fácil de usar) y también orientado a aplicaciones de escritorio.
Los módulos de audio y red se basaron en SFML con varias diferencias importantes mencionadas anteriormente.
Me gusta usar lo que está bien hecho y se adapta a mis necesidades, pero como tengo mis puntos de vista personales sobre cómo implementar algunas cosas, prefiero tomar el código para tener control total sobre él.
También muchas ideas fueron/son tomadas de otros proyectos. Algunos en los que puedo pensar: cocos2d-x , raylib , Android SDK , libGDX , Godot , XNA , LÖVE y muchos otros proyectos.
Si todo esto te parece interesante por alguna extraña razón, contáctame y déjame saber si puedo ayudarte a ingresar a la biblioteca y, si lo deseas, puedes contribuir en el futuro. Este proyecto necesita contribuyentes más que cualquier otra cosa.
El estado actual de la biblioteca es aceptable. En términos de características, debería estar en una posición similar a la de los motores de juegos 2D más utilizados que existen. Pero, por supuesto, carece del soporte y la comunidad que puedes obtener de Godot o cocos2d-x, por mencionar algunos.
La idea principal de esta biblioteca es centrarse en un mejor enfoque general para desarrollar aplicaciones y juegos fuertemente basados en UI que las otras opciones, con un código y una implementación más limpios.
La razón principal por la que desarrollé la biblioteca es por diversión y para aprender nuevas tecnologías. Me encanta pasar tiempo trabajando en la biblioteca, pero sé que probablemente no haya una razón real para desarrollar algo como esto con la inmensa cantidad de alternativas similares.
Respecto a la calidad del código: este proyecto comenzó hace mucho tiempo y sufrió muchas modificaciones con el tiempo. Una buena parte del código base todavía utiliza prácticas antiguas de C++ (por ejemplo: punteros sin formato, implementación propia de subprocesos, exclusión mutua, etc.). Algunas de estas cosas se pueden "modernizar", pero otras no tienen mucho sentido o revisarlas llevaría demasiado tiempo para justificar el esfuerzo. Estoy trabajando para "modernizar" algunas partes del código y el código nuevo normalmente tiende a parecer más moderno.
Siga mejorando el sistema de interfaz de usuario, agregando nuevos widgets y diseños y mejorando la compatibilidad con CSS.
Simplifique y mejore la compatibilidad con aspectos y temas de los widgets de la interfaz de usuario.
Mejorar/crear documentación para el módulo UI.
Agregue más ejemplos y algunas herramientas.
Agregue soporte para secuencias de comandos, pero primero me gustaría estabilizar la biblioteca, pero lo estoy logrando.
Agregue soporte para animaciones esqueléticas 2D (probablemente Spine2D, no debería ser mucho trabajo implementar).
Probablemente desestime el módulo de Mapas, ya que centraré mis esfuerzos en el sistema de interfaz de usuario.
Sean Barrett por stb_image y todas las bibliotecas stb.
Sam Latinga por Capa DirectMedia simple.
Jonathan Dummer por la biblioteca de imágenes OpenGL simple.
Laurent Gomila para SFML
Yuri Kobets para litehtml
Michael RP Ragazzon para RmlUI
rxi para lite
Andreas Kling para SerenityOS
Ryan C. Gordon para mojoAL
David Reid para dr_libs
Lion (Lieff) para minimp3 y más
Lewis Van Winkle para PlusCallback
Dieter Baron y Thomas Klausner por libzip
Jean-loup Gailly y Mark Adler para zlib
Milán Ikits y Marcelo Magallón para GLEW
Mikko Mononen para nanosvg
Scott Lembcke por Chipmunk2D
Christophe Riccio para glm
Rich Geldreich para imageresampler y jpeg-compressor
Arseny Kapoulkine para pugixml
Jason Perkins para la premake
Martín Lucas Golini (yo) y todos los colaboradores de SOIL2 y efsw
La comunidad de código abierto Xiph para libogg y libvorbis
La comunidad ARMmbed para mbed TLS
kcat para openal-soft
El proyecto FreeType
¡Y mucha más gente!
Licencia MIT