Example #1
0
void update(int t) {

	if (currentCamera == 0) {

		cameraAngle += (diffMouseDownX / 100.0);
		cameraDistance = (cameraDistance += (diffMouseDownY / 20.0)) < 10 ? 10 : cameraDistance;
		camera.set(
			cameraDistance * cos(cameraAngle * (M_PI / 180)),
			cameraElevation,
			cameraDistance * sin(cameraAngle * (M_PI / 180))
			);
		cameraLookAt = Vector3();
		cameraUp = Vector3(0, 1, 0);

	}
	else if (currentCamera == 1) {

		aboveCamera.y = (std::max(50.0, aboveCamera.y + (diffMouseDownY / 100.0)));

		aboveCameraLookAt = Vector3(0, aboveCamera.y - 100, aboveCamera.z);
		cameraLookAt = aboveCameraLookAt;
		camera.set(aboveCamera.x, aboveCamera.y, aboveCamera.z);
		cameraUp = aboveCameraUp;

	}
	else if (currentCamera == 2) {

		frontCamera.y = (frontCamera.y + (diffMouseDownY / 100.0));
		frontCamera.x = (frontCamera.x - (diffMouseDownX / 100.0));
		frontCamera.z = (cameraDistance);

		frontCameraLookAt = frontCamera.add(Vector3(0.0, 0.0, -1.0));
		cameraLookAt = frontCameraLookAt;

		camera.set(frontCamera.x, frontCamera.y, frontCamera.z);

		cameraUp = frontCameraUp;

	}
	else if (currentCamera == 3) {

		getFreeCameraLookAt();
		cameraLookAt = freeCameraLookAt;

		camera.set(freeCamera.x, freeCamera.y, freeCamera.z);

		freeCameraUp.x = sin(upAngle * (M_PI / 180));
		freeCameraUp.y = cos(upAngle * (M_PI / 180));

		cameraUp = freeCameraUp;

	}
	else if (currentCamera >= 4) {

		updateFlyBy();

		cameraLookAt = flyBySettings.lookAt;
		camera.set(
			flyBySettings.position.x,
			flyBySettings.position.y,
			flyBySettings.position.z
			);

		cameraUp = flyBySettings.up;

	}

	gravity.y = gravityIntensity;

	particleSystem.applyForce(gravity);

	for (int i = 0; i < 9; i++) {
		if (gravitationalForce[i].type != GRAVITATIONALFORCETYPE_NONE) {
			particleSystem.applyGravitationalForce(gravitationalForce[i]);
		}
	}

	if (cycleColours) {
		colourSwitch--;
		if (colourSwitch == 0) {
			colourSwitch = 10;
			Particle::startColour = emitColours[initialColour];
			currentColour = Particle::startColour;
			initialColour = (++initialColour) == colourCount ? 0 : initialColour;
		}
		else {
			Particle::startColour.r = linearEase(10 - colourSwitch, currentColour.r, emitColours[initialColour].r - currentColour.r, 10);
			Particle::startColour.g = linearEase(10 - colourSwitch, currentColour.g, emitColours[initialColour].g - currentColour.g, 10);
			Particle::startColour.b = linearEase(10 - colourSwitch, currentColour.b, emitColours[initialColour].b - currentColour.b, 10);
		}
	}

	particleSystem.update();

	// FPS monitoring
	frame++;
	elapsedTime = glutGet(GLUT_ELAPSED_TIME);
	if (elapsedTime - timebase > 1000) {
		fps = frame * 1000.0 / (elapsedTime - timebase);
		timebase = elapsedTime;
		frame = 0;
	}

	glutPostRedisplay();
	glutTimerFunc(30, update, 0);

}