Added osg::FrameStamp::set/getSimulationTime().

Added setting of osg_SimulationTime and osg_DeltaSimulationTime to the uniforms set by SceneView

Added frame(double simulationTime) and advance(double simulationTime) parameters to
osgViewer::SimpleViewer, Vewer and CompositeViewer.

Updated various examples and Nodes to use SimulationTime where appropriate.
This commit is contained in:
Robert Osfield
2007-01-25 12:02:51 +00:00
parent 13dd5acb63
commit 7232a831da
48 changed files with 321 additions and 138 deletions

View File

@@ -233,5 +233,15 @@ int main( int argc, char **argv )
// set the scene to render
viewer.setSceneData(rootnode);
return viewer.run();
viewer.setCameraManipulator(new osgGA::TrackballManipulator());
viewer.realize();
double simulationTime = 100.0;
while (!viewer.done())
{
viewer.frame(simulationTime);
simulationTime -= 0.01;
}
}

View File

@@ -236,12 +236,14 @@ class DataConverter
writeUInt(fs.getFrameNumber());
writeDouble(fs.getReferenceTime());
writeDouble(fs.getSimulationTime());
}
void read(osg::FrameStamp& fs)
{
fs.setFrameNumber(readUInt());
fs.setReferenceTime(readDouble());
fs.setSimulationTime(readDouble());
osg::notify(osg::NOTICE)<<"readFramestamp = "<<fs.getFrameNumber()<<" "<<fs.getReferenceTime()<<std::endl;
}

View File

