00001 #ifndef WATERSURFACETECHNIQUE_H
00002 #define WATERSURFACETECHNIQUE_H
00003
00004 #include <vrs/environment/config.h>
00005 #include <vrs/environment/watersurface.h>
00006 #include <vrs/opengl/techniquegl.h>
00007 #include <vrs/opengl/texturegl.h>
00008 #include <vrs/time.h>
00009 #include <map>
00010
00011 namespace VRS {
00012 class Clock;
00013 class Engine;
00014 class Shape;
00015 class Texture2DGL;
00016 template<typename T, typename V> class CachedEngineResource;
00017 class PolyAttribute;
00018 class FrameBufferObjectGL;
00019 class RenderTextureGL;
00020 class VRSTime;
00021 class BackgroundGL;
00022 }
00023
00024 namespace EnvironmentRenderer {
00025
00026 class WaterReflected;
00027
00030 class VRS_ENV_API WaterSurfaceTechnique : public VRS::TechniqueGL {
00031 public:
00043 WaterSurfaceTechnique(bool reflectAll = false,
00044 unsigned int textureWidth = 512,
00045 unsigned int textureHeight = 512);
00046
00047
00048 void setReflectAll(bool reflectAll);
00049 bool getReflectAll() const;
00050
00051 void setReflFilter(VRS::TextureGL::FilterMode min = VRS::TextureGL::LINEAR, VRS::TextureGL::FilterMode mag = VRS::TextureGL::LINEAR);
00052 void setRefrFilter(VRS::TextureGL::FilterMode min = VRS::TextureGL::LINEAR, VRS::TextureGL::FilterMode mag = VRS::TextureGL::LINEAR);
00053
00054 VRS::TextureGL::FilterMode reflMinFilter() const { return m_reflMinFilter; }
00055 VRS::TextureGL::FilterMode reflMagFilter() const { return m_reflMagFilter; }
00056 VRS::TextureGL::FilterMode refrMinFilter() const { return m_refrMinFilter; }
00057 VRS::TextureGL::FilterMode refrMagFilter() const { return m_refrMagFilter; }
00058
00059
00063 VRS::SO<VRS::Texture2DGL> getReflectionTexture(VRS::SO<WaterSurface> watersurface);
00064 VRS::SO<VRS::Texture2DGL> getRefractionTexture();
00065 VRS::SO<VRS::Texture2DGL> getMaskTexture();
00066
00072 void registerBackgroundTechnique(VRS::SO<VRS::BackgroundGL> background);
00073
00078 void setTextureSize(unsigned int width, unsigned int height);
00079 unsigned int getTextureWidth() const;
00080 unsigned int getTextureHeight() const;
00081
00082 virtual void start(VRS::Engine*);
00083 virtual void stop(VRS::Engine*);
00084
00085 virtual bool preparePass(VRS::Engine*);
00086 virtual void finishPass(VRS::Engine*);
00087 virtual void nextPass(VRS::Engine*);
00088
00089 virtual bool prepareEval(VRS::Engine* engine, const VRS::Shape* shape);
00090 virtual void finishEval(VRS::Engine* engine, const VRS::Shape* shape);
00091
00092
00099 virtual bool canBeUsed(VRS::Engine* engine) const;
00100
00101 VRS_TYPEINFO(WaterSurfaceTechnique, VRS::TechniqueGL);
00102 VRS_SERIALIZABLE(WaterSurfaceTechnique);
00103
00104 private:
00105
00106
00107
00108 void updateWaterSurfaceData();
00109
00110
00111
00112
00113
00114 bool selectNextReflectingSurface();
00115
00116
00117 inline bool isReflecting(WaterSurface* ws)
00118 {
00119 return ws != NULL && (m_markedAsReflecting[ws] || m_reflectAll);
00120 }
00121
00122 inline bool isRefracting(WaterSurface* ws)
00123 {
00124 return ws != NULL && ws->isRefracting();
00125 }
00126
00127
00128
00129
00131 struct WaterSurfaceData
00132 {
00133 WaterSurfaceData(VRS::SO<VRS::FrameBufferObjectGL> fbo = NULL,
00134 VRS::SO<VRS::Texture2DGL> reflTex = NULL,
00135 const VRS::TransactionNo& reflNo = 0)
00136 : refFBO(fbo),
00137 reflectionTexture(reflTex),
00138 reflectionTextureTransaction(reflNo)
00139 {}
00140
00141 VRS::SO<VRS::FrameBufferObjectGL> refFBO;
00142 VRS::SO<VRS::Texture2DGL> reflectionTexture;
00143 VRS::VertexData<3, float> normalTranslation;
00144 VRS::TransactionNo reflectionTextureTransaction;
00145 };
00146
00147 VRS::SO<VRS::NonPersistentArray<VRS::WO<WaterSurface> > > m_surfaces;
00148 std::map<VRS::WO<WaterSurface>, bool> m_markedAsReflecting;
00149
00150 VRS::SO<VRS::FrameBufferObjectGL> m_waterMaskFBO;
00151 VRS::SO<VRS::Texture2DGL> m_waterMask;
00152 VRS::SO<VRS::RenderTextureGL> m_waterMaskTarget;
00153 VRS::SO<VRS::Texture2DGL> m_waterMaskDepth;
00154 VRS::SO<VRS::RenderTextureGL> m_waterMaskDepthTarget;
00155
00156
00157 typedef VRS::CachedEngineResource<VRS::WO<WaterSurface>, WaterSurfaceData> CachedWaterSurfaceData;
00158 VRS::SO<CachedWaterSurfaceData> m_surfaceData;
00159
00160 unsigned int m_currentSurfaceIndex;
00161 VRS::WO<EnvironmentRenderer::WaterSurface> m_currentSurface;
00162
00163 int m_recursions;
00164 bool m_render;
00165
00166 VRS::SO<VRS::Texture2DGL> m_reflTex;
00167 VRS::SO<VRS::Texture2DGL> m_refrTex;
00168
00169 VRS::TransactionNo m_textureTransaction;
00170
00171 VRS::Matrix m_originalModelview;
00172 VRS::Matrix m_originalProjection;
00173
00174 VRS::VRSTime m_currentPassTime, m_lastPassTime;
00175 double m_elapsedTime;
00176 VRS::SO<VRS::Clock> m_lastClock;
00177
00178
00179
00180
00181
00182
00183 bool m_reflectAll;
00184
00185 VRS::TextureGL::FilterMode m_reflMagFilter, m_reflMinFilter;
00186 VRS::TextureGL::FilterMode m_refrMagFilter, m_refrMinFilter;
00187
00188 unsigned int m_textureWidth, m_textureHeight;
00189 VRS::SO<VRS::BackgroundGL> m_background;
00190
00191 };
00192
00193 }
00194
00195 #endif // WATERSURFACETECHNIQUE_H
00196