Synch with 20010921
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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\
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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());
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user