mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-15 00:11:55 +07:00
bind collider base
This commit is contained in:
@@ -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<v2f>& points() noexcept;
|
||||
[[nodiscard]] const vector<v2f>& points() const noexcept;
|
||||
private:
|
||||
vector<v2f> points_;
|
||||
vector<v2f> 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<Collider>::pivot(const v2f& value) noexcept {
|
||||
pivot_ = value;
|
||||
Collider& collider_base<Collider>::offset(const v2f& value) noexcept {
|
||||
offset_ = value;
|
||||
return static_cast<Collider&>(*this);
|
||||
}
|
||||
|
||||
template < typename Collider >
|
||||
const v2f& collider_base<Collider>::pivot() const noexcept {
|
||||
return pivot_;
|
||||
const v2f& collider_base<Collider>::offset() const noexcept {
|
||||
return offset_;
|
||||
}
|
||||
|
||||
template < typename Collider >
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -60,12 +60,44 @@ namespace
|
||||
c->size(v);
|
||||
}),
|
||||
|
||||
"pivot", sol::property(
|
||||
"offset", sol::property(
|
||||
[](const gcomponent<rect_collider>& c) -> v2f {
|
||||
return c->pivot();
|
||||
return c->offset();
|
||||
},
|
||||
[](gcomponent<rect_collider>& c, const v2f& v){
|
||||
c->pivot(v);
|
||||
c->offset(v);
|
||||
}),
|
||||
|
||||
"sensor", sol::property(
|
||||
[](const gcomponent<rect_collider>& c) -> bool {
|
||||
return c->sensor();
|
||||
},
|
||||
[](gcomponent<rect_collider>& c, bool v){
|
||||
c->sensor(v);
|
||||
}),
|
||||
|
||||
"density", sol::property(
|
||||
[](const gcomponent<rect_collider>& c) -> f32 {
|
||||
return c->density();
|
||||
},
|
||||
[](gcomponent<rect_collider>& c, f32 v){
|
||||
c->density(v);
|
||||
}),
|
||||
|
||||
"friction", sol::property(
|
||||
[](const gcomponent<rect_collider>& c) -> f32 {
|
||||
return c->friction();
|
||||
},
|
||||
[](gcomponent<rect_collider>& c, f32 v){
|
||||
c->friction(v);
|
||||
}),
|
||||
|
||||
"restitution", sol::property(
|
||||
[](const gcomponent<rect_collider>& c) -> f32 {
|
||||
return c->restitution();
|
||||
},
|
||||
[](gcomponent<rect_collider>& c, f32 v){
|
||||
c->restitution(v);
|
||||
})
|
||||
);
|
||||
}
|
||||
@@ -116,12 +148,44 @@ namespace
|
||||
c->radius(v);
|
||||
}),
|
||||
|
||||
"pivot", sol::property(
|
||||
"offset", sol::property(
|
||||
[](const gcomponent<circle_collider>& c) -> v2f {
|
||||
return c->pivot();
|
||||
return c->offset();
|
||||
},
|
||||
[](gcomponent<circle_collider>& c, const v2f& v){
|
||||
c->pivot(v);
|
||||
c->offset(v);
|
||||
}),
|
||||
|
||||
"sensor", sol::property(
|
||||
[](const gcomponent<circle_collider>& c) -> bool {
|
||||
return c->sensor();
|
||||
},
|
||||
[](gcomponent<circle_collider>& c, bool v){
|
||||
c->sensor(v);
|
||||
}),
|
||||
|
||||
"density", sol::property(
|
||||
[](const gcomponent<circle_collider>& c) -> f32 {
|
||||
return c->density();
|
||||
},
|
||||
[](gcomponent<circle_collider>& c, f32 v){
|
||||
c->density(v);
|
||||
}),
|
||||
|
||||
"friction", sol::property(
|
||||
[](const gcomponent<circle_collider>& c) -> f32 {
|
||||
return c->friction();
|
||||
},
|
||||
[](gcomponent<circle_collider>& c, f32 v){
|
||||
c->friction(v);
|
||||
}),
|
||||
|
||||
"restitution", sol::property(
|
||||
[](const gcomponent<circle_collider>& c) -> f32 {
|
||||
return c->restitution();
|
||||
},
|
||||
[](gcomponent<circle_collider>& c, f32 v){
|
||||
c->restitution(v);
|
||||
})
|
||||
);
|
||||
}
|
||||
@@ -172,12 +236,44 @@ namespace
|
||||
c->points(std::move(v));
|
||||
}),
|
||||
|
||||
"pivot", sol::property(
|
||||
"offset", sol::property(
|
||||
[](const gcomponent<polygon_collider>& c) -> v2f {
|
||||
return c->pivot();
|
||||
return c->offset();
|
||||
},
|
||||
[](gcomponent<polygon_collider>& c, const v2f& v){
|
||||
c->pivot(v);
|
||||
c->offset(v);
|
||||
}),
|
||||
|
||||
"sensor", sol::property(
|
||||
[](const gcomponent<polygon_collider>& c) -> bool {
|
||||
return c->sensor();
|
||||
},
|
||||
[](gcomponent<polygon_collider>& c, bool v){
|
||||
c->sensor(v);
|
||||
}),
|
||||
|
||||
"density", sol::property(
|
||||
[](const gcomponent<polygon_collider>& c) -> f32 {
|
||||
return c->density();
|
||||
},
|
||||
[](gcomponent<polygon_collider>& c, f32 v){
|
||||
c->density(v);
|
||||
}),
|
||||
|
||||
"friction", sol::property(
|
||||
[](const gcomponent<polygon_collider>& c) -> f32 {
|
||||
return c->friction();
|
||||
},
|
||||
[](gcomponent<polygon_collider>& c, f32 v){
|
||||
c->friction(v);
|
||||
}),
|
||||
|
||||
"restitution", sol::property(
|
||||
[](const gcomponent<polygon_collider>& c) -> f32 {
|
||||
return c->restitution();
|
||||
},
|
||||
[](gcomponent<polygon_collider>& c, f32 v){
|
||||
c->restitution(v);
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
@@ -15,13 +15,13 @@ namespace
|
||||
impl::collider_base<Collider>& 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<debug>().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<debug>().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<Collider>& 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<rect_collider>::operator()(gcomponent<rect_collider>& c) const {
|
||||
if ( v2f size = c->size();
|
||||
ImGui::DragFloat2("size", size.data(), 1.f, 0.f, std::numeric_limits<f32>::max()) )
|
||||
ImGui::DragFloat2("size", size.data(), 1.f, 1.f, std::numeric_limits<f32>::max()) )
|
||||
{
|
||||
c->size(size);
|
||||
}
|
||||
@@ -248,7 +248,7 @@ namespace e2d
|
||||
|
||||
void component_inspector<circle_collider>::operator()(gcomponent<circle_collider>& c) const {
|
||||
if ( f32 radius = c->radius();
|
||||
ImGui::DragFloat("radius", &radius, 1.f, 0.f, std::numeric_limits<f32>::max()) )
|
||||
ImGui::DragFloat("radius", &radius, 1.f, 1.f, std::numeric_limits<f32>::max()) )
|
||||
{
|
||||
c->radius(radius);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user