2 RetroRay - integrated standalone vintage modeller/renderer
3 Copyright (C) 2023 John Tsiombikas <nuclear@mutantstargoat.com>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <https://www.gnu.org/licenses/>.
34 #include "gaw/gaw_sw.h"
37 static void gui_fill(rtk_rect *rect, uint32_t color);
38 static void gui_blit(int x, int y, rtk_icon *icon);
39 static void gui_drawtext(int x, int y, const char *str);
40 static void gui_textrect(const char *str, rtk_rect *rect);
42 int mouse_x, mouse_y, mouse_state[3];
44 int win_width, win_height;
50 struct app_screen *cur_scr;
58 /* available screens */
60 static struct app_screen *screens[MAX_SCREENS];
61 static int num_screens;
68 static rtk_draw_ops guigfx = {gui_fill, gui_blit, gui_drawtext, gui_textrect};
70 #if !defined(NDEBUG) && defined(DBG_FPEXCEPT)
71 infomsg("floating point exceptions enabled\n");
85 /*dtx_target_user(txdraw, 0);*/
86 dtx_target_raster((unsigned char*)framebuf, win_width, win_height);
87 dtx_set(DTX_RASTER_THRESHOLD, 127);
89 uifont = malloc_nf(sizeof *uifont);
90 if(load_font(uifont, "data/uifont14.gmp") == -1) {
97 if(!(scn = create_scene())) {
101 /* initialize screens */
102 screens[num_screens++] = &scr_model;
103 screens[num_screens++] = &scr_rend;
105 start_scr_name = getenv("START_SCREEN");
107 for(i=0; i<num_screens; i++) {
108 if(screens[i]->init() == -1) {
113 time_msec = get_msec();
115 for(i=0; i<num_screens; i++) {
116 if(screens[i]->name && start_scr_name && strcmp(screens[i]->name, start_scr_name) == 0) {
117 app_chscr(screens[i]);
122 app_chscr(&scr_model);
128 void app_shutdown(void)
134 save_options("retroray.cfg");
136 for(i=0; i<num_screens; i++) {
137 if(screens[i]->destroy) {
138 screens[i]->destroy();
142 destroy_font(uifont);
154 void app_display(void)
156 time_msec = get_msec();
161 void app_reshape(int x, int y)
164 int prev_numpix = win_width * win_height;
166 if(!framebuf || numpix > prev_numpix) {
168 if(!(tmp = realloc(framebuf, numpix * sizeof *framebuf))) {
169 errormsg("failed to resize framebuffer to %dx%d\n", x, y);
175 gaw_sw_framebuffer(x, y, framebuf);
177 dtx_target_raster((unsigned char*)framebuf, x, y);
181 win_aspect = (float)x / (float)y;
182 gaw_viewport(0, 0, x, y);
184 if(cur_scr && cur_scr->reshape) {
185 cur_scr->reshape(x, y);
188 app_redisplay(0, 0, 0, 0);
191 void app_keyboard(int key, int press)
194 static long prev_esc;
201 if(msec - prev_esc < 1000) {
210 if(modkeys & KEY_MOD_CTRL) {
218 if(modkeys & KEY_MOD_ALT) {
227 if(cur_scr && cur_scr->keyboard) {
228 cur_scr->keyboard(key, press);
232 void app_mouse(int bn, int st, int x, int y)
237 mouse_state[bn] = st;
240 if(cur_scr && cur_scr->mouse) {
241 cur_scr->mouse(bn, st, x, y);
245 void app_motion(int x, int y)
247 if(cur_scr && cur_scr->motion) {
248 cur_scr->motion(x, y);
254 void app_sball_motion(int x, int y, int z)
256 if(cur_scr->sball_motion) {
257 cur_scr->sball_motion(x, y, z);
261 void app_sball_rotate(int x, int y, int z)
263 if(cur_scr->sball_rotate) {
264 cur_scr->sball_rotate(x, y, z);
268 void app_sball_button(int bn, int st)
270 if(cur_scr->sball_button) {
271 cur_scr->sball_button(bn, st);
275 void app_chscr(struct app_screen *scr)
277 struct app_screen *prev = cur_scr;
281 if(scr->start && scr->start() == -1) {
285 scr->reshape(win_width, win_height);
288 if(prev && prev->stop) {
294 static void gui_fill(rtk_rect *rect, uint32_t color)
297 uint32_t *fb = framebuf + rect->y * win_width + rect->x;
299 for(i=0; i<rect->height; i++) {
300 for(j=0; j<rect->width; j++) {
307 static void gui_blit(int x, int y, rtk_icon *icon)
310 uint32_t *dest, *src;
312 dest = framebuf + y * win_width + x;
315 for(i=0; i<icon->height; i++) {
316 for(j=0; j<icon->width; j++) {
317 int r = src[j] & 0xff;
318 int g = (src[j] >> 8) & 0xff;
319 int b = (src[j] >> 16) & 0xff;
320 dest[j] = 0xff000000 | (r << 16) | (g << 8) | b;
323 src += icon->scanlen;
327 static void gui_drawtext(int x, int y, const char *str)
331 dtx_color(0, 0, 0, 1);
335 static void gui_textrect(const char *str, rtk_rect *rect)
340 dtx_string_box(str, &dbox);
344 rect->width = dbox.width;
345 rect->height = dbox.height;