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 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); }
void CollisionPolygon2D::set_trigger(bool p_trigger) { trigger = p_trigger; _update_parent(); 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); } } }
void CollisionShape2D::set_trigger(bool p_trigger) { trigger=p_trigger; if (can_update_body) { _update_parent(); } else if (is_inside_tree() && update_shape_index>=0) { CollisionObject2D *co = get_parent()->cast_to<CollisionObject2D>(); if (co) { co->set_shape_as_trigger(update_shape_index,p_trigger); } } }