diff options
Diffstat (limited to 'dimension/realize.c')
-rw-r--r-- | dimension/realize.c | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/dimension/realize.c b/dimension/realize.c index 7f5e385..67536e6 100644 --- a/dimension/realize.c +++ b/dimension/realize.c @@ -22,7 +22,53 @@ #include "utility.h" dmnsn_scene * -dmnsn_realize(dmnsn_array *astree) +dmnsn_realize(const dmnsn_array *astree) { - return dmnsn_new_scene(); + dmnsn_scene *scene = dmnsn_new_scene(); + if (!scene) { + return NULL; + } + + /* Background color */ + dmnsn_sRGB background_sRGB = { .R = 0.0, .G = 0.05, .B = 0.1 }; + scene->background = dmnsn_color_from_sRGB(background_sRGB); + + /* Allocate a canvas */ + scene->canvas = dmnsn_new_canvas(768, 480); + if (!scene->canvas) { + dmnsn_delete_realized_scene(scene); + return NULL; + } + + /* Set up the transformation matrix for the perspective camera */ + dmnsn_matrix trans = dmnsn_scale_matrix( + dmnsn_vector_construct( + ((double)scene->canvas->x)/scene->canvas->y, 1.0, 1.0 + ) + ); + trans = dmnsn_matrix_mul( + dmnsn_translation_matrix(dmnsn_vector_construct(0.0, 0.0, -4.0)), + trans + ); + trans = dmnsn_matrix_mul( + dmnsn_rotation_matrix(dmnsn_vector_construct(0.0, 1.0, 0.0)), + trans + ); + + /* Create a perspective camera */ + scene->camera = dmnsn_new_perspective_camera(); + if (!scene->camera) { + dmnsn_delete_realized_scene(scene); + return NULL; + } + + return scene; +} + +void +dmnsn_delete_realized_scene(dmnsn_scene *scene) +{ + dmnsn_delete_camera(scene->camera); + dmnsn_delete_canvas(scene->canvas); + dmnsn_delete_scene(scene); } |