src/scene.c

changeset 101
febf3dc10011
parent 100
5231da78831e
equal deleted inserted replaced
100:5231da78831e 101:febf3dc10011
43 void asc_scene_init(AscScene *scene, AscCameraParams camera_params) { 43 void asc_scene_init(AscScene *scene, AscCameraParams camera_params) {
44 if (scene->root != NULL) { 44 if (scene->root != NULL) {
45 asc_wprintf("Scene %"PRIxPTR" is already initialized - initialization skipped.", (uintptr_t) scene); 45 asc_wprintf("Scene %"PRIxPTR" is already initialized - initialization skipped.", (uintptr_t) scene);
46 return; 46 return;
47 } 47 }
48 if (camera_params.type == ASC_CAMERA_ORTHO) { 48 asc_camera_init(&scene->camera, camera_params);
49 asc_camera_ortho(&scene->camera, camera_params.ortho.rect);
50 } else if (camera_params.type == ASC_CAMERA_PERSPECTIVE) {
51 // TODO: implement
52 asc_wprintf("Camera type PERSPECTIVE is not yet implemented.");
53 } else {
54 // at least zero all the bytes (law of the least surprise)
55 memset(&scene->camera, 0, sizeof(AscCamera));
56 }
57 scene->camera.viewport_update_func = camera_params.viewport_update_func;
58 scene->root = asc_scene_node_empty(); 49 scene->root = asc_scene_node_empty();
59 50
60 asc_dprintf("Initialized scene %"PRIxPTR, (uintptr_t) scene); 51 asc_dprintf("Initialized scene %"PRIxPTR, (uintptr_t) scene);
61 } 52 }
62 53
70 void asc_scene_draw(AscScene *scene) { 61 void asc_scene_draw(AscScene *scene) {
71 if (scene->root == NULL) return; 62 if (scene->root == NULL) return;
72 63
73 // if the window resized, we must update the viewport 64 // if the window resized, we must update the viewport
74 if (asc_active_window->resized) { 65 if (asc_active_window->resized) {
66 asc_vec2i window_size = asc_active_window->dimensions;
75 if (scene->camera.viewport_update_func == NULL) { 67 if (scene->camera.viewport_update_func == NULL) {
76 // this assumes the viewport was initialized with zeros! 68 // this assumes the viewport was initialized with zeros!
77 scene->camera.viewport.size = asc_active_window->dimensions; 69 scene->camera.viewport.size = window_size;
78 } else { 70 } else {
79 scene->camera.viewport = scene->camera.viewport_update_func(asc_active_window->dimensions); 71 scene->camera.viewport = scene->camera.viewport_update_func(window_size);
72 }
73 if (scene->camera.projection_update_func != NULL) {
74 scene->camera.projection_update_func(&scene->camera, window_size);
80 } 75 }
81 } 76 }
82 77
83 // create render groups 78 // create render groups
84 CxList *render_group[ASC_RENDER_GROUP_COUNT]; 79 CxList *render_group[ASC_RENDER_GROUP_COUNT];

mercurial