summaryrefslogtreecommitdiff
path: root/scene/2d/collision_polygon_2d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/2d/collision_polygon_2d.cpp')
-rw-r--r--scene/2d/collision_polygon_2d.cpp203
1 files changed, 95 insertions, 108 deletions
diff --git a/scene/2d/collision_polygon_2d.cpp b/scene/2d/collision_polygon_2d.cpp
index 85241a79e0..abc044f10f 100644
--- a/scene/2d/collision_polygon_2d.cpp
+++ b/scene/2d/collision_polygon_2d.cpp
@@ -39,57 +39,54 @@ void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) {
CollisionObject2D *co = p_obj->cast_to<CollisionObject2D>();
ERR_FAIL_COND(!co);
- if (polygon.size()==0)
+ if (polygon.size() == 0)
return;
- bool solids=build_mode==BUILD_SOLIDS;
+ bool solids = build_mode == BUILD_SOLIDS;
if (solids) {
//here comes the sun, lalalala
//decompose concave into multiple convex polygons and add them
- Vector< Vector<Vector2> > decomp = _decompose_in_convex();
- shape_from=co->get_shape_count();
- for(int i=0;i<decomp.size();i++) {
- Ref<ConvexPolygonShape2D> convex = memnew( ConvexPolygonShape2D );
+ Vector<Vector<Vector2> > decomp = _decompose_in_convex();
+ shape_from = co->get_shape_count();
+ for (int i = 0; i < decomp.size(); i++) {
+ Ref<ConvexPolygonShape2D> convex = memnew(ConvexPolygonShape2D);
convex->set_points(decomp[i]);
- co->add_shape(convex,get_transform());
+ co->add_shape(convex, get_transform());
if (trigger)
- co->set_shape_as_trigger(co->get_shape_count()-1,true);
-
+ co->set_shape_as_trigger(co->get_shape_count() - 1, true);
}
- shape_to=co->get_shape_count()-1;
- if (shape_to<shape_from) {
- shape_from=-1;
- shape_to=-1;
+ shape_to = co->get_shape_count() - 1;
+ if (shape_to < shape_from) {
+ shape_from = -1;
+ shape_to = -1;
}
} else {
- Ref<ConcavePolygonShape2D> concave = memnew( ConcavePolygonShape2D );
+ Ref<ConcavePolygonShape2D> concave = memnew(ConcavePolygonShape2D);
PoolVector<Vector2> segments;
- segments.resize(polygon.size()*2);
- PoolVector<Vector2>::Write w=segments.write();
+ segments.resize(polygon.size() * 2);
+ PoolVector<Vector2>::Write w = segments.write();
- for(int i=0;i<polygon.size();i++) {
- w[(i<<1)+0]=polygon[i];
- w[(i<<1)+1]=polygon[(i+1)%polygon.size()];
+ for (int i = 0; i < polygon.size(); i++) {
+ w[(i << 1) + 0] = polygon[i];
+ w[(i << 1) + 1] = polygon[(i + 1) % polygon.size()];
}
- w=PoolVector<Vector2>::Write();
+ w = PoolVector<Vector2>::Write();
concave->set_segments(segments);
- co->add_shape(concave,get_transform());
+ co->add_shape(concave, get_transform());
if (trigger)
- co->set_shape_as_trigger(co->get_shape_count()-1,true);
-
- shape_from=co->get_shape_count()-1;
- shape_to=co->get_shape_count()-1;
+ co->set_shape_as_trigger(co->get_shape_count() - 1, true);
+ shape_from = co->get_shape_count() - 1;
+ shape_to = co->get_shape_count() - 1;
}
-
//co->add_shape(shape,get_transform());
}
@@ -106,41 +103,41 @@ void CollisionPolygon2D::_update_parent() {
co->_update_shapes_from_children();
}
-Vector< Vector<Vector2> > CollisionPolygon2D::_decompose_in_convex() {
+Vector<Vector<Vector2> > CollisionPolygon2D::_decompose_in_convex() {
- Vector< Vector<Vector2> > decomp;
+ Vector<Vector<Vector2> > decomp;
#if 0
//fast but imprecise triangulator, gave us problems
decomp = Geometry::decompose_polygon(polygon);
#else
- List<TriangulatorPoly> in_poly,out_poly;
+ List<TriangulatorPoly> in_poly, out_poly;
TriangulatorPoly inp;
inp.Init(polygon.size());
- for(int i=0;i<polygon.size();i++) {
- inp.GetPoint(i)=polygon[i];
+ for (int i = 0; i < polygon.size(); i++) {
+ inp.GetPoint(i) = polygon[i];
}
inp.SetOrientation(TRIANGULATOR_CCW);
in_poly.push_back(inp);
TriangulatorPartition tpart;
- if (tpart.ConvexPartition_HM(&in_poly,&out_poly)==0) { //failed!
+ if (tpart.ConvexPartition_HM(&in_poly, &out_poly) == 0) { //failed!
ERR_PRINT("Convex decomposing failed!");
return decomp;
}
decomp.resize(out_poly.size());
- int idx=0;
+ int idx = 0;
- for(List<TriangulatorPoly>::Element*I = out_poly.front();I;I=I->next()) {
+ for (List<TriangulatorPoly>::Element *I = out_poly.front(); I; I = I->next()) {
- TriangulatorPoly& tp = I->get();
+ TriangulatorPoly &tp = I->get();
decomp[idx].resize(tp.GetNumPoints());
- for(int i=0;i<tp.GetNumPoints();i++) {
+ for (int i = 0; i < tp.GetNumPoints(); i++) {
- decomp[idx][i]=tp.GetPoint(i);
+ decomp[idx][i] = tp.GetPoint(i);
}
idx++;
@@ -153,20 +150,19 @@ Vector< Vector<Vector2> > CollisionPolygon2D::_decompose_in_convex() {
void CollisionPolygon2D::_notification(int p_what) {
-
- switch(p_what) {
+ switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
- unparenting=false;
- can_update_body=get_tree()->is_editor_hint();
+ unparenting = false;
+ can_update_body = get_tree()->is_editor_hint();
if (!get_tree()->is_editor_hint()) {
//display above all else
set_z_as_relative(false);
- set_z(VS::CANVAS_ITEM_Z_MAX-1);
+ set_z(VS::CANVAS_ITEM_Z_MAX - 1);
}
} break;
case NOTIFICATION_EXIT_TREE: {
- can_update_body=false;
+ can_update_body = false;
} break;
case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: {
@@ -174,14 +170,13 @@ void CollisionPolygon2D::_notification(int p_what) {
break;
if (can_update_body) {
_update_parent();
- } else if (shape_from>=0 && shape_to>=0) {
+ } else if (shape_from >= 0 && shape_to >= 0) {
CollisionObject2D *co = get_parent()->cast_to<CollisionObject2D>();
- for(int i=shape_from;i<=shape_to;i++) {
- co->set_shape_transform(i,get_transform());
+ for (int i = shape_from; i <= shape_to; i++) {
+ co->set_shape_transform(i, get_transform());
}
}
-
} break;
case NOTIFICATION_DRAW: {
@@ -190,55 +185,52 @@ void CollisionPolygon2D::_notification(int p_what) {
break;
}
-
- for(int i=0;i<polygon.size();i++) {
+ for (int i = 0; i < polygon.size(); i++) {
Vector2 p = polygon[i];
- Vector2 n = polygon[(i+1)%polygon.size()];
- draw_line(p,n,Color(0.9,0.2,0.0,0.8),3);
+ Vector2 n = polygon[(i + 1) % polygon.size()];
+ draw_line(p, n, Color(0.9, 0.2, 0.0, 0.8), 3);
}
#define DEBUG_DECOMPOSE
-#if defined(TOOLS_ENABLED) && defined (DEBUG_DECOMPOSE)
+#if defined(TOOLS_ENABLED) && defined(DEBUG_DECOMPOSE)
- Vector< Vector<Vector2> > decomp = _decompose_in_convex();
+ Vector<Vector<Vector2> > decomp = _decompose_in_convex();
- Color c(0.4,0.9,0.1);
- for(int i=0;i<decomp.size();i++) {
+ Color c(0.4, 0.9, 0.1);
+ for (int i = 0; i < decomp.size(); i++) {
- c.set_hsv( Math::fmod(c.get_h() + 0.738,1),c.get_s(),c.get_v(),0.5);
- draw_colored_polygon(decomp[i],c);
+ c.set_hsv(Math::fmod(c.get_h() + 0.738, 1), c.get_s(), c.get_v(), 0.5);
+ draw_colored_polygon(decomp[i], c);
}
#else
- draw_colored_polygon(polygon,get_tree()->get_debug_collisions_color());
+ draw_colored_polygon(polygon, get_tree()->get_debug_collisions_color());
#endif
-
} break;
case NOTIFICATION_UNPARENTED: {
unparenting = true;
_update_parent();
} break;
-
}
}
-void CollisionPolygon2D::set_polygon(const Vector<Point2>& p_polygon) {
+void CollisionPolygon2D::set_polygon(const Vector<Point2> &p_polygon) {
- polygon=p_polygon;
+ polygon = p_polygon;
if (can_update_body) {
- for(int i=0;i<polygon.size();i++) {
- if (i==0)
- aabb=Rect2(polygon[i],Size2());
+ for (int i = 0; i < polygon.size(); i++) {
+ if (i == 0)
+ aabb = Rect2(polygon[i], Size2());
else
aabb.expand_to(polygon[i]);
}
- if (aabb==Rect2()) {
+ if (aabb == Rect2()) {
- aabb=Rect2(-10,-10,20,20);
+ aabb = Rect2(-10, -10, 20, 20);
} else {
- aabb.pos-=aabb.size*0.3;
- aabb.size+=aabb.size*0.6;
+ aabb.pos -= aabb.size * 0.3;
+ aabb.size += aabb.size * 0.6;
}
_update_parent();
}
@@ -253,12 +245,12 @@ Vector<Point2> CollisionPolygon2D::get_polygon() const {
void CollisionPolygon2D::set_build_mode(BuildMode p_mode) {
- ERR_FAIL_INDEX(p_mode,2);
- build_mode=p_mode;
+ ERR_FAIL_INDEX(p_mode, 2);
+ build_mode = p_mode;
_update_parent();
}
-CollisionPolygon2D::BuildMode CollisionPolygon2D::get_build_mode() const{
+CollisionPolygon2D::BuildMode CollisionPolygon2D::get_build_mode() const {
return build_mode;
}
@@ -270,32 +262,30 @@ Rect2 CollisionPolygon2D::get_item_rect() const {
void CollisionPolygon2D::set_trigger(bool p_trigger) {
- trigger=p_trigger;
+ trigger = p_trigger;
_update_parent();
- if (!can_update_body && is_inside_tree() && shape_from>=0 && shape_to>=0) {
+ if (!can_update_body && is_inside_tree() && shape_from >= 0 && shape_to >= 0) {
CollisionObject2D *co = get_parent()->cast_to<CollisionObject2D>();
- for(int i=shape_from;i<=shape_to;i++) {
- co->set_shape_as_trigger(i,p_trigger);
+ for (int i = shape_from; i <= shape_to; i++) {
+ co->set_shape_as_trigger(i, p_trigger);
}
-
}
}
-bool CollisionPolygon2D::is_trigger() const{
+bool CollisionPolygon2D::is_trigger() const {
return trigger;
}
+void CollisionPolygon2D::_set_shape_range(const Vector2 &p_range) {
-void CollisionPolygon2D::_set_shape_range(const Vector2& p_range) {
-
- shape_from=p_range.x;
- shape_to=p_range.y;
+ shape_from = p_range.x;
+ shape_to = p_range.y;
}
Vector2 CollisionPolygon2D::_get_shape_range() const {
- return Vector2(shape_from,shape_to);
+ return Vector2(shape_from, shape_to);
}
String CollisionPolygon2D::get_configuration_warning() const {
@@ -306,7 +296,6 @@ String CollisionPolygon2D::get_configuration_warning() const {
if (polygon.empty()) {
return TTR("An empty CollisionPolygon2D has no effect on collision.");
-
}
return String();
@@ -314,38 +303,36 @@ String CollisionPolygon2D::get_configuration_warning() const {
void CollisionPolygon2D::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_add_to_collision_object"),&CollisionPolygon2D::_add_to_collision_object);
- ClassDB::bind_method(D_METHOD("set_polygon","polygon"),&CollisionPolygon2D::set_polygon);
- ClassDB::bind_method(D_METHOD("get_polygon"),&CollisionPolygon2D::get_polygon);
-
- ClassDB::bind_method(D_METHOD("set_build_mode","build_mode"),&CollisionPolygon2D::set_build_mode);
- ClassDB::bind_method(D_METHOD("get_build_mode"),&CollisionPolygon2D::get_build_mode);
+ ClassDB::bind_method(D_METHOD("_add_to_collision_object"), &CollisionPolygon2D::_add_to_collision_object);
+ ClassDB::bind_method(D_METHOD("set_polygon", "polygon"), &CollisionPolygon2D::set_polygon);
+ ClassDB::bind_method(D_METHOD("get_polygon"), &CollisionPolygon2D::get_polygon);
- ClassDB::bind_method(D_METHOD("set_trigger","trigger"),&CollisionPolygon2D::set_trigger);
- ClassDB::bind_method(D_METHOD("is_trigger"),&CollisionPolygon2D::is_trigger);
+ ClassDB::bind_method(D_METHOD("set_build_mode", "build_mode"), &CollisionPolygon2D::set_build_mode);
+ ClassDB::bind_method(D_METHOD("get_build_mode"), &CollisionPolygon2D::get_build_mode);
- ClassDB::bind_method(D_METHOD("_set_shape_range","shape_range"),&CollisionPolygon2D::_set_shape_range);
- ClassDB::bind_method(D_METHOD("_get_shape_range"),&CollisionPolygon2D::_get_shape_range);
+ ClassDB::bind_method(D_METHOD("set_trigger", "trigger"), &CollisionPolygon2D::set_trigger);
+ ClassDB::bind_method(D_METHOD("is_trigger"), &CollisionPolygon2D::is_trigger);
- ClassDB::bind_method(D_METHOD("get_collision_object_first_shape"),&CollisionPolygon2D::get_collision_object_first_shape);
- ClassDB::bind_method(D_METHOD("get_collision_object_last_shape"),&CollisionPolygon2D::get_collision_object_last_shape);
+ ClassDB::bind_method(D_METHOD("_set_shape_range", "shape_range"), &CollisionPolygon2D::_set_shape_range);
+ ClassDB::bind_method(D_METHOD("_get_shape_range"), &CollisionPolygon2D::_get_shape_range);
- ADD_PROPERTY( PropertyInfo(Variant::INT,"build_mode",PROPERTY_HINT_ENUM,"Solids,Segments"),"set_build_mode","get_build_mode");
- ADD_PROPERTY( PropertyInfo(Variant::POOL_VECTOR2_ARRAY,"polygon"),"set_polygon","get_polygon");
- ADD_PROPERTY( PropertyInfo(Variant::VECTOR2,"shape_range",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),"_set_shape_range","_get_shape_range");
- ADD_PROPERTY( PropertyInfo(Variant::BOOL,"trigger"),"set_trigger","is_trigger");
+ ClassDB::bind_method(D_METHOD("get_collision_object_first_shape"), &CollisionPolygon2D::get_collision_object_first_shape);
+ ClassDB::bind_method(D_METHOD("get_collision_object_last_shape"), &CollisionPolygon2D::get_collision_object_last_shape);
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "build_mode", PROPERTY_HINT_ENUM, "Solids,Segments"), "set_build_mode", "get_build_mode");
+ ADD_PROPERTY(PropertyInfo(Variant::POOL_VECTOR2_ARRAY, "polygon"), "set_polygon", "get_polygon");
+ ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "shape_range", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_shape_range", "_get_shape_range");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "trigger"), "set_trigger", "is_trigger");
}
CollisionPolygon2D::CollisionPolygon2D() {
- aabb=Rect2(-10,-10,20,20);
- build_mode=BUILD_SOLIDS;
- trigger=false;
- unparenting=false;
- shape_from=-1;
- shape_to=-1;
- can_update_body=false;
+ aabb = Rect2(-10, -10, 20, 20);
+ build_mode = BUILD_SOLIDS;
+ trigger = false;
+ unparenting = false;
+ shape_from = -1;
+ shape_to = -1;
+ can_update_body = false;
set_notify_local_transform(true);
-
}