Exemplo n.º 1
0
void Physics2DServerSW::free(RID p_rid) {

	if (shape_owner.owns(p_rid)) {

		Shape2DSW *shape = shape_owner.get(p_rid);

		while (shape->get_owners().size()) {
			ShapeOwner2DSW *so = shape->get_owners().front()->key();
			so->remove_shape(shape);
		}

		shape_owner.free(p_rid);
		memdelete(shape);
	} else if (body_owner.owns(p_rid)) {

		Body2DSW *body = body_owner.get(p_rid);

		/*
		if (body->get_state_query())
			_clear_query(body->get_state_query());

		if (body->get_direct_state_query())
			_clear_query(body->get_direct_state_query());
		*/

		body_set_space(p_rid, RID());

		while (body->get_shape_count()) {

			body->remove_shape(0);
		}

		body_owner.free(p_rid);
		memdelete(body);

	} else if (area_owner.owns(p_rid)) {

		Area2DSW *area = area_owner.get(p_rid);

		/*
		if (area->get_monitor_query())
			_clear_query(area->get_monitor_query());
		*/

		area->set_space(NULL);

		while (area->get_shape_count()) {

			area->remove_shape(0);
		}

		area_owner.free(p_rid);
		memdelete(area);
	} else if (space_owner.owns(p_rid)) {

		Space2DSW *space = space_owner.get(p_rid);

		while (space->get_objects().size()) {
			CollisionObject2DSW *co = (CollisionObject2DSW *)space->get_objects().front()->get();
			co->set_space(NULL);
		}

		active_spaces.erase(space);
		free(space->get_default_area()->get_self());
		space_owner.free(p_rid);
		memdelete(space);
	} else if (joint_owner.owns(p_rid)) {

		Joint2DSW *joint = joint_owner.get(p_rid);

		joint_owner.free(p_rid);
		memdelete(joint);

	} else {

		ERR_EXPLAIN("Invalid ID");
		ERR_FAIL();
	}
};
int Physics2DServerSW::body_get_max_contacts_reported(RID p_body) const {

	Body2DSW *body = body_owner.get(p_body);
	ERR_FAIL_COND_V(!body,-1);
	return body->get_max_contacts_reported();
}
void Physics2DServerSW::body_set_one_way_collision_direction(RID p_body,const Vector2& p_direction) {

	Body2DSW *body = body_owner.get(p_body);
	ERR_FAIL_COND(!body);
	body->set_one_way_collision_direction(p_direction);
}
void Physics2DServerSW::body_set_max_contacts_reported(RID p_body, int p_contacts) {

	Body2DSW *body = body_owner.get(p_body);
	ERR_FAIL_COND(!body);
	body->set_max_contacts_reported(p_contacts);
}
bool Physics2DServerSW::body_is_omitting_force_integration(RID p_body) const {

	Body2DSW *body = body_owner.get(p_body);
	ERR_FAIL_COND_V(!body,false);
	return body->get_omit_force_integration();
};
Vector2 Physics2DServerSW::body_get_applied_force(RID p_body) const {

	Body2DSW *body = body_owner.get(p_body);
	ERR_FAIL_COND_V(!body,Vector2());
	return body->get_applied_force();
};
Variant Physics2DServerSW::body_get_shape_metadata(RID p_body, int p_shape_idx) const {

	Body2DSW *body = body_owner.get(p_body);
	ERR_FAIL_COND_V(!body,Variant());
	return body->get_shape_metadata(p_shape_idx);
}
void Physics2DServerSW::body_set_shape_metadata(RID p_body, int p_shape_idx, const Variant& p_metadata) {

	Body2DSW *body = body_owner.get(p_body);
	ERR_FAIL_COND(!body);
	body->set_shape_metadata(p_shape_idx,p_metadata);
}