From 762db56a4038b99c7c882a58071ad996b580b572 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Sat, 18 Jan 2003 22:07:59 +0000 Subject: [PATCH] Improvements to the osgProducer lib to better handle Producer's normalized coord system. Addition of ReadCameraConfigFile and WriteCameraConfigFile as a tempory measure for implementing local a C++ read/write of the Producer::CameraConfig, this will be removed once these implementations or similar have been moved to Producer. --- include/osgProducer/CameraGroup | 165 ++++------------------ include/osgProducer/ReadCameraConfigFile | 23 +++ include/osgProducer/SceneHandler | 49 ++----- include/osgProducer/WriteCameraConfigFile | 23 +++ src/Demos/osgproducer/osgproducer.cpp | 52 +------ src/osgProducer/EventAdapter.cpp | 17 ++- src/osgProducer/Makefile | 4 + src/osgProducer/ReadCameraConfigFile.cpp | 42 ++++++ src/osgProducer/WriteCameraConfigFile.cpp | 8 ++ 9 files changed, 153 insertions(+), 230 deletions(-) create mode 100644 include/osgProducer/ReadCameraConfigFile create mode 100644 include/osgProducer/WriteCameraConfigFile create mode 100644 src/osgProducer/ReadCameraConfigFile.cpp create mode 100644 src/osgProducer/WriteCameraConfigFile.cpp diff --git a/include/osgProducer/CameraGroup b/include/osgProducer/CameraGroup index 2f3576fd5..7c6fb9fa9 100644 --- a/include/osgProducer/CameraGroup +++ b/include/osgProducer/CameraGroup @@ -4,9 +4,9 @@ #ifndef OSG_CAMERA_GROUP_H #define OSG_CAMERA_GROUP_H -#include #include + #include #include #include @@ -16,37 +16,27 @@ namespace osgProducer { -class CameraGroup : public Producer::CameraGroup +class OSGPRODUCER_EXPORT CameraGroup : public Producer::CameraGroup { public : typedef std::vector SceneHandlerList; - CameraGroup() : Producer::CameraGroup() - { _init(); } + CameraGroup(); - CameraGroup(Producer::CameraConfig *cfg) : Producer::CameraGroup(cfg) - { _init(); } + CameraGroup(Producer::CameraConfig *cfg); - CameraGroup(const std::string& configFile) : Producer::CameraGroup(configFile) - { _init(); } + CameraGroup(const std::string& configFile); virtual ~CameraGroup() {} - void setSceneData( osg::Node *scene ) - { - _scene_data = scene; - if( _shvec.size() > 0 ) - { - SceneHandlerList::iterator p; - for( p = _shvec.begin(); p != _shvec.end(); p++ ) - { - (*p)->setSceneData( _scene_data ); - } - } - } - osg::Node *getSceneData() { return _scene_data; } + + void setSceneData( osg::Node *scene ); + osg::Node *getSceneData() { return _scene_data.get(); } + + const osg::Node *getSceneData() const { return _scene_data.get(); } + void setDisplaySettings( osg::DisplaySettings *ds ) { _ds = ds; } @@ -57,150 +47,53 @@ class CameraGroup : public Producer::CameraGroup - void setFrameStamp( osg::FrameStamp* fs ) - { - _frameStamp = fs; - - for(SceneHandlerList::iterator p = _shvec.begin(); p != _shvec.end(); p++ ) - { - (*p)->setFrameStamp( fs ); - } - } + void setFrameStamp( osg::FrameStamp* fs ); osg::FrameStamp *getFrameStamp() { return _frameStamp.get(); } const osg::FrameStamp *getFrameStamp() const { return _frameStamp.get(); } - void setGlobalStateSet( osg::StateSet *sset ) - { - _global_stateset = sset; + void setGlobalStateSet( osg::StateSet *sset ); - for(SceneHandlerList::iterator p = _shvec.begin(); p != _shvec.end(); p++ ) - { - (*p)->setGlobalStateSet( _global_stateset ); - } - } + osg::StateSet *getGlobalStateSet() { return _global_stateset.get(); } - void setBackgroundColor( const osg::Vec4& backgroundColor ) - { - _background_color = backgroundColor; + const osg::StateSet *getGlobalStateSet() const { return _global_stateset.get(); } - if( _shvec.size() > 0 ) - { - SceneHandlerList::iterator p; - for( p = _shvec.begin(); p != _shvec.end(); p++ ) - { - (*p)->setBackgroundColor( _background_color ); - } - } - } - void setLODScale( float bias ) - { - if( _shvec.size() > 0 ) - { - SceneHandlerList::iterator p; - for( p = _shvec.begin(); p != _shvec.end(); p++ ) - { - (*p)->setLODScale( bias ); - } - } - } - - void setFusionDistance( osgUtil::SceneView::FusionDistanceMode mode,float value=1.0f) - { - if( _shvec.size() > 0 ) - { - SceneHandlerList::iterator p; - for( p = _shvec.begin(); p != _shvec.end(); p++ ) - { - (*p)->setFusionDistance( mode, value ); - } - } - } + void setBackgroundColor( const osg::Vec4& backgroundColor ); osg::Vec4& getBackgroundColor() { return _background_color; } const osg::Vec4& getBackgroundColor() const { return _background_color; } - osg::StateSet *getGlobalStateSet() { return _global_stateset; } - const osg::StateSet *getGlobalStateSet() const { return _global_stateset; } + void setLODScale( float bias ); - void advance() - { - if( !_initialized ) return; - CameraGroup::advance(); - } - - void realize( ThreadingModel thread_model= SingleThreaded ) - { - if( _initialized ) return; - - if (!_ds) _ds = osg::DisplaySettings::instance(); - - _ds->setMaxNumberOfGraphicsContexts( _cfg->getNumberOfCameras() ); - - for( unsigned int i = 0; i < _cfg->getNumberOfCameras(); i++ ) - { - Producer::Camera *cam = _cfg->getCamera(i); - osgProducer::SceneHandler *sh = new osgProducer::SceneHandler(_ds.get()); - sh->setDefaults(); - if( _global_stateset != NULL ) - sh->setGlobalStateSet( _global_stateset ); - if( _scene_data != NULL ) - sh->setSceneData( _scene_data ); - sh->setBackgroundColor( _background_color); - sh->getState()->setContextID(i); - sh->setFrameStamp( _frameStamp.get() ); - _shvec.push_back( sh ); - - cam->setSceneHandler( sh ); - } + void setFusionDistance( osgUtil::SceneView::FusionDistanceMode mode,float value=1.0f); - /// Make all statesets the same as the first. - if( _global_stateset == NULL && _shvec.size() > 0 ) - { - SceneHandlerList::iterator p; - p = _shvec.begin(); - _global_stateset = (*p)->getGlobalStateSet(); - p++; - for( ; p != _shvec.end(); p++ ) - (*p)->setGlobalStateSet( _global_stateset ); - } - - Producer::CameraGroup::realize( thread_model ); - _initialized = true; - } - - virtual void frame( ) - { - Producer::CameraGroup::frame(); - _frameStamp->setFrameNumber( _frameStamp->getFrameNumber() + 1 ); - } + void advance(); - private : + void realize( ThreadingModel thread_model= SingleThreaded ); - osg::Node * _scene_data; - osg::StateSet * _global_stateset; + virtual void frame(); + + + protected : + + + osg::ref_ptr _scene_data; + osg::ref_ptr _global_stateset; osg::Vec4 _background_color; SceneHandlerList _shvec; osg::ref_ptr _ds; bool _initialized; osg::ref_ptr _frameStamp; - void _init() - { - _scene_data = NULL; - _global_stateset = NULL; - _background_color.set( 0.2f, 0.2f, 0.4f, 1.0f ); - _initialized = false; - if (!_frameStamp) _frameStamp = new osg::FrameStamp; - } + void _init();; }; } diff --git a/include/osgProducer/ReadCameraConfigFile b/include/osgProducer/ReadCameraConfigFile new file mode 100644 index 000000000..16c5db3de --- /dev/null +++ b/include/osgProducer/ReadCameraConfigFile @@ -0,0 +1,23 @@ +//C++ header - Open Scene Graph - Copyright (C) 1998-2002 Robert Osfield +//Distributed under the terms of the GNU Library General Public License (LGPL) +//as published by the Free Software Foundation. + +#ifndef OSGDB_READCAMERACONDIGFILE +#define OSGDB_READCAMERACONDIGFILE 1 + +#include + +#include + +#include + +namespace osgProducer { + +/** Read a Producer::CameraConfig from file. + * Return valid Producer::CameraConfig on success, + * return NULL on failure.*/ +extern OSGPRODUCER_EXPORT Producer::CameraConfig* readCameraConfigFile(const std::string& filename); + +} + +#endif diff --git a/include/osgProducer/SceneHandler b/include/osgProducer/SceneHandler index 7899fa243..e7bb8857f 100644 --- a/include/osgProducer/SceneHandler +++ b/include/osgProducer/SceneHandler @@ -10,54 +10,25 @@ #include #include -#include - namespace osgProducer { -class SceneHandler : public Producer::Camera::SceneHandler, public osgUtil::SceneView +class OSGPRODUCER_EXPORT SceneHandler : public Producer::Camera::SceneHandler, public osgUtil::SceneView { public : - SceneHandler( osg::DisplaySettings *ds = NULL) : osgUtil::SceneView(ds) - { - mm = new osg::RefMatrix; - pm = new osg::RefMatrix; - } + + SceneHandler( osg::DisplaySettings *ds = NULL); - void cull(Producer::Camera &cam) - { - pm->set(cam.getProjectionMatrix()); - mm->set(cam.getPositionAndAttitudeMatrix()); - setProjectionMatrix( pm.get() ); - setModelViewMatrix( mm.get() ); + void cull(Producer::Camera &cam); - int x, y; - unsigned int w, h; - cam.getProjectionRect( x, y, w, h ); + void draw(Producer::Camera &); - setViewport( x, y, w, h ); -#ifdef _windows_is_non_standard - SceneView::cull(); -#else - osgUtil::SceneView::cull(); -#endif - } - - void draw(Producer::Camera &) - { -#ifdef _windows_is_non_standard - SceneView::draw(); -#else - osgUtil::SceneView::draw(); -#endif - } - - void setContextID( int id ) - { - getState()->setContextID( id ); - } + void setContextID( int id ); - private: + protected: + + virtual ~SceneHandler() {} + osg::ref_ptr mm; osg::ref_ptr pm; }; diff --git a/include/osgProducer/WriteCameraConfigFile b/include/osgProducer/WriteCameraConfigFile new file mode 100644 index 000000000..e53a1a4bb --- /dev/null +++ b/include/osgProducer/WriteCameraConfigFile @@ -0,0 +1,23 @@ +//C++ header - Open Scene Graph - Copyright (C) 1998-2002 Robert Osfield +//Distributed under the terms of the GNU Library General Public License (LGPL) +//as published by the Free Software Foundation. + +#ifndef OSGDB_WRITECAMERACONDIGFILE +#define OSGDB_WRITECAMERACONDIGFILE 1 + +#include + +#include + +#include + +namespace osgProducer { + +/** Write a Producer::CameraConfig to file. + * Return true on success, + * return false on failure.*/ +extern OSGPRODUCER_EXPORT bool writeCameraConfigFile(const Producer::CameraConfig& cameraconfig, const std::string& filename); + +} + +#endif diff --git a/src/Demos/osgproducer/osgproducer.cpp b/src/Demos/osgproducer/osgproducer.cpp index 7fa414b4a..6dc457f7d 100644 --- a/src/Demos/osgproducer/osgproducer.cpp +++ b/src/Demos/osgproducer/osgproducer.cpp @@ -32,41 +32,6 @@ #include -static Producer::CameraConfig *BuildConfig(void) -{ - Producer::RenderSurface *rs1 = new Producer::RenderSurface; - rs1->setScreenNum(0); -// rs1->useBorder(false); -// rs1->setWindowRect(0,0,640,480); - rs1->setWindowRect(10,10,620,480); - - Producer::Camera *camera1 = new Producer::Camera; - camera1->setRenderSurface(rs1); - camera1->setOffset( 1.0, 0.0 ); - - - Producer::RenderSurface *rs2 = new Producer::RenderSurface; - rs2->setScreenNum(0); -// rs2->useBorder(false); -// rs2->setWindowRect(640,0,640,480); - rs2->setWindowRect(650,10,620,480); - - Producer::Camera *camera2 = new Producer::Camera; - camera2->setRenderSurface(rs2); - camera2->setOffset( -1.0, 0.0 ); - - Producer::CameraConfig *cfg = new Producer::CameraConfig; - cfg->addCamera("Camera 1",camera1); - cfg->addCamera("Camera 2", camera2); - - Producer::InputArea *ia = new Producer::InputArea; - ia->addInputRectangle( rs1, Producer::InputRectangle(0.0,0.5,0.0,1.0)); - ia->addInputRectangle( rs2, Producer::InputRectangle(0.5,1.0,0.0,1.0)); - - cfg->setInputArea(ia); - - return cfg; -} int main( int argc, char **argv ) { @@ -76,7 +41,8 @@ int main( int argc, char **argv ) threadingModel = Producer::CameraGroup::ThreadPerCamera; // configuration file. - std::string configFile; // configFile = "twoWindows.cfg" + std::string configFile; + //configFile = "twoWindows.cfg"; // set up the database files to read. std::vector filenameList; @@ -86,22 +52,10 @@ int main( int argc, char **argv ) // create the camera group. - osgProducer::CameraGroup *cg = 0; - -#define USE_BUILD_CONFIG -#ifdef USE_BUILD_CONFIG - - Producer::CameraConfig *cfg = BuildConfig(); - cg = new osgProducer::CameraGroup(cfg); - -#else - - cg = configFile.empty() ? + osgProducer::CameraGroup *cg = configFile.empty() ? (new osgProducer::CameraGroup()): (new osgProducer::CameraGroup(configFile)); -#endif - // set up the maximum number of graphics contexts, before loading the scene graph // to ensure that texture objects and display buffers are configured to the correct size. osg::DisplaySettings::instance()->setMaxNumberOfGraphicsContexts( cg->getNumberOfCameras() ); diff --git a/src/osgProducer/EventAdapter.cpp b/src/osgProducer/EventAdapter.cpp index cf4f3bc41..eb8b9aa93 100644 --- a/src/osgProducer/EventAdapter.cpp +++ b/src/osgProducer/EventAdapter.cpp @@ -14,6 +14,11 @@ int EventAdapter::_s_Ymax = 1024; int EventAdapter::_s_mx = 0; int EventAdapter::_s_my = 0; +static float s_xOffset=1.0f; +static float s_xScale=0.5f; +static float s_yOffset=1.0f; +static float s_yScale=0.5f; + EventAdapter::EventAdapter() { _eventType = NONE; // adaptor does not encapsulate any events. @@ -93,8 +98,8 @@ void EventAdapter::adaptButtonPress(double time,float x, float y, unsigned int b break; } - _s_mx = (int)(x*(float)(_s_Xmax-_s_Xmin))+_s_Xmin; - _s_my = (int)(y*(float)(_s_Ymin-_s_Ymax))+_s_Ymax; + _s_mx = (int)((x+s_xOffset)*s_xScale*(float)(_s_Xmax-_s_Xmin))+_s_Xmin; + _s_my = (int)((y+s_yOffset)*s_yScale*(float)(_s_Ymin-_s_Ymax))+_s_Ymax; copyStaticVariables(); } @@ -125,8 +130,8 @@ void EventAdapter::adaptButtonRelease(double time,float x, float y, unsigned int break; } - _s_mx = (int)(x*(float)(_s_Xmax-_s_Xmin))+_s_Xmin; - _s_my = (int)(y*(float)(_s_Ymin-_s_Ymax))+_s_Ymax; + _s_mx = (int)((x+s_xOffset)*s_xScale*(float)(_s_Xmax-_s_Xmin))+_s_Xmin; + _s_my = (int)((y+s_yOffset)*s_yScale*(float)(_s_Ymin-_s_Ymax))+_s_Ymax; copyStaticVariables(); } @@ -140,8 +145,8 @@ void EventAdapter::adaptMouseMotion(double time, float x, float y) MOVE; _time = time; - _s_mx = (int)(x*(float)(_s_Xmax-_s_Xmin))+_s_Xmin; - _s_my = (int)(y*(float)(_s_Ymin-_s_Ymax))+_s_Ymax; + _s_mx = (int)((x+s_xOffset)*s_xScale*(float)(_s_Xmax-_s_Xmin))+_s_Xmin; + _s_my = (int)((y+s_yOffset)*s_yScale*(float)(_s_Ymin-_s_Ymax))+_s_Ymax; copyStaticVariables(); } diff --git a/src/osgProducer/Makefile b/src/osgProducer/Makefile index 1a1cc7552..330b99f8a 100644 --- a/src/osgProducer/Makefile +++ b/src/osgProducer/Makefile @@ -2,8 +2,12 @@ TOPDIR = ../.. include $(TOPDIR)/Make/makedefs CXXFILES =\ + CameraGroup.cpp\ EventAdapter.cpp\ KeyboardMouseCallback.cpp\ + SceneHandler.cpp\ + ReadCameraConfigFile.cpp\ + WriteCameraConfigFile.cpp\ LIBS += -lProducer $(GL_LIBS) -losgGA -losgUtil -losgDB -losg $(OTHER_LIBS) DEF += -DOSGPRODUCER_LIBRARY diff --git a/src/osgProducer/ReadCameraConfigFile.cpp b/src/osgProducer/ReadCameraConfigFile.cpp new file mode 100644 index 000000000..5d54a71ce --- /dev/null +++ b/src/osgProducer/ReadCameraConfigFile.cpp @@ -0,0 +1,42 @@ +#include + + +using namespace osgProducer; + +Producer::CameraConfig* osgProducer::readCameraConfigFile(const std::string& filename) +{ + Producer::RenderSurface *rs1 = new Producer::RenderSurface; + rs1->setScreenNum(0); +// rs1->useBorder(false); +// rs1->setWindowRect(0,0,640,480); + rs1->setWindowRect(10,10,620,480); + + Producer::Camera *camera1 = new Producer::Camera; + camera1->setRenderSurface(rs1); + camera1->setOffset( 1.0, 0.0 ); + + + Producer::RenderSurface *rs2 = new Producer::RenderSurface; + rs2->setScreenNum(0); +// rs2->useBorder(false); +// rs2->setWindowRect(640,0,640,480); + rs2->setWindowRect(650,10,620,480); + + Producer::Camera *camera2 = new Producer::Camera; + camera2->setRenderSurface(rs2); + camera2->setOffset( -1.0, 0.0 ); + + Producer::CameraConfig *cfg = new Producer::CameraConfig; + cfg->addCamera("Camera 1",camera1); + cfg->addCamera("Camera 2", camera2); + + Producer::InputArea *ia = new Producer::InputArea; + ia->addInputRectangle( rs1, Producer::InputRectangle(-1.0,0.0,-1.0,1.0)); + ia->addInputRectangle( rs2, Producer::InputRectangle(0.0,1.0,-1.0,1.0)); + + cfg->setInputArea(ia); + + return cfg; +} + + diff --git a/src/osgProducer/WriteCameraConfigFile.cpp b/src/osgProducer/WriteCameraConfigFile.cpp new file mode 100644 index 000000000..9c00b729f --- /dev/null +++ b/src/osgProducer/WriteCameraConfigFile.cpp @@ -0,0 +1,8 @@ +#include + +using namespace osgProducer; + +bool osgProducer::writeCameraConfigFile(const Producer::CameraConfig& cameraconfig, const std::string& filename) +{ + return false; +}