Ver Fonte

Cleanup

Daniele Bartolini há 8 anos atrás
pai
commit
35924d286c
3 ficheiros alterados com 44 adições e 51 exclusões
  1. 7 7
      src/device/device.cpp
  2. 36 40
      src/world/world.cpp
  3. 1 4
      src/world/world.h

+ 7 - 7
src/device/device.cpp

@@ -571,6 +571,13 @@ void Device::render(World& world, UnitId camera_unit)
 	bgfx::setViewRect(1, 0, 0, _width, _height);
 	bgfx::setViewRect(2, 0, 0, _width, _height);
 
+	float aspect_ratio = (_boot_config.aspect_ratio == -1.0f
+		? (float)_width/(float)_height
+		: _boot_config.aspect_ratio
+		);
+	world.camera_set_aspect(camera_unit, aspect_ratio);
+	world.camera_set_viewport_metrics(camera_unit, 0, 0, _width, _height);
+
 	const Matrix4x4 view = world.camera_view_matrix(camera_unit);
 	const Matrix4x4 proj = world.camera_projection_matrix(camera_unit);
 
@@ -583,13 +590,6 @@ void Device::render(World& world, UnitId camera_unit)
 	bgfx::touch(1);
 	bgfx::touch(2);
 
-	float aspect_ratio = (_boot_config.aspect_ratio == -1.0f
-		? (float)_width/(float)_height
-		: _boot_config.aspect_ratio
-		);
-	world.camera_set_aspect(camera_unit, aspect_ratio);
-	world.camera_set_viewport_metrics(camera_unit, 0, 0, _width, _height);
-
 	world.render(view, proj);
 }
 

+ 36 - 40
src/world/world.cpp

@@ -239,7 +239,6 @@ void World::camera_set_projection_type(UnitId unit, ProjectionType::Enum type)
 {
 	CameraInstance i = camera_instances(unit);
 	_camera[i.i].projection_type = type;
-	_camera[i.i].update_projection_matrix();
 }
 
 ProjectionType::Enum World::camera_projection_type(UnitId unit)
@@ -248,10 +247,40 @@ ProjectionType::Enum World::camera_projection_type(UnitId unit)
 	return _camera[i.i].projection_type;
 }
 
-const Matrix4x4& World::camera_projection_matrix(UnitId unit)
+Matrix4x4 World::camera_projection_matrix(UnitId unit)
 {
 	CameraInstance i = camera_instances(unit);
-	return _camera[i.i].projection;
+	Camera& cam = _camera[i.i];
+	Matrix4x4 projection;
+
+	switch (cam.projection_type)
+	{
+	case ProjectionType::ORTHOGRAPHIC:
+		orthographic(projection
+			, cam.left
+			, cam.right
+			, cam.bottom
+			, cam.top
+			, cam.near_range
+			, cam.far_range
+			);
+		break;
+
+	case ProjectionType::PERSPECTIVE:
+		perspective(projection
+			, cam.fov
+			, cam.aspect
+			, cam.near_range
+			, cam.far_range
+			);
+		break;
+
+	default:
+		CE_FATAL("Unknown projection type");
+		break;
+	}
+
+	return projection;
 }
 
 Matrix4x4 World::camera_view_matrix(UnitId unit)
@@ -272,14 +301,12 @@ void World::camera_set_fov(UnitId unit, f32 fov)
 {
 	CameraInstance i = camera_instances(unit);
 	_camera[i.i].fov = fov;
-	_camera[i.i].update_projection_matrix();
 }
 
 void World::camera_set_aspect(UnitId unit, f32 aspect)
 {
 	CameraInstance i = camera_instances(unit);
 	_camera[i.i].aspect = aspect;
-	_camera[i.i].update_projection_matrix();
 }
 
 f32 World::camera_near_clip_distance(UnitId unit)
@@ -292,7 +319,6 @@ void World::camera_set_near_clip_distance(UnitId unit, f32 near)
 {
 	CameraInstance i = camera_instances(unit);
 	_camera[i.i].near_range = near;
-	_camera[i.i].update_projection_matrix();
 }
 
 f32 World::camera_far_clip_distance(UnitId unit)
