1 // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
2 // Copyright (C) 2010 Winch Gate Property Limited
4 // This source file has been modified by the following contributors:
5 // Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
7 // This program is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU Affero General Public License as
9 // published by the Free Software Foundation, either version 3 of the
10 // License, or (at your option) any later version.
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU Affero General Public License for more details.
17 // You should have received a copy of the GNU Affero General Public License
18 // along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "nel/3d/u_point_light.h"
23 #include "nel/3d/u_instance.h"
24 #include "nel/3d/u_camera.h"
25 #include "nel/3d/u_skeleton.h"
26 #include "nel/3d/scene_user.h"
27 #include "nel/3d/skeleton_model.h"
28 #include "nel/3d/coarse_mesh_manager.h"
29 #include "nel/3d/point_light_model.h"
30 #include "nel/3d/lod_character_manager.h"
31 #include "nel/3d/lod_character_shape.h"
32 #include "nel/3d/lod_character_shape_bank.h"
33 #include "nel/misc/hierarchical_timer.h"
34 #include "nel/3d/async_texture_manager.h"
35 #include "nel/3d/water_env_map_user.h"
38 using namespace NLMISC
;
47 H_AUTO_DECL( NL3D_UI_Scene
)
48 H_AUTO_DECL( NL3D_Misc_Scene_CreateDel_Element
)
49 H_AUTO_DECL( NL3D_CreateOrLoad_Instance
)
50 H_AUTO_DECL( NL3D_CreateOrLoad_Skeleton
)
51 H_AUTO_DECL( NL3D_Load_CLodOrCoarseMesh
)
52 H_AUTO_DECL( NL3D_Load_AsyncIG
)
54 #define NL3D_HAUTO_UI_SCENE H_AUTO_USE( NL3D_UI_Scene )
55 #define NL3D_HAUTO_ELT_SCENE H_AUTO_USE( NL3D_Misc_Scene_CreateDel_Element )
56 #define NL3D_HAUTO_CREATE_INSTANCE H_AUTO_USE( NL3D_CreateOrLoad_Instance )
57 #define NL3D_HAUTO_CREATE_SKELETON H_AUTO_USE( NL3D_CreateOrLoad_Skeleton )
58 #define NL3D_HAUTO_LOAD_LOD H_AUTO_USE( NL3D_Load_CLodOrCoarseMesh )
59 #define NL3D_HAUTO_ASYNC_IG H_AUTO_USE( NL3D_Load_AsyncIG )
62 H_AUTO_DECL( NL3D_Render_Scene
)
63 H_AUTO_DECL( NL3D_Render_Animate_Scene
)
64 H_AUTO_DECL( NL3D_Render_Scene_Begin
)
65 H_AUTO_DECL( NL3D_Render_Scene_Part
)
66 H_AUTO_DECL( NL3D_Render_Scene_End
)
68 #define NL3D_HAUTO_RENDER_SCENE H_AUTO_USE( NL3D_Render_Scene )
69 #define NL3D_HAUTO_RENDER_SCENE_ANIMATE H_AUTO_USE( NL3D_Render_Animate_Scene )
70 #define NL3D_HAUTO_RENDER_SCENE_BEGIN H_AUTO_USE( NL3D_Render_Scene_Begin )
71 #define NL3D_HAUTO_RENDER_SCENE_PART H_AUTO_USE( NL3D_Render_Scene_Part )
72 #define NL3D_HAUTO_RENDER_SCENE_END H_AUTO_USE( NL3D_Render_Scene_End )
77 // ***************************************************************************
78 void CSceneUser::setAutomaticAnimationSet(UAnimationSet
*as
)
84 CAnimationSetUser
*asu
= NLMISC::safe_cast
<CAnimationSetUser
*>(as
);
85 _Scene
.setAutomaticAnimationSet(asu
->_AnimationSet
);
88 // ***************************************************************************
89 UPlayListManager
*CSceneUser::createPlayListManager()
93 return _PlayListManagers
.insert(new CPlayListManagerUser());
95 // ***************************************************************************
96 void CSceneUser::deletePlayListManager(UPlayListManager
*playListManager
)
100 _PlayListManagers
.erase((CPlayListManagerUser
*)playListManager
, "deletePlayListManager(): Bad PlayListManager ptr");
103 // ***************************************************************************
105 void CSceneUser::setPolygonBalancingMode(CSceneUser::TPolygonBalancingMode polBalMode
)
109 nlassert( (uint
)CScene::CountPolygonBalancing
== (uint
)CSceneUser::CountPolygonBalancing
);
110 _Scene
.setPolygonBalancingMode((CScene::TPolygonBalancingMode
)(uint
)(polBalMode
));
113 // ***************************************************************************
115 CSceneUser::TPolygonBalancingMode
CSceneUser::getPolygonBalancingMode() const
119 nlassert( (uint
)CScene::CountPolygonBalancing
== (uint
)CSceneUser::CountPolygonBalancing
);
120 return (CSceneUser::TPolygonBalancingMode
)(uint
)_Scene
.getPolygonBalancingMode();
124 // ***************************************************************************
125 float CSceneUser::getNbFaceAsked () const
129 return _Scene
.getNbFaceAsked ();
132 // ***************************************************************************
133 void CSceneUser::setGroupLoadMaxPolygon(const std::string
&group
, uint nFaces
)
137 _Scene
.setGroupLoadMaxPolygon(group
, nFaces
);
139 // ***************************************************************************
140 uint
CSceneUser::getGroupLoadMaxPolygon(const std::string
&group
)
144 return _Scene
.getGroupLoadMaxPolygon(group
);
146 // ***************************************************************************
147 float CSceneUser::getGroupNbFaceAsked (const std::string
&group
) const
151 return _Scene
.getGroupNbFaceAsked (group
);
155 // ***************************************************************************
157 void CSceneUser::setCoarseMeshManagerTexture (const char *sPath
)
162 CCoarseMeshManager
*manager
=_Scene
.getCoarseMeshManager ();
168 manager
->setTextureFile (sPath
);
172 // ***************************************************************************
173 void CSceneUser::setCoarseMeshLightingUpdate(uint8 period
)
177 _Scene
.setCoarseMeshLightingUpdate(period
);
180 // ***************************************************************************
181 uint8
CSceneUser::getCoarseMeshLightingUpdate() const
185 return _Scene
.getCoarseMeshLightingUpdate();
188 // ***************************************************************************
189 void CSceneUser::enableLightingSystem(bool enable
)
193 _Scene
.enableLightingSystem(enable
);
196 // ***************************************************************************
197 void CSceneUser::setAmbientGlobal(NLMISC::CRGBA ambient
)
201 _Scene
.setAmbientGlobal(ambient
);
203 void CSceneUser::setSunAmbient(NLMISC::CRGBA ambient
)
207 _Scene
.setSunAmbient(ambient
);
209 void CSceneUser::setSunDiffuse(NLMISC::CRGBA diffuse
)
213 _Scene
.setSunDiffuse(diffuse
);
215 void CSceneUser::setSunSpecular(NLMISC::CRGBA specular
)
219 _Scene
.setSunSpecular(specular
);
221 void CSceneUser::setSunDirection(const NLMISC::CVector
&direction
)
225 _Scene
.setSunDirection(direction
);
227 void CSceneUser::setLightGroupColor(uint lightmapGroup
, NLMISC::CRGBA color
)
231 _Scene
.setLightGroupColor(lightmapGroup
, color
);
235 // ***************************************************************************
236 NLMISC::CRGBA
CSceneUser::getAmbientGlobal() const
240 return _Scene
.getAmbientGlobal();
242 NLMISC::CRGBA
CSceneUser::getSunAmbient() const
246 return _Scene
.getSunAmbient();
248 NLMISC::CRGBA
CSceneUser::getSunDiffuse() const
252 return _Scene
.getSunDiffuse();
254 NLMISC::CRGBA
CSceneUser::getSunSpecular() const
258 return _Scene
.getSunSpecular();
260 NLMISC::CVector
CSceneUser::getSunDirection() const
264 return _Scene
.getSunDirection();
267 // ***************************************************************************
269 void CSceneUser::setMaxLightContribution(uint nlights
)
273 _Scene
.setMaxLightContribution(nlights
);
276 // ***************************************************************************
278 uint
CSceneUser::getMaxLightContribution() const
282 return _Scene
.getMaxLightContribution();
285 // ***************************************************************************
287 void CSceneUser::setLightTransitionThreshold(float lightTransitionThreshold
)
291 _Scene
.setLightTransitionThreshold(lightTransitionThreshold
);
294 // ***************************************************************************
296 float CSceneUser::getLightTransitionThreshold() const
300 return _Scene
.getLightTransitionThreshold();
303 // ***************************************************************************
305 UPointLight
CSceneUser::createPointLight()
307 NL3D_HAUTO_ELT_SCENE
;
309 CTransform
*model
= _Scene
.createModel(PointLightModelId
);
312 CPointLightModel
*pointLightModel
= safe_cast
<CPointLightModel
*> (model
);
313 // If not found, return NULL.
314 if(pointLightModel
==NULL
)
317 // The component is auto added/deleted to _Scene in ctor/dtor.
318 return UPointLight (pointLightModel
);
321 return UPointLight ();
324 // ***************************************************************************
325 void CSceneUser::deletePointLight(UPointLight
&light
)
327 NL3D_HAUTO_ELT_SCENE
;
329 // The component is auto added/deleted to _Scene in ctor/dtor.
330 _Scene
.deleteModel (light
.getObjectPtr());
335 // ***************************************************************************
336 void CSceneUser::setGlobalWindPower(float gwp
)
340 _Scene
.setGlobalWindPower(gwp
);
342 // ***************************************************************************
343 float CSceneUser::getGlobalWindPower() const
347 return _Scene
.getGlobalWindPower();
349 // ***************************************************************************
350 void CSceneUser::setGlobalWindDirection(const CVector
&gwd
)
352 _Scene
.setGlobalWindDirection(gwd
);
354 // ***************************************************************************
355 const CVector
&CSceneUser::getGlobalWindDirection() const
359 return _Scene
.getGlobalWindDirection();
362 // ***************************************************************************
363 void CSceneUser::updateWaitingIG()
365 for(TWaitingIGList::iterator it
= _WaitingIGs
.begin(); it
!= _WaitingIGs
.end();)
368 if (it
->IGToLoad
!= NULL
) // ig loaded ?
370 if (it
->IGToLoad
!= (UInstanceGroup
*) -1)
372 switch (it
->IGToLoad
->getAddToSceneState())
374 case UInstanceGroup::StateNotAdded
:
376 if (it
->Callback
!= NULL
)
377 it
->Callback
->InstanceGroupCreated(it
->IGToLoad
);
378 it
->IGToLoad
->addToSceneAsync(*this, _DriverUser
, it
->SelectedTexture
);
380 case UInstanceGroup::StateAdded
:
381 it
->IGToLoad
->setPos(it
->Pos
);
382 it
->IGToLoad
->setRotQuat(it
->Rot
);
383 this->setToGlobalInstanceGroup(it
->IGToLoad
);
384 *it
->CallerPtr
= it
->IGToLoad
;
386 it
= _WaitingIGs
.erase(it
);
389 case UInstanceGroup::StateError
:
391 it
->IGToLoad
= (UInstanceGroup
*) -1;
392 *it
->CallerPtr
= it
->IGToLoad
;
394 it
= _WaitingIGs
.erase(it
);
404 *it
->CallerPtr
= it
->IGToLoad
;
405 it
= _WaitingIGs
.erase(it
);
416 // ***************************************************************************
417 void CSceneUser::resetCLodManager()
421 // DriverUser always setup the lod manager
422 nlassert(_Scene
.getLodCharacterManager());
424 _Scene
.getLodCharacterManager()->reset();
427 // ***************************************************************************
428 uint32
CSceneUser::loadCLodShapeBank(const std::string
&fileName
)
432 // DriverUser always setup the lod manager
433 nlassert(_Scene
.getLodCharacterManager());
436 CIFile
file(CPath::lookup(fileName
));
438 // create the shape bank
439 uint32 bankId
= _Scene
.getLodCharacterManager()->createShapeBank();
442 CLodCharacterShapeBank
*bank
= _Scene
.getLodCharacterManager()->getShapeBank(bankId
);
448 // recompile the shape Map.
449 _Scene
.getLodCharacterManager()->compile();
454 // ***************************************************************************
455 void CSceneUser::deleteCLodShapeBank(uint32 bankId
)
459 // DriverUser always setup the lod manager
460 nlassert(_Scene
.getLodCharacterManager());
463 _Scene
.getLodCharacterManager()->deleteShapeBank(bankId
);
465 // recompile the shape Map.
466 _Scene
.getLodCharacterManager()->compile();
469 // ***************************************************************************
470 sint32
CSceneUser::getCLodShapeIdByName(const std::string
&name
) const
474 // DriverUser always setup the lod manager
475 nlassert(_Scene
.getLodCharacterManager());
477 return _Scene
.getLodCharacterManager()->getShapeIdByName(name
);
480 // ***************************************************************************
481 sint32
CSceneUser::getCLodAnimIdByName(uint32 shapeId
, const std::string
&name
) const
485 // DriverUser always setup the lod manager
486 nlassert(_Scene
.getLodCharacterManager());
488 const CLodCharacterShape
*shape
= _Scene
.getLodCharacterManager()->getShape(shapeId
);
490 return shape
->getAnimIdByName(name
);
496 // ***************************************************************************
497 void CSceneUser::render(bool updateWaitingInstancesFlag
/*= true*/, bool restoreMatrixContextAfterRender
/*= true*/)
502 NL3D_HAUTO_RENDER_SCENE
504 if(_Scene
.getCam() == NULL
)
505 nlerror("render(): try to render with no camera linked (may have been deleted)");
509 if (updateWaitingInstancesFlag
) updateWaitingInstances();
511 // Must restore the matrix context, so 2D/3D interface not disturbed.
512 if (restoreMatrixContextAfterRender
) _DriverUser
->restoreMatrixContext();
515 // ***************************************************************************
516 void CSceneUser::beginPartRender()
521 NL3D_HAUTO_RENDER_SCENE_BEGIN
522 _Scene
.beginPartRender();
526 // ***************************************************************************
527 void CSceneUser::renderPart(TRenderPart rp
, bool doHrcPass
, bool doTrav
, bool keepTrav
)
532 NL3D_HAUTO_RENDER_SCENE_PART
534 if(_Scene
.getCam() == NULL
)
535 nlerror("render(): try to render with no camera linked (may have been deleted)");
536 _Scene
.renderPart(rp
, doHrcPass
, doTrav
, keepTrav
);
540 // ***************************************************************************
541 void CSceneUser::endPartRender(bool updateWaitingInstancesFlag
, bool restoreMatrixContextAfterRender
, bool keepTrav
)
546 NL3D_HAUTO_RENDER_SCENE_END
547 _Scene
.endPartRender(keepTrav
);
550 if (updateWaitingInstancesFlag
) updateWaitingInstances();
552 // Must restore the matrix context, so 2D/3D interface not disturbed.
553 if (restoreMatrixContextAfterRender
) _DriverUser
->restoreMatrixContext();
557 // ***************************************************************************
558 /*virtual*/ void CSceneUser::updateWaitingInstances(double ellapsedTime
)
560 _Scene
.updateWaitingInstances(ellapsedTime
);
561 updateWaitingInstances();
565 // ***************************************************************************
566 void CSceneUser::updateWaitingInstances()
568 // Update waiting instances
572 // Done after the _Scene.render because in this method the instance are checked for creation
573 std::map
<UInstance
*,CTransformShape
*>::iterator it
= _WaitingInstances
.begin();
574 while( it
!= _WaitingInstances
.end() )
576 if( it
->second
!= NULL
)
578 it
->first
->attach (it
->second
);
579 std::map
<UInstance
*,CTransformShape
*>::iterator delIt
= it
;
581 _WaitingInstances
.erase(delIt
);
590 // update waiting instances groups;
599 void CSceneUser::animate(TGlobalAnimationTime time
)
601 NL3D_HAUTO_RENDER_SCENE_ANIMATE
;
603 _Scene
.animate(time
);
606 // ***************************************************************************
608 void CSceneUser::setCam(UCamera cam
)
613 nlerror("setCam(): cannot set a NULL camera");
614 CCamera
*camera
= cam
.getObjectPtr();
615 if( camera
->getOwnerScene() != &_Scene
)
616 nlerror("setCam(): try to set a current camera not created from this scene");
618 _Scene
.setCam(camera
);
621 // ***************************************************************************
623 UCamera
CSceneUser::getCam()
627 return UCamera (_Scene
.getCam());
630 // ***************************************************************************
632 void CSceneUser::setViewport(const class CViewport
& viewport
)
636 _Scene
.setViewport(viewport
);
638 CViewport
CSceneUser::getViewport()
642 return _Scene
.getViewport();
645 UInstanceGroup
*CSceneUser::findCameraClusterSystemFromRay(UInstanceGroup
*startClusterSystem
,
646 const NLMISC::CVector
&startPos
, NLMISC::CVector
&endPos
)
650 CInstanceGroupUser
*uig
= dynamic_cast<CInstanceGroupUser
*>(startClusterSystem
);
651 CInstanceGroup
*pIg
= NULL
;
653 pIg
= &uig
->_InstanceGroup
;
655 CInstanceGroup
*resultIg
= _Scene
.findCameraClusterSystemFromRay(pIg
, startPos
, endPos
);
657 return resultIg
->getUserInterface();
662 // ***************************************************************************
664 UCamera
CSceneUser::createCamera()
666 NL3D_HAUTO_ELT_SCENE
;
668 CTransform
*model
= _Scene
.createModel(CameraId
);
671 CCamera
*object
= NLMISC::safe_cast
<CCamera
*>(model
);
672 object
->setFrustum(UCamera::DefLx
, UCamera::DefLy
, UCamera::DefLzNear
, UCamera::DefLzFar
);
673 return UCamera (object
);
679 // ***************************************************************************
681 void CSceneUser::deleteCamera(UCamera
&cam
)
683 NL3D_HAUTO_ELT_SCENE
;
685 CCamera
*object
= cam
.getObjectPtr();
687 // The component is auto added/deleted to _Scene in ctor/dtor.
688 _Scene
.deleteModel (object
);
692 // ***************************************************************************
694 UInstance
CSceneUser::createInstance(const std::string
&shapeName
)
696 NL3D_HAUTO_CREATE_INSTANCE
;
698 CTransformShape
*model
= _Scene
.createInstance(shapeName
);
699 return UInstance (model
);
702 // ***************************************************************************
704 void CSceneUser::createInstanceAsync(const std::string
&shapeName
, UInstance
*ppInstance
, const NLMISC::CVector
&position
, uint selectedTexture
)
706 NL3D_HAUTO_CREATE_INSTANCE
;
708 _WaitingInstances
[ppInstance
] = NULL
;
709 _Scene
.createInstanceAsync(shapeName
,&_WaitingInstances
[ppInstance
], position
, selectedTexture
);
710 // CTransform *model= _Scene.createInstance(shapeName);
711 // If not found, return NULL.
715 // if( dynamic_cast<CMeshInstance*>(model)==NULL )
716 // nlerror("UScene::createInstance(): shape is not a mesh");
718 // The component is auto added/deleted to _Scene in ctor/dtor.
719 // return dynamic_cast<UInstance*>( _Transforms.insert(new CInstanceUser(&_Scene, model)) );
722 // ***************************************************************************
724 void CSceneUser::deleteInstance(UInstance
&inst
)
726 NL3D_HAUTO_ELT_SCENE
;
728 _Scene
.deleteInstance (inst
.getObjectPtr());
732 // ***************************************************************************
734 void CSceneUser::createInstanceGroupAndAddToSceneAsync (const std::string
&instanceGroup
, UInstanceGroup
**pIG
, const NLMISC::CVector
&pos
, const NLMISC::CQuat
&rot
,
735 uint selectedTexture
, IAsyncLoadCallback
*pCB
)
739 _WaitingIGs
.push_front(CWaitingIG(pIG
, pos
, rot
, selectedTexture
, pCB
));
740 UInstanceGroup::createInstanceGroupAsync(instanceGroup
, &(_WaitingIGs
.begin()->IGToLoad
));
741 // this list updat will be performed at each render, see updateWaitingIG
744 void CSceneUser::stopCreatingAndAddingIG(UInstanceGroup
**pIG
)
748 for(TWaitingIGList::iterator it
= _WaitingIGs
.begin(); it
!= _WaitingIGs
.end(); ++it
)
750 CWaitingIG
&rWIG
= *it
;
751 if (rWIG
.CallerPtr
== pIG
)
753 if (rWIG
.IGToLoad
== NULL
)
755 UInstanceGroup::stopCreateInstanceGroupAsync(pIG
);
757 // Ig must be initialized
758 else if (rWIG
.IGToLoad
!= (UInstanceGroup
*)-1)
760 switch(rWIG
.IGToLoad
->getAddToSceneState())
762 case UInstanceGroup::StateAdding
:
763 rWIG
.IGToLoad
->stopAddToSceneAsync();
765 case UInstanceGroup::StateAdded
:
766 rWIG
.IGToLoad
->removeFromScene(*this);
767 delete rWIG
.IGToLoad
;
769 case UInstanceGroup::StateNotAdded
:
770 delete rWIG
.IGToLoad
;
776 _WaitingIGs
.erase(it
);
782 void CSceneUser::deleteInstanceGroup(UInstanceGroup
*pIG
)
787 // ***************************************************************************
789 UTransform
CSceneUser::createTransform()
791 NL3D_HAUTO_ELT_SCENE
;
793 CTransform
*model
= _Scene
.createModel(TransformId
);
794 return UTransform (model
);
797 // ***************************************************************************
799 void CSceneUser::deleteTransform(UTransform
&tr
)
801 NL3D_HAUTO_ELT_SCENE
;
803 _Scene
.deleteModel (tr
.getObjectPtr());
807 // ***************************************************************************
809 USkeleton
CSceneUser::createSkeleton(const std::string
&shapeName
)
811 NL3D_HAUTO_CREATE_SKELETON
;
813 CTransformShape
*ts
= _Scene
.createInstance(shapeName
);
816 CSkeletonModel
*model
= safe_cast
<CSkeletonModel
*> (ts
);
817 return USkeleton (model
);
825 // ***************************************************************************
827 void CSceneUser::deleteSkeleton(USkeleton
&skel
)
829 NL3D_HAUTO_ELT_SCENE
;
831 // The component is auto added/deleted to _Scene in ctor/dtor.
832 _Scene
.deleteInstance (skel
.getObjectPtr());
836 // ***************************************************************************
838 ULandscape
*CSceneUser::createLandscape()
840 NL3D_HAUTO_ELT_SCENE
;
842 // The component is auto added/deleted to _Scene in ctor/dtor.
843 return _Landscapes
.insert(new CLandscapeUser(&_Scene
));
845 void CSceneUser::deleteLandscape(ULandscape
*land
)
847 NL3D_HAUTO_ELT_SCENE
;
849 // The component is auto added/deleted to _Scene in ctor/dtor.
850 _Landscapes
.erase((CLandscapeUser
*) land
);
853 UCloudScape
*CSceneUser::createCloudScape()
855 NL3D_HAUTO_ELT_SCENE
;
857 // The component is auto added/deleted to _Scene in ctor/dtor.
858 return _CloudScapes
.insert(new CCloudScapeUser(&_Scene
));
860 void CSceneUser::deleteCloudScape(UCloudScape
*cs
)
863 // The component is auto added/deleted to _Scene in ctor/dtor.
864 _CloudScapes
.erase((CCloudScapeUser
*) cs
);
868 UInstanceGroup *CSceneUser::createInstanceGroup (const std::string &instanceGroup)
870 // Create the instance group
871 CInstanceGroupUser *user=new CInstanceGroupUser;
874 if (!user->load (instanceGroup))
883 // Insert the pointer in the pointer list
884 _InstanceGroups.insert (user);
886 // return the good value
890 void CSceneUser::deleteInstanceGroup (UInstanceGroup *group)
892 // The component is auto added/deleted to _Scene in ctor/dtor.
893 _InstanceGroups.erase (dynamic_cast<CInstanceGroupUser*>(group));
897 void CSceneUser::setToGlobalInstanceGroup(UInstanceGroup
*pIG
)
901 CInstanceGroupUser
*pIGU
= (CInstanceGroupUser
*)pIG
;
902 pIGU
->_InstanceGroup
.setClusterSystemForInstances(_Scene
.getGlobalInstanceGroup());
905 // ***************************************************************************
906 UVisualCollisionManager
*CSceneUser::createVisualCollisionManager()
908 NL3D_HAUTO_ELT_SCENE
;
910 return _VisualCollisionManagers
.insert(new CVisualCollisionManagerUser
);
912 void CSceneUser::deleteVisualCollisionManager(UVisualCollisionManager
*mgr
)
914 NL3D_HAUTO_ELT_SCENE
;
916 CVisualCollisionManagerUser
*vcmUser
= dynamic_cast<CVisualCollisionManagerUser
*>(mgr
);
918 // if it was the one used for shadow receiving in this scene, then set NULL
919 if(_Scene
.getVisualCollisionManagerForShadow()==&vcmUser
->getVCM())
920 _Scene
.setVisualCollisionManagerForShadow(NULL
);
923 _VisualCollisionManagers
.erase(vcmUser
);
927 // ***************************************************************************
928 CSceneUser::CSceneUser(CDriverUser
*drv
, bool bSmallScene
) : _Scene(bSmallScene
)
933 // init default Roots.
934 _Scene
.initDefaultRoots();
937 _Scene
.setDriver(_DriverUser
->getDriver());
940 _Scene
.setViewport (CViewport());
942 // init QuadGridClipManager
943 _Scene
.initQuadGridClipManager ();
945 // Create default camera, and active!!
946 setCam(createCamera());
951 CSceneUser::~CSceneUser()
953 _VisualCollisionManagers
.clear();
955 _CloudScapes
.clear();
957 _Scene
.setDriver(NULL
);
962 // ***************************************************************************
963 void CSceneUser::setMaxSkeletonsInNotCLodForm(uint m
)
965 _Scene
.setMaxSkeletonsInNotCLodForm(m
);
968 // ***************************************************************************
969 uint
CSceneUser::getMaxSkeletonsInNotCLodForm() const
971 return _Scene
.getMaxSkeletonsInNotCLodForm();
975 // ***************************************************************************
976 void CSceneUser::enableElementRender(TRenderFilter elt
, bool state
)
978 _Scene
.enableElementRender(elt
, state
);
982 // ***************************************************************************
983 void CSceneUser::profileNextRender()
985 _Scene
.profileNextRender();
987 // ***************************************************************************
988 void CSceneUser::getProfileResults(CBenchResults
&results
)
990 // Fill profile results
991 results
= _Scene
.BenchRes
;
994 // ***************************************************************************
995 void CSceneUser::profileQuadGridClipManager()
997 _Scene
.getClipTrav().getQuadGridClipManager()->profile();
1000 // ***************************************************************************
1001 uint
CSceneUser::getNumFlareContexts() const
1003 return CScene::MaxNumFlareContexts
;
1006 // ***************************************************************************
1007 void CSceneUser::setFlareContext(uint context
)
1009 if (context
>= CScene::MaxNumFlareContexts
)
1011 nlwarning("Invalid flare context");
1014 _Scene
.setFlareContext(context
);
1017 // ***************************************************************************
1018 uint
CSceneUser::getFlareContext() const
1020 return _Scene
.getFlareContext();
1024 // ***************************************************************************
1025 uint
CSceneUser::getShadowMapTextureSize() const
1027 return _Scene
.getShadowMapTextureSize();
1030 // ***************************************************************************
1031 void CSceneUser::setShadowMapTextureSize(uint size
)
1033 _Scene
.setShadowMapTextureSize(size
);
1036 // ***************************************************************************
1037 uint
CSceneUser::getShadowMapBlurSize() const
1039 return _Scene
.getShadowMapBlurSize();
1042 // ***************************************************************************
1043 void CSceneUser::setShadowMapBlurSize(uint bs
)
1045 _Scene
.setShadowMapBlurSize(bs
);
1048 // ***************************************************************************
1049 void CSceneUser::enableShadowPolySmooth(bool enable
)
1051 _Scene
.enableShadowPolySmooth(enable
);
1054 // ***************************************************************************
1055 bool CSceneUser::getEnableShadowPolySmooth() const
1057 return _Scene
.getEnableShadowPolySmooth();
1060 // ***************************************************************************
1061 void CSceneUser::setShadowMapDistFadeStart(float dist
)
1063 _Scene
.setShadowMapDistFadeStart(dist
);
1065 // ***************************************************************************
1066 float CSceneUser::getShadowMapDistFadeStart() const
1068 return _Scene
.getShadowMapDistFadeStart();
1070 // ***************************************************************************
1071 void CSceneUser::setShadowMapDistFadeEnd(float dist
)
1073 _Scene
.setShadowMapDistFadeEnd(dist
);
1075 // ***************************************************************************
1076 float CSceneUser::getShadowMapDistFadeEnd() const
1078 return _Scene
.getShadowMapDistFadeEnd();
1080 // ***************************************************************************
1081 void CSceneUser::setShadowMapMaxCasterInScreen(uint num
)
1083 _Scene
.setShadowMapMaxCasterInScreen(num
);
1085 // ***************************************************************************
1086 uint
CSceneUser::getShadowMapMaxCasterInScreen() const
1088 return _Scene
.getShadowMapMaxCasterInScreen();
1090 // ***************************************************************************
1091 void CSceneUser::setShadowMapMaxCasterAround(uint num
)
1093 _Scene
.setShadowMapMaxCasterAround(num
);
1095 // ***************************************************************************
1096 uint
CSceneUser::getShadowMapMaxCasterAround() const
1098 return _Scene
.getShadowMapMaxCasterAround();
1100 // ***************************************************************************
1101 void CSceneUser::setVisualCollisionManagerForShadow(UVisualCollisionManager
*vcm
)
1104 _Scene
.setVisualCollisionManagerForShadow(NULL
);
1107 CVisualCollisionManagerUser
*vcmUser
= static_cast<CVisualCollisionManagerUser
*>(vcm
);
1108 _Scene
.setVisualCollisionManagerForShadow(&vcmUser
->getVCM());
1111 // ***************************************************************************
1112 void CSceneUser::setWaterCallback(IWaterSurfaceAddedCallback
*wcb
)
1114 _Scene
.setWaterCallback(wcb
);
1116 // ***************************************************************************
1117 IWaterSurfaceAddedCallback
*CSceneUser::getWaterCallback() const
1119 return _Scene
.getWaterCallback();
1121 // ***************************************************************************
1122 void CSceneUser::setLandscapePolyDrawingCallback(ILandscapePolyDrawingCallback
*lpd
)
1124 _Scene
.setLandscapePolyDrawingCallback(lpd
);
1126 // ***************************************************************************
1127 ILandscapePolyDrawingCallback
*CSceneUser::getLandscapePolyDrawingCallback() const
1129 return _Scene
.getLandscapePolyDrawingCallback();
1131 // ***************************************************************************
1132 void CSceneUser::setupTransparencySorting(uint8 maxPriority
/*=0*/,uint NbDistanceEntries
/*=1024*/)
1134 _Scene
.getRenderTrav().setupTransparencySorting(maxPriority
, NbDistanceEntries
);
1137 // ***************************************************************************
1138 void CSceneUser::setWaterEnvMap(UWaterEnvMap
*waterEnvMap
)
1142 if (((CWaterEnvMapUser
*) waterEnvMap
)->EnvMap
.Driver
!= _DriverUser
)
1144 nlwarning("Water envmap can only be set in a scene that was created from the same driver");
1148 _Scene
.setWaterEnvMap(&((CWaterEnvMapUser
*) waterEnvMap
)->EnvMap
);
1149 _WaterEnvMap
= waterEnvMap
;
1153 // ***************************************************************************
1154 void CSceneUser::updateWaterEnvMaps(TGlobalAnimationTime time
)
1156 _Scene
.updateWaterEnvMaps(time
);