From d6c18f77cb710c5e4069fd12fde0dbed76f3a131 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Sat, 10 Jun 2023 12:11:35 +0300 Subject: [PATCH] toggle buttons and tools --- src/gaw/gaw.h | 2 ++ src/gaw/gawswtnl.c | 6 ++++++ src/gaw/gawswtnl.h | 2 ++ src/rtk.c | 20 +++++++++++++++++--- src/rtk.h | 13 ++++++++++++- src/rtk_impl.h | 1 + src/scr_mod.c | 44 +++++++++++++++++++++++++++++++++++++++----- 7 files changed, 79 insertions(+), 9 deletions(-) diff --git a/src/gaw/gaw.h b/src/gaw/gaw.h index c43b648..fcb19e9 100644 --- a/src/gaw/gaw.h +++ b/src/gaw/gaw.h @@ -123,6 +123,8 @@ void gaw_depth_func(int func); void gaw_blend_func(int src, int dest); void gaw_alpha_func(int func, float ref); +void gaw_zoffset(float offs); + void gaw_clear_color(float r, float g, float b, float a); void gaw_clear(unsigned int flags); void gaw_depth_mask(int mask); diff --git a/src/gaw/gawswtnl.c b/src/gaw/gawswtnl.c index 5e55621..4930e09 100644 --- a/src/gaw/gawswtnl.c +++ b/src/gaw/gawswtnl.c @@ -316,6 +316,11 @@ void gaw_alpha_func(int func, float ref) /* TODO */ } +void gaw_zoffset(float offs) +{ + st.zoffs = offs; +} + #define CLAMP(x, a, b) ((x) < (a) ? (a) : ((x) > (b) ? (b) : (x))) void gaw_clear_color(float r, float g, float b, float a) @@ -535,6 +540,7 @@ void gaw_draw_indexed(int prim, const unsigned int *idxarr, int nidx) float oow = 1.0f / v[i].w; v[i].x *= oow; v[i].y *= oow; + v[i].z += st.zoffs; if(st.opt & (1 << GAW_DEPTH_TEST)) { v[i].z *= oow; } diff --git a/src/gaw/gawswtnl.h b/src/gaw/gawswtnl.h index 7510f16..11d462b 100644 --- a/src/gaw/gawswtnl.h +++ b/src/gaw/gawswtnl.h @@ -89,6 +89,8 @@ struct gaw_state { int vertex_nelem, texcoord_nelem, color_nelem; int vertex_stride, normal_stride, texcoord_stride, color_stride; + float zoffs; + /* immediate mode */ int imm_prim; int imm_numv, imm_pcount; diff --git a/src/rtk.c b/src/rtk.c index 88ce5af..c9de38f 100644 --- a/src/rtk.c +++ b/src/rtk.c @@ -194,6 +194,11 @@ int rtk_win_has(rtk_widget *par, rtk_widget *child) } /* --- button functions --- */ +void rtk_bn_mode(rtk_widget *w, int mode) +{ + RTK_ASSERT_TYPE(w, RTK_BUTTON); + w->bn.mode = mode; +} void rtk_bn_set_icon(rtk_widget *w, rtk_icon *icon) { @@ -584,13 +589,20 @@ static void draw_window(rtk_widget *w) static void draw_button(rtk_widget *w) { + int pressed; rtk_rect rect; widget_rect(w, &rect); abs_pos(w, &rect.x, &rect.y); + if(w->bn.mode == RTK_TOGGLEBN) { + pressed = w->any.value; + } else { + pressed = w->any.flags & PRESS; + } + if(rect.width > 2 && rect.height > 2) { - draw_frame(&rect, w->any.flags & PRESS ? FRM_INSET : FRM_OUTSET); + draw_frame(&rect, pressed ? FRM_INSET : FRM_OUTSET); rect.x++; rect.y++; @@ -677,9 +689,11 @@ static void setpress(rtk_widget *w) static void click(rtk_widget *w, int x, int y) { switch(w->type) { - case RTK_CHECKBOX: - w->any.value ^= 1; case RTK_BUTTON: + if(w->bn.mode == RTK_TOGGLEBN) { + case RTK_CHECKBOX: + w->any.value ^= 1; + } if(w->any.cbfunc) { w->any.cbfunc(w, w->any.cbcls); } diff --git a/src/rtk.h b/src/rtk.h index cdb128e..25bd5cd 100644 --- a/src/rtk.h +++ b/src/rtk.h @@ -2,9 +2,19 @@ #define RTK_H_ /* widget type */ -enum { RTK_ANY, RTK_WIN, RTK_BUTTON, RTK_LABEL, RTK_CHECKBOX, RTK_SLIDER, RTK_SEP }; +enum { + RTK_ANY, + RTK_WIN, + RTK_BUTTON, + RTK_LABEL, + RTK_CHECKBOX, + RTK_SLIDER, + RTK_SEP +}; /* window layout */ enum { RTK_NONE, RTK_VBOX, RTK_HBOX }; +/* button mode */ +enum { RTK_PUSHBN, RTK_TOGGLEBN }; typedef struct rtk_screen rtk_screen; typedef union rtk_widget rtk_widget; @@ -64,6 +74,7 @@ void rtk_win_rm(rtk_widget *par, rtk_widget *child); int rtk_win_has(rtk_widget *par, rtk_widget *child); /* button functions */ +void rtk_bn_mode(rtk_widget *w, int mode); void rtk_bn_set_icon(rtk_widget *w, rtk_icon *icon); rtk_icon *rtk_bn_get_icon(rtk_widget *w); diff --git a/src/rtk_impl.h b/src/rtk_impl.h index 5e65ac2..1b53c5e 100644 --- a/src/rtk_impl.h +++ b/src/rtk_impl.h @@ -33,6 +33,7 @@ typedef struct rtk_window { typedef struct rtk_button { rtk_any any; + int mode; rtk_icon *icon; } rtk_button; diff --git a/src/scr_mod.c b/src/scr_mod.c index 8107650..2153663 100644 --- a/src/scr_mod.c +++ b/src/scr_mod.c @@ -43,9 +43,12 @@ static int tbn_icon_pos[][2] = { {48,16}, {64,16}, {80,16}, {-1,-1}, {96,16} }; static rtk_icon *tbn_icons[NUM_TOOL_BUTTONS]; +static rtk_widget *tbn_buttons[NUM_TOOL_BUTTONS]; #define TOOLBAR_HEIGHT 26 +enum {TOOL_SEL, TOOL_MOVE, TOOL_ROT, TOOL_SCALE, NUM_TOOLS}; + static int mdl_init(void); static void mdl_destroy(void); @@ -75,6 +78,9 @@ static struct cmesh *mesh_sph; static float cam_theta, cam_phi = 20, cam_dist = 8; +static int tool; +static int selobj = -1; + static int mdl_init(void) { @@ -106,7 +112,14 @@ static int mdl_init(void) if(!(w = rtk_create_iconbutton(toolbar, tbn_icons[i], 0))) { return -1; } + tbn_buttons[i] = w; rtk_set_callback(w, tbn_callback, (void*)i); + if(i >= TBN_SEL && i <= TBN_SCALE) { + rtk_bn_mode(w, RTK_TOGGLEBN); + } + if(i == TBN_SEL) { + rtk_set_value(w, 1); + } } } @@ -157,8 +170,6 @@ static void mdl_display(void) draw_grid(); - gaw_poly_wire(); - num = scn_num_objects(scn); for(i=0; iobjects[i]; @@ -172,7 +183,17 @@ static void mdl_display(void) case OBJ_SPHERE: sph = (struct sphere*)obj; gaw_scale(sph->rad, sph->rad, sph->rad); + gaw_zoffset(0.1); + cmesh_draw(mesh_sph); + gaw_zoffset(0); + + gaw_save(); + gaw_disable(GAW_LIGHTING); + gaw_poly_wire(); + gaw_color3f(0, 1, 0); cmesh_draw(mesh_sph); + gaw_poly_gouraud(); + gaw_restore(); break; default: @@ -182,8 +203,6 @@ static void mdl_display(void) gaw_pop_matrix(); } - gaw_poly_gouraud(); - gaw_viewport(0, 0, win_width, win_height); } @@ -284,11 +303,26 @@ static void add_sphere(void) static void tbn_callback(rtk_widget *w, void *cls) { - int id = (intptr_t)cls; + int i, id = (intptr_t)cls; + int idx; switch(id) { + case TBN_SEL: + case TBN_MOVE: + case TBN_ROT: + case TBN_SCALE: + tool = id - TBN_SEL; + for(i=0; i