summaryrefslogtreecommitdiff
path: root/src/camera.cu
diff options
context:
space:
mode:
Diffstat (limited to 'src/camera.cu')
-rw-r--r--src/camera.cu44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/camera.cu b/src/camera.cu
new file mode 100644
index 0000000..da527b9
--- /dev/null
+++ b/src/camera.cu
@@ -0,0 +1,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;
+}