diff options
Diffstat (limited to 'src/rectangle.cpp')
-rw-r--r-- | src/rectangle.cpp | 122 |
1 files changed, 65 insertions, 57 deletions
diff --git a/src/rectangle.cpp b/src/rectangle.cpp index 3bc0a84..18c86a4 100644 --- a/src/rectangle.cpp +++ b/src/rectangle.cpp @@ -16,28 +16,16 @@ #include "rectangle.hpp" -namespace -{ - -constexpr bool -align_vertically(float a_x, float a_width, float b_x, float b_width) -{ - return a_x <= b_x + b_width && a_x + a_width >= b_x; -} - -constexpr bool -align_horizontally(float a_y, float a_height, float b_y, float b_height) -{ - return a_y <= b_y + b_height && a_y + a_height >= b_y; -} - -} +#include "vector_3d.hpp" +#include "view_2d.hpp" +#include "view_3d.hpp" void cg_free_rectangle(mrb_state *mrb, void* obj) { - auto ptr = static_cast<cg_rectangle*>(obj); + auto ptr = static_cast<std::shared_ptr<VK::Rectangle>*>(obj); + ptr->~shared_ptr(); mrb_free(mrb, ptr); } @@ -48,17 +36,16 @@ static mrb_value cg_cRectangle_initialize(mrb_state *mrb, mrb_value self) { mrb_float x, y, width, height; - struct cg_rectangle *ptr; + std::shared_ptr<VK::Rectangle> *ptr; mrb_get_args(mrb, "ffff", &x, &y, &width, &height); - ptr = (cg_rectangle *)DATA_PTR(self); + ptr = (std::shared_ptr<VK::Rectangle>*)DATA_PTR(self); if(ptr) mrb_free(mrb, ptr); - ptr = (cg_rectangle *)mrb_malloc(mrb, sizeof(cg_rectangle)); + ptr = (std::shared_ptr<VK::Rectangle>*)mrb_malloc( + mrb, sizeof(std::shared_ptr<VK::Rectangle>)); - ptr->x = x; - ptr->y = y; - ptr->width = width; - ptr->height = height; + new(ptr)std::shared_ptr<VK::Rectangle>( + std::make_shared<VK::Rectangle>(x, y, width, height)); mrb_data_init(self, ptr, &cg_rectangle_type); return self; @@ -67,122 +54,141 @@ cg_cRectangle_initialize(mrb_state *mrb, mrb_value self) static mrb_value cg_cRectangle_get_x(mrb_state *mrb, mrb_value self) { - auto ptr = (cg_rectangle *)DATA_PTR(self); + auto ptr = (std::shared_ptr<VK::Rectangle>*)DATA_PTR(self); - return mrb_float_value(mrb, ptr->x); + return mrb_float_value(mrb, (*ptr)->x); } static mrb_value cg_cRectangle_set_x(mrb_state *mrb, mrb_value self) { mrb_float x; - auto ptr = (cg_rectangle *)DATA_PTR(self); + auto ptr = (std::shared_ptr<VK::Rectangle>*)DATA_PTR(self); mrb_get_args(mrb, "f", &x); - ptr->x = x; + (*ptr)->x = x; - return mrb_float_value(mrb, ptr->x); + return mrb_float_value(mrb, (*ptr)->x); } static mrb_value cg_cRectangle_get_y(mrb_state *mrb, mrb_value self) { - auto ptr = (cg_rectangle *)DATA_PTR(self); + auto ptr = (std::shared_ptr<VK::Rectangle>*)DATA_PTR(self); - return mrb_float_value(mrb, ptr->y); + return mrb_float_value(mrb, (*ptr)->y); } static mrb_value cg_cRectangle_set_y(mrb_state *mrb, mrb_value self) { mrb_float y; - auto *ptr = (cg_rectangle *)DATA_PTR(self); + auto ptr = (std::shared_ptr<VK::Rectangle>*)DATA_PTR(self); mrb_get_args(mrb, "f", &y); - ptr->y = y; + (*ptr)->y = y; - return mrb_float_value(mrb, ptr->y); + return mrb_float_value(mrb, (*ptr)->y); } static mrb_value cg_cRectangle_get_width(mrb_state *mrb, mrb_value self) { - auto *ptr = (cg_rectangle *)DATA_PTR(self); + auto ptr = (std::shared_ptr<VK::Rectangle>*)DATA_PTR(self); - return mrb_float_value(mrb, ptr->width); + return mrb_float_value(mrb, (*ptr)->width); } static mrb_value cg_cRectangle_set_width(mrb_state *mrb, mrb_value self) { mrb_float width; - auto *ptr = (struct cg_rectangle *)DATA_PTR(self); + auto ptr = (std::shared_ptr<VK::Rectangle>*)DATA_PTR(self); mrb_get_args(mrb, "f", &width); - ptr->width = width; + (*ptr)->width = width; - return mrb_float_value(mrb, ptr->width); + return mrb_float_value(mrb, (*ptr)->width); } static mrb_value cg_cRectangle_get_height(mrb_state *mrb, mrb_value self) { - auto *ptr = (struct cg_rectangle *)DATA_PTR(self); + auto ptr = (std::shared_ptr<VK::Rectangle>*)DATA_PTR(self); - return mrb_float_value(mrb, ptr->height); + return mrb_float_value(mrb, (*ptr)->height); } static mrb_value cg_cRectangle_set_height(mrb_state *mrb, mrb_value self) { mrb_float height; - auto *ptr = (cg_rectangle *)DATA_PTR(self); + auto ptr = (std::shared_ptr<VK::Rectangle>*)DATA_PTR(self); mrb_get_args(mrb, "f", &height); - ptr->height = height; + (*ptr)->height = height; - return mrb_float_value(mrb, ptr->height); + return mrb_float_value(mrb, (*ptr)->height); } static mrb_value cg_cRectangle_align_vertically(mrb_state *mrb, mrb_value self) { - cg_rectangle *ptr, *that; + std::shared_ptr<VK::Rectangle> *ptr, *that; mrb_get_args(mrb, "d", &that, &cg_rectangle_type); - ptr = (cg_rectangle *)DATA_PTR(self); + ptr = (std::shared_ptr<VK::Rectangle>*)DATA_PTR(self); - return mrb_bool_value( - align_vertically(ptr->x, ptr->width, that->x, that->width)); + return mrb_bool_value((*ptr)->align_vertically(**that)); } static mrb_value cg_cRectangle_align_horizontally(mrb_state *mrb, mrb_value self) { - cg_rectangle *ptr, *that; + std::shared_ptr<VK::Rectangle> *ptr, *that; mrb_get_args(mrb, "d", &that, &cg_rectangle_type); - ptr = (cg_rectangle *)DATA_PTR(self); + ptr = (std::shared_ptr<VK::Rectangle>*)DATA_PTR(self); - return mrb_bool_value( - align_horizontally(ptr->y, ptr->height, that->y, that->height)); + return mrb_bool_value((*ptr)->align_horizontally(**that)); } static mrb_value cg_cRectangle_collide(mrb_state *mrb, mrb_value self) { - cg_rectangle *ptr, *that; + std::shared_ptr<VK::Rectangle> *ptr, *that; mrb_get_args(mrb, "d", &that, &cg_rectangle_type); - ptr = (cg_rectangle *)DATA_PTR(self); + ptr = (std::shared_ptr<VK::Rectangle>*)DATA_PTR(self); - return mrb_bool_value( - align_vertically(ptr->x, ptr->width, that->x, that->width) && - align_horizontally(ptr->y, ptr->height, that->y, that->height)); + return mrb_bool_value((*ptr)->collide(**that)); +} + +static mrb_value +cg_cRectangle_draw(mrb_state *mrb, mrb_value self) +{ + mrb_value view_value; + VK::View2D *view_2d; + std::shared_ptr<glm::vec3> *color; + auto ptr = (std::shared_ptr<VK::Rectangle>*)DATA_PTR(self); + + mrb_get_args(mrb, "od", &view_value, &color, &cg_vector_3d_type); + + view_2d = cg_cView_to_view_2d(mrb, view_value); + + VK::UBOModel2D model; + model.color = **color; + (*ptr)->ub_rectangle[cg_core.vk_swapchain->current_frame].copy_data(&model); + (*ptr)->update_vertex_buffer(); + auto &rectangles = view_2d->rectangles_to_draw[ + cg_core.vk_swapchain->current_frame]; + rectangles.push_back(*ptr); + + return self; } void @@ -221,4 +227,6 @@ cg_rectangle_init(mrb_state *mrb) cg_cRectangle_align_horizontally, MRB_ARGS_REQ(1)); mrb_define_method( mrb, cg_cRectangle, "collide?", cg_cRectangle_collide, MRB_ARGS_REQ(1)); + mrb_define_method( + mrb, cg_cRectangle, "draw", cg_cRectangle_draw, MRB_ARGS_REQ(2)); } |