3#include "CameraHelper.h"
4#include "Math/Projection.h"
28 template<
class TransformComponent,
class OrbitingCameraController>
29 inline glm::quat
getCameraOrientation(
const TransformComponent transformComponent,
const OrbitingCameraController orbitingCameraController)
31 glm::quat orientation;
32 if (orbitingCameraController) {
36 orientation = transformComponent->rotation;
55 template<
class CameraComponent,
class TransformComponent,
class OrbitingCameraController,
typename ProjectionMode>
56 inline glm::dvec3
viewAll(
const CameraComponent cameraComponent,
const TransformComponent transformComponent,
const OrbitingCameraController orbitingCameraController,
const ProjectionMode projectionMode,
const Cogs::Geometry::DBoundingBox& boundingBox, glm::vec2 viewport = glm::vec2(0.0f, 0.0f))
58 float fieldOfView = cameraComponent->fieldOfView;
62 if (orbitingCameraController) {
64 orbitingCameraController->cameraTarget = center;
65 orbitingCameraController->distance = focalDistance;
66 orbitingCameraController->setChanged();
69 transformComponent->coordinates = position;
70 transformComponent->position = glm::vec3(0, 0, 0);
71 transformComponent->setChanged();
75 const float oldFarDistance = cameraComponent->farDistance;
76 if (oldFarDistance < farDistance) {
77 cameraComponent->farDistance = farDistance;
80 cameraComponent->focalDistance = focalDistance;
82 if (projectionMode == ProjectionMode::Orthographic) {
86 cameraComponent->setChanged();
102 template<
class CameraData>
103 inline bool getProjectedCoordinates(
const glm::vec2& coordinatesToProject,
const CameraData& cameraData,
const glm::vec3& targetPlaneNormal,
const glm::vec3& targetPlanePosition, glm::vec3& projectedCoordinates)
105 glm::vec3 planeNormal = targetPlaneNormal;
106 if (planeNormal.x == 0.f && planeNormal.y == 0.f && planeNormal.z == 0.f) {
107 planeNormal = -glm::vec3(cameraData.inverseViewMatrix[2]);
110 const glm::vec3 cameraPosition = glm::vec3(cameraData.inverseViewMatrix[3]);
111 glm::mat4 invViewProj = glm::inverse(cameraData.rawProjectionMatrix * cameraData.viewMatrix);
112 float nx = ((2.0f * (
static_cast<float>(coordinatesToProject.x) / cameraData.viewportSize.x)) - 1.0f);
113 float ny = -((2.0f * (
static_cast<float>(coordinatesToProject.y) / cameraData.viewportSize.y)) - 1.0f);
114 glm::vec4 nearPlaneHit = invViewProj * glm::vec4(nx, ny, -1.f, 1.f);
115 glm::vec3 rayOrigin = (1.f / nearPlaneHit.w)*glm::vec3(nearPlaneHit);
116 glm::vec4 farPlaneHit = invViewProj * glm::vec4(nx, ny, 1.f, 1.f);
118 if (farPlaneHit.w == 0) {
119 farPlaneHit.w = glm::epsilon<float>();
121 glm::vec3 rayDirection = glm::normalize((1.f / farPlaneHit.w)*glm::vec3(farPlaneHit) - rayOrigin);
123 bool intersects = Cogs::Geometry::projectToPlane(rayOrigin, rayDirection, targetPlanePosition, planeNormal, projectedCoordinates, &t);
124 bool isInFrontOfCamera = t + glm::distance(cameraPosition, rayOrigin) >= 0;
126 return intersects && isInFrontOfCamera;
COGSCORE_DLL_API float getOrthoHeight(const Cogs::Geometry::DBoundingBox &boundingBox)
Calculate Orthographic camera orthoHeight Field to view boundingbox.
COGSCORE_DLL_API glm::dvec3 getViewAllPosition(const Cogs::Geometry::DBoundingBox &boundingBox, const glm::quat &orientation, float fieldOfView, glm::vec2 viewport)
COGSCORE_DLL_API glm::dvec3 getCenter(const Cogs::Geometry::DBoundingBox &boundingBox)
Gets center of non-empty bounding box.
COGSCORE_DLL_API float getFocalDistance(const glm::dvec3 &position, const Cogs::Geometry::DBoundingBox &boundingBox)
Gets distance from given position (camera position) to center of bounding box.
COGSCORE_DLL_API float getFarDistance(const glm::dvec3 &position, const Cogs::Geometry::DBoundingBox &boundingBox)
Gets camera far distance given bounding box.
COGSCORE_DLL_API glm::quat getOrientation(float horizontalAngle, float verticalAngle)
Gets the camera orientation from the horizontal and vertical angle values.
Contains common operations for camera setup.
bool getProjectedCoordinates(const glm::vec2 &coordinatesToProject, const CameraData &cameraData, const glm::vec3 &targetPlaneNormal, const glm::vec3 &targetPlanePosition, glm::vec3 &projectedCoordinates)
Project a screen coordinate onto a plane in 3d space.
glm::dvec3 viewAll(const CameraComponent cameraComponent, const TransformComponent transformComponent, const OrbitingCameraController orbitingCameraController, const ProjectionMode projectionMode, const Cogs::Geometry::DBoundingBox &boundingBox, glm::vec2 viewport=glm::vec2(0.0f, 0.0f))
View all for given bounding box.
glm::quat getCameraOrientation(const TransformComponent transformComponent, const OrbitingCameraController orbitingCameraController)