void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) { if (unparenting) 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 = 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()); if (trigger) co->set_shape_as_trigger(co->get_shape_count()-1,true); } } 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()); if (trigger) co->set_shape_as_trigger(co->get_shape_count()-1,true); } //co->add_shape(shape,get_transform()); }
void CollisionShape2D::_add_to_collision_object(Object *p_obj) { if (unparenting) return; CollisionObject2D *co = p_obj->cast_to<CollisionObject2D>(); ERR_FAIL_COND(!co); update_shape_index=co->get_shape_count(); co->add_shape(shape,get_transform()); if (trigger) co->set_shape_as_trigger(co->get_shape_count()-1,true); }