#ifndef CAMERA_H #define CAMERA_H #include #include #include "entity.cuh" #include "common.cuh" #include "scene.cuh" //template class scene; //I am soooo high lol class Camera : public Entity { public: __device__ Camera(const T fov = 1, const vect3 pos = make_vect3(0), const vect3 rot = make_vect3(0)) : fov(fov), Entity(pos, rot, make_vect3(0)) {}; __device__ void render(Scene scene, uint8_t *image); private: const T clip_min = .1; const T clip_max = 100; const int max_steps = 100; T fov; float2 size; }; /** //later we'll make scenes objects, rn im lazy (TODO) template __device__ void camera::render() { //TODO *really* need to clean this up once you get further //extra dimentions is extra math //either generisize float3 or stop using this fucking template nonsense const uint3 unnormalized_uv = ((blockDim * blockIdx) + threadIdx); const unsigned int img_index = (unnormalized_uv.x + (unnormalized_uv.y * blockDim.x * gridDim.x)) * 4; const vect3 uv = ((2 * make_vect3(unnormalized_uv)) / make_vect3(gridDim * blockDim)) - 1; const vect3 ray_direction = normalize(make_vect3(uv.x, uv.y, 1)); T dist; T total_dist = 0; vect3 ray; int i; //if(img_index == 640) { printf("%f, %f, %f\n", uv.x, uv.y, uv.z); } T min_dist = clip_max; render_object **objs = pscene->get_objs(); for(i = 0; i < steps; i++) { ray = this->pos_ + (total_dist * ray_direction); //gyagh memory lookups for(unsigned int oi = 0; objs[oi] != NULL; oi++) { dist = object.distance_estimator(ray); } if((dist < clip_min)) { //image[img_index] = 0xff; break; } if((dist > clip_max)) { //image[img_index+2] = 0xff; break; } total_dist += dist; } //image[img_index] = 0x00; //image[img_index+1] = 0x00; //image[img_index+2] = p; //image[img_index+3] = 0xff; } **/ #endif