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

master
MitchellHansen 8 years ago
parent cc7a4a2efb
commit abec38e7c7

@ -6,6 +6,5 @@ Efficient Sparse Voxel Octrees, Laine et al.
A fast voxel traversal algorithm for ray tracing, Woo et al. A fast voxel traversal algorithm for ray tracing, Woo et al.
![alt tag](https://github.com/MitchellHansen/voxel-raycaster/blob/master/assets/video.gif) ![alt tag](https://github.com/MitchellHansen/voxel-raycaster/blob/master/assets/screenshot1.PNG)
![alt tag](https://github.com/MitchellHansen/voxel-raycaster/blob/master/assets/screenshot.PNG) ![alt tag](https://github.com/MitchellHansen/voxel-raycaster/blob/master/assets/screenshot.PNG)

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 MiB

@ -13,15 +13,6 @@
const double PI = 3.141592653589793238463; const double PI = 3.141592653589793238463;
const float PI_F = 3.14159265358979f; const float PI_F = 3.14159265358979f;
struct Light {
sf::Vector4f rgbi;
// I believe that Vector3's get padded to Vector4's. Give them a non-garbage value
sf::Vector3f position;
sf::Vector3f direction_cartesian;
};
struct fps_counter { struct fps_counter {
public: public:
fps_counter(){ fps_counter(){
@ -273,4 +264,27 @@ inline std::vector<float> sfml_get_float_input(sf::RenderWindow *window) {
return ret; return ret;
} }
struct Light {
sf::Vector4f rgbi;
// I believe that Vector3's get padded to Vector4's. Give them a non-garbage value
sf::Vector3f position;
sf::Vector3f direction_cartesian;
void look_at_center() {
direction_cartesian = SphereToCart(CartToNormalizedSphere(sf::Vector3f(256, 256, 256) - position));
};
void orbit_around_center(double time) {
position = sf::Vector3f(
position.x * cos(time/1000) - position.y * sin(time/1000),
position.x * sin(time/1000) + position.y * cos(time/1000),
position.z
);
look_at_center();
};
};

@ -76,8 +76,8 @@ bool cast_light_intersection_ray(
voxel.xyz += voxel_step.xyz * face_mask.xyz; voxel.xyz += voxel_step.xyz * face_mask.xyz;
// If the ray went out of bounds // If the ray went out of bounds
int3 overshoot = voxel <= *map_dim; int3 overshoot = voxel < *map_dim;
int3 undershoot = voxel > 0; int3 undershoot = voxel >= 0;
if (overshoot.x == 0 || overshoot.y == 0 || overshoot.z == 0 || undershoot.x == 0 || undershoot.y == 0) { if (overshoot.x == 0 || overshoot.y == 0 || overshoot.z == 0 || undershoot.x == 0 || undershoot.y == 0) {
return false; return false;
@ -95,6 +95,9 @@ bool cast_light_intersection_ray(
return false; 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) { float4 view_light(float4 in_color, float3 light, float3 view, int3 mask) {
float diffuse = max(dot(normalize(convert_float3(mask)), normalize(light)), 0.0f); 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 fog_color = { 0.73, 0.81, 0.89, 0.8 };
float4 voxel_color = (float4)(0.50, 0.0, 0.50, 0.1); 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 = { 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 // Andrew Woo's raycasting algo
@ -287,15 +291,15 @@ __kernel void raycaster(
voxel.xyz += voxel_step.xyz * face_mask.xyz; voxel.xyz += voxel_step.xyz * face_mask.xyz;
// If the ray went out of bounds // If the ray went out of bounds
int3 overshoot = voxel <= *map_dim; int3 overshoot = voxel < *map_dim;
int3 undershoot = voxel > 0; int3 undershoot = voxel >= 0;
if (overshoot.x == 0 || overshoot.y == 0 || overshoot.z == 0 || undershoot.x == 0 || undershoot.y == 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)); 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; return;
} }
if (undershoot.z == 0) { 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; return;
} }
@ -313,29 +317,41 @@ __kernel void raycaster(
else if (voxel_data == 5) { else if (voxel_data == 5) {
voxel_color = (float4)(0.25, 0.52, 0.30, 0.1); 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( if (cast_light_intersection_ray(
map, map,
map_dim, map_dim,
(float3)(lights[4], lights[5], lights[6]) - (convert_float3(voxel)), (float3)(lights[4], lights[5], lights[6]) - (convert_float3(voxel)),
(convert_float3(voxel) - convert_float3(face_mask * voxel_step)), (convert_float3(voxel) - convert_float3(face_mask * voxel_step)),//face_position),//
lights, lights,
light_count light_count
)) { )) {
write_imagef(image, pixel, voxel_color); write_imagef(image, pixel, voxel_color);
//write_imagef(image, pixel, voxel_color); //write_imagef(image, pixel, voxel_color);
return; return;
} }
// 0 1 2 3 4 5 6 7 8 9
// {r, g, b, i, x, y, z, x', y', z'}
write_imagef( write_imagef(
image, image,
pixel, pixel,
view_light( view_light(
voxel_color, voxel_color,
(convert_float3(voxel) + offset) - (float3)(lights[4], lights[5], lights[6]), (convert_float3(voxel) ) - (float3)(lights[4], lights[5], lights[6]),
(convert_float3(voxel) + offset) - (*cam_pos), (convert_float3(voxel) ) - (*cam_pos),
face_mask * voxel_step face_mask * voxel_step
) )
); );

@ -93,11 +93,13 @@ void Camera::recieve_event(VrEventPublisher* publisher, std::unique_ptr<vr::Even
vr::KeyHeld *held_event = static_cast<vr::KeyHeld*>(event.get()); vr::KeyHeld *held_event = static_cast<vr::KeyHeld*>(event.get());
default_impulse = 1.0f;
if (held_event->code == sf::Keyboard::LShift) { if (held_event->code == sf::Keyboard::LShift) {
default_impulse = 0.2f; default_impulse = 0.2f;
} }
if (held_event->code == sf::Keyboard::RShift) {
default_impulse = 1.0f;
}
else if (held_event->code == sf::Keyboard::C) { else if (held_event->code == sf::Keyboard::C) {
look_at_center(); look_at_center();
} }

@ -26,7 +26,8 @@ void Old_Map::generate_terrain() {
voxel_data[i] = 0; voxel_data[i] = 0;
} }
set_voxel(sf::Vector3i(75, 75, 75), 5); //set_voxel(sf::Vector3i(63, 63, 63), 1);
for (int i = 0; i < dimensions.x * dimensions.y; i++) { for (int i = 0; i < dimensions.x * dimensions.y; i++) {
height_map[i] = 0; height_map[i] = 0;
@ -37,7 +38,7 @@ void Old_Map::generate_terrain() {
int DATA_SIZE = dimensions.x + 1; int DATA_SIZE = dimensions.x + 1;
//an initial seed value for the corners of the data //an initial seed value for the corners of the data
//srand(f_rand()); //srand(f_rand());
double SEED = rand() % 30 + 55; double SEED = rand() % 5 + 10;
//seed the data //seed the data
set_sample(0, 0, SEED); set_sample(0, 0, SEED);
@ -45,7 +46,7 @@ void Old_Map::generate_terrain() {
set_sample(dimensions.x, 0, SEED); set_sample(dimensions.x, 0, SEED);
set_sample(dimensions.x, dimensions.y, SEED); set_sample(dimensions.x, dimensions.y, SEED);
double h = 30.0;//the range (-h -> +h) for the average offset double h = 5.0;//the range (-h -> +h) for the average offset
//for the new value in range of h //for the new value in range of h
//side length is distance of a single square side //side length is distance of a single square side
//or distance of diagonal in diamond //or distance of diagonal in diamond
@ -138,6 +139,16 @@ void Old_Map::generate_terrain() {
} }
for (int x = dimensions.x / 2; x < dimensions.x / 2 + dimensions.x / 16; x++) {
for (int y = dimensions.x / 2; y < dimensions.y / 2 + dimensions.x / 16; y++) {
for (int z = 0; z < 20; z++) {
voxel_data[x + dimensions.x * (y + dimensions.z * z)] = 6;
}
}
}
for (int x = 0; x < dimensions.x; x++) { for (int x = 0; x < dimensions.x; x++) {
for (int y = 0; y < dimensions.y; y++) { for (int y = 0; y < dimensions.y; y++) {
// for (int z = 0; z < dimensions.z; z++) { // for (int z = 0; z < dimensions.z; z++) {

@ -40,9 +40,9 @@ const int WINDOW_X = 1000;
const int WINDOW_Y = 1000; const int WINDOW_Y = 1000;
const int WORK_SIZE = WINDOW_X * WINDOW_Y; const int WORK_SIZE = WINDOW_X * WINDOW_Y;
const int MAP_X = 512; const int MAP_X = 128;
const int MAP_Y = 512; const int MAP_Y = 128;
const int MAP_Z = 512; const int MAP_Z = 128;
float elap_time(){ float elap_time(){
static std::chrono::time_point<std::chrono::system_clock> start; static std::chrono::time_point<std::chrono::system_clock> start;
@ -115,8 +115,8 @@ int main() {
// Light for the currently non functional Bling Phong shader // Light for the currently non functional Bling Phong shader
Light l; Light l;
l.direction_cartesian = sf::Vector3f(-0.2f, -0.2f, -1.5f); l.direction_cartesian = sf::Vector3f(-1.0f, -1.0f, -1.5f);
l.position = sf::Vector3f(100.0f, 500.0f, 100.0f); l.position = sf::Vector3f(256.0f, 256.0f, 256.0f);
l.rgbi = sf::Vector4f(0.3f, 0.4f, 0.3f, 1.0f); l.rgbi = sf::Vector4f(0.3f, 0.4f, 0.3f, 1.0f);
std::vector<Light> light_vec; std::vector<Light> light_vec;
@ -157,6 +157,8 @@ int main() {
bool reset = false; bool reset = false;
double timer_accumulator = 0.0;
Input input_handler; Input input_handler;
camera->subscribe_to_publisher(&input_handler, vr::Event::EventType::KeyHeld); camera->subscribe_to_publisher(&input_handler, vr::Event::EventType::KeyHeld);
@ -182,6 +184,19 @@ int main() {
if (sf::Keyboard::isKeyPressed(sf::Keyboard::L)) { if (sf::Keyboard::isKeyPressed(sf::Keyboard::L)) {
light_vec.at(0).position = camera->get_position(); light_vec.at(0).position = camera->get_position();
} }
if (sf::Keyboard::isKeyPressed(sf::Keyboard::N)) {
light_vec.at(0).orbit_around_center(timer_accumulator += delta_time);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::N)) {
std::string path = "../assets/";
std::string filename;
std::getline(std::cin, filename);
filename += ".png";
sf::Image image = window.capture();
image.saveToFile(path + filename);
}
// Time keeping // Time keeping
elapsed_time = elap_time(); elapsed_time = elap_time();
@ -196,6 +211,8 @@ int main() {
// ==== DELTA TIME LOCKED ==== // ==== DELTA TIME LOCKED ====
} }
// ==== FPS LOCKED ==== // ==== FPS LOCKED ====
camera->update(delta_time); camera->update(delta_time);

Loading…
Cancel
Save