merge from default

--HG--
branch : branch-features-geqt-plugin
hg/feature/cdb-packed
sfb 12 years ago
commit edbb168912

@ -153,6 +153,7 @@ code/nelns/build/*
code/snowballs/build/* code/snowballs/build/*
code/ryzom/build/* code/ryzom/build/*
code/build/* code/build/*
code/build-2010/*
build/* build/*
install/* install/*

@ -21,6 +21,7 @@
#include "nel/misc/string_mapper.h" #include "nel/misc/string_mapper.h"
#include "nel/3d/ps_located.h" #include "nel/3d/ps_located.h"
#include "nel/3d/ps_attrib.h" #include "nel/3d/ps_attrib.h"
#include "nel/misc/sheet_id.h"
@ -63,13 +64,13 @@ public:
virtual void step(TPSProcessPass pass); virtual void step(TPSProcessPass pass);
/// set the name of the sound /// set the name of the sound
void setSoundName(const NLMISC::TStringId &soundName) void setSoundName(const NLMISC::CSheetId &soundName)
{ {
_SoundName = soundName; _SoundName = soundName;
} }
/// get the name of the sound /// get the name of the sound
const NLMISC::TStringId &getSoundName(void) const const NLMISC::CSheetId &getSoundName(void) const
{ {
return _SoundName; return _SoundName;
} }
@ -161,7 +162,7 @@ protected:
void removeAllSources(); void removeAllSources();
CPSAttrib<UPSSoundInstance *> _Sounds; CPSAttrib<UPSSoundInstance *> _Sounds;
NLMISC::TStringId _SoundName; NLMISC::CSheetId _SoundName;
float _Gain; float _Gain;
CPSAttribMaker<float> * _GainScheme; CPSAttribMaker<float> * _GainScheme;
float _Pitch; float _Pitch;

@ -162,7 +162,7 @@ public:
/// inherited from IPSSoundServer /// inherited from IPSSoundServer
UPSSoundInstance *createSound(const NLMISC::TStringId &soundName, bool spawned = true) UPSSoundInstance *createSound(const NLMISC::CSheetId &soundName, bool spawned = true)
{ {
if (!_AudioMixer) if (!_AudioMixer)
return NULL; return NULL;

@ -19,6 +19,7 @@
#include "nel/misc/types_nl.h" #include "nel/misc/types_nl.h"
#include "nel/misc/string_mapper.h" #include "nel/misc/string_mapper.h"
#include "nel/misc/sheet_id.h"
#include <string> #include <string>
namespace NLMISC namespace NLMISC
@ -50,7 +51,7 @@ struct UPSSoundServer
* \param spawn true if the sound must be spawned e.g it continues after this interface is removed * \param spawn true if the sound must be spawned e.g it continues after this interface is removed
* \param cb useful only for spawned sound, it tells when a spawned sound has been removed * \param cb useful only for spawned sound, it tells when a spawned sound has been removed
*/ */
virtual UPSSoundInstance *createSound(const NLMISC::TStringId &soundName, bool spawn = false) = 0; virtual UPSSoundInstance *createSound(const NLMISC::CSheetId &soundName, bool spawn = false) = 0;
}; };

@ -60,6 +60,12 @@ public :
*/ */
explicit CSheetId( const std::string& sheetName ); explicit CSheetId( const std::string& sheetName );
/**
* Constructor, uses defaultType as extension when sheetName
* contains no file extension.
*/
explicit CSheetId( const std::string& sheetName, const std::string &defaultType );
// build from a string and returns true if the build succeed // build from a string and returns true if the build succeed
bool buildSheetId(const std::string& sheetName); bool buildSheetId(const std::string& sheetName);
@ -141,6 +147,7 @@ public :
* Serial * Serial
*/ */
void serial(NLMISC::IStream &f) throw(NLMISC::EStream); void serial(NLMISC::IStream &f) throw(NLMISC::EStream);
void serialString(NLMISC::IStream &f, const std::string &defaultType = "") throw(NLMISC::EStream);
/** /**
* Display the list of valid sheet ids with their associated file names * Display the list of valid sheet ids with their associated file names
@ -221,7 +228,16 @@ private :
static void loadSheetAlias (); static void loadSheetAlias ();
static void cbFileChange (const std::string &filename); static void cbFileChange (const std::string &filename);
/**
* When initialized without sheet_id.bin, the sheet id are assigned
* dynamically. Separate maps are used, because in sheet_id.bin
* mode it uses static maps optimized during load.
*/
static bool _DontHaveSheetKnowledge; static bool _DontHaveSheetKnowledge;
static std::map<std::string, uint32> _DevTypeNameToId;
/// outer vector is type, inner vector is sheet id
static std::vector<std::vector<std::string> > _DevSheetIdToName;
static std::map<std::string, uint32> _DevSheetNameToId;
}; };

@ -48,6 +48,19 @@ typedef sint64 TTicks;
class CTime class CTime
{ {
public: public:
struct CTimerInfo
{
/// Returns if there is a high precision timer that can be used.
bool IsHighPrecisionAvailable;
/// If a CPU specific timer is used and the values are not consistent accross threads.
bool RequiresSingleCore;
/// The resolution of the high resolution timer.
TTicks HighPrecisionResolution;
};
/** Get advanced information on the used timers.
*/
static void probeTimerInfo(CTimerInfo &result);
/** Return the number of second since midnight (00:00:00), January 1, 1970, /** Return the number of second since midnight (00:00:00), January 1, 1970,
* coordinated universal time, according to the system clock. * coordinated universal time, according to the system clock.
@ -71,9 +84,9 @@ public:
* the value can jump backwards if the system time is changed by a user or a NTP time sync process. * the value can jump backwards if the system time is changed by a user or a NTP time sync process.
* The value is different on 2 different computers; use the CUniTime class to get a universal * The value is different on 2 different computers; use the CUniTime class to get a universal
* time that is the same on all computers. * time that is the same on all computers.
* \warning On Win32, the value is on 32 bits only. It wraps around to 0 every about 49.71 days. * \warning On Win32, the value is on 32 bits only, and uses the low-res timer unless probeTimerInfo was called and a high resolution timer can be used. It wraps around to 0 every about 49.71 days.
*/ */
static TTime getLocalTime (); static TTime getLocalTime();
/** Return the time in processor ticks. Use it for profile purpose. /** Return the time in processor ticks. Use it for profile purpose.
* If the performance time is not supported on this hardware, it returns 0. * If the performance time is not supported on this hardware, it returns 0.

@ -25,6 +25,7 @@
#include <nel/misc/time_nl.h> #include <nel/misc/time_nl.h>
#include <nel/misc/stream.h> #include <nel/misc/stream.h>
#include <nel/misc/singleton.h> #include <nel/misc/singleton.h>
#include <nel/misc/sheet_id.h>
#include <nel/sound/u_audio_mixer.h> #include <nel/sound/u_audio_mixer.h>
#include <nel/georges/u_form.h> #include <nel/georges/u_form.h>
@ -180,7 +181,7 @@ public:
// Load environment sounds ; treeRoot can be null if you don't want an access to the envsounds // Load environment sounds ; treeRoot can be null if you don't want an access to the envsounds
// virtual void loadEnvSounds( const char *filename, UEnvSound **treeRoot=NULL ); // virtual void loadEnvSounds( const char *filename, UEnvSound **treeRoot=NULL );
/// Get a TSoundId from a name (returns NULL if not found) /// Get a TSoundId from a name (returns NULL if not found)
virtual TSoundId getSoundId( const NLMISC::TStringId &name ); virtual TSoundId getSoundId( const NLMISC::CSheetId &name );
/// Gets the group controller for the given group tree path with separator '/', if it doesn't exist yet it will be created. /// Gets the group controller for the given group tree path with separator '/', if it doesn't exist yet it will be created.
/// Examples: "music", "effects", "dialog", "music/background", "music/loading", "music/player", etcetera /// Examples: "music", "effects", "dialog", "music/background", "music/loading", "music/player", etcetera
@ -192,7 +193,7 @@ public:
* pass a callback function that will be called (if not NULL) just before deleting the spawned * pass a callback function that will be called (if not NULL) just before deleting the spawned
* source. * source.
*/ */
virtual USource *createSource( const NLMISC::TStringId &name, bool spawn=false, TSpawnEndCallback cb=NULL, void *cbUserParam = NULL, NL3D::CCluster *cluster = 0, CSoundContext *context = 0, UGroupController *groupController = NULL); virtual USource *createSource( const NLMISC::CSheetId &name, bool spawn=false, TSpawnEndCallback cb=NULL, void *cbUserParam = NULL, NL3D::CCluster *cluster = 0, CSoundContext *context = 0, UGroupController *groupController = NULL);
/// Add a logical sound source (by sound id). To remove a source, just delete it. See createSource(const char*) /// Add a logical sound source (by sound id). To remove a source, just delete it. See createSource(const char*)
virtual USource *createSource( TSoundId id, bool spawn=false, TSpawnEndCallback cb=NULL, void *cbUserParam = NULL, NL3D::CCluster *cluster = 0, CSoundContext *context = 0, UGroupController *groupController = NULL); virtual USource *createSource( TSoundId id, bool spawn=false, TSpawnEndCallback cb=NULL, void *cbUserParam = NULL, NL3D::CCluster *cluster = 0, CSoundContext *context = 0, UGroupController *groupController = NULL);
/// Add a source which was created by an EnvSound /// Add a source which was created by an EnvSound
@ -223,7 +224,7 @@ public:
/// Return the names of the sounds (call this method after loadSounds()) /// Return the names of the sounds (call this method after loadSounds())
virtual void getSoundNames( std::vector<NLMISC::TStringId> &names ) const; virtual void getSoundNames( std::vector<NLMISC::CSheetId> &names ) const;
/// Return the number of mixing tracks (voices) /// Return the number of mixing tracks (voices)
virtual uint getPolyphony() const { return (uint)_Tracks.size(); } virtual uint getPolyphony() const { return (uint)_Tracks.size(); }
/// Return the number of sources instance. /// Return the number of sources instance.
@ -444,7 +445,7 @@ private:
/// Witch parameter to control /// Witch parameter to control
TControledParamId ParamId; TControledParamId ParamId;
/// The controled sounds names. /// The controled sounds names.
std::vector<NLMISC::TStringId> SoundNames; std::vector<NLMISC::CSheetId> SoundNames;
/// Current parameter value /// Current parameter value
float Value; float Value;
/// All the sources controled by this variable /// All the sources controled by this variable

@ -64,22 +64,12 @@ public:
/// Associtation clas for storage of sound / filter. /// Associtation clas for storage of sound / filter.
struct TSoundInfo struct TSoundInfo
{ {
NLMISC::TStringId SoundName; NLMISC::CSheetId SoundName;
UAudioMixer::TBackgroundFlags Filter; UAudioMixer::TBackgroundFlags Filter;
void serial(NLMISC::IStream &s) void serial(NLMISC::IStream &s)
{ {
std::string soundName; SoundName.serialString(s, "sound");
if (s.isReading())
{
s.serial(soundName);
SoundName = NLMISC::CStringMapper::map(soundName);
}
else
{
soundName = NLMISC::CStringMapper::unmap(SoundName);
s.serial(soundName);
}
s.serial(Filter); s.serial(Filter);
} }
}; };

@ -229,7 +229,7 @@ private:
struct TSoundData struct TSoundData
{ {
/// The name of the sound. /// The name of the sound.
NLMISC::TStringId SoundName; NLMISC::CSheetId SoundName;
/// The reference to the sound. /// The reference to the sound.
CSound *Sound; CSound *Sound;
/// A source instance of the sound (may be NULL). /// A source instance of the sound (may be NULL).

@ -19,6 +19,7 @@
#include "nel/misc/types_nl.h" #include "nel/misc/types_nl.h"
#include "nel/misc/string_mapper.h" #include "nel/misc/string_mapper.h"
#include "nel/misc/sheet_id.h"
#include <vector> #include <vector>
#include <map> #include <map>
@ -253,9 +254,9 @@ private:
/// The current cluster playing source indexed with sound group id /// The current cluster playing source indexed with sound group id
TClusterSoundCont _Sources; TClusterSoundCont _Sources;
typedef CHashMap<NLMISC::TStringId, NLMISC::TStringId, NLMISC::CStringIdHashMapTraits> TStringStringMap; typedef CHashMap<NLMISC::TStringId, NLMISC::CSheetId, NLMISC::CStringIdHashMapTraits> TStringSheetMap;
/// The sound_group to sound assoc /// The sound_group to sound assoc
TStringStringMap _SoundGroupToSound; TStringSheetMap _SoundGroupToSound;
}; };
} // NLSOUND } // NLSOUND

@ -52,8 +52,8 @@ public:
const std::vector<uint32> &getSoundSeq() const { return _SoundSeq;} const std::vector<uint32> &getSoundSeq() const { return _SoundSeq;}
const std::vector<uint32> &getDelaySeq() const { return _DelaySeq;} const std::vector<uint32> &getDelaySeq() const { return _DelaySeq;}
NLMISC::TStringId getSound(uint index) const { return !_Sounds.empty() ? _Sounds[index%_Sounds.size()]:0;} NLMISC::CSheetId getSound(uint index) const { return !_Sounds.empty() ? _Sounds[index%_Sounds.size()]:NLMISC::CSheetId::Unknown;}
const std::vector<NLMISC::TStringId> &getSounds() const { return _Sounds;} const std::vector<NLMISC::CSheetId> &getSounds() const { return _Sounds;}
uint32 getFadeLength() const { return _XFadeLength;} uint32 getFadeLength() const { return _XFadeLength;}
@ -87,7 +87,7 @@ private:
virtual float getMaxDistance() const; virtual float getMaxDistance() const;
TPATTERN_MODE _PatternMode; TPATTERN_MODE _PatternMode;
std::vector<NLMISC::TStringId> _Sounds; std::vector<NLMISC::CSheetId> _Sounds;
float _TicksPerSeconds; float _TicksPerSeconds;
std::vector<uint32> _SoundSeq; std::vector<uint32> _SoundSeq;
/// Sequence of delay in millisec. /// Sequence of delay in millisec.

@ -133,7 +133,7 @@ class CContextSoundContainer : public IContextSoundContainer
virtual void addSound(CSound *sound, const std::string &baseName) virtual void addSound(CSound *sound, const std::string &baseName)
{ {
const std::string &patternName = NLMISC::CStringMapper::unmap(sound->getName()); const std::string &patternName = sound->getName().toString(); /*NLMISC::CStringMapper::unmap(sound->getName())*/;
nlassert(patternName.size() >= baseName.size()); nlassert(patternName.size() >= baseName.size());
std::string arg; std::string arg;
@ -172,7 +172,7 @@ class CContextSoundContainer : public IContextSoundContainer
if (i != NbJoker) if (i != NbJoker)
return; return;
nlassertex(i==NbJoker, ("Error while adding sound '%s' into context sound container", NLMISC::CStringMapper::unmap(sound->getName()).c_str())); nlassertex(i==NbJoker, ("Error while adding sound '%s' into context sound container", sound->getName().toString().c_str()/*NLMISC::CStringMapper::unmap(sound->getName()).c_str()*/));
sint randomValue = 0; sint randomValue = 0;
if (UseRandom) if (UseRandom)
@ -187,7 +187,7 @@ class CContextSoundContainer : public IContextSoundContainer
} }
else if (!arg.empty()) else if (!arg.empty())
{ {
nlassertex (!ok, ("Error while adding sound '%s' into context sound container", NLMISC::CStringMapper::unmap(sound->getName()).c_str())); nlassertex (!ok, ("Error while adding sound '%s' into context sound container", sound->getName().toString().c_str()/*NLMISC::CStringMapper::unmap(sound->getName()).c_str()*/));
// end of the argument. // end of the argument.
NLMISC::fromString(arg, randomValue); NLMISC::fromString(arg, randomValue);
arg.clear(); arg.clear();
@ -199,13 +199,13 @@ class CContextSoundContainer : public IContextSoundContainer
// read the potential last arg. // read the potential last arg.
if (!arg.empty()) if (!arg.empty())
{ {
nlassertex (!ok, ("Error while adding sound '%s' into context sound container", NLMISC::CStringMapper::unmap(sound->getName()).c_str())); nlassertex (!ok, ("Error while adding sound '%s' into context sound container", sound->getName().toString().c_str()/*NLMISC::CStringMapper::unmap(sound->getName()).c_str()*/));
// end of the argument. // end of the argument.
NLMISC::fromString(arg, randomValue); NLMISC::fromString(arg, randomValue);
arg.clear(); arg.clear();
ok = true; ok = true;
} }
nlassertex (ok, ("Error while adding sound '%s' into context sound container", NLMISC::CStringMapper::unmap(sound->getName()).c_str())); nlassertex (ok, ("Error while adding sound '%s' into context sound container", sound->getName().toString().c_str()/*NLMISC::CStringMapper::unmap(sound->getName()).c_str()*/));
} }
else else
@ -221,9 +221,9 @@ class CContextSoundContainer : public IContextSoundContainer
if (!ret.second) if (!ret.second)
{ {
typename THashContextSound::iterator it = _ContextSounds.find(cm); typename THashContextSound::iterator it = _ContextSounds.find(cm);
nlassertex(it != _ContextSounds.end(), ("Error wile adding soudn '%s' into context sound container", NLMISC::CStringMapper::unmap(sound->getName()).c_str())); nlassertex(it != _ContextSounds.end(), ("Error wile adding soudn '%s' into context sound container", sound->getName().toString().c_str()/*NLMISC::CStringMapper::unmap(sound->getName()).c_str()*/));
nlwarning("Sound %s has the same context matcher as the sound %s", NLMISC::CStringMapper::unmap(sound->getName()).c_str(), NLMISC::CStringMapper::unmap(it->second->getName()).c_str()); nlwarning("Sound %s has the same context matcher as the sound %s", sound->getName().toString().c_str()/*NLMISC::CStringMapper::unmap(sound->getName()).c_str()*/, it->second->getName().toString().c_str() /*NLMISC::CStringMapper::unmap(it->second->getName()).c_str()*/);
} }
} }
@ -249,7 +249,7 @@ class CContextSoundContainer : public IContextSoundContainer
typename THashContextSound::const_iterator first(_ContextSounds.begin()), last(_ContextSounds.end()); typename THashContextSound::const_iterator first(_ContextSounds.begin()), last(_ContextSounds.end());
for (; first != last; ++first) for (; first != last; ++first)
{ {
subsounds.push_back(std::make_pair(NLMISC::CStringMapper::unmap(first->second->getName()), first->second)); subsounds.push_back(std::make_pair(first->second->getName().toString()/*NLMISC::CStringMapper::unmap(first->second->getName())*/, first->second));
} }
} }

