コード例 #1
0
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());
}
コード例 #2
0
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);

}
コード例 #3
0
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);
		}
	}
}
コード例 #4
0
ファイル: collision_shape_2d.cpp プロジェクト: 93i/godot
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);
        }
    }
}