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 "3d/water_pool_manager.h"
00029 #include "3d/texture_blend.h"
00030 #include "3d/water_shape.h"
00031 #include "nel/misc/command.h"
00032 #include "water_height_map.h"
00033
00034
00035
00036 namespace NL3D {
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 CWaterPoolManager &GetWaterPoolManager()
00079 {
00080 static CWaterPoolManager singleton;
00081 return singleton;
00082 }
00083
00084
00085
00086 bool CWaterPoolManager::hasPool(uint32 ID) const
00087 {
00088 return _PoolMap.count(ID) != 0;
00089 }
00090
00091
00092
00093 CWaterHeightMap *CWaterPoolManager::createWaterPool(const CWaterHeightMapBuild ¶ms)
00094 {
00095 CWaterHeightMap *whm = _PoolMap.count(params.ID) == 0 ? new CWaterHeightMap : _PoolMap[params.ID];
00096 whm->setDamping(params.Damping);
00097 whm->setFilterWeight(params.FilterWeight);
00098 whm->setSize(params.Size);
00099 whm->setUnitSize(params.UnitSize);
00100 whm->setWaves(params.WaveIntensity, params.WavePeriod, params.WaveRadius, params.BorderWaves);
00101 whm->enableWaves(params.WavesEnabled);
00102 whm->setName(params.Name);
00103 _PoolMap[params.ID] = whm;
00104 return whm;
00105 }
00106
00107
00108
00109 CWaterHeightMap &CWaterPoolManager::getPoolByID(uint32 ID)
00110 {
00111 if(_PoolMap.count(ID))
00112 {
00113 return *_PoolMap[ID];
00114 }
00115 else
00116 {
00117 return *createWaterPool();
00118 }
00119 }
00120
00121
00122
00123 void CWaterPoolManager::reset()
00124 {
00125 for (TPoolMap::iterator it = _PoolMap.begin(); it != _PoolMap.end(); ++it)
00126 {
00127 delete it->second;
00128 }
00129 }
00130
00131
00132
00133
00134 void CWaterPoolManager::registerWaterShape(CWaterShape *shape)
00135 {
00136 nlassert(std::find(_WaterShapes.begin(), _WaterShapes.end(), shape) == _WaterShapes.end());
00137 _WaterShapes.push_back(shape);
00138 }
00139
00140
00141
00142 void CWaterPoolManager::unRegisterWaterShape(CWaterShape *shape)
00143 {
00144 TWaterShapeVect::iterator it = std::find(_WaterShapes.begin(), _WaterShapes.end(), shape);
00145
00146 if (it != _WaterShapes.end())
00147 _WaterShapes.erase(it);
00148 }
00149
00150
00151
00152 void CWaterPoolManager::setBlendFactor(IDriver *drv, float factor)
00153 {
00154 nlassert(factor >= 0 && factor <= 1);
00155 for (TWaterShapeVect::iterator it = _WaterShapes.begin(); it != _WaterShapes.end(); ++it)
00156 {
00157 CTextureBlend *tb;
00158 for (uint k = 0; k < 2; ++k)
00159 {
00160 tb = dynamic_cast<CTextureBlend *>((*it)->getEnvMap(k));
00161 if (tb && tb->setBlendFactor((uint16) (256.f * factor)))
00162 {
00163 drv->setupTexture(*tb);
00164 }
00165 }
00166 }
00167 }
00168
00169
00170
00171 bool CWaterPoolManager::isWaterShapeObserver(const CWaterShape *shape) const
00172 {
00173 return std::find(_WaterShapes.begin(), _WaterShapes.end(), shape) != _WaterShapes.end();
00174 }
00175
00176
00177
00178 uint CWaterPoolManager::getNumPools() const
00179 {
00180 return _PoolMap.size();
00181 }
00182
00183
00184
00185 uint CWaterPoolManager::getPoolID(uint i) const
00186 {
00187 nlassert(i < getNumPools());
00188 TPoolMap::const_iterator it = _PoolMap.begin();
00189 while (i--) ++it;
00190 return it->first;
00191 }
00192
00193
00194
00195 void CWaterPoolManager::removePool(uint32 ID)
00196 {
00197 nlassert(hasPool(ID));
00198 TPoolMap::iterator it = _PoolMap.find(ID);
00199 delete it->second;
00200 _PoolMap.erase(_PoolMap.find(ID));
00201 }
00202
00203
00204 void CWaterPoolManager::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
00205 {
00206 f.xmlPush("WaterPoolManager");
00207 (void)f.serialVersion(0);
00208 uint32 size;
00209 TPoolMap::iterator it;
00210 if (!f.isReading())
00211 {
00212 size = _PoolMap.size();
00213 it = _PoolMap.begin();
00214 }
00215 else
00216 {
00217 reset();
00218 }
00219 f.xmlSerial(size, "NUM_POOLS");
00220 while (size --)
00221 {
00222 f.xmlPush("PoolDesc");
00223 if (f.isReading())
00224 {
00225 CWaterHeightMap *whm;
00226 uint32 id;
00227 f.xmlSerial(id, "POOL_ID");
00228 f.serialPtr(whm);
00229 _PoolMap[id] = whm;
00230 }
00231 else
00232 {
00233 uint32 id = it->first;
00234 f.xmlSerial(id, "POOL_ID");
00235 f.serialPtr(it->second);
00236 ++it;
00237 }
00238 f.xmlPop();
00239 }
00240 f.xmlPop();
00241 }
00242
00243 }