distray
annotate src/rend.cc @ 0:cf494adee646
distance field raytracer
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Fri, 25 Dec 2015 05:41:10 +0200 |
parents | |
children |
rev | line source |
---|---|
nuclear@0 | 1 #include "rend.h" |
nuclear@0 | 2 #include "threadpool.h" |
nuclear@0 | 3 |
nuclear@0 | 4 static float *pixels; |
nuclear@0 | 5 static int width, height; |
nuclear@0 | 6 |
nuclear@0 | 7 static Matrix4x4 cam_matrix, inv_cam_matrix; |
nuclear@0 | 8 static float (*distfunc)(float, float, float); |
nuclear@0 | 9 |
nuclear@0 | 10 static ThreadPool tpool; |
nuclear@0 | 11 |
nuclear@0 | 12 |
nuclear@0 | 13 void set_framebuffer(int x, int y, float *pix) |
nuclear@0 | 14 { |
nuclear@0 | 15 pixels = pix; |
nuclear@0 | 16 width = x; |
nuclear@0 | 17 height = y; |
nuclear@0 | 18 } |
nuclear@0 | 19 |
nuclear@0 | 20 void set_distance_function(float (*dfunc)(float, float, float)) |
nuclear@0 | 21 { |
nuclear@0 | 22 distfunc = dfunc; |
nuclear@0 | 23 } |
nuclear@0 | 24 |
nuclear@0 | 25 void set_camera_matrix(const Matrix4x4 &xform) |
nuclear@0 | 26 { |
nuclear@0 | 27 cam_matrix = xform; |
nuclear@0 | 28 inv_cam_matrix = xform.inverse(); |
nuclear@0 | 29 } |
nuclear@0 | 30 |
nuclear@0 | 31 static void render_scanline(int y) |
nuclear@0 | 32 { |
nuclear@0 | 33 float *pptr = pixels + y * width * 4; |
nuclear@0 | 34 for(int i=0; i<width; i++) { |
nuclear@0 | 35 } |
nuclear@0 | 36 } |
nuclear@0 | 37 |
nuclear@0 | 38 void start_render() |
nuclear@0 | 39 { |
nuclear@0 | 40 for(int i=0; i<height; i++) { |
nuclear@0 | 41 tpool.add_work(std::bind(render_scanline, i)); |
nuclear@0 | 42 } |
nuclear@0 | 43 } |
nuclear@0 | 44 |
nuclear@0 | 45 void wait_render() |
nuclear@0 | 46 { |
nuclear@0 | 47 tpool.wait(); |
nuclear@0 | 48 } |
nuclear@0 | 49 |
nuclear@0 | 50 void render() |
nuclear@0 | 51 { |
nuclear@0 | 52 start_render(); |
nuclear@0 | 53 wait_render(); |
nuclear@0 | 54 } |