@@ -305,7 +331,6 @@ void World::camera_set_far_clip_distance(UnitId unit, f32 far)
 {
 	CameraInstance i = camera_instances(unit);
 	_camera[i.i].far_range = far;
-	_camera[i.i].update_projection_matrix();
 }
 
 void World::camera_set_orthographic_metrics(UnitId unit, f32 left, f32 right, f32 bottom, f32 top)
@@ -316,7 +341,6 @@ void World::camera_set_orthographic_metrics(UnitId unit, f32 left, f32 right, f3
 	_camera[i.i].bottom = bottom;
 	_camera[i.i].top = top;
 
-	_camera[i.i].update_projection_matrix();
 }
 
 void World::camera_set_viewport_metrics(UnitId unit, u16 x, u16 y, u16 width, u16 height)
@@ -333,9 +357,10 @@ Vector3 World::camera_screen_to_world(UnitId unit, const Vector3& pos)
 	CameraInstance i = camera_instances(unit);
 	const Camera& c = _camera[i.i];
 
+	Matrix4x4 projection = camera_projection_matrix(unit);
 	Matrix4x4 world_inv = _scene_graph->world_pose(c.unit);
 	invert(world_inv);
-	Matrix4x4 mvp = world_inv * c.projection;
+	Matrix4x4 mvp = world_inv * projection;
 	invert(mvp);
 
 	Vector4 ndc;
@@ -355,6 +380,7 @@ Vector3 World::camera_world_to_screen(UnitId unit, const Vector3& pos)
 	CameraInstance i = camera_instances(unit);
 	const Camera& c = _camera[i.i];
 
+	Matrix4x4 projection = camera_projection_matrix(unit);
 	Matrix4x4 world_inv = _scene_graph->world_pose(c.unit);
 	invert(world_inv);
 
@@ -364,7 +390,7 @@ Vector3 World::camera_world_to_screen(UnitId unit, const Vector3& pos)
 	xyzw.z = pos.z;
 	xyzw.w = 1.0f;
 
-	Vector4 clip = xyzw * (world_inv * c.projection);
+	Vector4 clip = xyzw * (world_inv * projection);
 
 	Vector4 ndc;
 	ndc.x = clip.x / clip.w;
@@ -477,36 +503,6 @@ void World::post_level_loaded_event()
 	event_stream::write(_events, EventType::LEVEL_LOADED, ev);
 }
 
-void World::Camera::update_projection_matrix()
-{
-	switch (projection_type)
-	{
-	case ProjectionType::ORTHOGRAPHIC:
-		orthographic(projection
-			, left
-			, right
-			, bottom
-			, top
-			, near_range
-			, far_range
-			);
-		break;
-
-	case ProjectionType::PERSPECTIVE:
-		perspective(projection
-			, fov
-			, aspect
-			, near_range
-			, far_range
-			);
-		break;
-
-	default:
-		CE_FATAL("Unknown projection type");
-		break;
-	}
-}
-
 void spawn_units(World& w, const UnitResource& ur, const Vector3& pos, const Quaternion& rot, const UnitId* unit_lookup)
 {
 	SceneGraph* scene_graph = w._scene_graph;

+ 1 - 4
src/world/world.h

@@ -25,7 +25,6 @@ struct World
 		UnitId unit;
 
 		ProjectionType::Enum projection_type;
-		Matrix4x4 projection;
 
 		Frustum frustum;
 		f32 fov;
@@ -43,8 +42,6 @@ struct World
 		u16 view_y;
 		u16 view_width;
 		u16 view_height;
-
-		void update_projection_matrix();
 	};
 
 	u32 _marker;
@@ -108,7 +105,7 @@ public:
 	ProjectionType::Enum camera_projection_type(UnitId unit);
 
 	/// Returns the projection matrix of the camera.
-	const Matrix4x4& camera_projection_matrix(UnitId unit);
+	Matrix4x4 camera_projection_matrix(UnitId unit);
 
 	/// Returns the view matrix of the camera.
 	Matrix4x4 camera_view_matrix(UnitId unit);