Ran svn propset -R svn:eol-style native . on the OpenSceneGraph

This commit is contained in:
Robert Osfield 2011-04-19 11:40:22 +00:00
parent c70e7bda86
commit 581e6fb630
11 changed files with 815 additions and 815 deletions

View File

@ -31,7 +31,7 @@ PROJECT(OpenSceneGraph)
SET(OPENSCENEGRAPH_MAJOR_VERSION 2)
SET(OPENSCENEGRAPH_MINOR_VERSION 9)
SET(OPENSCENEGRAPH_PATCH_VERSION 12)
SET(OPENSCENEGRAPH_PATCH_VERSION 13)
SET(OPENSCENEGRAPH_SOVERSION 73)
# set to 0 when not a release candidate, non zero means that any generated

View File

@ -1,21 +1,21 @@
Mapping extensionless header files to C++ in Visual Studio
=============================================================================
Previous versions of the OSG included registry files which enabled syntax
highlighting for OSG's extensionless headers in Visual Studio. These are not
needed anymore, because starting with Visual Studio 2002 (7.0), there is a
setting that will map extensionless files to a certain language in the
options. This also works for the Express Editions.
1. Go to Tools-Options.
2. Open the Text Editor section, and click on File Extension.
3. At the bottom of the window, check the Map Extensionless Files To
checkbox, and select Microsoft Visual C++ in the list to the right.
Note that if you use this feature for other languages, you will have to
change it when needed. If that is too cumbersome you may want to generate
the registry files and do it that way instead. Please see the
.reg files in previous versions of OSG in the VisualStudio directory for
a guide on how to do that (hint: check the location of the registry key
to make sure the added values end up in the right place for your version
of Visual Studio).
Mapping extensionless header files to C++ in Visual Studio
=============================================================================
Previous versions of the OSG included registry files which enabled syntax
highlighting for OSG's extensionless headers in Visual Studio. These are not
needed anymore, because starting with Visual Studio 2002 (7.0), there is a
setting that will map extensionless files to a certain language in the
options. This also works for the Express Editions.
1. Go to Tools-Options.
2. Open the Text Editor section, and click on File Extension.
3. At the bottom of the window, check the Map Extensionless Files To
checkbox, and select Microsoft Visual C++ in the list to the right.
Note that if you use this feature for other languages, you will have to
change it when needed. If that is too cumbersome you may want to generate
the registry files and do it that way instead. Please see the
.reg files in previous versions of OSG in the VisualStudio directory for
a guide on how to do that (hint: check the location of the registry key
to make sure the added values end up in the right place for your version
of Visual Studio).

View File

