#ifndef CAMERA_H #define CAMERA_H #include "entity.cuh" #include "common.cuh" #include //template class scene; //I am soooo high lol template class camera : public entity { using T3 = typename vect_t3::vect_t; using T2 = typename vect_t2::vect_t; public: __device__ void render(); __device__ camera(scene *pscene, const T fov = 1, const T3 pos = vect_create(0), const T3 rot = vect_create(0)) : pscene(pscene), fov(fov), entity(pos, rot, vect_create(0)) {}; //__device__ ~camera(); private: T fov; T2 size; int steps = 100; T clip_min = .1; T clip_max = 100; scene *pscene; }; /** //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 T3 uv = ((2 * vect_create(unnormalized_uv)) / vect_create(gridDim * blockDim)) - 1; const T3 ray_direction = normalize(vect_create(uv.x, uv.y, 1)); T dist; T total_dist = 0; T3 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