我有一个正在传递数据的 block ,我想将其转换为 float 组的数组 - 例如[[0.1,0.2,0.3,1.0],[0.3,0.4,0.5,1.0],[0.5,0.6,0.7,1.0]]。这些数据以data:UnsafeMutablePointer<UnsafeMutableRawPointer>
的形式传递给我。 (内部数组为RGBA值)
fwiw -- block 参数来自SCNParticleEventBlock
如何将数据取消引用到 [[Float]] 中?一旦我有了包含内部数组的数组,我就可以通过以下方式引用内部数组 (colorArray) 数据:
let rgba: UnsafeMutablePointer<Float> = UnsafeMutablePointer(mutating: colorArray)
let count = 4
for i in 0..<count {
print((rgba+i).pointee)
}
fwiw -- 这是 Apple 用于引用数据的 Objective-C 代码示例 ( from SCNParticleSystem handle(_:forProperties:handler:) )
[system handleEvent:SCNParticleEventBirth
forProperties:@[SCNParticlePropertyColor]
withBlock:^(void **data, size_t *dataStride, uint32_t *indices , NSInteger count) {
for (NSInteger i = 0; i < count; ++i) {
float *color = (float *)((char *)data[0] + dataStride[0] * i);
if (rand() & 0x1) { // Switch the green and red color components.
color[0] = color[1];
color[1] = 0;
}
}
}];
最佳答案
您实际上可以为类型化的 UnsafeMutablePointer
添加下标,而无需创建 UnsafeMutableBufferPointer
,如下所示:
let colorsPointer:UnsafeMutableRawPointer = data[0] + dataStride[0] * i
let rgbaBuffer = colorsPointer.bindMemory(to: Float.self, capacity: dataStride[0])
if(arc4random_uniform(2) == 1) {
rgbaBuffer[0] = rgbaBuffer[1]
rgbaBuffer[1] = 0
}
您的解决方案能够发挥作用吗?看来在 SCNParticleEventBlock
block 中只能使用少数 SCNParticleProperties
。
关于arrays - 取消引用 UnsafeMutablePointer<UnsafeMutableRawPointer>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44476834/