我正在使用SceneKit的SCNParticleSystem
构建一个测试应用程序。它有一个回调函数,可以让您在每一帧上修改粒子的属性。这个回调函数的签名是:
typealias SCNParticleModifierBlock = (UnsafeMutablePointer<UnsafeMutablePointer<Void>>, UnsafeMutablePointer<Int>, Int, Int, Float) -> Void
参考自苹果开发者网站-SCNParticleSystem_Class
我不知道如何从Swift中访问和修改此引用。如果这是C语言,那么我可以像访问数组一样解引用它。
经过一些尝试,我已经做到了这一点:
.....
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.9,似乎合理。 第二个大小值显然是虚假的,然后它崩溃了,我进入了调试器。
indexes 0 0
indexes 0 3
0 0.929816
1 1.51296e-39
(lldb)
据我所知,互联网上没有人使用这个函数。 我找到的唯一参考资料是苹果的文档,其中仅提供了该函数的ObjC示例,而非Swift。
帮帮我!
memory.memory
来到达真正的东西吗? - mattmyptr.memory[i].size
让我更接近了,但它仍然会偶尔崩溃。如果我设置大小,那么我可以看到一些但不是所有的粒子都在改变。而且那些改变的粒子会停滞不前,停止移动。这表明我正在破坏某些内存。而且我仍然不确定数据步幅是用来做什么的。文档说它应该是:“标识每个粒子数据条带中每个属性值的偏移量(以字节为单位)的数组。此数组中的偏移量顺序对应于addModifierForProperties调用中属性数组的顺序”。 - Josh Marinacci