#ifndef GAME_RENDERER_H
#define GAME_RENDERER_H

#include "SFML/Graphics.hpp"
#include "CL_Wrapper.h"
#include "Camera.h"
#include "Old_map.h"
#include "RayCaster.h"

// Renderer needs to handle the distinction between a few difference circumstances.
// A.) The machine supports OpenCL and cl_khr_gl_sharing
//          Everything is normal, rendering is handled on-gpu
// B.) The machine support Opencl and NOT cl_khr_gl_sharing
//          For every frame we have to pull the screen buffer from the GPU's memory
// C.) The machine does not support OpenCL
//          We must use the fallback software renderer

// Renderer will hold its own CL_Renderer class which contains all of the data
// and functionality that the CL_Wrapper class currently does, but with the
// intent of leaving it specialized to only the raycaster. Any further OpenCL
// work can use its own class

// Perhaps in the future there will be a container "scene" which will
// hold the current map, camera, and light objects. The renderer will
// then be passed that scene which it will then use to render with

class Renderer {

public:
    Renderer();

    // The renderer needs all of the things that are required
    // by CL in order to render the screen
    void register_camera(Camera* camera);
	void register_map(Old_Map* map);
	void register_lights();
	void create_viewport(float v_fov, float h_fov, int height, int width);
	void register_light(Light l);

    void draw();
    sf::RenderWindow* get_window();

private:

    CL_Wrapper *cl;
	RayCaster *rc;

    bool sharing_supported = false;
	bool cl_supported = false;
    
	sf::Uint8 *drawing_surface;
    sf::RenderWindow* window;

	std::vector<Light> lights;
	Old_Map* map;
	Camera* camera;
	sf::Uint8 *view_matrix;

};


#endif
