#include <scene_group.h>
This class can initialize a scene and be serialized.
Nevrax France
Definition at line 70 of file scene_group.h.
PointLight part | |
| void | buildPointLightList (const std::vector< CPointLightNamed > &pointLightList, std::vector< uint > &plRemap) |
| Build the list of light. NB: sort by LightGroupName the array, and return index remap. | |
| CIGSurfaceLight | _IGSurfaceLight |
| The object used to light dynamic models in town and buildings. | |
| CPointLightNamedArray | _PointLightArray |
| Array of pointLights. | |
| bool | _RealTimeSunContribution |
| RealTimeSunContribution. Used for ig_lighter and zone_ig_lighter. | |
Public Types | |
| enum | { NumStaticLightPerInstance = 2 } |
| Should Never be changed. More... | |
| typedef std::vector< CInstance > | TInstanceArray |
| A vector of instance. | |
| enum | TState { StateNotAdded = 0, StateAdding, StateAdded, StateError } |
Public Member Functions | |
| void | addCluster (CCluster *pCluster) |
| To construct the cluster system by hand. | |
| bool | addToScene (CScene &scene, IDriver *driver=NULL, uint selectedTexture=0) |
| bool | addToSceneAsync (CScene &scene, IDriver *driver=NULL, uint selectedTexture=0) |
| void | build (const CVector &vGlobalPos, const TInstanceArray &array, const std::vector< CCluster > &Clusters, const std::vector< CPortal > &Portals, const std::vector< CPointLightNamed > &pointLightList, const CIGSurfaceLight::TRetrieverGridMap *retrieverGridMap=NULL, float igSurfaceLightCellSize=0) |
| void | build (const CVector &vGlobalPos, const TInstanceArray &array, const std::vector< CCluster > &Clusters, const std::vector< CPortal > &Portals) |
| CInstanceGroup () | |
| void | createRoot (CScene &scene) |
| Add all the instances to the scene. | |
| void | displayDebugClusters (IDriver *drv, class CTextContext *txtCtx) |
| void | freezeHRC () |
| see CTransform::freezeHRC(). Do it for all instances (not clusters), and for the root of the IG. | |
| TState | getAddToSceneState () |
| void | getBlendShapes (std::set< std::string > &BlendShapeNames) |
| Get all the blendshapes from an instance group. | |
| bool | getDynamicPortal (std::string &name) |
| Get the state of a dynamic portal (true=opened, false=closed). | |
| void | getDynamicPortals (std::vector< std::string > &names) |
| Get all dynamic portals of an instance group. | |
| const NLMISC::CVector & | getGlobalPos () const |
| CInstance & | getInstance (uint instanceNb) |
| const CInstance & | getInstance (uint instanceNb) const |
| void | getInstanceMatrix (uint instanceNb, NLMISC::CMatrix &dest) const |
| const std::string & | getInstanceName (uint instanceNb) const |
| Get the instance name. | |
| const sint32 | getInstanceParent (uint instanceNb) const |
| const NLMISC::CVector & | getInstancePos (uint instanceNb) const |
| Get an instance position. | |
| const NLMISC::CQuat & | getInstanceRot (uint instanceNb) const |
| Get an instance rotation. | |
| const NLMISC::CVector & | getInstanceScale (uint instanceNb) const |
| void | getLights (std::set< std::string > &LightNames) |
| Get all lights (lightmaps) from an instance group. | |
| uint | getNumInstance () const |
| Get number of instance in this group. | |
| CInstanceGroup * | getParentClusterSystem () const |
| CVector | getPos () |
| Get the position of the IG. | |
| CQuat | getRotQuat () |
| Get the rotation of the IG. | |
| void | getShapeName (uint instanceIndex, std::string &shapeName) const |
| const std::string & | getShapeName (uint instanceNb) const |
| Get the name of the mesh referenced. | |
| CTransformShape * | getTransformShape (uint instanceNb) const |
| UInstanceGroup * | getUserInterface () const |
| void | linkRoot (CScene &scene, CTransform *father) |
| link the root of the ig to a node. No-op if not added to scene. Pass NULL to reset by default | |
| bool | linkToParent (CInstanceGroup *pFather) |
| bool | removeFromScene (CScene &scene) |
| Remove all the instances from the scene. | |
| void | retrieve (CVector &vGlobalPos, TInstanceArray &array, std::vector< CCluster > &Clusters, std::vector< CPortal > &Portals, std::vector< CPointLightNamed > &pointLightList) const |
| void | serial (NLMISC::IStream &f) |
| Serial the group. | |
| void | setAddRemoveInstanceCallback (IAddRemoveInstance *callback) |
| Set a callback to know when an instance has been added / removed. | |
| void | setBlendShapeFactor (const std::string &BlendShapeName, float rFactor) |
| Set the blendshape factor for the whole instance group (-100 -> 100). | |
| void | setClusterSystemForInstances (CInstanceGroup *pIG) |
| Set the cluster system to test for instances that are not in a cluster of this IG. | |
| void | setDynamicPortal (std::string &name, bool opened) |
| Set the state of a dynamic portal (true=opened, false=closed). | |
| void | setIGAddBeginCallback (IIGAddBegin *callback) |
| Set a callback to know when an instance group is being created, and how many instances it contains. | |
| void | setPos (const CVector &pos) |
| Set the position of the IG. | |
| void | setRotQuat (const CQuat &quat) |
| Set the rotation of the IG. | |
| void | setTransformNameCallback (ITransformName *pTN) |
| Setup the callback in charge of changing name at the addToScene moment. | |
| void | setUserInterface (class UInstanceGroup *uig) |
| User Interface related: yes it is ugly.... | |
| void | stopAddToSceneAsync () |
| void | unfreezeHRC () |
| see CTransform::unfreezeHRC(). Do it for all instances (not clusters), and for the root of the IG. | |
| ~CInstanceGroup () | |
RealTime lighting part | |
| void | enableRealTimeSunContribution (bool enable) |
| Setuped at export, tells if the ig is touched by the sun. true by default. | |
| const CIGSurfaceLight & | getIGSurfaceLight () const |
| Get the SurfaceLight info, for debug purposes. | |
| uint | getNumPointLights () const |
| Get the number of point lights. | |
| const std::vector< CPointLightNamed > & | getPointLightList () const |
| get the list of light. NB: the array is sorted by LightGroupName. | |
| CPointLightNamed & | getPointLightNamed (uint index) |
| Get a mutable ref on a point light named. | |
| bool | getRealTimeSunContribution () const |
| Setuped at export, tells if the ig is touched by the sun. true by default. | |
| bool | getStaticLightSetup (uint retrieverIdentifier, sint surfaceId, const CVector &localPos, std::vector< CPointLightInfluence > &pointLightList, uint8 &sunContribution, NLMISC::CRGBA &localAmbient) |
| See CIGSurfaceLight::getStaticLightSetup(). | |
| void | setPointLightFactor (const CScene &scene) |
| set the Light factor for all pointLights "lightGroupName". | |
Data Fields | |
| CClipTrav * | _ClipTrav |
| std::vector< CCluster > | _ClusterInfos |
| std::vector< CCluster * > | _ClusterInstances |
| CInstanceGroup * | _ClusterSystemForInstances |
| NLMISC::CVector | _GlobalPos |
| std::vector< CTransformShape * > | _Instances |
| TInstanceArray | _InstancesInfos |
| CInstanceGroup * | _ParentClusterSystem |
| std::vector< CPortal > | _Portals |
| CTransform * | _Root |
Private Member Functions | |
| bool | addToSceneWhenAllShapesLoaded (CScene &scene, IDriver *driver, uint selectedTexture) |
Private Attributes | |
| IAddRemoveInstance * | _AddRemoveInstance |
| IIGAddBegin * | _IGAddBeginCallback |
| ITransformName * | _TransformName |
| UInstanceGroup * | _UserIg |
Async loading part | |
| bool | _AddToSceneSignal |
| TState | _AddToSceneState |
| IDriver * | _AddToSceneTempDriver |
| CScene * | _AddToSceneTempScene |
| uint | _AddToSceneTempSelectTexture |
|
|
A vector of instance.
Definition at line 140 of file scene_group.h. Referenced by build(), and retrieve(). |
|
|
Should Never be changed.
Definition at line 75 of file scene_group.h.
00075 {NumStaticLightPerInstance= 2};
|
|
|
Definition at line 76 of file scene_group.h.
00076 { StateNotAdded = 0, StateAdding, StateAdded, StateError };
|
|
|
Construct, serialize and link to scene Definition at line 245 of file scene_group.cpp. References _AddRemoveInstance, _ClusterSystemForInstances, _GlobalPos, _IGAddBeginCallback, _IGSurfaceLight, _ParentClusterSystem, _RealTimeSunContribution, _TransformName, _UserIg, NL3D::CIGSurfaceLight::setOwner(), and StateNotAdded.
00246 {
00247 _IGSurfaceLight.setOwner(this);
00248 _GlobalPos = CVector(0,0,0);
00249 _Root = NULL;
00250 _ClusterSystemForInstances = NULL;
00251 _ParentClusterSystem = NULL;
00252 _RealTimeSunContribution= true;
00253 _AddToSceneState = StateNotAdded;
00254 _TransformName = NULL;
00255 _AddRemoveInstance = NULL;
00256 _IGAddBeginCallback = NULL;
00257 _UserIg= NULL;
00258 }
|
|
|
Definition at line 261 of file scene_group.cpp.
00262 {
00263 }
|
|
|
To construct the cluster system by hand. Cluster/Portal system part Definition at line 1050 of file scene_group.cpp. References _ClusterInstances. Referenced by NL3D::CScene::initDefaultRoots().
01051 {
01052 _ClusterInstances.push_back(pCluster);
01053 }
|
|
||||||||||||||||
|
Add all the instances to the scene. By default, freezeHRC() those instances and the root.
Definition at line 503 of file scene_group.cpp. References _IGAddBeginCallback, _InstancesInfos, _PointLightArray, addToSceneWhenAllShapesLoaded(), NL3D::CScene::createInstance(), getName(), getShapeName(), NL3D::CPointLightNamedArray::initAnimatedLightIndex(), nlwarning, NL3D::IIGAddBegin::startAddingIG(), uint, and uint32. Referenced by NL3D::CInstanceGroupUser::addToScene(), and getAddToSceneState().
00504 {
00505 // Init the scene lights
00506 _PointLightArray.initAnimatedLightIndex (scene);
00507
00508 uint32 i, j;
00509
00510 // Test if portals are linked to their 2 clusters
00511 for (i = 0; i < _Portals.size(); ++i)
00512 for (j = 0; j < 2; ++j)
00513 {
00514 if (_Portals[i]._Clusters[j] == NULL)
00515 {
00516 nlwarning("Portal %d (name:%s) is not linked to 2 clusters. Instance Group Not Added To Scene.", i, _Portals[i].getName().c_str());
00517 }
00518 }
00519
00520 _Instances.resize (_InstancesInfos.size(), NULL);
00521
00522 if (_IGAddBeginCallback)
00523 _IGAddBeginCallback->startAddingIG(_InstancesInfos.size());
00524
00525 // Creation and positionning of the new instance
00526
00527 vector<CInstance>::iterator it = _InstancesInfos.begin();
00528
00529 for (i = 0; i < _InstancesInfos.size(); ++i, ++it)
00530 {
00531 // Get the shape name
00532 string shapeName;
00533 getShapeName (i, shapeName);
00534 if (!shapeName.empty ())
00535 {
00536 if (!_InstancesInfos[i].DontAddToScene)
00537 {
00538 _Instances[i] = scene.createInstance (shapeName);
00539 if( _Instances[i] == NULL )
00540 {
00541 nlwarning("Not found '%s' file\n", shapeName.c_str());
00542 }
00543 }
00544 }
00545 }
00546
00547 return addToSceneWhenAllShapesLoaded (scene, driver, selectedTexture);
00548 }
|
|
||||||||||||||||
|
Definition at line 766 of file scene_group.cpp. References _AddToSceneSignal, _AddToSceneTempSelectTexture, _IGAddBeginCallback, _InstancesInfos, _PointLightArray, _TransformName, NL3D::CInstanceGroup::CInstance::DontAddToScene, NL3D::CPointLightNamedArray::initAnimatedLightIndex(), NL3D::CInstanceGroup::CInstance::InstanceName, NL3D::CInstanceGroup::CInstance::Name, NL3D::CInstanceGroup::CInstance::Pos, NL3D::IIGAddBegin::startAddingIG(), StateAdding, NLMISC::strlwr(), NL3D::ITransformName::transformName(), uint, and uint32. Referenced by NL3D::CInstanceGroupUser::addToSceneAsync().
00767 {
00768 // Init the scene lights
00769 _PointLightArray.initAnimatedLightIndex (scene);
00770
00771 uint32 i;
00772
00773 _AddToSceneState = StateAdding;
00774 _AddToSceneTempScene = &scene;
00775 _AddToSceneTempDriver = driver;
00776 _AddToSceneTempSelectTexture = selectedTexture;
00777
00778 _Instances.resize (_InstancesInfos.size(), NULL);
00779
00780 if (_IGAddBeginCallback)
00781 _IGAddBeginCallback->startAddingIG(_InstancesInfos.size());
00782
00783 // Creation and positionning of the new instance
00784
00785 vector<CInstance>::iterator it = _InstancesInfos.begin();
00786 set<string> allShapesToLoad;
00787 _AddToSceneSignal = false;
00788 bool loadAsyncStarted = false;
00789 for (i = 0; i < _InstancesInfos.size(); ++i, ++it)
00790 {
00791 CInstance &rInstanceInfo = *it;
00792 if (!rInstanceInfo.DontAddToScene)
00793 {
00794 string shapeName = rInstanceInfo.Name;
00795 if (_TransformName != NULL && !rInstanceInfo.InstanceName.empty())
00796 {
00797 shapeName = _TransformName->transformName (i, rInstanceInfo.InstanceName, rInstanceInfo.Name);
00798 }
00799
00800 shapeName = strlwr (shapeName);
00801
00802 if (!shapeName.empty() && shapeName.find('.') == std::string::npos)
00803 shapeName += ".shape";
00804
00805
00806 if (allShapesToLoad.find(shapeName) == allShapesToLoad.end())
00807 {
00808 allShapesToLoad.insert (shapeName);
00809 if (scene.getShapeBank()->isPresent(shapeName) != CShapeBank::Present)
00810 {
00811 // Load it from file asynchronously
00812 scene.getShapeBank()->loadAsync (shapeName, scene.getDriver(), rInstanceInfo.Pos, &_AddToSceneSignal, selectedTexture);
00813 loadAsyncStarted = true;
00814 }
00815 }
00816 }
00817 }
00818 if (!loadAsyncStarted)
00819 _AddToSceneSignal = true;
00820 else
00821 _AddToSceneSignal = false;
00822 //CAsyncFileManager::getInstance().signal (&_AddToSceneSignal);
00823
00824 return true;
00825 }
|
|
||||||||||||||||
|
Definition at line 571 of file scene_group.cpp. References _AddRemoveInstance, _ClipTrav, _ClusterInfos, _ClusterInstances, _ClusterSystemForInstances, _InstancesInfos, _PointLightArray, NL3D::CClipTrav::Accel, NL3D::CScene::addInstanceGroupForLightAnimation(), NL3D::ClusterId, NL3D::CScene::createModel(), createRoot(), NL3D::CInstanceGroup::CInstance::DontAddToScene, NL3D::CQuadGrid< CCluster * >::erase(), NL3D::CTransform::freeze(), freezeHRC(), NL3D::CScene::getClipTrav(), NL3D::CScene::getGlobalInstanceGroup(), NL3D::CScene::getHrcTrav(), NL3D::ITransformable::getMatrix(), NL3D::CPointLightNamedArray::getPointLights(), NL3D::CScene::getRoot(), NL3D::CTransform::hrcLinkSon(), NL3D::IAddRemoveInstance::instanceGroupAdded(), NL3D::CInstanceGroup::CInstance::Light, linkToParent(), NL3D::CInstanceGroup::CInstance::LocalAmbientId, min, NL3D_MAX_LIGHT_CONTRIBUTION, NL3D::CInstanceGroup::CInstance::nParent, NL3D::CInstanceGroup::CInstance::Pos, NL3D::CClipTrav::registerCluster(), NL3D::CInstanceGroup::CInstance::Rot, NL3D::CInstanceGroup::CInstance::Scale, NL3D::CPortal::setWorldMatrix(), sint32, StateAdded, NL3D::CInstanceGroup::CInstance::StaticLightEnabled, NL3D::CInstanceGroup::CInstance::SunContribution, uint, and uint32. Referenced by addToScene().
00572 {
00573 uint32 i, j;
00574
00575 vector<CInstance>::iterator it = _InstancesInfos.begin();
00576 for (i = 0; i < _InstancesInfos.size(); ++i, ++it)
00577 {
00578 CInstance &rInstanceInfo = *it;
00579
00580 if (!rInstanceInfo.DontAddToScene)
00581 {
00582 if (_Instances[i])
00583 {
00584 _Instances[i]->setPos (rInstanceInfo.Pos);
00585 _Instances[i]->setRotQuat (rInstanceInfo.Rot);
00586 _Instances[i]->setScale (rInstanceInfo.Scale);
00587 _Instances[i]->setPivot (CVector::Null);
00588
00589 // Static Light Setup
00590 if( rInstanceInfo.StaticLightEnabled )
00591 {
00592 // Count lights.
00593 uint numPointLights;
00594 for(numPointLights= 0; numPointLights<CInstanceGroup::NumStaticLightPerInstance; numPointLights++)
00595 {
00596 if(rInstanceInfo.Light[numPointLights]==0xFF)
00597 break;
00598 }
00599 // Max allowed.
00600 numPointLights= min(numPointLights, (uint)NL3D_MAX_LIGHT_CONTRIBUTION);
00601
00602 // Get pl ptrs.
00603 CPointLight *pls[CInstanceGroup::NumStaticLightPerInstance];
00604 for(uint j=0; j<numPointLights;j++)
00605 {
00606 uint plId= rInstanceInfo.Light[j];
00607 pls[j]= (CPointLight*)(&_PointLightArray.getPointLights()[plId]);
00608 }
00609
00610 // get frozenAmbientlight.
00611 CPointLight *frozenAmbientlight;
00612 if(rInstanceInfo.LocalAmbientId == 0xFF)
00613 // must take the sun one.
00614 frozenAmbientlight= NULL;
00615 else
00616 // ok, take the local ambient one.
00617 frozenAmbientlight= (CPointLight*)(&_PointLightArray.getPointLights()[rInstanceInfo.LocalAmbientId]);
00618
00619 // Setup the instance.
00620 _Instances[i]->freezeStaticLightSetup(pls, numPointLights, rInstanceInfo.SunContribution, frozenAmbientlight);
00621 }
00622
00623 // Driver not NULL ?
00624 if (driver)
00625 {
00626 // Flush shape's texture with this driver
00627 _Instances[i]->Shape->flushTextures (*driver, selectedTexture);
00628 }
00629 }
00630 }
00631 else
00632 {
00633 _Instances[i] = NULL;
00634 }
00635 }
00636
00637 // Setup the hierarchy
00638 // We just have to set the traversal HRC (Hierarchy)
00639 CHrcTrav &hrcTrav = scene.getHrcTrav();
00640
00641 if (_Root == NULL)
00642 {
00643 createRoot (scene);
00644 }
00645 it = _InstancesInfos.begin();
00646 for (i = 0; i < _InstancesInfos.size(); ++i, ++it)
00647 if (!_InstancesInfos[i].DontAddToScene && _Instances[i] != NULL)
00648 {
00649 CInstance &rInstanceInfo = *it;
00650 if( rInstanceInfo.nParent != -1 ) // Is the instance get a parent
00651 _Instances[rInstanceInfo.nParent]->hrcLinkSon( _Instances[i] );
00652 else
00653 _Root->hrcLinkSon( _Instances[i] );
00654 }
00655 // Attach the root of the instance group to the root of the hierarchy traversal
00656 scene.getRoot()->hrcLinkSon( _Root );
00657
00658 // Cluster / Portals
00659 // -----------------
00660
00661 CClipTrav *pClipTrav = &scene.getClipTrav();
00662 _ClipTrav = pClipTrav;
00663
00664 // Create the MOT links (create the physical clusters)
00665 _ClusterInstances.resize (_ClusterInfos.size());
00666 for (i = 0; i < _ClusterInstances.size(); ++i)
00667 {
00668 _ClusterInstances[i] = (CCluster*)scene.createModel (ClusterId);
00669 _ClusterInstances[i]->Group = this;
00670 _ClusterInstances[i]->_Portals = _ClusterInfos[i]._Portals;
00671 _ClusterInstances[i]->_LocalVolume = _ClusterInfos[i]._LocalVolume;
00672 _ClusterInstances[i]->_LocalBBox = _ClusterInfos[i]._LocalBBox;
00673 _ClusterInstances[i]->_Volume = _ClusterInfos[i]._Volume;
00674 _ClusterInstances[i]->_BBox = _ClusterInfos[i]._BBox;
00675 _ClusterInstances[i]->FatherVisible = _ClusterInfos[i].FatherVisible;
00676 _ClusterInstances[i]->VisibleFromFather = _ClusterInfos[i].VisibleFromFather;
00677 _ClusterInstances[i]->FatherAudible = _ClusterInfos[i].FatherAudible;
00678 _ClusterInstances[i]->AudibleFromFather = _ClusterInfos[i].AudibleFromFather;
00679 _ClusterInstances[i]->Name = _ClusterInfos[i].Name;
00680 _ClusterInstances[i]->setSoundGroup(_ClusterInfos[i].getSoundGroup());
00681 _ClusterInstances[i]->setEnvironmentFx(_ClusterInfos[i].getEnvironmentFx());
00682 pClipTrav->registerCluster (_ClusterInstances[i]);
00683 _ClusterInstances[i]->clipUnlinkFromAll();
00684 }
00685
00686 // Relink portals with newly created clusters
00687 for (i = 0; i < _Portals.size(); ++i)
00688 for (j = 0; j < 2; ++j)
00689 {
00690 if (_Portals[i]._Clusters[j])
00691 {
00692 sint32 nClusterNb;
00693 nClusterNb = (_Portals[i]._Clusters[j] - &_ClusterInfos[0]);
00694 _Portals[i]._Clusters[j] = _ClusterInstances[nClusterNb];
00695 }
00696 }
00697
00698 // Link shapes to clusters
00699 for (i = 0; i < _Instances.size(); ++i)
00700 if (_Instances[i] != NULL && !_InstancesInfos[i].DontAddToScene)
00701 {
00702 if (_InstancesInfos[i].Clusters.size() > 0)
00703 {
00704 _Instances[i]->clipUnlinkFromAll();
00705 for (j = 0; j < _InstancesInfos[i].Clusters.size(); ++j)
00706 _ClusterInstances[_InstancesInfos[i].Clusters[j]]->clipAddChild( _Instances[i] );
00707 // For the first time we have to set all the instances to NOT move (and not be rebinded)
00708 _Instances[i]->freeze();
00709 _Instances[i]->setClusterSystem (this);
00710 }
00711 else
00712 {
00713 // These instances are not attached to a cluster at this level so we cannot freeze them
00714 // Moreover we must set their clustersystem they will be tested against
00715 _Instances[i]->setClusterSystem (_ClusterSystemForInstances);
00716 }
00717 }
00718 _Root->freeze();
00719
00720 // HRC OBS like
00721 for (i = 0; i < _ClusterInstances.size(); ++i)
00722 {
00723 _ClusterInstances[i]->setWorldMatrix (_Root->getMatrix());
00724
00725 for (j = 0; j < _ClusterInstances[i]->getNbPortals(); ++j)
00726 {
00727 CPortal *pPortal = _ClusterInstances[i]->getPortal(j);
00728 pPortal->setWorldMatrix (_Root->getMatrix());
00729 }
00730
00731 // Re affect the cluster to the accelerator if not the root
00732 if (!_ClusterInstances[i]->isRoot())
00733 {
00734 _ClipTrav->Accel.erase (_ClusterInstances[i]->AccelIt);
00735 _ClipTrav->registerCluster (_ClusterInstances[i]);
00736 }
00737 }
00738
00739
00740 // Link the instance group to the parent
00741 linkToParent (scene.getGlobalInstanceGroup());
00742
00743 // Attach the clusters to the root of the instance group
00744 for (i = 0; i < _ClusterInstances.size(); ++i)
00745 _Root->hrcLinkSon( _ClusterInstances[i] );
00746
00747
00748 // Default: freezeHRC all instances.
00749 freezeHRC();
00750
00751
00752 // Register the instanceGroup for light animation
00753 // -----------------
00754 // If some PointLight to animate
00755 if(_PointLightArray.getPointLights().size() > 0)
00756 scene.addInstanceGroupForLightAnimation(this);
00757
00758 _AddToSceneState = StateAdded;
00759
00760 if (_AddRemoveInstance)
00761 _AddRemoveInstance->instanceGroupAdded();
00762 return true;
00763 }
|
|
||||||||||||||||||||||||||||||||
|
Build the group Build also the list of light. NB: sort by LightGroupName the array. Give also a ptr on a retrieverGridMap to build surfaces (if not NULL). Definition at line 266 of file scene_group.cpp. References _ClusterInfos, _GlobalPos, _IGSurfaceLight, _InstancesInfos, NL3D::CIGSurfaceLight::build(), buildPointLightList(), NL3D::CIGSurfaceLight::clear(), TInstanceArray, NL3D::CIGSurfaceLight::TRetrieverGridMap, and uint32.
00272 {
00273 _GlobalPos = vGlobalPos;
00274 // Copy the array
00275 _InstancesInfos = array;
00276
00277 _Portals = Portals;
00278 _ClusterInfos = Clusters;
00279
00280 // Link portals and clusters
00281 uint32 i, j, k;
00282 for (i = 0; i < _Portals.size(); ++i)
00283 {
00284 for (j = 0; j < _ClusterInfos.size(); ++j)
00285 {
00286 bool bPortalInCluster = true;
00287 for (k = 0; k < _Portals[i]._Poly.size(); ++k)
00288 if (!_ClusterInfos[j].isIn (_Portals[i]._Poly[k]) )
00289 {
00290 bPortalInCluster = false;
00291 break;
00292 }
00293 if (bPortalInCluster)
00294 {
00295 _Portals[i].setCluster(&_ClusterInfos[j]);
00296 _ClusterInfos[j].link (&_Portals[i]);
00297 }
00298 }
00299 }
00300
00301 // Create Meta Cluster if needed
00302 /*
00303 CCluster clusterTemp;
00304 bool mustAdd = false;
00305 for (i = 0; i < _Portals.size(); ++i)
00306 if (_Portals[i].getNbCluster() == 1)
00307 {
00308 mustAdd = true;
00309 break;
00310 }
00311 if (mustAdd)
00312 {
00313 CCluster clusterTemp;
00314 _ClusterInfos.push_back(clusterTemp);
00315 CCluster *pMetaCluster = &_ClusterInfos[_ClusterInfos.size()-1];
00316 pMetaCluster->setMetaCluster();
00317 for (i = 0; i < _Portals.size(); ++i)
00318 if (_Portals[i].getNbCluster() == 1)
00319 {
00320 _Portals[i].setCluster(pMetaCluster);
00321 pMetaCluster->link(&_Portals[i]);
00322 }
00323 }*/
00324
00325
00326 // Build the list of light. NB: sort by LightGroupName the array.
00327 std::vector<uint> plRemap;
00328 buildPointLightList(pointLightList, plRemap);
00329
00330 // Build IgSurfaceLight
00331 // clear
00332 _IGSurfaceLight.clear();
00333 if(retrieverGridMap)
00334 {
00335 //build
00336 _IGSurfaceLight.build(*retrieverGridMap, igSurfaceLightCellSize, plRemap);
00337 }
00338 }
|
|
||||||||||||||||||||
|
Build the group Build with an empty list of light Definition at line 342 of file scene_group.cpp. References TInstanceArray. Referenced by NL3D::CInstanceLighter::light().
00345 {
00346 // empty pointLightList
00347 std::vector<CPointLightNamed> pointLightList;
00348
00349 build(vGlobalPos, array, Clusters, Portals, pointLightList);
00350 }
|
|
||||||||||||
|
Build the list of light. NB: sort by LightGroupName the array, and return index remap.
Definition at line 1165 of file scene_group.cpp. References _InstancesInfos, _PointLightArray, NL3D::CPointLightNamedArray::build(), NL3D::CPointLightNamedArray::getPointLights(), NL3D::CInstanceGroup::CInstance::Light, NL3D::CInstanceGroup::CInstance::LocalAmbientId, nlassert, NL3D::CInstanceGroup::CInstance::StaticLightEnabled, and uint. Referenced by build().
01167 {
01168 // build.
01169 _PointLightArray.build(pointLightList, plRemap);
01170
01171 // remap Instance precalc lighted.
01172 for(uint i=0; i<_InstancesInfos.size(); i++)
01173 {
01174 CInstance &inst= _InstancesInfos[i];
01175 // If the instance has no precomputed lighting, skip
01176 if(!inst.StaticLightEnabled)
01177 continue;
01178
01179 // remap pointlights
01180 for(uint l=0; l<CInstanceGroup::NumStaticLightPerInstance; l++)
01181 {
01182 // If NULL light, break and continue to next instance
01183 if(inst.Light[l]== 0xFF)
01184 break;
01185 else
01186 {
01187 // Check good index.
01188 nlassert(inst.Light[l] < _PointLightArray.getPointLights().size());
01189 // Remap index, because of light sorting.
01190 inst.Light[l]= plRemap[inst.Light[l]];
01191 }
01192 }
01193
01194 // remap ambient light
01195 if(inst.LocalAmbientId!=0xFF)
01196 {
01197 nlassert(inst.LocalAmbientId < _PointLightArray.getPointLights().size());
01198 inst.LocalAmbientId= plRemap[inst.LocalAmbientId];
01199 }
01200 }
01201
01202 }
|
|
|
Add all the instances to the scene.
Definition at line 476 of file scene_group.cpp. References NL3D::CScene::createModel(), NL3D::CTransform::setDontUnfreezeChildren(), setPos(), and NL3D::TransformId. Referenced by addToSceneWhenAllShapesLoaded(), and NL3D::CInstanceGroupUser::createRoot().
|
|
||||||||||||
|
For Debug Display of clusters. The view matrix and frustum should have been setuped NB: the ModelMatrix is modified by this method Definition at line 1224 of file scene_group.cpp. References NL3D::CCluster::_BBox, _ClusterInstances, NL3D::CCluster::_Portals, NL3D::CCluster::_Volume, NL3D::IDriver::activeVertexBuffer(), NL3D::CPrimitiveBlock::addLine(), NL3D::CPrimitiveBlock::addTri(), NLMISC::CPolygon::clip(), NLMISC::CAABBox::getCenter(), NLMISC::CPlane::getNormal(), NLMISC::CAABBox::getRadius(), NL3D::IDriver::getViewMatrix(), NL3D::CMaterial::initUnlit(), NLMISC::CMatrix::inverted(), NL3D::CCluster::Name, NLMISC::CMatrix::normalize(), NLMISC::CPlane::normalize(), NLMISC::CPlane::project(), NL3D::IDriver::render(), NL3D::CComputedString::render3D(), NL3D::CPrimitiveBlock::reserveLine(), NL3D::CPrimitiveBlock::reserveTri(), s, NLMISC::CMatrix::scale(), NL3D::CMaterial::setBlend(), NL3D::CMaterial::setBlendFunc(), NL3D::CMaterial::setColor(), NL3D::CMaterial::setDoubleSided(), NL3D::CPrimitiveBlock::setNumLine(), NL3D::CPrimitiveBlock::setNumTri(), NL3D::CVertexBuffer::setNumVertices(), NLMISC::CMatrix::setPos(), NLMISC::CMatrix::setRot(), NL3D::IDriver::setupModelMatrix(), NL3D::CVertexBuffer::setVertexCoord(), NL3D::CVertexBuffer::setVertexFormat(), NL3D::CMaterial::setZFunc(), NL3D::CMaterial::setZWrite(), uint, NLMISC::CPolygon::Vertices, and NLMISC::CVector::y. Referenced by NL3D::CInstanceGroupUser::displayDebugClusters().
01225 {
01226 uint opacity= 50;
01227 CRGBA colorCluster(255, 128, 255, opacity);
01228 // portals are drawn twice
01229 CRGBA colorPortal(128, 255, 128, opacity/2);
01230
01231 CMaterial clusterMat;
01232 CMaterial portalMat;
01233 CMaterial lineMat;
01234 clusterMat.initUnlit();
01235 clusterMat.setBlend(true);
01236 clusterMat.setBlendFunc(CMaterial::srcalpha, CMaterial::invsrcalpha);
01237 clusterMat.setZWrite(false);
01238 clusterMat.setDoubleSided(true);
01239 clusterMat.setColor(colorCluster);
01240 portalMat.initUnlit();
01241 portalMat.setBlend(true);
01242 portalMat.setBlendFunc(CMaterial::srcalpha, CMaterial::invsrcalpha);
01243 portalMat.setZWrite(false);
01244 portalMat.setDoubleSided(true);
01245 portalMat.setColor(colorPortal);
01246 lineMat.initUnlit();
01247 lineMat.setBlend(true);
01248 lineMat.setBlendFunc(CMaterial::srcalpha, CMaterial::invsrcalpha);
01249 lineMat.setZWrite(false);
01250 lineMat.setDoubleSided(true);
01251 lineMat.setColor(CRGBA(0,0,0,opacity));
01252
01253
01254 // The geometry for each cluster
01255 CVertexBuffer vb;
01256 // too big cluster won't be rendered
01257 const uint maxVertices= 10000;
01258 vb.setVertexFormat(CVertexBuffer::PositionFlag);
01259 vb.setNumVertices(maxVertices);
01260 CPrimitiveBlock clusterTriangles;
01261 CPrimitiveBlock clusterLines;
01262 CPrimitiveBlock portalTriangles;
01263 CPrimitiveBlock portalLines;
01264 clusterTriangles.reserveTri(maxVertices);
01265 clusterLines.reserveLine(maxVertices);
01266 portalTriangles.reserveTri(maxVertices);
01267 portalLines.reserveLine(maxVertices);
01268
01269 // setup identity matrix
01270 drv->setupModelMatrix(CMatrix::Identity);
01271
01272 // For all clusters
01273 uint i;
01274 for(i=0;i<_ClusterInstances.size();i++)
01275 {
01276 CCluster *cluster= _ClusterInstances[i];
01277 if(cluster)
01278 {
01279 uint numTotalVertices= 0;
01280
01281 // **** Build a set of polys representing the volume (slow but debug!)
01282 static std::vector<CPolygon> polygons;
01283 polygons.clear();
01284 polygons.resize(cluster->_Volume.size());
01285 // for each plane, build the associated polygon
01286 uint j;
01287 for(j=0;j<polygons.size();j++)
01288 {
01289 // Start with a big quad centered on bbox center
01290 CPlane p= cluster->_Volume[j];
01291 p.normalize();
01292 CVector quadCenter= p.project(cluster->_BBox.getCenter());
01293
01294 // choose a basis on this plane
01295 CMatrix mat;
01296 if( fabs(p.getNormal().y)>0.9 )
01297 mat.setRot(CVector::K, CVector::I, p.getNormal());
01298 else
01299 mat.setRot(CVector::I, CVector::J, p.getNormal());
01300 mat.normalize(CMatrix::ZYX);
01301 mat.setPos(quadCenter);
01302
01303 // Build the initial Big quad
01304 CPolygon &poly= polygons[j];
01305 poly.Vertices.resize(4);
01306 float s= 10 * cluster->_BBox.getRadius();
01307 poly.Vertices[0]= mat * CVector(-s,-s,0);
01308 poly.Vertices[1]= mat * CVector(s,-s,0);
01309 poly.Vertices[2]= mat * CVector(s,s,0);
01310 poly.Vertices[3]= mat * CVector(-s,s,0);
01311
01312 // clip this poly against all the other (ie not me) planes
01313 // This make this algo O(N2) but this is for debug....
01314 for(uint k=0;k<cluster->_Volume.size();k++)
01315 {
01316 if(j!=k)
01317 {
01318 poly.clip(&cluster->_Volume[k], 1);
01319 }
01320 }
01321
01322 // count the number of vertices / triangles / lines to add
01323 if(poly.Vertices.size()>=3)
01324 {
01325 numTotalVertices+= poly.Vertices.size();
01326 }
01327 }
01328
01329 // **** count the number of portals vertices
01330 for(j=0;j<cluster->_Portals.size();j++)
01331 {
01332 numTotalVertices+= cluster->_Portals[j]->_Poly.size();
01333 }
01334
01335 // **** Draw those cluster polygons, and portals
01336 // too big clusters won't be rendered
01337 if(numTotalVertices<=maxVertices)
01338 {
01339 uint iVert= 0;
01340 uint j;
01341
01342 // build the cluster geometry
01343 clusterTriangles.setNumTri(0);
01344 clusterLines.setNumLine(0);
01345 for(j=0;j<polygons.size();j++)
01346 {
01347 CPolygon &poly= polygons[j];
01348 if(poly.Vertices.size()>=3)
01349 {
01350 uint k;
01351 // add the vertices
01352 for(k=0;k<poly.Vertices.size();k++)
01353 vb.setVertexCoord(iVert+k, poly.Vertices[k]);
01354
01355 // add the triangles
01356 for(k=0;k<poly.Vertices.size()-2;k++)
01357 clusterTriangles.addTri(iVert+0, iVert+k+1, iVert+k+2);
01358
01359 // add the lines
01360 for(k=0;k<poly.Vertices.size();k++)
01361 clusterLines.addLine(iVert+k, iVert+ ((k+1)%poly.Vertices.size()) );
01362
01363 iVert+= poly.Vertices.size();
01364 }
01365 }
01366
01367 // build the portal geometry
01368 portalTriangles.setNumTri(0);
01369 portalLines.setNumLine(0);
01370 for(j=0;j<cluster->_Portals.size();j++)
01371 {
01372 std::vector<CVector> &portalVerts= cluster->_Portals[j]->_Poly;
01373 if(portalVerts.size()>=3)
01374 {
01375 uint k;
01376 // add the vertices
01377 for(k=0;k<portalVerts.size();k++)
01378 vb.setVertexCoord(iVert+k, portalVerts[k]);
01379
01380 // add the triangles
01381 for(k=0;k<portalVerts.size()-2;k++)
01382 portalTriangles.addTri(iVert+0, iVert+k+1, iVert+k+2);
01383
01384 // add the lines
01385 for(k=0;k<portalVerts.size();k++)
01386 portalLines.addLine(iVert+k, iVert+ ((k+1)%portalVerts.size()) );
01387
01388 iVert+= portalVerts.size();
01389 }
01390 }
01391
01392 // render 2 pass with or without ZBuffer (for clearness)
01393 for(uint pass=0;pass<2;pass++)
01394 {
01395 if(pass==0)
01396 {
01397 clusterMat.setZFunc(CMaterial::always);
01398 portalMat.setZFunc(CMaterial::always);
01399 lineMat.setZFunc(CMaterial::always);
01400 }
01401 else
01402 {
01403 clusterMat.setZFunc(CMaterial::lessequal);
01404 portalMat.setZFunc(CMaterial::lessequal);
01405 lineMat.setZFunc(CMaterial::lessequal);
01406 }
01407
01408 drv->activeVertexBuffer(vb);
01409 drv->render(clusterTriangles, clusterMat);
01410 drv->render(clusterLines, lineMat);
01411 drv->render(portalTriangles, portalMat);
01412 drv->render(portalLines, lineMat);
01413 }
01414 }
01415
01416 }
01417 }
01418
01419 // **** For all clusters, Draw the cluster name at center of the cluster
01420 if(txtCtx)
01421 {
01422 CComputedString computedStr;
01423
01424 // bkup fontSize
01425 uint bkFontSize;
01426 CMatrix fontMatrix;
01427 bkFontSize= txtCtx->getFontSize();
01428 // to be readable
01429 txtCtx->setFontSize(24);
01430
01431 // the font matrix
01432 fontMatrix.setRot(drv->getViewMatrix().inverted());
01433 fontMatrix.normalize(CMatrix::YZX);
01434 fontMatrix.scale(10);
01435
01436 // parse all clusters
01437 for(i=0;i<_ClusterInstances.size();i++)
01438 {
01439 CCluster *cluster= _ClusterInstances[i];
01440 if(cluster)
01441 {
01442 fontMatrix.setPos(cluster->_BBox.getCenter());
01443 txtCtx->computeString(cluster->Name, computedStr);
01444 computedStr.render3D(*drv, fontMatrix);
01445 }
01446 }
01447
01448 // restore fontsize
01449 txtCtx->setFontSize(bkFontSize);
01450 }
01451
01452 }
|
|
|
Setuped at export, tells if the ig is touched by the sun. true by default.
Definition at line 1212 of file scene_group.cpp. References _RealTimeSunContribution.
01213 {
01214 _RealTimeSunContribution= enable;
01215 }
|
|
|
see CTransform::freezeHRC(). Do it for all instances (not clusters), and for the root of the IG.
Definition at line 1132 of file scene_group.cpp. References NL3D::CTransform::freezeHRC(), and uint. Referenced by addToSceneWhenAllShapesLoaded(), and NL3D::CInstanceGroupUser::freezeHRC().
01133 {
01134 // For all instances.
01135 for (uint i=0; i < _Instances.size(); i++)
01136 {
01137 if(_Instances[i])
01138 _Instances[i]->freezeHRC();
01139 }
01140 // and for root.
01141 _Root->freezeHRC();
01142 }
|
|
|
Definition at line 868 of file scene_group.cpp. References _AddToSceneSignal, _AddToSceneTempSelectTexture, addToScene(), and StateAdding. Referenced by NL3D::CInstanceGroupUser::getAddToSceneState().
00869 {
00870 // If we are adding but we have finished loading shapes (all shapes are here)
00871 if (_AddToSceneState == StateAdding)
00872 {
00873 if (_AddToSceneSignal)
00874 {
00875 addToScene (*_AddToSceneTempScene, _AddToSceneTempDriver, _AddToSceneTempSelectTexture);
00876 }
00877 }
00878 return _AddToSceneState;
00879 }
|
|
|
Get all the blendshapes from an instance group. BlendShape part Definition at line 1015 of file scene_group.cpp. References NL3D::CMeshBaseInstance::getBlendShapeName(), NL3D::CMeshBaseInstance::getNbBlendShape(), and uint32.
01016 {
01017 BlendShapeNames.clear();
01018 for( uint32 i = 0; i < _Instances.size(); ++i )
01019 {
01020 CMeshBaseInstance *pMBI = dynamic_cast<CMeshBaseInstance*>(_Instances[i]);
01021 if (pMBI != NULL)
01022 {
01023 uint32 nNbBS = pMBI->getNbBlendShape();
01024 for( uint32 j = 0; j < nNbBS; ++j )
01025 {
01026 string sTmp;
01027 pMBI->getBlendShapeName( j, sTmp );
01028 set<string>::iterator itSet = BlendShapeNames.find(sTmp);
01029 if( itSet == BlendShapeNames.end() )
01030 BlendShapeNames.insert( sTmp );
01031 }
01032 }
01033 }
01034 }
|
|
|
Get the state of a dynamic portal (true=opened, false=closed).
Definition at line 1081 of file scene_group.cpp. References uint32. Referenced by NL3D::CInstanceGroupUser::getDynamicPortal().
|
|
|
Get all dynamic portals of an instance group.
Definition at line 1065 of file scene_group.cpp. References getName(), and uint32. Referenced by NL3D::CInstanceGroupUser::getDynamicPortals().
|
|
|
Definition at line 175 of file scene_group.h. References _GlobalPos.
00175 { return _GlobalPos; }
|
|
|
Get the SurfaceLight info, for debug purposes.
Definition at line 361 of file scene_group.h. References _IGSurfaceLight. Referenced by NL3D::CIGSurfaceLightBuild::buildPLDebugMesh().
00361 {return _IGSurfaceLight;}
|
|
|
Definition at line 231 of file scene_group.cpp. References _InstancesInfos, and uint.
00232 {
00233 return _InstancesInfos[instanceNb];
00234 }
|
|
|
Definition at line 225 of file scene_group.cpp. References _InstancesInfos, and uint. Referenced by NL3D::CInstanceLighter::lightIgSimple().
00226 {
00227 return _InstancesInfos[instanceNb];
00228 }
|
|
||||||||||||
|
Definition at line 205 of file scene_group.cpp. References getInstancePos(), getInstanceRot(), getInstanceScale(), NLMISC::CMatrix::identity(), NLMISC::CMatrix::rotate(), NLMISC::CMatrix::scale(), NLMISC::CMatrix::translate(), and uint. Referenced by NL3D::CInstanceGroupUser::getInstanceMatrix().
00206 {
00207 dest.identity();
00208 dest.translate(getInstancePos(instanceNb));
00209 dest.rotate(getInstanceRot(instanceNb));
00210 dest.scale(getInstanceScale(instanceNb));
00211 }
|
|
|
Get the instance name.
Definition at line 173 of file scene_group.cpp. References _InstancesInfos, and uint. Referenced by NL3D::CInstanceGroupUser::addToScene(), NL3D::CInstanceGroupUser::getAddToSceneState(), and NL3D::CInstanceGroupUser::getInstanceName().
00174 {
00175 // Return the name of the n-th instance
00176 return _InstancesInfos[instanceNb].InstanceName;
00177 }
|
|
|
Definition at line 217 of file scene_group.cpp. References _InstancesInfos, sint32, and uint.
00218 {
00219 // Return the scale vector of the n-th instance
00220 return _InstancesInfos[instanceNb].nParent;
00221 }
|
|
|
Get an instance position.
Definition at line 181 of file scene_group.cpp. References _InstancesInfos, and uint. Referenced by getInstanceMatrix(), NL3D::CInstanceGroupUser::getInstancePos(), and NL3D::CInstanceLighter::lightIgSimple().
00182 {
00183 // Return the position vector of the n-th instance
00184 return _InstancesInfos[instanceNb].Pos;
00185 }
|
|
|
Get an instance rotation.
Definition at line 189 of file scene_group.cpp. References _InstancesInfos, and uint. Referenced by getInstanceMatrix(), NL3D::CInstanceGroupUser::getInstanceRot(), and NL3D::CInstanceLighter::lightIgSimple().
00190 {
00191 // Return the rotation vector of the n-th instance
00192 return _InstancesInfos[instanceNb].Rot;
00193 }
|
|
|
Definition at line 197 of file scene_group.cpp. References _InstancesInfos, and uint. Referenced by getInstanceMatrix(), NL3D::CInstanceGroupUser::getInstanceScale(), and NL3D::CInstanceLighter::lightIgSimple().
00198 {
00199 // Return the scale vector of the n-th instance
00200 return _InstancesInfos[instanceNb].Scale;
00201 }
|
|
|
Get all lights (lightmaps) from an instance group. LightMap part Definition at line 993 of file scene_group.cpp. References NL3D::CMeshBaseInstance::getLightMapName(), NL3D::CMeshBaseInstance::getNbLightMap(), and uint32.
00994 {
00995 LightNames.clear();
00996 for( uint32 i = 0; i < _Instances.size(); ++i )
00997 {
00998 CMeshInstance *pMI = dynamic_cast<CMeshInstance*>(_Instances[i]);
00999 if( pMI != NULL )
01000 {
01001 uint32 nNbLM = pMI->getNbLightMap();
01002 for( uint32 j = 0; j < nNbLM; ++j )
01003 {
01004 string sTmp;
01005 pMI->getLightMapName( j, sTmp );
01006 set<string>::iterator itSet = LightNames.find(sTmp);
01007 if( itSet == LightNames.end() )
01008 LightNames.insert( sTmp );
01009 }
01010 }
01011 }
01012 }
|
|
|
Get number of instance in this group.
Definition at line 158 of file scene_group.cpp. References _InstancesInfos, and uint. Referenced by NL3D::CInstanceGroupUser::getCoarseMeshDist(), NL3D::CInstanceGroupUser::getDistMax(), NL3D::CInstanceGroupUser::getInstanceName(), NL3D::CInstanceGroupUser::getInstancePos(), NL3D::CInstanceGroupUser::getInstanceRot(), NL3D::CInstanceGroupUser::getInstanceScale(), NL3D::CInstanceGroupUser::getNumInstance(), NL3D::CInstanceGroupUser::getShapeName(), NL3D::CInstanceLighter::lightIgSimple(), NL3D::CInstanceGroupUser::setCoarseMeshDist(), and NL3D::CInstanceGroupUser::setDistMax().
00159 {
00160 return _InstancesInfos.size();
00161 }
|
|
|
Get the number of point lights.
Definition at line 341 of file scene_group.h. References _PointLightArray, NL3D::CPointLightNamedArray::getPointLights(), and uint.
00341 { return _PointLightArray.getPointLights().size(); }
|
|
|
Get the parent ClusterSystem Definition at line 376 of file scene_group.h. References _ParentClusterSystem. Referenced by NL3D::CScene::findCameraClusterSystemFromRay(), and NL3D::CInstanceGroupUser::getParentCluster().
00376 {return _ParentClusterSystem;}
|
|
|
get the list of light. NB: the array is sorted by LightGroupName.
Definition at line 338 of file scene_group.h. References _PointLightArray, and NL3D::CPointLightNamedArray::getPointLights(). Referenced by NL3D::CIGSurfaceLightBuild::buildPLDebugMesh(), NL3D::CSurfaceLightGrid::getStaticLightSetup(), NL3D::CInstanceLighter::lightIgSimple(), and retrieve().
00338 {return _PointLightArray.getPointLights();}
|
|
|
Get a mutable ref on a point light named.
Definition at line 344 of file scene_group.h. References _PointLightArray, NL3D::CPointLightNamedArray::getPointLights(), index, and uint.
00345 {
00346 return _PointLightArray.getPointLights()[index];
00347 }
|
|
|
Get the position of the IG.
Definition at line 1105 of file scene_group.cpp. References NL3D::ITransformable::getPos(). Referenced by NL3D::CInstanceGroupUser::getPos().
|
|
|
Setuped at export, tells if the ig is touched by the sun. true by default.
Definition at line 365 of file scene_group.h. References _RealTimeSunContribution.
00365 {return _RealTimeSunContribution;}
|
|
|
Get the rotation of the IG.
Definition at line 1114 of file scene_group.cpp. References NL3D::ITransformable::getRotQuat(). Referenced by NL3D::CInstanceGroupUser::getRotQuat().
|
|
||||||||||||
|
Get the instance name to create as written in the instance group. Definition at line 552 of file scene_group.cpp. References _InstancesInfos, _TransformName, NL3D::CInstanceGroup::CInstance::InstanceName, NL3D::CInstanceGroup::CInstance::Name, NLMISC::strlwr(), NL3D::ITransformName::transformName(), and uint.
00553 {
00554 const CInstance &rInstanceInfo = _InstancesInfos[instanceIndex];
00555 shapeName = rInstanceInfo.Name;
00556
00557 // If there is a callback added to this instance group then transform
00558 // the name of the shape to load.
00559 if (_TransformName != NULL && !rInstanceInfo.InstanceName.empty())
00560 {
00561 shapeName = _TransformName->transformName (instanceIndex, rInstanceInfo.InstanceName, rInstanceInfo.Name);
00562 }
00563
00564 shapeName = strlwr (shapeName);
00565 if (!shapeName.empty() && shapeName.find('.') == std::string::npos)
00566 shapeName += ".shape";
00567 }
|
|
|
Get the name of the mesh referenced.
Definition at line 165 of file scene_group.cpp. References _InstancesInfos, and uint. Referenced by addToScene(), NL3D::CInstanceGroupUser::getShapeName(), and NL3D::CInstanceLighter::lightIgSimple().
00166 {
00167 // Return the name of the n-th instance
00168 return _InstancesInfos[instanceNb].Name;
00169 }
|
|
||||||||||||||||||||||||||||
|
See CIGSurfaceLight::getStaticLightSetup().
Definition at line 353 of file scene_group.h. References _IGSurfaceLight, NL3D::CIGSurfaceLight::getStaticLightSetup(), sint, uint, and uint8. Referenced by NL3D::CInstanceGroupUser::getStaticLightSetup().
00355 {
00356 return _IGSurfaceLight.getStaticLightSetup(retrieverIdentifier, surfaceId, localPos,
00357 pointLightList, sunContribution, localAmbient);
00358 }
|
|
|
Get the instance added to the scene. NULL if instanceNb too big, if addToScene not called, or if instance is DontAddToScene Definition at line 237 of file scene_group.cpp. References uint.
00238 {
00239 if(instanceNb>_Instances.size())
00240 return NULL;
00241 return _Instances[instanceNb];
00242 }
|
|
|
Definition at line 251 of file scene_group.h. References _UserIg. Referenced by NL3D::CInstanceGroupUser::getParentCluster().
00251 {return _UserIg;}
|
|
||||||||||||
|
link the root of the ig to a node. No-op if not added to scene. Pass NULL to reset by default Transformation part Definition at line 1123 of file scene_group.cpp. References NL3D::CTransform::hrcLinkSon().
01124 {
01125 if(_Root)
01126 {
01127 father->hrcLinkSon( _Root );
01128 }
01129 }
|
|
|
Look through all hierarchy our clusters that must be linked to our parent Definition at line 884 of file scene_group.cpp. References _ClusterInstances, _ParentClusterSystem, and uint32. Referenced by addToSceneWhenAllShapesLoaded(), and NL3D::CInstanceGroupUser::linkToParentCluster().
00885 {
00886 uint32 i, j;
00887 bool ret;
00888 /*
00889 for (i = 0; i < pFather->_ClusterInstances.size(); ++i)
00890 {
00891 for(j = 0; j < pFather->_ClusterInstances[i]->Children.size(); ++j)
00892 {
00893 if (linkToParent(pFather->_ClusterInstances[i]->Children[j]->Group))
00894 return true;
00895 }
00896 }
00897 */
00898 ret = false;
00899 if (this != pFather)
00900 {
00901 for (j = 0; j < this->_ClusterInstances.size(); ++j)
00902 {
00903 if ((this->_ClusterInstances[j]->FatherVisible) ||
00904 (this->_ClusterInstances[j]->VisibleFromFather))
00905 {
00906 for (i = 0; i < pFather->_ClusterInstances .size(); ++i)
00907 {
00908 // If my cluster j is in the cluster i of the father
00909 if (pFather->_ClusterInstances[i]->isIn(this->_ClusterInstances[j]->getBBox()))
00910 {
00911 if (this->_ClusterInstances[j]->Father != pFather->_ClusterInstances[i]) // and not already son of the father cluster ?
00912 {
00913 // unlink from parent
00914 this->_ClusterInstances[j]->unlinkFromParent();
00915
00916 // relink to the new father found
00917 pFather->_ClusterInstances[i]->Children.push_back(this->_ClusterInstances[j]);
00918 this->_ClusterInstances[j]->Father = pFather->_ClusterInstances[i];
00919 }
00920 ret = true;
00921 }
00922 }
00923 }
00924 }
00925 }
00926
00927 // store new parent
00928 if(ret)
00929 _ParentClusterSystem= pFather;
00930
00931 return ret;
00932 }
|
|
|
Remove all the instances from the scene.
Definition at line 935 of file scene_group.cpp. References _AddRemoveInstance, _ClusterInfos, _ClusterInstances, _PointLightArray, NL3D::CScene::deleteInstance(), NL3D::CScene::deleteModel(), NL3D::CScene::getClipTrav(), NL3D::CPointLightNamedArray::getPointLights(), NL3D::IAddRemoveInstance::instanceGroupRemoved(), nlassert, NL3D::CScene::removeInstanceGroupForLightAnimation(), uint32, NL3D::CTransform::unfreezeStaticLightSetup(), and NL3D::CClipTrav::unregisterCluster(). Referenced by NL3D::CInstanceGroupUser::removeFromScene().
00936 {
00937 uint32 i, j, k;
00938
00939 // Remove shapes
00940 for (i = 0; i < _Instances.size(); ++i)
00941 {
00942 CTransformShape *pTShape = _Instances[i];
00943 if(pTShape)
00944 {
00945 // For security, unfreeze any StaticLightSetup setuped.
00946 pTShape->unfreezeStaticLightSetup();
00947 // delete the instance
00948 scene.deleteInstance (pTShape);
00949 _Instances[i] = NULL;
00950 }
00951 }
00952
00953 // Relink portals with old clusters
00954 for (i = 0; i < _Portals.size(); ++i)
00955 for (k = 0; k < 2; ++k)
00956 {
00957 if (_Portals[i]._Clusters[k])
00958 {
00959 for (j = 0; j < _ClusterInstances.size(); ++j)
00960 if( _Portals[i]._Clusters[k] == _ClusterInstances[j] )
00961 break;
00962
00963 nlassert (j!=_ClusterInstances.size());
00964 _Portals[i]._Clusters[k] = &_ClusterInfos[j];
00965 }
00966 }
00967
00968 // Remove clusters
00969 CClipTrav *pClipTrav = &scene.getClipTrav();
00970 for (i = 0; i < _ClusterInstances.size(); ++i)
00971 {
00972 pClipTrav->unregisterCluster (_ClusterInstances[i]);
00973 scene.deleteModel (_ClusterInstances[i]);
00974 }
00975
00976 scene.deleteModel (_Root);
00977 _Root = NULL;
00978
00979
00980 // UnRegister the instanceGroup for light animation
00981 // -----------------
00982 // If some PointLight to animate
00983 if(_PointLightArray.getPointLights().size() > 0)
00984 scene.removeInstanceGroupForLightAnimation(this);
00985
00986 if (_AddRemoveInstance)
00987 _AddRemoveInstance->instanceGroupRemoved();
00988 return true;
00989 }
|
|
||||||||||||||||||||||||
|
Retreive group information. NB: data may have changed, eg: order of lights. Definition at line 354 of file scene_group.cpp. References _ClusterInfos, _GlobalPos, _InstancesInfos, getPointLightList(), TInstanceArray, and uint. Referenced by NL3D::CInstanceLighter::light().
00358 {
00359 // Just copy infos. NB: light information order have change but is still valid
00360 vGlobalPos= _GlobalPos;
00361 array= _InstancesInfos;
00362
00363 Portals= _Portals;
00364 Clusters= _ClusterInfos;
00365 // Must reset links to all portals and clusters.
00366 uint i;
00367 for(i=0; i<Portals.size(); i++)
00368 Portals[i].resetClusterLinks();
00369 for(i=0; i<Clusters.size(); i++)
00370 Clusters[i].resetPortalLinks();
00371
00372
00373 pointLightList= getPointLightList();
00374 }
|
|
|
Serial the group.
Definition at line 379 of file scene_group.cpp. References _ClusterInfos, _GlobalPos, _IGSurfaceLight, _InstancesInfos, _PointLightArray, _RealTimeSunContribution, NL3D::CPointLightNamedArray::clear(), NL3D::CIGSurfaceLight::clear(), NLMISC::IStream::isReading(), NLMISC::IStream::serial(), NLMISC::IStream::serialCheck(), NLMISC::IStream::serialCont(), NLMISC::IStream::serialVersion(), sint, sint32, and uint32. Referenced by NL3D::CInstanceGroupUser::init(), and NL3D::CAsyncFileManager3D::CIGLoad::run().
00380 {
00381 // Serial a header
00382 f.serialCheck ((uint32)'TPRG');
00383
00384 /*
00385 Version 5:
00386 _ _RealTimeSunContribution
00387 Version 4:
00388 _ IGSurfaceLight
00389 Version 3:
00390 - PointLights
00391 */
00392 // Serial a version number
00393 sint version=f.serialVersion (5);
00394
00395
00396 // _RealTimeSunContribution
00397 if (version >= 5)
00398 {
00399 f.serial(_RealTimeSunContribution);
00400 }
00401 else if(f.isReading())
00402 {
00403 _RealTimeSunContribution= true;
00404 }
00405
00406
00407 // Serial the IGSurfaceLight
00408 if (version >= 4)
00409 {
00410 f.serial(_IGSurfaceLight);
00411 }
00412 else if(f.isReading())
00413 {
00414 _IGSurfaceLight.clear();
00415 }
00416
00417
00418 // Serial the PointLights info
00419 if (version >= 3)
00420 {
00421 f.serial(_PointLightArray);
00422 }
00423 else if(f.isReading())
00424 {
00425 _PointLightArray.clear();
00426 }
00427
00428
00429 if (version >= 2)
00430 f.serial(_GlobalPos);
00431
00432 if (version >= 1)
00433 {
00434 f.serialCont (_ClusterInfos);
00435 f.serialCont (_Portals);
00436 // Links
00437 if (f.isReading())
00438 {
00439 uint32 i, j;
00440 for (i = 0; i < _ClusterInfos.size(); ++i)
00441 {
00442 uint32 nNbPortals;
00443 f.serial (nNbPortals);
00444 _ClusterInfos[i]._Portals.resize (nNbPortals);
00445 // Recreate clusters to portals links
00446 for (j = 0; j < nNbPortals; ++j)
00447 {
00448 sint32 nPortalNb;
00449 f.serial (nPortalNb);
00450 _ClusterInfos[i]._Portals[j] = &_Portals[nPortalNb];
00451 _Portals[nPortalNb].setCluster (&_ClusterInfos[i]);
00452 }
00453 }
00454 }
00455 else // We are writing to the stream
00456 {
00457 uint32 i, j;
00458 for (i = 0; i < _ClusterInfos.size(); ++i)
00459 {
00460 uint32 nNbPortals = _ClusterInfos[i]._Portals.size();
00461 f.serial (nNbPortals);
00462 for (j = 0; j < nNbPortals; ++j)
00463 {
00464 sint32 nPortalNb = (_ClusterInfos[i]._Portals[j] - &_Portals[0]);
00465 f.serial (nPortalNb);
00466 }
00467 }
00468 }
00469 }
00470
00471 // Serial the array
00472 f.serialCont (_InstancesInfos);
00473 }
|
|
|
Set a callback to know when an instance has been added / removed.
Definition at line 491 of file scene_group.cpp. References _AddRemoveInstance. Referenced by NL3D::CInstanceGroupUser::setAddRemoveInstanceCallback().
00492 {
00493 _AddRemoveInstance = callback;
00494 }
|
|
||||||||||||
|
Set the blendshape factor for the whole instance group (-100 -> 100).
Definition at line 1037 of file scene_group.cpp. References NL3D::CMeshBaseInstance::setBlendShapeFactor(), and uint32. Referenced by NL3D::CInstanceGroupUser::setBlendShapeFactor().
01038 {
01039 for( uint32 i = 0; i < _Instances.size(); ++i )
01040 {
01041 CMeshBaseInstance *pMI = dynamic_cast<CMeshBaseInstance*>(_Instances[i]);
01042 if( pMI != NULL )
01043 {
01044 pMI->setBlendShapeFactor( BlendShapeName, rFactor );
01045 }
01046 }
01047 }
|
|
|
Set the cluster system to test for instances that are not in a cluster of this IG.
Definition at line 1056 of file scene_group.cpp. References _ClusterSystemForInstances, _InstancesInfos, and uint32. Referenced by NL3D::CInstanceGroupUser::setClusterSystemForInstances(), and NL3D::CSceneUser::setToGlobalInstanceGroup().
01057 {
01058 _ClusterSystemForInstances = pIG;
01059 for (uint32 i = 0; i < _Instances.size(); ++i)
01060 if (_Instances[i] && _InstancesInfos[i].Clusters.size() == 0)
01061 _Instances[i]->setClusterSystem (_ClusterSystemForInstances);
01062 }
|
|
||||||||||||
|
Set the state of a dynamic portal (true=opened, false=closed).
Definition at line 1073 of file scene_group.cpp. References uint32. Referenced by NL3D::CInstanceGroupUser::setDynamicPortal().
|
|
|
Set a callback to know when an instance group is being created, and how many instances it contains.
Definition at line 497 of file scene_group.cpp. References _IGAddBeginCallback. Referenced by NL3D::CInstanceGroupUser::setIGAddBeginCallback().
00498 {
00499 _IGAddBeginCallback = callback;
00500 }
|
|
|
set the Light factor for all pointLights "lightGroupName".
Definition at line 1205 of file scene_group.cpp. References _PointLightArray, and NL3D::CPointLightNamedArray::setPointLightFactor(). Referenced by NL3D::CScene::animate().
01206 {
01207 _PointLightArray.setPointLightFactor(scene);
01208 }
|
|
|
Set the position of the IG.
Definition at line 1090 of file scene_group.cpp. References NL3D::ITransformable::setPos(). Referenced by createRoot(), and NL3D::CInstanceGroupUser::setPos().
|
|
|
Set the rotation of the IG.
Definition at line 1098 of file scene_group.cpp. References NL3D::ITransformable::setRotQuat(). Referenced by NL3D::CInstanceGroupUser::setRotQuat().
|
|
|
Setup the callback in charge of changing name at the addToScene moment.
Definition at line 484 of file scene_group.cpp. References _TransformName. Referenced by NL3D::CInstanceGroupUser::setTransformNameCallback().
00485 {
00486 _TransformName = pTN;
00487 }
|
|
|
User Interface related: yes it is ugly....
Definition at line 250 of file scene_group.h. References _UserIg. Referenced by NL3D::CInstanceGroupUser::CInstanceGroupUser().
00250 {_UserIg= uig;}
|
|
|
Definition at line 828 of file scene_group.cpp. References _AddToSceneSignal, _InstancesInfos, _TransformName, NL3D::CShapeBank::cancelLoadAsync(), NL3D::CInstanceGroup::CInstance::DontAddToScene, NL3D::CScene::getShapeBank(), NL3D::CInstanceGroup::CInstance::InstanceName, NL3D::CInstanceGroup::CInstance::Name, StateAdding, StateNotAdded, NLMISC::strlwr(), NL3D::ITransformName::transformName(), and uint32. Referenced by NL3D::CInstanceGroupUser::stopAddToSceneAsync().
00829 {
00830 if (_AddToSceneState != StateAdding)
00831 return;
00832 vector<CInstance>::iterator it = _InstancesInfos.begin();
00833 CAsyncFileManager::getInstance().cancelSignal (&_AddToSceneSignal);
00834 for (uint32 i = 0; i < _InstancesInfos.size(); ++i, ++it)
00835 {
00836 CInstance &rInstanceInfo = *it;
00837 if (!rInstanceInfo.DontAddToScene)
00838 {
00839 string shapeName;
00840
00841
00842 bool getShapeName = true;
00843
00844 if (_TransformName != NULL && !rInstanceInfo.InstanceName.empty())
00845 {
00846 shapeName = _TransformName->transformName (i, rInstanceInfo.InstanceName, rInstanceInfo.Name);
00847 if (shapeName != rInstanceInfo.Name)
00848 getShapeName = false;
00849 }
00850
00851
00852 if (getShapeName)
00853 {
00854 if (rInstanceInfo.Name.find('.') == std::string::npos)
00855 shapeName = rInstanceInfo.Name + ".shape";
00856 else // extension has already been added
00857 shapeName = rInstanceInfo.Name;
00858 }
00859
00860 shapeName = strlwr (shapeName);
00861 _AddToSceneTempScene->getShapeBank()->cancelLoadAsync (shapeName);
00862 }
00863 }
00864 _AddToSceneState = StateNotAdded;
00865 }
|
|
|
see CTransform::unfreezeHRC(). Do it for all instances (not clusters), and for the root of the IG.
Definition at line 1146 of file scene_group.cpp. References uint, and NL3D::CTransform::unfreezeHRC(). Referenced by NL3D::CInstanceGroupUser::unfreezeHRC().
01147 {
01148 // For all instances.
01149 for (uint i=0; i < _Instances.size(); i++)
01150 {
01151 if(_Instances[i])
01152 _Instances[i]->unfreezeHRC();
01153 }
01154 // and for root.
01155 _Root->unfreezeHRC();
01156 }
|
|
|
Definition at line 427 of file scene_group.h. Referenced by addToSceneWhenAllShapesLoaded(), CInstanceGroup(), removeFromScene(), and setAddRemoveInstanceCallback(). |
|
|
Definition at line 419 of file scene_group.h. Referenced by addToSceneAsync(), getAddToSceneState(), and stopAddToSceneAsync(). |
|
|
Definition at line 420 of file scene_group.h. |
|
|
Definition at line 422 of file scene_group.h. |
|
|
Definition at line 421 of file scene_group.h. |
|
|
Definition at line 423 of file scene_group.h. Referenced by addToSceneAsync(), and getAddToSceneState(). |
|
|
Definition at line 389 of file scene_group.h. Referenced by addToSceneWhenAllShapesLoaded(), and NL3D::CCluster::traverseHrc(). |
|
|
Definition at line 384 of file scene_group.h. Referenced by addToSceneWhenAllShapesLoaded(), build(), removeFromScene(), retrieve(), and serial(). |
|
|
Definition at line 385 of file scene_group.h. Referenced by addCluster(), addToSceneWhenAllShapesLoaded(), displayDebugClusters(), NL3D::CClipTrav::fullSearch(), linkToParent(), and removeFromScene(). |
|
|
Definition at line 391 of file scene_group.h. Referenced by addToSceneWhenAllShapesLoaded(), CInstanceGroup(), and setClusterSystemForInstances(). |
|
|
Definition at line 395 of file scene_group.h. Referenced by build(), CInstanceGroup(), getGlobalPos(), retrieve(), and serial(). |
|
|
Definition at line 428 of file scene_group.h. Referenced by addToScene(), addToSceneAsync(), CInstanceGroup(), and setIGAddBeginCallback(). |
|
|
The object used to light dynamic models in town and buildings.
Definition at line 413 of file scene_group.h. Referenced by build(), CInstanceGroup(), getIGSurfaceLight(), getStaticLightSetup(), and serial(). |
|
|
|
Definition at line 380 of file scene_group.h. Referenced by addToScene(), addToSceneAsync(), addToSceneWhenAllShapesLoaded(), build(), buildPointLightList(), getInstance(), getInstanceName(), getInstanceParent(), getInstancePos(), getInstanceRot(), getInstanceScale(), getNumInstance(), getShapeName(), retrieve(), serial(), setClusterSystemForInstances(), and stopAddToSceneAsync(). |
|
|
Definition at line 393 of file scene_group.h. Referenced by CInstanceGroup(), getParentClusterSystem(), and linkToParent(). |
|
|
Array of pointLights.
Definition at line 406 of file scene_group.h. Referenced by addToScene(), addToSceneAsync(), addToSceneWhenAllShapesLoaded(), buildPointLightList(), getNumPointLights(), getPointLightList(), getPointLightNamed(), removeFromScene(), serial(), and setPointLightFactor(). |
|
|
Definition at line 383 of file scene_group.h. |
|
|
RealTimeSunContribution. Used for ig_lighter and zone_ig_lighter.
Definition at line 403 of file scene_group.h. Referenced by CInstanceGroup(), enableRealTimeSunContribution(), getRealTimeSunContribution(), and serial(). |
|
|
Definition at line 387 of file scene_group.h. |
|
|
Definition at line 426 of file scene_group.h. Referenced by addToSceneAsync(), CInstanceGroup(), getShapeName(), setTransformNameCallback(), and stopAddToSceneAsync(). |
|
|
Definition at line 431 of file scene_group.h. Referenced by CInstanceGroup(), getUserInterface(), and setUserInterface(). |
1.3.6