collider gizmos

This commit is contained in:
2020-01-25 09:10:33 +07:00
parent d9a8fe17fd
commit 22137cb7c1
10 changed files with 115 additions and 11 deletions

View File

@@ -136,6 +136,7 @@ namespace e2d
static const char* title;
void operator()(gcomponent<rect_collider>& c) const;
void operator()(gcomponent<rect_collider>& c, gizmos_context& ctx) const;
};
template <>
@@ -144,6 +145,7 @@ namespace e2d
static const char* title;
void operator()(gcomponent<circle_collider>& c) const;
void operator()(gcomponent<circle_collider>& c, gizmos_context& ctx) const;
};
template <>
@@ -152,6 +154,7 @@ namespace e2d
static const char* title;
void operator()(gcomponent<polygon_collider>& c) const;
void operator()(gcomponent<polygon_collider>& c, gizmos_context& ctx) const;
};
}

View File

@@ -90,6 +90,11 @@ namespace e2d::math
return deg * deg_to_rad<T>();
}
template < typename T >
rad<T> deg_to_rad(const deg<T>& deg) noexcept {
return rad<T>(deg_to_rad(deg.value));
}
//
// rad_to_deg
//
@@ -111,6 +116,11 @@ namespace e2d::math
rad_to_deg(T rad) noexcept {
return rad * rad_to_deg<T>();
}
template < typename T >
deg<T> rad_to_deg(const rad<T>& rad) noexcept {
return deg<T>(rad_to_deg(rad.value));
}
}
namespace e2d
@@ -129,7 +139,7 @@ namespace e2d
struct unit_converter<rad_tag, deg_tag> {
template < typename T >
deg<T> operator()(const rad<T>& u) const noexcept {
return make_deg(math::rad_to_deg(u.value));
return math::rad_to_deg(u);
}
};
@@ -138,7 +148,7 @@ namespace e2d
public:
template < typename T >
rad<T> operator()(const deg<T>& u) const noexcept {
return make_rad(math::deg_to_rad(u.value));
return math::deg_to_rad(u);
}
};
}
@@ -154,11 +164,21 @@ namespace e2d::math
return u.template convert_to<deg_tag>();
}
template < typename T, typename Tag >
T to_deg_v(const unit<T, Tag>& u) noexcept {
return to_deg(u).value;
}
template < typename T, typename Tag >
rad<T> to_rad(const unit<T, Tag>& u) noexcept {
return u.template convert_to<rad_tag>();
}
template < typename T, typename Tag >
T to_rad_v(const unit<T, Tag>& u) noexcept {
return to_rad(u).value;
}
//
// cos/sin/tan
//

View File

