Synch with 20010921

This commit is contained in:
Don BURNS
2001-09-22 02:42:08 +00:00
parent d47b8f9c1f
commit 7ae58df42a
197 changed files with 7867 additions and 6189 deletions

View File

@@ -80,8 +80,6 @@ class PrintVisitor : public NodeVisitor
CullVisitor::CullVisitor()
{
_frameNumber = 0;
// overide the default node visitor mode.
setTraversalMode(NodeVisitor::TRAVERSE_ACTIVE_CHILDREN);
@@ -109,10 +107,7 @@ CullVisitor::CullVisitor()
_calculated_znear = FLT_MAX;
_calculated_zfar = -FLT_MAX;
_view[0] = 0;
_view[1] = 0;
_view[2] = 1024;
_view[3] = 768;
_viewport = NULL;
_impostorActive = true;
_depthSortImpostorSprites = false;
@@ -682,8 +677,14 @@ void CullVisitor::apply(Impostor& node)
// traverse the appropriate child of the LOD.
node.getChild(eval)->accept(*this);
}
else
else if (!_viewport.valid())
{
// need to use impostor but no valid viewport is defined to simply
// default to using the LOD child as above.
node.getChild(eval)->accept(*this);
}
else
{
// within the impostor distance threshold therefore attempt
// to use impostor instead.
@@ -695,7 +696,7 @@ void CullVisitor::apply(Impostor& node)
if (impostorSprite)
{
// impostor found, now check to see if it is good enough to use
float error = impostorSprite->calcPixelError(*_camera,_view,matrix);
float error = impostorSprite->calcPixelError(*_camera,*_viewport,matrix);
if (error>_impostorPixelErrorThreshold)
{
@@ -765,7 +766,7 @@ void CullVisitor::apply(Impostor& node)
if (stateset) popStateSet();
// update frame number to show that impostor is in action.
impostorSprite->setLastFrameUsed(_frameNumber);
impostorSprite->setLastFrameUsed(getTraversalNumber());
}
else
@@ -1085,8 +1086,8 @@ ImpostorSprite* CullVisitor::createImpostorSprite(Impostor& node)
// equivilant window coordinates by using the camera's project method.
Vec3 c00_win;
Vec3 c11_win;
_camera->project(c00_world,_view,c00_win);
_camera->project(c11_world,_view,c11_win);
_camera->project(c00_world,*_viewport,c00_win);
_camera->project(c11_world,*_viewport,c11_win);
// adjust texture size to be nearest power of 2.
@@ -1114,17 +1115,26 @@ ImpostorSprite* CullVisitor::createImpostorSprite(Impostor& node)
int new_t = (int)(powf(2.0f,rounded_tp2));
// if dimension is bigger than window divide it down.
while (new_s>_view[2]) new_s /= 2;
while (new_s>_viewport->width()) new_s /= 2;
// if dimension is bigger than window divide it down.
while (new_t>_view[3]) new_t /= 2;
while (new_t>_viewport->height()) new_t /= 2;
rtts->setViewport(_view[0],_view[1],new_s,new_t);
// offset the impostor viewport from the center of the main window
// viewport as often the edges of the viewport might be obscured by
// other windows, which can cause image/reading writing problems.
int center_x = _viewport->x()+_viewport->width()/2;
int center_y = _viewport->y()+_viewport->height()/2;
Viewport* viewport = new Viewport;
viewport->setViewport(center_x-new_s/2,center_y-new_t/2,new_s,new_t);
rtts->setViewport(viewport);
// create the impostor sprite.
ImpostorSprite* impostorSprite =
_impostorSpriteManager->createOrReuseImpostorSprite(new_s,new_t,_frameNumber-_numFramesToKeepImpostorSprites);
_impostorSpriteManager->createOrReuseImpostorSprite(new_s,new_t,getTraversalNumber()-_numFramesToKeepImpostorSprites);
if (impostorSprite==NULL) return NULL;
@@ -1143,7 +1153,7 @@ ImpostorSprite* CullVisitor::createImpostorSprite(Impostor& node)
Texture* texture = impostorSprite->getTexture();
// update frame number to show that impostor is in action.
impostorSprite->setLastFrameUsed(_frameNumber);
impostorSprite->setLastFrameUsed(getTraversalNumber());
Vec3* coords = impostorSprite->getCoords();
Vec2* texcoords = impostorSprite->getTexCoords();

View File

@@ -2,6 +2,7 @@
include ../../Make/makedefs
C++FILES = \
AppVisitor.cpp\
CameraManipulator.cpp\
CullVisitor.cpp\
CullViewState.cpp\
@@ -12,6 +13,7 @@ C++FILES = \
IntersectVisitor.cpp\
InsertImpostorsVisitor.cpp\
NvTriStripObjects.cpp\
OptimizeStateVisitor.cpp\
RenderBin.cpp\
RenderGraph.cpp\
RenderLeaf.cpp\
@@ -39,6 +41,7 @@ LIB = ../../lib/lib$(TARGET_BASENAME).so
TARGET_LIB_FILES = lib$(TARGET_BASENAME).so
TARGET_INCLUDE_FILES = \
osgUtil/AppVisitor\
osgUtil/CameraManipulator\
osgUtil/CullVisitor\
osgUtil/CullViewState\
@@ -52,6 +55,7 @@ TARGET_INCLUDE_FILES = \
osgUtil/GUIEventHandler\
osgUtil/IntersectVisitor\
osgUtil/InsertImpostorsVisitor\
osgUtil/OptimizeStateVisitor\
osgUtil/RenderBin\
osgUtil/RenderGraph\
osgUtil/RenderLeaf\

View File

@@ -1,3 +1,5 @@
#include <osg/Notify>
#include <osgUtil/RenderStage>
using namespace osg;
@@ -44,6 +46,12 @@ void RenderStage::draw(osg::State& state,RenderLeaf*& previous)
{
if (_stageDrawnThisFrame) return;
if (!_viewport)
{
notify(FATAL) << "Error: cannot drawm stage due to undefined viewport."<<endl;
return;
}
_stageDrawnThisFrame = true;
for(DependencyList::iterator itr=_dependencyList.begin();
@@ -57,11 +65,11 @@ void RenderStage::draw(osg::State& state,RenderLeaf*& previous)
#define USE_SISSOR_TEST
#ifdef USE_SISSOR_TEST
glScissor( _view[0], _view[1], _view[2], _view[3] );
glScissor( _viewport->x(), _viewport->y(), _viewport->width(), _viewport->height() );
glEnable( GL_SCISSOR_TEST );
#endif
glViewport( _view[0], _view[1], _view[2], _view[3] );
_viewport->apply(state);
// glEnable( GL_DEPTH_TEST );
@@ -86,6 +94,10 @@ void RenderStage::draw(osg::State& state,RenderLeaf*& previous)
glDisable( GL_SCISSOR_TEST );
#endif
// pass the camera we're about to set up to state, so that
// subsequent operatiosn know about it, such as for CLOD etc.
state.setCamera(_camera.get());
// set up projection
const Matrix& projectionMat = _camera->getProjectionMatrix();
glMatrixMode( GL_PROJECTION );
@@ -104,6 +116,7 @@ void RenderStage::draw(osg::State& state,RenderLeaf*& previous)
// set up camera modelview.
const Matrix& modelView = _camera->getModelViewMatrix();
glMultMatrixf((GLfloat*)modelView._mat);
if (getLightingMode()==RenderStageLighting::SKY_LIGHT && light)
{

View File

@@ -27,6 +27,7 @@ void RenderToTextureStage::draw(osg::State& state,RenderLeaf*& previous)
RenderStage::draw(state,previous);
// now copy the rendered image to attached texture.
if (_texture.valid()) _texture->copyTexImage2D(state,_view[0],_view[1],_view[2],_view[3]);
if (_texture.valid())
_texture->copyTexImage2D(state,_viewport->x(),_viewport->y(),_viewport->width(),_viewport->height());
}

View File

@@ -1,4 +1,5 @@
#include <osgUtil/SceneView>
#include <osgUtil/AppVisitor>
#include <osg/Notify>
#include <osg/Texture>
@@ -25,12 +26,7 @@ SceneView::SceneView()
_prioritizeTextures = false;
_view[0] = 0;
_view[1] = 0;
_view[2] = 1024;
_view[3] = 768;
_frameNumber = 0;
_viewport = new Viewport;
}
@@ -58,6 +54,10 @@ void SceneView::setDefaults()
_rendergraph = new osgUtil::RenderGraph;
_renderStage = new osgUtil::RenderStage;
_appVisitor = new osgUtil::AppVisitor;
_cullVisitor = new osgUtil::CullVisitor;
_cullVisitor->setRenderGraph(_rendergraph.get());
@@ -88,26 +88,43 @@ void SceneView::setDefaults()
void SceneView::app()
{
++_frameNumber;
if (_sceneData.valid() && _appVisitor.valid())
{
_appVisitor->reset();
_appVisitor->setFrameStamp(_frameStamp.get());
// use the frame number for the traversal number.
if (_frameStamp.valid())
{
_appVisitor->setTraversalNumber(_frameStamp->getFrameNumber());
}
_sceneData->accept(*_appVisitor.get());
}
}
void SceneView::cull()
{
if (!_sceneData) return;
_camera->adjustAspectRatio((GLfloat)_view[2]/(GLfloat) _view[3]);
_camera->adjustAspectRatio(_viewport->aspectRatio());
_rendergraph->clean();
_cullVisitor->reset();
_cullVisitor->setFrameStamp(_frameStamp.get());
// use the frame number for the traversal number.
if (_frameStamp.valid())
{
_cullVisitor->setTraversalNumber(_frameStamp->getFrameNumber());
}
// comment out reset of rendergraph since clean is more efficient.
// _rendergraph->reset();
@@ -115,14 +132,13 @@ void SceneView::cull()
// reuse the structure on the rendergraph in the next frame. This
// achieves a certain amount of frame cohereancy of memory allocation.
_cullVisitor->setFrameNumber(_frameNumber);
_cullVisitor->setLODBias(_lodBias);
_cullVisitor->setCamera(*_camera);
_cullVisitor->setViewport(_view[0],_view[1],_view[2],_view[3]);
_cullVisitor->setViewport(_viewport.get());
_renderStage->reset();
_renderStage->setViewport(_view[0],_view[1],_view[2],_view[3]);
_renderStage->setViewport(_viewport.get());
_renderStage->setCamera(_camera.get());
_renderStage->setClearColor(_backgroundColor);
_renderStage->setLight(_light.get());
@@ -207,6 +223,8 @@ void SceneView::draw()
}
// we in theory should be able to
_state->reset();
_state->setFrameStamp(_frameStamp.get());
// note, to support multi-pipe systems the deletion of OpenGL display list
// and texture objects is deferred until the OpenGL context is the correct
@@ -233,7 +251,7 @@ void SceneView::draw()
windows coordinates are calculated relative to the bottom left of the window.*/
bool SceneView::projectWindowIntoObject(const osg::Vec3& window,osg::Vec3& object) const
{
return _camera->unproject(window,_view,object);
return _camera->unproject(window,*_viewport,object);
}
@@ -244,8 +262,8 @@ bool SceneView::projectWindowIntoObject(const osg::Vec3& window,osg::Vec3& objec
windows coordinates are calculated relative to the bottom left of the window.*/
bool SceneView::projectWindowXYIntoObject(int x,int y,osg::Vec3& near_point,osg::Vec3& far_point) const
{
bool result_near = _camera->unproject(Vec3(x,y,0.0f),_view,near_point);
bool result_far = _camera->unproject(Vec3(x,y,1.0f),_view,far_point);
bool result_near = _camera->unproject(Vec3(x,y,0.0f),*_viewport,near_point);
bool result_far = _camera->unproject(Vec3(x,y,1.0f),*_viewport,far_point);
return result_near & result_far;
}
@@ -256,5 +274,5 @@ bool SceneView::projectWindowXYIntoObject(int x,int y,osg::Vec3& near_point,osg:
windows coordinates are calculated relative to the bottom left of the window.*/
bool SceneView::projectObjectIntoWindow(const osg::Vec3& object,osg::Vec3& window) const
{
return _camera->project(object,_view,window);
return _camera->project(object,*_viewport,window);
}