summaryrefslogtreecommitdiff
path: root/src/vector_4d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vector_4d.cpp')
-rw-r--r--src/vector_4d.cpp151
1 files changed, 112 insertions, 39 deletions
diff --git a/src/vector_4d.cpp b/src/vector_4d.cpp
index 85a265e..7bdcbab 100644
--- a/src/vector_4d.cpp
+++ b/src/vector_4d.cpp
@@ -19,9 +19,30 @@
#include <memory>
#include <glm/vec4.hpp>
-
#include <mruby/array.h>
+#include "vector_3d.hpp"
+#include "view_2d.hpp"
+
+namespace
+{
+
+constexpr bool
+align_vertically(const float a_x, const float a_width,
+ const float b_x, const float b_width)
+{
+ return a_x <= b_x + b_width && a_x + a_width >= b_x;
+}
+
+constexpr bool
+align_horizontally(const float a_y, const float a_height,
+ const float b_y, const float b_height)
+{
+ return a_y <= b_y + b_height && a_y + a_height >= b_y;
+}
+
+}
+
void
cg_free_vector_4d(mrb_state *mrb, void* obj)
{
@@ -67,8 +88,7 @@ cg_cVector4D_get_x(mrb_state *mrb, mrb_value self)
mrb_value
cg_cVector4D_get_y(mrb_state *mrb, mrb_value self)
{
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
return mrb_float_value(mrb, (*ptr)->y);
}
@@ -76,8 +96,7 @@ cg_cVector4D_get_y(mrb_state *mrb, mrb_value self)
mrb_value
cg_cVector4D_get_w(mrb_state *mrb, mrb_value self)
{
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
return mrb_float_value(mrb, (*ptr)->z);
}
@@ -85,8 +104,7 @@ cg_cVector4D_get_w(mrb_state *mrb, mrb_value self)
mrb_value
cg_cVector4D_get_h(mrb_state *mrb, mrb_value self)
{
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
return mrb_float_value(mrb, (*ptr)->w);
}
@@ -94,8 +112,7 @@ cg_cVector4D_get_h(mrb_state *mrb, mrb_value self)
mrb_value
cg_cVector4D_get_xy(mrb_state *mrb, mrb_value self)
{
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto *ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_value array = mrb_ary_new_capa(mrb, 2);
mrb_ary_push(mrb, array, mrb_float_value(mrb, (*ptr)->x));
@@ -107,8 +124,7 @@ cg_cVector4D_get_xy(mrb_state *mrb, mrb_value self)
mrb_value
cg_cVector4D_get_xw(mrb_state *mrb, mrb_value self)
{
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_value array = mrb_ary_new_capa(mrb, 2);
mrb_ary_push(mrb, array, mrb_float_value(mrb, (*ptr)->x));
@@ -120,8 +136,7 @@ cg_cVector4D_get_xw(mrb_state *mrb, mrb_value self)
mrb_value
cg_cVector4D_get_xh(mrb_state *mrb, mrb_value self)
{
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_value array = mrb_ary_new_capa(mrb, 2);
mrb_ary_push(mrb, array, mrb_float_value(mrb, (*ptr)->x));
@@ -133,8 +148,7 @@ cg_cVector4D_get_xh(mrb_state *mrb, mrb_value self)
mrb_value
cg_cVector4D_get_yw(mrb_state *mrb, mrb_value self)
{
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_value array = mrb_ary_new_capa(mrb, 2);
mrb_ary_push(mrb, array, mrb_float_value(mrb, (*ptr)->y));
@@ -146,8 +160,7 @@ cg_cVector4D_get_yw(mrb_state *mrb, mrb_value self)
mrb_value
cg_cVector4D_get_yh(mrb_state *mrb, mrb_value self)
{
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_value array = mrb_ary_new_capa(mrb, 2);
mrb_ary_push(mrb, array, mrb_float_value(mrb, (*ptr)->y));
@@ -159,8 +172,7 @@ cg_cVector4D_get_yh(mrb_state *mrb, mrb_value self)
mrb_value
cg_cVector4D_get_wh(mrb_state *mrb, mrb_value self)
{
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_value array = mrb_ary_new_capa(mrb, 2);
mrb_ary_push(mrb, array, mrb_float_value(mrb, (*ptr)->z));
@@ -173,8 +185,7 @@ static mrb_value
cg_cVector4D_set_x(mrb_state *mrb, mrb_value self)
{
mrb_float x;
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_get_args(mrb, "f", &x);
(*ptr)->x = x;
@@ -186,8 +197,7 @@ static mrb_value
cg_cVector4D_set_y(mrb_state *mrb, mrb_value self)
{
mrb_float y;
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_get_args(mrb, "f", &y);
(*ptr)->y = y;
@@ -199,8 +209,7 @@ static mrb_value
cg_cVector4D_set_w(mrb_state *mrb, mrb_value self)
{
mrb_float w;
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_get_args(mrb, "f", &w);
(*ptr)->z = w;
@@ -212,8 +221,7 @@ static mrb_value
cg_cVector4D_set_h(mrb_state *mrb, mrb_value self)
{
mrb_float h;
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_get_args(mrb, "f", &h);
(*ptr)->w = h;
@@ -225,8 +233,7 @@ static mrb_value
cg_cVector4D_set_xy(mrb_state *mrb, mrb_value self)
{
mrb_float x, y;
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_get_args(mrb, "ff", &x, &y);
(*ptr)->x = x;
@@ -239,8 +246,7 @@ static mrb_value
cg_cVector4D_set_xw(mrb_state *mrb, mrb_value self)
{
mrb_float x, w;
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_get_args(mrb, "ff", &x, &w);
(*ptr)->x = x;
@@ -253,8 +259,7 @@ static mrb_value
cg_cVector4D_set_xh(mrb_state *mrb, mrb_value self)
{
mrb_float x, h;
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_get_args(mrb, "ff", &x, &h);
(*ptr)->x = x;
@@ -267,8 +272,7 @@ static mrb_value
cg_cVector4D_set_yw(mrb_state *mrb, mrb_value self)
{
mrb_float y, w;
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_get_args(mrb, "ff", &y, &w);
(*ptr)->y = y;
@@ -281,8 +285,7 @@ static mrb_value
cg_cVector4D_set_yh(mrb_state *mrb, mrb_value self)
{
mrb_float y, h;
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_get_args(mrb, "ff", &y, &h);
(*ptr)->x = y;
@@ -295,8 +298,7 @@ static mrb_value
cg_cVector4D_set_wh(mrb_state *mrb, mrb_value self)
{
mrb_float w, h;
- std::shared_ptr<glm::vec4> *ptr =
- (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+ auto ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
mrb_get_args(mrb, "ff", &w, &h);
(*ptr)->z = w;
@@ -305,6 +307,65 @@ cg_cVector4D_set_wh(mrb_state *mrb, mrb_value self)
return self;
}
+static mrb_value
+cg_cVector4D_align_vertically(mrb_state *mrb, mrb_value self)
+{
+ std::shared_ptr<glm::vec4> *ptr, *that;
+
+ mrb_get_args(mrb, "d", &that, &cg_vector_4d_type);
+ ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+
+ return mrb_bool_value(
+ align_vertically((*ptr)->x, (*ptr)->z, (*that)->x, (*that)->z));
+}
+
+static mrb_value
+cg_cVector4D_align_horizontally(mrb_state *mrb, mrb_value self)
+{
+ std::shared_ptr<glm::vec4> *ptr, *that;
+
+ mrb_get_args(mrb, "d", &that, &cg_vector_4d_type);
+ ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+
+ return mrb_bool_value(
+ align_horizontally((*ptr)->y, (*ptr)->w, (*that)->y, (*that)->w));
+}
+
+static mrb_value
+cg_cVector4D_collide(mrb_state *mrb, mrb_value self)
+{
+ std::shared_ptr<glm::vec4> *ptr, *that;
+
+ mrb_get_args(mrb, "d", &that, &cg_vector_4d_type);
+ ptr = (std::shared_ptr<glm::vec4>*)DATA_PTR(self);
+
+ return mrb_bool_value(
+ align_vertically((*ptr)->x, (*ptr)->z, (*that)->x, (*that)->z) &&
+ align_horizontally((*ptr)->y, (*ptr)->w, (*that)->y, (*that)->w));
+}
+
+static mrb_value
+cg_cVector4D_draw_rectangle(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<glm::vec4>*)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);
+
+ glm::vec4 position(
+ (*ptr)->x, (*ptr)->y, (*ptr)->x + (*ptr)->z, (*ptr)->y + (*ptr)->w);
+ VK::Rectangle rect{position, (**color)};
+ auto &rectangles = view_2d->rectangles_to_draw[
+ cg_core.vk_swapchain->current_frame];
+ rectangles.push_back(rect);
+
+ return self;
+}
+
void
cg_vector_4d_init(mrb_state *mrb)
{
@@ -403,4 +464,16 @@ cg_vector_4d_init(mrb_state *mrb)
mrb, cg_cVector4D, "set_ga", cg_cVector4D_set_yh, MRB_ARGS_REQ(2));
mrb_define_method(
mrb, cg_cVector4D, "set_ba", cg_cVector4D_set_wh, MRB_ARGS_REQ(2));
+
+ mrb_define_method(
+ mrb, cg_cVector4D, "align_vertically?", cg_cVector4D_align_vertically,
+ MRB_ARGS_REQ(1));
+ mrb_define_method(
+ mrb, cg_cVector4D, "align_horizontally?",
+ cg_cVector4D_align_horizontally, MRB_ARGS_REQ(1));
+ mrb_define_method(
+ mrb, cg_cVector4D, "collide?", cg_cVector4D_collide, MRB_ARGS_REQ(1));
+ mrb_define_method(
+ mrb, cg_cVector4D, "draw_rectangle", cg_cVector4D_draw_rectangle,
+ MRB_ARGS_REQ(2));
}