@@ -62,7 +62,7 @@ LightTransformCallback::operator()(Node* node, NodeVisitor* nv)
const FrameStamp* fs = nv->getFrameStamp();
if (!fs) return; // not frame stamp, no handle on the time so can't move.
double new_time = fs->getReferenceTime();
double new_time = fs->getSimulationTime();
if (nv->getTraversalNumber() != _previous_traversal_number)
{
_angle += _angular_velocity * (new_time - _previous_time);

View File

@@ -34,7 +34,7 @@ public:
{
osg::MatrixTransform *xform = dynamic_cast<osg::MatrixTransform *>(node);
if (xform && enabled_) {
double t = nv->getFrameStamp()->getReferenceTime();
double t = nv->getFrameStamp()->getSimulationTime();
xform->setMatrix(osg::Matrix::rotate(t, osg::Vec3(0, 0, 1)));
}
traverse(node, nv);

View File

@@ -524,7 +524,7 @@ class MyTransformCallback : public osg::NodeCallback
osg::MatrixTransform* transform = dynamic_cast<osg::MatrixTransform*>(node);
if (nv && transform && nv->getFrameStamp())
{
double time = nv->getFrameStamp()->getReferenceTime();
double time = nv->getFrameStamp()->getSimulationTime();
transform->setMatrix(osg::Matrix::translate(0.0f,1.0f+cosf(time*_angular_velocity),0.0f));
}

View File

@@ -41,10 +41,10 @@ class ModelTransformCallback : public osg::NodeCallback
{
if (_firstTime==0.0)
{
_firstTime = frameStamp->getReferenceTime();
_firstTime = frameStamp->getSimulationTime();
}
double phase = (frameStamp->getReferenceTime()-_firstTime)/_period;
double phase = (frameStamp->getSimulationTime()-_firstTime)/_period;
phase -= floor(phase);
phase *= (2.0 * osg::PI);

View File

@@ -26,7 +26,7 @@ public:
virtual void operator () (osg::GraphicsContext* gc)
{
double t = gc->getState()->getFrameStamp()->getReferenceTime();
double t = gc->getState()->getFrameStamp()->getSimulationTime();
if (!cleared_)
{

View File

@@ -82,7 +82,7 @@ class UniformVarying : public osg::Uniform::Callback
virtual void operator () (osg::Uniform* uniform, osg::NodeVisitor* nv)
{
const osg::FrameStamp* fs = nv->getFrameStamp();
float value = sinf(fs->getReferenceTime());
float value = sinf(fs->getSimulationTime());
uniform->set(osg::Vec4(value,-value,-value,value));
}
};

View File

@@ -424,7 +424,7 @@ void Page::traverse(osg::NodeVisitor& nv)
const osg::FrameStamp* framestamp = nv.getFrameStamp();
if (framestamp)
{
double t = framestamp->getReferenceTime();
double t = framestamp->getSimulationTime();
if (_rotation!=_targetRotation)
{

View File

@@ -32,7 +32,7 @@ class MyGustCallback : public osg::NodeCallback
{
osgParticle::PrecipitationEffect* pe = dynamic_cast<osgParticle::PrecipitationEffect*>(node);
float value = sin(nv->getFrameStamp()->getReferenceTime());
float value = sin(nv->getFrameStamp()->getSimulationTime());
if (value<-0.5)
{
pe->snow(1.0);

View File

@@ -49,14 +49,14 @@ class MyGeometryCallback :
virtual void update(osg::NodeVisitor* nv,osg::Drawable* drawable)
{
const osg::FrameStamp* fs = nv->getFrameStamp();
double referenceTime = fs->getReferenceTime();
double simulationTime = fs->getSimulationTime();
if (_firstCall)
{
_firstCall = false;
_startTime = referenceTime;
_startTime = simulationTime;
}
_time = referenceTime-_startTime;
_time = simulationTime-_startTime;
drawable->accept(*this);
drawable->dirtyBound();

View File

@@ -247,7 +247,7 @@ class AnimateCallback: public osg::Uniform::Callback
{
if( _enabled )
{
float angle = 2.0 * nv->getFrameStamp()->getReferenceTime();
float angle = 2.0 * nv->getFrameStamp()->getSimulationTime();
float sine = sinf( angle ); // -1 -> 1
float v01 = 0.5f * sine + 0.5f; // 0 -> 1
float v10 = 1.0f - v01; // 1 -> 0

View File

@@ -130,7 +130,6 @@ osg::Node* createScene()
///////////////////////////////////////////////////////////////////
// vertex shader using just Vec4 coefficients
char vertexShaderSource[] =
"uniform float osg_FrameTime;\n"
"uniform sampler2D terrainTexture;\n"
"uniform vec3 terrainOrigin;\n"
"uniform vec3 terrainScaleDown;\n"

View File

@@ -260,19 +260,14 @@ class SwitchHandler : public osgGA::GUIEventHandler
public:
SwitchHandler():
_childNum(0),
_frameNum(0) {}
_childNum(0) {}
virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object* object, osg::NodeVisitor* nv)
virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& /*aa*/, osg::Object* object, osg::NodeVisitor* /*nv*/)
{
osg::Switch* sw = dynamic_cast<osg::Switch*>(object);
if (!sw) return false;
if (nv->getFrameStamp())
{
if (nv->getFrameStamp()->getFrameNumber()==_frameNum) return false;
_frameNum = nv->getFrameStamp()->getFrameNumber();
}
if (ea.getHandled()) return false;
switch(ea.getEventType())
{
@@ -280,12 +275,9 @@ public:
{
if (ea.getKey()=='n')
{
++_childNum;
if (_childNum >= sw->getNumChildren()) _childNum = 0;
osg::notify(osg::NOTICE)<<"selecting "<<_childNum<<std::endl;
sw->setSingleChildOn(_childNum);
return true;
}
@@ -301,7 +293,6 @@ protected:
virtual ~SwitchHandler() {}
unsigned int _childNum;
int _frameNum;
};
@@ -320,6 +311,50 @@ osg::Node* createTestModel()
return sw;
}
class ShadowCallback : public osg::NodeCallback
{
public:
ShadowCallback() {}
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
{
osg::notify(osg::NOTICE)<<"We're in callback"<<std::endl;
osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);
if (!cv)
{
traverse(node,nv);
return;
}
osgUtil::RenderBin* original_bin = cv->getCurrentRenderBin();
osgUtil::RenderBin* new_bin = original_bin->find_or_insert(999,"RenderBin");
cv->setCurrentRenderBin(new_bin);
traverse(node,nv);
osg::notify(osg::NOTICE)<<"new_bin->getStateGraphList().size()= "<<new_bin->getStateGraphList().size()<<std::endl;
osg::notify(osg::NOTICE)<<"new_bin->getRenderBinList().size()= "<<new_bin->getRenderBinList().size()<<std::endl;
osg::notify(osg::NOTICE)<<"new_bin->getRenderLeafList().size()= "<<new_bin->getRenderLeafList().size()<<std::endl;
for(osgUtil::RenderBin::RenderBinList::iterator itr = new_bin->getRenderBinList().begin();
itr != new_bin->getRenderBinList().end();
++itr)
{
osg::notify(osg::NOTICE)<<"bin num = "<<itr->first<<std::endl;
}
cv->setCurrentRenderBin(original_bin);
}
};
int main(int argc, char** argv)
{
// use an ArgumentParser object to manage the program arguments.
@@ -367,6 +402,9 @@ int main(int argc, char** argv)
bool doShadow = true;
while (arguments.read("--noShadow")) doShadow = false;
bool cullCallback = false;
while (arguments.read("-c")) cullCallback = true;
int screenNum = -1;
while (arguments.read("--screen", screenNum)) viewer.setUpViewOnSingleScreen(screenNum);
@@ -501,6 +539,66 @@ int main(int argc, char** argv)
ss->setAttributeAndModes(new osg::CullFace(osg::CullFace::BACK), osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE);
}
else if (cullCallback)
{
int shadowVolumeBin = 1000;
group->setCullCallback(new ShadowCallback());
group->addChild(model.get());
{
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
group->addChild(geode.get());
occluder->computeShadowVolumeGeometry(lightpos, *shadowVolume);
shadowVolume->setDrawMode(drawMode);
if (drawMode == osgShadow::ShadowVolumeGeometry::STENCIL_TWO_SIDED)
{
osg::notify(osg::NOTICE)<<"STENCIL_TWO_SIDED seleteced"<<std::endl;
osg::StencilTwoSided* stencil = new osg::StencilTwoSided;
stencil->setFunction(osg::StencilTwoSided::BACK, osg::StencilTwoSided::ALWAYS,0,~0u);
stencil->setOperation(osg::StencilTwoSided::BACK, osg::StencilTwoSided::KEEP, osg::StencilTwoSided::KEEP, osg::StencilTwoSided::DECR_WRAP);
stencil->setFunction(osg::StencilTwoSided::FRONT, osg::StencilTwoSided::ALWAYS,0,~0u);
stencil->setOperation(osg::StencilTwoSided::FRONT, osg::StencilTwoSided::KEEP, osg::StencilTwoSided::KEEP, osg::StencilTwoSided::INCR_WRAP);
osg::ColorMask* colourMask = new osg::ColorMask(false, false, false, false);
osg::StateSet* ss_sv1 = geode->getOrCreateStateSet();
ss_sv1->setRenderBinDetails(shadowVolumeBin, "RenderBin");
ss_sv1->setAttributeAndModes(stencil,osg::StateAttribute::ON);
ss_sv1->setAttribute(colourMask);
ss_sv1->setMode(GL_CULL_FACE,osg::StateAttribute::OFF);
}
else
{
osg::notify(osg::NOTICE)<<"STENCIL_TWO_PASSES seleteced"<<std::endl;
osg::Stencil* stencil = new osg::Stencil;
stencil->setFunction(osg::Stencil::ALWAYS,0,~0u);
stencil->setOperation(osg::Stencil::KEEP, osg::Stencil::KEEP, osg::Stencil::KEEP);
osg::ColorMask* colourMask = new osg::ColorMask(false, false, false, false);
osg::StateSet* ss_sv1 = geode->getOrCreateStateSet();
ss_sv1->setRenderBinDetails(shadowVolumeBin, "RenderBin");
ss_sv1->setAttributeAndModes(stencil,osg::StateAttribute::ON);
ss_sv1->setAttribute(colourMask);
ss_sv1->setMode(GL_CULL_FACE,osg::StateAttribute::ON);
geode->addDrawable(shadowVolume.get());
}
}
}
else
{
osg::Vec4 ambient(0.2,0.2,0.2,1.0);
@@ -651,7 +749,7 @@ int main(int argc, char** argv)
{
if (updateLightPosition)
{
float t = viewer.getFrameStamp()->getReferenceTime();
float t = viewer.getFrameStamp()->getSimulationTime();
if (postionalLight)
{
lightpos.set(bb.center().x()+sinf(t)*bb.radius(), bb.center().y() + cosf(t)*bb.radius(), bb.zMax() + bb.radius() ,1.0f);

View File

@@ -208,7 +208,7 @@ void SlideEventHandler::operator()(osg::Node* node, osg::NodeVisitor* nv)
{
if (_autoSteppingActive && nv->getFrameStamp())
{
double time = nv->getFrameStamp()->getReferenceTime();
double time = nv->getFrameStamp()->getSimulationTime();
if (_firstTraversal)
{

View File

@@ -127,7 +127,7 @@ class AnimateStateCallback : public osg::NodeCallback
if (stateset && nv->getFrameStamp())
{
// we have an exisitng stateset, so lets animate it.
animateState(stateset,nv->getFrameStamp()->getReferenceTime());
animateState(stateset,nv->getFrameStamp()->getSimulationTime());
}
// note, callback is repsonsible for scenegraph traversal so

View File

@@ -63,7 +63,7 @@ public:
{
if (nv->getFrameStamp())
{
double currTime = nv->getFrameStamp()->getReferenceTime();
double currTime = nv->getFrameStamp()->getSimulationTime();
if (currTime-_prevTime>_delay)
{
// update filter modes and text.
@@ -222,7 +222,7 @@ public:
{
if (nv->getFrameStamp())
{
double currTime = nv->getFrameStamp()->getReferenceTime();
double currTime = nv->getFrameStamp()->getSimulationTime();
if (currTime-_prevTime>_delay)
{
// update filter modes and text.
@@ -379,7 +379,7 @@ public:
{
if (nv->getFrameStamp())
{
double currTime = nv->getFrameStamp()->getReferenceTime();
double currTime = nv->getFrameStamp()->getSimulationTime();
if (currTime-_prevTime>_delay)
{
// update filter modes and text.
@@ -532,7 +532,7 @@ public:
{
if (nv->getFrameStamp())
{
double currTime = nv->getFrameStamp()->getReferenceTime();
double currTime = nv->getFrameStamp()->getSimulationTime();
if (currTime-_prevTime>_delay)
{
// update filter modes and text.

View File

@@ -58,7 +58,7 @@ public:
return;
if (nv->getFrameStamp()) {
double currTime = nv->getFrameStamp()->getReferenceTime();
double currTime = nv->getFrameStamp()->getSimulationTime();
if (currTime - _prevTime > _delay) {
float rad = osg::DegreesToRadians(currTime);