54 lines
1.5 KiB
C
54 lines
1.5 KiB
C
|
#include <defocus/camera.h>
|
||
|
|
||
|
#include <string.h>
|
||
|
|
||
|
/* ********************************************************
|
||
|
*
|
||
|
* Ray Packet Functions
|
||
|
*
|
||
|
* ********************************************************/
|
||
|
|
||
|
void df_release_ray_packet(df_ray_packet *rays)
|
||
|
{
|
||
|
free(rays->simd_mem);
|
||
|
free(rays->ray_uvs);
|
||
|
|
||
|
memset(rays, 0, sizeof(*rays));
|
||
|
}
|
||
|
|
||
|
/* ********************************************************
|
||
|
*
|
||
|
* Perspective Camrea
|
||
|
*
|
||
|
* ********************************************************/
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
float focal_dist;
|
||
|
float lens_radius;
|
||
|
|
||
|
df_m4 screen_to_raster;
|
||
|
df_m4 raster_to_screen;
|
||
|
df_m4 raster_to_camera;
|
||
|
|
||
|
} df_perspective_camera;
|
||
|
|
||
|
static void pc_release(void *o) { df_perspective_camera *camera = o; }
|
||
|
|
||
|
static df_ray_packet pc_build_ray_packet(void *o) { df_perspective_camera *camera = o; }
|
||
|
|
||
|
df_camera_i df_create_perspective_camera(float image_width, float image_height, float raster_width, float raster_height)
|
||
|
{
|
||
|
df_perspective_camera *camera = malloc(sizeof(*camera));
|
||
|
|
||
|
camera->screen_to_raster = df_scale(raster_width, raster_height, 1.f);
|
||
|
camera->screen_to_raster =
|
||
|
df_mul_m4(camera->screen_to_raster, df_scale(1.f / image_width, -1.f / image_height, 1.f));
|
||
|
camera->screen_to_raster = df_mul_m4(camera->screen_to_raster, df_translate(0.f, -image_height, 0.f));
|
||
|
|
||
|
camera->raster_to_screen = df_inverse_transform(camera->screen_to_raster);
|
||
|
|
||
|
df_camera_i iface = {.release = pc_release, .build_ray_packet = pc_build_ray_packet, .o = camera};
|
||
|
return iface;
|
||
|
}
|