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
00029 #include "3d/heat_haze.h"
00030 #include "3d/scene.h"
00031 #include "3d/deform_2d.h"
00032 #include "nel/misc/vector_2f.h"
00033
00034 namespace NL3D
00035 {
00036
00037
00038 struct CSinWave : public CDeform2d::IPerturbUV
00039 {
00040 float Phase;
00041 virtual void perturbUV(float x, float y, float &du, float &dv) const
00042 {
00043 du = 0.01f * sinf(25.f * y + Phase);
00044 dv = 0.05f * cosf(19.3f * x + Phase);
00045 }
00046 } _SinWave;
00047
00048
00049
00050
00051 void CHeatHaze::performHeatHaze(uint width, uint height, CScene &s, IDriver *drv)
00052 {
00053 NLMISC::CMatrix m = s.getCam()->getMatrix();
00054 NLMISC::CMatrix im = m.inverted();
00055
00056
00057
00058
00059 NLMISC::CVector up = im * NLMISC::CVector::K;
00060
00061 float upNorm = (up.x * up.x + up.z * up.z);
00062
00063 const float threshold = 10E-4f;
00064
00065 if (upNorm < threshold) return;
00066
00067
00068
00069
00070 NLMISC::CPlane h;
00071 h.make(NLMISC::CVector::K, NLMISC::CVector::Null);
00072
00073 h = h * m;
00074
00075
00076
00077
00078
00079
00080 NLMISC::CVector right;
00081
00082 if (fabsf(h.c) > threshold)
00083 {
00084 right.set(1, 0, (h.a + h.d) / - h.c );
00085 }
00086 else
00087 {
00088 right.set( (h.d + h.c) / h.a, 0, 1);
00089 }
00090
00091 right.normalize();
00092
00093
00094 static std::vector<NLMISC::CVector2f> poly(4);
00095
00096
00097
00098 const sint xCenter = width >> 1;
00099 const sint yCenter = height >> 1;
00100
00101 const float horizonHeight = (float) (height >> 2);
00102 const float horizonWidth = (float) (width >> 2);
00103
00104 NLMISC::CVector tmp ;
00105
00106 tmp = horizonWidth * right + horizonHeight * up;
00107 poly[0] = NLMISC::CVector2f(xCenter + tmp.x, yCenter + tmp.z) ;
00108 tmp = horizonWidth * right - horizonHeight * up;
00109 poly[1] = NLMISC::CVector2f(xCenter + tmp.x, yCenter + tmp.z) ;
00110 tmp = - horizonWidth * right - horizonHeight * up;
00111 poly[2] = NLMISC::CVector2f(xCenter + tmp.x, yCenter + tmp.z);
00112 tmp = - horizonWidth * right + horizonHeight * up;
00113 poly[3] = NLMISC::CVector2f(xCenter + tmp.x, yCenter + tmp.z);
00114
00115
00116 CDeform2d::doDeform(poly, drv, &_SinWave);
00117
00118
00119
00120
00121 }
00122
00123 }