Finally found the root of that off by one error. Changed up the readme.

This commit is contained in:
MitchellHansen
2017-01-16 02:31:51 -08:00
parent cc7a4a2efb
commit abec38e7c7
8 changed files with 91 additions and 32 deletions

View File

@@ -76,8 +76,8 @@ bool cast_light_intersection_ray(
voxel.xyz += voxel_step.xyz * face_mask.xyz;
// If the ray went out of bounds
int3 overshoot = voxel <= *map_dim;
int3 undershoot = voxel > 0;
int3 overshoot = voxel < *map_dim;
int3 undershoot = voxel >= 0;
if (overshoot.x == 0 || overshoot.y == 0 || overshoot.z == 0 || undershoot.x == 0 || undershoot.y == 0) {
return false;
@@ -95,6 +95,9 @@ bool cast_light_intersection_ray(
return false;
}
// 0 1 2 3 4 5 6 7 8 9
// {r, g, b, i, x, y, z, x', y', z'}
float4 view_light(float4 in_color, float3 light, float3 view, int3 mask) {
float diffuse = max(dot(normalize(convert_float3(mask)), normalize(light)), 0.0f);
@@ -276,6 +279,7 @@ __kernel void raycaster(
float4 fog_color = { 0.73, 0.81, 0.89, 0.8 };
float4 voxel_color = (float4)(0.50, 0.0, 0.50, 0.1);
float4 overshoot_color = { 0.25, 0.48, 0.52, 0.8 };
float4 overshoot_color_2 = { 0.25, 0.1, 0.52, 0.8 };
// Andrew Woo's raycasting algo
@@ -287,15 +291,15 @@ __kernel void raycaster(
voxel.xyz += voxel_step.xyz * face_mask.xyz;
// If the ray went out of bounds
int3 overshoot = voxel <= *map_dim;
int3 undershoot = voxel > 0;
int3 overshoot = voxel < *map_dim;
int3 undershoot = voxel >= 0;
if (overshoot.x == 0 || overshoot.y == 0 || overshoot.z == 0 || undershoot.x == 0 || undershoot.y == 0){
write_imagef(image, pixel, white_light(mix(fog_color, overshoot_color, 1.0 - max(dist / 700.0f, (float)0)), (float3)(lights[7], lights[8], lights[9]), face_mask));
return;
}
if (undershoot.z == 0) {
write_imagef(image, pixel, white_light(mix(fog_color, overshoot_color, 1.0 - max(dist / 700.0f, (float)0)), (float3)(lights[7], lights[8], lights[9]), face_mask));
write_imagef(image, pixel, white_light(mix(fog_color, overshoot_color_2, 1.0 - max(dist / 700.0f, (float)0)), (float3)(lights[7], lights[8], lights[9]), face_mask));
return;
}
@@ -313,29 +317,41 @@ __kernel void raycaster(
else if (voxel_data == 5) {
voxel_color = (float4)(0.25, 0.52, 0.30, 0.1);
}
else if (voxel_data == 1) {
voxel_color = (float4)(0.929, 0.957, 0.027, 0.7);
}
// set to which face
float3 face_position = convert_float3(face_mask * voxel_step);
// set the xy for that face
face_position += convert_float3(face_mask == (int3)(0,0,0)) * ((intersection_t) / delta_t);
//face_position += convert_float3(face_mask == (int3)(0,0,0)) * (rand(&seed) % 10) / 50.0;
if (cast_light_intersection_ray(
map,
map_dim,
(float3)(lights[4], lights[5], lights[6]) - (convert_float3(voxel)),
(convert_float3(voxel) - convert_float3(face_mask * voxel_step)),
lights,
(convert_float3(voxel) - convert_float3(face_mask * voxel_step)),//face_position),//
lights,
light_count
)) {
)) {
write_imagef(image, pixel, voxel_color);
//write_imagef(image, pixel, voxel_color);
return;
}
// 0 1 2 3 4 5 6 7 8 9
// {r, g, b, i, x, y, z, x', y', z'}
write_imagef(
image,
pixel,
view_light(
voxel_color,
(convert_float3(voxel) + offset) - (float3)(lights[4], lights[5], lights[6]),
(convert_float3(voxel) + offset) - (*cam_pos),
(convert_float3(voxel) ) - (float3)(lights[4], lights[5], lights[6]),
(convert_float3(voxel) ) - (*cam_pos),
face_mask * voxel_step
)
);