Merge branch 'next' of git://gitorious.org/fg/simgear into next

This commit is contained in:
Frederic Bouvier
2010-09-09 20:06:27 +02:00
15 changed files with 245 additions and 48 deletions
+2
View File
@@ -220,6 +220,8 @@
<ClCompile Include="..\..\simgear\misc\tabbed_values.cxx" /> <ClCompile Include="..\..\simgear\misc\tabbed_values.cxx" />
<ClCompile Include="..\..\simgear\misc\texcoord.cxx" /> <ClCompile Include="..\..\simgear\misc\texcoord.cxx" />
<ClCompile Include="..\..\simgear\misc\zfstream.cxx" /> <ClCompile Include="..\..\simgear\misc\zfstream.cxx" />
<ClCompile Include="..\..\simgear\misc\ResourceManager.cxx" />
<ClCompile Include="..\..\simgear\misc\ResourceManager.hxx" />
<ClCompile Include="..\..\simgear\route\route.cxx" /> <ClCompile Include="..\..\simgear\route\route.cxx" />
<ClCompile Include="..\..\simgear\route\waypoint.cxx" /> <ClCompile Include="..\..\simgear\route\waypoint.cxx" />
<ClCompile Include="..\..\simgear\screen\extensions.cxx" /> <ClCompile Include="..\..\simgear\screen\extensions.cxx" />
+8
View File
@@ -671,6 +671,14 @@
RelativePath="..\..\simgear\misc\zfstream.hxx" RelativePath="..\..\simgear\misc\zfstream.hxx"
> >
</File> </File>
<File
RelativePath="..\..\simgear\misc\ResourceManager.cxx"
>
</File>
<File
RelativePath="..\..\simgear\misc\ResourceManager.hxx"
>
</File>
</Filter> </Filter>
<Filter <Filter
Name="Lib_sgroute" Name="Lib_sgroute"
+4 -2
View File
@@ -13,7 +13,8 @@ include_HEADERS = \
interpolator.hxx \ interpolator.hxx \
stdint.hxx \ stdint.hxx \
PathOptions.hxx \ PathOptions.hxx \
sg_dir.hxx sg_dir.hxx \
ResourceManager.hxx
libsgmisc_a_SOURCES = \ libsgmisc_a_SOURCES = \
sg_path.cxx \ sg_path.cxx \
@@ -24,7 +25,8 @@ libsgmisc_a_SOURCES = \
zfstream.cxx \ zfstream.cxx \
interpolator.cxx \ interpolator.cxx \
PathOptions.cxx \ PathOptions.cxx \
sg_dir.cxx sg_dir.cxx \
ResourceManager.cxx
#noinst_PROGRAMS = tabbed_value_test swap_test #noinst_PROGRAMS = tabbed_value_test swap_test
+104
View File
@@ -0,0 +1,104 @@
// ResourceManager.cxx -- manage finding resources by names/paths
// Copyright (C) 2010 James Turner
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// $Id$
#include <simgear_config.h>
#include <simgear/misc/ResourceManager.hxx>
namespace simgear
{
static ResourceManager* static_manager = NULL;
ResourceManager::ResourceManager()
{
}
ResourceManager* ResourceManager::instance()
{
if (!static_manager) {
static_manager = new ResourceManager();
}
return static_manager;
}
/**
* trivial provider using a fixed base path
*/
class BasePathProvider : public ResourceProvider
{
public:
BasePathProvider(const SGPath& aBase, int aPriority) :
ResourceProvider(aPriority),
_base(aBase)
{
}
virtual SGPath resolve(const std::string& aResource, SGPath&) const
{
SGPath p(_base, aResource);
return p.exists() ? p : SGPath();
}
private:
SGPath _base;
};
void ResourceManager::addBasePath(const SGPath& aPath, Priority aPriority)
{
addProvider(new BasePathProvider(aPath, aPriority));
}
void ResourceManager::addProvider(ResourceProvider* aProvider)
{
ProviderVec::iterator it = _providers.begin();
for (; it != _providers.end(); ++it) {
if (aProvider->priority() > (*it)->priority()) {
_providers.insert(it, aProvider);
return;
}
}
// fell out of the iteration, goes to the end of the vec
_providers.push_back(aProvider);
}
SGPath ResourceManager::findPath(const std::string& aResource, SGPath aContext)
{
if (!aContext.isNull()) {
SGPath r(aContext, aResource);
if (r.exists()) {
return r;
}
}
ProviderVec::iterator it = _providers.begin();
for (; it != _providers.end(); ++it) {
SGPath path = (*it)->resolve(aResource, aContext);
if (!path.isNull()) {
return path;
}
}
return SGPath();
}
} // of namespace simgear
+93
View File
@@ -0,0 +1,93 @@
// ResourceManager.hxx -- manage finding resources by names/paths
// Copyright (C) 2010 James Turner
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// $Id$
#ifndef SG_RESOURCE_MANAGER_HXX
#define SG_RESOURCE_MANAGER_HXX
#include <vector>
#include <simgear/misc/sg_path.hxx>
namespace simgear
{
class ResourceProvider;
/**
* singleton management of resources
*/
class ResourceManager
{
public:
typedef enum {
PRIORITY_DEFAULT = 0,
PRIORITY_FALLBACK = -100,
PRIORITY_NORMAL = 100,
PRIORITY_HIGH = 1000
} Priority;
static ResourceManager* instance();
/**
* add a simple fixed resource location, to resolve against
*/
void addBasePath(const SGPath& aPath, Priority aPriority = PRIORITY_DEFAULT);
/**
*
*/
void addProvider(ResourceProvider* aProvider);
/**
* given a resource name (or path), find the appropriate real resource
* path.
* @param aContext an optional current location to resolve relative names
* against (e.g a current directory)
*/
SGPath findPath(const std::string& aResource, SGPath aContext = SGPath());
private:
ResourceManager();
typedef std::vector<ResourceProvider*> ProviderVec;
ProviderVec _providers;
};
class ResourceProvider
{
public:
virtual SGPath resolve(const std::string& aResource, SGPath& aContext) const = 0;
virtual int priority() const
{
return _priority;
}
protected:
ResourceProvider(int aPriority) :
_priority(aPriority)
{}
int _priority;
};
} // of simgear namespace
#endif // of header guard
+5
View File
@@ -358,3 +358,8 @@ bool SGPath::isAbsolute() const
return (path[0] == sgDirPathSep); return (path[0] == sgDirPathSep);
} }
bool SGPath::isNull() const
{
return path.empty() || (path == "");
}
+5
View File
@@ -166,6 +166,11 @@ public:
* I.e starts with a directory seperator, or a single character + colon * I.e starts with a directory seperator, or a single character + colon
*/ */
bool isAbsolute() const; bool isAbsolute() const;
/**
* check for default constructed path
*/
bool isNull() const;
private: private:
void fix(); void fix();
+5 -23
View File
@@ -30,6 +30,7 @@
#include <simgear/props/props_io.hxx> #include <simgear/props/props_io.hxx>
#include <simgear/scene/model/model.hxx> #include <simgear/scene/model/model.hxx>
#include <simgear/scene/model/ModelRegistry.hxx> #include <simgear/scene/model/ModelRegistry.hxx>
#include <simgear/misc/ResourceManager.hxx>
#include "SGPagedLOD.hxx" #include "SGPagedLOD.hxx"
#include "SGReaderWriterXML.hxx" #include "SGReaderWriterXML.hxx"
@@ -47,7 +48,6 @@ ModelRegistryCallbackProxy<LoadOnlyCallback> g_xmlCallbackProxy("xml");
SGPropertyNode_ptr SGModelLib::static_propRoot; SGPropertyNode_ptr SGModelLib::static_propRoot;
SGModelLib::panel_func SGModelLib::static_panelFunc = NULL; SGModelLib::panel_func SGModelLib::static_panelFunc = NULL;
SGModelLib::resolve_func SGModelLib::static_resolver = NULL;
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
// Implementation of SGModelLib. // Implementation of SGModelLib.
@@ -67,33 +67,15 @@ void SGModelLib::setPanelFunc(panel_func pf)
static_panelFunc = pf; static_panelFunc = pf;
} }
void SGModelLib::setResolveFunc(resolve_func rf)
{
static_resolver = rf;
}
std::string SGModelLib::findDataFile(const std::string& file, std::string SGModelLib::findDataFile(const std::string& file,
const osgDB::ReaderWriter::Options* opts, const osgDB::ReaderWriter::Options* opts,
SGPath currentPath) SGPath currentPath)
{ {
// if we have a valid current path, first attempt to resolve relative SGPath p = ResourceManager::instance()->findPath(file, currentPath);
// to that path if (p.exists()) {
if (currentPath.exists()) { return p.str();
SGPath p = currentPath;
p.append(file);
if (p.exists()) {
return p.str();
}
} }
// next try the resolve function if one has been defined
if (static_resolver) {
SGPath p = static_resolver(file);
if (p.exists()) {
return p.str();
}
}
// finally hand on to standard OSG behaviour // finally hand on to standard OSG behaviour
return osgDB::findDataFile(file, opts); return osgDB::findDataFile(file, opts);
} }
-5
View File
@@ -44,16 +44,12 @@ class SGModelLib
public: public:
typedef osg::Node *(*panel_func)(SGPropertyNode *); typedef osg::Node *(*panel_func)(SGPropertyNode *);
typedef SGPath (*resolve_func)(const std::string& path);
static void init(const std::string &root_dir); static void init(const std::string &root_dir);
static void setPropRoot(SGPropertyNode* root); static void setPropRoot(SGPropertyNode* root);
static void setPanelFunc(panel_func pf); static void setPanelFunc(panel_func pf);
static void setResolveFunc(resolve_func rf);
// Load a 3D model (any format) // Load a 3D model (any format)
// data->modelLoaded() will be called after the model is loaded // data->modelLoaded() will be called after the model is loaded
static osg::Node* loadModel(const std::string &path, static osg::Node* loadModel(const std::string &path,
@@ -80,7 +76,6 @@ protected:
private: private:
static SGPropertyNode_ptr static_propRoot; static SGPropertyNode_ptr static_propRoot;
static panel_func static_panelFunc; static panel_func static_panelFunc;
static resolve_func static_resolver;
}; };
+8 -6
View File
@@ -26,7 +26,9 @@ int main( int argc, char *argv[] ) {
smgr->set_position( SGVec3d::fromGeod(pos), pos ); smgr->set_position( SGVec3d::fromGeod(pos), pos );
smgr->activate(); smgr->activate();
SGSoundSample *sample1 = new SGSoundSample( SRC_DIR, "jet.wav" ); SGPath srcDir(SRC_DIR);
SGSoundSample *sample1 = new SGSoundSample("jet.wav", srcDir);
sample1->set_volume(1.0); sample1->set_volume(1.0);
sample1->set_pitch(1.0); sample1->set_pitch(1.0);
sample1->play_looped(); sample1->play_looped();
@@ -35,7 +37,7 @@ int main( int argc, char *argv[] ) {
printf("playing sample1\n"); printf("playing sample1\n");
sleep(1); sleep(1);
SGSoundSample *sample2 = new SGSoundSample( SRC_DIR, "jet.wav" ); SGSoundSample *sample2 = new SGSoundSample("jet.wav", srcDir);
sample2->set_volume(0.5); sample2->set_volume(0.5);
sample2->set_pitch(0.4); sample2->set_pitch(0.4);
sample2->play_looped(); sample2->play_looped();
@@ -44,7 +46,7 @@ int main( int argc, char *argv[] ) {
printf("playing sample2\n"); printf("playing sample2\n");
sleep(1); sleep(1);
SGSoundSample *sample3 = new SGSoundSample( SRC_DIR, "jet.wav" ); SGSoundSample *sample3 = new SGSoundSample("jet.wav", srcDir);
sample3->set_volume(0.5); sample3->set_volume(0.5);
sample3->set_pitch(0.8); sample3->set_pitch(0.8);
sample3->play_looped(); sample3->play_looped();
@@ -53,7 +55,7 @@ int main( int argc, char *argv[] ) {
printf("playing sample3\n"); printf("playing sample3\n");
sleep(1); sleep(1);
SGSoundSample *sample4 = new SGSoundSample( SRC_DIR, "jet.wav" ); SGSoundSample *sample4 = new SGSoundSample("jet.wav", srcDir);
sample4->set_volume(0.5); sample4->set_volume(0.5);
sample4->set_pitch(1.2); sample4->set_pitch(1.2);
sample4->play_looped(); sample4->play_looped();
@@ -62,7 +64,7 @@ int main( int argc, char *argv[] ) {
printf("playing sample4\n"); printf("playing sample4\n");
sleep(1); sleep(1);
SGSoundSample *sample5 = new SGSoundSample( SRC_DIR, "jet.wav" ); SGSoundSample *sample5 = new SGSoundSample("jet.wav", srcDir);
sample5->set_volume(0.5); sample5->set_volume(0.5);
sample5->set_pitch(1.6); sample5->set_pitch(1.6);
sample5->play_looped(); sample5->play_looped();
@@ -71,7 +73,7 @@ int main( int argc, char *argv[] ) {
printf("playing sample5\n"); printf("playing sample5\n");
sleep(1); sleep(1);
SGSoundSample *sample6 = new SGSoundSample( SRC_DIR, "jet.wav" ); SGSoundSample *sample6 = new SGSoundSample("jet.wav", srcDir);
sample6->set_volume(0.5); sample6->set_volume(0.5);
sample6->set_pitch(2.0); sample6->set_pitch(2.0);
sample6->play_looped(); sample6->play_looped();
+3 -1
View File
@@ -25,8 +25,10 @@ int main( int argc, char *argv[] ) {
smgr->set_volume(0.9); smgr->set_volume(0.9);
smgr->activate(); smgr->activate();
SGPath srcDir(SRC_DIR);
printf("default position and orientation\n"); printf("default position and orientation\n");
SGSoundSample *sample1 = new SGSoundSample( SRC_DIR, "jet.wav" ); SGSoundSample *sample1 = new SGSoundSample("jet.wav", srcDir);
sample1->set_volume(1.0); sample1->set_volume(1.0);
sample1->set_pitch(1.0); sample1->set_pitch(1.0);
sample1->play_looped(); sample1->play_looped();
+4 -6
View File
@@ -33,6 +33,7 @@
#include <simgear/structure/exception.hxx> #include <simgear/structure/exception.hxx>
#include <simgear/misc/sg_path.hxx> #include <simgear/misc/sg_path.hxx>
#include <simgear/math/SGMath.hxx> #include <simgear/math/SGMath.hxx>
#include <simgear/misc/ResourceManager.hxx>
#include "soundmgr_openal.hxx" #include "soundmgr_openal.hxx"
#include "sample_openal.hxx" #include "sample_openal.hxx"
@@ -78,7 +79,7 @@ SGSoundSample::SGSoundSample() :
} }
// constructor // constructor
SGSoundSample::SGSoundSample( const char *path, const char *file ) : SGSoundSample::SGSoundSample(const char *file, const SGPath& currentDir) :
_absolute_pos(SGVec3d::zeros()), _absolute_pos(SGVec3d::zeros()),
_relative_pos(SGVec3d::zeros()), _relative_pos(SGVec3d::zeros()),
_direction(SGVec3d::zeros()), _direction(SGVec3d::zeros()),
@@ -110,11 +111,8 @@ SGSoundSample::SGSoundSample( const char *path, const char *file ) :
_static_changed(true), _static_changed(true),
_is_file(true) _is_file(true)
{ {
SGPath samplepath( path ); SGPath p = simgear::ResourceManager::instance()->findPath(file, currentDir);
if ( strlen(file) ) { _refname = p.str();
samplepath.append( file );
}
_refname = samplepath.str();
} }
// constructor // constructor
+1 -2
View File
@@ -60,11 +60,10 @@ public:
/** /**
* Constructor * Constructor
* @param path Path name to sound
* @param file File name of sound * @param file File name of sound
Buffer data is freed by the sample group Buffer data is freed by the sample group
*/ */
SGSoundSample( const char *path, const char *file ); SGSoundSample(const char *file, const SGPath& currentDir);
/** /**
* Constructor. * Constructor.
+2 -2
View File
@@ -84,7 +84,7 @@ SGXmlSound::~SGXmlSound()
void void
SGXmlSound::init(SGPropertyNode *root, SGPropertyNode *node, SGXmlSound::init(SGPropertyNode *root, SGPropertyNode *node,
SGSampleGroup *sgrp, SGSampleGroup *avionics, SGSampleGroup *sgrp, SGSampleGroup *avionics,
const string &path) const SGPath& currentDir)
{ {
// //
@@ -272,7 +272,7 @@ SGXmlSound::init(SGPropertyNode *root, SGPropertyNode *node,
} else { } else {
_sgrp = sgrp; _sgrp = sgrp;
} }
_sample = new SGSoundSample( path.c_str(), node->getStringValue("path", "")); _sample = new SGSoundSample(node->getStringValue("path", ""), currentDir);
if (!_sample->file_path().exists()) { if (!_sample->file_path().exists()) {
throw sg_io_exception("XML sound: couldn't find file: " + _sample->file_path().str()); throw sg_io_exception("XML sound: couldn't find file: " + _sample->file_path().str());
} }
+1 -1
View File
@@ -104,7 +104,7 @@ public:
* @param path The path where the audio files remain. * @param path The path where the audio files remain.
*/ */
virtual void init (SGPropertyNode *, SGPropertyNode *, SGSampleGroup *, virtual void init (SGPropertyNode *, SGPropertyNode *, SGSampleGroup *,
SGSampleGroup *, const string &); SGSampleGroup *, const SGPath& currentDir);
/** /**
* Check whether an event has happened and if action has to be taken. * Check whether an event has happened and if action has to be taken.