PGScreenViewは, 自分で用意した画像を自由に読み込んで利用することができます.

実行環境

  • Xcode 15.2
  • LilySwift 5.1.23

サンプルコードとデータ

上記のzipファイルにはswiftpmと一緒にdeformed-lily.pngという画像が含まれています. これをつかって画像の追加方法を説明します.

  • サンプルのContentView.swiftをご覧ください. 今回のポイントは PlaneStorage になります.

コード1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import SwiftUI
import LilySwiftForPlayground
import LilySwiftAlias

class Playground
{
    // Metalを使う準備
    lazy var device = MTLCreateSystemDefaultDevice()!
    
    // Playground2Dのデータを用意する
    lazy var planeStorage:PlaneStorage = .playgroundDefault( 
        device:device
    )
    
    // Lily Playgroundのデザイン関数
    func design( screen:PGScreen ) {
        PGPicture( "lily" )
        .scale( square:256 )
    }
    
    // Lily Playgroundのアップデート関数
    func update( update:PGScreen ) {
    
    }
}

struct ContentView: View
{
    let playground:Playground   // Lily Playgroundのデータ
    @State var scene:PGScene    // Lily Playgroundのシーン
    
    init() {
        // Lily Playgroundのデータとシーンをつくる
        playground = Playground()
        // シーンにdesign関数とupdate関数を渡す
        scene = .init(
            planeStorage:playground.planeStorage,
            design:playground.design,
            update:playground.update
        )
    }
    
    var body: some View {
        VStack {
            // Lily Playgroundを表示するビュー.シーンを渡す
            PGScreenView(
                device:playground.device,
                scene:$scene
            )
        }
    }
}

Xcodeでアセットを追加する

画像名はAssets.xcassetsに含まれているアセット名と一致しています.

pg2d-add-textures-1.png

ここにdeformed-lily.pngをドラッグ&ドロップして追加します.

pg2d-add-textures-2.png

Playground Appでアセットを追加する

  • メニュー「ファイル」>「ファイルの追加」でdeformed-lily.pngを読み込みます.
  • ファイルリストに「アセット」という項目が加わり, deformd-lilyが増えます.

新しいアセットをプログラムで利用する

アセットが追加されると読み込みが可能になりますので, コード側に追加します.

  • planeStorageを作成する際, .playgroundDefaultの中に appendTextures を加えます.

    • appendTexturesは追加する画像アセット名です. “deformed-lily” を追加します.
    • 補足: .playgroundDefaultで作成したPlaneStorageは, もともと"lily"や"mask-smoke"などを持っています.
  • PGPictureの文字列を"deformed-lily"に変更します.

コード2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import SwiftUI
import LilySwiftForPlayground
import LilySwiftAlias

class Playground
{
    // Metalを使う準備
    lazy var device = MTLCreateSystemDefaultDevice()!
    
    // Playground2Dのデータを用意する
    lazy var planeStorage:PlaneStorage = .playgroundDefault(
		device:device,
        appendTextures:[ "deformed-lily" ]
    )
    
    // Lily Playgroundのデザイン関数
    func design( screen:PGScreen ) {
        PGPicture( "deformed-lily" )
        .scale( square:256 )
    }
    
    // Lily Playgroundのアップデート関数
    func update( update:PGScreen ) {
    
    }
}

struct ContentView: View
{
    let playground:Playground   // Lily Playgroundのデータ
    @State var scene:PGScene    // Lily Playgroundのシーン
    
    init() {
        // Lily Playgroundのデータとシーンをつくる
        playground = Playground()
        // シーンにdesign関数とupdate関数を渡す
        scene = .init(
            planeStorage:playground.planeStorage,
            design:playground.design,
            update:playground.update
        )
    }
    
    var body: some View {
        VStack {
            // Lily Playgroundを表示するビュー.シーンを渡す
            PGScreenView(
                device:playground.device,
                scene:$scene
            )
        }
    }
}

結果

追加した画像をPGScreenのオブジェクトとして読み込むことができました.

pg2d-add-textures-3.png

画像読み込みのしくみ (テクスチャアトラス)

Lily Playgroundで画像を使う時, 画像データを1枚の大きなテクスチャに並べて読み込みます. この仕組みを テクスチャアトラス といいます. テクスチャは最大で16,384x16,384ピクセルまで対応していますが, 読み込む画像が溢れると書き込みに失敗するようになります. 巨大な画像は読み込む前に適切なサイズに縮小してアセットに追加することも大切です. また画像が大きいほどテクスチャアトラスの作成にも時間がかかりますので, 縮小の工夫をしてみてください.