Я создаю тестовое приложение, используя SceneKit SCNParticleSystem
. Он имеет обратный вызов, который позволяет изменять свойства частиц на каждом фрейме. Подпись этого обратного вызова
typealias SCNParticleModifierBlock = (UnsafeMutablePointer<UnsafeMutablePointer<Void>>, UnsafeMutablePointer<Int>, Int, Int, Float) -> Void
Ссылка на сайт разработчика Apple - SCNParticleSystem_Class
Я не знаю, как получить доступ и изменить эту ссылку от Swift. Если бы это было C, это было бы **
, что я мог бы разыменовать массив.
После некоторого futzing я дошел до этого:
.....
particleSystem?.addModifierForProperties([SCNParticlePropertySize], atStage: SCNParticleModifierStage.PostDynamics, withBlock: doit2)
}
struct Foos {
var size:float_t
}
func doit2(data:UnsafeMutablePointer<UnsafeMutablePointer<Void>>, dataStride: UnsafeMutablePointer<Int>, start:Int, end:Int, deltaTime:Float) -> Void {
let myptr = UnsafeMutablePointer<UnsafeMutablePointer<Foos>>(data)
print("indexes",start,end)
for i in 0 ..< end {
print(i,myptr[i].memory.size)
}
}¸
Это работает для первой частицы, но падает во второй. В первый раз, когда функция вызывается, есть 0 частиц, поэтому она пропускает цикл. Во второй раз есть три частицы, поэтому он пытается распечатать их. Первое значение размера - 0,9, которое швов разумно. Второе значение размера явно фиктивное, а затем оно падает, и я попадаю в отладчик.
indexes 0 0
indexes 0 3
0 0.929816
1 1.51296e-39
(lldb)
Как я могу сказать, никто в Интернете не использует эту функцию. Единственными ссылками, которые я нахожу, являются документы Apple, которые предоставляют для него только примеры ObjC, а не Swift.
Помогите мне!