Browse Source

Re-add orthographic camera implementation

master
Riyyi 4 years ago
parent
commit
08d67038f6
  1. 8
      inferno/src/inferno/scene/scene.cpp
  2. 73
      inferno/src/inferno/systems/camera.cpp

8
inferno/src/inferno/scene/scene.cpp

@ -23,11 +23,17 @@ namespace Inferno {
cameraSystem->initialize();
CameraSystem::the().setRegistry(m_registry);
#if 1
Entity camera = createEntity("Camera Entity");
camera.add<PerspectiveCameraComponent>();
auto& cameraTransform = camera.get<TransformComponent>();
cameraTransform.translate.z = 1.0f;
cameraTransform.rotate.z = -1.0f;
#else
Entity camera = createEntity("Camera Entity");
camera.add<OrthographicCameraComponment>();
auto& cameraTransform = camera.get<TransformComponent>();
cameraTransform.translate.z = -1.0f;
#endif
RenderSystem* renderSystem = new RenderSystem();
renderSystem->initialize();

73
inferno/src/inferno/systems/camera.cpp

@ -64,7 +64,80 @@ namespace Inferno {
void CameraSystem::updateOrthographic(TransformComponent& transform, OrthographicCameraComponment& orthographic)
{
// Update camera rotation
float cameraRotateSpeed = ROTATE_SPEED * (1.0f/ 60.0f);
if (Input::isKeyPressed(KeyCode("GLFW_KEY_Q"))) {
transform.rotate.z += cameraRotateSpeed;
}
if (Input::isKeyPressed(KeyCode("GLFW_KEY_E"))) {
transform.rotate.z -= cameraRotateSpeed;
}
if (transform.rotate.z > 180.0f) {
transform.rotate.z -= 360.0f;
}
else if (transform.rotate.z <= -180.0f) {
transform.rotate.z += 360.0f;
}
// Update camera translation
float cameraTranslateSpeed = TRANSLATE_SPEED * (1.0f / 60.0f);
// WASD movement
if (Input::isKeyPressed(KeyCode("GLFW_KEY_W"))) {
transform.translate.x += -sin(glm::radians(transform.rotate.z)) * cameraTranslateSpeed;
transform.translate.y += cos(glm::radians(transform.rotate.z)) * cameraTranslateSpeed;
}
if (Input::isKeyPressed(KeyCode("GLFW_KEY_S"))) {
transform.translate.x -= -sin(glm::radians(transform.rotate.z)) * cameraTranslateSpeed;
transform.translate.y -= cos(glm::radians(transform.rotate.z)) * cameraTranslateSpeed;
}
if (Input::isKeyPressed(KeyCode("GLFW_KEY_A"))) {
transform.translate.x -= cos(glm::radians(transform.rotate.z)) * cameraTranslateSpeed;
transform.translate.y -= sin(glm::radians(transform.rotate.z)) * cameraTranslateSpeed;
}
if (Input::isKeyPressed(KeyCode("GLFW_KEY_D"))) {
transform.translate.x += cos(glm::radians(transform.rotate.z)) * cameraTranslateSpeed;
transform.translate.y += sin(glm::radians(transform.rotate.z)) * cameraTranslateSpeed;
}
// Update camera zoom
float zoomSpeed = ZOOM_SENSITIVITY * (1.0f / 60.0f);
if (Input::isKeyPressed(KeyCode("GLFW_KEY_EQUAL"))) {
orthographic.zoomLevel -= zoomSpeed;
}
if (Input::isKeyPressed(KeyCode("GLFW_KEY_MINUS"))) {
orthographic.zoomLevel += zoomSpeed;
}
orthographic.zoomLevel = std::max(orthographic.zoomLevel, 0.25f);
orthographic.zoomLevel = std::min(orthographic.zoomLevel, 10.0f);
// Update camera matrix
// Local space -> World space: model matrix
// Is done in Object::update()
// World space -> View space: view matrix
transform.transform = {
glm::translate(glm::mat4(1.0f), transform.translate) *
glm::rotate(glm::mat4(1.0f), glm::radians(transform.rotate.z), orthographic.rotateAxis)
};
transform.transform = { glm::inverse(transform.transform) };
// View space -> Clip space: projection matrix
float aspectRatio = Application::the().getWindow().getAspect();
orthographic.projection = {
glm::ortho(-aspectRatio * orthographic.zoomLevel, aspectRatio * orthographic.zoomLevel,
-orthographic.zoomLevel, orthographic.zoomLevel, -1.0f, 1.0f)
};
// Clip space -> Screen space: viewport transform
// Is done in the fragment shader using the settings of glViewport
}
void CameraSystem::updatePerspective(TransformComponent& transform, PerspectiveCameraComponent& perspective)

Loading…
Cancel
Save