i am making a compute shader to use with bevy 0.12 so im using wgsl. i want to index into an array like this:
fn is_boxed_in(x: u32, y: u32, z: u32, voxels: array<ShaderVoxel, 4096>) -> bool {
if check_for_voxel(voxels[voxel_to_1d(min(CHUNK_SIZE - 1u, x + 1u), y, z)])
&& check_for_voxel(voxels[voxel_to_1d(max(0u, x - 1u), y, z)])
&& check_for_voxel(voxels[voxel_to_1d(x, min(CHUNK_SIZE - 1u, y + 1u), z)])
&& check_for_voxel(voxels[voxel_to_1d(x, max(0u, y - 1u), z)])
&& check_for_voxel(voxels[voxel_to_1d(x, y, min(CHUNK_SIZE - 1u, z + 1u))])
&& check_for_voxel(voxels[voxel_to_1d(x, y, max(0u, z - 1u))])
{
return true;
}
return false;
}
but im getting this error:
Function [6] 'is_boxed_in' is invalid.
WithSpan {
inner: Function {
handle: [6],
name: "is_boxed_in",
source: Expression {
handle: [10],
source: IndexMustBeConstant(
[4],
),
},
},
spans: [
(
Span {
start: 2094,
end: 2700,
},
"naga::Function [6]",
),
(
Span {
start: 2201,
end: 2256,
},
"naga::Expression [10]",
),
],
}
is it possible and if so how do i index into this array? this is where i am calling the function:
@compute @workgroup_size(16, 16, 1)
fn init(@builtin(global_invocation_id) global_id: vec3<u32>){
let index = voxel_to_1d(global_id.x, global_id.y, global_id.z);
var iter = 0u;
while iter < arrayLength(&chunks.chunks) {
var chunk = chunks.chunks[iter];
var voxels = chunk.voxels;
for (var i = 0; i < 4096; i += 1){
var voxel = voxels[i];
if voxel.id != 0u && !is_boxed_in(voxel_to_3d(i).x, voxel_to_3d(i).y, voxel_to_3d(i).z, voxels){
//gen normal
}
}
iter += 1u;
}
}
any help would be super appreciated :)