public void update2(IUpdateInfo uInfo) {
		CollisionDetection.checkBroadphase(this, updateList, collisionTree, uInfo);
		Collection<Manifold> c = Manifold.manifolds.values();
		for (Manifold m : c) {
			for (int i = 0; i < m.size(); i++) {
				ElasticContact e = ElasticContactSolver.addContact(m.getBodyA(), (DynamicBody) m.getBodyB(),
						m.getContact(i));
				// if(m.size()==4){
				// e.setWarmStarting(m.j);
				// }
			}
		}
		ElasticContactSolver.run(uInfo);
		SpeculativeContactSolver.run(uInfo);
		for (final DynamicBody dynBody : updateList) {// TODO all bodies
			dynBody.prepareUpdatePosition(uInfo);
			dynBody.generateSweptBounds(uInfo);
		}
		for (final Constraint contraint : constraintList) {
			contraint.solve(uInfo);
		}

		for (final DynamicBody dynBody : updateList) {
			dynBody.updatePosition(uInfo);
			dynBody.updateBounds();
			final IShape shape = dynBody.getShape();
			if (shape.hasChanged()) {
				collisionTree.hasMoved(shape.getAABB());
			}
		}
		collisionTree.optimize();
		Manifold.update();
		if (uInfo.isPreRendering()) {
			activeCamera.prepareUpdatePosition(uInfo);
			if (activeCamera instanceof TrackingCamera) {
				final TrackingCamera sc = (TrackingCamera) activeCamera;
				if (sc.followBody != null) {
					CollisionDetection.rayCasting(sc, collisionTree);
				}
			}
			activeCamera.updatePosition(uInfo);
			activeLight.updatePosition(uInfo);
		}
	}