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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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_)
|
||||
{
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user