@ -22,6 +22,7 @@
#include "nel/misc/string_mapper.h" #include "nel/misc/string_mapper.h"
#include "nel/sound/u_source.h" #include "nel/sound/u_source.h"
#include "nel/georges/u_form_elm.h" #include "nel/georges/u_form_elm.h"
#include "nel/misc/sheet_id.h"
#include <string> #include <string>
namespace NLSOUND { namespace NLSOUND {
@ -35,7 +36,7 @@ class CGroupController;
/// Sound names hash map /// Sound names hash map
//typedef std::hash_map<std::string, CSound*> TSoundMap; //typedef std::hash_map<std::string, CSound*> TSoundMap;
typedef CHashMap<NLMISC::TStringId, CSound*, NLMISC::CStringIdHashMapTraits> TSoundMap; typedef CHashMap<NLMISC::CSheetId, CSound*, NLMISC::CStringIdHashMapTraits> TSoundMap;
/// Sound names set (for ambiant sounds) /// Sound names set (for ambiant sounds)
typedef std::set<CSound*> TSoundSet; typedef std::set<CSound*> TSoundSet;
@ -53,7 +54,7 @@ class CSound
friend class CAudioMixerUser; friend class CAudioMixerUser;
public: public:
/// Factory for specialized sound. /// Factory for specialized sound.
static CSound *createSound(const std::string &filename, NLGEORGES::UFormElm& formRoot); static CSound *createSound(const std::string &name, NLGEORGES::UFormElm& formRoot);
enum TSOUND_TYPE enum TSOUND_TYPE
{ {
@ -99,7 +100,7 @@ public:
/// Return the length of the sound in ms /// Return the length of the sound in ms
virtual uint32 getDuration() = 0; virtual uint32 getDuration() = 0;
/// Return the name (must be unique) /// Return the name (must be unique)
const NLMISC::TStringId& getName() const { return _Name; } const NLMISC::CSheetId& getName() const { return _Name; }
/// Return the min distance (if detailed()) (default 1.0f if not implemented by sound type) /// Return the min distance (if detailed()) (default 1.0f if not implemented by sound type)
virtual float getMinDistance() const { return _MinDist; } virtual float getMinDistance() const { return _MinDist; }
@ -121,7 +122,8 @@ public:
bool operator<( const CSound& otherSound ) const bool operator<( const CSound& otherSound ) const
{ {
return NLMISC::CStringMapper::unmap(_Name) < NLMISC::CStringMapper::unmap(otherSound._Name); //return NLMISC::CStringMapper::unmap(_Name) < NLMISC::CStringMapper::unmap(otherSound._Name);
return _Name.toString() < otherSound._Name.toString();
} }
protected: protected:
@ -142,7 +144,7 @@ protected:
float _MaxDist; float _MaxDist;
// Sound name. // Sound name.
NLMISC::TStringId _Name; NLMISC::CSheetId _Name;
/// An optional user var controler. /// An optional user var controler.
NLMISC::TStringId _UserVarControler; NLMISC::TStringId _UserVarControler;

@ -20,6 +20,7 @@
#include "nel/misc/string_mapper.h" #include "nel/misc/string_mapper.h"
#include "nel/3d/cluster.h" #include "nel/3d/cluster.h"
#include "nel/sound/u_source.h" #include "nel/sound/u_source.h"
#include "nel/misc/sheet_id.h"
namespace NLMISC namespace NLMISC
@ -31,7 +32,7 @@ namespace NLMISC
namespace NLSOUND { namespace NLSOUND {
typedef std::set<NLMISC::TStringId> TMarkerSoundSet; typedef std::set<NLMISC::CSheetId> TMarkerSoundSet;
class UAudioMixer; class UAudioMixer;
@ -50,13 +51,13 @@ public:
virtual float getTime() const { return _Time; } virtual float getTime() const { return _Time; }
/** Add a new sound in the set of to-be-played sounds for this marker */ /** Add a new sound in the set of to-be-played sounds for this marker */
virtual void addSound(const NLMISC::TStringId &soundName); virtual void addSound(const NLMISC::CSheetId &soundName);
/** Remove a sound */ /** Remove a sound */
virtual void removeSound(const NLMISC::TStringId &soundName); virtual void removeSound(const NLMISC::CSheetId &soundName);
/** Return the set of sounds of this marker */ /** Return the set of sounds of this marker */
virtual void getSounds(std::vector<NLMISC::TStringId> &sounds); virtual void getSounds(std::vector<NLMISC::CSheetId> &sounds);
/** Play all the sounds of this marker */ /** Play all the sounds of this marker */
virtual void play(UAudioMixer* mixer, NL3D::CCluster *cluster, CSoundContext &context); virtual void play(UAudioMixer* mixer, NL3D::CCluster *cluster, CSoundContext &context);

@ -20,6 +20,7 @@
#include "nel/misc/types_nl.h" #include "nel/misc/types_nl.h"
#include "nel/misc/string_mapper.h" #include "nel/misc/string_mapper.h"
#include "nel/sound/audio_mixer_user.h" #include "nel/sound/audio_mixer_user.h"
#include "nel/misc/sheet_id.h"
#include <string> #include <string>
namespace NLSOUND { namespace NLSOUND {
@ -67,16 +68,16 @@ public:
bool isLoaded(); bool isLoaded();
/// Return a sound corresponding to a name. /// Return a sound corresponding to a name.
CSound *getSound(const NLMISC::TStringId &name); CSound *getSound(const NLMISC::CSheetId &sheetId);
/// Return the names of the sounds /// Return the names of the sounds
void getNames( std::vector<NLMISC::TStringId> &names ); void getNames( std::vector<NLMISC::CSheetId> &sheetIds );
/// Return the number of sounds in this bank. /// Return the number of sounds in this bank.
uint countSounds(); uint countSounds();
void addSound(CSound *sound); void addSound(CSound *sound);
void removeSound(const NLMISC::TStringId &name); void removeSound(const NLMISC::CSheetId &sheetId);
private: private:
@ -88,7 +89,8 @@ private:
typedef CHashMap<NLMISC::TStringId, TSimpleSoundContainer, NLMISC::CStringIdHashMapTraits> TBufferAssocContainer; typedef CHashMap<NLMISC::TStringId, TSimpleSoundContainer, NLMISC::CStringIdHashMapTraits> TBufferAssocContainer;
/// Sound names hash map /// Sound names hash map
// typedef std::hash_map<std::string, CSound*> TSoundTable; // typedef std::hash_map<std::string, CSound*> TSoundTable;
typedef CHashMap<NLMISC::TStringId, CSound*, NLMISC::CStringIdHashMapTraits> TSoundTable; // typedef CHashMap<NLMISC::CSheetId, CSound*, NLMISC::CSheetIdHashMapTraits> TSoundTable;
typedef std::vector<CSound *> TSoundTable; // list the sheets by shortId of the sheetId
/// Assoc from buffer to sound. Used for sound unloading. /// Assoc from buffer to sound. Used for sound unloading.
TBufferAssocContainer _BufferAssoc; TBufferAssocContainer _BufferAssoc;

@ -23,6 +23,7 @@
#include "nel/3d/cluster.h" #include "nel/3d/cluster.h"
#include "nel/sound/sound.h" #include "nel/sound/sound.h"
#include "nel/sound/group_controller.h" #include "nel/sound/group_controller.h"
#include "nel/misc/sheet_id.h"
namespace NLSOUND { namespace NLSOUND {

@ -19,6 +19,7 @@
#include "nel/misc/types_nl.h" #include "nel/misc/types_nl.h"
#include "nel/misc/string_mapper.h" #include "nel/misc/string_mapper.h"
#include "nel/misc/sheet_id.h"
#include "nel/sound/u_source.h" #include "nel/sound/u_source.h"
#include "nel/sound/u_group_controller.h" #include "nel/sound/u_group_controller.h"
#include "nel/ligo/primitive.h" #include "nel/ligo/primitive.h"
@ -284,7 +285,7 @@ public:
//@} //@}
/// Get a TSoundId from a name (returns NULL if not found) /// Get a TSoundId from a name (returns NULL if not found)
virtual TSoundId getSoundId( const NLMISC::TStringId &name ) = 0; virtual TSoundId getSoundId( const NLMISC::CSheetId &name ) = 0;
/// Gets the group controller for the given group tree path with separator '/', if it doesn't exist yet it will be created. /// Gets the group controller for the given group tree path with separator '/', if it doesn't exist yet it will be created.
/// Examples: "music", "effects", "dialog", "music/background", "music/loading", "music/player", etcetera /// Examples: "music", "effects", "dialog", "music/background", "music/loading", "music/player", etcetera
@ -296,7 +297,7 @@ public:
* pass a callback function that will be called (if not NULL) just before deleting the spawned * pass a callback function that will be called (if not NULL) just before deleting the spawned
* source. * source.
*/ */
virtual USource *createSource(const NLMISC::TStringId &name, bool spawn=false, TSpawnEndCallback cb=NULL, void *callbackUserParam = NULL, NL3D::CCluster *cluster = 0, CSoundContext *context = 0, UGroupController *groupController = NULL) = 0; virtual USource *createSource(const NLMISC::CSheetId &name, bool spawn=false, TSpawnEndCallback cb=NULL, void *callbackUserParam = NULL, NL3D::CCluster *cluster = 0, CSoundContext *context = 0, UGroupController *groupController = NULL) = 0;
/// Add a logical sound source (by sound id). To remove a source, just delete it. See createSource(const char*) /// Add a logical sound source (by sound id). To remove a source, just delete it. See createSource(const char*)
virtual USource *createSource(TSoundId id, bool spawn=false, TSpawnEndCallback cb=NULL, void *callbackUserParam = NULL, NL3D::CCluster *cluster = 0, CSoundContext *context = 0, UGroupController *groupController = NULL) = 0; virtual USource *createSource(TSoundId id, bool spawn=false, TSpawnEndCallback cb=NULL, void *callbackUserParam = NULL, NL3D::CCluster *cluster = 0, CSoundContext *context = 0, UGroupController *groupController = NULL) = 0;
@ -320,7 +321,7 @@ public:
//@{ //@{
//@name Statistic and utility methods //@name Statistic and utility methods
/// Fill a vector with the names of all loaded sounds. /// Fill a vector with the names of all loaded sounds.
virtual void getSoundNames( std::vector<NLMISC::TStringId> &names ) const = 0; virtual void getSoundNames( std::vector<NLMISC::CSheetId> &names ) const = 0;
/// Return the number of mixing tracks (voices) /// Return the number of mixing tracks (voices)
virtual uint getPolyphony() const = 0; virtual uint getPolyphony() const = 0;
/// Return the number of sources /// Return the number of sources

@ -49,6 +49,7 @@ void Init()
{ {
try try
{ {
CSheetId::initWithoutSheet();
CPath::addSearchPath(NL_SOUND_DATA"/data", true, false); CPath::addSearchPath(NL_SOUND_DATA"/data", true, false);
@ -100,7 +101,7 @@ USource *OnAddSource( const char *name, float x, float y, float z )
/* /*
* Create a source with sound 'name', and set some of its initial properties, if successful * Create a source with sound 'name', and set some of its initial properties, if successful
*/ */
USource *source = AudioMixer->createSource( CStringMapper::map(name) ); USource *source = AudioMixer->createSource(CSheetId(name, "sound"));
if ( source != NULL ) if ( source != NULL )
{ {
source->setPos( CVector(x,y,z) ); source->setPos( CVector(x,y,z) );

@ -62,6 +62,7 @@ static void initSample()
{ {
if (!INelContext::isContextInitialised()) if (!INelContext::isContextInitialised())
new CApplicationContext(); new CApplicationContext();
CSheetId::initWithoutSheet();
CPath::addSearchPath(NL_SOUND_DATA"/data", true, false); CPath::addSearchPath(NL_SOUND_DATA"/data", true, false);
printf("Sample demonstrating OGG playback using stream file .sound sheets."); printf("Sample demonstrating OGG playback using stream file .sound sheets.");
@ -97,7 +98,7 @@ static void initSample()
//NLMISC::CHTimer::startBench(); //NLMISC::CHTimer::startBench();
s_Source = s_AudioMixer->createSource(CStringMapper::map("stream_file")); s_Source = s_AudioMixer->createSource(CSheetId("stream_file.sound"));
nlassert(s_Source); nlassert(s_Source);
s_StreamFileSource = dynamic_cast<CStreamFileSource *>(s_Source); s_StreamFileSource = dynamic_cast<CStreamFileSource *>(s_Source);
nlassert(s_StreamFileSource); nlassert(s_StreamFileSource);

@ -59,6 +59,7 @@ static void initSample()
{ {
if (!INelContext::isContextInitialised()) if (!INelContext::isContextInitialised())
new CApplicationContext(); new CApplicationContext();
CSheetId::initWithoutSheet();
CPath::addSearchPath(NL_SOUND_DATA"/database/build/", true, false); CPath::addSearchPath(NL_SOUND_DATA"/database/build/", true, false);
printf("Sample demonstrating OGG playback using UStreamSource."); printf("Sample demonstrating OGG playback using UStreamSource.");
@ -87,7 +88,7 @@ static void initSample()
//NLMISC::CHTimer::startBench(); //NLMISC::CHTimer::startBench();
USource *source = s_AudioMixer->createSource(CStringMapper::map("default_stream")); USource *source = s_AudioMixer->createSource(CSheetId("default_stream.sound"));
nlassert(source); nlassert(source);
s_StreamSource = dynamic_cast<UStreamSource *>(source); s_StreamSource = dynamic_cast<UStreamSource *>(source);
nlassert(s_StreamSource); nlassert(s_StreamSource);

@ -868,6 +868,13 @@ bool CDriverD3D::uploadTextureInternal (ITexture& tex, CRect& rect, uint8 destMi
D3DFORMAT destFormat, D3DFORMAT srcFormat) D3DFORMAT destFormat, D3DFORMAT srcFormat)
{ {
H_AUTO_D3D(CDriverD3D_uploadTextureInternal) H_AUTO_D3D(CDriverD3D_uploadTextureInternal)
if (rect.Width == 0 || rect.Height == 0)
{
nlwarning("Rectangle width or height cannot be 0");
return false;
}
// The D3D texture // The D3D texture
CTextureDrvInfosD3D* d3dtext = getTextureD3D(tex); CTextureDrvInfosD3D* d3dtext = getTextureD3D(tex);

@ -40,6 +40,7 @@ CPointLight::CPointLight() : _LightedModels(/*&_LightedModelListMemory*/)
_Diffuse= _Specular= CRGBA::White; _Diffuse= _Specular= CRGBA::White;
// Default setup. this is arbitrary // Default setup. this is arbitrary
_Type= PointLight;
_AttenuationBegin= 10; _AttenuationBegin= 10;
_AttenuationEnd= 30; _AttenuationEnd= 30;

@ -43,7 +43,7 @@ CPSSound::CPSSound() : _Gain(1.f),
{ {
NL_PS_FUNC(CPSSound_CPSSound) NL_PS_FUNC(CPSSound_CPSSound)
if (CParticleSystem::getSerializeIdentifierFlag()) _Name = std::string("sound"); if (CParticleSystem::getSerializeIdentifierFlag()) _Name = std::string("sound");
_SoundName = NLMISC::CStringMapper::emptyId(); _SoundName = NLMISC::CSheetId::Unknown /*NLMISC::CStringMapper::emptyId()*/;
} }
// *************************************************************************************************** // ***************************************************************************************************
@ -261,17 +261,16 @@ void CPSSound::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
CPSLocatedBindable::serial(f); CPSLocatedBindable::serial(f);
// version 3 : added option to keep original pitch from the .sound // version 3 : added option to keep original pitch from the .sound
sint ver = f.serialVersion(3); sint ver = f.serialVersion(3);
if (f.isReading())
{ // FIXME: CPSSound is reserialized from the _ParticleSystemProto
std::string soundName; // cache when a non-_Shared particle system is instanced, this
f.serial(soundName); // causes unnecessary sheet id lookups from string.
_SoundName = NLMISC::CStringMapper::map(soundName); // SLN1: Serialize as uint32, but this requires the editor to know
} // the correct sheet id (and thus requires a built sheet_id.bin).
else // SLN2: Create a tool that reserializes all ps with sound sheet id
{ // instead of sheet names, based on a global flag, and serialize
std::string soundName = NLMISC::CStringMapper::unmap(_SoundName); // a flag that specifies if the ps is serialized with id or name.
f.serial(soundName); _SoundName.serialString(f, "sound");
}
sint32 nbSounds; sint32 nbSounds;
bool hasScheme; bool hasScheme;

@ -623,7 +623,7 @@ void CRenderTrav::changeLightSetup(CLightContribution *lightContribution, bool
uint i; uint i;
// if same lightContribution, no-op. // if same lightContribution, no-op.
if(_CacheLightContribution == lightContribution && _LastLocalAttenuation == useLocalAttenuation) if (_CacheLightContribution == lightContribution && (lightContribution == NULL || _LastLocalAttenuation == useLocalAttenuation))
return; return;
// else, must setup the lights into driver. // else, must setup the lights into driver.
else else

@ -512,7 +512,8 @@ void CVisualCollisionMesh::receiveShadowMap(const NLMISC::CMatrix &instanceMatr
} }
// if triangle not clipped, add the triangle // if triangle not clipped, add the triangle
if( (triFlag & NL3D_VCM_SHADOW_NUM_CLIP_PLANE_MASK)==0 ) // if( (triFlag & NL3D_VCM_SHADOW_NUM_CLIP_PLANE_MASK)==0 )
if (triFlag == 0) // previous line not useful due to init
{ {
// Add the 3 index to the index buffer. // Add the 3 index to the index buffer.
ibPtr[currentTriIdx++]= (uint16) triId[0]; ibPtr[currentTriIdx++]= (uint16) triId[0];

@ -100,7 +100,7 @@ CFixedSizeAllocator::CChunk::~CChunk()
nlassert(NumFreeObjs == 0); nlassert(NumFreeObjs == 0);
nlassert(Allocator->_NumChunks > 0); nlassert(Allocator->_NumChunks > 0);
-- (Allocator->_NumChunks); -- (Allocator->_NumChunks);
delete Mem; delete[] Mem;
} }
// ***************************************************************************************************************** // *****************************************************************************************************************

@ -34,16 +34,16 @@ struct CPMainThread : public CPThread
{ {
CPMainThread() : CPThread(NULL, 0) CPMainThread() : CPThread(NULL, 0)
{ {
if(pthread_key_create(&threadSpecificKey, NULL) != 0) if(pthread_key_create(&threadSpecificKey, NULL) != 0)
throw EThread("cannot create thread specific storage key."); throw EThread("cannot create thread specific storage key.");
if(pthread_setspecific(threadSpecificKey, this) != 0) if(pthread_setspecific(threadSpecificKey, this) != 0)
throw EThread("cannot set main thread ptr in thread specific storage."); throw EThread("cannot set main thread ptr in thread specific storage.");
} }
~CPMainThread() ~CPMainThread()
{ {
if(pthread_key_delete(threadSpecificKey) != 0) if(pthread_key_delete(threadSpecificKey) != 0)
throw EThread("cannot delete thread specific storage key."); throw EThread("cannot delete thread specific storage key.");
} }
}; };
@ -139,7 +139,7 @@ void CPThread::start()
/* setting the size of the stack also */ /* setting the size of the stack also */
ret = pthread_attr_setstacksize(&tattr, _StackSize); ret = pthread_attr_setstacksize(&tattr, _StackSize);
} }
bool detach_old_thread = false; bool detach_old_thread = false;
pthread_t old_thread_handle; pthread_t old_thread_handle;
if (_State != ThreadStateNone) if (_State != ThreadStateNone)
@ -221,6 +221,9 @@ void CPThread::wait ()
bool CPThread::setCPUMask(uint64 cpuMask) bool CPThread::setCPUMask(uint64 cpuMask)
{ {
#ifdef __USE_GNU #ifdef __USE_GNU
nlwarning("This code does not work. May cause a segmentation fault...");
sint res = pthread_setaffinity_np(_ThreadHandle, sizeof(uint64), (const cpu_set_t*)&cpuMask); sint res = pthread_setaffinity_np(_ThreadHandle, sizeof(uint64), (const cpu_set_t*)&cpuMask);
if (res) if (res)
@ -228,9 +231,14 @@ bool CPThread::setCPUMask(uint64 cpuMask)
nlwarning("pthread_setaffinity_np() returned %d", res); nlwarning("pthread_setaffinity_np() returned %d", res);
return false; return false;
} }
#endif // __USE_GNU
return true; return true;
#else // __USE_GNU
return false;
#endif // __USE_GNU
} }
/* /*
@ -238,9 +246,12 @@ bool CPThread::setCPUMask(uint64 cpuMask)
*/ */
uint64 CPThread::getCPUMask() uint64 CPThread::getCPUMask()
{ {
uint64 cpuMask = 1;
#ifdef __USE_GNU #ifdef __USE_GNU
nlwarning("This code does not work. May cause a segmentation fault...");
uint64 cpuMask = 0;
sint res = pthread_getaffinity_np(_ThreadHandle, sizeof(uint64), (cpu_set_t*)&cpuMask); sint res = pthread_getaffinity_np(_ThreadHandle, sizeof(uint64), (cpu_set_t*)&cpuMask);
if (res) if (res)
@ -248,9 +259,14 @@ uint64 CPThread::getCPUMask()
nlwarning("pthread_getaffinity_np() returned %d", res); nlwarning("pthread_getaffinity_np() returned %d", res);
return 0; return 0;
} }
#endif // __USE_GNU
return cpuMask; return cpuMask;
#else // __USE_GNU
return 0;
#endif // __USE_GNU
} }
void CPThread::setPriority(TThreadPriority priority) void CPThread::setPriority(TThreadPriority priority)
@ -311,9 +327,9 @@ IProcess *IProcess::getCurrentProcess ()
*/ */
uint64 CPProcess::getCPUMask() uint64 CPProcess::getCPUMask()
{ {
uint64 cpuMask = 1;
#ifdef __USE_GNU #ifdef __USE_GNU
uint64 cpuMask = 0;
sint res = sched_getaffinity(getpid(), sizeof(uint64), (cpu_set_t*)&cpuMask); sint res = sched_getaffinity(getpid(), sizeof(uint64), (cpu_set_t*)&cpuMask);
if (res) if (res)
@ -321,15 +337,21 @@ uint64 CPProcess::getCPUMask()
nlwarning("sched_getaffinity() returned %d, errno = %d: %s", res, errno, strerror(errno)); nlwarning("sched_getaffinity() returned %d, errno = %d: %s", res, errno, strerror(errno));
return 0; return 0;
} }
#endif // __USE_GNU
return cpuMask; return cpuMask;
#else // __USE_GNU
return 0;
#endif // __USE_GNU
} }
/// set the CPU mask /// set the CPU mask
bool CPProcess::setCPUMask(uint64 cpuMask) bool CPProcess::setCPUMask(uint64 cpuMask)
{ {
#ifdef __USE_GNU #ifdef __USE_GNU
sint res = sched_setaffinity(getpid(), sizeof(uint64), (const cpu_set_t*)&cpuMask); sint res = sched_setaffinity(getpid(), sizeof(uint64), (const cpu_set_t*)&cpuMask);
if (res) if (res)
@ -337,9 +359,14 @@ bool CPProcess::setCPUMask(uint64 cpuMask)
nlwarning("sched_setaffinity() returned %d, errno = %d: %s", res, errno, strerror(errno)); nlwarning("sched_setaffinity() returned %d, errno = %d: %s", res, errno, strerror(errno));
return false; return false;
} }
#endif // __USE_GNU
return true; return true;
#else // __USE_GNU
return false;
#endif // __USE_GNU
} }

@ -83,7 +83,7 @@ CFileContainer::~CFileContainer()
{ {
if( _AllFileNames ) if( _AllFileNames )
{ {
delete _AllFileNames; delete[] _AllFileNames;
_AllFileNames = NULL; _AllFileNames = NULL;
} }
} }

@ -40,6 +40,15 @@ vector<std::string> CSheetId::_FileExtensions;
bool CSheetId::_Initialised=false; bool CSheetId::_Initialised=false;
bool CSheetId::_RemoveUnknownSheet=true; bool CSheetId::_RemoveUnknownSheet=true;
bool CSheetId::_DontHaveSheetKnowledge = false; bool CSheetId::_DontHaveSheetKnowledge = false;
std::map<std::string, uint32> CSheetId::_DevTypeNameToId;
std::vector<std::vector<std::string> > CSheetId::_DevSheetIdToName;
std::map<std::string, uint32> CSheetId::_DevSheetNameToId;
#define NL_TEMP_YUBO_NO_SOUND_SHEET_ID
#ifdef NL_TEMP_YUBO_NO_SOUND_SHEET_ID
namespace { bool a_NoSoundSheetId = false; const uint32 a_NoSoundSheetType = 80; }
#endif
const CSheetId CSheetId::Unknown(0); const CSheetId CSheetId::Unknown(0);
@ -101,8 +110,27 @@ CSheetId::CSheetId( const string& sheetName )
*this = Unknown; *this = Unknown;
} }
// nldebug("LIST_SHEET_ID: %s (%s)", toString().c_str(), sheetName.c_str());
} // CSheetId // } // CSheetId //
CSheetId::CSheetId( const std::string& sheetName, const std::string &defaultType )
{
// Don't use this function without defaultType, use the one above.
nlassert(defaultType.size() != 0);
if (sheetName.rfind('.') == std::string::npos)
{
std::string withType = sheetName + "." + defaultType;
*this = CSheetId(withType);
// nldebug("SHEETID: Constructing CSheetId from name '%s' without explicit type, defaulting as '%s' to '%s'", sheetName.c_str(), defaultType.c_str(), withType.c_str());
}
else
{
*this = CSheetId(sheetName);
}
}
//----------------------------------------------- //-----------------------------------------------
// Build // Build
@ -111,7 +139,46 @@ CSheetId::CSheetId( const string& sheetName )
bool CSheetId::buildSheetId(const std::string& sheetName) bool CSheetId::buildSheetId(const std::string& sheetName)
{ {
nlassert(_Initialised); nlassert(_Initialised);
nlassert(!_DontHaveSheetKnowledge);
// When no sheet_id.bin is loaded, use dynamically assigned IDs.
if (_DontHaveSheetKnowledge)
{
std::string sheetNameLc = toLower(sheetName);
std::map<std::string, uint32>::iterator it = _DevSheetNameToId.find(sheetNameLc);
if (it == _DevSheetNameToId.end())
{
// Create a new dynamic sheet ID.
// nldebug("SHEETID: Creating a dynamic sheet id for '%s'", sheetName.c_str());
std::string sheetType = CFile::getExtension(sheetNameLc);
std::string sheetName = CFile::getFilenameWithoutExtension(sheetNameLc);
std::map<std::string, uint32>::iterator tit = _DevTypeNameToId.find(sheetType);
uint32 typeId;
if (tit == _DevTypeNameToId.end())
{
_FileExtensions.push_back(sheetType);
_DevSheetIdToName.push_back(std::vector<std::string>());
typeId = _FileExtensions.size() - 1;
_DevTypeNameToId[sheetType] = typeId;
std::string unknownNewType = std::string("unknown." + sheetType);
_DevSheetIdToName[typeId].push_back(unknownNewType);
_Id.IdInfos.Type = typeId;
_Id.IdInfos.Id = _DevSheetIdToName[typeId].size() - 1;
_DevSheetNameToId[unknownNewType] = _Id.Id;
}
else
{
typeId = tit->second;
_Id.IdInfos.Type = typeId;
}
_DevSheetIdToName[typeId].push_back(sheetNameLc);
_Id.IdInfos.Id = _DevSheetIdToName[typeId].size() - 1;
// nldebug("SHEETID: Type %i, id %i, sheetid %i", _Id.IdInfos.Type, _Id.IdInfos.Id, _Id.Id);
_DevSheetNameToId[sheetNameLc] = _Id.Id;
return true;
}
_Id.Id = it->second;
return true;
}
// try looking up the sheet name in _SheetNameToId // try looking up the sheet name in _SheetNameToId
CStaticMap<CChar,uint32,CCharComp>::const_iterator itId; CStaticMap<CChar,uint32,CCharComp>::const_iterator itId;
@ -143,6 +210,26 @@ bool CSheetId::buildSheetId(const std::string& sheetName)
return true; return true;
} }
} }
#ifdef NL_TEMP_YUBO_NO_SOUND_SHEET_ID
if (a_NoSoundSheetId && sheetName.find(".sound") != std::string::npos)
{
std::string sheetNameLc = toLower(sheetName);
std::map<std::string, uint32>::iterator it = _DevSheetNameToId.find(sheetNameLc);
if (it == _DevSheetNameToId.end())
{
// nldebug("SHEETID: Creating a temporary sheet id for '%s'", sheetName.c_str());
_DevSheetIdToName[0].push_back(sheetName);
_Id.IdInfos.Type = a_NoSoundSheetType;
_Id.IdInfos.Id = _DevSheetIdToName[0].size() - 1;
_DevSheetNameToId[sheetNameLc] = _Id.Id;
return true;
}
_Id.Id = it->second;
return true;
}
#endif
return false; return false;
} }
@ -283,7 +370,11 @@ void CSheetId::init(bool removeUnknownSheet)
{ {
// allow multiple calls to init in case libraries depending on sheetid call this init from their own // allow multiple calls to init in case libraries depending on sheetid call this init from their own
if (_Initialised) if (_Initialised)
{
if (_DontHaveSheetKnowledge)
nlinfo("SHEETID: CSheetId is already initialized without sheet_id.bin");
return; return;
}
// CFile::addFileChangeCallback ("sheet_id.bin", cbFileChange); // CFile::addFileChangeCallback ("sheet_id.bin", cbFileChange);
@ -292,13 +383,40 @@ void CSheetId::init(bool removeUnknownSheet)
loadSheetId (); loadSheetId ();
_Initialised=true; _Initialised=true;
#ifdef NL_TEMP_YUBO_NO_SOUND_SHEET_ID
if (typeFromFileExtension("sound") == std::numeric_limits<uint32>::max())
{
nlwarning("SHEETID: Loading without known sound sheet id, please update sheet_id.bin with .sound sheets");
nlassert(_FileExtensions.size() == 1 << (NL_SHEET_ID_TYPE_BITS));
nlassert(_FileExtensions[a_NoSoundSheetType].empty());
_FileExtensions[a_NoSoundSheetType] == "sound";
_DevSheetIdToName.push_back(std::vector<std::string>());
_DevSheetIdToName[0].push_back("unknown.sound");
TSheetId id;
id.IdInfos.Type = a_NoSoundSheetType;
id.IdInfos.Id = _DevSheetIdToName[0].size() - 1;
nlassert(id.IdInfos.Id == 0);
_DevSheetNameToId["unknown.sound"] = id.Id;
a_NoSoundSheetId = true;
}
#endif
} // init // } // init //
void CSheetId::initWithoutSheet() void CSheetId::initWithoutSheet()
{ {
if (_Initialised)
{
nlassert(_DontHaveSheetKnowledge);
return;
}
_Initialised = true; _Initialised = true;
_DontHaveSheetKnowledge = true; _DontHaveSheetKnowledge = true;
// Initialize id 0,0 as unknown.unknown
CSheetId unknownunknown = CSheetId("unknown.unknown");
nlassert(unknownunknown == CSheetId::Unknown);
} }
@ -310,6 +428,10 @@ void CSheetId::initWithoutSheet()
void CSheetId::uninit() void CSheetId::uninit()
{ {
delete [] _AllStrings.Ptr; delete [] _AllStrings.Ptr;
_FileExtensions.clear();
_DevTypeNameToId.clear();
_DevSheetIdToName.clear();
_DevSheetNameToId.clear();
} // uninit // } // uninit //
//----------------------------------------------- //-----------------------------------------------
@ -343,23 +465,12 @@ CSheetId& CSheetId::operator=( const CSheetId& sheetId )
//----------------------------------------------- //-----------------------------------------------
CSheetId& CSheetId::operator=( const string& sheetName ) CSheetId& CSheetId::operator=( const string& sheetName )
{ {
nlassert(_Initialised);
nlassert(!_DontHaveSheetKnowledge);
CStaticMap<CChar,uint32,CCharComp>::const_iterator itId; if (!buildSheetId(sheetName))
CChar c; *this = Unknown;
c.Ptr = new char [sheetName.size()+1];
strcpy(c.Ptr, sheetName.c_str()); // nldebug("LIST_SHEET_ID: %s (%s)", toString().c_str(), sheetName.c_str());
toLower(c.Ptr);
itId = _SheetNameToId.find (c);
delete [] c.Ptr;
if( itId != _SheetNameToId.end() )
{
_Id.Id = (*itId).second;
return *this;
}
*this = Unknown;
return *this; return *this;
} // operator= // } // operator= //
@ -407,6 +518,13 @@ bool CSheetId::operator < (const CSheetId& sheetRef ) const
string CSheetId::toString(bool ifNotFoundUseNumericId) const string CSheetId::toString(bool ifNotFoundUseNumericId) const
{ {
if (!_Initialised) init(false); if (!_Initialised) init(false);
if (_DontHaveSheetKnowledge)
{
// FIXME: When someone punches in a fake sheet id this will
// fail.
return _DevSheetIdToName[_Id.IdInfos.Type][_Id.IdInfos.Id];
}
CStaticMap<uint32,CChar>::const_iterator itStr = _SheetIdToName.find (_Id.Id); CStaticMap<uint32,CChar>::const_iterator itStr = _SheetIdToName.find (_Id.Id);
if( itStr != _SheetIdToName.end() ) if( itStr != _SheetIdToName.end() )
@ -415,6 +533,12 @@ string CSheetId::toString(bool ifNotFoundUseNumericId) const
} }
else else
{ {
#ifdef NL_TEMP_YUBO_NO_SOUND_SHEET_ID
if (a_NoSoundSheetId && _Id.IdInfos.Type == a_NoSoundSheetType)
{
return _DevSheetIdToName[0][_Id.IdInfos.Id];
}
#endif
// This nlwarning is commented out because the loggers are mutexed, therefore // This nlwarning is commented out because the loggers are mutexed, therefore
// you couldn't use toString() within a nlwarning(). // you couldn't use toString() within a nlwarning().
//nlwarning("<CSheetId::toString> The sheet %08x is not in sheet_id.bin",_Id.Id); //nlwarning("<CSheetId::toString> The sheet %08x is not in sheet_id.bin",_Id.Id);
@ -432,6 +556,8 @@ string CSheetId::toString(bool ifNotFoundUseNumericId) const
void CSheetId::serial(NLMISC::IStream &f) throw(NLMISC::EStream) void CSheetId::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
{ {
nlassert(!_DontHaveSheetKnowledge);
f.serial( _Id.Id ); f.serial( _Id.Id );
#ifdef NL_DEBUG_SHEET_ID #ifdef NL_DEBUG_SHEET_ID
@ -443,6 +569,24 @@ void CSheetId::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
#endif #endif
} }
void CSheetId::serialString(NLMISC::IStream &f, const std::string &defaultType) throw(NLMISC::EStream)
{
nlassert(_Initialised);
if (f.isReading())
{
std::string sheetName;
f.serial(sheetName);
*this = CSheetId(sheetName, defaultType);
}
else
{
// if this assert fails, you may be using an outdated id bin
nlassert(*this != CSheetId::Unknown);
std::string sheetName = toString();
f.serial(sheetName);
}
}
//----------------------------------------------- //-----------------------------------------------

@ -32,9 +32,262 @@
#include "nel/misc/time_nl.h" #include "nel/misc/time_nl.h"
#include "nel/misc/sstring.h" #include "nel/misc/sstring.h"
#include <nel/misc/thread.h>
namespace NLMISC namespace NLMISC
{ {
namespace {
#ifdef NL_OS_WINDOWS
bool a_HaveQueryPerformance = false;
LARGE_INTEGER a_QueryPerformanceFrequency;
#endif
#ifdef NL_OS_UNIX
# if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0)
# if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK >= 0)
# define NL_MONOTONIC_CLOCK
# endif
# endif
# ifdef NL_MONOTONIC_CLOCK
bool a_CheckedMonotonicClock = false;
bool a_HasMonotonicClock = false;
uint64 a_MonotonicClockFrequency = 0;
uint64 a_MonotonicClockResolutionNs = 0;
bool hasMonotonicClock()
{
if (!a_CheckedMonotonicClock)
{
/* Initialize the local time engine.
* On Unix, this method will find out if the Monotonic Clock is supported
* (seems supported by kernel 2.6, not by kernel 2.4). See getLocalTime().
*/
struct timespec tv;
if ((clock_gettime( CLOCK_MONOTONIC, &tv ) == 0) &&
(clock_getres( CLOCK_MONOTONIC, &tv ) == 0))
{
// nldebug( "Monotonic local time supported (resolution %.6f ms)", ((float)tv.tv_sec)*1000.0f + ((float)tv.tv_nsec)/1000000.0f );
if (tv.tv_sec > 0)
{
nlwarning("Monotonic clock not ok, resolution > 1s");
a_HasMonotonicClock = false;
}
else
{
uint64 nsPerTick = tv.tv_nsec;
uint64 nsPerSec = 1000000000L;
uint64 tickPerSec = nsPerSec / nsPerTick;
a_MonotonicClockFrequency = tickPerSec;
a_MonotonicClockResolutionNs = nsPerTick;
a_HasMonotonicClock = true;
}
}
else
{
a_HasMonotonicClock = false;
}
a_CheckedMonotonicClock = true;
}
return a_HasMonotonicClock;
}
# endif
#endif
}
void CTime::probeTimerInfo(CTime::CTimerInfo &result)
{
breakable
{
#ifdef NL_OS_WINDOWS
LARGE_INTEGER winPerfFreq;
LARGE_INTEGER winPerfCount;
DWORD lowResTime;
if (!QueryPerformanceFrequency(&winPerfFreq))
{
nldebug("Cannot query performance frequency");
result.IsHighPrecisionAvailable = false;
}
else
{
result.HighPrecisionResolution = winPerfFreq.QuadPart;
}
if (winPerfFreq.QuadPart == 1000)
{
nldebug("Higher precision timer not available, OS defaulted to GetTickCount");
result.IsHighPrecisionAvailable = false;
}
if (!QueryPerformanceCounter(&winPerfCount))
{
nldebug("Cannot query performance counter");
result.IsHighPrecisionAvailable = false;
result.HighPrecisionResolution = 1000;
}
a_HaveQueryPerformance = result.IsHighPrecisionAvailable;
a_QueryPerformanceFrequency.QuadPart = winPerfFreq.QuadPart;
if (!result.IsHighPrecisionAvailable)
{
lowResTime = timeGetTime();
}
#else
// Other platforms are awesome. Generic implementation for now.
TTime localTime = getLocalTime();
result.IsHighPrecisionAvailable = true;
result.HighPrecisionResolution = 0;
# ifdef NL_MONOTONIC_CLOCK
timespec monoClock;
if (hasMonotonicClock())
{
clock_gettime(CLOCK_MONOTONIC, &monoClock);
result.HighPrecisionResolution = a_MonotonicClockFrequency;
}
else
{
nldebug("Monotonic clock not available");
}
# endif
#endif
uint64 cpuMask = IProcess::getCurrentProcess()->getCPUMask();
#ifdef NL_OS_WINDOWS
uint64 threadMask = IThread::getCurrentThread()->getCPUMask(); // broken on linux, don't expect it to work anywhere
#else
uint64 threadMask = cpuMask;
#endif
uint identical = 0; // Identical stamps may indicate the os handling backwards glitches.
uint backwards = 0; // Happens when the timers are not always in sync and the implementation is faulty.
uint regular = 0; // How many times the number advanced normally.
uint skipping = 0; // Does not really mean anything necessarily.
uint frequencybug = 0; // Should never happen.
// uint badcore = 0; // Affinity does not work.
// Cycle 32 times trough all cores, and verify if the timing remains consistent.
for (uint i = 32; i; --i)
{
uint64 currentBit = 1;
for (uint j = 64; j; --j)
{
if (cpuMask & currentBit)
{
#ifdef NL_OS_WINDOWS
if (!IThread::getCurrentThread()->setCPUMask(currentBit))
#else
if (!IProcess::getCurrentProcess()->setCPUMask(currentBit))
#endif
break; // Thread was set to last cpu.
#ifdef NL_OS_WINDOWS
// Make sure the thread is rescheduled.
SwitchToThread();
Sleep(0);
// Verify the core
/* Can only verify on 2003, Vista and higher.
if (1 << GetCurrentProcessorNumber() != currentBit)
++badcore;
*/
// Check if the timer is still sane.
if (result.IsHighPrecisionAvailable)
{
LARGE_INTEGER winPerfFreqN;
LARGE_INTEGER winPerfCountN;
QueryPerformanceFrequency(&winPerfFreqN);
if (winPerfFreqN.QuadPart != winPerfFreq.QuadPart)
++frequencybug;
QueryPerformanceCounter(&winPerfCountN);
if (winPerfCountN.QuadPart == winPerfCount.QuadPart)
++identical;
if (winPerfCountN.QuadPart < winPerfCount.QuadPart || winPerfCountN.QuadPart - winPerfCount.QuadPart < 0)
++backwards;
if (winPerfCountN.QuadPart - winPerfCount.QuadPart > winPerfFreq.QuadPart / 20) // 50ms skipping check
++skipping;
else if (winPerfCountN.QuadPart > winPerfCount.QuadPart)
++regular;
winPerfCount.QuadPart = winPerfCountN.QuadPart;
}
else
{
DWORD lowResTimeN;
lowResTimeN = timeGetTime();
if (lowResTimeN == lowResTime)
++identical;
if (lowResTimeN < lowResTime || lowResTimeN - lowResTime < 0)
++backwards;
if (lowResTimeN - lowResTime > 50)
++skipping;
else if (lowResTimeN > lowResTime)
++regular;
lowResTime = lowResTimeN;
}
#else
#ifdef NL_OS_UNIX
sched_yield();
#else
nlSleep(0);
#endif
# ifdef NL_MONOTONIC_CLOCK
if (hasMonotonicClock())
{
timespec monoClockN;
clock_gettime(CLOCK_MONOTONIC, &monoClockN);
if (monoClock.tv_sec == monoClockN.tv_sec && monoClock.tv_nsec == monoClockN.tv_nsec)
++identical;
if (monoClockN.tv_sec < monoClock.tv_sec || (monoClock.tv_sec == monoClockN.tv_sec && monoClockN.tv_nsec < monoClock.tv_nsec))
++backwards;
if (monoClock.tv_sec == monoClockN.tv_sec && (monoClockN.tv_nsec - monoClock.tv_nsec > 50000000L))
++skipping;
else if ((monoClock.tv_sec == monoClockN.tv_sec && monoClock.tv_nsec < monoClockN.tv_nsec) || monoClock.tv_sec < monoClockN.tv_sec)
++regular;
monoClock.tv_sec = monoClockN.tv_sec;
monoClock.tv_nsec = monoClockN.tv_nsec;
}
else
# endif
{
TTime localTimeN = getLocalTime();
if (localTimeN == localTime)
++identical;
if (localTimeN < localTime || localTimeN - localTime < 0)
++backwards;
if (localTimeN - localTime > 50)
++skipping;
else if (localTimeN > localTime)
++regular;
localTime = localTimeN;
}
#endif
}
currentBit <<= 1;
}
}
#ifdef NL_OS_WINDOWS
IThread::getCurrentThread()->setCPUMask(threadMask);
#else
IProcess::getCurrentProcess()->setCPUMask(threadMask);
#endif
nldebug("Timer resolution: %i Hz", (int)(result.HighPrecisionResolution));
nldebug("Time identical: %i, backwards: %i, regular: %i, skipping: %i, frequency bug: %i", identical, backwards, regular, skipping, frequencybug);
if (identical > regular)
nlwarning("The system timer is of relatively low resolution, you may experience issues");
if (backwards > 0 || frequencybug > 0)
{
nlwarning("The current system timer is not reliable across multiple cpu cores");
result.RequiresSingleCore = true;
}
else result.RequiresSingleCore = false;
if (result.HighPrecisionResolution == 14318180)
nldebug("Detected known HPET era timer frequency");
if (result.HighPrecisionResolution == 3579545)
nldebug("Detected known AHCI era timer frequency");
if (result.HighPrecisionResolution == 1193182)
nldebug("Detected known i8253/i8254 era timer frequency");
}
}
/* Return the number of second since midnight (00:00:00), January 1, 1970, /* Return the number of second since midnight (00:00:00), January 1, 1970,
* coordinated universal time, according to the system clock. * coordinated universal time, according to the system clock.
* This values is the same on all computer if computers are synchronized (with NTP for example). * This values is the same on all computer if computers are synchronized (with NTP for example).
@ -97,54 +350,42 @@ TTime CTime::getLocalTime ()
//else //else
//{ //{
// This is not affected by system time changes. But it cycles every 49 days. // This is not affected by system time changes. But it cycles every 49 days.
return timeGetTime(); // return timeGetTime(); // Only this was left active before it was commented.
//} //}
#elif defined (NL_OS_UNIX) /*
* The above is no longer relevant.
*/
static bool initdone = false; if (a_HaveQueryPerformance)
static bool isMonotonicClockSupported = false;
if ( ! initdone )
{ {
// On a (fast) 15MHz timer this rolls over after 7000 days.
#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) // If my calculations are right.
#if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK >= 0) LARGE_INTEGER counter;
QueryPerformanceCounter(&counter);
/* Initialize the local time engine. counter.QuadPart *= (LONGLONG)1000L;
* On Unix, this method will find out if the Monotonic Clock is supported counter.QuadPart /= a_QueryPerformanceFrequency.QuadPart;
* (seems supported by kernel 2.6, not by kernel 2.4). See getLocalTime(). return counter.QuadPart;
*/
struct timespec tv;
if ( (clock_gettime( CLOCK_MONOTONIC, &tv ) == 0) &&
(clock_getres( CLOCK_MONOTONIC, &tv ) == 0) )
{
// nldebug( "Monotonic local time supported (resolution %.6f ms)", ((float)tv.tv_sec)*1000.0f + ((float)tv.tv_nsec)/1000000.0f );
isMonotonicClockSupported = true;
}
else
#endif
#endif
{
// nlwarning( "Monotonic local time not supported, caution with time sync" );
}
initdone = true;
} }
else
{
// Use default reliable low resolution timer.
return timeGetTime();
}
#elif defined (NL_OS_UNIX)
#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) #ifdef NL_MONOTONIC_CLOCK
#if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK >= 0)
if ( isMonotonicClockSupported ) if (hasMonotonicClock())
{ {
struct timespec tv; timespec tv;
// This is not affected by system time changes. // This is not affected by system time changes.
if ( clock_gettime( CLOCK_MONOTONIC, &tv ) != 0 ) if ( clock_gettime( CLOCK_MONOTONIC, &tv ) != 0 )
nlerror ("Can't get clock time again"); nlerror ("Can't get clock time again");
return (TTime)tv.tv_sec * (TTime)1000 + (TTime)((tv.tv_nsec/*+500*/) / 1000000); return (TTime)tv.tv_sec * (TTime)1000 + (TTime)((tv.tv_nsec/*+500*/) / 1000000);
} }
#endif
#endif #endif
// This is affected by system time changes. // This is affected by system time changes.
@ -156,7 +397,6 @@ TTime CTime::getLocalTime ()
#endif #endif
} }
/* Return the time in processor ticks. Use it for profile purpose. /* Return the time in processor ticks. Use it for profile purpose.
* If the performance time is not supported on this hardware, it returns 0. * If the performance time is not supported on this hardware, it returns 0.
* \warning On a multiprocessor system, the value returned by each processor may * \warning On a multiprocessor system, the value returned by each processor may
@ -183,7 +423,7 @@ TTicks CTime::getPerformanceTime ()
return (hi << 32) | (lo & 0xffffffff); return (hi << 32) | (lo & 0xffffffff);
#elif defined(HAVE_X86) and !defined(NL_OS_MAC) #elif defined(HAVE_X86) and !defined(NL_OS_MAC)
uint64 x; uint64 x;
// RDTSC - Read time-stamp counter into EDX:EAX. // RDTSC - Read time-stamp counter into EDX:EAX.
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
return x; return x;
#else // HAVE_X86 #else // HAVE_X86

@ -23,6 +23,7 @@
#include "nel/misc/command.h" #include "nel/misc/command.h"
#include "nel/misc/file.h" #include "nel/misc/file.h"
#include "nel/misc/path.h" #include "nel/misc/path.h"
#include "nel/misc/sheet_id.h"
#include "nel/georges/u_form_loader.h" #include "nel/georges/u_form_loader.h"
#include "nel/georges/u_form_elm.h" #include "nel/georges/u_form_elm.h"
@ -467,7 +468,7 @@ void CAudioMixerUser::initDevice(const std::string &deviceName, const CInitInfo
nlwarning("AM: OptionSoftwareBuffer not available, forceSoftwareBuffer = false"); nlwarning("AM: OptionSoftwareBuffer not available, forceSoftwareBuffer = false");
forceSoftware = false; // not really needed, but set anyway in case this is still used later in this function forceSoftware = false; // not really needed, but set anyway in case this is still used later in this function
} }
if (manualRolloff && !_SoundDriver->getOption(ISoundDriver::OptionLocalBufferCopy)) if (manualRolloff && !_SoundDriver->getOption(ISoundDriver::OptionManualRolloff))
{ {
nlwarning("AM: OptionManualRolloff not available, manualRolloff = false"); nlwarning("AM: OptionManualRolloff not available, manualRolloff = false");
manualRolloff = false; // not really needed, but set anyway in case this is still used later in this function manualRolloff = false; // not really needed, but set anyway in case this is still used later in this function
@ -970,10 +971,14 @@ void CAudioMixerUser::buildSampleBankList()
/// Build the sound bank packed sheets file from georges sound sheet files with .sound extension in the search path, and return the path to the written file. /// Build the sound bank packed sheets file from georges sound sheet files with .sound extension in the search path, and return the path to the written file.
std::string UAudioMixer::buildSoundBank(const std::string &packedSheetDir) std::string UAudioMixer::buildSoundBank(const std::string &packedSheetDir)
{ {
CGroupControllerRoot *tempRoot = NULL;
if (!CGroupControllerRoot::isInitialized())
tempRoot = new CGroupControllerRoot();
std::string dir = CPath::standardizePath(packedSheetDir, true); std::string dir = CPath::standardizePath(packedSheetDir, true);
CSoundBank *soundBank = new CSoundBank(); CSoundBank *soundBank = new CSoundBank();
soundBank->load(dir, true); soundBank->load(dir, true);
delete soundBank; delete soundBank;
delete tempRoot;
return dir + "sounds.packed_sheets"; return dir + "sounds.packed_sheets";
} }
@ -1049,9 +1054,8 @@ public:
for (uint i=0; i<size; ++i) for (uint i=0; i<size; ++i)
{ {
items->getArrayValue(soundName, i); items->getArrayValue(soundName, i);
soundName = soundName.substr(0, soundName.find(".sound")); nlassert(soundName.find(".sound") != std::string::npos);
cs.SoundNames.push_back(CSheetId(soundName));
cs.SoundNames.push_back(CStringMapper::map(soundName));
} }
if (!cs.SoundNames.empty()) if (!cs.SoundNames.empty())
@ -1101,7 +1105,7 @@ void CAudioMixerUser::initUserVar()
TUserVarControlsContainer::iterator first(_UserVarControls.begin()), last(_UserVarControls.end()); TUserVarControlsContainer::iterator first(_UserVarControls.begin()), last(_UserVarControls.end());
for(; first != last; ++first) for(; first != last; ++first)
{ {
std::vector<NLMISC::TStringId>::iterator first2(first->second.SoundNames.begin()), last2(first->second.SoundNames.end()); std::vector<NLMISC::CSheetId>::iterator first2(first->second.SoundNames.begin()), last2(first->second.SoundNames.end());
for (; first2 != last2; ++first2) for (; first2 != last2; ++first2)
{ {
CSound *sound = getSoundId(*first2); CSound *sound = getSoundId(*first2);
@ -1132,7 +1136,7 @@ void CAudioMixerUser::CControledSources::serial(NLMISC::IStream &s)
for (uint i=0; i<size; ++i) for (uint i=0; i<size; ++i)
{ {
s.serial(soundName); s.serial(soundName);
SoundNames.push_back(CStringMapper::map(soundName)); SoundNames.push_back(CSheetId(soundName, "sound"));
} }
} }
else else
@ -1146,7 +1150,7 @@ void CAudioMixerUser::CControledSources::serial(NLMISC::IStream &s)
for (uint i=0; i<size; ++i) for (uint i=0; i<size; ++i)
{ {
soundName = CStringMapper::unmap(SoundNames[i]); soundName = SoundNames[i].toString();;
s.serial(soundName); s.serial(soundName);
} }
} }
@ -1780,7 +1784,7 @@ void CAudioMixerUser::update()
// ****************************************************************** // ******************************************************************
TSoundId CAudioMixerUser::getSoundId( const NLMISC::TStringId &name ) TSoundId CAudioMixerUser::getSoundId( const NLMISC::CSheetId &name )
{ {
return _SoundBank->getSound(name); return _SoundBank->getSound(name);
} }
@ -1894,7 +1898,7 @@ retrySound:
if (invalid) if (invalid)
{ {
nlwarning("The sound %s contain an infinite recursion !", CStringMapper::unmap(id->getName()).c_str()); nlwarning("The sound %s contain an infinite recursion !", id->getName().toString().c_str()/*CStringMapper::unmap(id->getName()).c_str()*/);
return NULL; return NULL;
} }
@ -2035,7 +2039,7 @@ retrySound:
// ****************************************************************** // ******************************************************************
USource *CAudioMixerUser::createSource( const NLMISC::TStringId &name, bool spawn, TSpawnEndCallback cb, void *userParam, NL3D::CCluster *cluster, CSoundContext *context, UGroupController *groupController) USource *CAudioMixerUser::createSource( const NLMISC::CSheetId &name, bool spawn, TSpawnEndCallback cb, void *userParam, NL3D::CCluster *cluster, CSoundContext *context, UGroupController *groupController)
{ {
return createSource( getSoundId( name ), spawn, cb, userParam, cluster, context, groupController); return createSource( getSoundId( name ), spawn, cb, userParam, cluster, context, groupController);
} }
@ -2162,7 +2166,7 @@ bool CAudioMixerUser::unloadSampleBank(const std::string &name)
// ****************************************************************** // ******************************************************************
void CAudioMixerUser::getSoundNames( std::vector<NLMISC::TStringId> &names ) const void CAudioMixerUser::getSoundNames( std::vector<NLMISC::CSheetId> &names ) const
{ {
_SoundBank->getNames(names); _SoundBank->getNames(names);
} }
@ -2312,7 +2316,6 @@ void CAudioMixerUser::getLoadedSampleBankInfo(std::vector<std::pair<std::strin
} }
void CAudioMixerUser::setListenerPos (const NLMISC::CVector &pos) void CAudioMixerUser::setListenerPos (const NLMISC::CVector &pos)
{ {
_Listener.setPos(pos); _Listener.setPos(pos);

@ -84,7 +84,8 @@ void CBackgroundSound::importForm(const std::string& filename, NLGEORGES::UFormE
// Read the sound name. // Read the sound name.
std::string soundName; std::string soundName;
psoundItem->getValueByName(soundName, "Sound"); psoundItem->getValueByName(soundName, "Sound");
sound.SoundName = CStringMapper::map(CFile::getFilenameWithoutExtension(soundName)); nlassert(soundName.find(".sound") != std::string::npos);
sound.SoundName = NLMISC::CSheetId(soundName);
// Read the environnement flag. // Read the environnement flag.
@ -133,7 +134,7 @@ void CBackgroundSound::getSubSoundList(std::vector<std::pair<std::string, CSound
for (; first != last; ++first) for (; first != last; ++first)
{ {
CSound *sound = mixer->getSoundId(first->SoundName); CSound *sound = mixer->getSoundId(first->SoundName);
subsounds.push_back(make_pair(CStringMapper::unmap(first->SoundName), sound)); subsounds.push_back(make_pair(first->SoundName.toString()/*CStringMapper::unmap(first->SoundName)*/, sound));
} }
} }

@ -86,7 +86,7 @@ void CBackgroundSoundManager::addSound(const std::string &soundName, uint layerI
CAudioMixerUser *mixer = CAudioMixerUser::instance(); CAudioMixerUser *mixer = CAudioMixerUser::instance();
TSoundData sd; TSoundData sd;
sd.SoundName = CStringMapper::map(soundName); sd.SoundName = NLMISC::CSheetId(soundName, "sound"); // note: loaded from .primitive
sd.Sound = mixer->getSoundId(sd.SoundName); sd.Sound = mixer->getSoundId(sd.SoundName);
sd.Source = 0; sd.Source = 0;
@ -133,7 +133,7 @@ void CBackgroundSoundManager::addSound(const std::string &soundName, uint layerI
} }
else else
{ {
nlwarning ("The sound '%s' can't be loaded", CStringMapper::unmap(sd.SoundName).c_str()); nlwarning ("The sound '%s' can't be loaded", sd.SoundName.toString().c_str()/*CStringMapper::unmap(sd.SoundName).c_str()*/);
} }
} }
@ -1431,21 +1431,15 @@ void CBackgroundSoundManager::TBanksData::serial(NLMISC::IStream &s)
void CBackgroundSoundManager::TSoundData::serial(NLMISC::IStream &s) void CBackgroundSoundManager::TSoundData::serial(NLMISC::IStream &s)
{ {
std::string str; //std::string str;
SoundName.serialString(s, "sound");
if (s.isReading()) if (s.isReading())
{ {
CAudioMixerUser *mixer = CAudioMixerUser::instance(); CAudioMixerUser *mixer = CAudioMixerUser::instance();
s.serial(str);
SoundName = NLMISC::CStringMapper::map(str);
Sound = mixer->getSoundId(SoundName); Sound = mixer->getSoundId(SoundName);
Source = NULL; Source = NULL;
Selected = false; Selected = false;
} }
else
{
s.serial(const_cast<std::string&>(NLMISC::CStringMapper::unmap(SoundName)));
}
s.serial(MinBox); s.serial(MinBox);
s.serial(MaxBox); s.serial(MaxBox);
s.serial(Surface); s.serial(Surface);

@ -70,7 +70,7 @@ float EAX_MATERIAL_PARAM[] =
class CSoundGroupSerializer class CSoundGroupSerializer
{ {
public: public:
std::vector<std::pair<NLMISC::TStringId, NLMISC::TStringId> > _SoundGroupAssoc; std::vector<std::pair<NLMISC::TStringId, NLMISC::CSheetId> > _SoundGroupAssoc;
// load the values using the george sheet (called by GEORGE::loadForm) // load the values using the george sheet (called by GEORGE::loadForm)
void readGeorges (const NLMISC::CSmartPtr<NLGEORGES::UForm> &form, const std::string &/* name */) void readGeorges (const NLMISC::CSmartPtr<NLGEORGES::UForm> &form, const std::string &/* name */)
@ -95,15 +95,9 @@ public:
item->getValueByName(soundGroup, ".SoundGroup"); item->getValueByName(soundGroup, ".SoundGroup");
item->getValueByName(sound, ".Sound"); item->getValueByName(sound, ".Sound");
string::size_type n = sound.rfind(".sound"); nlassert(sound.find(".sound") != std::string::npos);
if (n != string::npos) _SoundGroupAssoc.push_back(make_pair(CStringMapper::map(soundGroup), CSheetId(sound)));
{
// remove the tailing .sound
sound = sound.substr(0, n);
}
_SoundGroupAssoc.push_back(make_pair(CStringMapper::map(soundGroup), CStringMapper::map(sound)));
} }
} }
catch(...) catch(...)
@ -125,24 +119,18 @@ public:
{ {
if (s.isReading()) if (s.isReading())
{ {
std::string soundGroup; TStringId soundGroup;
std::string sound; CSheetId sound;
s.serial(soundGroup); CStringMapper::serialString(s, soundGroup);
s.serial(sound); sound.serialString(s, "sound");
_SoundGroupAssoc.push_back(make_pair(CStringMapper::map(soundGroup), CStringMapper::map(sound))); _SoundGroupAssoc.push_back(make_pair(soundGroup, sound));
} }
else else
{ {
std::string soundGroup; CStringMapper::serialString(s, _SoundGroupAssoc[i].first);
std::string sound; _SoundGroupAssoc[i].second.serialString(s, "sound");
soundGroup = CStringMapper::unmap(_SoundGroupAssoc[i].first);
sound = CStringMapper::unmap(_SoundGroupAssoc[i].second);
s.serial(soundGroup);
s.serial(sound);
} }
} }
} }
@ -289,10 +277,10 @@ void CClusteredSound::update(const CVector &listenerPos, const CVector &/* view
// nldebug("Searching sound assoc for group [%s]", CStringMapper::unmap(soundGroup).c_str()); // nldebug("Searching sound assoc for group [%s]", CStringMapper::unmap(soundGroup).c_str());
TStringStringMap::iterator it2(_SoundGroupToSound.find(soundGroup)); TStringSheetMap::iterator it2(_SoundGroupToSound.find(soundGroup));
if (it2 != _SoundGroupToSound.end()) if (it2 != _SoundGroupToSound.end())
{ {
NLMISC::TStringId soundName = it2->second; NLMISC::CSheetId soundName = it2->second;
CClusterSound cs; CClusterSound cs;
// nldebug("Found the sound [%s] for sound group [%s]", CStringMapper::unmap(soundName).c_str(), CStringMapper::unmap(soundGroup).c_str()); // nldebug("Found the sound [%s] for sound group [%s]", CStringMapper::unmap(soundName).c_str(), CStringMapper::unmap(soundGroup).c_str());

@ -19,6 +19,7 @@
#include "nel/misc/path.h" #include "nel/misc/path.h"
#include "nel/misc/common.h" #include "nel/misc/common.h"
#include "nel/sound/audio_mixer_user.h" #include "nel/sound/audio_mixer_user.h"
#include "nel/misc/sheet_id.h"
using namespace std; using namespace std;
using namespace NLMISC; using namespace NLMISC;
@ -63,11 +64,11 @@ void CComplexSound::parseSequence(const std::string &str, std::vector<uint32> &s
void CComplexSound::getSubSoundList(std::vector<std::pair<std::string, CSound*> > &subsounds) const void CComplexSound::getSubSoundList(std::vector<std::pair<std::string, CSound*> > &subsounds) const
{ {
CAudioMixerUser *mixer = CAudioMixerUser::instance(); CAudioMixerUser *mixer = CAudioMixerUser::instance();
std::vector<NLMISC::TStringId>::const_iterator first(_Sounds.begin()), last(_Sounds.end()); std::vector<NLMISC::CSheetId>::const_iterator first(_Sounds.begin()), last(_Sounds.end());
for (; first != last; ++first) for (; first != last; ++first)
{ {
CSound *sound = mixer->getSoundId(*first); CSound *sound = mixer->getSoundId(*first);
subsounds.push_back(make_pair(CStringMapper::unmap(*first), sound)); subsounds.push_back(make_pair((*first).toString()/*CStringMapper::unmap(*first)*/, sound));
} }
} }
@ -83,7 +84,7 @@ uint32 CComplexSound::getDuration()
CAudioMixerUser *mixer = CAudioMixerUser::instance(); CAudioMixerUser *mixer = CAudioMixerUser::instance();
vector<sint32> durations; vector<sint32> durations;
std::vector<NLMISC::TStringId>::iterator first(_Sounds.begin()), last(_Sounds.end()); std::vector<NLMISC::CSheetId>::iterator first(_Sounds.begin()), last(_Sounds.end());
for (; first != last; ++first) for (; first != last; ++first)
{ {
CSound *sound = mixer->getSoundId(*first); CSound *sound = mixer->getSoundId(*first);
@ -204,7 +205,7 @@ float CComplexSound::getMaxDistance() const
CComplexSound *This = const_cast<CComplexSound*>(this); CComplexSound *This = const_cast<CComplexSound*>(this);
This->_MaxDist = 0.0f; This->_MaxDist = 0.0f;
std::vector<NLMISC::TStringId>::const_iterator first(_Sounds.begin()), last(_Sounds.end()); std::vector<NLMISC::CSheetId>::const_iterator first(_Sounds.begin()), last(_Sounds.end());
for (; first != last; ++first) for (; first != last; ++first)
{ {
@ -236,7 +237,7 @@ void CComplexSound::serial(NLMISC::IStream &s)
{ {
std::string name; std::string name;
s.serial(name); s.serial(name);
_Sounds.push_back(CStringMapper::map(name)); _Sounds.push_back(NLMISC::CSheetId(name, "sound"));
} }
} }
else else
@ -245,7 +246,7 @@ void CComplexSound::serial(NLMISC::IStream &s)
s.serial(nb); s.serial(nb);
for (uint i=0; i<nb; ++i) for (uint i=0; i<nb; ++i)
{ {
std::string name = CStringMapper::unmap(_Sounds[i]); std::string name = _Sounds[i].toString();
s.serial(name); s.serial(name);
} }
} }
@ -300,8 +301,8 @@ void CComplexSound::importForm(const std::string& filename, NLGEORGES::UFormElm&
string soundname; string soundname;
if (psoundsArray->getArrayValue(soundname, i)) if (psoundsArray->getArrayValue(soundname, i))
{ {
soundname = CFile::getFilenameWithoutExtension(soundname); nlassert(soundname.find(".sound") != std::string::npos);
_Sounds.push_back(CStringMapper::map(soundname)); _Sounds.push_back(NLMISC::CSheetId(soundname));
} }
} }
} }

