bind collider base

This commit is contained in:
2020-01-25 06:24:42 +07:00
parent aad3a6c4e1
commit d9a8fe17fd
4 changed files with 178 additions and 38 deletions

View File

@@ -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 >

View File

@@ -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)

View File

@@ -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);
})
);
}

View File

@@ -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);
}