From a8b3d0279566b8a49ea64d7e9e3dfa958364e347 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Sun, 18 Jun 2023 02:54:37 +0300 Subject: [PATCH] partial image renderer (dummy test) --- Makefile | 8 ++-- src/app.c | 7 +--- src/app.h | 3 +- src/rend.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/rend.h | 31 +++++++++++++++ src/scr_mod.c | 54 ++++++++++++++++++------- tools/procdata | 1 - 7 files changed, 196 insertions(+), 27 deletions(-) create mode 100644 src/rend.c create mode 100644 src/rend.h diff --git a/Makefile b/Makefile index d308e29..87a5ebe 100644 --- a/Makefile +++ b/Makefile @@ -3,8 +3,8 @@ dosobj = src/dos/djdpmi.obj src/dos/gfx.obj src/dos/keyb.obj src/dos/main.obj & src/dos/mouse.obj src/dos/vbe.obj src/dos/vga.obj src/dos/watdpmi.obj appobj = src/app.obj src/cmesh.obj src/darray.obj src/font.obj src/logger.obj & src/meshgen.obj src/meshload.obj src/options.obj src/rbtree.obj src/rt.obj & - src/rtk.obj src/scene.obj src/scr_mod.obj src/scr_rend.obj src/util.obj & - src/util_s.obj src/cpuid.obj src/cpuid_s.obj + src/rend.obj src/rtk.obj src/scene.obj src/scr_mod.obj src/scr_rend.obj & + src/util.obj src/util_s.obj src/cpuid.obj src/cpuid_s.obj gawobj = src/gaw/gaw_sw.obj src/gaw/gawswtnl.obj src/gaw/polyclip.obj src/gaw/polyfill.obj incpath = -Isrc -Isrc/dos -Ilibs -Ilibs/imago/src -Ilibs/treestor/include -Ilibs/drawtext @@ -14,8 +14,8 @@ dosobj = src\dos\djdpmi.obj src\dos\gfx.obj src\dos\keyb.obj src\dos\main.obj & src\dos\mouse.obj src\dos\vbe.obj src\dos\vga.obj src\dos\watdpmi.obj appobj = src\app.obj src\cmesh.obj src\darray.obj src\font.obj src\logger.obj & src\meshgen.obj src\meshload.obj src\options.obj src\rbtree.obj src\rt.obj & - src\rtk.obj src\scene.obj src\scr_mod.obj src\scr_rend.obj src\util.obj & - src\util_s.obj src\cpuid.obj src\cpuid_s.obj + src\rend.obj src\rtk.obj src\scene.obj src\scr_mod.obj src\scr_rend.obj & + src\util.obj src\util_s.obj src\cpuid.obj src\cpuid_s.obj gawobj = src\gaw\gaw_sw.obj src\gaw\gawswtnl.obj src\gaw\polyclip.obj src\gaw\polyfill.obj incpath = -Isrc -Isrc\dos -Ilibs -Ilibs\imago\src -Ilibs\treestor\include -Ilibs\drawtext diff --git a/src/app.c b/src/app.c index c538bb1..87f3a10 100644 --- a/src/app.c +++ b/src/app.c @@ -23,6 +23,7 @@ along with this program. If not, see . #include #include "gaw/gaw.h" #include "app.h" +#include "rend.h" #include "options.h" #include "font.h" #include "util.h" @@ -36,7 +37,6 @@ static void gui_fill(rtk_rect *rect, uint32_t color); static void gui_blit(int x, int y, rtk_icon *icon); static void gui_drawtext(int x, int y, const char *str); static void gui_textrect(const char *str, rtk_rect *rect); -static void txdraw(struct dtx_vertex *v, int vcount, struct dtx_pixmap *pixmap, void *cls); int mouse_x, mouse_y, mouse_state[3]; unsigned int modkeys; @@ -74,6 +74,7 @@ int app_init(void) #ifdef GFX_SW gaw_sw_init(); #endif + rend_init(); load_options("retroray.cfg"); app_resize(opt.xres, opt.yres); @@ -326,7 +327,3 @@ static void gui_textrect(const char *str, rtk_rect *rect) rect->width = 20; rect->height = 10;/* TODO */ } - -static void txdraw(struct dtx_vertex *v, int vcount, struct dtx_pixmap *pixmap, void *cls) -{ -} diff --git a/src/app.h b/src/app.h index acd6a71..f6aa490 100644 --- a/src/app.h +++ b/src/app.h @@ -21,7 +21,6 @@ along with this program. If not, see . #include "sizeint.h" #include "logger.h" #include "scene.h" -#include "font.h" enum { KEY_BACKSP = 8, @@ -86,7 +85,7 @@ extern struct app_screen scr_model, scr_rend; struct font; extern struct font *uifont; -extern uint32_t *framebuf; +extern uint32_t *framebuf, *rendbuf; extern struct scene *scn; diff --git a/src/rend.c b/src/rend.c new file mode 100644 index 0000000..09f7f97 --- /dev/null +++ b/src/rend.c @@ -0,0 +1,119 @@ +/* +RetroRay - integrated standalone vintage modeller/renderer +Copyright (C) 2023 John Tsiombikas + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#include "rend.h" +#include "rt.h" + +struct img_pixmap renderbuf; +struct img_pixmap dbgimg; + +static int rx, ry, rwidth, rheight; +static int roffs; +static int xstep, ystep; + +int rend_init(void) +{ + img_init(&renderbuf); + + img_init(&dbgimg); + img_load(&dbgimg, "data/foo.jpg"); + img_convert(&dbgimg, IMG_FMT_RGBA32); + + rx = ry = rwidth = rheight = roffs = 0; + return 0; +} + +void rend_destroy(void) +{ + img_destroy(&renderbuf); +} + +void rend_size(int xsz, int ysz) +{ + if(xsz != renderbuf.width || ysz != renderbuf.height) { + img_set_pixels(&renderbuf, xsz, ysz, IMG_FMT_RGBA32, 0); + } +} + +void rend_begin(int x, int y, int w, int h) +{ + int i; + uint32_t *ptr; + + if(w == 0 || h == 0) { + rx = ry = 0; + rwidth = renderbuf.width; + rheight = renderbuf.height; + } else { + rx = x; + ry = y; + rwidth = w; + rheight = h; + } + roffs = ry * renderbuf.width + rx; + + xstep = rwidth; + ystep = rheight; + + ptr = (uint32_t*)renderbuf.pixels + roffs; + for(i=0; i>= 1; + ystep >>= 1; + + if((xstep | ystep) >= 1) { + return 1; + } + return 0; +} diff --git a/src/rend.h b/src/rend.h new file mode 100644 index 0000000..7508de4 --- /dev/null +++ b/src/rend.h @@ -0,0 +1,31 @@ +/* +RetroRay - integrated standalone vintage modeller/renderer +Copyright (C) 2023 John Tsiombikas + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#ifndef REND_H_ +#define REND_H_ + +#include "sizeint.h" +#include "imago2.h" + +extern struct img_pixmap renderbuf; + +int rend_init(void); +void rend_size(int xsz, int ysz); +void rend_begin(int x, int y, int w, int h); +int render(uint32_t *fb); + +#endif /* REND_H_ */ diff --git a/src/scr_mod.c b/src/scr_mod.c index 917747e..47f0119 100644 --- a/src/scr_mod.c +++ b/src/scr_mod.c @@ -23,13 +23,15 @@ along with this program. If not, see . #include "rt.h" #include "cmesh.h" #include "meshgen.h" +#include "font.h" +#include "rend.h" enum { TBN_NEW, TBN_OPEN, TBN_SAVE, TBN_SEP1, TBN_SEL, TBN_MOVE, TBN_ROT, TBN_SCALE, TBN_SEP2, TBN_ADD, TBN_RM, TBN_SEP3, TBN_UNION, TBN_ISECT, TBN_DIFF, TBN_SEP4, - TBN_MTL, TBN_REND, TBN_VIEWREND, TBN_SEP5, TBN_CFG, + TBN_MTL, TBN_REND, TBN_REND_AREA, TBN_VIEWREND, TBN_SEP5, TBN_CFG, NUM_TOOL_BUTTONS }; @@ -38,21 +40,21 @@ static const char *tbn_icon_name[] = { "sel", "move", "rot", "scale", 0, "add", "remove", 0, "union", "isect", "diff", 0, - "mtl", "rend", "viewrend", 0, "cfg" + "mtl", "rend", "rend-area", "viewrend", 0, "cfg" }; static int tbn_icon_pos[][2] = { {0,0}, {16,0}, {32,0}, {-1,-1}, {48,0}, {64,0}, {80,0}, {96,0}, {-1,-1}, {112,0}, {112,16}, {-1,-1}, {0,16}, {16,16}, {32,16}, {-1,-1}, - {48,16}, {64,16}, {80,16}, {-1,-1}, {96,16} + {48,16}, {64,16}, {64, 32}, {80,16}, {-1,-1}, {96,16} }; static int tbn_istool[] = { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, - 0, 0, 0, 0, 0 + 0, 0, 1, 0, 0, 0 }; static rtk_icon *tbn_icons[NUM_TOOL_BUTTONS]; static rtk_widget *tbn_buttons[NUM_TOOL_BUTTONS]; @@ -61,7 +63,7 @@ static rtk_widget *tbn_buttons[NUM_TOOL_BUTTONS]; enum { TOOL_SEL, TOOL_MOVE, TOOL_ROT, TOOL_SCALE, - TOOL_UNION, TOOL_ISECT, TOOL_DIFF, + TOOL_UNION, TOOL_ISECT, TOOL_DIFF, TOOL_REND_AREA, NUM_TOOLS }; static rtk_widget *tools[NUM_TOOLS]; @@ -109,12 +111,14 @@ static float view_matrix_inv[16], proj_matrix_inv[16]; static int viewport[4]; static cgm_ray pickray; -static int cur_tool; +static int cur_tool, prev_tool = -1; static int selobj = -1; static rtk_rect rband; static int rband_valid; +static int rendering; + static int mdl_init(void) { @@ -231,10 +235,18 @@ static void mdl_display(void) } } + if(rendering) { + if(render(framebuf)) { + app_redisplay(); + } else { + rendering = 0; + } + } + use_font(uifont); - dtx_position(560, 475); - dtx_color(1, 1, 0, 1); - dtx_printf("frame: %ld", frameno++); + dtx_position(550, 475); + dtx_color(0.3, 0.3, 0.1, 1); + dtx_printf("update: %ld", frameno++); if(rband_valid) { draw_rband(); @@ -349,6 +361,7 @@ static void mdl_mouse(int bn, int press, int x, int y) } if(press) { + rband_valid = 0; rband.x = x; rband.y = y; vpdrag |= (1 << bn); @@ -358,6 +371,15 @@ static void mdl_mouse(int bn, int press, int x, int y) if(rband_valid) { rband_valid = 0; + if(cur_tool == TOOL_REND_AREA) { + if(prev_tool >= 0) { + act_settool(prev_tool); + } + rendering = 1; + rend_size(win_width, win_height); + rend_begin(rband.x, rband.y, rband.width, rband.height); + } + } else if(bn == 0 && x == rband.x && y == rband.y) { primray(&pickray, x, y); if(scn_intersect(scn, &pickray, &hit)) { @@ -401,6 +423,7 @@ static void mdl_motion(int x, int y) if(mouse_state[0]) { switch(cur_tool) { case TOOL_SEL: + case TOOL_REND_AREA: if(rband.x != x || rband.y != y) { rband.width = x - rband.x; rband.height = y - rband.y; @@ -436,21 +459,21 @@ static void add_sphere(void) static void tbn_callback(rtk_widget *w, void *cls) { int id = (intptr_t)cls; - int idx; switch(id) { case TBN_SEL: case TBN_MOVE: case TBN_ROT: case TBN_SCALE: - idx = id - TBN_SEL; - if(0) { + act_settool(id - TBN_SEL); + break; case TBN_UNION: case TBN_ISECT: case TBN_DIFF: - idx = id - TBN_UNION + TOOL_UNION; - } - act_settool(idx); + act_settool(id - TBN_UNION + TOOL_UNION); + break; + case TBN_REND_AREA: + act_settool(TOOL_REND_AREA); break; case TBN_ADD: @@ -469,6 +492,7 @@ static void tbn_callback(rtk_widget *w, void *cls) static void act_settool(int tidx) { int i; + prev_tool = cur_tool; cur_tool = tidx; for(i=0; i