Untuk mengikuti jawaban MBuhot yang luar biasa, saya hanya melakukan ini untuk menjalankan "hello world" Swift OpenGL pada beberapa sistem Linux dan saya dapat menambahkan sedikit lebih banyak detail.
Dalam kasus saya, saya memerlukan fungsi OpenGL dan GLUT, jadi pertama-tama saya membuat modul sistem COpenGL. Sumber modul ini dapat ditemukan di GitHub, tetapi pada dasarnya ini adalah direktori dengan dua file:Package.swift kosong, dan module.modulemap berikut:
module COpenGL [system] {
header "/usr/include/GL/gl.h"
link "GL"
export *
}
Perhatikan GL kapital di opsi tajuk dan tautan, yang saya perlukan untuk mencocokkan tajuk dan pustaka Mesa.
Untuk fungsi GLUT, saya membuat modul CFreeGLUT serupa (sekali lagi, di GitHub) dengan module.modulemap berikut:
module CFreeGLUT [system] {
header "/usr/include/GL/freeglut.h"
link "glut"
export *
}
Untuk aplikasinya, jika Anda ingin menggunakan Swift Package Manager, Anda harus membuat Package.swift di direktori utama yang terlihat seperti ini:
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")
]
)
Hal di atas diambil dari modul sistem versi GitHub saya, tetapi Anda dapat mengedit jalur agar mengarah ke salinan lokal, jika Anda mau.
Saya menggunakan aplikasi "hello world" Buku Merah sebagai basis saya, yang terlihat seperti berikut saat dikonversi ke 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()
Tempatkan itu ke dalam main.swift
file dalam subdirektori Sumber. Jalankan swift build
dan Swift Package Manager akan keluar, mengunduh modul sistem, membuat aplikasi, dan menautkan modul ke dalamnya.
Jika Anda tidak ingin menggunakan Swift Package Manager, Anda masih dapat menggunakan modul sistem ini secara manual dari baris perintah. Untuk melakukannya, unduh ke direktori lokal dan rujuk secara eksplisit saat mengompilasi:
swiftc -I ./COpenGL -I ./CFreeGLUT main.swift
Peta modul akan dibaca dan Anda akan dapat mengakses OpenGL dan fungsi GLUT dari dalam aplikasi Swift Anda di Linux.
Gunakan Modul Sistem untuk mengimpor file header OpenGL:https://github.com/Apple/swift-package-manager/blob/master/Documentation/SystemModules.md
Dengan asumsi Anda memiliki tata letak direktori seperti:
COpenGL/
Package.swift
module.modulemap
.git/
YourApp/
Package.swift
main.swift
.git/
file COpenGL/module.modulemap akan terlihat seperti:
module COpenGL [system] {
header "/usr/include/gl/gl.h"
link "gl"
export *
}
Ini harus dibuat dalam repo git terpisah, dengan tag versi:
touch Package.swift
git init
git add .
git commit -m "Initial Commit"
git tag 1.0.0
Kemudian nyatakan sebagai dependensi dalam file YourApp/Package.swift
import PackageDescription
let package = Package(
dependencies: [
.Package(url: "../COpenGL", majorVersion: 1)
]
)
Kemudian di file main.swift Anda, Anda dapat mengimpornya:
import COpenGL
// use opengl calls here...