Implemented support for calling scripts from with Present3D.

This commit is contained in:
Robert Osfield
2013-12-19 10:02:16 +00:00
parent 591c5bae42
commit a8dc460085
3 changed files with 352 additions and 50 deletions

View File

@@ -240,6 +240,15 @@ void SlideShowConstructor::createPresentation()
//_root->addEventCallback(_propertyEventCallback.get());
_presentationSwitch->setEventCallback(_propertyEventCallback.get());
for(ScriptEngineMap::iterator itr = _scriptEngines.begin();
itr != _scriptEngines.end();
++itr)
{
OSG_NOTICE<<"Assigning '"<<itr->first<<"' ScriptEngine to Presentation in createPresentation()."<<std::endl;
_presentationSwitch->getOrCreateUserDataContainer()->addUserObject(itr->second.get());
}
}
LayerAttributes* SlideShowConstructor::getOrCreateLayerAttributes(osg::Node* node)
@@ -290,6 +299,48 @@ void SlideShowConstructor::setPresentationDuration(double duration)
}
}
void SlideShowConstructor::addScriptEngine(const std::string& scriptEngineName)
{
if (_scriptEngines.count(scriptEngineName)!=0)
{
OSG_NOTICE<<"Script engine "<<scriptEngineName<<" already loaded."<<std::endl;
}
osg::ref_ptr<osg::ScriptEngine> scriptEngine = osgDB::readFile<osg::ScriptEngine>(std::string("ScriptEngine.")+scriptEngineName);
if (scriptEngine.valid())
{
_scriptEngines[scriptEngineName] = scriptEngine;
if (_presentationSwitch.valid())
{
_presentationSwitch->getOrCreateUserDataContainer()->addUserObject(scriptEngine.get());
}
}
else
{
OSG_NOTICE<<"Warning: Failed to load "<<scriptEngineName<<" engine, scripts will not work."<<std::endl;
}
}
void SlideShowConstructor::addScriptFile(const std::string& name, const std::string& filename)
{
OSG_NOTICE<<"addScriptFile() name="<<name<<", filename = "<<filename<<std::endl;
osg::ref_ptr<osg::Script> script = osgDB::readFile<osg::Script>(filename);
if (script.valid())
{
_scripts[name] = script;
}
}
void SlideShowConstructor::addScript(const std::string& name, const std::string& language, const std::string& scriptContents)
{
OSG_NOTICE<<"addScript() language="<<language<<", name="<<name<<", script = "<<scriptContents<<std::endl;
osg::ref_ptr<osg::Script> script = new osg::Script;
script->setLanguage(language);
script->setScript(scriptContents);
_scripts[name] = script;
}
void SlideShowConstructor::addSlide()
{
if (!_presentationSwitch) createPresentation();
@@ -642,6 +693,68 @@ void SlideShowConstructor::addPropertyAnimation(PresentationContext presentation
}
}
void SlideShowConstructor::addScriptCallback(PresentationContext presentationContext, ScriptCallbackType scriptCallbackType, const std::string& name)
{
switch(presentationContext)
{
case(CURRENT_PRESENTATION):
OSG_NOTICE<<" Adding ScriptCallback to presentation."<<std::endl;
if (!_presentationSwitch) createPresentation();
if (_presentationSwitch.valid()) addScriptToNode(scriptCallbackType, name, _presentationSwitch.get());
break;
case(CURRENT_SLIDE):
OSG_NOTICE<<" Adding ScriptCallback to slide."<<std::endl;
if (!_slide) addSlide();
if (_slide.valid()) addScriptToNode(scriptCallbackType, name, _slide.get());
break;
case(CURRENT_LAYER):
OSG_NOTICE<<" Adding ScriptCallback to layer."<<std::endl;
if (!_currentLayer) addLayer();
if (_currentLayer.valid())
{
addScriptToNode(scriptCallbackType, name, _currentLayer.get());
}
break;
}
}
void SlideShowConstructor::addScriptToNode(ScriptCallbackType scriptCallbackType, const std::string& name, osg::Node* node)
{
std::string::size_type colon_position = name.find(':');
std::string script_name = (colon_position==std::string::npos) ? name : name.substr(0, colon_position);
std::string entry_point = (colon_position==std::string::npos) ? std::string() : name.substr(colon_position+1,std::string::npos);
ScriptMap::iterator script_itr = _scripts.find(script_name);
if (script_itr!=_scripts.end())
{
switch(scriptCallbackType)
{
case(UPDATE_SCRIPT) :
node->addUpdateCallback(new osg::ScriptCallback(script_itr->second.get(), entry_point));
break;
case(EVENT_SCRIPT) :
node->addEventCallback(new osg::ScriptCallback(script_itr->second.get(), entry_point));
break;
}
}
else
{
OSG_NOTICE<<"Warning: script '"<<name<<"' not defined."<<std::endl;
}
}
void SlideShowConstructor::addScriptsToNode(const ScriptData& scriptData, osg::Node* node)
{
if (!node) return;
for(ScriptData::Scripts::const_iterator itr = scriptData.scripts.begin();
itr != scriptData.scripts.end();
++itr)
{
addScriptToNode(itr->first, itr->second, node);
}
}
osg::Node* SlideShowConstructor::decorateSubgraphForPosition(osg::Node* node, PositionData& positionData)
{
@@ -675,7 +788,7 @@ osg::Node* SlideShowConstructor::decorateSubgraphForPosition(osg::Node* node, Po
return subgraph;
}
void SlideShowConstructor::addBullet(const std::string& bullet, PositionData& positionData, FontData& fontData)
void SlideShowConstructor::addBullet(const std::string& bullet, PositionData& positionData, FontData& fontData, const ScriptData& scriptData)
{
osg::Geode* geode = new osg::Geode;
@@ -721,9 +834,11 @@ void SlideShowConstructor::addBullet(const std::string& bullet, PositionData& po
{
updatePositionFromInModelCoords(localPosition, _textPositionData);
}
if (scriptData.hasScripts()) addScriptsToNode(scriptData, geode);
}
void SlideShowConstructor::addParagraph(const std::string& paragraph, PositionData& positionData, FontData& fontData)
void SlideShowConstructor::addParagraph(const std::string& paragraph, PositionData& positionData, FontData& fontData, const ScriptData& scriptData)
{
osg::Geode* geode = new osg::Geode;
@@ -768,6 +883,8 @@ void SlideShowConstructor::addParagraph(const std::string& paragraph, PositionDa
{
updatePositionFromInModelCoords(localPosition, _textPositionData);
}
if (scriptData.hasScripts()) addScriptsToNode(scriptData, geode);
}
class FindImageStreamsVisitor : public osg::NodeVisitor
@@ -1180,7 +1297,7 @@ void SlideShowConstructor::setUpMovieVolume(osg::Node* subgraph, osg::ImageStrea
}
}
void SlideShowConstructor::addImage(const std::string& filename, const PositionData& positionData, const ImageData& imageData)
void SlideShowConstructor::addImage(const std::string& filename, const PositionData& positionData, const ImageData& imageData, const ScriptData& scriptData)
{
osg::ref_ptr<osg::Image> image = readImage(filename, imageData);
if (!image) return;
@@ -1338,9 +1455,11 @@ void SlideShowConstructor::addImage(const std::string& filename, const PositionD
}
addToCurrentLayer(subgraph);
if (scriptData.hasScripts()) addScriptsToNode(scriptData, subgraph);
}
void SlideShowConstructor::addStereoImagePair(const std::string& filenameLeft, const ImageData& imageDataLeft, const std::string& filenameRight, const ImageData& imageDataRight,const PositionData& positionData)
void SlideShowConstructor::addStereoImagePair(const std::string& filenameLeft, const ImageData& imageDataLeft, const std::string& filenameRight, const ImageData& imageDataRight,const PositionData& positionData, const ScriptData& scriptData)
{
osg::ref_ptr<osg::Image> imageLeft = readImage(filenameLeft, imageDataLeft);
osg::ref_ptr<osg::Image> imageRight = (filenameRight==filenameLeft) ? imageLeft.get() : readImage(filenameRight, imageDataRight);
@@ -1560,9 +1679,11 @@ void SlideShowConstructor::addStereoImagePair(const std::string& filenameLeft, c
}
addToCurrentLayer(subgraph);
if (scriptData.hasScripts()) addScriptsToNode(scriptData, subgraph);
}
void SlideShowConstructor::addGraph(const std::string& contents, const PositionData& positionData, const ImageData& imageData)
void SlideShowConstructor::addGraph(const std::string& contents, const PositionData& positionData, const ImageData& imageData, const ScriptData& scriptData)
{
static int s_count=0;
@@ -1620,7 +1741,7 @@ void SlideShowConstructor::addGraph(const std::string& contents, const PositionD
_options = _options.valid() ? _options->cloneOptions() : (new osgDB::Options);
_options->setObjectCacheHint(osgDB::Options::CACHE_NONE);
addImage(tmpSvgFileName, positionData, imageData);
addImage(tmpSvgFileName, positionData, imageData, scriptData);
_options = previousOptions;
@@ -1630,7 +1751,7 @@ void SlideShowConstructor::addGraph(const std::string& contents, const PositionD
}
void SlideShowConstructor::addVNC(const std::string& hostname, const PositionData& positionData, const ImageData& imageData, const std::string& password)
void SlideShowConstructor::addVNC(const std::string& hostname, const PositionData& positionData, const ImageData& imageData, const std::string& password, const ScriptData& scriptData)
{
if (!password.empty())
{
@@ -1639,17 +1760,17 @@ void SlideShowConstructor::addVNC(const std::string& hostname, const PositionDat
osgDB::Registry::instance()->getAuthenticationMap()->addAuthenticationDetails(hostname, new osgDB::AuthenticationDetails("", password));
}
addInteractiveImage(hostname+".vnc", positionData, imageData);
addInteractiveImage(hostname+".vnc", positionData, imageData, scriptData);
}
void SlideShowConstructor::addBrowser(const std::string& url, const PositionData& positionData, const ImageData& imageData)
void SlideShowConstructor::addBrowser(const std::string& url, const PositionData& positionData, const ImageData& imageData, const ScriptData& scriptData)
{
addInteractiveImage(url+".gecko", positionData, imageData);
addInteractiveImage(url+".gecko", positionData, imageData, scriptData);
}
void SlideShowConstructor::addPDF(const std::string& filename, const PositionData& positionData, const ImageData& imageData)
void SlideShowConstructor::addPDF(const std::string& filename, const PositionData& positionData, const ImageData& imageData, const ScriptData& scriptData)
{
addInteractiveImage(filename, positionData, imageData);
addInteractiveImage(filename, positionData, imageData, scriptData);
}
class SetPageCallback: public LayerCallback
@@ -1676,7 +1797,7 @@ public:
};
osg::Image* SlideShowConstructor::addInteractiveImage(const std::string& filename, const PositionData& positionData, const ImageData& imageData)
osg::Image* SlideShowConstructor::addInteractiveImage(const std::string& filename, const PositionData& positionData, const ImageData& imageData, const ScriptData& scriptData)
{
osg::ref_ptr<osgDB::Options> options = _options;
if (!imageData.options.empty())
@@ -1819,6 +1940,7 @@ osg::Image* SlideShowConstructor::addInteractiveImage(const std::string& filenam
}
if (scriptData.hasScripts()) addScriptsToNode(scriptData, subgraph);
return image;
}
@@ -1902,7 +2024,7 @@ protected:
};
void SlideShowConstructor::addModel(const std::string& filename, const PositionData& positionData, const ModelData& modelData)
void SlideShowConstructor::addModel(const std::string& filename, const PositionData& positionData, const ModelData& modelData, const ScriptData& scriptData)
{
OSG_INFO<<"SlideShowConstructor::addModel("<<filename<<")"<<std::endl;
@@ -1986,18 +2108,19 @@ void SlideShowConstructor::addModel(const std::string& filename, const PositionD
if (subgraph.valid())
{
addModel(subgraph.get(), positionData, modelData);
addModel(subgraph.get(), positionData, modelData, scriptData);
}
else
{
OSG_NOTICE<<"Could not loaded model file : "<<filename<<std::endl;
}
OSG_INFO<<"end of SlideShowConstructor::addModel("<<filename<<")"<<std::endl<<std::endl;
}
void SlideShowConstructor::addModel(osg::Node* subgraph, const PositionData& positionData, const ModelData& modelData)
void SlideShowConstructor::addModel(osg::Node* subgraph, const PositionData& positionData, const ModelData& modelData, const ScriptData& scriptData)
{
osg::Object::DataVariance defaultMatrixDataVariance = osg::Object::DYNAMIC; // STATIC
@@ -2165,6 +2288,8 @@ void SlideShowConstructor::addModel(osg::Node* subgraph, const PositionData& pos
findImageStreamsAndAddCallbacks(subgraph);
addToCurrentLayer(subgraph);
if (scriptData.hasScripts()) addScriptsToNode(scriptData, subgraph);
}
class DraggerVolumeTileCallback : public osgManipulator::DraggerCallback
@@ -2378,7 +2503,7 @@ void SlideShowConstructor::setUpVolumeScalarProperty(osgVolume::VolumeTile* tile
}
void SlideShowConstructor::addVolume(const std::string& filename, const PositionData& in_positionData, const VolumeData& volumeData)
void SlideShowConstructor::addVolume(const std::string& filename, const PositionData& in_positionData, const VolumeData& volumeData, const ScriptData& scriptData)
{
// osg::Object::DataVariance defaultMatrixDataVariance = osg::Object::DYNAMIC; // STATIC
@@ -2724,7 +2849,7 @@ void SlideShowConstructor::addVolume(const std::string& filename, const Position
}
ModelData modelData;
addModel(model.get(), positionData, modelData);
addModel(model.get(), positionData, modelData, scriptData);
}
bool SlideShowConstructor::attachTexMat(osg::StateSet* stateset, const ImageData& imageData, float s, float t, bool textureRectangle)