#include "RayCaster.h" #include #include RayCaster::RayCaster( Map *map, sf::Vector3 map_dimensions, sf::Vector2 viewport_resolution ) { // Override values //this.map_dimensions = new Vector3 (50, 50, 50); //this.resolution = new Vector2 (200, 200); //this.camera_direction = new Vector3 (1f, 0f, .8f); //this.camera_position = new Vector3 (1, 10, 10); this->map_dimensions = map_dimensions; this->map = map; resolution = viewport_resolution; image = new sf::Color[resolution.x, resolution.y]; } RayCaster::~RayCaster() { } sf::Color* RayCaster::CastRays(sf::Vector3 camera_direction, sf::Vector3 camera_position) { // Setup the camera for this cast this->camera_direction = camera_direction; camera_direction_cartesian = Normalize(SphereToCart(camera_direction)); this->camera_position = camera_position; // The radian increment each ray is spaced from one another double y_increment_radians = DegreesToRadians(40.0 / resolution.y); double x_increment_radians = DegreesToRadians(50.0 / resolution.x); // A reference to the positive X axis as our base viewport point sf::Vector3f base_direction(1, 0, 0); // Start the loop at the bottom left, scan right and work up for (int x = 0; x < resolution.x / 2; x++) { for (int y = -resolution.y / 2; y < resolution.y / 2; y++) { // The direction the final ray will point. // First take a reference to the base direction to setup the viewport //Vector3 ray_direction = new Vector3 (base_direction); // New method to cast rays using the original intended Spherical coords // instead of that malarchy with converting them to cartesian from the formula sf::Vector3f ray_direction( camera_direction.x + 1.0f, camera_direction.y + (float)(y_increment_radians * y), camera_direction.z + (float)(x_increment_radians * x) ); sf::Vector3f ray_cartesian = Normalize(SphereToCart(ray_direction)); sf::Vector3f cam_cartesian = Normalize(SphereToCart(camera_direction)); if ((y == -99 || y == 0 || y == 99) && (/*x == 99 || x == 0 || */x == -99)) { std::cout << "X : " << x << "\n"; std::cout << "Y : " << y << "\n"; std::cout << ray_direction.x << " : " << ray_direction.y << " : " << ray_direction.z << "\n"; } // Setup the ray Ray r(map, resolution, sf::Vector2i(x, y), camera_position, ray_direction); // Cast it ///image[x + 100, y + 100] = r.Cast(); } } return image; }