diff --git a/headers/enduro2d/high/components/colliders.hpp b/headers/enduro2d/high/components/colliders.hpp index 2da32316..a5acb81d 100644 --- a/headers/enduro2d/high/components/colliders.hpp +++ b/headers/enduro2d/high/components/colliders.hpp @@ -19,8 +19,8 @@ namespace e2d::impl public: collider_base() = default; - Collider& pivot(const v2f& value) noexcept; - [[nodiscard]] const v2f& pivot() const noexcept; + Collider& offset(const v2f& value) noexcept; + [[nodiscard]] const v2f& offset() const noexcept; Collider& sensor(bool value) noexcept; [[nodiscard]] bool sensor() const noexcept; @@ -34,7 +34,7 @@ namespace e2d::impl Collider& restitution(f32 value) noexcept; [[nodiscard]] f32 restitution() const noexcept; private: - v2f pivot_ = v2f(0.5f); + v2f offset_ = v2f::zero(); bool sensor_ = false; f32 density_ = 1.f; f32 friction_ = 0.2f; @@ -52,7 +52,7 @@ namespace e2d rect_collider& size(const v2f& value) noexcept; [[nodiscard]] const v2f& size() const noexcept; private: - v2f size_ = v2f::zero(); + v2f size_ = v2f::unit(); }; class circle_collider final @@ -63,7 +63,7 @@ namespace e2d circle_collider& radius(f32 value) noexcept; [[nodiscard]] f32 radius() const noexcept; private: - f32 radius_ = 0.f; + f32 radius_ = 1.f; }; class polygon_collider final @@ -75,7 +75,11 @@ namespace e2d [[nodiscard]] vector& points() noexcept; [[nodiscard]] const vector& points() const noexcept; private: - vector points_; + vector points_ = { + {-0.5f, -0.5f}, + {+0.5f, -0.5f}, + {+0.5f, +0.5f}, + {-0.5f, +0.5f}}; }; } @@ -154,14 +158,14 @@ namespace e2d namespace e2d::impl { template < typename Collider > - Collider& collider_base::pivot(const v2f& value) noexcept { - pivot_ = value; + Collider& collider_base::offset(const v2f& value) noexcept { + offset_ = value; return static_cast(*this); } template < typename Collider > - const v2f& collider_base::pivot() const noexcept { - return pivot_; + const v2f& collider_base::offset() const noexcept { + return offset_; } template < typename Collider > diff --git a/samples/bin/library/scripts/emmy/components/colliders.lua b/samples/bin/library/scripts/emmy/components/colliders.lua index d220b3cc..7a55c66d 100644 --- a/samples/bin/library/scripts/emmy/components/colliders.lua +++ b/samples/bin/library/scripts/emmy/components/colliders.lua @@ -7,10 +7,22 @@ local rect_collider = { disabled = false, ---@type v2f - size = v2f.zero(), + size = v2f.unit(), ---@type v2f - pivot = v2f.new(0.5) + offset = v2f.zero(), + + ---@type boolean + sensor = false, + + ---@type number + density = 1.0, + + ---@type number + friction = 0.2, + + ---@type number + restitution = 0.0 } ---@overload fun(self: rect_collider) @@ -33,10 +45,22 @@ local circle_collider = { disabled = false, ---@type number - radius = 0, + radius = 1.0, ---@type v2f - pivot = v2f.new(0.5) + offset = v2f.zero(), + + ---@type boolean + sensor = false, + + ---@type number + density = 1.0, + + ---@type number + friction = 0.2, + + ---@type number + restitution = 0.0 } ---@overload fun(self: circle_collider) @@ -59,10 +83,26 @@ local polygon_collider = { disabled = false, ---@type v2f[] - points = {}, + points = { + v2f.new(-0.5, -0.5), + v2f.new( 0.5, -0.5), + v2f.new( 0.5, 0.5), + v2f.new(-0.5, 0.5)}, ---@type v2f - pivot = v2f.new(0.5) + offset = v2f.zero(), + + ---@type boolean + sensor = false, + + ---@type number + density = 1.0, + + ---@type number + friction = 0.2, + + ---@type number + restitution = 0.0 } ---@overload fun(self: polygon_collider) diff --git a/sources/enduro2d/high/bindings/high_binds/components/colliders_binds.cpp b/sources/enduro2d/high/bindings/high_binds/components/colliders_binds.cpp index 80b98d89..3c37c1e9 100644 --- a/sources/enduro2d/high/bindings/high_binds/components/colliders_binds.cpp +++ b/sources/enduro2d/high/bindings/high_binds/components/colliders_binds.cpp @@ -60,12 +60,44 @@ namespace c->size(v); }), - "pivot", sol::property( + "offset", sol::property( [](const gcomponent& c) -> v2f { - return c->pivot(); + return c->offset(); }, [](gcomponent& c, const v2f& v){ - c->pivot(v); + c->offset(v); + }), + + "sensor", sol::property( + [](const gcomponent& c) -> bool { + return c->sensor(); + }, + [](gcomponent& c, bool v){ + c->sensor(v); + }), + + "density", sol::property( + [](const gcomponent& c) -> f32 { + return c->density(); + }, + [](gcomponent& c, f32 v){ + c->density(v); + }), + + "friction", sol::property( + [](const gcomponent& c) -> f32 { + return c->friction(); + }, + [](gcomponent& c, f32 v){ + c->friction(v); + }), + + "restitution", sol::property( + [](const gcomponent& c) -> f32 { + return c->restitution(); + }, + [](gcomponent& c, f32 v){ + c->restitution(v); }) ); } @@ -116,12 +148,44 @@ namespace c->radius(v); }), - "pivot", sol::property( + "offset", sol::property( [](const gcomponent& c) -> v2f { - return c->pivot(); + return c->offset(); }, [](gcomponent& c, const v2f& v){ - c->pivot(v); + c->offset(v); + }), + + "sensor", sol::property( + [](const gcomponent& c) -> bool { + return c->sensor(); + }, + [](gcomponent& c, bool v){ + c->sensor(v); + }), + + "density", sol::property( + [](const gcomponent& c) -> f32 { + return c->density(); + }, + [](gcomponent& c, f32 v){ + c->density(v); + }), + + "friction", sol::property( + [](const gcomponent& c) -> f32 { + return c->friction(); + }, + [](gcomponent& c, f32 v){ + c->friction(v); + }), + + "restitution", sol::property( + [](const gcomponent& c) -> f32 { + return c->restitution(); + }, + [](gcomponent& c, f32 v){ + c->restitution(v); }) ); } @@ -172,12 +236,44 @@ namespace c->points(std::move(v)); }), - "pivot", sol::property( + "offset", sol::property( [](const gcomponent& c) -> v2f { - return c->pivot(); + return c->offset(); }, [](gcomponent& c, const v2f& v){ - c->pivot(v); + c->offset(v); + }), + + "sensor", sol::property( + [](const gcomponent& c) -> bool { + return c->sensor(); + }, + [](gcomponent& c, bool v){ + c->sensor(v); + }), + + "density", sol::property( + [](const gcomponent& c) -> f32 { + return c->density(); + }, + [](gcomponent& c, f32 v){ + c->density(v); + }), + + "friction", sol::property( + [](const gcomponent& c) -> f32 { + return c->friction(); + }, + [](gcomponent& c, f32 v){ + c->friction(v); + }), + + "restitution", sol::property( + [](const gcomponent& c) -> f32 { + return c->restitution(); + }, + [](gcomponent& c, f32 v){ + c->restitution(v); }) ); } diff --git a/sources/enduro2d/high/components/colliders.cpp b/sources/enduro2d/high/components/colliders.cpp index a83df685..dd0b5e34 100644 --- a/sources/enduro2d/high/components/colliders.cpp +++ b/sources/enduro2d/high/components/colliders.cpp @@ -15,13 +15,13 @@ namespace impl::collider_base& component, const factory_loader<>::fill_context& ctx) { - if ( ctx.root.HasMember("pivot") ) { - v2f pivot = component.pivot(); - if ( !json_utils::try_parse_value(ctx.root["pivot"], pivot) ) { - the().error("COLLIDER_BASE: Incorrect formatting of 'pivot' property"); + if ( ctx.root.HasMember("offset") ) { + v2f offset = component.offset(); + if ( !json_utils::try_parse_value(ctx.root["offset"], offset) ) { + the().error("COLLIDER_BASE: Incorrect formatting of 'offset' property"); return false; } - component.pivot(pivot); + component.offset(offset); } if ( ctx.root.HasMember("sensor") ) { @@ -65,10 +65,10 @@ namespace template < typename Collider > void collider_base_inspector(impl::collider_base& c) { - if ( v2f pivot = c.pivot(); - ImGui::DragFloat2("pivot", pivot.data(), 0.01f) ) + if ( v2f offset = c.offset(); + ImGui::DragFloat2("offset", offset.data(), 1.f) ) { - c.pivot(pivot); + c.offset(offset); } if ( bool sensor = c.sensor(); @@ -105,7 +105,7 @@ namespace e2d "additionalProperties" : false, "properties" : { "size" : { "$ref": "#/common_definitions/v2" }, - "pivot" : { "$ref": "#/common_definitions/v2" }, + "offset" : { "$ref": "#/common_definitions/v2" }, "sensor" : { "type" : "boolean" }, "density" : { "type" : "number" }, "friction" : { "type" : "number" }, @@ -147,7 +147,7 @@ namespace e2d "additionalProperties" : false, "properties" : { "radius" : { "type" : "number" }, - "pivot" : { "$ref": "#/common_definitions/v2" }, + "offset" : { "$ref": "#/common_definitions/v2" }, "sensor" : { "type" : "boolean" }, "density" : { "type" : "number" }, "friction" : { "type" : "number" }, @@ -188,7 +188,7 @@ namespace e2d "additionalProperties" : false, "properties" : { "points" : { "$ref": "#/definitions/points" }, - "pivot" : { "$ref": "#/common_definitions/v2" }, + "offset" : { "$ref": "#/common_definitions/v2" }, "sensor" : { "type" : "boolean" }, "density" : { "type" : "number" }, "friction" : { "type" : "number" }, @@ -233,7 +233,7 @@ namespace e2d void component_inspector::operator()(gcomponent& c) const { if ( v2f size = c->size(); - ImGui::DragFloat2("size", size.data(), 1.f, 0.f, std::numeric_limits::max()) ) + ImGui::DragFloat2("size", size.data(), 1.f, 1.f, std::numeric_limits::max()) ) { c->size(size); } @@ -248,7 +248,7 @@ namespace e2d void component_inspector::operator()(gcomponent& c) const { if ( f32 radius = c->radius(); - ImGui::DragFloat("radius", &radius, 1.f, 0.f, std::numeric_limits::max()) ) + ImGui::DragFloat("radius", &radius, 1.f, 1.f, std::numeric_limits::max()) ) { c->radius(radius); }