From 0df1b28672607547cc0a4e3e07d4c715f08d8a98 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 7 Apr 2003 10:20:34 +0000 Subject: [PATCH] Added osgwindows example which sets up and Producer::CameraConfig up and uses that to create multiple windows. --- Make/makedirdefs | 1 + VisualStudio/VisualStudio.dsw | 27 +++ .../examples/osgwindows/osgwindows.dsp | 190 ++++++++++++++++++ examples/osgwindows/GNUmakefile | 19 ++ examples/osgwindows/GNUmakefile.inst | 14 ++ examples/osgwindows/osgwindows.cpp | 132 ++++++++++++ runexamples.bat | 11 +- src/osgProducer/Viewer.cpp | 2 +- 8 files changed, 391 insertions(+), 5 deletions(-) create mode 100644 VisualStudio/examples/osgwindows/osgwindows.dsp create mode 100644 examples/osgwindows/GNUmakefile create mode 100644 examples/osgwindows/GNUmakefile.inst create mode 100644 examples/osgwindows/osgwindows.cpp diff --git a/Make/makedirdefs b/Make/makedirdefs index 90412aa85..dcb968dc0 100644 --- a/Make/makedirdefs +++ b/Make/makedirdefs @@ -119,6 +119,7 @@ EXAMPLE_DIRS = \ osgtexture2D\ osgtexture3D\ osgunittests\ + osgwindows\ osgversion\ osgvertexprogram\ osgviewer\ diff --git a/VisualStudio/VisualStudio.dsw b/VisualStudio/VisualStudio.dsw index 7737994fc..8a3012eff 100644 --- a/VisualStudio/VisualStudio.dsw +++ b/VisualStudio/VisualStudio.dsw @@ -1143,6 +1143,33 @@ Package=<4> ############################################################################### +Project: "Example osgwindows"=.\examples\osgwindows\osgwindows.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name Core osg + End Project Dependency + Begin Project Dependency + Project_Dep_Name Core osgDB + End Project Dependency + Begin Project Dependency + Project_Dep_Name Core osgGA + End Project Dependency + Begin Project Dependency + Project_Dep_Name Core osgProducer + End Project Dependency + Begin Project Dependency + Project_Dep_Name Core osgUtil + End Project Dependency +}}} + +############################################################################### + Project: "osgPlugin 3ds"=.\osgPlugins\lib3ds\lib3ds.dsp - Package Owner=<4> Package=<5> diff --git a/VisualStudio/examples/osgwindows/osgwindows.dsp b/VisualStudio/examples/osgwindows/osgwindows.dsp new file mode 100644 index 000000000..1a10c6a2c --- /dev/null +++ b/VisualStudio/examples/osgwindows/osgwindows.dsp @@ -0,0 +1,190 @@ +# Microsoft Developer Studio Project File - Name="Example osgwindows" - Package Owner=<4> + +# Microsoft Developer Studio Generated Build File, Format Version 6.00 + +# ** DO NOT EDIT ** + + + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + + + +CFG=Example osgwindows - Win32 Release + +!MESSAGE This is not a valid makefile. To build this project using NMAKE, + +!MESSAGE use the Export Makefile command and run + +!MESSAGE + +!MESSAGE NMAKE /f "osgwindows.mak". + +!MESSAGE + +!MESSAGE You can specify a configuration when running NMAKE + +!MESSAGE by defining the macro CFG on the command line. For example: + +!MESSAGE + +!MESSAGE NMAKE /f "osgwindows.mak" CFG="Example osgwindows - Win32 Release" + +!MESSAGE + +!MESSAGE Possible choices for configuration are: + +!MESSAGE + +!MESSAGE "Example osgwindows - Win32 Release" (based on "Win32 (x86) Console Application") + +!MESSAGE "Example osgwindows - Win32 Debug" (based on "Win32 (x86) Console Application") + +!MESSAGE + + + +# Begin Project + +# PROP AllowPerConfigDependencies 0 + +# PROP Scc_ProjName "" + +# PROP Scc_LocalPath "" + +CPP=cl.exe + +RSC=rc.exe + + + +!IF "$(CFG)" == "Example osgwindows - Win32 Release" + + + +# PROP BASE Use_MFC 0 + +# PROP BASE Use_Debug_Libraries 0 + +# PROP BASE Output_Dir "Release" + +# PROP BASE Intermediate_Dir "Release" + +# PROP BASE Target_Dir "" + +# PROP Use_MFC 0 + +# PROP Use_Debug_Libraries 0 + +# PROP Output_Dir "Release" + +# PROP Intermediate_Dir "Release" + +# PROP Ignore_Export_Lib 0 + +# PROP Target_Dir "" + +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c + +# ADD CPP /nologo /MD /W3 /GR /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c + +# ADD BASE RSC /l 0x809 /d "NDEBUG" + +# ADD RSC /l 0x809 /d "NDEBUG" + +BSC32=bscmake.exe + +# ADD BASE BSC32 /nologo + +# ADD BSC32 /nologo + +LINK32=link.exe + +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +# ADD LINK32 opengl32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../../../bin/osgwindows.exe" /libpath:"../../../lib" + + + +!ELSEIF "$(CFG)" == "Example osgwindows - Win32 Debug" + + + +# PROP BASE Use_MFC 0 + +# PROP BASE Use_Debug_Libraries 1 + +# PROP BASE Output_Dir "Debug" + +# PROP BASE Intermediate_Dir "Debug" + +# PROP BASE Target_Dir "" + +# PROP Use_MFC 0 + +# PROP Use_Debug_Libraries 1 + +# PROP Output_Dir "Debug" + +# PROP Intermediate_Dir "Debug" + +# PROP Ignore_Export_Lib 0 + +# PROP Target_Dir "" + +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c + +# ADD CPP /nologo /MDd /W3 /Gm /vd0 /GR /GX /Zi /Od /I "../../../include" /D "_CONSOLE" /D "_MBCS" /D "FL_DLL" /D "WIN32" /D "_DEBUG" /FR /YX /FD /c + +# ADD BASE RSC /l 0x809 /d "_DEBUG" + +# ADD RSC /l 0x809 /d "_DEBUG" + +BSC32=bscmake.exe + +# ADD BASE BSC32 /nologo + +# ADD BSC32 /nologo + +LINK32=link.exe + +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +# ADD LINK32 opengl32.lib /nologo /subsystem:console /debug /machine:I386 /nodefaultlib:"libcmt" /out:"../../../bin/osgwindowsd.exe" /pdbtype:sept /libpath:"../../../lib" + +# SUBTRACT LINK32 /incremental:no + + + +!ENDIF + + + +# Begin Target + + + +# Name "Example osgwindows - Win32 Release" + +# Name "Example osgwindows - Win32 Debug" + +# Begin Source File + + + +SOURCE=..\..\..\examples\osgwindows\osgwindows.cpp + +# End Source File + +# End Target + +# Begin Group "Resource Files" + + + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" + +# End Group + +# End Project + diff --git a/examples/osgwindows/GNUmakefile b/examples/osgwindows/GNUmakefile new file mode 100644 index 000000000..68e17d2a7 --- /dev/null +++ b/examples/osgwindows/GNUmakefile @@ -0,0 +1,19 @@ +TOPDIR = ../.. +include $(TOPDIR)/Make/makedefs + +CXXFILES =\ + osgwindows.cpp\ + +LIBS += -losgProducer -lProducer -losgText -losgGA -losgDB -losgUtil -losg $(GL_LIBS) $(X_LIBS) $(OTHER_LIBS) + +INSTFILES = \ + $(CXXFILES)\ + GNUmakefile.inst=GNUmakefile + +EXEC = osgwindows + +INC += $(PRODUCER_INCLUDE_DIR) +LDFLAGS += $(PRODUCER_LIB_DIR) + +include $(TOPDIR)/Make/makerules + diff --git a/examples/osgwindows/GNUmakefile.inst b/examples/osgwindows/GNUmakefile.inst new file mode 100644 index 000000000..1250d44a1 --- /dev/null +++ b/examples/osgwindows/GNUmakefile.inst @@ -0,0 +1,14 @@ +TOPDIR = ../.. +include $(TOPDIR)/Make/makedefs + +CXXFILES =\ + osgwindows.cpp\ + +LIBS += -losgProducer -lProducer -losgDB -losgText -losgUtil -losg $(GL_LIBS) $(X_LIBS) $(OTHER_LIBS) + +EXEC = osgwindows + +INC += $(PRODUCER_INCLUDE_DIR) +LDFLAGS += $(PRODUCER_LIB_DIR) + +include $(TOPDIR)/Make/makerules diff --git a/examples/osgwindows/osgwindows.cpp b/examples/osgwindows/osgwindows.cpp new file mode 100644 index 000000000..59f4b0329 --- /dev/null +++ b/examples/osgwindows/osgwindows.cpp @@ -0,0 +1,132 @@ +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield + * + * This application is open source and may be redistributed and/or modified + * freely and without restriction, both in commericial and non commericial applications, + * as long as this copyright notice is maintained. + * + * This application is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#include +#include +#include + +static Producer::CameraConfig *BuildConfig(void) +{ + Producer::RenderSurface *rs1 = new Producer::RenderSurface; + rs1->setScreenNum(0); + //rs1->useBorder(false); + rs1->setWindowRect(0,0,640,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); + Producer::Camera *camera2 = new Producer::Camera; + camera2->setRenderSurface(rs2); + camera2->setOffset( -1.0, 0.0 ); + + 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)); + + + Producer::CameraConfig *cfg = new Producer::CameraConfig; + cfg->addCamera("Camera 1",camera1); + cfg->addCamera("Camera 2", camera2); + cfg->setInputArea(ia); + return cfg; +} + +int main( int argc, char **argv ) +{ + + // use an ArgumentParser object to manage the program arguments. + osg::ArgumentParser arguments(&argc,argv); + + // set up the usage document, in case we need to print out how to use this program. + arguments.getApplicationUsage()->setApplicatonName(arguments.getApplicationName()); + arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the standard OpenSceneGraph example which loads and visualises 3d models."); + arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ..."); + arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information"); + + + // construct the viewer. + osgProducer::Viewer viewer(BuildConfig()); + + // set up the value with sensible default event handlers. + viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS); + + // get details on keyboard and mouse bindings used by the viewer. + viewer.getUsage(*arguments.getApplicationUsage()); + + // if user request help write it out to cout. + if (arguments.read("-h") || arguments.read("--help")) + { + arguments.getApplicationUsage()->write(std::cout); + return 1; + } + + // any option left unread are converted into errors to write out later. + arguments.reportRemainingOptionsAsUnrecognized(); + + // report any errors if they have occured when parsing the program aguments. + if (arguments.errors()) + { + arguments.writeErrorMessages(std::cout); + return 1; + } + + if (arguments.argc()<=1) + { + arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION); + return 1; + } + + // read the scene from the list of file specified commandline args. + osg::ref_ptr loadedModel = osgDB::readNodeFiles(arguments); + + // if no model has been successfully loaded report failure. + if (!loadedModel) + { + std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl; + return 1; + } + + + // optimize the scene graph, remove rendundent nodes and state etc. + osgUtil::Optimizer optimizer; + optimizer.optimize(loadedModel.get()); + + // set the scene to render + viewer.setSceneData(loadedModel.get()); + + // create the windows and run the threads. +// viewer.realize(Producer::CameraGroup::ThreadPerCamera); + viewer.realize(Producer::CameraGroup::SingleThreaded); + + while( !viewer.done() ) + { + // wait for all cull and draw threads to complete. + viewer.sync(); + + // update the scene by traversing it with the the update visitor which will + // call all node update callbacks and animations. + viewer.update(); + + // fire off the cull and draw traversals of the scene. + viewer.frame(); + + } + + // wait for all cull and draw threads to complete before exit. + viewer.sync(); + + return 0; +} + diff --git a/runexamples.bat b/runexamples.bat index 06770b6c3..6d26f528b 100644 --- a/runexamples.bat +++ b/runexamples.bat @@ -4,15 +4,15 @@ osgversion echo osglogo osglogo -echo osgviewer osgcool.osg -osgviewer osgcool.osg - echo osgviewer cow.osg osgviewer cow.osg -echo osgkeyboard +echo osgkeyboard osgkeyboard +echo osgwindows glider.osg +osgwindows glider.osg + echo osgviewer --stereo cessna.osg osgviewer --stereo cessna.osg @@ -22,6 +22,9 @@ osgviewer cessnafire.osg echo osgviewer spaceship.osg osgviewer spaceship.osg +echo osgviewer osgcool.osg +osgviewer osgcool.osg + echo osgviewer cube_mapped_torus.osg osgviewer cube_mapped_torus.osg diff --git a/src/osgProducer/Viewer.cpp b/src/osgProducer/Viewer.cpp index 540828a2a..8f71db728 100644 --- a/src/osgProducer/Viewer.cpp +++ b/src/osgProducer/Viewer.cpp @@ -138,8 +138,8 @@ void Viewer::setUpViewer(unsigned int options) _old_style_osg_camera = new osg::Camera; if (options&TRACKBALL_MANIPULATOR) addCameraManipulator(new osgGA::TrackballManipulator); - if (options&DRIVE_MANIPULATOR) addCameraManipulator(new osgGA::DriveManipulator); if (options&FLIGHT_MANIPULATOR) addCameraManipulator(new osgGA::FlightManipulator); + if (options&DRIVE_MANIPULATOR) addCameraManipulator(new osgGA::DriveManipulator); if (options&STATE_MANIPULATOR) {