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 }