#pragma once
#include "raycaster/RayCaster.h"
#include <thread>

struct PackedData;

class Software_Caster : public RayCaster
{
public:
	Software_Caster();

	virtual ~Software_Caster();

	int init() override;

	// In interop mode, this will create a GL texture that we share
	// Otherwise, it will create the pixel buffer and pass that in as an image, retrieving it each draw
	// Both will create the view matrix, view res buffer
	void create_viewport(int width, int height, float v_fov, float h_fov) override;

	void assign_lights(std::vector<PackedData> *data) override;
	void assign_map(Old_Map *map) override;
	void assign_camera(Camera *camera) override;
	void validate() override;

	// draw will abstract the gl sharing and software rendering
	// methods of retrieving the screen buffer
	void compute() override;
	void draw(sf::RenderWindow* window) override;

private:
	
	void cast_viewport();
	void cast_thread(int start_id, int end_id);
	void cast_ray(int id);
	void blit_pixel(sf::Color color, sf::Vector2i position, sf::Vector3i mask);
	sf::Color global_light(sf::Color in, sf::Vector3i mask);
};
