MirrorCamera.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // ----------------------------------------------------------------
  2. // From Game Programming in C++ by Sanjay Madhav
  3. // Copyright (C) 2017 Sanjay Madhav. All rights reserved.
  4. //
  5. // Released under the BSD License
  6. // See LICENSE in root directory for full details.
  7. // ----------------------------------------------------------------
  8. #include "MirrorCamera.h"
  9. #include "Actor.h"
  10. #include "Game.h"
  11. #include "Renderer.h"
  12. MirrorCamera::MirrorCamera(Actor* owner)
  13. :CameraComponent(owner)
  14. ,mHorzDist(150.0f)
  15. ,mVertDist(200.0f)
  16. ,mTargetDist(400.0f)
  17. {
  18. }
  19. void MirrorCamera::Update(float deltaTime)
  20. {
  21. CameraComponent::Update(deltaTime);
  22. // Compute ideal position
  23. Vector3 idealPos = ComputeCameraPos();
  24. // Target is target dist in front of owning actor
  25. Vector3 target = mOwner->GetPosition() -
  26. mOwner->GetForward() * mTargetDist;
  27. // Use actual position here, not ideal
  28. Matrix4 view = Matrix4::CreateLookAt(idealPos, target,
  29. Vector3::UnitZ);
  30. Game* game = mOwner->GetGame();
  31. game->GetRenderer()->SetMirrorView(view);
  32. }
  33. void MirrorCamera::SnapToIdeal()
  34. {
  35. Vector3 idealPos = ComputeCameraPos();
  36. // Compute target and view
  37. Vector3 target = mOwner->GetPosition() -
  38. mOwner->GetForward() * mTargetDist;
  39. // Use actual position here, not ideal
  40. Matrix4 view = Matrix4::CreateLookAt(idealPos, target,
  41. Vector3::UnitZ);
  42. Game* game = mOwner->GetGame();
  43. game->GetRenderer()->SetMirrorView(view);
  44. }
  45. Vector3 MirrorCamera::ComputeCameraPos() const
  46. {
  47. // Set camera position in front of
  48. Vector3 cameraPos = mOwner->GetPosition();
  49. cameraPos += mOwner->GetForward() * mHorzDist;
  50. cameraPos += Vector3::UnitZ * mVertDist;
  51. return cameraPos;
  52. }