У меня есть целевой блок - c, который использует (для моего понимания) некоторые дополнительные вещи, и я хотел бы сделать это полностью в Swift. Вот оригинальный код, с которого я начал. (Я пытался преобразовать это с помощью Swiftify, но безуспешно) И эта статья SO, к сожалению, не помогла: Как переинтерпретировать в Swift?
- (void)updateBuffers
{
id<MTLBuffer> noiseBuffer = _noise[[self frameIndex]];
RandomSample* ptr = reinterpret_cast<RandomSample*>([noiseBuffer contents]);
for (NSUInteger i = 0; i < (NOISE_BLOCK_SIZE * NOISE_BLOCK_SIZE); ++i)
{
ptr->pixelSample.x = uniformFloatDistribution(randomGenerator);
ptr->pixelSample.y = uniformFloatDistribution(randomGenerator);
ptr->barycentricSample.x = uniformFloatDistribution(randomGenerator);
ptr->barycentricSample.y = uniformFloatDistribution(randomGenerator);
ptr->emitterBsdfSample.x = uniformFloatDistribution(randomGenerator);
ptr->emitterBsdfSample.y = uniformFloatDistribution(randomGenerator);
ptr->bsdfSample.x = uniformFloatDistribution(randomGenerator);
ptr->bsdfSample.y = uniformFloatDistribution(randomGenerator);
ptr->componentSample = uniformFloatDistribution(randomGenerator);
ptr->emitterSample = uniformFloatDistribution(randomGenerator);
ptr->rrSample = uniformFloatDistribution(randomGenerator);
++ptr;
}
[_noise[[self frameIndex]] didModifyRange:NSMakeRange(0, [noiseBuffer length])];
}
Я предполагаю, цель - c код заполняет содержимое буфера (используя for l oop) содержимым из Struct (RandomSample). NOISE_BLOCK_SIZE в этом случае 64
И это то, что я до сих пор имею:
func updateBuffers() {
let noiseBuffer = noise[Int(frameIndex())] // MTLBuffer
var randomStruct = RandomSample()
// Here I should have this ptr (pointer) that like on objective-c
for i in 0..<(NOISE_BLOCK_SIZE * NOISE_BLOCK_SIZE) {
randomStruct.pixelSample.x = Float.random(in: 0..<1)
randomStruct.pixelSample.y = Float.random(in: 0..<1)
randomStruct.barycentricSample.x = Float.random(in: 0..<1)
randomStruct.barycentricSample.y = Float.random(in: 0..<1)
randomStruct.emitterBsdfSample.x = Float.random(in: 0..<1)
randomStruct.emitterBsdfSample.y = Float.random(in: 0..<1)
randomStruct.bsdfSample.x = Float.random(in: 0..<1)
randomStruct.bsdfSample.y = Float.random(in: 0..<1)
randomStruct.componentSample = Float.random(in: 0..<1)
randomStruct.emitterSample = Float.random(in: 0..<1)
randomStruct.rrSample = Float.random(in: 0..<1)
}
// etc... etc...
}
Это структура RandomSample, на которую я хочу ссылаться, определенная в файле .h (которая является моей Заголовок моста)
struct RandomSample
{
simd_float2 pixelSample;
simd_float2 barycentricSample;
simd_float2 bsdfSample;
simd_float2 emitterBsdfSample;
float componentSample;
float emitterSample;
float rrSample;
};
Вместо uniformFloatDistribution
, который я использую (в коде Swift) Float.random(in: 0..<1)
, который должен производить более или менее то же самое.