|
|
@ -327,7 +327,7 @@ __kernel void raycaster(
|
|
|
|
|
|
|
|
|
|
|
|
int jump_power = (int)log2((float)vox_dim) - traversal_state.scale;
|
|
|
|
int jump_power = (int)log2((float)vox_dim) - traversal_state.scale;
|
|
|
|
int prev_jump_power = jump_power;
|
|
|
|
int prev_jump_power = jump_power;
|
|
|
|
|
|
|
|
int3 last_oct_pos = (0);
|
|
|
|
// TODO: DEBUG
|
|
|
|
// TODO: DEBUG
|
|
|
|
int failsafe = 0;
|
|
|
|
int failsafe = 0;
|
|
|
|
|
|
|
|
|
|
|
@ -335,7 +335,6 @@ __kernel void raycaster(
|
|
|
|
// Andrew Woo's raycasting algo
|
|
|
|
// Andrew Woo's raycasting algo
|
|
|
|
while (distance_traveled < max_distance && bounce_count < 2) {
|
|
|
|
while (distance_traveled < max_distance && bounce_count < 2) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If we hit a voxel
|
|
|
|
// If we hit a voxel
|
|
|
|
if (setting(OCTENABLED) == 0 && voxel.x < (*map_dim).x/2 && voxel.y < (*map_dim).x/2 && voxel.z < (*map_dim).x/2){
|
|
|
|
if (setting(OCTENABLED) == 0 && voxel.x < (*map_dim).x/2 && voxel.y < (*map_dim).x/2 && voxel.z < (*map_dim).x/2){
|
|
|
|
//if (setting(OCTENABLED) == 0 && voxel.x < (*map_dim).x && voxel.y < (*map_dim).x && voxel.z < (*map_dim).x){
|
|
|
|
//if (setting(OCTENABLED) == 0 && voxel.x < (*map_dim).x && voxel.y < (*map_dim).x && voxel.z < (*map_dim).x){
|
|
|
@ -353,18 +352,9 @@ __kernel void raycaster(
|
|
|
|
//
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
// Fancy no branch version of the logic step
|
|
|
|
// Fancy no branch version of the logic step
|
|
|
|
face_mask = intersection_t.xyz <= min(intersection_t.yzx, intersection_t.zxy);
|
|
|
|
face_mask = 1 + (intersection_t.xyz <= min(intersection_t.yzx, intersection_t.zxy));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
intersection_t +=
|
|
|
|
|
|
|
|
delta_t * jump_power * fabs(convert_float3(face_mask.xyz));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int3 other_faces = face_mask.xyz ? 0 : 1;
|
|
|
|
|
|
|
|
intersection_t +=
|
|
|
|
|
|
|
|
delta_t * jump_power * fabs(convert_float3(other_faces.xyz))
|
|
|
|
|
|
|
|
- delta_t * prev_jump_power * fabs(convert_float3(other_faces.xyz));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
prev_jump_power = jump_power;
|
|
|
|
|
|
|
|
|
|
|
|
voxel.xyz += voxel_step.xyz * jump_power * face_mask.xyz;
|
|
|
|
voxel.xyz += voxel_step.xyz * jump_power * face_mask.xyz;
|
|
|
|
|
|
|
|
|
|
|
@ -376,6 +366,8 @@ __kernel void raycaster(
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uchar prev_val = traversal_state.idx_stack[traversal_state.scale];
|
|
|
|
uchar prev_val = traversal_state.idx_stack[traversal_state.scale];
|
|
|
|
uchar this_face_mask = 0;
|
|
|
|
uchar this_face_mask = 0;
|
|
|
|
// Check the voxel face that we traversed
|
|
|
|
// Check the voxel face that we traversed
|
|
|
@ -519,6 +511,18 @@ __kernel void raycaster(
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
intersection_t += delta_t * jump_power * fabs(convert_float3(face_mask.xyz));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//int3 other_faces = face_mask == 1 ? 1 : -1;
|
|
|
|
|
|
|
|
int3 other_faces = select((int3)(1,1,1), (int3)(0,0,0), (int3)(face_mask == 1));
|
|
|
|
|
|
|
|
//int3 added_diff = last_oct_pos + prev_jump_power - traversal_state.oct_pos;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint3 multiplier = abs(traversal_state.oct_pos - last_oct_pos) / prev_jump_power ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
last_oct_pos = traversal_state.oct_pos;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
intersection_t -= delta_t * prev_jump_power * convert_float3(other_faces.xyz);
|
|
|
|
|
|
|
|
intersection_t += delta_t * convert_float3(multiplier) * jump_power * fabs(convert_float3(other_faces.xyz));
|
|
|
|
// // Test for out of bounds contions, add fog
|
|
|
|
// // Test for out of bounds contions, add fog
|
|
|
|
// if (traversal_state.scale == 1){
|
|
|
|
// if (traversal_state.scale == 1){
|
|
|
|
// //voxel.xyz -= voxel_step.xyz * face_mask.xyz;
|
|
|
|
// //voxel.xyz -= voxel_step.xyz * face_mask.xyz;
|
|
|
|