khanat-opennel-code/code/ryzom/client/src/ig_callback.h

210 lines
6.3 KiB
C++

// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef CL_IG_CALLBACK
#define CL_IG_CALLBACK
#include "nel/3d/u_instance_group.h"
#include "nel/misc/debug.h"
#include "ig_enum.h"
#include "timed_fx_manager.h"
#include <list>
#include <string>
namespace NL3D
{
class UInstanceGroup;
}
namespace NLPACS
{
class UMoveContainer;
class UMovePrimitive;
class UPrimitiveBlock;
}
class CEntitySheet;
/** A class to manage callback (collisions, constructions ..) with igs of the landscape.
* Its purpose is to create pacs primitive for objects of the landscape that need them.
* The matching primitive for an instance is deduced from its shape name.
* Pacs primitives must be loaded at startup.
* \author Nicolas Vizerie
* \author Nevrax France
* \date 2002
*/
class CIGCallback : public CIGNotifier
{
public:
///\name Object
//@{
/// default ctor
CIGCallback();
/// dtor
~CIGCallback();
//@}
///\name IG mgt
//@{
/** Add an ig. Its callbacks primitive will be created when it has been added
* to the scene
*/
void addIG(NL3D::UInstanceGroup *ig);
/** Add an ig with his num ZC. Its callbacks primitive will be created when it has been added
* to the scene
*/
void addIGWithNumZC(NL3D::UInstanceGroup *ig, sint numZC);
/** Add a vector of instance groups
*/
void addIGs(const std::vector<NL3D::UInstanceGroup *> &igs);
/** Add a vector of instance groups with the num ZC associated.
*/
void addIGsWithNumZC(std::vector<std::pair<NL3D::UInstanceGroup *, sint> > &igs);
/// Remove all IGs
void deleteIGs();
/// Force creation of all zones (not to be used in client side..)
void forceAddAll();
//@}
///\name Collisions
//@{
/** Set the move container that should be used for collision. This MUST
* be called once and only once, unless it is reseted
*/
void setMoveContainer(NLPACS::UMoveContainer *mc);
// Get the move container associated with that object, or NULL if none.
NLPACS::UMoveContainer *getMoveContainer() const { return _MoveContainer; }
/** Add a pacs primitive from its file name.
* This may raise an exception if loading failed.
*/
void addPacsPrim(const std::string &fileName);
/** Add all pacs primitives from the given directory.
*/
void resetContainer();
//@}
///\name Enumeration
//@{
/** enumerate all currently loaded zone igs
* \return false if the enumeration has been stopped
*/
bool enumIGs(IIGEnum *callback);
//@}
///\name Season change
//@{
// apply change of season on iug (for now, only change the fxs to match the season)
void changeSeason();
//@}
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
private:
class CIGInstance;
friend class CIGInstance;
// instanciated igs
typedef std::vector<CIGInstance *> TIGInstanceList;
/**
* An instanciated ig and its matching collisions primitives
*/
class CIGInstance : public NL3D::IAddRemoveInstance,
public NL3D::ITransformName,
public NL3D::IIGAddBegin
{
public:
/// ctor
CIGInstance(NL3D::UInstanceGroup *ig, CIGCallback *owner);
/** Dtor
* NB:
* -This release move primitives from the move container
*/
~CIGInstance();
/// force this instance to be added
void forceAdd() { instanceGroupAdded(); }
void numZC(sint num) {_NumZC = num;}
NL3D::UInstanceGroup *getIG() const { return _IG; }
void updateManagedFXs();
void shutDownFXs();
bool hasManagedFXs() const { return _HasManagedFXs; }
// force to rebuild the sheet vector
void buildSheetVector();
// earse the sheet vector
void eraseSheetVector();
private:
typedef std::vector<NLPACS::UMovePrimitive *> TMovePrimitiveVect;
typedef std::vector<CEntitySheet *> TEntitySheetVect;
private:
void releaseMovePrimitives();
///\name from NL3D::IAddRemoveInstance
//@{
virtual void instanceGroupAdded();
virtual void instanceGroupRemoved();
//@}
///\name from NL3D::ITransformName
//@{
virtual std::string transformName (uint index, const std::string &instanceName, const std::string &shapeName);
//@}
///\name from NL3D::IIGAddBegin
//@{
virtual void startAddingIG(uint numInstances);
//@}
/** Called after all instance have been added, and when their sheets have been retrieved.
* This is the place to setup parameters from sheets
*/
void updateFromSheets();
//
private:
TMovePrimitiveVect _MovePrimitives;
TEntitySheetVect _EntitySheets; // matching sheets for each instance (or NULL), they are used only after the instance have been added to the scene
CIGCallback *_Owner;
NL3D::UInstanceGroup *_IG; // the IG we're looking at
sint _NumZC; // >= 0 if valid.
bool _HasManagedFXs; // true if there are managed fx in the group, otherwise, _ManagedFXHandle is not used
CTimedFXManager::TFXGroupHandle _ManagedFXHandle;
};
private:
NLPACS::UMoveContainer *_MoveContainer;
TIGInstanceList _IGInstances;
};
/** Debug purpose only: create instances in a scene from the content of a move container.
* The created instances are static. Their pointer can be retrieved in a pointer
* The following shapes must be available :
* unit_box.shape : a box of 1 x 1 x 1 centered at the origin
* unit_cylinder.shape : a cylinder of height 1, radius 1
*/
void createInstancesFromMoveContainer(NL3D::UScene *scene, NLPACS::UMoveContainer *mc, std::vector<NL3D::UInstance> *instances = NULL);
#endif