From 1caa468dd1cbc8cc90fa5730c72a7b5330144cb8 Mon Sep 17 00:00:00 2001 From: "C. J. Howard" Date: Tue, 16 Apr 2019 23:05:14 +0800 Subject: [PATCH] Add a camera and focus entity and fix camera transform in render system --- src/entity/components/camera-component.hpp | 2 +- src/entity/systems/render-system.cpp | 11 +++++++--- src/game.cpp | 21 +++++++++++++++++++ src/game.hpp | 2 ++ src/states/title-state.cpp | 24 +++++++++++----------- 5 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/entity/components/camera-component.hpp b/src/entity/components/camera-component.hpp index de2f60e..6300ccf 100644 --- a/src/entity/components/camera-component.hpp +++ b/src/entity/components/camera-component.hpp @@ -31,7 +31,7 @@ class CameraComponent: public Component public: virtual ComponentBase* clone() const; - Camera camera; + Camera* camera; }; #endif // CAMERA_COMPONENT_HPP diff --git a/src/entity/systems/render-system.cpp b/src/entity/systems/render-system.cpp index d508f43..6b19962 100644 --- a/src/entity/systems/render-system.cpp +++ b/src/entity/systems/render-system.cpp @@ -40,7 +40,12 @@ void RenderSystem::update(float t, float dt) CameraComponent* camera = std::get<0>(member->components); TransformComponent* transform = std::get<1>(member->components); - camera->camera.setTransform(transform->transform); + Vector3 forward = glm::normalize(transform->transform.rotation * Vector3(0.0f, 0.0f, -1.0f)); + Vector3 up = glm::normalize(transform->transform.rotation * Vector3(0.0f, 1.0f, 0.0f)); + Vector3 right = glm::normalize(glm::cross(forward, up)); + + camera->camera->lookAt(transform->transform.translation, transform->transform.translation + forward, up); + //camera->camera->setTransform(transform->transform); } // Update transform of all model instances @@ -56,13 +61,13 @@ void RenderSystem::update(float t, float dt) void RenderSystem::memberRegistered(const CameraGroup::Member* member) { CameraComponent* camera = std::get<0>(member->components); - scene->addObject(&camera->camera); + scene->addObject(camera->camera); } void RenderSystem::memberUnregistered(const CameraGroup::Member* member) { CameraComponent* camera = std::get<0>(member->components); - scene->removeObject(&camera->camera); + scene->removeObject(camera->camera); } void RenderSystem::memberRegistered(const ModelGroup::Member* member) diff --git a/src/game.cpp b/src/game.cpp index 0ef1977..e5bddd9 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -39,6 +39,8 @@ #include "game/brush.hpp" #include "entity/component-manager.hpp" #include "entity/components/transform-component.hpp" +#include "entity/components/camera-component.hpp" +#include "entity/components/orbit-constraint-component.hpp" #include "entity/components/model-component.hpp" #include "entity/components/terrain-patch-component.hpp" #include "entity/entity-manager.hpp" @@ -540,6 +542,25 @@ void Game::setup() systemManager->addSystem(constraintSystem); systemManager->addSystem(renderSystem); + // Create focus entity + focusEntity = createInstance(); + componentManager->addComponent(focusEntity, new TransformComponent()); + setTranslation(focusEntity, {0, 0, 0}); + + // Create camera entity + cameraEntity = createInstance(); + CameraComponent* cameraComponent = new CameraComponent(); + cameraComponent->camera = &camera; + TransformComponent* transformComponent = new TransformComponent(); + OrbitConstraintComponent* orbitConstraintComponent = new OrbitConstraintComponent(); + orbitConstraintComponent->target = 0; + orbitConstraintComponent->elevation = 0.0f; + orbitConstraintComponent->azimuth = 0.0f; + orbitConstraintComponent->distance = 0.0f; + componentManager->addComponent(cameraEntity, cameraComponent); + componentManager->addComponent(cameraEntity, transformComponent); + componentManager->addComponent(cameraEntity, orbitConstraintComponent); + // Load navmesh TriangleMesh* navmesh = resourceManager->load("sidewalk.mesh"); diff --git a/src/game.hpp b/src/game.hpp index c2163d0..cadf5c7 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -477,6 +477,8 @@ public: Camera camera; Camera sunlightCamera; Camera uiCamera; + EntityID focusEntity; + EntityID cameraEntity; // Animation Animator animator; diff --git a/src/states/title-state.cpp b/src/states/title-state.cpp index d9f2933..e31289a 100644 --- a/src/states/title-state.cpp +++ b/src/states/title-state.cpp @@ -22,6 +22,10 @@ #include "menu.hpp" #include "debug/command-interpreter.hpp" #include "game/camera-rig.hpp" +#include "entity/component-manager.hpp" +#include "entity/components/transform-component.hpp" +#include "entity/components/camera-component.hpp" +#include "entity/components/orbit-constraint-component.hpp" void Game::enterTitleState() { @@ -31,18 +35,14 @@ void Game::enterTitleState() setTranslation(antHill, antHillTranslation); // Setup camera - cameraRig = orbitCam; - orbitCam->setTargetFocalPoint(antHillTranslation); - orbitCam->setTargetFocalDistance(0.0f); - orbitCam->setTargetElevation(glm::radians(80.0f)); - orbitCam->setTargetAzimuth(0.0f); - orbitCam->setFocalPoint(orbitCam->getTargetFocalPoint()); - orbitCam->setFocalDistance(orbitCam->getTargetFocalDistance()); - orbitCam->setElevation(orbitCam->getTargetElevation()); - orbitCam->setAzimuth(orbitCam->getTargetAzimuth()); - - float fov = glm::radians(30.0f); - orbitCam->getCamera()->setPerspective(fov, (float)w / (float)h, 1.0f, 1000.0f); + float fov = radians(30.0f); + CameraComponent* cameraComponent = componentManager->getComponent(cameraEntity); + cameraComponent->camera->setPerspective(fov, (float)w / (float)h, 1.0f, 1000.0f); + OrbitConstraintComponent* orbitConstraintComponent = componentManager->getComponent(cameraEntity); + orbitConstraintComponent->target = focusEntity; + orbitConstraintComponent->elevation = radians(45.0f); + orbitConstraintComponent->azimuth = 0.0f; + orbitConstraintComponent->distance = 40.0f; // Begin fade-in fadeIn(6.0f, {0, 0, 0}, nullptr);