Para continuar con la excelente respuesta de MBuhot, solo hice esto para obtener un "hola mundo" de Swift OpenGL ejecutándose en un par de sistemas Linux y puedo agregar un poco más de detalle.
En mi caso, necesitaba las funciones OpenGL y GLUT, así que primero creé un módulo de sistema COpenGL. El código fuente de este módulo se puede encontrar en GitHub, pero básicamente es un directorio con dos archivos:un Package.swift vacío y el siguiente module.modulemap:
module COpenGL [system] {
header "/usr/include/GL/gl.h"
link "GL"
export *
}
Tenga en cuenta el GL mayúscula en las opciones de encabezado y enlace, que necesitaba para que coincida con los encabezados y las bibliotecas de Mesa.
Para las funciones GLUT, creé un módulo CFreeGLUT similar (nuevamente, en GitHub) con el siguiente módulo.modulemap:
module CFreeGLUT [system] {
header "/usr/include/GL/freeglut.h"
link "glut"
export *
}
Para la aplicación, si desea utilizar Swift Package Manager, deberá crear un Package.swift en el directorio principal que se ve así:
import PackageDescription
let package = Package(
dependencies: [
.package(url: "https://github.com/BradLarson/COpenGL.git", from: "1.0.0"),
.package(url: "https://github.com/BradLarson/CFreeGLUT.git", from: "1.0.0")
]
)
Lo anterior se extrae de mis versiones de GitHub de los módulos del sistema, pero puede editar las rutas para que apunten a copias locales, si lo desea.
Utilicé la aplicación "hola mundo" del Libro Rojo como base, que se parece a lo siguiente cuando se convierte a Swift:
import COpenGL
import CFreeGLUT
func renderFunction() {
glClearColor(0.0, 0.0, 0.0, 0.0)
glClear(UInt32(GL_COLOR_BUFFER_BIT))
glColor3f(1.0, 0.0, 0.0)
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0)
glBegin(UInt32(GL_POLYGON))
glVertex2f(-0.5, -0.5)
glVertex2f(-0.5, 0.5)
glVertex2f(0.5, 0.5)
glVertex2f(0.5, -0.5)
glEnd()
glFlush()
}
var localArgc = CommandLine.argc
glutInit(&localArgc, CommandLine.unsafeArgv)
glutInitDisplayMode(UInt32(GLUT_SINGLE))
glutInitWindowSize(500,500)
glutInitWindowPosition(100,100)
glutCreateWindow("OpenGL - First window demo")
glutDisplayFunc(renderFunction)
glutMainLoop()
Coloque eso en un main.swift
dentro del subdirectorio Fuentes. Ejecute swift build
y Swift Package Manager saldrá, descargará los módulos del sistema, compilará la aplicación y vinculará los módulos contra ella.
Si no desea utilizar Swift Package Manager, aún puede utilizar manualmente estos módulos del sistema desde la línea de comandos. Para hacerlo, descárguelos en un directorio local y haga referencia explícita a ellos al compilar:
swiftc -I ./COpenGL -I ./CFreeGLUT main.swift
Se leerán los mapas del módulo y podrá acceder a OpenGL y las funciones GLUT desde su aplicación Swift en Linux.
Utilice un módulo del sistema para importar el archivo de encabezado de OpenGL:https://github.com/apple/swift-package-manager/blob/master/Documentation/SystemModules.md
Suponiendo que tiene un diseño de directorio como:
COpenGL/
Package.swift
module.modulemap
.git/
YourApp/
Package.swift
main.swift
.git/
el archivo COpenGL/module.modulemap se parecerá a:
module COpenGL [system] {
header "/usr/include/gl/gl.h"
link "gl"
export *
}
Esto debe crearse en un repositorio git separado, con una etiqueta de versión:
touch Package.swift
git init
git add .
git commit -m "Initial Commit"
git tag 1.0.0
Luego declárelo como una dependencia en el archivo YourApp/Package.swift
import PackageDescription
let package = Package(
dependencies: [
.Package(url: "../COpenGL", majorVersion: 1)
]
)
Luego, en su archivo main.swift puede importarlo:
import COpenGL
// use opengl calls here...