00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "std3d.h"
00027
00028 #include "nel/3d/viewport.h"
00029 #include "nel/misc/common.h"
00030
00031 using namespace NLMISC;
00032
00033
00034 namespace NL3D
00035 {
00036
00037 CViewport::CViewport()
00038 {
00039 NL3D_MEM_VIEWPORT
00040 initFullScreen ();
00041 }
00042
00043
00044 void CViewport::init (float x, float y, float width, float height)
00045 {
00046 NL3D_MEM_VIEWPORT
00047
00048 _X=x;
00049 clamp (_X, 0.f, 1.f);
00050 _Y=y;
00051 clamp (_Y, 0.f, 1.f);
00052 _Width=width;
00053 clamp (_Width, 0.f, 1.f-_X);
00054 _Height=height;
00055 clamp (_Height, 0.f, 1.f-_Y);
00056 }
00057
00058
00059 void CViewport::initFullScreen ()
00060 {
00061 NL3D_MEM_VIEWPORT
00062
00063 _X=0.f;
00064 _Y=0.f;
00065 _Width=1.f;
00066 _Height=1.f;
00067 }
00068
00069
00070 void CViewport::init16_9 ()
00071 {
00072 NL3D_MEM_VIEWPORT
00073
00074 _X=0.f;
00075 _Y=(1.f-0.75f)/2;
00076 _Width=1.f;
00077 _Height=0.75f;
00078 }
00079
00080
00081 void CViewport::getRayWithPoint (float x, float y, CVector& pos, CVector& dir, const CMatrix& camMatrix, const CFrustum& camFrust) const
00082 {
00083 NL3D_MEM_VIEWPORT
00084 float xVP=(x-_X)/_Width;
00085 float yVP=(y-_Y)/_Height;
00086
00087
00088 pos= camMatrix.getPos();
00089
00090
00091 float left;
00092 float right;
00093 float bottom;
00094 float top;
00095 float znear;
00096 float zfar;
00097 camFrust.getValues (left, right, bottom, top, znear, zfar);
00098
00099
00100 dir.x=left+(right-left)*xVP;
00101 dir.y=znear;
00102 dir.z=bottom+(top-bottom)*yVP;
00103
00104
00105 CMatrix mat=camMatrix;
00106 mat.setPos (CVector (0,0,0));
00107 dir=mat*dir;
00108 }
00109
00110
00111 }
00112