summaryrefslogtreecommitdiff
path: root/src/rectangle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/rectangle.cpp')
-rw-r--r--src/rectangle.cpp122
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));
}