summaryrefslogtreecommitdiff
path: root/src/camera.cu
blob: da527b9b1f5e1771c3714d010bd4dd4ad33d4db0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <limits>
#include "camera.cuh"

__device__ void Camera::render(Scene scene, uint8_t *image) {
  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;
  Ray ray;
  ray.direction = normalize(make_vect3(uv.x, uv.y, 1));
  Render_object **objects = scene.get_objects();
  Render_object *closest_obj;
  T total_dist = 0;
  Color pcolor;
  for(int steps = 0; steps < max_steps; steps++) {
    T min_dist = T_MAX;
    T dist;
    ray.start = this->pos_ + (total_dist * ray.direction);
    for(size_t obj_i = 0; objects[obj_i] != nullptr; obj_i++) {

      dist = objects[obj_i]->distance_estimator(ray.start);
      if(dist < min_dist) {
        min_dist = dist;
        if(dist < clip_min) {
          steps = max_steps;
          pcolor = objects[obj_i]->get_color(ray);
          image[img_index+3] = 0xff;
          break;
        }
        if(dist > clip_max) {
          steps = max_steps;
          image[img_index+3] = 0x00;
          break;
        }
      }
    }
    total_dist += min_dist;
  }


  //TODO gamma space
  image[img_index] = pcolor.x * 255;
  image[img_index+1] = pcolor.y * 255;
  image[img_index+2] = pcolor.z * 255;
}