1/*******************************************************************************
2 * Copyright 2011 See AUTHORS file.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *   http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 ******************************************************************************/
16
17package com.badlogic.gdx.graphics;
18
19import com.badlogic.gdx.math.Matrix4;
20import com.badlogic.gdx.math.Vector3;
21
22/** A Camera with perspective projection.
23 *
24 * @author mzechner */
25public class PerspectiveCamera extends Camera {
26	/** the field of view of the height, in degrees **/
27	public float fieldOfView = 67;
28
29	public PerspectiveCamera () {
30	}
31
32	/** Constructs a new {@link PerspectiveCamera} with the given field of view and viewport size. The aspect ratio is derived from
33	 * the viewport size.
34	 *
35	 * @param fieldOfViewY the field of view of the height, in degrees, the field of view for the width will be calculated
36	 *           according to the aspect ratio.
37	 * @param viewportWidth the viewport width
38	 * @param viewportHeight the viewport height */
39	public PerspectiveCamera (float fieldOfViewY, float viewportWidth, float viewportHeight) {
40		this.fieldOfView = fieldOfViewY;
41		this.viewportWidth = viewportWidth;
42		this.viewportHeight = viewportHeight;
43		update();
44	}
45
46	final Vector3 tmp = new Vector3();
47
48	@Override
49	public void update () {
50		update(true);
51	}
52
53	@Override
54	public void update (boolean updateFrustum) {
55		float aspect = viewportWidth / viewportHeight;
56		projection.setToProjection(Math.abs(near), Math.abs(far), fieldOfView, aspect);
57		view.setToLookAt(position, tmp.set(position).add(direction), up);
58		combined.set(projection);
59		Matrix4.mul(combined.val, view.val);
60
61		if (updateFrustum) {
62			invProjectionView.set(combined);
63			Matrix4.inv(invProjectionView.val);
64			frustum.update(invProjectionView);
65		}
66	}
67}
68