Added proper hit test with rotation and pivoting
This commit is contained in:
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user