#ifndef OPENIMGUI_IMPL
extern float omg_cursorpos[2]; extern float omg_cursorpos_presuck[2]; extern int omg_cursor_has_been_sucked;
extern int omg_cursor_was_inside; extern float omg_buttonjump[2]; extern int omg_bstate_old;
extern int omg_udlr_old[4];
extern int omg_udlr[4];
extern int omg_cb; #endif
#ifndef OPENIMGUI_H
#define OPENIMGUI_H
#include <math.h>
#ifdef OPENIMGUI_IMPL
float omg_cursorpos[2]; float omg_cursorpos_presuck[2]; int omg_cursor_has_been_sucked;
int omg_cursor_was_inside; float omg_buttonjump[2]; int omg_bstate_old = 0;
int omg_udlr_old[4] = {0,0,0,0};
int omg_udlr[4];
int omg_cb; #endif
static inline float omg_sqrlinelength(float x1, float y1, float x2, float y2){
return ((x1-x2) * (x1-x2) + (y1-y2) * (y1-y2));
}
static inline float omg_clampf(float x){
return (x>1.0)?1.0: (x<0.0)?0.0:x;
}
static inline float omg_wrapf(float x){
float f = fmod(x, 1);
if(f<0.0) (f = 1.0 + f);
return f;
}
static inline void omg_update_keycursor(int _up, int _down, int _left, int _right, int bstate){
omg_cursor_was_inside = 0;
int up = _up && ! omg_udlr_old[0];
int down = _down && ! omg_udlr_old[1];
int left = _left && ! omg_udlr_old[2];
int right = _right && ! omg_udlr_old[3];
omg_udlr[0] = up;
omg_udlr[1] = down;
omg_udlr[2] = left;
omg_udlr[3] = right;
omg_udlr_old[0] = _up;
omg_udlr_old[1] = _down;
omg_udlr_old[2] = _left;
omg_udlr_old[3] = _right;
omg_cursor_has_been_sucked = 0;
omg_cursorpos_presuck[0] = omg_cursorpos[0];
omg_cursorpos_presuck[1] = omg_cursorpos[1];
if(up) omg_cursorpos[1] -= omg_buttonjump[1];
if(down) omg_cursorpos[1] += omg_buttonjump[1];
if(left) omg_cursorpos[0] -= omg_buttonjump[0];
if(right)omg_cursorpos[0] += omg_buttonjump[0];
omg_cursorpos[0] = omg_wrapf(omg_cursorpos[0]);
omg_cursorpos[1] = omg_wrapf(omg_cursorpos[1]);
omg_cursorpos_presuck[0] = omg_cursorpos[0];
omg_cursorpos_presuck[1] = omg_cursorpos[1];
omg_cb = 0;
if(bstate && !omg_bstate_old) omg_cb = 1;
else if (!bstate && omg_bstate_old) omg_cb = 2;
omg_bstate_old = bstate;
}
static inline void omg_update_mcursor(float ncx, float ncy, int bstate){
omg_cursor_has_been_sucked = 0;
omg_cursor_was_inside = 0;
omg_cursorpos[0] = ncx;
omg_cursorpos[1] = ncy;
omg_cursorpos[0] = omg_clampf(omg_cursorpos[0]);
omg_cursorpos[1] = omg_clampf(omg_cursorpos[1]);
omg_cursorpos_presuck[0] = -1;
omg_cursorpos_presuck[1] = -1;
omg_cb = 0;
if(bstate && !omg_bstate_old) omg_cb = 1;
else if (!bstate && omg_bstate_old) omg_cb = 2;
omg_bstate_old = bstate;
}
static inline int omg_boxtest(float x, float y, float xdim, float ydim, float cx, float cy){
if((x <= cx) &&
(x+xdim >= cx) &&
(y <= cy) &&
(y+ydim >= cy))
return 1;
return 0;
}
static inline int omg_box_retval(float x, float y, float xdim, float ydim){
if(omg_cursorpos_presuck[0] == -1)
return omg_boxtest(x,y,xdim,ydim, omg_cursorpos[0],omg_cursorpos[1]);
return omg_boxtest(x,y,xdim,ydim, omg_cursorpos_presuck[0],omg_cursorpos_presuck[1]);
}
static inline void omg_box_suck(float x, float y, float xdim, float ydim, int sucks, float buttonjumpx, float buttonjumpy){
if(omg_cursorpos_presuck[0] != -1 && sucks){ int btest = omg_boxtest(x,y,xdim,ydim, omg_cursorpos_presuck[0], omg_cursorpos_presuck[1]);
if(!omg_cursor_has_been_sucked){
omg_cursorpos[0] = x + xdim/2.0;
omg_cursorpos[1] = y + ydim/2.0;
omg_cursor_has_been_sucked = 1;
omg_buttonjump[0] = buttonjumpx;
omg_buttonjump[1] = buttonjumpy;
if(btest) omg_cursor_was_inside = 1;
} else if (
(!omg_cursor_was_inside && omg_sqrlinelength(x+xdim/2.0, y+ydim/2.0, omg_cursorpos_presuck[0], omg_cursorpos_presuck[1]) <
omg_sqrlinelength(omg_cursorpos[0], omg_cursorpos[1], omg_cursorpos_presuck[0], omg_cursorpos_presuck[1])
) || (!omg_cursor_was_inside && btest) ||
(
btest &&
omg_sqrlinelength(x+xdim/2.0, y+ydim/2.0, omg_cursorpos_presuck[0], omg_cursorpos_presuck[1]) <
omg_sqrlinelength(omg_cursorpos[0], omg_cursorpos[1], omg_cursorpos_presuck[0], omg_cursorpos_presuck[1])
)
){
omg_cursorpos[0] = x+xdim/2.0;
omg_cursorpos[1] = y+ydim/2.0;
omg_cursor_has_been_sucked = 1;
omg_buttonjump[0] = buttonjumpx;
omg_buttonjump[1] = buttonjumpy;
omg_cursor_was_inside = omg_boxtest(x,y,xdim,ydim, omg_cursorpos_presuck[0], omg_cursorpos_presuck[1]);
}
}
}
int omg_box(float x, float y, float xdim, float ydim, int sucks, float buttonjumpx, float buttonjumpy, int hints);
int omg_textbox(float x, float y, const char* text, int textsize, int sucks, float buttonjumpx, float buttonjumpy, int hints, int hintstext);
#endif