Sto costruendo un'app di prova usando il SCNParticleSystem
di SceneKit. Ha un callback che ti permette di modificare le proprietà delle particelle su ciascun frame. La firma di questo callback èCome lavoro con un UnsafeMutablePointer <UnsafeMutablePointer <Void>> riferimento da Swift?
typealias SCNParticleModifierBlock = (UnsafeMutablePointer<UnsafeMutablePointer<Void>>, UnsafeMutablePointer<Int>, Int, Int, Float) -> Void
riferimento dal sito degli sviluppatori di Apple - SCNParticleSystem_Class
Non so come accedere e modificare questo riferimento da Swift. Se questo fosse C sarebbe un **
che potrei dereferenziare come un array.
Dopo qualche futzing ho ottenuto fino a questo:
.....
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)
}
}¸
Questo funziona per la prima particella, ma si blocca sul secondo. La prima volta che viene chiamata la funzione ci sono 0 particelle, quindi salta il ciclo. La seconda volta ci sono tre particelle, quindi prova a stamparle. Il primo valore di dimensione è 0,9 che sembra ragionevole. Il secondo valore di dimensione è chiaramente fasullo, quindi si blocca e faccio cadere il debugger.
indexes 0 0
indexes 0 3
0 0.929816
1 1.51296e-39
(lldb)
Per quanto posso dire nessuno su Internet utilizza questa funzione. Gli unici riferimenti che trovo sono i documenti di Apple che forniscono solo esempi ObjC per questo, non Swift.
Aiutatemi!
Chiamami pazzo, ma dal momento che questo è un puntatore a un puntatore, non dovresti prendere il suo 'memory.memory' per raggiungere la cosa reale? – matt
Buon punto. Passare a 'myptr.memory [i] .size' mi avvicina, ma si blocca ancora ogni tanto. Se imposto le dimensioni, posso vedere alcune ma non tutte le particelle stanno cambiando. E quelli che cambiano si bloccano, smettono di muoversi. Questo suggerisce che sto sbavando un po 'di memoria. E non sono ancora sicuro di cosa sia il dataStride. I documenti dicono che dovrebbe essere: "array che identifica l'offset, in byte, del valore di ogni proprietà nella striscia di dati per ogni particella.L'ordine di offset in questo array corrisponde all'ordine della matrice di proprietà nella chiamata "addModifierForProperties" –
E dovrei menzionare, nel codice di esempio ObjC viene utilizzato dataStride, ma non riesco a vedere come lo utilizzerei in Swift versione –