Swift: приведение int-кортежей к пользовательскому типу, содержащему векторы с плавающей точкой - PullRequest
0 голосов
/ 27 июня 2019

Оба оригинальных ответа на этот вопрос являются удовлетворительными, но приходят к решению немного по-разному. Я выбрал тот, который мне показался более простым для реализации

Я пытаюсь перевести некоторые ObjectiveC, из этого документа / примера о металле Apple , и металлический код в swift, но у меня возникли проблемы с этим битом:

вот используемая мной typedef, которая необходима для того, чтобы металлические шейдеры могли контролировать мои данные вершин (векторы с плавающей точкой из simd.h значимы):

#include <simd/simd.h>

typedef struct
{
  vector_float2 position;
  vector_float4 color;
} AAPLVertex;

В цели C вы можете просто сделать это, чтобы привести некоторые данные к этому типу:

static const AAPLVertex triangleVertices[] =
{
    // 2D positions,    RGBA colors
    { {  250,  -250 }, { 1, 1, 1, 1 } },
    { { -250,  -250 }, { 1, 1, 0, 1 } },
    { {    0,   250 }, { 0, 1, 1, 1 } },
};

Но как вы это делаете в Swift? Я пытался это:

  private let triangleVertices = [
    ( (250,  -250), (1, 0, 1, 1) ),
    ( (-250,  -250), (1, 1, 0, 1) ),
    ( (0,  250), (0, 1, 1, 1) )
  ] as? [AAPLVertex]

но xcode говорит мне:

Cast from '[((Int, Int), (Int, Int, Int, Int))]' to unrelated type '[AAPLVertex]' always fails

и мое приложение падает при загрузке.

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Вот как я бы это реализовал:

import simd

struct Vertex {
    var position: SIMD2<Float>
    var color: SIMD4<Float>
}

extension Vertex {
    init(x: Float, y: Float, r: Float, g: Float, b: Float, a: Float = 1.0) {
        self.init(position: SIMD2(x, y), color: SIMD4(r, g, b, a))
    }
}

let triangleVertices = [
    Vertex(x: +250, y: -250, r: 1, g: 0, b: 1),
    Vertex(x: -250, y: -250, r: 1, g: 1, b: 0),
    Vertex(x:    0, y: -250, r: 0, g: 1, b: 1),
]

Однако я не уверен, в какой степени собственные SIMD-типы Swift совместимы с Metal по сравнению с Objective C , хотя я подозреваю, что они совместимы.

1 голос
/ 27 июня 2019

Попробуй так:

import simd

struct AAPLVertex {
    let position: float2
    let color: float4
}

let  triangleVertices: [AAPLVertex] = [
     // 2D positions,    RGBA colors
    .init(position: .init( 250, -250), color: .init(1, 0, 1, 1)),
    .init(position: .init(-250, -250), color: .init(1, 1, 0, 1)),
    .init(position: .init(   0, -250), color: .init(0, 1, 1, 1))]
...