diff --git a/Make/makedirdefs b/Make/makedirdefs index e8d2f4411..580222086 100644 --- a/Make/makedirdefs +++ b/Make/makedirdefs @@ -41,6 +41,7 @@ PLUGIN_DIRS = \ lwo\ lws\ md2\ + net\ obj\ osgParticle\ osgText\ @@ -158,6 +159,7 @@ EXAMPLE_DIRS = \ osglightpoint\ osglogo\ osgmovie\ + osgmotionblur\ osgmultitexture\ osgoccluder\ osgpagedlod\ diff --git a/VisualStudio/VisualStudio.dsw b/VisualStudio/VisualStudio.dsw index 0567394b6..e73b71899 100644 --- a/VisualStudio/VisualStudio.dsw +++ b/VisualStudio/VisualStudio.dsw @@ -1860,6 +1860,33 @@ Package=<4> ############################################################################### +Project: "Example osgmotionblur"=.\examples\osgmotionblur\osgmotionblur.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: "Example osgvolume"=.\examples\osgvolume\osgvolume.dsp - Package Owner=<4> Package=<5> @@ -2286,6 +2313,27 @@ Package=<4> ############################################################################### +Project: "osgPlugin obj"=.\osgPlugins\obj\obj.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 osgUtil + End Project Dependency +}}} + +############################################################################### + Project: "osgPlugin net"=".\osgPlugins\net\net.dsp" - Package Owner=<4> Package=<5> diff --git a/VisualStudio/examples/osgmotionblur/osgmotionblur.dsp b/VisualStudio/examples/osgmotionblur/osgmotionblur.dsp new file mode 100644 index 000000000..7e582f40d --- /dev/null +++ b/VisualStudio/examples/osgmotionblur/osgmotionblur.dsp @@ -0,0 +1,101 @@ +# Microsoft Developer Studio Project File - Name="Example osgmotionblur" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=Example osgmotionblur - 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 "osgmotionblur.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 "osgmotionblur.mak" CFG="Example osgmotionblur - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Example osgmotionblur - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "Example osgmotionblur - 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 osgmotionblur - 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 "" +MTL=midl.exe +# 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" /I "../../../../OpenThreads/include" /I "../../../../Producer/include" /I "../../../../3rdParty/include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /Zm200 /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 OpenThreadsWin32.lib opengl32.lib /nologo /subsystem:console /pdb:none /machine:I386 /out:"../../../bin/osgmotionblur.exe" /libpath:"../../../lib" /libpath:"../../../../OpenThreads/lib/win32" /libpath:"../../../../Producer/lib" /libpath:"../../../../3rdParty/lib" + +!ELSEIF "$(CFG)" == "Example osgmotionblur - 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 "" +MTL=midl.exe +# 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" /I "../../../../OpenThreads/include" /I "../../../../Producer/include" /I "../../../../3rdParty/include" /D "_CONSOLE" /D "_MBCS" /D "FL_DLL" /D "WIN32" /D "_DEBUG" /FR /YX /FD /Zm200 /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 OpenThreadsWin32d.lib opengl32.lib /nologo /subsystem:console /debug /machine:I386 /nodefaultlib:"libcmt" /out:"../../../bin/osgmotionblurd.exe" /pdbtype:sept /libpath:"../../../lib" /libpath:"../../../../OpenThreads/lib/win32" /libpath:"../../../../Producer/lib" /libpath:"../../../../3rdParty/lib" +# SUBTRACT LINK32 /incremental:no + +!ENDIF + +# Begin Target + +# Name "Example osgmotionblur - Win32 Release" +# Name "Example osgmotionblur - Win32 Debug" +# Begin Source File + +SOURCE=..\..\..\examples\osgmotionblur\osgmotionblur.cpp +# End Source File +# Begin Source File + +SOURCE=.\resources.rc +# 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/VisualStudio/examples/osgmotionblur/resources.rc b/VisualStudio/examples/osgmotionblur/resources.rc new file mode 100644 index 000000000..029ebe5a7 --- /dev/null +++ b/VisualStudio/examples/osgmotionblur/resources.rc @@ -0,0 +1 @@ +PRODUCER_ICON ICON DISCARDABLE "../../icons/osg.ico" diff --git a/examples/osgmotionblur/GNUmakefile b/examples/osgmotionblur/GNUmakefile new file mode 100644 index 000000000..c56b150f5 --- /dev/null +++ b/examples/osgmotionblur/GNUmakefile @@ -0,0 +1,18 @@ +TOPDIR = ../.. +include $(TOPDIR)/Make/makedefs + +CXXFILES =\ + osgmotionblur.cpp\ + +LIBS += -losgProducer -lProducer -losgText -losgGA -losgDB -losgUtil -losg $(GL_LIBS) $(X_LIBS) $(OTHER_LIBS) + +INSTFILES = \ + $(CXXFILES)\ + GNUmakefile.inst=GNUmakefile + +EXEC = osgmotionblur + +INC += $(X_INC) + +include $(TOPDIR)/Make/makerules + diff --git a/examples/osgmotionblur/GNUmakefile.inst b/examples/osgmotionblur/GNUmakefile.inst new file mode 100644 index 000000000..fa21b1d42 --- /dev/null +++ b/examples/osgmotionblur/GNUmakefile.inst @@ -0,0 +1,13 @@ +TOPDIR = ../.. +include $(TOPDIR)/Make/makedefs + +CXXFILES =\ + osgmotionblur.cpp\ + +LIBS += -losgProducer -lProducer -losgDB -losgText -losgUtil -losg $(GL_LIBS) $(X_LIBS) $(OTHER_LIBS) + +EXEC = osgmotionblur + +INC += $(X_INC) + +include $(TOPDIR)/Make/makerules diff --git a/examples/osgmotionblur/osgmotionblur.cpp b/examples/osgmotionblur/osgmotionblur.cpp new file mode 100644 index 000000000..47dd62bbc --- /dev/null +++ b/examples/osgmotionblur/osgmotionblur.cpp @@ -0,0 +1,166 @@ +/* -*-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 + +class MotionBlurDrawCallback: public osgProducer::OsgSceneHandler::Callback +{ +public: + MotionBlurDrawCallback(double persistence) + : cleared_(false), + persistence_(persistence) + { + } + + virtual void operator()(osgProducer::OsgSceneHandler &handler, Producer::Camera &camera) + { + double t = handler.getSceneView()->getFrameStamp()->getReferenceTime(); + + if (!cleared_) + { + // clear the accumulation buffer + glClearColor(0, 0, 0, 0); + glClear(GL_ACCUM_BUFFER_BIT); + cleared_ = true; + t0_ = t; + } + + double dt = fabs(t - t0_); + t0_ = t; + + // call the scene handler's draw function + handler.drawImplementation(camera); + + // compute the blur factor + double s = powf(0.2, dt / persistence_); + + // scale, accumulate and return + glAccum(GL_MULT, s); + glAccum(GL_ACCUM, 1 - s); + glAccum(GL_RETURN, 1.0f); + } + +private: + bool cleared_; + double t0_; + double persistence_; +}; + + +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()->setApplicationName(arguments.getApplicationName()); + arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is an OpenSceneGraph example that shows how to use the accumulation buffer to achieve a simple motion blur effect."); + arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ..."); + arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information"); + arguments.getApplicationUsage()->addCommandLineOption("-P or --persistence","Set the motion blur persistence time"); + + + // construct the viewer. + osgProducer::Viewer viewer(arguments); + + // 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; + } + + double persistence = 0.25; + arguments.read("-P", persistence) || arguments.read("--persistence", persistence); + + // 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; + } + + osg::Timer_t start_tick = osg::Timer::instance()->tick(); + + // 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; + } + + // 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); + } + + osg::Timer_t end_tick = osg::Timer::instance()->tick(); + + std::cout << "Time to load = "<delta_s(start_tick,end_tick)<setDrawCallback(new MotionBlurDrawCallback(persistence)); + } + + 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 1c551390f..e58fcaab6 100644 --- a/runexamples.bat +++ b/runexamples.bat @@ -43,6 +43,9 @@ osgviewer cube_mapped_torus.osg echo osgvertexprogram osgvertexprogram +echo osgmotionblur cow.osg +osgmotionblur cow.osg + echo osgviewer Town.osg osgviewer Town.osg