Make pools with generations and bind mouse position logic
This commit is contained in:
@@ -4,10 +4,9 @@
|
||||
#include "app/app.h"
|
||||
|
||||
#warning "Define ==, eql?, hash for each class"
|
||||
#warning "Define and bind elements_at in Scene (same as click method already defined but without callback)"
|
||||
|
||||
namespace definitions {
|
||||
inline mrb_value wrap(mrb_state *mrb, RClass *cls, mrb_data_type *type, int id) {
|
||||
inline mrb_value wrap(mrb_state *mrb, RClass *cls, const mrb_data_type *type, uint64_t id) {
|
||||
RBasic *obj_b = mrb_obj_alloc(mrb, MRB_TT_DATA, cls);
|
||||
mrb_value obj = mrb_obj_value(obj_b);
|
||||
|
||||
@@ -21,7 +20,7 @@ inline mrb_value wrap(mrb_state *mrb, RClass *cls, mrb_data_type *type, int id)
|
||||
|
||||
static void Font_free(mrb_state *mrb, void *ptr) {
|
||||
UNUSED(mrb);
|
||||
int id = ((Wrapper *)ptr)->id;
|
||||
uint64_t id = ((Wrapper *)ptr)->id;
|
||||
font_pool.release(id);
|
||||
delete (Wrapper *)ptr;
|
||||
}
|
||||
@@ -58,7 +57,7 @@ static mrb_value Font_init(mrb_state *mrb, mrb_value self) {
|
||||
return self;
|
||||
}
|
||||
|
||||
inline int get_id_Font(mrb_state *mrb, mrb_value self) {
|
||||
inline uint64_t get_id_Font(mrb_state *mrb, mrb_value self) {
|
||||
Wrapper *wrapper;
|
||||
Data_Get_Struct(mrb, self, &Font_type, wrapper);
|
||||
return wrapper->id;
|
||||
@@ -66,7 +65,7 @@ inline int get_id_Font(mrb_state *mrb, mrb_value self) {
|
||||
|
||||
static void Image_free(mrb_state *mrb, void *ptr) {
|
||||
UNUSED(mrb);
|
||||
int id = ((Wrapper *)ptr)->id;
|
||||
uint64_t id = ((Wrapper *)ptr)->id;
|
||||
image_pool.release(id);
|
||||
delete (Wrapper *)ptr;
|
||||
}
|
||||
@@ -98,7 +97,7 @@ static mrb_value Image_init(mrb_state *mrb, mrb_value self) {
|
||||
return self;
|
||||
}
|
||||
|
||||
inline int get_id_Image(mrb_state *mrb, mrb_value self) {
|
||||
inline uint64_t get_id_Image(mrb_state *mrb, mrb_value self) {
|
||||
Wrapper *wrapper;
|
||||
Data_Get_Struct(mrb, self, &Image_type, wrapper);
|
||||
return wrapper->id;
|
||||
@@ -106,7 +105,7 @@ inline int get_id_Image(mrb_state *mrb, mrb_value self) {
|
||||
|
||||
static void Animation_free(mrb_state *mrb, void *ptr) {
|
||||
UNUSED(mrb);
|
||||
int id = ((Wrapper *)ptr)->id;
|
||||
uint64_t id = ((Wrapper *)ptr)->id;
|
||||
animation_pool.release(id);
|
||||
delete (Wrapper *)ptr;
|
||||
}
|
||||
@@ -132,7 +131,7 @@ static mrb_value Animation_init(mrb_state *mrb, mrb_value self) {
|
||||
if (!mrb_nil_p(kwargs))
|
||||
HASH_FLOAT(kwargs, fps, fps);
|
||||
|
||||
std::vector<int> frame_ids;
|
||||
std::vector<uint64_t> frame_ids;
|
||||
for (mrb_int i = 0; i < frames_len; i++) {
|
||||
mrb_value frame_val = frames_val[i];
|
||||
if (!mrb_obj_is_kind_of(mrb, frame_val, mrb_class_get(mrb, "Image"))) {
|
||||
@@ -143,7 +142,7 @@ static mrb_value Animation_init(mrb_state *mrb, mrb_value self) {
|
||||
);
|
||||
return mrb_nil_value();
|
||||
}
|
||||
int frame_id = get_id_Image(mrb, frame_val);
|
||||
uint64_t frame_id = get_id_Image(mrb, frame_val);
|
||||
image_pool.use(frame_id);
|
||||
frame_ids.push_back(frame_id);
|
||||
}
|
||||
@@ -156,7 +155,7 @@ static mrb_value Animation_init(mrb_state *mrb, mrb_value self) {
|
||||
return self;
|
||||
}
|
||||
|
||||
inline int get_id_Animation(mrb_state *mrb, mrb_value self) {
|
||||
inline uint64_t get_id_Animation(mrb_state *mrb, mrb_value self) {
|
||||
Wrapper *wrapper;
|
||||
Data_Get_Struct(mrb, self, &Animation_type, wrapper);
|
||||
return wrapper->id;
|
||||
@@ -164,7 +163,7 @@ inline int get_id_Animation(mrb_state *mrb, mrb_value self) {
|
||||
|
||||
static void ElementText_free(mrb_state *mrb, void *ptr) {
|
||||
UNUSED(mrb);
|
||||
int id = ((Wrapper *)ptr)->id;
|
||||
uint64_t id = ((Wrapper *)ptr)->id;
|
||||
app::element_pool.release(id);
|
||||
delete (Wrapper *)ptr;
|
||||
}
|
||||
@@ -208,7 +207,7 @@ static mrb_value ElementText_init(mrb_state *mrb, mrb_value self) {
|
||||
|
||||
Vec2<float> position = {x, y};
|
||||
|
||||
int id = get_id_Font(mrb, font_val);
|
||||
uint64_t id = get_id_Font(mrb, font_val);
|
||||
font_pool.use(id);
|
||||
|
||||
app::EText *element = new app::EText(key_id, id, {255, 255, 255, 255});
|
||||
@@ -223,7 +222,7 @@ static mrb_value ElementText_init(mrb_state *mrb, mrb_value self) {
|
||||
return self;
|
||||
}
|
||||
|
||||
inline int get_id_ElementText(mrb_state *mrb, mrb_value self) {
|
||||
inline uint64_t get_id_ElementText(mrb_state *mrb, mrb_value self) {
|
||||
Wrapper *wrapper;
|
||||
Data_Get_Struct(mrb, self, &ElementText_type, wrapper);
|
||||
return wrapper->id;
|
||||
@@ -232,7 +231,7 @@ inline int get_id_ElementText(mrb_state *mrb, mrb_value self) {
|
||||
static mrb_value element_text_on_click(mrb_state *mrb, mrb_value self) {
|
||||
mrb_value block;
|
||||
mrb_get_args(mrb, "&", &block);
|
||||
int id = get_id_ElementText(mrb, self);
|
||||
uint64_t id = get_id_ElementText(mrb, self);
|
||||
app::Element *element = app::element_pool[id];
|
||||
element->on_click.set_proc(block);
|
||||
return self;
|
||||
@@ -240,7 +239,7 @@ static mrb_value element_text_on_click(mrb_state *mrb, mrb_value self) {
|
||||
|
||||
static void ElementRect_free(mrb_state *mrb, void *ptr) {
|
||||
UNUSED(mrb);
|
||||
int id = ((Wrapper *)ptr)->id;
|
||||
uint64_t id = ((Wrapper *)ptr)->id;
|
||||
app::element_pool.release(id);
|
||||
delete (Wrapper *)ptr;
|
||||
}
|
||||
@@ -271,8 +270,11 @@ static mrb_value ElementRect_init(mrb_state *mrb, mrb_value self) {
|
||||
}
|
||||
|
||||
float z = 0;
|
||||
if (!mrb_nil_p(kwargs))
|
||||
bool click_through = false;
|
||||
if (!mrb_nil_p(kwargs)) {
|
||||
HASH_FLOAT(kwargs, z, z);
|
||||
HASH_BOOL(kwargs, click_through, click_through);
|
||||
}
|
||||
|
||||
Vec2<float> position = {x, y};
|
||||
Vec2<float> shape = {w, h};
|
||||
@@ -286,6 +288,7 @@ static mrb_value ElementRect_init(mrb_state *mrb, mrb_value self) {
|
||||
);
|
||||
element->position = position;
|
||||
element->z = z;
|
||||
element->click_through = click_through;
|
||||
|
||||
s->id = app::element_pool.acquire(element);
|
||||
app::element_pool.use(s->id);
|
||||
@@ -294,7 +297,7 @@ static mrb_value ElementRect_init(mrb_state *mrb, mrb_value self) {
|
||||
return self;
|
||||
}
|
||||
|
||||
inline int get_id_ElementRect(mrb_state *mrb, mrb_value self) {
|
||||
inline uint64_t get_id_ElementRect(mrb_state *mrb, mrb_value self) {
|
||||
Wrapper *wrapper;
|
||||
Data_Get_Struct(mrb, self, &ElementRect_type, wrapper);
|
||||
return wrapper->id;
|
||||
@@ -303,7 +306,7 @@ inline int get_id_ElementRect(mrb_state *mrb, mrb_value self) {
|
||||
static mrb_value element_rect_on_click(mrb_state *mrb, mrb_value self) {
|
||||
mrb_value block;
|
||||
mrb_get_args(mrb, "&", &block);
|
||||
int id = get_id_ElementRect(mrb, self);
|
||||
uint64_t id = get_id_ElementRect(mrb, self);
|
||||
app::Element *element = app::element_pool[id];
|
||||
element->on_click.set_proc(block);
|
||||
return self;
|
||||
@@ -312,7 +315,7 @@ static mrb_value element_rect_on_click(mrb_state *mrb, mrb_value self) {
|
||||
static mrb_value element_rect_color_set(mrb_state *mrb, mrb_value self) {
|
||||
mrb_value color_val;
|
||||
mrb_get_args(mrb, "o", &color_val);
|
||||
int id = get_id_ElementRect(mrb, self);
|
||||
uint64_t id = get_id_ElementRect(mrb, self);
|
||||
app::ERect *element = (app::ERect *)app::element_pool[id];
|
||||
element->color = {
|
||||
(uint8_t)((mrb_fixnum(color_val) >> 24) & 0xFF),
|
||||
@@ -324,7 +327,7 @@ static mrb_value element_rect_color_set(mrb_state *mrb, mrb_value self) {
|
||||
}
|
||||
|
||||
static mrb_value element_rect_color_get(mrb_state *mrb, mrb_value self) {
|
||||
int id = get_id_ElementRect(mrb, self);
|
||||
uint64_t id = get_id_ElementRect(mrb, self);
|
||||
app::ERect *element = (app::ERect *)app::element_pool[id];
|
||||
uint32_t color =
|
||||
((uint32_t)element->color.r << 24) | ((uint32_t)element->color.g << 16)
|
||||
@@ -334,7 +337,7 @@ static mrb_value element_rect_color_get(mrb_state *mrb, mrb_value self) {
|
||||
|
||||
static void ElementImage_free(mrb_state *mrb, void *ptr) {
|
||||
UNUSED(mrb);
|
||||
int id = ((Wrapper *)ptr)->id;
|
||||
uint64_t id = ((Wrapper *)ptr)->id;
|
||||
app::element_pool.release(id);
|
||||
delete (Wrapper *)ptr;
|
||||
}
|
||||
@@ -380,7 +383,7 @@ static mrb_value ElementImage_init(mrb_state *mrb, mrb_value self) {
|
||||
HASH_BOOL(kwargs, click_through, click_through);
|
||||
}
|
||||
|
||||
int id = get_id_Animation(mrb, animation_val);
|
||||
uint64_t id = get_id_Animation(mrb, animation_val);
|
||||
|
||||
app::EImage *element = new app::EImage(id);
|
||||
element->position = {x, y};
|
||||
@@ -394,7 +397,7 @@ static mrb_value ElementImage_init(mrb_state *mrb, mrb_value self) {
|
||||
return self;
|
||||
}
|
||||
|
||||
inline int get_id_ElementImage(mrb_state *mrb, mrb_value self) {
|
||||
inline uint64_t get_id_ElementImage(mrb_state *mrb, mrb_value self) {
|
||||
Wrapper *wrapper;
|
||||
Data_Get_Struct(mrb, self, &ElementImage_type, wrapper);
|
||||
return wrapper->id;
|
||||
@@ -403,7 +406,7 @@ inline int get_id_ElementImage(mrb_state *mrb, mrb_value self) {
|
||||
static mrb_value element_image_on_click(mrb_state *mrb, mrb_value self) {
|
||||
mrb_value block;
|
||||
mrb_get_args(mrb, "&", &block);
|
||||
int id = get_id_ElementImage(mrb, self);
|
||||
uint64_t id = get_id_ElementImage(mrb, self);
|
||||
app::Element *element = app::element_pool[id];
|
||||
element->on_click.set_proc(block);
|
||||
return self;
|
||||
@@ -411,7 +414,7 @@ static mrb_value element_image_on_click(mrb_state *mrb, mrb_value self) {
|
||||
|
||||
static void Scene_free(mrb_state *mrb, void *ptr) {
|
||||
UNUSED(mrb);
|
||||
int id = ((Wrapper *)ptr)->id;
|
||||
uint64_t id = ((Wrapper *)ptr)->id;
|
||||
app::scene_pool.release(id);
|
||||
delete (Wrapper *)ptr;
|
||||
}
|
||||
@@ -434,7 +437,7 @@ static mrb_value Scene_init(mrb_state *mrb, mrb_value self) {
|
||||
return self;
|
||||
}
|
||||
|
||||
inline int get_id_Scene(mrb_state *mrb, mrb_value self) {
|
||||
inline uint64_t get_id_Scene(mrb_state *mrb, mrb_value self) {
|
||||
Wrapper *wrapper;
|
||||
Data_Get_Struct(mrb, self, &Scene_type, wrapper);
|
||||
return wrapper->id;
|
||||
@@ -457,10 +460,10 @@ static mrb_value scene_add_element(mrb_state *mrb, mrb_value self) {
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
int id = get_id_Scene(mrb, self);
|
||||
uint64_t id = get_id_Scene(mrb, self);
|
||||
app::Scene *scene = app::scene_pool[id];
|
||||
|
||||
int element_id;
|
||||
uint64_t element_id;
|
||||
if (mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementText"))) {
|
||||
element_id = get_id_ElementText(mrb, element_val);
|
||||
} else if (
|
||||
@@ -502,10 +505,10 @@ static mrb_value scene_delete_element(mrb_state *mrb, mrb_value self) {
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
int id = get_id_Scene(mrb, self);
|
||||
uint64_t id = get_id_Scene(mrb, self);
|
||||
app::Scene *scene = app::scene_pool[id];
|
||||
|
||||
int element_id;
|
||||
uint64_t element_id;
|
||||
if (mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementText"))) {
|
||||
element_id = get_id_ElementText(mrb, element_val);
|
||||
} else if (
|
||||
@@ -534,13 +537,50 @@ static mrb_value scene_on_update(mrb_state *mrb, mrb_value self) {
|
||||
mrb_value block;
|
||||
mrb_get_args(mrb, "&", &block);
|
||||
|
||||
int id = get_id_Scene(mrb, self);
|
||||
uint64_t id = get_id_Scene(mrb, self);
|
||||
app::Scene *scene = app::scene_pool[id];
|
||||
scene->update.set_proc(block);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
static mrb_value scene_elements_at(mrb_state *mrb, mrb_value self) {
|
||||
mrb_value position_val;
|
||||
mrb_get_args(mrb, "o", &position_val);
|
||||
|
||||
float x, y;
|
||||
HASH_FLOAT(position_val, x, x);
|
||||
HASH_FLOAT(position_val, y, y);
|
||||
Vec2<float> position = {x, y};
|
||||
|
||||
uint64_t id = get_id_Scene(mrb, self);
|
||||
app::Scene *scene = app::scene_pool[id];
|
||||
|
||||
std::vector<uint64_t> element_ids = scene->elements_at(position);
|
||||
|
||||
mrb_value result = mrb_ary_new_capa(mrb, element_ids.size());
|
||||
for (uint64_t element_id : element_ids) {
|
||||
app::Element *element = app::element_pool[element_id];
|
||||
if (element->type == Type::TEXT) {
|
||||
RClass *ElementText_class = mrb_class_get(mrb, "ElementText");
|
||||
mrb_value obj = wrap(mrb, ElementText_class, &ElementText_type, element_id);
|
||||
mrb_ary_push(mrb, result, obj);
|
||||
} else if (element->type == Type::RECT) {
|
||||
RClass *ElementRect_class = mrb_class_get(mrb, "ElementRect");
|
||||
mrb_value obj = wrap(mrb, ElementRect_class, &ElementRect_type, element_id);
|
||||
mrb_ary_push(mrb, result, obj);
|
||||
} else if (element->type == Type::IMAGE) {
|
||||
RClass *ElementImage_class = mrb_class_get(mrb, "ElementImage");
|
||||
mrb_value obj = wrap(mrb, ElementImage_class, &ElementImage_type, element_id);
|
||||
mrb_ary_push(mrb, result, obj);
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static mrb_value app_run(mrb_state *mrb, mrb_value) {
|
||||
mrb_int width, height;
|
||||
char *title = nullptr;
|
||||
@@ -560,7 +600,7 @@ static mrb_value app_start(mrb_state *mrb, mrb_value) {
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
int id = get_id_Scene(mrb, scene_val);
|
||||
uint64_t id = get_id_Scene(mrb, scene_val);
|
||||
app_->switch_to_scene(id);
|
||||
|
||||
app_->loop();
|
||||
@@ -577,7 +617,7 @@ static mrb_value app_switch_to(mrb_state *mrb, mrb_value) {
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
int id = get_id_Scene(mrb, scene_val);
|
||||
uint64_t id = get_id_Scene(mrb, scene_val);
|
||||
app_->switch_to_scene(id);
|
||||
|
||||
return mrb_nil_value();
|
||||
@@ -615,6 +655,14 @@ static mrb_value app_language_set(mrb_state *mrb, mrb_value) {
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
static mrb_value app_mouse_position(mrb_state *mrb, mrb_value) {
|
||||
Vec2<float> mouse_pos = app_->mouse_position;
|
||||
mrb_value result = mrb_hash_new(mrb);
|
||||
HASH_SET(result, x, mrb_float_value(mrb, mouse_pos.x));
|
||||
HASH_SET(result, y, mrb_float_value(mrb, mouse_pos.y));
|
||||
return result;
|
||||
}
|
||||
|
||||
inline void setup() {
|
||||
DEF_CLASS(Font, MRB_ARGS_REQ(2) | MRB_ARGS_OPT(1));
|
||||
|
||||
@@ -638,6 +686,7 @@ inline void setup() {
|
||||
ADD_METHOD(Scene, "delete", scene_delete_element, MRB_ARGS_REQ(1));
|
||||
ADD_METHOD(Scene, "remove", scene_delete_element, MRB_ARGS_REQ(1));
|
||||
ADD_METHOD(Scene, "on_update", scene_on_update, MRB_ARGS_BLOCK());
|
||||
ADD_METHOD(Scene, "elements_at", scene_elements_at, MRB_ARGS_REQ(1));
|
||||
|
||||
DEF_MODULE(App);
|
||||
ADD_MODULE_METHOD(App, "run", app_run, MRB_ARGS_REQ(3));
|
||||
@@ -645,6 +694,7 @@ inline void setup() {
|
||||
ADD_MODULE_METHOD(App, "switch_to", app_switch_to, MRB_ARGS_REQ(1));
|
||||
ADD_MODULE_METHOD(App, "localize", app_localize, MRB_ARGS_REQ(3));
|
||||
ADD_MODULE_METHOD(App, "language=", app_language_set, MRB_ARGS_REQ(1));
|
||||
ADD_MODULE_METHOD(App, "mouse_position", app_mouse_position, MRB_ARGS_NONE());
|
||||
}
|
||||
} // namespace definitions
|
||||
|
||||
|
||||
Reference in New Issue
Block a user