Plasma Engine  2.0
Loading...
Searching...
No Matches
GraphicsUtils.h
1#pragma once
2
3#include <Foundation/Math/Mat4.h>
4
5namespace plGraphicsUtils
6{
20 PL_FOUNDATION_DLL plResult ConvertWorldPosToScreenPos(const plMat4& mModelViewProjection, const plUInt32 uiViewportX, const plUInt32 uiViewportY,
21 const plUInt32 uiViewportWidth, const plUInt32 uiViewportHeight, const plVec3& vPoint, plVec3& out_vScreenPos,
23
42 PL_FOUNDATION_DLL plResult ConvertScreenPosToWorldPos(const plMat4& mInverseModelViewProjection, const plUInt32 uiViewportX,
43 const plUInt32 uiViewportY, const plUInt32 uiViewportWidth, const plUInt32 uiViewportHeight, const plVec3& vScreenPos, plVec3& out_vPoint,
44 plVec3* out_pDirection = nullptr,
46
48 PL_FOUNDATION_DLL plResult ConvertScreenPosToWorldPos(const plMat4d& mInverseModelViewProjection, const plUInt32 uiViewportX,
49 const plUInt32 uiViewportY, const plUInt32 uiViewportWidth, const plUInt32 uiViewportHeight, const plVec3& vScreenPos, plVec3& out_vPoint,
50 plVec3* out_pDirection = nullptr,
52
55 PL_FOUNDATION_DLL bool IsTriangleFlipRequired(const plMat3& mTransformation);
56
58 PL_FOUNDATION_DLL void ConvertProjectionMatrixDepthRange(
59 plMat4& inout_mMatrix, plClipSpaceDepthRange::Enum srcDepthRange, plClipSpaceDepthRange::Enum dstDepthRange); // [tested]
60
64 PL_FOUNDATION_DLL void ExtractPerspectiveMatrixFieldOfView(const plMat4& mProjectionMatrix, plAngle& out_fovX, plAngle& out_fovY); // [tested]
65
73 PL_FOUNDATION_DLL void ExtractPerspectiveMatrixFieldOfView(const plMat4& mProjectionMatrix, plAngle& out_fovLeft, plAngle& out_fovRight, plAngle& out_fovBottom, plAngle& out_fovTop, plClipSpaceYMode::Enum range = plClipSpaceYMode::Regular); // [tested]
74
79 PL_FOUNDATION_DLL plResult ExtractPerspectiveMatrixFieldOfView(const plMat4& mProjectionMatrix, float& out_fLeft, float& out_fRight, float& out_fBottom, float& out_fTop, plClipSpaceDepthRange::Enum depthRange = plClipSpaceDepthRange::Default, plClipSpaceYMode::Enum range = plClipSpaceYMode::Regular); // [tested]
80
84 PL_FOUNDATION_DLL plResult ExtractNearAndFarClipPlaneDistances(float& out_fNear, float& out_fFar, const plMat4& mProjectionMatrix,
86
87
88 enum class FrustumPlaneInterpolation
89 {
90 LeftToRight,
91 BottomToTop,
92 NearToFar,
93 };
94
103 PL_FOUNDATION_DLL plPlane ComputeInterpolatedFrustumPlane(FrustumPlaneInterpolation dir, float fLerpFactor, const plMat4& mProjectionMatrix,
105
108 PL_FOUNDATION_DLL plMat4 CreatePerspectiveProjectionMatrix(float fViewWidth, float fViewHeight, float fNearZ, float fFarZ,
110 plHandedness::Enum handedness = plHandedness::Default); // [tested]
111
113 PL_FOUNDATION_DLL plMat4 CreatePerspectiveProjectionMatrix(float fLeft, float fRight, float fBottom, float fTop, float fNearZ, float fFarZ,
115 plHandedness::Enum handedness = plHandedness::Default); // [tested]
116
119 PL_FOUNDATION_DLL plMat4 CreatePerspectiveProjectionMatrixFromFovX(plAngle fieldOfViewX, float fAspectRatioWidthDivHeight, float fNearZ,
121 plHandedness::Enum handedness = plHandedness::Default); // [tested]
122
125 PL_FOUNDATION_DLL plMat4 CreatePerspectiveProjectionMatrixFromFovY(plAngle fieldOfViewY, float fAspectRatioWidthDivHeight, float fNearZ,
127 plHandedness::Enum handedness = plHandedness::Default); // [tested]
128
131 PL_FOUNDATION_DLL plMat4 CreateOrthographicProjectionMatrix(float fViewWidth, float fViewHeight, float fNearZ, float fFarZ,
133 plHandedness::Enum handedness = plHandedness::Default); // [tested]
134
136 PL_FOUNDATION_DLL plMat4 CreateOrthographicProjectionMatrix(float fLeft, float fRight, float fBottom, float fTop, float fNearZ, float fFarZ,
138 plHandedness::Enum handedness = plHandedness::Default); // [tested]
139
143 PL_FOUNDATION_DLL plMat3 CreateLookAtViewMatrix(
144 const plVec3& vTarget, const plVec3& vUpDir, plHandedness::Enum handedness = plHandedness::Default); // [tested]
145
147 PL_FOUNDATION_DLL plMat3 CreateInverseLookAtViewMatrix(
148 const plVec3& vTarget, const plVec3& vUpDir, plHandedness::Enum handedness = plHandedness::Default); // [tested]
149
150
152 PL_FOUNDATION_DLL plMat4 CreateLookAtViewMatrix(const plVec3& vEyePos, const plVec3& vLookAtPos, const plVec3& vUpDir,
153 plHandedness::Enum handedness = plHandedness::Default); // [tested]
154
156 PL_FOUNDATION_DLL plMat4 CreateInverseLookAtViewMatrix(const plVec3& vEyePos, const plVec3& vLookAtPos, const plVec3& vUpDir,
157 plHandedness::Enum handedness = plHandedness::Default); // [tested]
158
162 PL_FOUNDATION_DLL plMat4 CreateViewMatrix(const plVec3& vPosition, const plVec3& vForwardDir, const plVec3& vRightDir, const plVec3& vUpDir,
163 plHandedness::Enum handedness = plHandedness::Default); // [tested]
164
166 PL_FOUNDATION_DLL plMat4 CreateInverseViewMatrix(const plVec3& vPosition, const plVec3& vForwardDir, const plVec3& vRightDir, const plVec3& vUpDir,
167 plHandedness::Enum handedness = plHandedness::Default); // [tested]
168
172 PL_FOUNDATION_DLL void DecomposeViewMatrix(plVec3& out_vPosition, plVec3& out_vForwardDir, plVec3& out_vRightDir, plVec3& out_vUpDir,
173 const plMat4& mViewMatrix, plHandedness::Enum handedness = plHandedness::Default); // [tested]
174
178 PL_FOUNDATION_DLL plResult ComputeBarycentricCoordinates(plVec3& out_vCoordinates, const plVec3& v0, const plVec3& v1, const plVec3& v2, const plVec3& vPos);
179
183 PL_FOUNDATION_DLL plResult ComputeBarycentricCoordinates(plVec3& out_vCoordinates, const plVec2& v0, const plVec2& v1, const plVec2& v2, const plVec2& vPos);
184
195 inline float CalculateSphereScreenCoverage(const plBoundingSphere& sphere, const plVec3& vCameraPosition, plAngle perspectiveCameraFov)
196 {
197 const float fDist = (sphere.m_vCenter - vCameraPosition).GetLength();
198 const float fHalfHeight = plMath::Tan(perspectiveCameraFov * 0.5f) * fDist;
199 return sphere.m_fRadius / fHalfHeight;
200 }
201
212 inline float CalculateSphereScreenCoverage(float fSphereRadius, float fOrthoCameraDimensions)
213 {
214 const float fHalfHeight = fOrthoCameraDimensions * 0.5f;
215 return fSphereRadius / fHalfHeight;
216 }
217
218} // namespace plGraphicsUtils
Float wrapper struct for a safe usage and conversions of angles.
Definition Angle.h:10
PL_ALWAYS_INLINE float Tan(plAngle a)
Takes an angle, returns its tangent.
Definition MathFloat_inl.h:72
Enum
Definition Declarations.h:79
static PL_FOUNDATION_DLL Enum Default
Holds the default value for the projection depth range on each platform. This can be overridden by re...
Definition Declarations.h:87
Enum
Definition Declarations.h:102
@ Regular
Creates a regular projection matrix.
Definition Declarations.h:103
static PL_FOUNDATION_DLL Enum Default
Holds the default handedness value to use. pl uses 'LeftHanded' by default.
Definition Declarations.h:124
Default enum for returning failure or success, instead of using a bool.
Definition Types.h:54