rayzor
diff src/renderer.cc @ 15:be616b58df99
continued the renderer slightly
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sun, 13 Apr 2014 09:54:36 +0300 |
parents | a9a948809c6f |
children | 79609d482762 |
line diff
1.1 --- a/src/renderer.cc Sun Apr 13 08:06:21 2014 +0300 1.2 +++ b/src/renderer.cc Sun Apr 13 09:54:36 2014 +0300 1.3 @@ -1,15 +1,26 @@ 1.4 #include <string.h> 1.5 #include "renderer.h" 1.6 #include "rayzor.h" 1.7 +#include "scene.h" 1.8 #include "keyb.h" 1.9 #include "scrman.h" 1.10 +#include "timer.h" 1.11 +#include "logger.h" 1.12 1.13 struct RendererImpl { 1.14 bool in_progress; 1.15 int cur_x, cur_y; // current pixel being rendered 1.16 - int cur_pix; // current pixel (linear) 1.17 + 1.18 + uint32_t *pixels; 1.19 + 1.20 + MsgAtom msg_start; 1.21 }; 1.22 1.23 + 1.24 +static Vector3 ray_trace(const Ray &ray, int iter = 0); 1.25 +static Vector3 shade(const Ray &ray, float t, int iter); 1.26 + 1.27 + 1.28 Renderer::Renderer() 1.29 { 1.30 set_name("renderer"); 1.31 @@ -19,12 +30,22 @@ 1.32 { 1.33 rend = new RendererImpl; 1.34 memset(rend, 0, sizeof *rend); 1.35 + 1.36 + rend->pixels = new uint32_t[fb_width * fb_height]; 1.37 + if(!rend->pixels) { 1.38 + return false; 1.39 + } 1.40 + memset(rend->pixels, 0, fb_width * fb_height * 4); 1.41 + 1.42 + rend->msg_start = message_atom("start"); 1.43 + 1.44 return true; 1.45 } 1.46 1.47 void Renderer::shutdown() 1.48 { 1.49 if(rend) { 1.50 + delete [] rend->pixels; 1.51 delete rend; 1.52 rend = 0; 1.53 } 1.54 @@ -32,7 +53,43 @@ 1.55 1.56 void Renderer::draw() const 1.57 { 1.58 - memset(fb_pixels, 0, fb_width * fb_height * 4); 1.59 + Camera *cam = scene->get_active_camera(); 1.60 + 1.61 + // if a rendering is not in progress, just show the last buffer 1.62 + if(!rend->in_progress || !cam) { 1.63 + memcpy(fb_pixels, rend->pixels, fb_width * fb_height * 4); 1.64 + return; 1.65 + } 1.66 + 1.67 + // render for approximately half a second, then show and return 1.68 + unsigned long start = get_msec(); 1.69 + uint32_t *dest = rend->pixels + rend->cur_y * fb_width + rend->cur_x; 1.70 + 1.71 + for(;;) { 1.72 + Ray ray = cam->get_primary_ray(rend->cur_x, rend->cur_y); 1.73 + Vector3 color = ray_trace(ray); 1.74 + 1.75 + int r = color.x > 1.0 ? 255 : (int)(color.x * 255.0); 1.76 + int g = color.y > 1.0 ? 255 : (int)(color.y * 255.0); 1.77 + int b = color.z > 1.0 ? 255 : (int)(color.z * 255.0); 1.78 + 1.79 + *dest++ = (r << 16) | (g << 8) | b; 1.80 + 1.81 + if(++rend->cur_x >= fb_width) { 1.82 + rend->cur_x = 0; 1.83 + if(++rend->cur_y >= fb_height) { 1.84 + rend->in_progress = false; 1.85 + printlog("done!\n"); 1.86 + break; 1.87 + } 1.88 + } 1.89 + 1.90 + if(get_msec() - start >= 500) { 1.91 + break; 1.92 + } 1.93 + } 1.94 + 1.95 + memcpy(fb_pixels, rend->pixels, fb_width * fb_height * 4); 1.96 } 1.97 1.98 void Renderer::handle_keyboard(int key, bool press) 1.99 @@ -42,5 +99,29 @@ 1.100 deactivate_screen(); 1.101 break; 1.102 1.103 + default: 1.104 + break; 1.105 } 1.106 } 1.107 + 1.108 +void Renderer::message(MsgAtom msg) 1.109 +{ 1.110 + if(msg == rend->msg_start) { 1.111 + rend->cur_x = rend->cur_y = 0; 1.112 + rend->in_progress = true; 1.113 + memset(rend->pixels, 0, fb_width * fb_height * 4); 1.114 + 1.115 + printlog("starting a new rendering!\n"); 1.116 + } 1.117 +} 1.118 + 1.119 + 1.120 +static Vector3 ray_trace(const Ray &ray, int iter) 1.121 +{ 1.122 + return shade(ray, 0, iter); 1.123 +} 1.124 + 1.125 +static Vector3 shade(const Ray &ray, float t, int iter) 1.126 +{ 1.127 + return Vector3(1.0, 0.0, 0.0); 1.128 +}