@@ -31,6 +31,9 @@
},
"rect_collider" : {
"size" : [66,113]
},
"circle_collider" : {
"radius" : 33
}
}
},{
@@ -52,6 +55,14 @@
},
"rect_collider" : {
"size" : [66,113]
},
"polygon_collider" : {
"points" : [
[-20,0],
[20,0],
[30,-50],
[-30,-50]
]
}
}
},{

View File

@@ -1,5 +1,5 @@
{
"texture" : "ships.png",
"pivot" : { "x" : 441, "y" : 340 },
"pivot" : { "x" : 441, "y" : 340.5 },
"texrect" : { "x" : 408, "y" : 284, "w" : 66, "h" : 113 }
}

View File

@@ -6,4 +6,15 @@ cloc \
$SCRIPT_DIR/../samples/bin \
$SCRIPT_DIR/../samples/sources \
$SCRIPT_DIR/../untests/bin \
$SCRIPT_DIR/../untests/sources
$SCRIPT_DIR/../untests/sources \
$SCRIPT_DIR/../modules/curly.hpp/headers \
$SCRIPT_DIR/../modules/curly.hpp/sources \
$SCRIPT_DIR/../modules/curly.hpp/untests \
$SCRIPT_DIR/../modules/ecs.hpp/headers \
$SCRIPT_DIR/../modules/ecs.hpp/untests \
$SCRIPT_DIR/../modules/enum.hpp/headers \
$SCRIPT_DIR/../modules/enum.hpp/untests \
$SCRIPT_DIR/../modules/flat.hpp/headers \
$SCRIPT_DIR/../modules/flat.hpp/untests \
$SCRIPT_DIR/../modules/promise.hpp/headers \
$SCRIPT_DIR/../modules/promise.hpp/untests

View File

@@ -2,4 +2,10 @@
SCRIPT_DIR=`dirname "$BASH_SOURCE"`
cloc \
$SCRIPT_DIR/../headers/enduro2d \
$SCRIPT_DIR/../sources/enduro2d
$SCRIPT_DIR/../sources/enduro2d \
$SCRIPT_DIR/../modules/curly.hpp/headers \
$SCRIPT_DIR/../modules/curly.hpp/sources \
$SCRIPT_DIR/../modules/ecs.hpp/headers \
$SCRIPT_DIR/../modules/enum.hpp/headers \
$SCRIPT_DIR/../modules/flat.hpp/headers \
$SCRIPT_DIR/../modules/promise.hpp/headers

14
scripts/cloc_modules.sh Executable file
View File

@@ -0,0 +1,14 @@
#!/bin/bash
SCRIPT_DIR=`dirname "$BASH_SOURCE"`
cloc \
$SCRIPT_DIR/../modules/curly.hpp/headers \
$SCRIPT_DIR/../modules/curly.hpp/sources \
$SCRIPT_DIR/../modules/curly.hpp/untests \
$SCRIPT_DIR/../modules/ecs.hpp/headers \
$SCRIPT_DIR/../modules/ecs.hpp/untests \
$SCRIPT_DIR/../modules/enum.hpp/headers \
$SCRIPT_DIR/../modules/enum.hpp/untests \
$SCRIPT_DIR/../modules/flat.hpp/headers \
$SCRIPT_DIR/../modules/flat.hpp/untests \
$SCRIPT_DIR/../modules/promise.hpp/headers \
$SCRIPT_DIR/../modules/promise.hpp/untests

View File

@@ -240,6 +240,20 @@ namespace e2d
collider_base_inspector(*c);
}
void component_inspector<rect_collider>::operator()(
gcomponent<rect_collider>& c,
gizmos_context& ctx) const
{
const v2f& p = c->offset() - c->size() * 0.5f;
const v2f& s = c->size();
ctx.draw_wire_rect(
p,
p + s * v2f::unit_x(),
p + s,
p + s * v2f::unit_y(),
ctx.selected() ? color32::cyan() : color32::green());
}
}
namespace e2d
@@ -255,6 +269,17 @@ namespace e2d
collider_base_inspector(*c);
}
void component_inspector<circle_collider>::operator()(
gcomponent<circle_collider>& c,
gizmos_context& ctx) const
{
ctx.draw_wire_circle(
c->offset(),
c->radius(),
math::to_rad_v(math::two_pi<f32>()) * c->radius() * 0.2f,
ctx.selected() ? color32::cyan() : color32::green());
}
}
namespace e2d
@@ -288,4 +313,18 @@ namespace e2d
collider_base_inspector(*c);
}
void component_inspector<polygon_collider>::operator()(
gcomponent<polygon_collider>& c,
gizmos_context& ctx) const
{
const v2f& o = c->offset();
const vector<v2f>& points = c->points();
for ( std::size_t i = 0, e = c->points().size(); i < e; ++i ) {
ctx.draw_line(
o + points[i],
o + (i + 1u == e ? points[0] : points[i + 1u]),
ctx.selected() ? color32::cyan() : color32::green());
}
}
}

View File

@@ -5,17 +5,17 @@
"rect_collider" : {
"size" : [1,2],
"pivot" : [2,4]
"offset" : [2,4]
},
"circle_collider" : {
"radius" : 5,
"pivot" : [4,2]
"offset" : [4,2]
},
"polygon_collider" : {
"points" : [[1,2],[2,3],[3,4]],
"pivot" : [8,4]
"offset" : [8,4]
}
}
}

View File

@@ -255,15 +255,15 @@ TEST_CASE("library"){
REQUIRE(e.exists_component<rect_collider>());
REQUIRE(e.get_component<rect_collider>().size() == v2f(1.f,2.f));
REQUIRE(e.get_component<rect_collider>().pivot() == v2f(2.f,4.f));
REQUIRE(e.get_component<rect_collider>().offset() == v2f(2.f,4.f));
REQUIRE(e.exists_component<circle_collider>());
REQUIRE(math::approximately(e.get_component<circle_collider>().radius(), 5.f));
REQUIRE(e.get_component<circle_collider>().pivot() == v2f(4.f,2.f));
REQUIRE(e.get_component<circle_collider>().offset() == v2f(4.f,2.f));
REQUIRE(e.exists_component<polygon_collider>());
REQUIRE(e.get_component<polygon_collider>().points() == vector<v2f>{{1,2},{2,3},{3,4}});
REQUIRE(e.get_component<polygon_collider>().pivot() == v2f(8.f,4.f));
REQUIRE(e.get_component<polygon_collider>().offset() == v2f(8.f,4.f));
}
}
}