00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_CSGEOM_PROJECTIONS_H__
00020 #define __CS_CSGEOM_PROJECTIONS_H__
00021
00029 #include "csgeom/matrix4.h"
00030
00031 namespace CS
00032 {
00033 namespace Math
00034 {
00038 struct Projections
00039 {
00046 static Matrix4 Ortho (float left, float right, float bottom, float top,
00047 float nearz, float farz)
00048 {
00049 return Matrix4 (2.0f/(right-left), 0, 0, -(right+left)/(right-left),
00050 0, 2.0f/(top-bottom), 0, -(top+bottom)/(top-bottom),
00051 0, 0, -2.0f/(farz-nearz), -(farz+nearz)/(farz-nearz),
00052 0, 0, 0, 1);
00053 }
00054
00058 static Matrix4 CSPerspective (float viewWidth, float viewHeight,
00059 float shiftX, float shiftY,
00060 float invAspect,
00061 float nearClip = 0.1f)
00062 {
00063 const float nearz = -1.0f;
00064 float farz = 1.0f/nearClip;
00065 Matrix4 Mortho (Ortho (0, viewWidth, 0, viewHeight, nearz, farz));
00066
00067 CS::Math::Matrix4 Mtranslate (
00068 1, 0, 0, shiftX,
00069 0, 1, 0, shiftY,
00070 0, 0, 1, 0,
00071 0, 0, 0, 1);
00072
00073 CS::Math::Matrix4 Mprojection (
00074 1, 0, 0, 0,
00075 0, 1, 0, 0,
00076 0, 0, 0, -invAspect,
00077 0, 0, invAspect, 0);
00078
00079 return (Mortho * Mtranslate) * Mprojection;
00080 }
00081
00085 static Matrix4 Frustum (float left, float right, float bottom, float top,
00086 float nearz, float farz)
00087 {
00088 float two_n = nearz * 2;
00089 return Matrix4 (two_n/(right-left), 0, -(right+left)/(right-left), 0,
00090 0, two_n/(top-bottom), -(top+bottom)/(top-bottom), 0,
00091 0, 0, -(farz+nearz)/(farz-nearz), -(2*farz*nearz)/(farz-nearz),
00092 0, 0, -1, 0);
00093 }
00094 };
00095
00096 }
00097 }
00098
00101 #endif // __CS_CSGEOM_PROJECTIONS_H__
00102