Remap calls to pad/mouse/keyboard to input
This commit is contained in:
parent
684587a3c3
commit
4c5630b0d4
|
@ -1,3 +1,12 @@
|
||||||
add_library(camera "src/camera.c" "src/pad.c" "src/mouse.c" "src/touch.c")
|
add_library(camera "src/camera.c" "src/pad.c" "src/mouse.c" "src/touch.c")
|
||||||
target_include_directories(camera PUBLIC "inc" PRIVATE "privinc")
|
target_include_directories(camera PUBLIC "inc" PRIVATE "privinc")
|
||||||
target_link_libraries(camera PUBLIC container mouse pad peripheral util PRIVATE gfx)
|
target_link_libraries(camera
|
||||||
|
PUBLIC
|
||||||
|
container
|
||||||
|
input
|
||||||
|
peripheral
|
||||||
|
util
|
||||||
|
PRIVATE
|
||||||
|
gfx
|
||||||
|
mouse
|
||||||
|
pad)
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
#ifndef CAMERA_H
|
#ifndef CAMERA_H
|
||||||
#define CAMERA_H
|
#define CAMERA_H
|
||||||
|
|
||||||
#include <mouse.h>
|
#include <input.h>
|
||||||
#include <pad.h>
|
|
||||||
#include <peripheral.h>
|
#include <peripheral.h>
|
||||||
#include <util.h>
|
#include <util.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
@ -50,7 +49,7 @@ struct camera
|
||||||
|
|
||||||
extern struct sprite cursor_sprite;
|
extern struct sprite cursor_sprite;
|
||||||
|
|
||||||
void camera_update(struct camera *cam, const union peripheral *p);
|
void camera_update(struct camera *cam, const union peripheral *p, const struct input *in);
|
||||||
bool camera_translate(const struct camera *cam, const struct util_rect *dim, short *x, short *y);
|
bool camera_translate(const struct camera *cam, const struct util_rect *dim, short *x, short *y);
|
||||||
void cursor_init(struct cursor *c);
|
void cursor_init(struct cursor *c);
|
||||||
bool cursor_collision(const struct camera *cam, const struct util_rect *d);
|
bool cursor_collision(const struct camera *cam, const struct util_rect *d);
|
||||||
|
|
|
@ -2,6 +2,9 @@
|
||||||
#define CAMERA_PRIVATE_H
|
#define CAMERA_PRIVATE_H
|
||||||
|
|
||||||
#include <camera.h>
|
#include <camera.h>
|
||||||
|
#include <input.h>
|
||||||
|
#include <mouse.h>
|
||||||
|
#include <pad.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C"
|
extern "C"
|
||||||
|
@ -15,9 +18,11 @@ enum
|
||||||
};
|
};
|
||||||
|
|
||||||
void camera_update_pos(struct camera *cam);
|
void camera_update_pos(struct camera *cam);
|
||||||
void camera_update_pad(struct camera *cam, const struct pad *p);
|
void camera_update_pad(struct camera *cam, const struct pad *p,
|
||||||
|
const struct input *in);
|
||||||
void camera_update_mouse(struct camera *cam, const struct mouse *m);
|
void camera_update_mouse(struct camera *cam, const struct mouse *m);
|
||||||
void camera_update_touch(struct camera *cam, const struct mouse *m);
|
void camera_update_touch(struct camera *cam, const struct mouse *m,
|
||||||
|
const struct input *in);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,12 +124,13 @@ void cursor_set_pos_list(struct cursor *const c,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void camera_update(struct camera *const cam, const union peripheral *const p)
|
void camera_update(struct camera *const cam,
|
||||||
|
const union peripheral *const p, const struct input *const in)
|
||||||
{
|
{
|
||||||
switch (p->common.type)
|
switch (p->common.type)
|
||||||
{
|
{
|
||||||
case PERIPHERAL_TYPE_PAD:
|
case PERIPHERAL_TYPE_PAD:
|
||||||
camera_update_pad(cam, &p->pad.pad);
|
camera_update_pad(cam, &p->pad.pad, in);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PERIPHERAL_TYPE_KEYBOARD_MOUSE:
|
case PERIPHERAL_TYPE_KEYBOARD_MOUSE:
|
||||||
|
@ -137,7 +138,7 @@ void camera_update(struct camera *const cam, const union peripheral *const p)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PERIPHERAL_TYPE_TOUCH:
|
case PERIPHERAL_TYPE_TOUCH:
|
||||||
camera_update_touch(cam, &p->kbm.mouse);
|
camera_update_touch(cam, &p->kbm.mouse, in);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include <camera.h>
|
#include <camera.h>
|
||||||
#include <camera_private.h>
|
#include <camera_private.h>
|
||||||
|
#include <input.h>
|
||||||
#include <pad.h>
|
#include <pad.h>
|
||||||
#include <peripheral.h>
|
#include <peripheral.h>
|
||||||
#include <gfx.h>
|
#include <gfx.h>
|
||||||
|
@ -7,7 +8,8 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
static void cursor_update(struct camera *const cam, const struct pad *const p)
|
static void cursor_update(struct camera *const cam,
|
||||||
|
const struct pad *const p, const struct input *const in)
|
||||||
{
|
{
|
||||||
struct cursor *const c = &cam->cursor;
|
struct cursor *const c = &cam->cursor;
|
||||||
enum {STEP = 4};
|
enum {STEP = 4};
|
||||||
|
@ -16,29 +18,31 @@ static void cursor_update(struct camera *const cam, const struct pad *const p)
|
||||||
|| c->screen.last_h != screen_h)
|
|| c->screen.last_h != screen_h)
|
||||||
cursor_init(c);
|
cursor_init(c);
|
||||||
|
|
||||||
if (pad_pressed(p, PAD_KEY_LEFT)
|
if (input_pad_pressed(in, p, PAD_KEY_LEFT)
|
||||||
&& (c->x - STEP)
|
&& (c->x - STEP)
|
||||||
&& (!cam->x || c->x != c->x_init))
|
&& (!cam->x || c->x != c->x_init))
|
||||||
c->x -= STEP;
|
c->x -= STEP;
|
||||||
else if (pad_pressed(p, PAD_KEY_RIGHT)
|
else if (input_pad_pressed(in, p, PAD_KEY_RIGHT)
|
||||||
&& (c->x + STEP < screen_w)
|
&& (c->x + STEP < screen_w)
|
||||||
&& (c->x != c->x_init || cam->x <= -cam->dim.w))
|
&& (c->x != c->x_init || cam->x <= -cam->dim.w))
|
||||||
c->x += STEP;
|
c->x += STEP;
|
||||||
|
|
||||||
if (pad_pressed(p, PAD_KEY_UP)
|
if (input_pad_pressed(in, p, PAD_KEY_UP)
|
||||||
&& (c->y - STEP)
|
&& (c->y - STEP)
|
||||||
&& (c->y != c->y_init || !cam->y))
|
&& (c->y != c->y_init || !cam->y))
|
||||||
c->y -= STEP;
|
c->y -= STEP;
|
||||||
else if (pad_pressed(p, PAD_KEY_DOWN)
|
else if (input_pad_pressed(in, p, PAD_KEY_DOWN)
|
||||||
&& (c->y + STEP < screen_h)
|
&& (c->y + STEP < screen_h)
|
||||||
&& (c->y != c->y_init || cam->y <= -cam->dim.h))
|
&& (c->y != c->y_init || cam->y <= -cam->dim.h))
|
||||||
c->y += STEP;
|
c->y += STEP;
|
||||||
|
|
||||||
c->state = pad_pressed(p, PAD_KEY_A) || pad_pressed(p, PAD_KEY_B) ?
|
c->state = input_pad_pressed(in, p, PAD_KEY_A) ||
|
||||||
|
input_pad_pressed(in, p, PAD_KEY_B) ?
|
||||||
CURSOR_STATE_PRESSED: CURSOR_STATE_IDLE;
|
CURSOR_STATE_PRESSED: CURSOR_STATE_IDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_speed(struct camera *const cam, const struct pad *const p)
|
static void update_speed(struct camera *const cam,
|
||||||
|
const struct pad *const p, const struct input *const in)
|
||||||
{
|
{
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -52,14 +56,14 @@ static void update_speed(struct camera *const cam, const struct pad *const p)
|
||||||
if (c->x == c->x_init
|
if (c->x == c->x_init
|
||||||
&& (!cam->x_speed || ++cam->xt >= T_STEP))
|
&& (!cam->x_speed || ++cam->xt >= T_STEP))
|
||||||
{
|
{
|
||||||
if (pad_pressed(p, PAD_KEY_RIGHT))
|
if (input_pad_pressed(in, p, PAD_KEY_RIGHT))
|
||||||
{
|
{
|
||||||
if (cam->x_speed > 0)
|
if (cam->x_speed > 0)
|
||||||
cam->x_speed = -STEP;
|
cam->x_speed = -STEP;
|
||||||
else if (cam->x_speed - STEP >= -MAX_SPEED)
|
else if (cam->x_speed - STEP >= -MAX_SPEED)
|
||||||
cam->x_speed -= STEP;
|
cam->x_speed -= STEP;
|
||||||
}
|
}
|
||||||
else if (pad_pressed(p, PAD_KEY_LEFT))
|
else if (input_pad_pressed(in, p, PAD_KEY_LEFT))
|
||||||
{
|
{
|
||||||
if (cam->x_speed < 0)
|
if (cam->x_speed < 0)
|
||||||
cam->x_speed = STEP;
|
cam->x_speed = STEP;
|
||||||
|
@ -77,14 +81,14 @@ static void update_speed(struct camera *const cam, const struct pad *const p)
|
||||||
if (c->y == c->y_init
|
if (c->y == c->y_init
|
||||||
&& (!cam->y_speed || ++cam->yt >= T_STEP))
|
&& (!cam->y_speed || ++cam->yt >= T_STEP))
|
||||||
{
|
{
|
||||||
if (pad_pressed(p, PAD_KEY_DOWN))
|
if (input_pad_pressed(in, p, PAD_KEY_DOWN))
|
||||||
{
|
{
|
||||||
if (cam->y_speed > 0)
|
if (cam->y_speed > 0)
|
||||||
cam->y_speed = STEP;
|
cam->y_speed = STEP;
|
||||||
else if (cam->y_speed - STEP >= -MAX_SPEED)
|
else if (cam->y_speed - STEP >= -MAX_SPEED)
|
||||||
cam->y_speed -= STEP;
|
cam->y_speed -= STEP;
|
||||||
}
|
}
|
||||||
else if (pad_pressed(p, PAD_KEY_UP))
|
else if (input_pad_pressed(in, p, PAD_KEY_UP))
|
||||||
{
|
{
|
||||||
if (cam->y_speed < 0)
|
if (cam->y_speed < 0)
|
||||||
cam->y_speed = -STEP;
|
cam->y_speed = -STEP;
|
||||||
|
@ -119,7 +123,7 @@ static enum pad_key get_ref_key(struct cursor_pos_rt *const rt,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cursor_update_fixed(struct camera *const cam,
|
static void cursor_update_fixed(struct camera *const cam,
|
||||||
const struct pad *const p)
|
const struct pad *const p, const struct input *const in)
|
||||||
{
|
{
|
||||||
struct cursor *const c = &cam->cursor;
|
struct cursor *const c = &cam->cursor;
|
||||||
struct cursor_pos_rt *const rt = &c->rt;
|
struct cursor_pos_rt *const rt = &c->rt;
|
||||||
|
@ -129,7 +133,7 @@ static void cursor_update_fixed(struct camera *const cam,
|
||||||
{
|
{
|
||||||
const enum pad_key key = get_ref_key(rt, next);
|
const enum pad_key key = get_ref_key(rt, next);
|
||||||
|
|
||||||
if (pad_justpressed(p, key))
|
if (input_pad_justpressed(in, p, key))
|
||||||
rt->i = next;
|
rt->i = next;
|
||||||
}
|
}
|
||||||
else if (rt->i)
|
else if (rt->i)
|
||||||
|
@ -137,7 +141,7 @@ static void cursor_update_fixed(struct camera *const cam,
|
||||||
const size_t prev = rt->i - 1;
|
const size_t prev = rt->i - 1;
|
||||||
const enum pad_key key = get_ref_key(rt, prev);
|
const enum pad_key key = get_ref_key(rt, prev);
|
||||||
|
|
||||||
if (pad_justpressed(p, key))
|
if (input_pad_justpressed(in, p, key))
|
||||||
rt->i = prev;
|
rt->i = prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,14 +151,15 @@ static void cursor_update_fixed(struct camera *const cam,
|
||||||
c->y = cur->y;
|
c->y = cur->y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void camera_update_pad(struct camera *const cam, const struct pad *const p)
|
void camera_update_pad(struct camera *const cam, const struct pad *const p,
|
||||||
|
const struct input *const in)
|
||||||
{
|
{
|
||||||
if (cam->cursor.rt.list)
|
if (cam->cursor.rt.list)
|
||||||
cursor_update_fixed(cam, p);
|
cursor_update_fixed(cam, p, in);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cursor_update(cam, p);
|
cursor_update(cam, p, in);
|
||||||
update_speed(cam, p);
|
update_speed(cam, p, in);
|
||||||
camera_update_pos(cam);
|
camera_update_pos(cam);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,11 +13,12 @@ static void cursor_update(struct cursor *const c, const struct mouse *const m)
|
||||||
c->y = m->y;
|
c->y = m->y;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_speed(struct camera *const cam, const struct mouse *const m)
|
static void update_speed(struct camera *const cam, const struct mouse *const m,
|
||||||
|
const struct input *const in)
|
||||||
{
|
{
|
||||||
int *const sx = &cam->x_speed, *const sy = &cam->y_speed;
|
int *const sx = &cam->x_speed, *const sy = &cam->y_speed;
|
||||||
|
|
||||||
if (mouse_pressed(m, MOUSE_BUTTON_LEFT))
|
if (input_mouse_pressed(in, m, MOUSE_BUTTON_LEFT))
|
||||||
{
|
{
|
||||||
*sx = m->dx;
|
*sx = m->dx;
|
||||||
*sy = m->dy;
|
*sy = m->dy;
|
||||||
|
@ -42,9 +43,10 @@ static void update_speed(struct camera *const cam, const struct mouse *const m)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void camera_update_touch(struct camera *const cam, const struct mouse *const m)
|
void camera_update_touch(struct camera *const cam, const struct mouse *const m,
|
||||||
|
const struct input *const in)
|
||||||
{
|
{
|
||||||
cursor_update(&cam->cursor, m);
|
cursor_update(&cam->cursor, m);
|
||||||
update_speed(cam, m);
|
update_speed(cam, m, in);
|
||||||
camera_update_pos(cam);
|
camera_update_pos(cam);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,4 +9,4 @@ add_library(gui
|
||||||
"src/rounded_rect.c"
|
"src/rounded_rect.c"
|
||||||
)
|
)
|
||||||
target_include_directories(gui PUBLIC "inc" PRIVATE "privinc")
|
target_include_directories(gui PUBLIC "inc" PRIVATE "privinc")
|
||||||
target_link_libraries(gui PUBLIC camera gfx peripheral font)
|
target_link_libraries(gui PUBLIC camera gfx input peripheral font)
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <camera.h>
|
#include <camera.h>
|
||||||
#include <gfx.h>
|
#include <gfx.h>
|
||||||
|
#include <input.h>
|
||||||
#include <peripheral.h>
|
#include <peripheral.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -16,7 +17,7 @@ struct gui_common
|
||||||
{
|
{
|
||||||
void (*add_child)(struct gui_common *parent, struct gui_common *child);
|
void (*add_child)(struct gui_common *parent, struct gui_common *child);
|
||||||
int (*update)(struct gui_common *, const union peripheral *,
|
int (*update)(struct gui_common *, const union peripheral *,
|
||||||
const struct camera *);
|
const struct camera *, struct input *);
|
||||||
int (*render)(const struct gui_common *);
|
int (*render)(const struct gui_common *);
|
||||||
void (*get_dim)(const struct gui_common *, short *w, short *h);
|
void (*get_dim)(const struct gui_common *, short *w, short *h);
|
||||||
} *cb;
|
} *cb;
|
||||||
|
@ -29,7 +30,7 @@ struct gui_common
|
||||||
void gui_add_child(struct gui_common *parent, struct gui_common *child);
|
void gui_add_child(struct gui_common *parent, struct gui_common *child);
|
||||||
void gui_add_sibling(struct gui_common *g, struct gui_common *sibling);
|
void gui_add_sibling(struct gui_common *g, struct gui_common *sibling);
|
||||||
int gui_update(struct gui_common *g, const union peripheral *p,
|
int gui_update(struct gui_common *g, const union peripheral *p,
|
||||||
const struct camera *c);
|
const struct camera *c, struct input *in);
|
||||||
int gui_render(const struct gui_common *g);
|
int gui_render(const struct gui_common *g);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -2,6 +2,9 @@
|
||||||
#define GUI_PRIVATE_H
|
#define GUI_PRIVATE_H
|
||||||
|
|
||||||
#include <gui.h>
|
#include <gui.h>
|
||||||
|
#include <input.h>
|
||||||
|
#include <peripheral.h>
|
||||||
|
#include <camera.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C"
|
extern "C"
|
||||||
|
@ -9,6 +12,10 @@ extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void gui_coords(const struct gui_common *g, short *x, short *y);
|
void gui_coords(const struct gui_common *g, short *x, short *y);
|
||||||
|
bool gui_pressed(const struct gui_common *g, const struct input *in,
|
||||||
|
const union peripheral *p, const struct camera *cam, short w, short h);
|
||||||
|
bool gui_released(const struct gui_common *g, const union peripheral *p,
|
||||||
|
const struct camera *cam, short w, short h);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <gui_private.h>
|
#include <gui_private.h>
|
||||||
#include <camera.h>
|
#include <camera.h>
|
||||||
#include <gfx.h>
|
#include <gfx.h>
|
||||||
|
#include <input.h>
|
||||||
#include <mouse.h>
|
#include <mouse.h>
|
||||||
#include <pad.h>
|
#include <pad.h>
|
||||||
#include <peripheral.h>
|
#include <peripheral.h>
|
||||||
|
@ -37,47 +38,22 @@ static void get_dim(const struct gui_common *const g,
|
||||||
|
|
||||||
static bool pressed(const struct gui_button *const b,
|
static bool pressed(const struct gui_button *const b,
|
||||||
const union peripheral *const p,
|
const union peripheral *const p,
|
||||||
const struct camera *const cam)
|
const struct camera *const cam,
|
||||||
|
const struct input *const in)
|
||||||
{
|
{
|
||||||
bool check = false;
|
short w, h;
|
||||||
|
|
||||||
switch (p->common.type)
|
get_dim(&b->common, &w, &h);
|
||||||
{
|
return gui_pressed(&b->common, in, p, cam, w, h);
|
||||||
case PERIPHERAL_TYPE_PAD:
|
|
||||||
check = pad_justpressed(&p->pad.pad, PAD_KEY_A);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PERIPHERAL_TYPE_KEYBOARD_MOUSE:
|
|
||||||
check = mouse_justreleased(&p->kbm.mouse, MOUSE_BUTTON_LEFT);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PERIPHERAL_TYPE_TOUCH:
|
|
||||||
check = mouse_justpressed(&p->kbm.mouse, MOUSE_BUTTON_LEFT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (check)
|
|
||||||
{
|
|
||||||
short x, y;
|
|
||||||
struct util_rect d;
|
|
||||||
|
|
||||||
gui_coords(&b->common, &x, &y);
|
|
||||||
get_dim(&b->common, &d.w, &d.h);
|
|
||||||
d.x = x;
|
|
||||||
d.y = y;
|
|
||||||
|
|
||||||
return cursor_collision(cam, &d);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int update(struct gui_common *const g,
|
static int update(struct gui_common *const g,
|
||||||
const union peripheral *const p, const struct camera *const c)
|
const union peripheral *const p, const struct camera *const c,
|
||||||
|
struct input *const in)
|
||||||
{
|
{
|
||||||
struct gui_button *const b = (struct gui_button *)g;
|
struct gui_button *const b = (struct gui_button *)g;
|
||||||
|
|
||||||
if (pressed(b, p, c) && b->on_pressed)
|
if (pressed(b, p, c, in) && b->on_pressed)
|
||||||
b->on_pressed(b->arg);
|
b->on_pressed(b->arg);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include <gui/container.h>
|
#include <gui/container.h>
|
||||||
#include <gui.h>
|
#include <gui.h>
|
||||||
#include <camera.h>
|
#include <camera.h>
|
||||||
|
#include <input.h>
|
||||||
#include <peripheral.h>
|
#include <peripheral.h>
|
||||||
|
|
||||||
static void add_child(struct gui_common *const parent,
|
static void add_child(struct gui_common *const parent,
|
||||||
|
@ -52,7 +53,8 @@ static void get_dim(const struct gui_common *const g,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int update(struct gui_common *const g,
|
static int update(struct gui_common *const g,
|
||||||
const union peripheral *const p, const struct camera *const cam)
|
const union peripheral *const p, const struct camera *const cam,
|
||||||
|
struct input *const in)
|
||||||
{
|
{
|
||||||
struct gui_container *const c = (struct gui_container *)g;
|
struct gui_container *const c = (struct gui_container *)g;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
#include <gui.h>
|
#include <gui.h>
|
||||||
|
#include <camera.h>
|
||||||
|
#include <input.h>
|
||||||
|
#include <peripheral.h>
|
||||||
|
|
||||||
static void get_centered(const struct gui_common *const g,
|
static void get_centered(const struct gui_common *const g,
|
||||||
short *const x, short *const y)
|
short *const x, short *const y)
|
||||||
|
@ -51,6 +54,79 @@ void gui_coords(const struct gui_common *const g, short *const x,
|
||||||
get_centered(g, x, y);
|
get_centered(g, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool check_collision(const struct gui_common *const g,
|
||||||
|
const union peripheral *const p,
|
||||||
|
const struct camera *cam, const short w, const short h)
|
||||||
|
{
|
||||||
|
short x, y;
|
||||||
|
|
||||||
|
gui_coords(g, &x, &y);
|
||||||
|
|
||||||
|
const struct util_rect d =
|
||||||
|
{
|
||||||
|
.x = x,
|
||||||
|
.y = y,
|
||||||
|
.w = w,
|
||||||
|
.h = h
|
||||||
|
};
|
||||||
|
|
||||||
|
return cursor_collision(cam, &d);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool gui_pressed(const struct gui_common *const g,
|
||||||
|
const struct input *const in,
|
||||||
|
const union peripheral *const p,
|
||||||
|
const struct camera *cam, const short w, const short h)
|
||||||
|
{
|
||||||
|
bool check = false;
|
||||||
|
|
||||||
|
switch (p->common.type)
|
||||||
|
{
|
||||||
|
case PERIPHERAL_TYPE_PAD:
|
||||||
|
check = input_pad_justpressed(in, &p->pad.pad, PAD_KEY_A);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PERIPHERAL_TYPE_KEYBOARD_MOUSE:
|
||||||
|
/* Fall through. */
|
||||||
|
case PERIPHERAL_TYPE_TOUCH:
|
||||||
|
check = input_mouse_justreleased(in, &p->kbm.mouse,
|
||||||
|
MOUSE_BUTTON_LEFT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (check)
|
||||||
|
return check_collision(g, p, cam, w, h);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool gui_released(const struct gui_common *const g,
|
||||||
|
const union peripheral *const p,
|
||||||
|
const struct camera *cam, const short w, const short h)
|
||||||
|
{
|
||||||
|
bool check = false;
|
||||||
|
|
||||||
|
switch (p->common.type)
|
||||||
|
{
|
||||||
|
case PERIPHERAL_TYPE_PAD:
|
||||||
|
check = pad_justpressed(&p->pad.pad, PAD_KEY_A);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PERIPHERAL_TYPE_KEYBOARD_MOUSE:
|
||||||
|
/* Fall through. */
|
||||||
|
case PERIPHERAL_TYPE_TOUCH:
|
||||||
|
check = mouse_justreleased(&p->kbm.mouse,
|
||||||
|
MOUSE_BUTTON_LEFT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (check)
|
||||||
|
return !check_collision(g, p, cam, w, h);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void gui_add_sibling(struct gui_common *const g,
|
void gui_add_sibling(struct gui_common *const g,
|
||||||
struct gui_common *const s)
|
struct gui_common *const s)
|
||||||
{
|
{
|
||||||
|
@ -77,16 +153,16 @@ void gui_add_child(struct gui_common *const p,
|
||||||
}
|
}
|
||||||
|
|
||||||
int gui_update(struct gui_common *const g, const union peripheral *const p,
|
int gui_update(struct gui_common *const g, const union peripheral *const p,
|
||||||
const struct camera *const c)
|
const struct camera *const c, struct input *const in)
|
||||||
{
|
{
|
||||||
if (g->child && gui_update(g->child, p, c))
|
if (g->child && gui_update(g->child, p, c, in))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (g->cb && g->cb->update && g->cb->update(g, p, c))
|
if (g->cb && g->cb->update && g->cb->update(g, p, c, in))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (struct gui_common *s = g->sibling; s; s = s->sibling)
|
for (struct gui_common *s = g->sibling; s; s = s->sibling)
|
||||||
if (gui_update(s, p, c))
|
if (gui_update(s, p, c, in))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -5,4 +5,4 @@ add_library(menu
|
||||||
"src/main_menu.c"
|
"src/main_menu.c"
|
||||||
)
|
)
|
||||||
target_include_directories(menu PUBLIC "inc" PRIVATE "privinc")
|
target_include_directories(menu PUBLIC "inc" PRIVATE "privinc")
|
||||||
target_link_libraries(menu PRIVATE camera game gfx gui system)
|
target_link_libraries(menu PRIVATE camera game gfx gui input system)
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define MENU_PRIVATE_H
|
#define MENU_PRIVATE_H
|
||||||
|
|
||||||
#include <camera.h>
|
#include <camera.h>
|
||||||
|
#include <input.h>
|
||||||
#include <peripheral.h>
|
#include <peripheral.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
@ -14,6 +15,7 @@ struct menu_common
|
||||||
{
|
{
|
||||||
struct camera cam;
|
struct camera cam;
|
||||||
union peripheral p;
|
union peripheral p;
|
||||||
|
struct input in;
|
||||||
};
|
};
|
||||||
|
|
||||||
int menu_update(struct menu_common *c,
|
int menu_update(struct menu_common *c,
|
||||||
|
|
|
@ -23,8 +23,8 @@ static int update(struct menu_common *const c, void *const arg)
|
||||||
m->r.w = screen_w / 2;
|
m->r.w = screen_w / 2;
|
||||||
m->r.h = screen_h / 2;
|
m->r.h = screen_h / 2;
|
||||||
|
|
||||||
if (gui_update(&m->cnt.common, &c->p, &c->cam)
|
if (gui_update(&m->cnt.common, &c->p, &c->cam, &c->in)
|
||||||
|| gui_update(&m->bcnt.common, &c->p, &c->cam))
|
|| gui_update(&m->bcnt.common, &c->p, &c->cam, &c->in))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -16,7 +16,7 @@ static int update(struct menu_common *const c, void *const arg)
|
||||||
{
|
{
|
||||||
struct menu_hostjoin *const m = arg;
|
struct menu_hostjoin *const m = arg;
|
||||||
|
|
||||||
if (gui_update(&m->cnt.common, &c->p, &c->cam))
|
if (gui_update(&m->cnt.common, &c->p, &c->cam, &c->in))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -18,7 +18,7 @@ static int update(struct menu_common *const c, void *const arg)
|
||||||
{
|
{
|
||||||
struct main_menu *const m = arg;
|
struct main_menu *const m = arg;
|
||||||
|
|
||||||
if (gui_update(&m->play.common, &c->p, &c->cam))
|
if (gui_update(&m->play.common, &c->p, &c->cam, &c->in))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <camera.h>
|
#include <camera.h>
|
||||||
#include <game.h>
|
#include <game.h>
|
||||||
#include <gfx.h>
|
#include <gfx.h>
|
||||||
|
#include <input.h>
|
||||||
#include <peripheral.h>
|
#include <peripheral.h>
|
||||||
#include <system.h>
|
#include <system.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
@ -19,7 +20,8 @@ int menu_update(struct menu_common *const c,
|
||||||
{
|
{
|
||||||
system_loop();
|
system_loop();
|
||||||
peripheral_update(&c->p);
|
peripheral_update(&c->p);
|
||||||
camera_update(&c->cam, &c->p);
|
input_update(&c->in, &c->p);
|
||||||
|
camera_update(&c->cam, &c->p, &c->in);
|
||||||
|
|
||||||
if (update && update(c, arg))
|
if (update && update(c, arg))
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -32,6 +34,8 @@ int menu_update(struct menu_common *const c,
|
||||||
|
|
||||||
if (render && render(c, arg))
|
if (render && render(c, arg))
|
||||||
return -1;
|
return -1;
|
||||||
|
else if (input_render(&c->in, &c->p))
|
||||||
|
return -1;
|
||||||
|
|
||||||
switch (c->p.common.type)
|
switch (c->p.common.type)
|
||||||
{
|
{
|
||||||
|
|
|
@ -56,6 +56,7 @@ UTIL_STATIC_ASSERT(!offsetof(struct peripheral_kbm, common),
|
||||||
"unexpected offsetof for struct peripheral_kbm");
|
"unexpected offsetof for struct peripheral_kbm");
|
||||||
|
|
||||||
void peripheral_init(const struct peripheral_cfg *cfg, union peripheral *p);
|
void peripheral_init(const struct peripheral_cfg *cfg, union peripheral *p);
|
||||||
|
void peripheral_input_set(union peripheral *p, void (*cb)(char, void *));
|
||||||
void peripheral_update(union peripheral *p);
|
void peripheral_update(union peripheral *p);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -11,6 +11,7 @@ target_link_libraries(player
|
||||||
gfx
|
gfx
|
||||||
keyboard
|
keyboard
|
||||||
instance
|
instance
|
||||||
|
input
|
||||||
mouse
|
mouse
|
||||||
pad
|
pad
|
||||||
resource
|
resource
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <camera.h>
|
#include <camera.h>
|
||||||
#include <keyboard.h>
|
#include <keyboard.h>
|
||||||
#include <instance.h>
|
#include <instance.h>
|
||||||
|
#include <input.h>
|
||||||
#include <mouse.h>
|
#include <mouse.h>
|
||||||
#include <pad.h>
|
#include <pad.h>
|
||||||
#include <peripheral.h>
|
#include <peripheral.h>
|
||||||
|
@ -32,6 +33,7 @@ struct human_player
|
||||||
struct player pl;
|
struct player pl;
|
||||||
struct camera cam;
|
struct camera cam;
|
||||||
union peripheral periph;
|
union peripheral periph;
|
||||||
|
struct input in;
|
||||||
|
|
||||||
struct sel_instance
|
struct sel_instance
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <gfx.h>
|
#include <gfx.h>
|
||||||
#include <gui.h>
|
#include <gui.h>
|
||||||
#include <instance.h>
|
#include <instance.h>
|
||||||
|
#include <input.h>
|
||||||
#include <keyboard.h>
|
#include <keyboard.h>
|
||||||
#include <pad.h>
|
#include <pad.h>
|
||||||
#include <resource.h>
|
#include <resource.h>
|
||||||
|
@ -542,26 +543,28 @@ static void update_target(struct human_player *const h)
|
||||||
static void update_from_pad(struct human_player *const h,
|
static void update_from_pad(struct human_player *const h,
|
||||||
struct player_others *const o)
|
struct player_others *const o)
|
||||||
{
|
{
|
||||||
struct pad *const p = &h->periph.pad.pad;
|
const struct pad *const p = &h->periph.pad.pad;
|
||||||
|
const struct input *const in = &h->in;
|
||||||
|
|
||||||
if (pad_justpressed(p, PAD_KEY_A))
|
if (input_pad_justpressed(in, p, PAD_KEY_A))
|
||||||
select_instances(h, o, false, false);
|
select_instances(h, o, false, false);
|
||||||
else if (pad_justpressed(p, PAD_KEY_B))
|
else if (input_pad_justpressed(in, p, PAD_KEY_B))
|
||||||
move_units(h, o);
|
move_units(h, o);
|
||||||
else if (pad_justpressed(p, PAD_KEY_C))
|
else if (input_pad_justpressed(in, p, PAD_KEY_C))
|
||||||
deselect_instances(h);
|
deselect_instances(h);
|
||||||
else if (pad_justpressed(p, PAD_KEY_E))
|
else if (input_pad_justpressed(in, p, PAD_KEY_E))
|
||||||
h->top_gui ^= true;
|
h->top_gui ^= true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_from_touch(struct human_player *const h,
|
static void update_from_touch(struct human_player *const h,
|
||||||
struct player_others *const o)
|
struct player_others *const o)
|
||||||
{
|
{
|
||||||
struct mouse *const m = &h->periph.kbm.mouse;
|
const struct mouse *const m = &h->periph.kbm.mouse;
|
||||||
|
const struct input *const in = &h->in;
|
||||||
struct peripheral_kbm *const kbm = &h->periph.kbm;
|
struct peripheral_kbm *const kbm = &h->periph.kbm;
|
||||||
bool *const pan = &h->cam.pan;
|
bool *const pan = &h->cam.pan;
|
||||||
|
|
||||||
if (mouse_pressed(m, MOUSE_BUTTON_LEFT) && !*pan)
|
if (input_mouse_pressed(in, m, MOUSE_BUTTON_LEFT) && !*pan)
|
||||||
{
|
{
|
||||||
enum {LONG_PRESS_THRESHOLD = 30};
|
enum {LONG_PRESS_THRESHOLD = 30};
|
||||||
|
|
||||||
|
@ -573,7 +576,7 @@ static void update_from_touch(struct human_player *const h,
|
||||||
deselect_instances(h);
|
deselect_instances(h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (mouse_justreleased(m, MOUSE_BUTTON_LEFT))
|
else if (input_mouse_justreleased(in, m, MOUSE_BUTTON_LEFT))
|
||||||
{
|
{
|
||||||
if (!*pan && !select_instances(h, o, false, true))
|
if (!*pan && !select_instances(h, o, false, true))
|
||||||
move_units(h, o);
|
move_units(h, o);
|
||||||
|
@ -587,19 +590,22 @@ static void update_from_touch(struct human_player *const h,
|
||||||
static void update_from_keyboard_mouse(struct human_player *const h,
|
static void update_from_keyboard_mouse(struct human_player *const h,
|
||||||
struct player_others *const o)
|
struct player_others *const o)
|
||||||
{
|
{
|
||||||
struct mouse *const m = &h->periph.kbm.mouse;
|
const struct mouse *const m = &h->periph.kbm.mouse;
|
||||||
struct keyboard *const k = &h->periph.kbm.keyboard;
|
const struct keyboard *const k = &h->periph.kbm.keyboard;
|
||||||
|
const struct input *const in = &h->in;
|
||||||
|
|
||||||
if (mouse_justreleased(m, MOUSE_BUTTON_LEFT))
|
if (input_mouse_justreleased(in, m, MOUSE_BUTTON_LEFT))
|
||||||
{
|
{
|
||||||
const bool shift_pressed =
|
const bool shift_pressed =
|
||||||
keyboard_pressed(k, &KEYBOARD_COMBO(KEYBOARD_KEY_LSHIFT))
|
input_keyboard_pressed(in, k,
|
||||||
|| keyboard_pressed(k, &KEYBOARD_COMBO(KEYBOARD_KEY_RSHIFT));
|
&KEYBOARD_COMBO(KEYBOARD_KEY_LSHIFT))
|
||||||
|
|| input_keyboard_pressed(in, k,
|
||||||
|
&KEYBOARD_COMBO(KEYBOARD_KEY_RSHIFT));
|
||||||
|
|
||||||
if (!select_instances(h, o, !shift_pressed, false))
|
if (!select_instances(h, o, !shift_pressed, false))
|
||||||
deselect_instances(h);
|
deselect_instances(h);
|
||||||
}
|
}
|
||||||
else if (mouse_justreleased(m, MOUSE_BUTTON_RIGHT))
|
else if (input_mouse_justreleased(in, m, MOUSE_BUTTON_RIGHT))
|
||||||
move_units(h, o);
|
move_units(h, o);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -614,6 +620,7 @@ void human_player_update(struct human_player *const h,
|
||||||
update_selected(h);
|
update_selected(h);
|
||||||
update_target(h);
|
update_target(h);
|
||||||
peripheral_update(&h->periph);
|
peripheral_update(&h->periph);
|
||||||
|
input_update(&h->in, &h->periph);
|
||||||
|
|
||||||
switch (h->periph.common.type)
|
switch (h->periph.common.type)
|
||||||
{
|
{
|
||||||
|
@ -630,7 +637,7 @@ void human_player_update(struct human_player *const h,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
camera_update(&h->cam, &h->periph);
|
camera_update(&h->cam, &h->periph, &h->in);
|
||||||
player_update(p);
|
player_update(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -702,7 +709,8 @@ int human_player_render(const struct human_player *const h,
|
||||||
|| render_own_units(h)
|
|| render_own_units(h)
|
||||||
|| render_own_buildings(h)
|
|| render_own_buildings(h)
|
||||||
|| render_resources(h, o->res, o->n_res)
|
|| render_resources(h, o->res, o->n_res)
|
||||||
|| human_player_gui_render(h))
|
|| human_player_gui_render(h)
|
||||||
|
|| input_render(&h->in, &h->periph))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
switch (h->periph.common.type)
|
switch (h->periph.common.type)
|
||||||
|
|
Loading…
Reference in New Issue