1 // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
2 // Copyright (C) 2010 Winch Gate Property Limited
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU Affero General Public License as
6 // published by the Free Software Foundation, either version 3 of the
7 // License, or (at your option) any later version.
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU Affero General Public License for more details.
14 // You should have received a copy of the GNU Affero General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #include "nel/3d/landscape_user.h"
20 #include "nel/misc/file.h"
21 #include "nel/misc/path.h"
22 #include "nel/misc/hierarchical_timer.h"
23 #include "nel/misc/progress_callback.h"
25 using namespace NLMISC
;
34 H_AUTO_DECL( NL3D_UI_Landscape
)
35 H_AUTO_DECL( NL3D_Render_Landscape_updateLightingAll
)
36 H_AUTO_DECL( NL3D_Load_Landscape
)
38 #define NL3D_HAUTO_UI_LANDSCAPE H_AUTO_USE( NL3D_UI_Landscape )
39 #define NL3D_HAUTO_LANDSCAPE_UPDATE_LIGHTING_ALL H_AUTO_USE( NL3D_Render_Landscape_updateLightingAll )
40 #define NL3D_HAUTO_LOAD_LANDSCAPE H_AUTO_USE( NL3D_Load_Landscape )
42 // ***************************************************************************
43 CLandscapeUser::~CLandscapeUser()
46 // must ensure all loading is ended
50 _Scene
->deleteModel(_Landscape
);
55 // ****************************************************************************
56 void CLandscapeUser::setZonePath(const std::string
&zonePath
)
58 NL3D_HAUTO_UI_LANDSCAPE
;
59 _ZoneManager
.setZonePath(zonePath
);
62 // ****************************************************************************
63 void CLandscapeUser::invalidateAllTiles()
65 _Landscape
->Landscape
.invalidateAllTiles();
68 // ****************************************************************************
69 void CLandscapeUser::loadBankFiles(const std::string
&tileBankFile
, const std::string
&farBankFile
)
71 NL3D_HAUTO_LOAD_LANDSCAPE
;
73 // Release all OLD tiles
74 _Landscape
->Landscape
.releaseAllTiles();
77 _Landscape
->Landscape
.TileBank
.clear ();
79 // First, load the banks.
80 //=======================
81 CIFile
bankFile(CPath::lookup(tileBankFile
));
82 _Landscape
->Landscape
.TileBank
.serial(bankFile
);
83 // All textures path are relative!
84 _Landscape
->Landscape
.TileBank
.makeAllPathRelative();
86 _Landscape
->Landscape
.TileBank
.makeAllExtensionDDS();
88 _Landscape
->Landscape
.TileBank
.setAbsPath ("");
90 CIFile
farbankFile(CPath::lookup(farBankFile
));
91 _Landscape
->Landscape
.TileFarBank
.serial(farbankFile
);
96 // ****************************************************************************
98 void CLandscapeUser::flushTiles (NLMISC::IProgressCallback
&progress
)
100 // After loading the TileBank, and before initTileBanks(), must load the vegetables descritpor
101 _Landscape
->Landscape
.TileBank
.loadTileVegetableDescs();
103 // init the TileBanks descriptors
104 if ( ! _Landscape
->Landscape
.initTileBanks() )
106 nlwarning( "You need to recompute bank.farbank for the far textures" );
112 for (ts
=0; ts
<_Landscape
->Landscape
.TileBank
.getTileSetCount (); ts
++)
114 CTileSet
*tileSet
=_Landscape
->Landscape
.TileBank
.getTileSet (ts
);
115 tileCount
+= tileSet
->getNumTile128();
116 tileCount
+= tileSet
->getNumTile256();
117 tileCount
+= CTileSet::count
;
120 // Second, temporary, flushTiles.
121 //===============================
123 for (ts
=0; ts
<_Landscape
->Landscape
.TileBank
.getTileSetCount (); ts
++)
125 CTileSet
*tileSet
=_Landscape
->Landscape
.TileBank
.getTileSet (ts
);
127 for (tl
=0; tl
<tileSet
->getNumTile128(); tl
++)
130 progress
.progress ((float)tile
/(float)tileCount
);
133 _Landscape
->Landscape
.flushTiles (_Scene
->getDriver(), (uint16
)tileSet
->getTile128(tl
), 1);
135 for (tl
=0; tl
<tileSet
->getNumTile256(); tl
++)
138 progress
.progress ((float)tile
/(float)tileCount
);
141 _Landscape
->Landscape
.flushTiles (_Scene
->getDriver(), (uint16
)tileSet
->getTile256(tl
), 1);
143 for (tl
=0; tl
<CTileSet::count
; tl
++)
146 progress
.progress ((float)tile
/(float)tileCount
);
149 _Landscape
->Landscape
.flushTiles (_Scene
->getDriver(), (uint16
)tileSet
->getTransition(tl
)->getTile (), 1);
154 // ****************************************************************************
156 void CLandscapeUser::loadAllZonesAround(const CVector
&pos
, float radius
, std::vector
<std::string
> &zonesAdded
)
158 NL3D_HAUTO_LOAD_LANDSCAPE
;
162 _ZoneManager
.checkZonesAround ((uint
)pos
.x
, (uint
)(-pos
.y
), (uint
)radius
);
163 while (_ZoneManager
.isLoading())
165 CZoneManager::SZoneManagerWork Work
;
166 if (_ZoneManager
.isWorkComplete(Work
))
168 nlassert(!Work
.ZoneRemoved
);
171 if (Work
.Zone
== (CZone
*)-1)
173 nlwarning ("Can't load zone %s", Work
.NameZoneAdded
.c_str ());
177 _Landscape
->Landscape
.addZone (*Work
.Zone
);
180 std::string zoneadd
= Work
.NameZoneAdded
;
181 zoneadd
= zoneadd
.substr(0, zoneadd
.find('.'));
182 zonesAdded
.push_back(zoneadd
);
190 _ZoneManager
.checkZonesAround ((uint
)pos
.x
, (uint
)(-pos
.y
), (uint
)radius
);
192 // Yoyo: must check the binds of the zones.
193 _Landscape
->Landscape
.checkBinds();
196 // ****************************************************************************
197 void CLandscapeUser::refreshAllZonesAround(const CVector
&pos
, float radius
, std::vector
<std::string
> &zonesAdded
, std::vector
<std::string
> &zonesRemoved
,
198 NLMISC::IProgressCallback
&progress
, const std::vector
<uint16
> *validZoneIds
)
200 NL3D_HAUTO_LOAD_LANDSCAPE
;
203 zonesRemoved
.clear();
206 _ZoneManager
.checkZonesAround ((uint
)pos
.x
, (uint
)(-pos
.y
), (uint
)radius
, validZoneIds
);
207 refreshZonesAround (pos
, radius
, za
, zr
);
210 uint zoneToLoad
= _ZoneManager
.getNumZoneLeftToLoad ();
211 while (_ZoneManager
.isLoading() || _ZoneManager
.isRemoving())
215 progress
.progress ((float)(zoneToLoad
-_ZoneManager
.getNumZoneLeftToLoad ())/(float)zoneToLoad
);
217 refreshZonesAround (pos
, radius
, za
, zr
);
219 // some zone added or removed??
221 zonesAdded
.push_back(za
);
223 zonesRemoved
.push_back(zr
);
225 _ZoneManager
.checkZonesAround ((uint
)pos
.x
, (uint
)(-pos
.y
), (uint
)radius
);
227 if (_ZoneManager
.isLoading())
232 // ***************************************************************************
233 void CLandscapeUser::getAllZoneLoaded(std::vector
<std::string
> &zoneLoaded
) const
235 // Build the list of zoneId.
236 std::vector
<uint16
> zoneIds
;
237 _Landscape
->Landscape
.getZoneList(zoneIds
);
241 zoneLoaded
.resize(zoneIds
.size());
242 for(uint i
=0;i
<zoneLoaded
.size();i
++)
244 CLandscape::buildZoneName(zoneIds
[i
], zoneLoaded
[i
]);
248 // ****************************************************************************
249 void CLandscapeUser::loadAllZonesAround(const CVector
&pos
, float radius
)
251 std::vector
<std::string
> dummy
;
252 loadAllZonesAround(pos
, radius
, dummy
);
256 // ****************************************************************************
257 void CLandscapeUser::refreshZonesAround(const CVector
&pos
, float radius
)
259 NL3D_HAUTO_LOAD_LANDSCAPE
;
261 std::string dummy1
, dummy2
;
262 refreshZonesAround(pos
, radius
, dummy1
, dummy2
);
264 // ****************************************************************************
265 void CLandscapeUser::refreshZonesAround(const CVector
&pos
, float radius
, std::string
&zoneAdded
, std::string
&zoneRemoved
, const std::vector
<uint16
> *validZoneIds
)
267 NL3D_HAUTO_LOAD_LANDSCAPE
;
271 CZoneManager::SZoneManagerWork Work
;
272 // Check if new zone must be added to landscape
273 if (_ZoneManager
.isWorkComplete(Work
))
277 if (Work
.Zone
== (CZone
*)-1)
279 //nlwarning ("Can't load zone %s", Work.NameZoneAdded.c_str ());
283 _Landscape
->Landscape
.addZone(*Work
.Zone
);
285 // Yoyo: must check the binds of the new inserted zone.
288 _Landscape
->Landscape
.checkBinds(Work
.Zone
->getZoneId());
290 catch (const EBadBind
&e
)
292 nlwarning ("Bind error : %s", e
.what());
293 nlstopex(("Zone Data Bind Error. Please send a report. You may continue but it should crash!"));
297 zoneAdded
= Work
.NameZoneAdded
;
298 zoneAdded
= zoneAdded
.substr(0, zoneAdded
.find('.'));
302 // Check if a zone must be removed from landscape
303 if (Work
.ZoneRemoved
)
305 _Landscape
->Landscape
.removeZone (Work
.IdZoneToRemove
);
306 zoneRemoved
= Work
.NameZoneRemoved
;
307 zoneRemoved
= zoneRemoved
.substr(0, zoneRemoved
.find('.'));
311 _ZoneManager
.checkZonesAround((uint
)pos
.x
, (uint
)(-pos
.y
), (uint
)radius
, validZoneIds
);
314 // ****************************************************************************
315 void CLandscapeUser::removeAllZones()
317 NL3D_HAUTO_LOAD_LANDSCAPE
;
319 // Ensure Async Loading is ended
320 CZoneManager::SZoneManagerWork Work
;
321 while (_ZoneManager
.isLoading())
323 if (_ZoneManager
.isWorkComplete(Work
))
328 if (Work
.Zone
== (CZone
*)-1)
330 nlwarning ("Can't load zone %s", Work
.NameZoneAdded
.c_str ());
334 // just discard it! cause will be all cleared below
340 if (Work
.ZoneRemoved
)
342 _Landscape
->Landscape
.removeZone (Work
.IdZoneToRemove
);
351 // Then do a full clear
352 _Landscape
->Landscape
.clear();
353 _ZoneManager
.clear();
356 // ****************************************************************************
357 void CLandscapeUser::setupStaticLight (const CRGBA
&diffuse
, const CRGBA
&ambiant
, float multiply
)
359 NL3D_HAUTO_UI_LANDSCAPE
;
360 _Landscape
->Landscape
.setupStaticLight(diffuse
, ambiant
, multiply
);
365 // ****************************************************************************
366 void CLandscapeUser::setThreshold (float thre
)
368 NL3D_HAUTO_UI_LANDSCAPE
;
369 _Landscape
->Landscape
.setThreshold(thre
);
371 // ****************************************************************************
372 float CLandscapeUser::getThreshold () const
374 NL3D_HAUTO_UI_LANDSCAPE
;
375 return _Landscape
->Landscape
.getThreshold();
377 // ****************************************************************************
378 void CLandscapeUser::setTileNear (float tileNear
)
380 NL3D_HAUTO_UI_LANDSCAPE
;
381 _Landscape
->Landscape
.setTileNear(tileNear
);
383 // ****************************************************************************
384 float CLandscapeUser::getTileNear () const
386 NL3D_HAUTO_UI_LANDSCAPE
;
387 return _Landscape
->Landscape
.getTileNear();
389 // ****************************************************************************
390 void CLandscapeUser::setTileMaxSubdivision (uint tileDiv
)
392 NL3D_HAUTO_UI_LANDSCAPE
;
393 _Landscape
->Landscape
.setTileMaxSubdivision(tileDiv
);
395 // ****************************************************************************
396 uint
CLandscapeUser::getTileMaxSubdivision ()
398 NL3D_HAUTO_UI_LANDSCAPE
;
399 return _Landscape
->Landscape
.getTileMaxSubdivision();
403 // ****************************************************************************
404 std::string
CLandscapeUser::getZoneName(const CVector
&pos
)
406 NL3D_HAUTO_UI_LANDSCAPE
;
407 return _ZoneManager
.getZoneName((uint
)pos
.x
, (uint
)(-pos
.y
), 0, 0).first
;
411 // ****************************************************************************
412 CVector
CLandscapeUser::getHeightFieldDeltaZ(float x
, float y
) const
414 NL3D_HAUTO_UI_LANDSCAPE
;
415 return _Landscape
->Landscape
.getHeightFieldDeltaZ(x
,y
);
418 // ****************************************************************************
419 void CLandscapeUser::setHeightField(const CHeightMap
&hf
)
421 NL3D_HAUTO_UI_LANDSCAPE
;
422 _Landscape
->Landscape
.setHeightField(hf
);
426 // ****************************************************************************
427 void CLandscapeUser::enableVegetable(bool enable
)
429 NL3D_HAUTO_UI_LANDSCAPE
;
430 _Landscape
->Landscape
.enableVegetable(enable
);
433 // ****************************************************************************
434 void CLandscapeUser::loadVegetableTexture(const std::string
&textureFileName
)
436 NL3D_HAUTO_LOAD_LANDSCAPE
;
437 _Landscape
->Landscape
.loadVegetableTexture(textureFileName
);
440 // ****************************************************************************
441 void CLandscapeUser::setupVegetableLighting(const CRGBA
&ambient
, const CRGBA
&diffuse
, const CVector
&directionalLight
)
443 NL3D_HAUTO_UI_LANDSCAPE
;
444 _Landscape
->Landscape
.setupVegetableLighting(ambient
, diffuse
, directionalLight
);
447 // ****************************************************************************
448 void CLandscapeUser::setVegetableWind(const CVector
&windDir
, float windFreq
, float windPower
, float windBendMin
)
450 NL3D_HAUTO_UI_LANDSCAPE
;
451 _Landscape
->Landscape
.setVegetableWind(windDir
, windFreq
, windPower
, windBendMin
);
454 // ****************************************************************************
455 void CLandscapeUser::setVegetableUpdateLightingFrequency(float freq
)
457 NL3D_HAUTO_UI_LANDSCAPE
;
458 _Landscape
->Landscape
.setVegetableUpdateLightingFrequency(freq
);
462 // ****************************************************************************
463 void CLandscapeUser::setUpdateLightingFrequency(float freq
)
465 NL3D_HAUTO_UI_LANDSCAPE
;
466 _Landscape
->Landscape
.setUpdateLightingFrequency(freq
);
470 // ****************************************************************************
471 void CLandscapeUser::enableAdditive (bool enable
)
473 NL3D_HAUTO_UI_LANDSCAPE
;
474 _Landscape
->enableAdditive(enable
);
476 // ****************************************************************************
477 bool CLandscapeUser::isAdditiveEnabled () const
479 NL3D_HAUTO_UI_LANDSCAPE
;
480 return _Landscape
->isAdditive ();
483 // ****************************************************************************
484 void CLandscapeUser::setPointLightDiffuseMaterial(CRGBA diffuse
)
486 NL3D_HAUTO_UI_LANDSCAPE
;
487 _Landscape
->Landscape
.setPointLightDiffuseMaterial(diffuse
);
489 // ****************************************************************************
490 CRGBA
CLandscapeUser::getPointLightDiffuseMaterial () const
492 NL3D_HAUTO_UI_LANDSCAPE
;
493 return _Landscape
->Landscape
.getPointLightDiffuseMaterial();
496 // ****************************************************************************
497 void CLandscapeUser::setDLMGlobalVegetableColor(CRGBA gvc
)
499 NL3D_HAUTO_UI_LANDSCAPE
;
500 _Landscape
->Landscape
.setDLMGlobalVegetableColor(gvc
);
502 // ****************************************************************************
503 CRGBA
CLandscapeUser::getDLMGlobalVegetableColor() const
505 NL3D_HAUTO_UI_LANDSCAPE
;
506 return _Landscape
->Landscape
.getDLMGlobalVegetableColor();
508 // ****************************************************************************
509 void CLandscapeUser::updateLightingAll()
511 NL3D_HAUTO_LANDSCAPE_UPDATE_LIGHTING_ALL
;
512 _Landscape
->Landscape
.updateLightingAll();
514 // ****************************************************************************
515 void CLandscapeUser::postfixTileFilename (const char *postfix
)
517 NL3D_HAUTO_LANDSCAPE_UPDATE_LIGHTING_ALL
;
518 _Landscape
->Landscape
.TileBank
.postfixTileFilename (postfix
);
520 // ****************************************************************************
521 void CLandscapeUser::postfixTileVegetableDesc (const char *postfix
)
523 NL3D_HAUTO_LANDSCAPE_UPDATE_LIGHTING_ALL
;
524 _Landscape
->Landscape
.TileBank
.postfixTileVegetableDesc (postfix
);
527 // ***************************************************************************
528 void CLandscapeUser::enableReceiveShadowMap(bool state
)
530 _Landscape
->enableReceiveShadowMap(state
);
533 // ***************************************************************************
534 bool CLandscapeUser::canReceiveShadowMap() const
536 return _Landscape
->canReceiveShadowMap();
539 // ***************************************************************************
540 void CLandscapeUser::setRefineCenterAuto(bool mode
)
542 _Landscape
->setRefineCenterAuto(mode
);
545 // ***************************************************************************
546 void CLandscapeUser::setRefineCenterUser(const CVector
&refineCenter
)
548 _Landscape
->setRefineCenterUser(refineCenter
);
551 // ***************************************************************************
552 bool CLandscapeUser::getRefineCenterAuto() const
554 return _Landscape
->getRefineCenterAuto();
557 // ***************************************************************************
558 const CVector
&CLandscapeUser::getRefineCenterUser() const
560 return _Landscape
->getRefineCenterUser();
564 // ***************************************************************************
565 void CLandscapeUser::addTileCallback(ULandscapeTileCallback
*cb
)
567 NL3D_HAUTO_UI_LANDSCAPE
;
568 _Landscape
->Landscape
.addTileCallback(cb
);
571 // ***************************************************************************
572 void CLandscapeUser::removeTileCallback(ULandscapeTileCallback
*cb
)
574 NL3D_HAUTO_UI_LANDSCAPE
;
575 _Landscape
->Landscape
.removeTileCallback(cb
);
578 // ***************************************************************************
579 bool CLandscapeUser::isTileCallback(ULandscapeTileCallback
*cb
)
581 NL3D_HAUTO_UI_LANDSCAPE
;
582 return _Landscape
->Landscape
.isTileCallback(cb
);
585 // ***************************************************************************
586 void CLandscapeUser::setZFunc(UMaterial::ZFunc val
)
588 NL3D_HAUTO_UI_LANDSCAPE
;
589 _Landscape
->Landscape
.setZFunc((CMaterial::ZFunc
)val
);
592 // ***************************************************************************
593 const CZone
* CLandscapeUser::getZone (sint zoneId
) const
595 NL3D_HAUTO_UI_LANDSCAPE
;
596 return _Landscape
->Landscape
.getZone(zoneId
);
599 // ***************************************************************************
600 void CLandscapeUser::setVegetableDensity(float density
)
602 NL3D_HAUTO_UI_LANDSCAPE
;
603 _Landscape
->Landscape
.setVegetableDensity(density
);
606 // ***************************************************************************
607 float CLandscapeUser::getVegetableDensity() const
609 NL3D_HAUTO_UI_LANDSCAPE
;
610 return _Landscape
->Landscape
.getVegetableDensity();
613 // ***************************************************************************
614 float CLandscapeUser::getRayCollision(const NLMISC::CVector
&start
, const NLMISC::CVector
&end
)
616 NL3D_HAUTO_UI_LANDSCAPE
;
617 return _Landscape
->Landscape
.getRayCollision(start
, end
);