@ -28,7 +28,8 @@ namespace NLSOUND
CComplexSource::CComplexSource (CComplexSound *soundPattern, bool spawn, TSpawnEndCallback cb, void *cbUserParam, NL3D::CCluster *cluster, CGroupController *groupController) CComplexSource::CComplexSource (CComplexSound *soundPattern, bool spawn, TSpawnEndCallback cb, void *cbUserParam, NL3D::CCluster *cluster, CGroupController *groupController)
: CSourceCommon(soundPattern, spawn, cb, cbUserParam, cluster, groupController), : CSourceCommon(soundPattern, spawn, cb, cbUserParam, cluster, groupController),
_Source1(NULL), _Source1(NULL),
_Source2(NULL) _Source2(NULL),
_Muted(false)
{ {
nlassert(soundPattern->getSoundType() == CSound::SOUND_COMPLEX); nlassert(soundPattern->getSoundType() == CSound::SOUND_COMPLEX);
_PatternSound = static_cast<CComplexSound*>(soundPattern); _PatternSound = static_cast<CComplexSound*>(soundPattern);
@ -190,9 +191,9 @@ void CComplexSource::playStuf()
case CComplexSound::MODE_ALL_IN_ONE: case CComplexSound::MODE_ALL_IN_ONE:
{ {
// just spanw all the listed source. // just spanw all the listed source.
const std::vector<NLMISC::TStringId> &sounds = _PatternSound->getSounds(); const std::vector<NLMISC::CSheetId> &sounds = _PatternSound->getSounds();
std::vector<NLMISC::TStringId>::const_iterator first(sounds.begin()), last(sounds.end()); std::vector<NLMISC::CSheetId>::const_iterator first(sounds.begin()), last(sounds.end());
if (_AllSources.empty()) if (_AllSources.empty())
{ {
@ -524,7 +525,7 @@ void CComplexSource::onUpdate()
else else
{ {
// no sound after, just set an event at end of current sound to stop the complex sound. // no sound after, just set an event at end of current sound to stop the complex sound.
nldebug("Setting last event for sound %s in %u millisec.", CStringMapper::unmap(_Source1->getSound()->getName()).c_str(), _Source1->getSound()->getDuration()); nldebug("Setting last event for sound %s in %u millisec.", _Source1->getSound()->getName().toString().c_str()/*CStringMapper::unmap(_Source1->getSound()->getName()).c_str()*/, _Source1->getSound()->getDuration());
if (_PatternSound->doFadeOut()) if (_PatternSound->doFadeOut())
{ {
// set the event to begin fade out. // set the event to begin fade out.

@ -187,7 +187,7 @@ void CContextSound::init()
} }
else else
{ {
nlassertex(nbJoker < SoundContextNbArgs, ("Error will trying to play ContextSound '%s'", CStringMapper::unmap(_Name).c_str())); nlassertex(nbJoker < SoundContextNbArgs, ("Error will trying to play ContextSound '%s'", _Name.toString().c_str()/*CStringMapper::unmap(_Name).c_str()*/));
fromString(index, contextArgIndex[nbJoker++]); fromString(index, contextArgIndex[nbJoker++]);
parseArg = false; parseArg = false;
index = ""; index = "";
@ -195,13 +195,13 @@ void CContextSound::init()
} }
else if (*first == 'r') else if (*first == 'r')
{ {
nlassertex(useRandom == false, ("Error will trying to play ContextSound '%s'", CStringMapper::unmap(_Name).c_str())); nlassertex(useRandom == false, ("Error will trying to play ContextSound '%s'", _Name.toString().c_str()/*CStringMapper::unmap(_Name).c_str()*/));
useRandom = true; useRandom = true;
} }
} }
else if (*first == '%') else if (*first == '%')
{ {
nlassertex(useRandom == false, ("Error will trying to play ContextSound '%s'", CStringMapper::unmap(_Name).c_str())); nlassertex(useRandom == false, ("Error will trying to play ContextSound '%s'", _Name.toString().c_str()/*CStringMapper::unmap(_Name).c_str()*/));
parseArg = true; parseArg = true;
} }
} }
@ -215,7 +215,7 @@ void CContextSound::init()
} }
else else
{ {
nlassertex(nbJoker < SoundContextNbArgs, ("Error will trying to play ContextSound '%s'", CStringMapper::unmap(_Name).c_str())); nlassertex(nbJoker < SoundContextNbArgs, ("Error will trying to play ContextSound '%s'", _Name.toString().c_str()/*CStringMapper::unmap(_Name).c_str()*/));
fromString(index, contextArgIndex[nbJoker++]); fromString(index, contextArgIndex[nbJoker++]);
parseArg = false; parseArg = false;
} }
@ -247,7 +247,7 @@ void CContextSound::init()
LM_CASE_CONTAINER_CREATOR(9) LM_CASE_CONTAINER_CREATOR(9)
LM_CASE_CONTAINER_CREATOR(10) LM_CASE_CONTAINER_CREATOR(10)
default: default:
nlwarning("Unsuported number of context argument in context sound '%s'!", CStringMapper::unmap(_Name).c_str()); nlwarning("Unsuported number of context argument in context sound '%s'!", _Name.toString().c_str()/*CStringMapper::unmap(_Name).c_str()*/);
return; return;
} }
// cleanup macro // cleanup macro
@ -257,14 +257,14 @@ void CContextSound::init()
// ok, we have the container, now fill it with the sound // ok, we have the container, now fill it with the sound
{ {
std::vector<NLMISC::TStringId> allSounds; std::vector<NLMISC::CSheetId> allSounds;
// CSoundBank::getSoundNames(allSounds); // CSoundBank::getSoundNames(allSounds);
CAudioMixerUser::instance()->getSoundNames(allSounds); CAudioMixerUser::instance()->getSoundNames(allSounds);
std::vector<NLMISC::TStringId>::iterator first(allSounds.begin()), last(allSounds.end()); std::vector<NLMISC::CSheetId>::iterator first(allSounds.begin()), last(allSounds.end());
for (; first != last; ++first) for (; first != last; ++first)
{ {
const std::string &soundName = CStringMapper::unmap(*first); const std::string &soundName = first->toString()/*CStringMapper::unmap(*first)*/;
if (soundName.size() > _BaseName.size()) if (soundName.size() > _BaseName.size())
{ {
uint i; uint i;

@ -65,12 +65,68 @@ sint32 ISource::computeManualRollOff(sint32 volumeMB, sint32 mbMin, sint32 mbMax
// common method used only with OptionManualRolloff. return the rolloff in amplitude ratio (gain) // common method used only with OptionManualRolloff. return the rolloff in amplitude ratio (gain)
float ISource::computeManualRolloff(double alpha, float sqrdist, float distMin, float distMax) float ISource::computeManualRolloff(double alpha, float sqrdist, float distMin, float distMax)
{ {
static const sint32 mbMin = -10000; /*static const sint mbMin = -10000;
static const sint32 mbMax = 0; static const sint mbMax = 0;
sint32 rolloffMb = ISource::computeManualRollOff(mbMax, mbMin, mbMax, alpha, sqrdist, distMin, distMax); sint32 rolloffMb = ISource::computeManualRollOff(mbMax, mbMin, mbMax, alpha, sqrdist, distMin, distMax);
float rolloffGain = (float)pow(10.0, (double)rolloffMb / 2000.0); float rolloffGain = (float)pow(10.0, (double)rolloffMb / 2000.0);
clamp(rolloffGain, 0.0f, 1.0f); clamp(rolloffGain, 0.0f, 1.0f);
return rolloffGain; return rolloffGain;*/
static const double mbMin = -10000;
static const double mbMax = 0;
if (sqrdist < distMin * distMin)
{
// no attenuation
return 1.0f;
}
else
{
if (alpha < 0.0f)
{
double dist = (double)sqrt(sqrdist);
// inverse distance rolloff
float rolloff = distMin / dist;
if (alpha <= -1.0f) return rolloff;
if (dist > distMax)
{
// full attenuation of mbrolloff
return (-alpha * rolloff);
}
else
{
double mb = mbMin * (dist - distMin) / (distMax - distMin);
float mbrolloff = (float)pow(10.0, (double)mb / 2000.0);
return ((1.0 + alpha) * mbrolloff - alpha * rolloff);
}
}
else
{
if (sqrdist > distMax * distMax)
{
// full attenuation
return 0.0f;
}
double dist = (double)sqrt(sqrdist);
if (alpha == 0.0f)
{
// linearly descending volume on a dB scale
double mb = mbMin * (dist - distMin) / (distMax - distMin);
return (float)pow(10.0, (double)mb / 2000.0);
}
else // if (alpha > 0.0f)
{
// linear distance rolloff
float rolloff = (distMax - dist) / (distMax - distMin);
if (alpha >= 1.0f) return rolloff;
double mb = mbMin * (dist - distMin) / (distMax - distMin);
float mbrolloff = (float)pow(10.0, (double)mb / 2000.0);
return ((1.0 - alpha) * mbrolloff + alpha * rolloff);
}
}
}
} }
} // NLSOUND } // NLSOUND

@ -43,7 +43,7 @@ using namespace std;
namespace NLSOUND { namespace NLSOUND {
CGroupControllerRoot::CGroupControllerRoot() : CGroupController(NULL) CGroupControllerRoot::CGroupControllerRoot() : CGroupController(NULL), NLMISC::CManualSingleton<CGroupControllerRoot>()
{ {
} }

@ -133,27 +133,18 @@ void CSound::serial(NLMISC::IStream &s)
s.serial(_Direction); s.serial(_Direction);
s.serial(_Looping); s.serial(_Looping);
s.serial(_MaxDist); s.serial(_MaxDist);
if (s.isReading())
{ _Name.serialString(s, "sound");
std::string name;
s.serial(name); nlassert(CGroupControllerRoot::isInitialized()); // not sure
_Name = CStringMapper::map(name);
}
else
{
std::string name = CStringMapper::unmap(_Name);
s.serial(name);
}
nlassert(CGroupControllerRoot::getInstance()); // not sure
#if NLSOUND_SHEET_VERSION_BUILT < 2 #if NLSOUND_SHEET_VERSION_BUILT < 2
if (s.isReading()) _GroupController = static_cast<CGroupController *>(CAudioMixerUser::instance()->getGroupController(NLSOUND_SHEET_V1_DEFAULT_SOUND_GROUP_CONTROLLER)); if (s.isReading()) _GroupController = CGroupControllerRoot::getInstance()->getGroupController(NLSOUND_SHEET_V1_DEFAULT_SOUND_GROUP_CONTROLLER);
#else #else
if (s.isReading()) if (s.isReading())
{ {
std::string groupControllerPath; std::string groupControllerPath;
s.serial(groupControllerPath); s.serial(groupControllerPath);
_GroupController = static_cast<CGroupController *>(CAudioMixerUser::instance()->getGroupController(groupControllerPath)); _GroupController = CGroupControllerRoot::getInstance()->getGroupController(groupControllerPath);
} }
else else
{ {
@ -170,7 +161,8 @@ void CSound::serial(NLMISC::IStream &s)
void CSound::importForm(const std::string& filename, NLGEORGES::UFormElm& root) void CSound::importForm(const std::string& filename, NLGEORGES::UFormElm& root)
{ {
// Name // Name
_Name = CStringMapper::map(CFile::getFilenameWithoutExtension(filename)); nlassert(filename.find(".sound") != std::string::npos);
_Name = NLMISC::CSheetId(filename);
// InternalConeAngle // InternalConeAngle
uint32 inner; uint32 inner;
@ -253,7 +245,7 @@ void CSound::importForm(const std::string& filename, NLGEORGES::UFormElm& roo
_Priority = MidPri; _Priority = MidPri;
} }
nlassert(CGroupControllerRoot::getInstance()); // not sure nlassert(CGroupControllerRoot::isInitialized()); // not sure
#if NLSOUND_SHEET_VERSION_BUILT < 2 #if NLSOUND_SHEET_VERSION_BUILT < 2
_GroupController = CGroupControllerRoot::getInstance()->getGroupController(NLSOUND_SHEET_V1_DEFAULT_SOUND_GROUP_CONTROLLER); _GroupController = CGroupControllerRoot::getInstance()->getGroupController(NLSOUND_SHEET_V1_DEFAULT_SOUND_GROUP_CONTROLLER);
#else #else

@ -53,19 +53,19 @@ void CSoundAnimMarker::play(UAudioMixer* mixer, NL3D::CCluster *cluster, CSoundC
// ******************************************************** // ********************************************************
void CSoundAnimMarker::addSound(const NLMISC::TStringId& soundName) void CSoundAnimMarker::addSound(const NLMISC::CSheetId& soundName)
{ {
pair<TMarkerSoundSet::iterator, bool> inserted; pair<TMarkerSoundSet::iterator, bool> inserted;
inserted = _Sounds.insert(soundName); inserted = _Sounds.insert(soundName);
if (inserted.second == false) if (inserted.second == false)
{ {
nlwarning("Duplicate sound (%s)", CStringMapper::unmap(soundName).c_str()); nlwarning("Duplicate sound (%s)",/* CStringMapper::unmap(soundName).c_str()*/soundName.toString().c_str());
} }
} }
// ******************************************************** // ********************************************************
void CSoundAnimMarker::removeSound(const NLMISC::TStringId &soundName) void CSoundAnimMarker::removeSound(const NLMISC::CSheetId &soundName)
{ {
TMarkerSoundSet::iterator iter = _Sounds.find(soundName); TMarkerSoundSet::iterator iter = _Sounds.find(soundName);
if (iter != _Sounds.end()) if (iter != _Sounds.end())
@ -74,13 +74,13 @@ void CSoundAnimMarker::removeSound(const NLMISC::TStringId &soundName)
} }
else else
{ {
nlwarning("No sound was removed (%s)", CStringMapper::unmap(soundName).c_str()); nlwarning("No sound was removed (%s)", soundName.toString().c_str()/*CStringMapper::unmap(soundName).c_str()*/);
} }
} }
// ******************************************************** // ********************************************************
void CSoundAnimMarker::getSounds(vector<NLMISC::TStringId> &sounds) void CSoundAnimMarker::getSounds(vector<NLMISC::CSheetId> &sounds)
{ {
sounds.insert(sounds.end(), _Sounds.begin(), _Sounds.end()); sounds.insert(sounds.end(), _Sounds.begin(), _Sounds.end());

@ -73,7 +73,7 @@ void CSoundAnimation::save()
{ {
// File stream // File stream
COFile file; COFile file;
vector<NLMISC::TStringId> sounds; vector<NLMISC::CSheetId> sounds;
// Open the file // Open the file
if (!file.open(_Filename.c_str())) if (!file.open(_Filename.c_str()))
@ -108,11 +108,11 @@ void CSoundAnimation::save()
marker->getSounds(sounds); marker->getSounds(sounds);
vector<NLMISC::TStringId>::iterator iter2; vector<NLMISC::CSheetId>::iterator iter2;
for (iter2 = sounds.begin(); iter2 != sounds.end(); iter2++) for (iter2 = sounds.begin(); iter2 != sounds.end(); iter2++)
{ {
xmlNodePtr soundNode = xmlNewChild ( markerNode, NULL, (const xmlChar*)"SOUND", NULL ); xmlNodePtr soundNode = xmlNewChild ( markerNode, NULL, (const xmlChar*)"SOUND", NULL );
xmlSetProp (soundNode, (const xmlChar*)"name", (const xmlChar*) CStringMapper::unmap(*iter2).c_str()); xmlSetProp (soundNode, (const xmlChar*)"name", (const xmlChar*)iter2->toString().c_str() /*CStringMapper::unmap(*iter2).c_str()*/);
} }
sounds.clear(); sounds.clear();
@ -190,7 +190,7 @@ void CSoundAnimation::load()
throw NLMISC::Exception("Invalid sound animation marker"); throw NLMISC::Exception("Invalid sound animation marker");
} }
marker->addSound(CStringMapper::map(string(name))); marker->addSound(NLMISC::CSheetId(string(name), "sound"));
xmlFree ((void*)name); xmlFree ((void*)name);

@ -123,14 +123,16 @@ CSoundBank::~CSoundBank()
void CSoundBank::addSound(CSound *sound) void CSoundBank::addSound(CSound *sound)
{ {
std::pair<TSoundTable::iterator, bool> ret; // nlassert(_Sounds.size() > sound->getName().getShortId());
ret = _Sounds.insert(make_pair(sound->getName(), sound)); // nldebug("SOUNDBANK: Add %s", sound->getName().toString().c_str());
nlassert(ret.second); if (_Sounds.size() <= sound->getName().getShortId())
_Sounds.resize(sound->getName().getShortId() + 1);
_Sounds[sound->getName().getShortId()] = sound;
} }
void CSoundBank::removeSound(const NLMISC::TStringId &name) void CSoundBank::removeSound(const NLMISC::CSheetId &sheetId)
{ {
_Sounds.erase(name); _Sounds[sheetId.getShortId()] = NULL;
} }
@ -258,35 +260,59 @@ public:
void CSoundBank::load(const std::string &packedSheetDir, bool packedSheetUpdate) void CSoundBank::load(const std::string &packedSheetDir, bool packedSheetUpdate)
{ {
// this structure is fill by the loadForm() function and will contain all you need // this structure is fill by the loadForm() function and will contain all you need
std::map<std::string, CSoundSerializer> Container; std::map<std::string, CSoundSerializer> container; // load the old way for compatibility
nlassert(!_Loaded); nlassert(!_Loaded);
// Just call the GEORGE::loadFrom method to read all available sounds // Just call the GEORGE::loadFrom method to read all available sounds
::loadForm("sound", packedSheetDir + "sounds.packed_sheets", Container, packedSheetUpdate, false); ::loadForm("sound", packedSheetDir + "sounds.packed_sheets", container, packedSheetUpdate, false);
_Loaded = true; _Loaded = true;
// get the largest sheet id needed and init the sound bank
uint32 maxShortId = 0;
{
std::map<std::string, CSoundSerializer>::iterator first(container.begin()), last(container.end());
for (; first != last; ++first)
{
if (first->second.Sound != 0)
if (first->second.Sound->getName().getShortId() > maxShortId)
maxShortId = first->second.Sound->getName().getShortId();
}
++maxShortId; // inc for size = last idx + 1
if (container.size() == 0)
{
nlwarning("NLSOUND: No sound sheets have been loaded, missing sound sheet directory or packed sound sheets file");
}
else
{
nlassert(maxShortId < (container.size() * 8)); // ensure no ridiculous sheet id values
if (maxShortId > _Sounds.size())
_Sounds.resize(maxShortId);
}
}
// add all the loaded sound in the sound banks // add all the loaded sound in the sound banks
std::map<std::string, CSoundSerializer>::iterator first(Container.begin()), last(Container.end());
for (; first != last; ++first)
{ {
if (first->second.Sound != 0) std::map<std::string, CSoundSerializer>::iterator first(container.begin()), last(container.end());
addSound(first->second.Sound); for (; first != last; ++first)
{
if (first->second.Sound != 0)
addSound(first->second.Sound);
}
} }
Container.clear(); container.clear();
} }
/* /*
* Unload all the sound samples in this bank. * Unload all the sound samples in this bank.
*/ */
void CSoundBank::unload() void CSoundBank::unload()
{ {
nlassert(_Loaded); nlassert(_Loaded);
TSoundTable::iterator first(_Sounds.begin()), last(_Sounds.end()); for (TSoundTable::size_type i = 0; i < _Sounds.size(); ++i)
for (; first != last; ++first)
{ {
delete first->second; delete _Sounds[i];
} }
_Sounds.clear(); _Sounds.clear();
@ -320,7 +346,7 @@ void CSoundBank::unload()
/* /*
* Returns true if the samples in this bank have been loaded. * Returns true if the samples in this bank have been loaded.
*/ */
bool CSoundBank::isLoaded() bool CSoundBank::isLoaded()
{ {
return _Loaded; return _Loaded;
} }
@ -328,37 +354,38 @@ bool CSoundBank::isLoaded()
/* /*
* Return a sound sample corresponding to a name. * Return a sound sample corresponding to a name.
*/ */
CSound* CSoundBank::getSound(const NLMISC::TStringId &name) CSound* CSoundBank::getSound(const NLMISC::CSheetId &sheetId)
{ {
// Find sound if (sheetId == NLMISC::CSheetId::Unknown)
TSoundTable::iterator iter = _Sounds.find(name); return NULL;
if ( iter == _Sounds.end() )
{ // nlassert(sheetId.getShortId() < _Sounds.size());
return 0; if (sheetId.getShortId() >= _Sounds.size())
}
else
{ {
return (*iter).second; std::string sheetName = sheetId.toString();
nlwarning("NLSOUND: Sound sheet id '%s' exceeds loaded sound sheets", sheetName.c_str());
return NULL;
} }
return _Sounds[sheetId.getShortId()];
} }
/** /**
* Return the names of the sounds * Return the names of the sounds
*/ */
void CSoundBank::getNames( std::vector<NLMISC::TStringId> &names ) void CSoundBank::getNames( std::vector<NLMISC::CSheetId> &sheetIds )
{ {
TSoundTable::const_iterator iter; for (TSoundTable::size_type i = 0; i < _Sounds.size(); ++i)
for (iter = _Sounds.begin(); iter != _Sounds.end(); ++iter)
{ {
names.push_back((*iter).first); if (_Sounds[i])
//nlwarning("getting sound %s", (*iter).first); sheetIds.push_back(_Sounds[i]->getName());
} }
} }
/* /*
* Return the number of buffers in this bank. * Return the number of buffers in this bank.
*/ */
uint CSoundBank::countSounds() uint CSoundBank::countSounds()
{ {
return (uint)_Sounds.size(); return (uint)_Sounds.size();
} }

@ -73,11 +73,13 @@ void CStreamFileSound::serial(NLMISC::IStream &s)
void CStreamFileSound::setMusicFilePath(const std::string &filePath, bool async, bool loop) void CStreamFileSound::setMusicFilePath(const std::string &filePath, bool async, bool loop)
{ {
#if !FINAL_VERSION /*#if !FINAL_VERSION
_Name = NLMISC::CStringMapper::map(std::string("<MusicChannel:") + NLMISC::CFile::getFilenameWithoutExtension(filePath) + ">"); //_Name = NLMISC::CStringMapper::map(std::string("<MusicChannel:") + NLMISC::CFile::getFilenameWithoutExtension(filePath) + ">");
_Name = NLMISC::CSheetId(std::string("<MusicChannel:") + NLMISC::CFile::getFilenameWithoutExtension(filePath) + ">");
#else #else
_Name = NLMISC::CStringMapper::map("<MusicChannel>"); //_Name = NLMISC::CStringMapper::map("<MusicChannel>");
#endif #endif*/
_Name = NLMISC::CSheetId("music_channel.sound");
_ConeInnerAngle = NLMISC::Pi * 2; _ConeInnerAngle = NLMISC::Pi * 2;
_ConeOuterAngle = NLMISC::Pi * 2; _ConeOuterAngle = NLMISC::Pi * 2;
_Looping = loop; _Looping = loop;

@ -159,7 +159,7 @@ END_MESSAGE_MAP()
void CEditPSSound::OnBrowseSound() void CEditPSSound::OnBrowseSound()
{ {
// CPickSound::TNameVect names; // CPickSound::TNameVect names;
vector<NLMISC::TStringId> names; vector<NLMISC::CSheetId> names;
NLSOUND::UAudioMixer *audioMixer = CSoundSystem::getAudioMixer(); NLSOUND::UAudioMixer *audioMixer = CSoundSystem::getAudioMixer();
@ -172,7 +172,7 @@ void CEditPSSound::OnBrowseSound()
if (ps.DoModal() == IDOK) if (ps.DoModal() == IDOK)
{ {
m_SoundName = NLMISC::CStringMapper::unmap(ps.getName()).c_str(); m_SoundName = ps.getName().toString().c_str();
_Sound->setSoundName(ps.getName()); _Sound->setSoundName(ps.getName());
updateModifiedFlag(); updateModifiedFlag();
UpdateData(FALSE); UpdateData(FALSE);
@ -184,7 +184,7 @@ BOOL CEditPSSound::OnInitDialog()
CDialog::OnInitDialog(); CDialog::OnInitDialog();
nlassert(_Sound); nlassert(_Sound);
m_SoundName = NLMISC::CStringMapper::unmap(_Sound->getSoundName()).c_str(); m_SoundName = _Sound->getSoundName().toString().c_str();
UpdateData(FALSE); UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control return TRUE; // return TRUE unless you set the focus to a control
@ -195,7 +195,7 @@ void CEditPSSound::OnChangeSoundName()
{ {
nlassert(_Sound); nlassert(_Sound);
UpdateData(); UpdateData();
_Sound->setSoundName( NLMISC::CStringMapper::map((LPCTSTR) m_SoundName) ); _Sound->setSoundName(NLMISC::CSheetId((LPCTSTR)m_SoundName, "sound"));
updateModifiedFlag(); updateModifiedFlag();
} }
@ -209,7 +209,7 @@ void CEditPSSound::OnSpawn()
// play the currently selected sound // play the currently selected sound
void CEditPSSound::OnPlaySound() void CEditPSSound::OnPlaySound()
{ {
CSoundSystem::play(std::string((LPCTSTR) m_SoundName)); CSoundSystem::play(std::string((LPCTSTR)m_SoundName));
} }
void CEditPSSound::OnMute() void CEditPSSound::OnMute()

@ -74,7 +74,7 @@ BOOL CPickSound::OnInitDialog()
for (TNameVect::iterator it = _Names.begin(); it != _Names.end(); ++it) for (TNameVect::iterator it = _Names.begin(); it != _Names.end(); ++it)
{ {
m_NameList.AddString(NLMISC::CStringMapper::unmap(*it).c_str()); m_NameList.AddString((*it).toString().c_str());
} }
_Timer = SetTimer (1, 100, NULL); _Timer = SetTimer (1, 100, NULL);
@ -111,7 +111,7 @@ void CPickSound::OnSelchange()
nlassert(m_NameList.GetTextLen(m_NameList.GetCurSel()) < 1024); nlassert(m_NameList.GetTextLen(m_NameList.GetCurSel()) < 1024);
m_NameList.GetText(m_NameList.GetCurSel(), str); m_NameList.GetText(m_NameList.GetCurSel(), str);
_CurrName = NLMISC::CStringMapper::map(str); _CurrName = NLMISC::CSheetId(str, "sound");
} }

@ -23,7 +23,7 @@
#endif // _MSC_VER > 1000 #endif // _MSC_VER > 1000
// pick_sound.h : header file // pick_sound.h : header file
// //
#include "nel/misc/string_mapper.h" #include "nel/misc/sheet_id.h"
#include <vector> #include <vector>
#include <string> #include <string>
@ -40,11 +40,11 @@ class CPickSound : public CDialog
{ {
// Construction // Construction
public: public:
typedef std::vector<NLMISC::TStringId> TNameVect; typedef std::vector<NLMISC::CSheetId> TNameVect;
CPickSound(const TNameVect &names, CWnd* pParent = NULL); // standard constructor CPickSound(const TNameVect &names, CWnd* pParent = NULL); // standard constructor
const NLMISC::TStringId &getName(void) const { return _CurrName; } const NLMISC::CSheetId &getName(void) const { return _CurrName; }
// Dialog Data // Dialog Data
//{{AFX_DATA(CPickSound) //{{AFX_DATA(CPickSound)
@ -63,7 +63,7 @@ public:
// Implementation // Implementation
protected: protected:
TNameVect _Names; TNameVect _Names;
NLMISC::TStringId _CurrName; NLMISC::CSheetId _CurrName;
UINT_PTR _Timer; UINT_PTR _Timer;

@ -126,18 +126,18 @@ void CSoundAnimDlg::updateSounds()
{ {
if (_SelectedMarker != 0) if (_SelectedMarker != 0)
{ {
vector<NLMISC::TStringId> sounds; vector<NLMISC::CSheetId> sounds;
_SelectedMarker->getSounds(sounds); _SelectedMarker->getSounds(sounds);
CListBox* list = (CListBox*) GetDlgItem(IDC_SOUND_ANIM_LIST); CListBox* list = (CListBox*) GetDlgItem(IDC_SOUND_ANIM_LIST);
list->ResetContent(); list->ResetContent();
vector<NLMISC::TStringId>::iterator iter; vector<NLMISC::CSheetId>::iterator iter;
for (iter = sounds.begin(); iter != sounds.end(); iter++) for (iter = sounds.begin(); iter != sounds.end(); iter++)
{ {
list->AddString(CStringMapper::unmap(*iter).c_str()); list->AddString((*iter).toString().c_str());
} }
list->UpdateData(); list->UpdateData();
@ -151,7 +151,7 @@ void CSoundAnimDlg::OnAddSound()
if (_SelectedMarker != 0) if (_SelectedMarker != 0)
{ {
// CPickSound::TNameVect names; // CPickSound::TNameVect names;
vector<NLMISC::TStringId> names; vector<NLMISC::CSheetId> names;
NLSOUND::UAudioMixer *audioMixer = CSoundSystem::getAudioMixer(); NLSOUND::UAudioMixer *audioMixer = CSoundSystem::getAudioMixer();
@ -183,7 +183,7 @@ void CSoundAnimDlg::OnRemoveSound()
if (list->GetText(list->GetCurSel(), s) != LB_ERR) if (list->GetText(list->GetCurSel(), s) != LB_ERR)
{ {
string name(s); string name(s);
_SelectedMarker->removeSound(CStringMapper::map(name)); _SelectedMarker->removeSound(NLMISC::CSheetId(name, "sound"));
updateSounds(); updateSounds();
} }
} }

@ -168,7 +168,7 @@ void CSoundSystem::play(const string &soundName)
{ {
if (_AudioMixer) if (_AudioMixer)
{ {
NLSOUND::USource *src = _AudioMixer->createSource(CStringMapper::map(soundName), true); NLSOUND::USource *src = _AudioMixer->createSource(NLMISC::CSheetId(soundName, "sound"), true);
if (src) if (src)
{ {
src->setLooping(false); src->setLooping(false);
@ -187,7 +187,7 @@ USource *CSoundSystem::create(const std::string &soundName)
{ {
if (_AudioMixer) if (_AudioMixer)
{ {
NLSOUND::USource *src = _AudioMixer->createSource(CStringMapper::map(soundName), false); NLSOUND::USource *src = _AudioMixer->createSource(NLMISC::CSheetId(soundName, "sound"), false);
if (src) if (src)
{ {
src->setLooping(false); src->setLooping(false);

@ -86,7 +86,7 @@ void CSoundPage::setEditedItem(CWorkspaceNode *ownerNode, NL3D::CPSLocatedBindab
_ui.pitchWidget->setWorkspaceNode(_Node); _ui.pitchWidget->setWorkspaceNode(_Node);
_ui.pitchWidget->updateUi(); _ui.pitchWidget->updateUi();
_ui.soundNameLineEdit->setText(QString(NLMISC::CStringMapper::unmap(_Sound->getSoundName()).c_str())); _ui.soundNameLineEdit->setText(QString(_Sound->getSoundName().toString().c_str()));
_ui.spawnCheckBox->setChecked(_Sound->getSpawn()); _ui.spawnCheckBox->setChecked(_Sound->getSpawn());
_ui.muteCheckBox->setChecked(_Sound->getMute()); _ui.muteCheckBox->setChecked(_Sound->getMute());
@ -95,7 +95,7 @@ void CSoundPage::setEditedItem(CWorkspaceNode *ownerNode, NL3D::CPSLocatedBindab
void CSoundPage::browse() void CSoundPage::browse()
{ {
std::vector<NLMISC::TStringId> names; std::vector<NLMISC::CSheetId> names;
NLSOUND::UAudioMixer *audioMixer = Modules::sound().getAudioMixer(); NLSOUND::UAudioMixer *audioMixer = Modules::sound().getAudioMixer();
@ -108,7 +108,7 @@ void CSoundPage::browse()
QStringList items; QStringList items;
items << tr(""); items << tr("");
for(size_t i = 0; i < names.size(); ++i) for(size_t i = 0; i < names.size(); ++i)
items << QString(names[i]->c_str()); items << QString(names[i].toString().c_str());
bool ok; bool ok;
QString item = QInputDialog::getItem(this, tr("Select your sound"), QString item = QInputDialog::getItem(this, tr("Select your sound"),
@ -162,7 +162,7 @@ void CSoundPage::setKeepPitch(bool state)
void CSoundPage::setSoundName(const QString &text) void CSoundPage::setSoundName(const QString &text)
{ {
_Sound->setSoundName(NLMISC::CStringMapper::map(text.toStdString())); _Sound->setSoundName(NLMISC::CSheetId(text.toStdString()));
} }
void CSoundPage::setEmissionPercent(float value) void CSoundPage::setEmissionPercent(float value)
@ -171,4 +171,4 @@ void CSoundPage::setEmissionPercent(float value)
updateModifiedFlag(); updateModifiedFlag();
} }
} /* namespace NLQT */ } /* namespace NLQT */

@ -30,6 +30,8 @@
#include <nel/sound/sound_animation.h> #include <nel/sound/sound_animation.h>
#include <nel/3d/u_particle_system_sound.h> #include <nel/3d/u_particle_system_sound.h>
#include <nel/misc/path.h> #include <nel/misc/path.h>
#include <nel/misc/sheet_id.h>
// Qt includes // Qt includes
#include <QtCore/QSettings> #include <QtCore/QSettings>
@ -67,6 +69,9 @@ void CSoundSystem::init()
{ {
//H_AUTO2 //H_AUTO2
nldebug("CSoundSystem::init"); nldebug("CSoundSystem::init");
// require sheet id without sheet id bin
NLMISC::CSheetId::initWithoutSheet();
// create audiomixer // create audiomixer
_AudioMixer = NULL; _AudioMixer = NULL;
@ -153,9 +158,10 @@ void CSoundSystem::play(const std::string &soundName)
{ {
if (_AudioMixer) if (_AudioMixer)
{ {
NLSOUND::USource *src = _AudioMixer->createSource(NLMISC::CStringMapper::map(soundName), true); NLSOUND::USource *src = _AudioMixer->createSource(NLMISC::CSheetId(soundName, "sound"), true);
if (src) if (src)
{ {
// FIXME: Use relative positioning, and set pos to 0,0,0
src->setLooping(false); src->setLooping(false);
const NLMISC::CVector &pos = _AudioMixer->getListener()->getPos(); const NLMISC::CVector &pos = _AudioMixer->getListener()->getPos();
src->setPos(pos); src->setPos(pos);
@ -172,9 +178,10 @@ NLSOUND::USource *CSoundSystem::create(const std::string &soundName)
{ {
if (_AudioMixer) if (_AudioMixer)
{ {
NLSOUND::USource *src = _AudioMixer->createSource(NLMISC::CStringMapper::map(soundName), false); NLSOUND::USource *src = _AudioMixer->createSource(NLMISC::CSheetId(soundName, "sound"), false);
if (src) if (src)
{ {
// FIXME: Use relative positioning, and set pos to 0,0,0
src->setLooping(false); src->setLooping(false);
const NLMISC::CVector &pos = _AudioMixer->getListener()->getPos(); const NLMISC::CVector &pos = _AudioMixer->getListener()->getPos();
src->setPos(pos); src->setPos(pos);
@ -236,4 +243,4 @@ void CSoundSystem::releaseGraphics()
NL3D::UParticleSystemSound::setPSSound(NULL); NL3D::UParticleSystemSound::setPSSound(NULL);
} }
} /* namespace NLQT */ } /* namespace NLQT */

@ -18,3 +18,5 @@ IF(WIN32)
ADD_SUBDIRECTORY(words_dic) ADD_SUBDIRECTORY(words_dic)
ENDIF(MFC_FOUND) ENDIF(MFC_FOUND)
ENDIF(WIN32) ENDIF(WIN32)
ADD_SUBDIRECTORY(probe_timers)

@ -336,16 +336,27 @@ void addId( string fileName )
if( firstFreeFileTypeId == -1 ) if( firstFreeFileTypeId == -1 )
{ {
nlwarning("MORE THAN 256 FILE TYPES!!!!"); nlwarning("MORE THAN 256 FILE TYPES!!!!");
return;
} }
else else
{ {
FileTypeToId.insert( make_pair(fileType,(uint8)firstFreeFileTypeId) ); FileTypeToId.insert( make_pair(fileType,(uint8)firstFreeFileTypeId) );
IdToFileType.insert( make_pair((uint8)firstFreeFileTypeId,fileType) ); IdToFileType.insert( make_pair((uint8)firstFreeFileTypeId,fileType) );
TypeToLastId.insert( make_pair((uint8)firstFreeFileTypeId,0) );
// Reserve id 0 for unknown.newtype.
// User may supply a sheet called unknown.newtype
// that can safely be used as a fallback when a
// requested sheet does not exist.
// Only for newly added sheet types.
fid.FormIDInfos.Type = (uint8)firstFreeFileTypeId; fid.FormIDInfos.Type = (uint8)firstFreeFileTypeId;
fid.FormIDInfos.Id = 0; fid.FormIDInfos.Id = 0;
std::string unknownNewType = std::string("unknown." + fileType);
FormToId.insert(make_pair(unknownNewType, fid));
IdToForm.insert(make_pair(fid, unknownNewType));
TypeToLastId.insert( make_pair((uint8)firstFreeFileTypeId,1) );
fid.FormIDInfos.Id = 1;
nlinfo("Adding file type '%s' with id %d", fileType.c_str(), firstFreeFileTypeId); nlinfo("Adding file type '%s' with id %d", fileType.c_str(), firstFreeFileTypeId);
NbTypesAdded++; NbTypesAdded++;
} }

@ -0,0 +1,9 @@
FILE(GLOB SRC *.cpp)
ADD_EXECUTABLE(nl_probe_timers ${SRC})
TARGET_LINK_LIBRARIES(nl_probe_timers nelmisc)
NL_DEFAULT_PROPS(nl_probe_timers "NeL, Tools, Misc: Probe Timers")
NL_ADD_RUNTIME_FLAGS(nl_probe_timers)
INSTALL(TARGETS nl_probe_timers RUNTIME DESTINATION bin COMPONENT toolsmisc)

@ -0,0 +1,38 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2012 by authors
//
// 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/>.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "nel/misc/types_nl.h"
#include "nel/misc/time_nl.h"
using namespace NLMISC;
int main (int argc, char **argv)
{
for (uint i = 0; i < 8; ++i)
{
CTime::CTimerInfo timerInfo;
CTime::probeTimerInfo(timerInfo);
}
printf ("\nPress <return> to exit\n");
getchar ();
return EXIT_SUCCESS;
}

@ -29,6 +29,7 @@
#include <nel/misc/log.h> #include <nel/misc/log.h>
#include <nel/misc/path.h> #include <nel/misc/path.h>
#include <nel/sound/u_audio_mixer.h> #include <nel/sound/u_audio_mixer.h>
#include <nel/misc/sheet_id.h>
// Project includes // Project includes
// ... // ...
@ -75,6 +76,9 @@ int main(int nNbArg, char **ppArgs)
// add search paths // add search paths
CPath::addSearchPath(leveldesignDir, true, false); CPath::addSearchPath(leveldesignDir, true, false);
CPath::addSearchPath(dfnDir, true, false); CPath::addSearchPath(dfnDir, true, false);
// init sheet_id.bin
NLMISC::CSheetId::initWithoutSheet();
// build the sound bank // build the sound bank
UAudioMixer::buildSoundBank(exportDir); UAudioMixer::buildSoundBank(exportDir);

@ -5055,14 +5055,14 @@ NLMISC_COMMAND(reloadFogMaps, "Force to reload all the fog maps", "<>")
NLMISC_COMMAND(dumpSounds, "Dump names of all loaded sound", "<>") NLMISC_COMMAND(dumpSounds, "Dump names of all loaded sound", "<>")
{ {
if (!args.empty()) return false; if (!args.empty()) return false;
std::vector<NLMISC::TStringId> sounds; std::vector<NLMISC::CSheetId> sounds;
extern CSoundManager *SoundMngr; extern CSoundManager *SoundMngr;
if (!SoundMngr) return false; if (!SoundMngr) return false;
if (!SoundMngr->getMixer()) return false; if (!SoundMngr->getMixer()) return false;
SoundMngr->getMixer()->getSoundNames(sounds); SoundMngr->getMixer()->getSoundNames(sounds);
for(uint k = 0; k < sounds.size(); ++k) for(uint k = 0; k < sounds.size(); ++k)
{ {
nlinfo(NLMISC::CStringMapper::unmap(sounds[k]).c_str()); nlinfo(sounds[k].toString()/*NLMISC::CStringMapper::unmap(sounds[k])*/.c_str());
} }
return true; return true;
} }

@ -2006,7 +2006,7 @@ public:
virtual void execute (CCtrlBase * /* pCaller */, const string &Params) virtual void execute (CCtrlBase * /* pCaller */, const string &Params)
{ {
string sName = getParam(Params, "name"); string sName = getParam(Params, "name");
TStringId id = CStringMapper::map(sName); CSheetId id = CSheetId(sName, "sound");
if (SoundMngr != NULL) if (SoundMngr != NULL)
SoundMngr->spawnSource(id,CVector(0,0,0)); SoundMngr->spawnSource(id,CVector(0,0,0));
} }

@ -686,8 +686,11 @@ void prelogInit()
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
_control87 (_EM_INVALID|_EM_DENORMAL/*|_EM_ZERODIVIDE|_EM_OVERFLOW*/|_EM_UNDERFLOW|_EM_INEXACT, _MCW_EM); _control87 (_EM_INVALID|_EM_DENORMAL/*|_EM_ZERODIVIDE|_EM_OVERFLOW*/|_EM_UNDERFLOW|_EM_INEXACT, _MCW_EM);
#endif // NL_OS_WINDOWS #endif // NL_OS_WINDOWS
setCPUMask(); CTime::CTimerInfo timerInfo;
NLMISC::CTime::probeTimerInfo(timerInfo);
if (timerInfo.RequiresSingleCore) // TODO: Also have a FV configuration value to force single core.
setCPUMask();
FPU_CHECKER_ONCE FPU_CHECKER_ONCE
@ -1265,6 +1268,19 @@ void postlogInit()
// set the primitive context // set the primitive context
CPrimitiveContext::instance().CurrentLigoConfig = &LigoConfig; CPrimitiveContext::instance().CurrentLigoConfig = &LigoConfig;
{
H_AUTO(InitRZShIdI)
nmsg = "Initializing sheets...";
ProgressBar.newMessage ( ClientCfg.buildLoadingString(nmsg) );
// Initialize Sheet IDs.
CSheetId::init (ClientCfg.UpdatePackedSheet);
initLast = initCurrent;
initCurrent = ryzomGetLocalTime();
}
{ {
H_AUTO(InitRZSound) H_AUTO(InitRZSound)
@ -1275,12 +1291,13 @@ void postlogInit()
{ {
// tmp fix : it seems that, at this point, if the bg downloader window has focus and // tmp fix : it seems that, at this point, if the bg downloader window has focus and
// not the Ryzom one, then sound init fails // not the Ryzom one, then sound init fails
#ifdef NL_OS_WINDOWS /*#ifdef NL_OS_WINDOWS
HWND hWnd = Driver->getDisplay (); HWND hWnd = Driver->getDisplay ();
nlassert (hWnd); nlassert (hWnd);
ShowWindow(hWnd, SW_RESTORE); ShowWindow(hWnd, SW_RESTORE);
SetForegroundWindow(hWnd); SetForegroundWindow(hWnd);
#endif #endif*/
// bg downloader not used anymore anyways
SoundMngr = new CSoundManager(&ProgressBar); SoundMngr = new CSoundManager(&ProgressBar);
try try
{ {
@ -1323,13 +1340,7 @@ void postlogInit()
} }
{ {
H_AUTO(InitRZShIdI) H_AUTO(InitRZSheetL)
nmsg = "Initializing sheets...";
ProgressBar.newMessage ( ClientCfg.buildLoadingString(nmsg) );
// Initialize Sheet IDs.
CSheetId::init (ClientCfg.UpdatePackedSheet);
// load packed sheets // load packed sheets
nmsg = "Loading sheets..."; nmsg = "Loading sheets...";

@ -223,7 +223,7 @@ bool CGroupHTML::addBnpDownload(const string &url, const string &action, const s
#ifdef LOG_DL #ifdef LOG_DL
nlwarning("add to download '%s' dest '%s'", url.c_str(), dest.c_str()); nlwarning("add to download '%s' dest '%s'", url.c_str(), dest.c_str());
#endif #endif
// erase the tmp file if exists // erase the tmp file if exists
if (NLMISC::CFile::fileExists(tmpdest)) if (NLMISC::CFile::fileExists(tmpdest))
NLMISC::CFile::deleteFile(tmpdest); NLMISC::CFile::deleteFile(tmpdest);
@ -622,7 +622,7 @@ void CGroupHTML::addLink (uint element_number, uint /* attribute_number */, HTCh
_LinkTitle.push_back(""); _LinkTitle.push_back("");
} }
} }
} }
} }
@ -948,7 +948,7 @@ void CGroupHTML::beginElement (uint element_number, const BOOL *present, const c
typedef pair<string, string> TTmplParam; typedef pair<string, string> TTmplParam;
vector<TTmplParam> tmplParams; vector<TTmplParam> tmplParams;
string templateName; string templateName;
if (!style.empty()) if (!style.empty())
{ {
@ -1044,12 +1044,12 @@ void CGroupHTML::beginElement (uint element_number, const BOOL *present, const c
CRGBA bgColor = getColor (value[HTML_BODY_BGCOLOR]); CRGBA bgColor = getColor (value[HTML_BODY_BGCOLOR]);
setBackgroundColor (bgColor); setBackgroundColor (bgColor);
} }
string style; string style;
if (present[HTML_BODY_STYLE] && value[HTML_BODY_STYLE]) if (present[HTML_BODY_STYLE] && value[HTML_BODY_STYLE])
style = value[HTML_BODY_STYLE]; style = value[HTML_BODY_STYLE];
if (!style.empty()) if (!style.empty())
{ {
TStyle styles = parseStyle(style); TStyle styles = parseStyle(style);
@ -1057,7 +1057,7 @@ void CGroupHTML::beginElement (uint element_number, const BOOL *present, const c
it = styles.find("background-repeat"); it = styles.find("background-repeat");
bool repeat = (it != styles.end() && it->second == "1"); bool repeat = (it != styles.end() && it->second == "1");
// Webig only // Webig only
it = styles.find("background-scale"); it = styles.find("background-scale");
bool scale = (it != styles.end() && it->second == "1"); bool scale = (it != styles.end() && it->second == "1");
@ -1187,7 +1187,7 @@ void CGroupHTML::beginElement (uint element_number, const BOOL *present, const c
if (it != styles.end() && (*it).second == "1") if (it != styles.end() && (*it).second == "1")
reloadImg = true; reloadImg = true;
} }
addImage (value[MY_HTML_IMG_SRC], globalColor, reloadImg); addImage (value[MY_HTML_IMG_SRC], globalColor, reloadImg);
} }
} }
@ -1838,6 +1838,7 @@ CGroupHTML::CGroupHTML(const TCtorParam &param)
_GroupHtmlByUID[_GroupHtmlUID]= this; _GroupHtmlByUID[_GroupHtmlUID]= this;
// init // init
_TrustedDomain = false;
_ParsingLua = false; _ParsingLua = false;
_IgnoreText = false; _IgnoreText = false;
_BrowseNextTime = false; _BrowseNextTime = false;
@ -2469,7 +2470,7 @@ void CGroupHTML::addString(const ucstring &str)
getParagraph()->addChild (buttonGroup); getParagraph()->addChild (buttonGroup);
paragraphChange (); paragraphChange ();
} }
} }
else else
{ {
@ -3706,14 +3707,14 @@ int CGroupHTML::luaRemoveContent(CLuaState &ls)
} }
// *************************************************************************** // ***************************************************************************
int CGroupHTML::luaInsertText(CLuaState &ls) int CGroupHTML::luaInsertText(CLuaState &ls)
{ {
const char *funcName = "insertText"; const char *funcName = "insertText";
CLuaIHM::checkArgCount(ls, funcName, 3); CLuaIHM::checkArgCount(ls, funcName, 3);
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING);
CLuaIHM::checkArgType(ls, funcName, 2, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 2, LUA_TSTRING);
CLuaIHM::checkArgType(ls, funcName, 3, LUA_TBOOLEAN); CLuaIHM::checkArgType(ls, funcName, 3, LUA_TBOOLEAN);
string name = ls.toString(1); string name = ls.toString(1);
ucstring text; ucstring text;

@ -624,7 +624,7 @@ void CSoundManager::init(IProgressCallback *progressCallBack)
// add a new source to the world, attached to the specified entity // add a new source to the world, attached to the specified entity
// return 0 if creation failed, sound id if creation was successful // return 0 if creation failed, sound id if creation was successful
//----------------------------------------------- //-----------------------------------------------
CSoundManager::TSourceId CSoundManager::addSource( const NLMISC::TStringId &soundName, const NLMISC::CVector &position, bool play, bool loop, const CEntityId &id) CSoundManager::TSourceId CSoundManager::addSource( const NLMISC::CSheetId &soundName, const NLMISC::CVector &position, bool play, bool loop, const CEntityId &id)
{ {
uint32 retValue = 0; uint32 retValue = 0;
@ -634,7 +634,7 @@ CSoundManager::TSourceId CSoundManager::addSource( const NLMISC::TStringId &soun
// If the source is valid. // If the source is valid.
if(pSource == 0) if(pSource == 0)
{ {
nlwarning("Sound '%s' not found !", CStringMapper::unmap(soundName).c_str()); nlwarning("Sound '%s' not found !", /*CStringMapper::unmap(soundName).c_str()*/soundName.toString().c_str());
return retValue; return retValue;
} }
@ -672,7 +672,7 @@ CSoundManager::TSourceId CSoundManager::addSource( const NLMISC::TStringId &soun
// spawn a new source to the world // spawn a new source to the world
// return false if creation failed, true if creation was successful // return false if creation failed, true if creation was successful
//----------------------------------------------- //-----------------------------------------------
bool CSoundManager::spawnSource(const NLMISC::TStringId &soundName, CSoundContext &context) bool CSoundManager::spawnSource(const NLMISC::CSheetId &soundName, CSoundContext &context)
{ {
if (!_PlaySound) return false; if (!_PlaySound) return false;
@ -683,7 +683,7 @@ bool CSoundManager::spawnSource(const NLMISC::TStringId &soundName, CSoundContex
// If the source is valid. // If the source is valid.
if(pSource == 0) if(pSource == 0)
{ {
nlwarning("Sound '%s' not found !", soundName); nlwarning("Sound '%s' not found !", soundName.toString().c_str());
return false; return false;
} }
@ -702,7 +702,7 @@ bool CSoundManager::spawnSource(const NLMISC::TStringId &soundName, CSoundContex
// spawn a new source to the world // spawn a new source to the world
// return false if creation failed, true if creation was successful // return false if creation failed, true if creation was successful
//----------------------------------------------- //-----------------------------------------------
bool CSoundManager::spawnSource(const NLMISC::TStringId &soundName, const NLMISC::CVector &position) bool CSoundManager::spawnSource(const NLMISC::CSheetId &soundName, const NLMISC::CVector &position)
{ {
if (!_PlaySound) return false; if (!_PlaySound) return false;
@ -712,7 +712,7 @@ bool CSoundManager::spawnSource(const NLMISC::TStringId &soundName, const NLMISC
// If the source is valid. // If the source is valid.
if(pSource == 0) if(pSource == 0)
{ {
nlwarning("Sound '%s' not found !", CStringMapper::unmap(soundName).c_str ()); nlwarning("Sound '%s' not found !", /*CStringMapper::unmap(soundName).c_str ()*/soundName.toString().c_str());
return false; return false;
} }

@ -32,6 +32,7 @@
// sound // sound
#include "nel/sound/u_audio_mixer.h" #include "nel/sound/u_audio_mixer.h"
#include "nel/sound/u_listener.h" #include "nel/sound/u_listener.h"
#include "nel/misc/sheet_id.h"
extern class CSoundManager *SoundMngr; extern class CSoundManager *SoundMngr;
@ -88,13 +89,13 @@ public:
/// Return the audio mixer instance pointer. /// Return the audio mixer instance pointer.
NLSOUND::UAudioMixer *getMixer(); NLSOUND::UAudioMixer *getMixer();
TSourceId addSource( const NLMISC::TStringId &soundName, const NLMISC::CVector &position, bool play = true , bool loop = false, const NLMISC::CEntityId &id = NLMISC::CEntityId::Unknown ); TSourceId addSource( const NLMISC::CSheetId &soundName, const NLMISC::CVector &position, bool play = true , bool loop = false, const NLMISC::CEntityId &id = NLMISC::CEntityId::Unknown );
/// spawn a new source to the world but sound manager don't keep any link and the sound will be automatically deleted when finnished /// spawn a new source to the world but sound manager don't keep any link and the sound will be automatically deleted when finnished
bool spawnSource (const NLMISC::TStringId &soundName, NLSOUND::CSoundContext &context); bool spawnSource (const NLMISC::CSheetId &soundName, NLSOUND::CSoundContext &context);
/// spawn a new source to the world but sound manager don't keep any link and the sound will be automatically deleted when finnished /// spawn a new source to the world but sound manager don't keep any link and the sound will be automatically deleted when finnished
bool spawnSource( const NLMISC::TStringId &soundName, const NLMISC::CVector &position ); bool spawnSource( const NLMISC::CSheetId &soundName, const NLMISC::CVector &position );
/** /**
* remove a source * remove a source

@ -134,24 +134,9 @@ void updateClientTime();
// update smoothed time (useful for sky animation) // update smoothed time (useful for sky animation)
void updateSmoothedTime(); void updateSmoothedTime();
inline TTime ryzomGetLocalTime () inline NLMISC::TTime ryzomGetLocalTime()
{ {
#ifdef NL_OS_WINDOWS return NLMISC::CTime::getLocalTime();
if (ClientCfg.TimerMode == 0)
{
return (TTime)(NLMISC::CTime::ticksToSecond (NLMISC::CTime::getPerformanceTime()) * 1000.0);
}
else // if (ClientCfg.TimerMode == 1)
{
// Use 1 ms timer precision
timeBeginPeriod(1);
DWORD start = timeGetTime();
timeEndPeriod(1);
return (TTime)start;
}
#else // NL_OS_WINDOWS
return (TTime)(NLMISC::CTime::ticksToSecond (NLMISC::CTime::getPerformanceTime()) * 1000.0);
#endif // NL_OS_WINDOWS
} }
inline NLMISC::TTicks ryzomGetPerformanceTime() inline NLMISC::TTicks ryzomGetPerformanceTime()

@ -3,11 +3,14 @@ Version=1.0
Name=Ryzom Name=Ryzom
Name[ru]=Ризом Name[ru]=Ризом
Type=Application Type=Application
GenericName=ryzom GenericName=Game client
Comment=Ryzom client Comment=Ryzom client
Comment[fr_FR]=Client Ryzom Comment[fr_FR]=Client Ryzom
Exec=${RYZOM_BIN_PREFIX}/ryzom_client TryExec=${RYZOM_GAMES_PREFIX}/ryzom_client
Exec=${RYZOM_GAMES_PREFIX}/ryzom_client
Icon=ryzom Icon=ryzom
Terminal=false Terminal=false
Hidden=false Hidden=false
Categories=Game;RolePlaying; Categories=Game;RolePlaying;
StartupWMClass=ryzom
X-AppInstall-Package=ryzom-client

@ -320,9 +320,9 @@ CStaticFames::CStaticFames()
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
CStaticFames::~CStaticFames() CStaticFames::~CStaticFames()
{ {
delete _FameTable; delete[] _FameTable;
_FameTable = NULL; _FameTable = NULL;
delete _PropagationFactorTable; delete[] _PropagationFactorTable;
_PropagationFactorTable = NULL; _PropagationFactorTable = NULL;
} }

@ -12,6 +12,9 @@ IF(WIN32)
ADD_SUBDIRECTORY(world_editor) ADD_SUBDIRECTORY(world_editor)
IF(WITH_MFC) IF(WITH_MFC)
ADD_SUBDIRECTORY(mission_compiler_fe) ADD_SUBDIRECTORY(mission_compiler_fe)
ADD_SUBDIRECTORY(georges_dll)
ADD_SUBDIRECTORY(georges_exe)
ADD_SUBDIRECTORY(georges_plugin_sound)
ENDIF(WITH_MFC) ENDIF(WITH_MFC)
ENDIF(WIN32) ENDIF(WIN32)

@ -0,0 +1,19 @@
FILE(GLOB SRC *.cpp *.h)
ADD_LIBRARY(georges_dll SHARED ${SRC} georges_edit.rc)
INCLUDE_DIRECTORIES(${NEL_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
TARGET_LINK_LIBRARIES(georges_dll nelmisc nelgeorges)
NL_DEFAULT_PROPS(georges_dll "Ryzom, Tools, Georges: Georges Dll")
NL_ADD_RUNTIME_FLAGS(georges_dll)
NL_ADD_LIB_SUFFIX(georges_dll)
ADD_DEFINITIONS(${MFC_DEFINITIONS} -DGEORGES_EXPORT)
IF(WITH_PCH)
ADD_NATIVE_PRECOMPILED_HEADER(georges_dll ${CMAKE_CURRENT_SOURCE_DIR}/stdafx.h ${CMAKE_CURRENT_SOURCE_DIR}/stdafx.cpp)
ENDIF(WITH_PCH)
INSTALL(TARGETS georges_dll LIBRARY DESTINATION lib RUNTIME DESTINATION bin ARCHIVE DESTINATION lib COMPONENT libraries)

@ -37,7 +37,7 @@ public:
// From CDialog // From CDialog
void OnOK () {} void OnOK () {}
void OnCancel () void OnCancel ();
// Dialog Data // Dialog Data
//{{AFX_DATA(COutputConsoleDlg) //{{AFX_DATA(COutputConsoleDlg)

@ -0,0 +1,12 @@
FILE(GLOB SRC *.cpp *.h)
ADD_DEFINITIONS(${MFC_DEFINITIONS})
SET(CMAKE_MFC_FLAG 2)
ADD_EXECUTABLE(georges_exe WIN32 ${SRC} georges_exe.rc)
TARGET_LINK_LIBRARIES(georges_exe nelmisc nelgeorges georges_dll)
NL_DEFAULT_PROPS(georges_exe "Ryzom, Tools, Georges: Georges Exe")
NL_ADD_RUNTIME_FLAGS(georges_exe)
INSTALL(TARGETS georges_exe RUNTIME DESTINATION bin COMPONENT tools)

@ -0,0 +1,26 @@
FILE(GLOB SRC *.cpp *.h)
# Bugfix...
IF (NOT DXSDK_INCLUDE_DIR)
IF (DXSDK_DIR)
SET(DXSDK_INCLUDE_DIR "${DXSDK_DIR}/Include")
ENDIF (DXSDK_DIR)
ENDIF (NOT DXSDK_INCLUDE_DIR)
IF (NOT DXSDK_INCLUDE_DIR)
message(FATAL_ERROR "Configuration bad, cannot find DirectX include.")
ENDIF (NOT DXSDK_INCLUDE_DIR)
ADD_LIBRARY(georges_plugin_sound SHARED ${SRC})
INCLUDE_DIRECTORIES(georges_plugin_sound ${NEL_INCLUDE_DIR} ${DXSDK_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(georges_plugin_sound nelmisc nelgeorges nelsound nelligo nelsnd_lowlevel georges_dll ${DXSDK_DSOUND_LIBRARY} ${DXSDK_GUID_LIBRARY})
NL_DEFAULT_PROPS(georges_plugin_sound "Ryzom, Tools, Georges: Georges Plugin Sound")
NL_ADD_RUNTIME_FLAGS(georges_plugin_sound)
NL_ADD_LIB_SUFFIX(georges_plugin_sound)
ADD_DEFINITIONS(${MFC_DEFINITIONS})
INSTALL(TARGETS georges_plugin_sound LIBRARY DESTINATION lib RUNTIME DESTINATION bin ARCHIVE DESTINATION lib COMPONENT libraries)

@ -68,6 +68,9 @@ CSoundPlugin::CSoundPlugin(IEdit *globalInterface)
{ {
AFX_MANAGE_STATE(AfxGetStaticModuleState()); AFX_MANAGE_STATE(AfxGetStaticModuleState());
// Initialize without sheet id bin
NLMISC::CSheetId::initWithoutSheet();
CVector dir; CVector dir;
_GlobalInterface = globalInterface; _GlobalInterface = globalInterface;
@ -337,7 +340,7 @@ void CSoundPlugin::setActiveDocument(IEditDocument *pdoc)
_Dialog.setName(_Filename); _Dialog.setName(_Filename);
// 1st, try to found the sound in the preloaded sound bank. // 1st, try to found the sound in the preloaded sound bank.
_Sound = _Mixer->getSoundId(CStringMapper::map(_Filename)); _Sound = _Mixer->getSoundId(CSheetId(_Filename, "sound"));
if (_Sound == NULL) if (_Sound == NULL)
{ {
// not found, create a new one. // not found, create a new one.
@ -537,7 +540,7 @@ void CSoundPlugin::play(std::string &filename)
// point.Name = string("simulation-")+_Sound->getName()+"-000"; // point.Name = string("simulation-")+_Sound->getName()+"-000";
region.VPoints.push_back(point); region.VPoints.push_back(point);
string name = string("simulation-")+CStringMapper::unmap(_Sound->getName())+"-000"; string name = string("simulation-")+NLMISC::CFile::getFilenameWithoutExtension(_Sound->getName().toString())+"-000";
if (region.VPoints.back().checkProperty("name")) if (region.VPoints.back().checkProperty("name"))
region.VPoints.back().removePropertyByName("name"); region.VPoints.back().removePropertyByName("name");

@ -40,7 +40,7 @@
#include "nel/sound/driver/sound_driver.h" #include "nel/sound/driver/sound_driver.h"
#include "nel/sound/driver/source.h" #include "nel/sound/driver/source.h"
#include "nel/sound/driver/listener.h" #include "nel/sound/driver/listener.h"
#include "sound/driver/dsound/source_dsound.h" // #include "sound/driver/dsound/source_dsound.h"
#include "nel/sound/u_audio_mixer.h" #include "nel/sound/u_audio_mixer.h"
#include "nel/sound/u_listener.h" #include "nel/sound/u_listener.h"
@ -49,7 +49,7 @@
class NLSOUND::IBuffer; class NLSOUND::IBuffer;
class NLSOUND::IListener; class NLSOUND::IListener;
class NLSOUND::USource; class NLSOUND::USource;
class NLSOUND::CSourceDSound; // class NLSOUND::CSourceDSound;
class NLSOUND::CSound; class NLSOUND::CSound;

@ -3,7 +3,11 @@ ADD_SUBDIRECTORY(land_export_lib)
IF(WITH_MFC) IF(WITH_MFC)
ADD_SUBDIRECTORY(world_editor) ADD_SUBDIRECTORY(world_editor)
ADD_SUBDIRECTORY(world_editor_fauna_graph_plugin)
ADD_SUBDIRECTORY(world_editor_graph_plugin)
ADD_SUBDIRECTORY(world_editor_primitive_plugin) ADD_SUBDIRECTORY(world_editor_primitive_plugin)
ADD_SUBDIRECTORY(world_editor_shard_monitor_plugin)
ADD_SUBDIRECTORY(world_editor_sound_plugin)
ENDIF(WITH_MFC) ENDIF(WITH_MFC)
# This is an old plugin and is deprecated. It doesn't even compile anymore. # This is an old plugin and is deprecated. It doesn't even compile anymore.

@ -0,0 +1,21 @@
FILE(GLOB SRC *.cpp *.h)
ADD_LIBRARY(world_editor_fauna_graph_plugin SHARED ${SRC})
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(world_editor_fauna_graph_plugin
nelmisc
nel3d
nelsound
nelsnd_lowlevel)
NL_DEFAULT_PROPS(world_editor_fauna_graph_plugin "Ryzom, Tools, World: World Editor Fauna Graph Plugin")
NL_ADD_RUNTIME_FLAGS(world_editor_fauna_graph_plugin)
NL_ADD_LIB_SUFFIX(world_editor_fauna_graph_plugin)
ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} ${MFC_DEFINITIONS} -DWIN32_DLL_EXPORTS)
INSTALL(TARGETS world_editor_fauna_graph_plugin LIBRARY DESTINATION lib RUNTIME DESTINATION bin ARCHIVE DESTINATION lib COMPONENT tools3d)

@ -0,0 +1,22 @@
FILE(GLOB SRC *.cpp *.h)
ADD_LIBRARY(world_editor_graph_plugin SHARED ${SRC})
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(world_editor_graph_plugin
nelmisc
nel3d
nelsound
nelsnd_lowlevel
ryzom_mission_compiler_lib)
NL_DEFAULT_PROPS(world_editor_graph_plugin "Ryzom, Tools, World: World Editor Graph Plugin")
NL_ADD_RUNTIME_FLAGS(world_editor_graph_plugin)
NL_ADD_LIB_SUFFIX(world_editor_graph_plugin)
ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} ${MFC_DEFINITIONS} -DWIN32_DLL_EXPORTS)
INSTALL(TARGETS world_editor_graph_plugin LIBRARY DESTINATION lib RUNTIME DESTINATION bin ARCHIVE DESTINATION lib COMPONENT tools3d)

@ -72,7 +72,7 @@ private:
void serial (NLMISC::IStream &s); void serial (NLMISC::IStream &s);
static uint getVersion () static uint getVersion ();
void removed() {} void removed() {}
}; };

@ -0,0 +1,22 @@
FILE(GLOB SRC *.cpp *.h)
ADD_LIBRARY(world_editor_shard_monitor_plugin SHARED ${SRC})
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(world_editor_shard_monitor_plugin
nelmisc
nel3d
nelsound
nelsnd_lowlevel
ryzom_gameshare)
NL_DEFAULT_PROPS(world_editor_shard_monitor_plugin "Ryzom, Tools, World: World Editor Shard Monitor Plugin")
NL_ADD_RUNTIME_FLAGS(world_editor_shard_monitor_plugin)
NL_ADD_LIB_SUFFIX(world_editor_shard_monitor_plugin)
ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} ${MFC_DEFINITIONS} -DWIN32_DLL_EXPORTS)
INSTALL(TARGETS world_editor_shard_monitor_plugin LIBRARY DESTINATION lib RUNTIME DESTINATION bin ARCHIVE DESTINATION lib COMPONENT tools3d)

@ -0,0 +1,21 @@
FILE(GLOB SRC *.cpp *.h)
ADD_LIBRARY(world_editor_sound_plugin SHARED ${SRC})
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(world_editor_sound_plugin
nelmisc
nel3d
nelsound
nelsnd_lowlevel)
NL_DEFAULT_PROPS(world_editor_sound_plugin "Ryzom, Tools, World: World Editor Sound Plugin")
NL_ADD_RUNTIME_FLAGS(world_editor_sound_plugin)
NL_ADD_LIB_SUFFIX(world_editor_sound_plugin)
ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} ${MFC_DEFINITIONS} -DWIN32_DLL_EXPORTS)
INSTALL(TARGETS world_editor_sound_plugin LIBRARY DESTINATION lib RUNTIME DESTINATION bin ARCHIVE DESTINATION lib COMPONENT tools3d)
Loading…
Cancel
Save