Added proper hit test with rotation and pivoting

This commit is contained in:
2026-05-20 20:56:25 +01:00
parent 75b1bc5dbd
commit 6ff16e3db4
7 changed files with 181 additions and 35 deletions
+104 -5
View File
@@ -317,7 +317,9 @@ static mrb_value ElementText_init(mrb_state *mrb, mrb_value self) {
return mrb_nil_value();
}
float x = 0, y = 0, z = 0, rotation = 0, scale_x = 1, scale_y = 1, alpha = 1;
float x = 0, y = 0, z = 0, rotation = 0;
float scale_x = 1, scale_y = 1, alpha = 1;
float pivot_x = 0.5, pivot_y = 0.5;
bool click_through = false;
if (!mrb_nil_p(kwargs)) {
mrb_value pos_hash = HASH_GET(kwargs, position);
@@ -332,6 +334,12 @@ static mrb_value ElementText_init(mrb_state *mrb, mrb_value self) {
HASH_FLOAT(scale_hash, y, scale_y);
}
mrb_value pivot_hash = HASH_GET(kwargs, pivot);
if (!mrb_nil_p(pivot_hash)) {
HASH_FLOAT(pivot_hash, x, pivot_x);
HASH_FLOAT(pivot_hash, y, pivot_y);
}
HASH_FLOAT(kwargs, z, z);
HASH_FLOAT(kwargs, rotation, rotation);
HASH_FLOAT(kwargs, alpha, alpha);
@@ -351,6 +359,7 @@ static mrb_value ElementText_init(mrb_state *mrb, mrb_value self) {
element->position = {x, y};
element->scale = {scale_x, scale_y};
element->rotation = rotation;
element->pivot = {pivot_x, pivot_y};
element->alpha = alpha;
element->z = z;
element->click_through = click_through;
@@ -533,6 +542,28 @@ static mrb_value element_text_rotation_set(mrb_state *mrb, mrb_value self) {
return mrb_nil_value();
}
static mrb_value element_text_pivot_get(mrb_state *mrb, mrb_value self) {
uint64_t id = get_id_ElementText(mrb, self);
app::EText *element = (app::EText *)app::element_pool[id];
mrb_value pivot_hash = mrb_hash_new(mrb);
HASH_SET(pivot_hash, x, mrb_float_value(mrb, element->pivot.x));
HASH_SET(pivot_hash, y, mrb_float_value(mrb, element->pivot.y));
return pivot_hash;
}
static mrb_value element_text_pivot_set(mrb_state *mrb, mrb_value self) {
mrb_value pivot_hash;
mrb_get_args(mrb, "H", &pivot_hash);
uint64_t id = get_id_ElementText(mrb, self);
app::EText *element = (app::EText *)app::element_pool[id];
HASH_FLOAT(pivot_hash, x, element->pivot.x);
HASH_FLOAT(pivot_hash, y, element->pivot.y);
return mrb_nil_value();
}
static mrb_value element_text_scale_get(mrb_state *mrb, mrb_value self) {
uint64_t id = get_id_ElementText(mrb, self);
app::EText *element = (app::EText *)app::element_pool[id];
@@ -609,13 +640,13 @@ static mrb_value element_text_click_through_set(mrb_state *mrb, mrb_value self)
static mrb_value element_text_width(mrb_state *mrb, mrb_value self) {
uint64_t id = get_id_ElementText(mrb, self);
app::EText *element = (app::EText *)app::element_pool[id];
return mrb_float_value(mrb, element->size(&window).x);
return mrb_float_value(mrb, element->size().x);
}
static mrb_value element_text_height(mrb_state *mrb, mrb_value self) {
uint64_t id = get_id_ElementText(mrb, self);
app::EText *element = (app::EText *)app::element_pool[id];
return mrb_float_value(mrb, element->size(&window).y);
return mrb_float_value(mrb, element->size().y);
}
static void ElementRect_free(mrb_state *mrb, void *ptr) {
@@ -643,7 +674,8 @@ static mrb_value ElementRect_init(mrb_state *mrb, mrb_value self) {
mrb_value kwargs;
mrb_get_args(mrb, "ffi|H", &w, &h, &color_i, &kwargs);
float x = 0, y = 0, z = 0, rotation = 0, scale_x = 1, scale_y = 1, alpha = 1;
float x = 0, y = 0, z = 0, rotation = 0;
float scale_x = 1, scale_y = 1, alpha = 1, pivot_x = 0.5, pivot_y = 0.5;
bool click_through = false;
if (!mrb_nil_p(kwargs)) {
mrb_value pos_hash = HASH_GET(kwargs, position);
@@ -658,6 +690,12 @@ static mrb_value ElementRect_init(mrb_state *mrb, mrb_value self) {
HASH_FLOAT(scale_hash, y, scale_y);
}
mrb_value pivot_hash = HASH_GET(kwargs, pivot);
if (!mrb_nil_p(pivot_hash)) {
HASH_FLOAT(pivot_hash, x, pivot_x);
HASH_FLOAT(pivot_hash, y, pivot_y);
}
HASH_FLOAT(kwargs, z, z);
HASH_FLOAT(kwargs, rotation, rotation);
HASH_FLOAT(kwargs, alpha, alpha);
@@ -679,6 +717,7 @@ static mrb_value ElementRect_init(mrb_state *mrb, mrb_value self) {
element->position = {x, y};
element->scale = {scale_x, scale_y};
element->rotation = rotation;
element->pivot = {pivot_x, pivot_y};
element->alpha = alpha;
element->z = z;
element->click_through = click_through;
@@ -829,6 +868,28 @@ static mrb_value element_rect_rotation_set(mrb_state *mrb, mrb_value self) {
return mrb_nil_value();
}
static mrb_value element_rect_pivot_get(mrb_state *mrb, mrb_value self) {
uint64_t id = get_id_ElementRect(mrb, self);
app::ERect *element = (app::ERect *)app::element_pool[id];
mrb_value pivot_hash = mrb_hash_new(mrb);
HASH_SET(pivot_hash, x, mrb_float_value(mrb, element->pivot.x));
HASH_SET(pivot_hash, y, mrb_float_value(mrb, element->pivot.y));
return pivot_hash;
}
static mrb_value element_rect_pivot_set(mrb_state *mrb, mrb_value self) {
mrb_value pivot_hash;
mrb_get_args(mrb, "H", &pivot_hash);
uint64_t id = get_id_ElementRect(mrb, self);
app::ERect *element = (app::ERect *)app::element_pool[id];
HASH_FLOAT(pivot_hash, x, element->pivot.x);
HASH_FLOAT(pivot_hash, y, element->pivot.y);
return mrb_nil_value();
}
static mrb_value element_rect_scale_get(mrb_state *mrb, mrb_value self) {
uint64_t id = get_id_ElementRect(mrb, self);
app::ERect *element = (app::ERect *)app::element_pool[id];
@@ -938,7 +999,8 @@ static mrb_value ElementImage_init(mrb_state *mrb, mrb_value self) {
return mrb_nil_value();
}
float x = 0, y = 0, z = 0, rotation = 0, scale_x = 1, scale_y = 1, alpha = 1;
float x = 0, y = 0, z = 0, rotation = 0;
float scale_x = 1, scale_y = 1, alpha = 1, pivot_x = 0.5, pivot_y = 0.5;
bool click_through = false;
if (!mrb_nil_p(kwargs)) {
mrb_value pos_hash = HASH_GET(kwargs, position);
@@ -953,6 +1015,12 @@ static mrb_value ElementImage_init(mrb_state *mrb, mrb_value self) {
HASH_FLOAT(scale_hash, y, scale_y);
}
mrb_value pivot_hash = HASH_GET(kwargs, pivot);
if (!mrb_nil_p(pivot_hash)) {
HASH_FLOAT(pivot_hash, x, pivot_x);
HASH_FLOAT(pivot_hash, y, pivot_y);
}
HASH_FLOAT(kwargs, z, z);
HASH_FLOAT(kwargs, rotation, rotation);
HASH_FLOAT(kwargs, alpha, alpha);
@@ -965,6 +1033,7 @@ static mrb_value ElementImage_init(mrb_state *mrb, mrb_value self) {
element->position = {x, y};
element->scale = {scale_x, scale_y};
element->rotation = rotation;
element->pivot = {pivot_x, pivot_y};
element->alpha = alpha;
element->z = z;
element->click_through = click_through;
@@ -1098,6 +1167,28 @@ static mrb_value element_image_rotation_set(mrb_state *mrb, mrb_value self) {
return mrb_nil_value();
}
static mrb_value element_image_pivot_get(mrb_state *mrb, mrb_value self) {
uint64_t id = get_id_ElementImage(mrb, self);
app::EImage *element = (app::EImage *)app::element_pool[id];
mrb_value pivot_hash = mrb_hash_new(mrb);
HASH_SET(pivot_hash, x, mrb_float_value(mrb, element->pivot.x));
HASH_SET(pivot_hash, y, mrb_float_value(mrb, element->pivot.y));
return pivot_hash;
}
static mrb_value element_image_pivot_set(mrb_state *mrb, mrb_value self) {
mrb_value pivot_hash;
mrb_get_args(mrb, "H", &pivot_hash);
uint64_t id = get_id_ElementImage(mrb, self);
app::EImage *element = (app::EImage *)app::element_pool[id];
HASH_FLOAT(pivot_hash, x, element->pivot.x);
HASH_FLOAT(pivot_hash, y, element->pivot.y);
return mrb_nil_value();
}
static mrb_value element_image_scale_get(mrb_state *mrb, mrb_value self) {
uint64_t id = get_id_ElementImage(mrb, self);
app::EImage *element = (app::EImage *)app::element_pool[id];
@@ -1572,14 +1663,18 @@ inline void setup() {
ADD_METHOD(ElementText, "color", element_text_color_get, MRB_ARGS_NONE());
ADD_METHOD(ElementText, "font=", element_text_font_set, MRB_ARGS_REQ(1));
ADD_METHOD(ElementText, "font", element_text_font_get, MRB_ARGS_NONE());
#warning "Make text params a proper class instead of using a hash for text params"
ADD_METHOD(ElementText, "params", element_text_params, MRB_ARGS_NONE());
ADD_METHOD(ElementText, "params!", element_text_params_load, MRB_ARGS_NONE());
#warning "Make vector a proper class instead of using a hash for vectors"
ADD_METHOD(ElementText, "position=", element_text_position_set, MRB_ARGS_REQ(1));
ADD_METHOD(ElementText, "position", element_text_position_get, MRB_ARGS_NONE());
ADD_METHOD(ElementText, "scale=", element_text_scale_set, MRB_ARGS_REQ(1));
ADD_METHOD(ElementText, "scale", element_text_scale_get, MRB_ARGS_NONE());
ADD_METHOD(ElementText, "rotation=", element_text_rotation_set, MRB_ARGS_REQ(1));
ADD_METHOD(ElementText, "rotation", element_text_rotation_get, MRB_ARGS_NONE());
ADD_METHOD(ElementText, "pivot=", element_text_pivot_set, MRB_ARGS_REQ(1));
ADD_METHOD(ElementText, "pivot", element_text_pivot_get, MRB_ARGS_NONE());
ADD_METHOD(ElementText, "alpha=", element_text_alpha_set, MRB_ARGS_REQ(1));
ADD_METHOD(ElementText, "alpha", element_text_alpha_get, MRB_ARGS_NONE());
ADD_METHOD(ElementText, "z=", element_text_z_set, MRB_ARGS_REQ(1));
@@ -1608,6 +1703,8 @@ inline void setup() {
ADD_METHOD(ElementRect, "scale", element_rect_scale_get, MRB_ARGS_NONE());
ADD_METHOD(ElementRect, "rotation=", element_rect_rotation_set, MRB_ARGS_REQ(1));
ADD_METHOD(ElementRect, "rotation", element_rect_rotation_get, MRB_ARGS_NONE());
ADD_METHOD(ElementRect, "pivot=", element_rect_pivot_set, MRB_ARGS_REQ(1));
ADD_METHOD(ElementRect, "pivot", element_rect_pivot_get, MRB_ARGS_NONE());
ADD_METHOD(ElementRect, "alpha=", element_rect_alpha_set, MRB_ARGS_REQ(1));
ADD_METHOD(ElementRect, "alpha", element_rect_alpha_get, MRB_ARGS_NONE());
ADD_METHOD(ElementRect, "z=", element_rect_z_set, MRB_ARGS_REQ(1));
@@ -1630,6 +1727,8 @@ inline void setup() {
ADD_METHOD(ElementImage, "scale", element_image_scale_get, MRB_ARGS_NONE());
ADD_METHOD(ElementImage, "rotation=", element_image_rotation_set, MRB_ARGS_REQ(1));
ADD_METHOD(ElementImage, "rotation", element_image_rotation_get, MRB_ARGS_NONE());
ADD_METHOD(ElementImage, "pivot=", element_image_pivot_set, MRB_ARGS_REQ(1));
ADD_METHOD(ElementImage, "pivot", element_image_pivot_get, MRB_ARGS_NONE());
ADD_METHOD(ElementImage, "alpha=", element_image_alpha_set, MRB_ARGS_REQ(1));
ADD_METHOD(ElementImage, "alpha", element_image_alpha_get, MRB_ARGS_NONE());
ADD_METHOD(ElementImage, "z=", element_image_z_set, MRB_ARGS_REQ(1));
+1
View File
@@ -103,6 +103,7 @@ DEF_SYM(italic)
DEF_SYM(underline)
DEF_SYM(position)
DEF_SYM(rotation)
DEF_SYM(pivot)
DEF_SYM(scale)
DEF_SYM(alpha)
DEF_SYM(fps)