@ -1,74 +1,74 @@
/* OpenSceneGraph example, osgdirectinput.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef OSGDIRECTINPUT_H
#define OSGDIRECTINPUT_H
#define DIRECTINPUT_VERSION 0x0800
#include <windows.h>
#include <dinput.h>
#include <iostream>
class JoystickEvent : public osg::Referenced
{
public:
JoystickEvent() {}
virtual ~JoystickEvent() {}
DIJOYSTATE2 _js;
};
class DirectInputRegistry : public osg::Referenced
{
public:
static DirectInputRegistry* instance()
{
static osg::ref_ptr<DirectInputRegistry> s_registry = new DirectInputRegistry;
return s_registry.get();
}
LPDIRECTINPUT8& getDevice() { return _inputDevice; }
LPDIRECTINPUTDEVICE8& getKeyboard() { return _keyboard; }
LPDIRECTINPUTDEVICE8& getMouse() { return _mouse; }
LPDIRECTINPUTDEVICE8& getJoyStick() { return _joystick; }
bool valid() const { return _supportDirectInput; }
bool initKeyboard( HWND handle );
bool initMouse( HWND handle );
bool initJoystick( HWND handle );
void updateState( osgGA::EventQueue* eventQueue );
protected:
DirectInputRegistry();
virtual ~DirectInputRegistry();
bool initImplementation( HWND handle, LPDIRECTINPUTDEVICE8 device, LPCDIDATAFORMAT format );
void pollDevice( LPDIRECTINPUTDEVICE8 device );
void releaseDevice( LPDIRECTINPUTDEVICE8 device );
static BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* didInstance, VOID* );
LPDIRECTINPUT8 _inputDevice;
LPDIRECTINPUTDEVICE8 _keyboard;
LPDIRECTINPUTDEVICE8 _mouse;
LPDIRECTINPUTDEVICE8 _joystick;
bool _supportDirectInput;
};
#endif
/* OpenSceneGraph example, osgdirectinput.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef OSGDIRECTINPUT_H
#define OSGDIRECTINPUT_H
#define DIRECTINPUT_VERSION 0x0800
#include <windows.h>
#include <dinput.h>
#include <iostream>
class JoystickEvent : public osg::Referenced
{
public:
JoystickEvent() {}
virtual ~JoystickEvent() {}
DIJOYSTATE2 _js;
};
class DirectInputRegistry : public osg::Referenced
{
public:
static DirectInputRegistry* instance()
{
static osg::ref_ptr<DirectInputRegistry> s_registry = new DirectInputRegistry;
return s_registry.get();
}
LPDIRECTINPUT8& getDevice() { return _inputDevice; }
LPDIRECTINPUTDEVICE8& getKeyboard() { return _keyboard; }
LPDIRECTINPUTDEVICE8& getMouse() { return _mouse; }
LPDIRECTINPUTDEVICE8& getJoyStick() { return _joystick; }
bool valid() const { return _supportDirectInput; }
bool initKeyboard( HWND handle );
bool initMouse( HWND handle );
bool initJoystick( HWND handle );
void updateState( osgGA::EventQueue* eventQueue );
protected:
DirectInputRegistry();
virtual ~DirectInputRegistry();
bool initImplementation( HWND handle, LPDIRECTINPUTDEVICE8 device, LPCDIDATAFORMAT format );
void pollDevice( LPDIRECTINPUTDEVICE8 device );
void releaseDevice( LPDIRECTINPUTDEVICE8 device );
static BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* didInstance, VOID* );
LPDIRECTINPUT8 _inputDevice;
LPDIRECTINPUTDEVICE8 _keyboard;
LPDIRECTINPUTDEVICE8 _mouse;
LPDIRECTINPUTDEVICE8 _joystick;
bool _supportDirectInput;
};
#endif

View File

@ -1,210 +1,210 @@
/* OpenSceneGraph example, osgdirectinput.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <osgGA/EventQueue>
#include <iostream>
#include "DirectInputRegistry"
typedef std::pair<int, int> KeyValue;
typedef std::map<int, KeyValue> KeyMap;
KeyMap g_keyMap;
void buildKeyMap()
{
// TODO: finish the key map as you wish
g_keyMap[DIK_ESCAPE] = KeyValue(osgGA::GUIEventAdapter::KEY_Escape, 0);
g_keyMap[DIK_1] = KeyValue('1', 0);
g_keyMap[DIK_2] = KeyValue('2', 0);
g_keyMap[DIK_3] = KeyValue('3', 0);
g_keyMap[DIK_4] = KeyValue('4', 0);
g_keyMap[DIK_5] = KeyValue('5', 0);
g_keyMap[DIK_6] = KeyValue('6', 0);
g_keyMap[DIK_7] = KeyValue('7', 0);
g_keyMap[DIK_8] = KeyValue('8', 0);
g_keyMap[DIK_9] = KeyValue('9', 0);
g_keyMap[DIK_0] = KeyValue('0', 0);
g_keyMap[DIK_MINUS] = KeyValue('-', 0);
g_keyMap[DIK_EQUALS] = KeyValue('=', 0);
g_keyMap[DIK_BACK] = KeyValue(osgGA::GUIEventAdapter::KEY_BackSpace, 0);
g_keyMap[DIK_TAB] = KeyValue(osgGA::GUIEventAdapter::KEY_Tab, 0);
g_keyMap[DIK_SPACE] = KeyValue(osgGA::GUIEventAdapter::KEY_Space, 0);
}
bool DirectInputRegistry::initKeyboard( HWND handle )
{
if ( !_inputDevice ) return false;
HRESULT hr = _inputDevice->CreateDevice( GUID_SysKeyboard, &_keyboard, NULL );
if ( FAILED(hr) || _keyboard==NULL )
{
osg::notify(osg::WARN) << "Unable to create keyboard." << std::endl;
return false;
}
buildKeyMap();
return initImplementation( handle, _keyboard, &c_dfDIKeyboard );
}
bool DirectInputRegistry::initMouse( HWND handle )
{
if ( !_inputDevice ) return false;
HRESULT hr = _inputDevice->CreateDevice( GUID_SysMouse, &_mouse, NULL );
if ( FAILED(hr) || _mouse==NULL )
{
osg::notify(osg::WARN) << "Unable to create mouse." << std::endl;
return false;
}
return initImplementation( handle, _mouse, &c_dfDIMouse2 );
}
bool DirectInputRegistry::initJoystick( HWND handle )
{
if ( !_inputDevice ) return false;
HRESULT hr = _inputDevice->EnumDevices( DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback,
NULL, DIEDFL_ATTACHEDONLY );
if ( FAILED(hr) || _joystick==NULL )
{
osg::notify(osg::WARN) << "Unable to enumerate joysticks." << std::endl;
return false;
}
return initImplementation( handle, _joystick, &c_dfDIJoystick2 );
}
void DirectInputRegistry::updateState( osgGA::EventQueue* eventQueue )
{
HRESULT hr;
if ( !_supportDirectInput || !eventQueue ) return;
if ( _keyboard )
{
pollDevice( _keyboard );
char buffer[256] = {0};
hr = _keyboard->GetDeviceState( sizeof(buffer), &buffer );
if ( SUCCEEDED(hr) )
{
for ( KeyMap::iterator itr=g_keyMap.begin(); itr!=g_keyMap.end(); ++itr )
{
KeyValue& key = itr->second;
char value = buffer[itr->first];
if ( key.second==value ) continue;
key.second = value;
if ( value&0x80 )
eventQueue->keyPress( key.first );
else
eventQueue->keyRelease( key.first );
}
}
}
if ( _mouse )
{
pollDevice( _mouse );
DIMOUSESTATE2 mouseState;
hr = _mouse->GetDeviceState( sizeof(DIMOUSESTATE2), &mouseState );
// TODO: add mouse handlers
}
if ( _joystick )
{
pollDevice( _joystick );
osg::ref_ptr<JoystickEvent> event = new JoystickEvent;
hr = _joystick->GetDeviceState( sizeof(DIJOYSTATE2), &(event->_js) );
if ( SUCCEEDED(hr) ) eventQueue->userEvent( event.get() );
}
}
DirectInputRegistry::DirectInputRegistry()
: _keyboard(0), _mouse(0), _joystick(0),
_supportDirectInput(true)
{
HRESULT hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION,
IID_IDirectInput8, (VOID**)&_inputDevice, NULL );
if ( FAILED(hr) )
{
osg::notify(osg::WARN) << "Unable to create DirectInput object." << std::endl;
_supportDirectInput = false;
}
}
DirectInputRegistry::~DirectInputRegistry()
{
releaseDevice( _keyboard );
releaseDevice( _mouse );
releaseDevice( _joystick );
if ( _inputDevice ) _inputDevice->Release();
}
bool DirectInputRegistry::initImplementation( HWND handle, LPDIRECTINPUTDEVICE8 device, LPCDIDATAFORMAT format )
{
_supportDirectInput = true;
HRESULT hr = device->SetDataFormat( format );
if ( FAILED(hr) )
{
osg::notify(osg::WARN) << "Unable to set device data format." << std::endl;
_supportDirectInput = false;
}
hr = device->SetCooperativeLevel( handle, DISCL_EXCLUSIVE|DISCL_FOREGROUND );
if ( FAILED(hr) )
{
osg::notify(osg::WARN) << "Unable to attach device to window." << std::endl;
_supportDirectInput = false;
}
device->Acquire();
return _supportDirectInput;
}
void DirectInputRegistry::pollDevice( LPDIRECTINPUTDEVICE8 device )
{
HRESULT hr = device->Poll();
if ( FAILED(hr) )
{
device->Acquire();
if ( hr==DIERR_INPUTLOST )
osg::notify(osg::WARN) << "Device lost." << std::endl;
}
}
void DirectInputRegistry::releaseDevice( LPDIRECTINPUTDEVICE8 device )
{
if ( device )
{
device->Unacquire();
device->Release();
}
}
BOOL CALLBACK DirectInputRegistry::EnumJoysticksCallback( const DIDEVICEINSTANCE* didInstance, VOID* )
{
HRESULT hr;
LPDIRECTINPUT8 device = DirectInputRegistry::instance()->getDevice();
if ( device )
{
hr = device->CreateDevice( didInstance->guidInstance,
&(DirectInputRegistry::instance()->getJoyStick()), NULL );
}
if ( FAILED(hr) ) return DIENUM_CONTINUE;
return DIENUM_STOP;
}
/* OpenSceneGraph example, osgdirectinput.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <osgGA/EventQueue>
#include <iostream>
#include "DirectInputRegistry"
typedef std::pair<int, int> KeyValue;
typedef std::map<int, KeyValue> KeyMap;
KeyMap g_keyMap;
void buildKeyMap()
{
// TODO: finish the key map as you wish
g_keyMap[DIK_ESCAPE] = KeyValue(osgGA::GUIEventAdapter::KEY_Escape, 0);
g_keyMap[DIK_1] = KeyValue('1', 0);
g_keyMap[DIK_2] = KeyValue('2', 0);
g_keyMap[DIK_3] = KeyValue('3', 0);
g_keyMap[DIK_4] = KeyValue('4', 0);
g_keyMap[DIK_5] = KeyValue('5', 0);
g_keyMap[DIK_6] = KeyValue('6', 0);
g_keyMap[DIK_7] = KeyValue('7', 0);
g_keyMap[DIK_8] = KeyValue('8', 0);
g_keyMap[DIK_9] = KeyValue('9', 0);
g_keyMap[DIK_0] = KeyValue('0', 0);
g_keyMap[DIK_MINUS] = KeyValue('-', 0);
g_keyMap[DIK_EQUALS] = KeyValue('=', 0);
g_keyMap[DIK_BACK] = KeyValue(osgGA::GUIEventAdapter::KEY_BackSpace, 0);
g_keyMap[DIK_TAB] = KeyValue(osgGA::GUIEventAdapter::KEY_Tab, 0);
g_keyMap[DIK_SPACE] = KeyValue(osgGA::GUIEventAdapter::KEY_Space, 0);
}
bool DirectInputRegistry::initKeyboard( HWND handle )
{
if ( !_inputDevice ) return false;
HRESULT hr = _inputDevice->CreateDevice( GUID_SysKeyboard, &_keyboard, NULL );
if ( FAILED(hr) || _keyboard==NULL )
{
osg::notify(osg::WARN) << "Unable to create keyboard." << std::endl;
return false;
}
buildKeyMap();
return initImplementation( handle, _keyboard, &c_dfDIKeyboard );
}
bool DirectInputRegistry::initMouse( HWND handle )
{
if ( !_inputDevice ) return false;
HRESULT hr = _inputDevice->CreateDevice( GUID_SysMouse, &_mouse, NULL );
if ( FAILED(hr) || _mouse==NULL )
{
osg::notify(osg::WARN) << "Unable to create mouse." << std::endl;
return false;
}
return initImplementation( handle, _mouse, &c_dfDIMouse2 );
}
bool DirectInputRegistry::initJoystick( HWND handle )
{
if ( !_inputDevice ) return false;
HRESULT hr = _inputDevice->EnumDevices( DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback,
NULL, DIEDFL_ATTACHEDONLY );
if ( FAILED(hr) || _joystick==NULL )
{
osg::notify(osg::WARN) << "Unable to enumerate joysticks." << std::endl;
return false;
}
return initImplementation( handle, _joystick, &c_dfDIJoystick2 );
}
void DirectInputRegistry::updateState( osgGA::EventQueue* eventQueue )
{
HRESULT hr;
if ( !_supportDirectInput || !eventQueue ) return;
if ( _keyboard )
{
pollDevice( _keyboard );
char buffer[256] = {0};
hr = _keyboard->GetDeviceState( sizeof(buffer), &buffer );
if ( SUCCEEDED(hr) )
{
for ( KeyMap::iterator itr=g_keyMap.begin(); itr!=g_keyMap.end(); ++itr )
{
KeyValue& key = itr->second;
char value = buffer[itr->first];
if ( key.second==value ) continue;
key.second = value;
if ( value&0x80 )
eventQueue->keyPress( key.first );
else
eventQueue->keyRelease( key.first );
}
}
}
if ( _mouse )
{
pollDevice( _mouse );
DIMOUSESTATE2 mouseState;
hr = _mouse->GetDeviceState( sizeof(DIMOUSESTATE2), &mouseState );
// TODO: add mouse handlers
}
if ( _joystick )
{
pollDevice( _joystick );
osg::ref_ptr<JoystickEvent> event = new JoystickEvent;
hr = _joystick->GetDeviceState( sizeof(DIJOYSTATE2), &(event->_js) );
if ( SUCCEEDED(hr) ) eventQueue->userEvent( event.get() );
}
}
DirectInputRegistry::DirectInputRegistry()
: _keyboard(0), _mouse(0), _joystick(0),
_supportDirectInput(true)
{
HRESULT hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION,
IID_IDirectInput8, (VOID**)&_inputDevice, NULL );
if ( FAILED(hr) )
{
osg::notify(osg::WARN) << "Unable to create DirectInput object." << std::endl;
_supportDirectInput = false;
}
}
DirectInputRegistry::~DirectInputRegistry()
{
releaseDevice( _keyboard );
releaseDevice( _mouse );
releaseDevice( _joystick );
if ( _inputDevice ) _inputDevice->Release();
}
bool DirectInputRegistry::initImplementation( HWND handle, LPDIRECTINPUTDEVICE8 device, LPCDIDATAFORMAT format )
{
_supportDirectInput = true;
HRESULT hr = device->SetDataFormat( format );
if ( FAILED(hr) )
{
osg::notify(osg::WARN) << "Unable to set device data format." << std::endl;
_supportDirectInput = false;
}
hr = device->SetCooperativeLevel( handle, DISCL_EXCLUSIVE|DISCL_FOREGROUND );
if ( FAILED(hr) )
{
osg::notify(osg::WARN) << "Unable to attach device to window." << std::endl;
_supportDirectInput = false;
}
device->Acquire();
return _supportDirectInput;
}
void DirectInputRegistry::pollDevice( LPDIRECTINPUTDEVICE8 device )
{
HRESULT hr = device->Poll();
if ( FAILED(hr) )
{
device->Acquire();
if ( hr==DIERR_INPUTLOST )
osg::notify(osg::WARN) << "Device lost." << std::endl;
}
}
void DirectInputRegistry::releaseDevice( LPDIRECTINPUTDEVICE8 device )
{
if ( device )
{
device->Unacquire();
device->Release();
}
}
BOOL CALLBACK DirectInputRegistry::EnumJoysticksCallback( const DIDEVICEINSTANCE* didInstance, VOID* )
{
HRESULT hr;
LPDIRECTINPUT8 device = DirectInputRegistry::instance()->getDevice();
if ( device )
{
hr = device->CreateDevice( didInstance->guidInstance,
&(DirectInputRegistry::instance()->getJoyStick()), NULL );
}
if ( FAILED(hr) ) return DIENUM_CONTINUE;
return DIENUM_STOP;
}

View File

@ -1,115 +1,115 @@
/* OpenSceneGraph example, osgdirectinput.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <osgDB/ReadFile>
#include <osgGA/StateSetManipulator>
#include <osgViewer/api/Win32/GraphicsWindowWin32>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <iostream>
#include "DirectInputRegistry"
class CustomViewer : public osgViewer::Viewer
{
public:
CustomViewer() : osgViewer::Viewer() {}
virtual ~CustomViewer() {}
virtual void eventTraversal()
{
DirectInputRegistry::instance()->updateState( _eventQueue.get() );
osgViewer::Viewer::eventTraversal();
}
protected:
virtual void viewerInit()
{
osgViewer::GraphicsWindowWin32* windowWin32 =
dynamic_cast<osgViewer::GraphicsWindowWin32*>( _camera->getGraphicsContext() );
if ( windowWin32 )
{
HWND hwnd = windowWin32->getHWND();
DirectInputRegistry::instance()->initKeyboard( hwnd );
//DirectInputRegistry::instance()->initMouse( hwnd );
DirectInputRegistry::instance()->initJoystick( hwnd );
}
osgViewer::Viewer::viewerInit();
}
};
class JoystickHandler : public osgGA::GUIEventHandler
{
public:
JoystickHandler() {}
bool handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa )
{
switch ( ea.getEventType() )
{
case osgGA::GUIEventAdapter::KEYDOWN:
std::cout << "*** Key 0x" << std::hex << ea.getKey() << std::dec << " down ***" << std::endl;
break;
case osgGA::GUIEventAdapter::KEYUP:
std::cout << "*** Key 0x" << std::hex << ea.getKey() << std::dec << " up ***" << std::endl;
break;
case osgGA::GUIEventAdapter::USER:
{
const JoystickEvent* event = dynamic_cast<const JoystickEvent*>( ea.getUserData() );
if ( !event ) break;
const DIJOYSTATE2& js = event->_js;
for ( unsigned int i=0; i<128; ++i )
{
if ( js.rgbButtons[i] )
std::cout << "*** Joystick Btn" << i << " = " << (int)js.rgbButtons[i] << std::endl;
}
if ( js.lX==0x0000 ) std::cout << "*** Joystick X-" << std::endl;
else if ( js.lX==0xffff ) std::cout << "*** Joystick X+" << std::endl;
if ( js.lY==0 ) std::cout << "*** Joystick Y-" << std::endl;
else if ( js.lY==0xffff ) std::cout << "*** Joystick Y+" << std::endl;
}
return true;
default:
break;
}
return false;
}
};
int main( int argc, char** argv )
{
osg::ArgumentParser arguments( &argc, argv );
osg::Node* model = osgDB::readNodeFiles( arguments );
if ( !model ) model = osgDB::readNodeFile( "cow.osg" );
if ( !model )
{
std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl;
return 1;
}
CustomViewer viewer;
viewer.addEventHandler( new JoystickHandler );
viewer.addEventHandler( new osgViewer::StatsHandler );
viewer.addEventHandler( new osgViewer::WindowSizeHandler );
viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
viewer.setSceneData( model );
viewer.setUpViewInWindow( 250, 50, 800, 600 );
return viewer.run();
}
/* OpenSceneGraph example, osgdirectinput.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <osgDB/ReadFile>
#include <osgGA/StateSetManipulator>
#include <osgViewer/api/Win32/GraphicsWindowWin32>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <iostream>
#include "DirectInputRegistry"
class CustomViewer : public osgViewer::Viewer
{
public:
CustomViewer() : osgViewer::Viewer() {}
virtual ~CustomViewer() {}
virtual void eventTraversal()
{
DirectInputRegistry::instance()->updateState( _eventQueue.get() );
osgViewer::Viewer::eventTraversal();
}
protected:
virtual void viewerInit()
{
osgViewer::GraphicsWindowWin32* windowWin32 =
dynamic_cast<osgViewer::GraphicsWindowWin32*>( _camera->getGraphicsContext() );
if ( windowWin32 )
{
HWND hwnd = windowWin32->getHWND();
DirectInputRegistry::instance()->initKeyboard( hwnd );
//DirectInputRegistry::instance()->initMouse( hwnd );
DirectInputRegistry::instance()->initJoystick( hwnd );
}
osgViewer::Viewer::viewerInit();
}
};
class JoystickHandler : public osgGA::GUIEventHandler
{
public:
JoystickHandler() {}
bool handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa )
{
switch ( ea.getEventType() )
{
case osgGA::GUIEventAdapter::KEYDOWN:
std::cout << "*** Key 0x" << std::hex << ea.getKey() << std::dec << " down ***" << std::endl;
break;
case osgGA::GUIEventAdapter::KEYUP:
std::cout << "*** Key 0x" << std::hex << ea.getKey() << std::dec << " up ***" << std::endl;
break;
case osgGA::GUIEventAdapter::USER:
{
const JoystickEvent* event = dynamic_cast<const JoystickEvent*>( ea.getUserData() );
if ( !event ) break;
const DIJOYSTATE2& js = event->_js;
for ( unsigned int i=0; i<128; ++i )
{
if ( js.rgbButtons[i] )
std::cout << "*** Joystick Btn" << i << " = " << (int)js.rgbButtons[i] << std::endl;
}
if ( js.lX==0x0000 ) std::cout << "*** Joystick X-" << std::endl;
else if ( js.lX==0xffff ) std::cout << "*** Joystick X+" << std::endl;
if ( js.lY==0 ) std::cout << "*** Joystick Y-" << std::endl;
else if ( js.lY==0xffff ) std::cout << "*** Joystick Y+" << std::endl;
}
return true;
default:
break;
}
return false;
}
};
int main( int argc, char** argv )
{
osg::ArgumentParser arguments( &argc, argv );
osg::Node* model = osgDB::readNodeFiles( arguments );
if ( !model ) model = osgDB::readNodeFile( "cow.osg" );
if ( !model )
{
std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl;
return 1;
}
CustomViewer viewer;
viewer.addEventHandler( new JoystickHandler );
viewer.addEventHandler( new osgViewer::StatsHandler );
viewer.addEventHandler( new osgViewer::WindowSizeHandler );
viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
viewer.setSceneData( model );
viewer.setUpViewInWindow( 250, 50, 800, 600 );
return viewer.run();
}

View File

@ -1,150 +1,150 @@
/* OpenSceneGraph example, osgdrawinstanced.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
//
// This code is copyright (c) 2008 Skew Matrix Software LLC. You may use
// the code under the licensing terms described above.
//
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Geometry>
#include <osg/Texture2D>
#include <osgDB/WriteFile>
#include <iostream>
void
createDAIGeometry( osg::Geometry& geom, int nInstances=1 )
{
const float halfDimX( .5 );
const float halfDimZ( .5 );
osg::Vec3Array* v = new osg::Vec3Array;
v->resize( 4 );
geom.setVertexArray( v );
// Geometry for a single quad.
(*v)[ 0 ] = osg::Vec3( -halfDimX, 0., -halfDimZ );
(*v)[ 1 ] = osg::Vec3( halfDimX, 0., -halfDimZ );
(*v)[ 2 ] = osg::Vec3( halfDimX, 0., halfDimZ );
(*v)[ 3 ] = osg::Vec3( -halfDimX, 0., halfDimZ );
// Use the DrawArraysInstanced PrimitiveSet and tell it to draw 1024 instances.
geom.addPrimitiveSet( new osg::DrawArrays( GL_QUADS, 0, 4, nInstances ) );
}
osg::StateSet*
createStateSet()
{
osg::ref_ptr< osg::StateSet > ss = new osg::StateSet;
// Create a vertex program that references the gl_InstanceID to
// render each instance uniquely. gl_InstanceID will be in the range
// 0 to numInstances-1 (1023 in our case).
std::string vertexSource =
"uniform sampler2D osgLogo; \n"
"uniform float osg_SimulationTime; \n"
"void main() \n"
"{ \n"
// Using the instance ID, generate "texture coords" for this instance.
"vec2 tC; \n"
"float r = float(gl_InstanceID) / 32.; \n"
"tC.s = fract( r ); tC.t = floor( r ) / 32.; \n"
// Get the color from the OSG logo.
"gl_FrontColor = texture2D( osgLogo, tC ); \n"
// Use the (scaled) tex coord to translate the position of the vertices.
"vec4 pos = vec4( tC.s * 48., 0., tC.t * 48., 1. ); \n"
// Compute a rotation angle from the instanceID and elapsed time.
"float timeOffset = gl_InstanceID / (32. * 32.); \n"
"float angle = ( osg_SimulationTime - timeOffset ) * 6.283; \n"
"float sa = sin( angle ); \n"
"float ca = cos( angle ); \n"
// New orientation, rotate around z axis.
"vec4 newX = vec4( ca, sa, 0., 0. ); \n"
"vec4 newY = vec4( sa, ca, 0., 0. ); \n"
"vec4 newZ = vec4( 0., 0., 1., 0. ); \n"
"mat4 mV = mat4( newX, newY, newZ, pos ); \n"
"gl_Position = ( gl_ModelViewProjectionMatrix * mV * gl_Vertex ); \n"
"} \n";
osg::ref_ptr< osg::Shader > vertexShader = new osg::Shader();
vertexShader->setType( osg::Shader::VERTEX );
vertexShader->setShaderSource( vertexSource );
osg::ref_ptr< osg::Program > program = new osg::Program();
program->addShader( vertexShader.get() );
ss->setAttribute( program.get(),
osg::StateAttribute::ON | osg::StateAttribute::PROTECTED );
osg::ref_ptr< osg::Image> iLogo = osgDB::readImageFile( "Images/osg128.png" );
if( !iLogo.valid() )
{
osg::notify( osg::ALWAYS ) << "Can't open image file osg128.png" << std::endl;
return( NULL );
}
osg::Texture2D* texLogo = new osg::Texture2D( iLogo.get() );
texLogo->setFilter( osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR );
texLogo->setFilter( osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR );
ss->setTextureAttribute( 0, texLogo );
osg::ref_ptr< osg::Uniform > texLogoUniform =
new osg::Uniform( "osgLogo", 0 );
ss->addUniform( texLogoUniform.get() );
return( ss.release() );
}
int main( int argc, char **argv )
{
osg::ArgumentParser arguments(&argc, argv);
// Make a scene graph consisting of a single Geode, containing
// a single Geometry, and a single PrimitiveSet.
osg::ref_ptr< osg::Geode > geode = new osg::Geode;
osg::ref_ptr< osg::Geometry > geom = new osg::Geometry;
// Configure the Geometry for use with EXT_draw_arrays:
// DL off and buffer objects on.
geom->setUseDisplayList( false );
geom->setUseVertexBufferObjects( true );
// OSG has no clue where out vertex shader will place the geometric data,
// so specify an initial bound to allow proper culling and near/far computation.
osg::BoundingBox bb( -1., -.1, -1., 49., 1., 49. );
geom->setInitialBound( bb );
// Add geometric data and the PrimitiveSet. Specify numInstances as 32*32 or 1024.
createDAIGeometry( *geom, 32*32 );
geode->addDrawable( geom.get() );
// Create a StateSet to render the instanced Geometry.
osg::ref_ptr< osg::StateSet > ss = createStateSet();
geode->setStateSet( ss.get() );
// osgDB::writeNodeFile(*geode, "instanced.osg");
osgViewer::Viewer viewer(arguments);
viewer.setSceneData( geode.get() );
return viewer.run();
}
/* OpenSceneGraph example, osgdrawinstanced.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
//
// This code is copyright (c) 2008 Skew Matrix Software LLC. You may use
// the code under the licensing terms described above.
//
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Geometry>
#include <osg/Texture2D>
#include <osgDB/WriteFile>
#include <iostream>
void
createDAIGeometry( osg::Geometry& geom, int nInstances=1 )
{
const float halfDimX( .5 );
const float halfDimZ( .5 );
osg::Vec3Array* v = new osg::Vec3Array;
v->resize( 4 );
geom.setVertexArray( v );
// Geometry for a single quad.
(*v)[ 0 ] = osg::Vec3( -halfDimX, 0., -halfDimZ );
(*v)[ 1 ] = osg::Vec3( halfDimX, 0., -halfDimZ );
(*v)[ 2 ] = osg::Vec3( halfDimX, 0., halfDimZ );
(*v)[ 3 ] = osg::Vec3( -halfDimX, 0., halfDimZ );
// Use the DrawArraysInstanced PrimitiveSet and tell it to draw 1024 instances.
geom.addPrimitiveSet( new osg::DrawArrays( GL_QUADS, 0, 4, nInstances ) );
}
osg::StateSet*
createStateSet()
{
osg::ref_ptr< osg::StateSet > ss = new osg::StateSet;
// Create a vertex program that references the gl_InstanceID to
// render each instance uniquely. gl_InstanceID will be in the range
// 0 to numInstances-1 (1023 in our case).
std::string vertexSource =
"uniform sampler2D osgLogo; \n"
"uniform float osg_SimulationTime; \n"
"void main() \n"
"{ \n"
// Using the instance ID, generate "texture coords" for this instance.
"vec2 tC; \n"
"float r = float(gl_InstanceID) / 32.; \n"
"tC.s = fract( r ); tC.t = floor( r ) / 32.; \n"
// Get the color from the OSG logo.
"gl_FrontColor = texture2D( osgLogo, tC ); \n"
// Use the (scaled) tex coord to translate the position of the vertices.
"vec4 pos = vec4( tC.s * 48., 0., tC.t * 48., 1. ); \n"
// Compute a rotation angle from the instanceID and elapsed time.
"float timeOffset = gl_InstanceID / (32. * 32.); \n"
"float angle = ( osg_SimulationTime - timeOffset ) * 6.283; \n"
"float sa = sin( angle ); \n"
"float ca = cos( angle ); \n"
// New orientation, rotate around z axis.
"vec4 newX = vec4( ca, sa, 0., 0. ); \n"
"vec4 newY = vec4( sa, ca, 0., 0. ); \n"
"vec4 newZ = vec4( 0., 0., 1., 0. ); \n"
"mat4 mV = mat4( newX, newY, newZ, pos ); \n"
"gl_Position = ( gl_ModelViewProjectionMatrix * mV * gl_Vertex ); \n"
"} \n";
osg::ref_ptr< osg::Shader > vertexShader = new osg::Shader();
vertexShader->setType( osg::Shader::VERTEX );
vertexShader->setShaderSource( vertexSource );
osg::ref_ptr< osg::Program > program = new osg::Program();
program->addShader( vertexShader.get() );
ss->setAttribute( program.get(),
osg::StateAttribute::ON | osg::StateAttribute::PROTECTED );
osg::ref_ptr< osg::Image> iLogo = osgDB::readImageFile( "Images/osg128.png" );
if( !iLogo.valid() )
{
osg::notify( osg::ALWAYS ) << "Can't open image file osg128.png" << std::endl;
return( NULL );
}
osg::Texture2D* texLogo = new osg::Texture2D( iLogo.get() );
texLogo->setFilter( osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR );
texLogo->setFilter( osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR );
ss->setTextureAttribute( 0, texLogo );
osg::ref_ptr< osg::Uniform > texLogoUniform =
new osg::Uniform( "osgLogo", 0 );
ss->addUniform( texLogoUniform.get() );
return( ss.release() );
}
int main( int argc, char **argv )
{
osg::ArgumentParser arguments(&argc, argv);
// Make a scene graph consisting of a single Geode, containing
// a single Geometry, and a single PrimitiveSet.
osg::ref_ptr< osg::Geode > geode = new osg::Geode;
osg::ref_ptr< osg::Geometry > geom = new osg::Geometry;
// Configure the Geometry for use with EXT_draw_arrays:
// DL off and buffer objects on.
geom->setUseDisplayList( false );
geom->setUseVertexBufferObjects( true );
// OSG has no clue where out vertex shader will place the geometric data,
// so specify an initial bound to allow proper culling and near/far computation.
osg::BoundingBox bb( -1., -.1, -1., 49., 1., 49. );
geom->setInitialBound( bb );
// Add geometric data and the PrimitiveSet. Specify numInstances as 32*32 or 1024.
createDAIGeometry( *geom, 32*32 );
geode->addDrawable( geom.get() );
// Create a StateSet to render the instanced Geometry.
osg::ref_ptr< osg::StateSet > ss = createStateSet();
geode->setStateSet( ss.get() );
// osgDB::writeNodeFile(*geode, "instanced.osg");
osgViewer::Viewer viewer(arguments);
viewer.setSceneData( geode.get() );
return viewer.run();
}

View File

@ -1,6 +1,6 @@
#this file is automatically generated
SET(TARGET_SRC osgshadergen.cpp )
#### end var setup ###
SETUP_EXAMPLE(osgshadergen)
#this file is automatically generated
SET(TARGET_SRC osgshadergen.cpp )
#### end var setup ###
SETUP_EXAMPLE(osgshadergen)

View File

@ -1,13 +1,13 @@
//
// MFC_OSG_MDI.RC2 - resources Microsoft Visual C++ does not edit directly
//
#ifdef APSTUDIO_INVOKED
#error this file is not editable by Microsoft Visual C++
#endif //APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
// Add manually edited resources here...
/////////////////////////////////////////////////////////////////////////////
//
// MFC_OSG_MDI.RC2 - resources Microsoft Visual C++ does not edit directly
//
#ifdef APSTUDIO_INVOKED
#error this file is not editable by Microsoft Visual C++
#endif //APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
// Add manually edited resources here...
/////////////////////////////////////////////////////////////////////////////

View File

@ -1,97 +1,97 @@
#include <QtCore/QTimer>
#include <QtGui/QApplication>
#include <QtGui/QGridLayout>
#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/TrackballManipulator>
#include <osgDB/ReadFile>
#include <osgQt/GraphicsWindowQt>
#include <iostream>
class ViewerWidget : public QWidget, public osgViewer::CompositeViewer
{
public:
ViewerWidget() : QWidget()
{
setThreadingModel(osgViewer::CompositeViewer::SingleThreaded);
QWidget* widget1 = addViewWidget( createCamera(0,0,100,100), osgDB::readNodeFile("cow.osg") );
QWidget* widget2 = addViewWidget( createCamera(0,0,100,100), osgDB::readNodeFile("glider.osg") );
QWidget* widget3 = addViewWidget( createCamera(0,0,100,100), osgDB::readNodeFile("axes.osg") );
QWidget* widget4 = addViewWidget( createCamera(0,0,100,100), osgDB::readNodeFile("fountain.osg") );
QWidget* popupWidget = addViewWidget( createCamera(900,100,320,240,"Popup window",true),
osgDB::readNodeFile("dumptruck.osg") );
popupWidget->show();
QGridLayout* grid = new QGridLayout;
grid->addWidget( widget1, 0, 0 );
grid->addWidget( widget2, 0, 1 );
grid->addWidget( widget3, 1, 0 );
grid->addWidget( widget4, 1, 1 );
setLayout( grid );
connect( &_timer, SIGNAL(timeout()), this, SLOT(update()) );
_timer.start( 10 );
}
QWidget* addViewWidget( osg::Camera* camera, osg::Node* scene )
{
osgViewer::View* view = new osgViewer::View;
view->setCamera( camera );
addView( view );
view->setSceneData( scene );
view->addEventHandler( new osgViewer::StatsHandler );
view->setCameraManipulator( new osgGA::TrackballManipulator );
osgQt::GraphicsWindowQt* gw = dynamic_cast<osgQt::GraphicsWindowQt*>( camera->getGraphicsContext() );
return gw ? gw->getGraphWidget() : NULL;
}
osg::Camera* createCamera( int x, int y, int w, int h, const std::string& name="", bool windowDecoration=false )
{
osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
traits->windowName = name;
traits->windowDecoration = windowDecoration;
traits->x = x;
traits->y = y;
traits->width = w;
traits->height = h;
traits->doubleBuffer = true;
traits->alpha = ds->getMinimumNumAlphaBits();
traits->stencil = ds->getMinimumNumStencilBits();
traits->sampleBuffers = ds->getMultiSamples();
traits->samples = ds->getNumMultiSamples();
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setGraphicsContext( new osgQt::GraphicsWindowQt(traits.get()) );
camera->setClearColor( osg::Vec4(0.2, 0.2, 0.6, 1.0) );
camera->setViewport( new osg::Viewport(0, 0, traits->width, traits->height) );
camera->setProjectionMatrixAsPerspective(
30.0f, static_cast<double>(traits->width)/static_cast<double>(traits->height), 1.0f, 10000.0f );
return camera.release();
}
virtual void paintEvent( QPaintEvent* event )
{ frame(); }
protected:
QTimer _timer;
};
int main( int argc, char** argv )
{
QApplication app(argc, argv);
ViewerWidget* viewWidget = new ViewerWidget;
viewWidget->setGeometry( 100, 100, 800, 600 );
viewWidget->show();
return app.exec();
}
#include <QtCore/QTimer>
#include <QtGui/QApplication>
#include <QtGui/QGridLayout>
#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/TrackballManipulator>
#include <osgDB/ReadFile>
#include <osgQt/GraphicsWindowQt>
#include <iostream>
class ViewerWidget : public QWidget, public osgViewer::CompositeViewer
{
public:
ViewerWidget() : QWidget()
{
setThreadingModel(osgViewer::CompositeViewer::SingleThreaded);
QWidget* widget1 = addViewWidget( createCamera(0,0,100,100), osgDB::readNodeFile("cow.osg") );
QWidget* widget2 = addViewWidget( createCamera(0,0,100,100), osgDB::readNodeFile("glider.osg") );
QWidget* widget3 = addViewWidget( createCamera(0,0,100,100), osgDB::readNodeFile("axes.osg") );
QWidget* widget4 = addViewWidget( createCamera(0,0,100,100), osgDB::readNodeFile("fountain.osg") );
QWidget* popupWidget = addViewWidget( createCamera(900,100,320,240,"Popup window",true),
osgDB::readNodeFile("dumptruck.osg") );
popupWidget->show();
QGridLayout* grid = new QGridLayout;
grid->addWidget( widget1, 0, 0 );
grid->addWidget( widget2, 0, 1 );
grid->addWidget( widget3, 1, 0 );
grid->addWidget( widget4, 1, 1 );
setLayout( grid );
connect( &_timer, SIGNAL(timeout()), this, SLOT(update()) );
_timer.start( 10 );
}
QWidget* addViewWidget( osg::Camera* camera, osg::Node* scene )
{
osgViewer::View* view = new osgViewer::View;
view->setCamera( camera );
addView( view );
view->setSceneData( scene );
view->addEventHandler( new osgViewer::StatsHandler );
view->setCameraManipulator( new osgGA::TrackballManipulator );
osgQt::GraphicsWindowQt* gw = dynamic_cast<osgQt::GraphicsWindowQt*>( camera->getGraphicsContext() );
return gw ? gw->getGraphWidget() : NULL;
}
osg::Camera* createCamera( int x, int y, int w, int h, const std::string& name="", bool windowDecoration=false )
{
osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
traits->windowName = name;
traits->windowDecoration = windowDecoration;
traits->x = x;
traits->y = y;
traits->width = w;
traits->height = h;
traits->doubleBuffer = true;
traits->alpha = ds->getMinimumNumAlphaBits();
traits->stencil = ds->getMinimumNumStencilBits();
traits->sampleBuffers = ds->getMultiSamples();
traits->samples = ds->getNumMultiSamples();
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setGraphicsContext( new osgQt::GraphicsWindowQt(traits.get()) );
camera->setClearColor( osg::Vec4(0.2, 0.2, 0.6, 1.0) );
camera->setViewport( new osg::Viewport(0, 0, traits->width, traits->height) );
camera->setProjectionMatrixAsPerspective(
30.0f, static_cast<double>(traits->width)/static_cast<double>(traits->height), 1.0f, 10000.0f );
return camera.release();
}
virtual void paintEvent( QPaintEvent* event )
{ frame(); }
protected:
QTimer _timer;
};
int main( int argc, char** argv )
{
QApplication app(argc, argv);
ViewerWidget* viewWidget = new ViewerWidget;
viewWidget->setGeometry( 100, 100, 800, 600 );
viewWidget->show();
return app.exec();
}

View File

@ -20,7 +20,7 @@ extern "C" {
#define OPENSCENEGRAPH_MAJOR_VERSION 2
#define OPENSCENEGRAPH_MINOR_VERSION 9
#define OPENSCENEGRAPH_PATCH_VERSION 12
#define OPENSCENEGRAPH_PATCH_VERSION 13
#define OPENSCENEGRAPH_SOVERSION 73
/* Convenience macro that can be used to decide whether a feature is present or not i.e.

View File

@ -1,127 +1,127 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library 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. See the
* OpenSceneGraph Public License for more details.
*/
const char* builtinMimeTypeExtMappings[] =
{
"application/dxf","dxf",
"application/gnutar","tgz",
"application/pdf","pdf",
"application/plain","text",
"application/postscript","ps",
"application/x-bzip","bz",
"application/x-bzip2","bz2",
"application/x-compressed","zip",
"application/x-gzip","gz",
"application/x-inventor","iv",
"application/x-javascript","js",
"application/xml","xml",
"application/x-tar","tar",
"application/x-vrml","wrl",
"application/x-world","wrl",
"application/x-zip-compressed","zip",
"application/zip","zip",
"drawing/x-dwf(old)","dwf",
"image/bmp","bmp",
"image/cmu-raster","ras",
"image/fif","fif",
"image/florian","flo",
"image/g3fax","g3",
"image/gif","gif",
"image/ief","ief",
"image/jpeg","jpg",
"image/jutvision","jut",
"image/naplps","nap",
"image/naplps","naplps",
"image/pict","pic",
"image/pjpeg","jpg",
"image/png","png",
"image/tiff","tif",
"image/vasa","mcf",
"image/vnd.dwg","dxf",
"image/vnd.fpx","fpx",
"image/vnd.net-fpx","fpx",
"image/vnd.rn-realflash","rf",
"image/vnd.rn-realpix","rp",
"image/vnd.wap.wbmp","wbmp",
"image/vnd.xiff","xif",
"image/xbm","xbm",
"image/x-cmu-raster","ras",
"image/x-dwg","dxf",
"image/x-icon","ico",
"image/x-jg","art",
"image/x-jps","jps",
"image/x-niff","nif",
"image/x-pcx","pcx",
"image/x-pict","pct",
"image/xpm","xpm",
"image/x-portable-anymap","pnm",
"image/x-portable-bitmap","pbm",
"image/x-portable-graymap","pgm",
"image/x-portable-greymap","pgm",
"image/x-portable-pixmap","ppm",
"image/x-quicktime","qif",
"image/x-rgb","rgb",
"image/x-tiff","tif",
"image/x-windows-bmp","bmp",
"image/x-xbitmap","xbm",
"image/x-xbm","xbm",
"image/x-xpixmap","xpm",
"image/x-xwd","xwd",
"image/x-xwindowdump","xwd",
"i-world/i-vrml","ivr",
"model/iges","igs",
"model/vnd.dwf","dwf",
"model/vrml","wrl",
"model/x-pov","pov",
"multipart/x-gzip","gzip",
"multipart/x-ustar","ustar",
"multipart/x-zip","zip",
"video/animaflex","afl",
"video/avi","avi",
"video/avs-video","avs",
"video/dl","dl",
"video/fli","fli",
"video/gl","gl",
"video/mpeg","mpg",
"video/msvideo","avi",
"video/quicktime","qt",
"video/vdo","vdo",
"video/vivo","viv",
"video/vnd.rn-realvideo","rv",
"video/vnd.vivo","viv",
"video/vosaic","vos",
"video/x-amt-demorun","xdr",
"video/x-amt-showrun","xsr",
"video/x-atomic3d-feature","fmf",
"video/x-dl","dl",
"video/x-dv","dv",
"video/x-fli","fli",
"video/x-gl","gl",
"video/x-isvideo","isu",
"video/x-motion-jpeg","mjpg",
"video/x-mpeg","mp3",
"video/x-mpeq2a","mp2",
"video/x-ms-asf","asf",
"video/x-ms-asf-plugin","asx",
"video/x-msvideo","avi",
"video/x-qtc","qtc",
"video/x-scm","scm",
"video/x-sgi-movie","movie",
"windows/metafile","wmf",
"xgl/drawing","xgz",
"xgl/movie","xmz",
"x-world/x-3dmf","3dm",
"x-world/x-svr","svr",
"x-world/x-vrml","wrl",
"x-world/x-vrt","vrt",
"" // end of list
};
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library 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. See the
* OpenSceneGraph Public License for more details.
*/
const char* builtinMimeTypeExtMappings[] =
{
"application/dxf","dxf",
"application/gnutar","tgz",
"application/pdf","pdf",
"application/plain","text",
"application/postscript","ps",
"application/x-bzip","bz",
"application/x-bzip2","bz2",
"application/x-compressed","zip",
"application/x-gzip","gz",
"application/x-inventor","iv",
"application/x-javascript","js",
"application/xml","xml",
"application/x-tar","tar",
"application/x-vrml","wrl",
"application/x-world","wrl",
"application/x-zip-compressed","zip",
"application/zip","zip",
"drawing/x-dwf(old)","dwf",
"image/bmp","bmp",
"image/cmu-raster","ras",
"image/fif","fif",
"image/florian","flo",
"image/g3fax","g3",
"image/gif","gif",
"image/ief","ief",
"image/jpeg","jpg",
"image/jutvision","jut",
"image/naplps","nap",
"image/naplps","naplps",
"image/pict","pic",
"image/pjpeg","jpg",
"image/png","png",
"image/tiff","tif",
"image/vasa","mcf",
"image/vnd.dwg","dxf",
"image/vnd.fpx","fpx",
"image/vnd.net-fpx","fpx",
"image/vnd.rn-realflash","rf",
"image/vnd.rn-realpix","rp",
"image/vnd.wap.wbmp","wbmp",
"image/vnd.xiff","xif",
"image/xbm","xbm",
"image/x-cmu-raster","ras",
"image/x-dwg","dxf",
"image/x-icon","ico",
"image/x-jg","art",
"image/x-jps","jps",
"image/x-niff","nif",
"image/x-pcx","pcx",
"image/x-pict","pct",
"image/xpm","xpm",
"image/x-portable-anymap","pnm",
"image/x-portable-bitmap","pbm",
"image/x-portable-graymap","pgm",
"image/x-portable-greymap","pgm",
"image/x-portable-pixmap","ppm",
"image/x-quicktime","qif",
"image/x-rgb","rgb",
"image/x-tiff","tif",
"image/x-windows-bmp","bmp",
"image/x-xbitmap","xbm",
"image/x-xbm","xbm",
"image/x-xpixmap","xpm",
"image/x-xwd","xwd",
"image/x-xwindowdump","xwd",
"i-world/i-vrml","ivr",
"model/iges","igs",
"model/vnd.dwf","dwf",
"model/vrml","wrl",
"model/x-pov","pov",
"multipart/x-gzip","gzip",
"multipart/x-ustar","ustar",
"multipart/x-zip","zip",
"video/animaflex","afl",
"video/avi","avi",
"video/avs-video","avs",
"video/dl","dl",
"video/fli","fli",
"video/gl","gl",
"video/mpeg","mpg",
"video/msvideo","avi",
"video/quicktime","qt",
"video/vdo","vdo",
"video/vivo","viv",
"video/vnd.rn-realvideo","rv",
"video/vnd.vivo","viv",
"video/vosaic","vos",
"video/x-amt-demorun","xdr",
"video/x-amt-showrun","xsr",
"video/x-atomic3d-feature","fmf",
"video/x-dl","dl",
"video/x-dv","dv",
"video/x-fli","fli",
"video/x-gl","gl",
"video/x-isvideo","isu",
"video/x-motion-jpeg","mjpg",
"video/x-mpeg","mp3",
"video/x-mpeq2a","mp2",
"video/x-ms-asf","asf",
"video/x-ms-asf-plugin","asx",
"video/x-msvideo","avi",
"video/x-qtc","qtc",
"video/x-scm","scm",
"video/x-sgi-movie","movie",
"windows/metafile","wmf",
"xgl/drawing","xgz",
"xgl/movie","xmz",
"x-world/x-3dmf","3dm",
"x-world/x-svr","svr",
"x-world/x-vrml","wrl",
"x-world/x-vrt","vrt",
"" // end of list
};