4 struct thread_pool *tpool;
10 static void ray_trace(cgm_vec3 *color, cgm_ray *ray);
11 static void primary_ray(cgm_ray *ray, int x, int y, int sample);
13 int fbsize(int width, int height)
17 if(!(tmp = malloc(width * height * sizeof *fb.pixels))) {
26 aspect = (float)fb.width / (float)fb.height;
35 cgm_vec3 *fbptr = fb.pixels;
37 for(i=0; i<fb.height; i++) {
38 for(j=0; j<fb.width; j++) {
39 primary_ray(&ray, j, i, 0);
40 ray_trace(fbptr, &ray);
46 static void ray_trace(cgm_vec3 *color, cgm_ray *ray)
48 color->x = ray->dir.x * 0.5f + 0.5f;
49 color->y = ray->dir.y * 0.5f + 0.5f;
53 static void primary_ray(cgm_ray *ray, int x, int y, int sample)
55 ray->origin.x = ray->origin.y = ray->origin.z = 0.0f;
56 ray->dir.x = (2.0f * (float)x / (float)fb.width - 1.0f) * aspect;
57 ray->dir.y = 1.0f - 2.0f * (float)y / (float)fb.height;
58 ray->dir.z = -1.0f / tan(vfov / 2.0f);
59 cgm_vnormalize(&ray->dir);
63 cgm_rmul_mr(ray, view_xform);