void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) { if (unparenting || !can_update_body) return; CollisionObject2D *co = p_obj->cast_to<CollisionObject2D>(); ERR_FAIL_COND(!co); if (polygon.size() == 0) return; 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); convex->set_points(decomp[i]); co->add_shape(convex, get_transform()); if (trigger) 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; } } else { Ref<ConcavePolygonShape2D> concave = memnew(ConcavePolygonShape2D); PoolVector<Vector2> segments; 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()]; } w = PoolVector<Vector2>::Write(); concave->set_segments(segments); 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->add_shape(shape,get_transform()); }
void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) { CollisionObject2D *co = p_obj->cast_to<CollisionObject2D>(); ERR_FAIL_COND(!co); if (polygon.size()==0) return; 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 = Geometry::decompose_polygon(polygon); for(int i=0;i<decomp.size();i++) { Ref<ConvexPolygonShape2D> convex = memnew( ConvexPolygonShape2D ); convex->set_points(decomp[i]); co->add_shape(convex,get_transform()); } } else { Ref<ConcavePolygonShape2D> concave = memnew( ConcavePolygonShape2D ); DVector<Vector2> segments; segments.resize(polygon.size()*2); DVector<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()]; } w=DVector<Vector2>::Write(); concave->set_segments(segments); co->add_shape(concave,get_transform()); } //co->add_shape(shape,get_transform()); }
void CollisionShape2D::_add_to_collision_object(Object *p_obj) { CollisionObject2D *co = p_obj->cast_to<CollisionObject2D>(); ERR_FAIL_COND(!co); co->add_shape(shape,get_transform()); if (trigger) co->set_shape_as_trigger(co->get_shape_count()-1,true); }