Commit 8eb41670 authored by ebaum's avatar ebaum

[ADD #50,#51,#52]

- added basic graphics engine
- added basic class stubs for Kernel, Modules
parent 19a975fc
......@@ -36,7 +36,7 @@ FIND_PACKAGE( OpenGL REQUIRED )
### CxxTest ###
FIND_PACKAGE( CxxTest QUIET )
MARK_AS_ADVANCED ( CXXTEST_PERL_TESTGEN_EXECUTABLE )
FIND_PACKAGE( OpenSceneGraph REQUIRED osgUtil osgDB osgViewer)
# Platform dependencies
IF( OPENWALNUT_PLATFORM MATCHES ${OPENWALNUT_PLATFORM_WINDOWS} )
......@@ -83,6 +83,8 @@ SET( CMAKE_CXX_FLAGS_STATIC "-O3" CACHE STRING "" FORCE )
MARK_AS_ADVANCED( CMAKE_CXX_FLAGS_STATIC )
SET( CMAKE_CXX_FLAGS_RELWITHDEBINFO "-g -DDEBUG -O2" CACHE STRING "" FORCE )
INCLUDE_DIRECTORIES( ${OPENSCENEGRAPH_INCLUDE_DIRS} )
IF ( NOT CMAKE_BUILD_TYPE STREQUAL "Static" )
ADD_SUBDIRECTORY( math )
ADD_SUBDIRECTORY( dataHandler )
......
# Package dependencies:
FIND_PACKAGE( GLEW REQUIRED )
FIND_PACKAGE( GLEW REQUIRED ) # required anymore?
ADD_SUBDIRECTORY( exceptions )
# Includes:
INCLUDE_DIRECTORIES( ${GLEW_INCLUDE_PATH} )
FILE(GLOB GE_SRC "*.cpp")
FILE( GLOB GE_EXCEPTIONS_SRC "exceptions/*.cpp" )
FILE( GLOB GE_SRC "*.cpp" )
ADD_LIBRARY( ge SHARED ${GE_SRC} ${GE_EXCEPTIONS_SRC} )
TARGET_LINK_LIBRARIES( ge "common" ${OPENGL_gl_LIBRARY} ${GLEW_LIBRARY} ${OPENSCENEGRAPH_LIBRARIES} )
ADD_LIBRARY( ge SHARED ${GE_SRC} )
TARGET_LINK_LIBRARIES( ge ${OPENGL_gl_LIBRARY} ${GLEW_LIBRARY} )
//---------------------------------------------------------------------------
//
// Project: OpenWalnut
//
// Copyright 2009 SomeCopyrightowner
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut 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
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
//
//---------------------------------------------------------------------------
#include <iostream>
#include "WGEGraphicsWindow.h"
#include "exceptions/WGEInitFailed.h"
WGEGraphicsWindow::WGEGraphicsWindow( boost::shared_ptr<WindowData> wdata,
int x,
int y,
int width,
int height )
{
m_WindowData = wdata;
// initialize context
try
{
createContext( x, y, width, height );
}
catch( ... )
{
// use our own exceptions
throw WGEInitFailed( "Initialization of OpenGL graphics context failed." );
}
}
WGEGraphicsWindow::~WGEGraphicsWindow()
{
// cleanup
}
boost::shared_ptr<osgViewer::GraphicsWindow> WGEGraphicsWindow::getGraphicsWindow()
{
return m_GraphicsWindow;
}
void WGEGraphicsWindow::createContext( int x, int y, int width, int height )
{
// Create traits for graphics contest request
osg::DisplaySettings* ds = osg::DisplaySettings::instance();
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
// ensure correct $DISPLAY variable
traits->readDISPLAY();
if ( traits->displayNum < 0 )
{
traits->displayNum = 0;
}
// set a lot of values
traits->windowName = "OpenWalnut";
traits->screenNum = 0; // XXX is this a good idea?
traits->x = x;
traits->y = y;
traits->width = width;
traits->height = height;
traits->alpha = ds->getMinimumNumAlphaBits();
traits->stencil = ds->getMinimumNumStencilBits();
// traits->windowDecoration = false;
traits->doubleBuffer = true;
traits->sharedContext = 0;
traits->sampleBuffers = ds->getMultiSamples();
traits->samples = ds->getNumMultiSamples();
traits->inheritedWindowData = m_WindowData.get();
// Stereo
// TODO(ebaum): test whether it works
if ( ds->getStereo() )
{
switch( ds->getStereoMode() )
{
case( osg::DisplaySettings::QUAD_BUFFER ):
traits->quadBufferStereo = true;
break;
case( osg::DisplaySettings::VERTICAL_INTERLACE ):
case( osg::DisplaySettings::CHECKERBOARD ):
case( osg::DisplaySettings::HORIZONTAL_INTERLACE ):
traits->stencil = 8;
break;
default:
break;
}
}
// finally create graphics context and window
m_GraphicsContext = osg::GraphicsContext::createGraphicsContext( traits.get() );
m_GraphicsWindow = boost::shared_ptr<osgViewer::GraphicsWindow>(
static_cast<osgViewer::GraphicsWindow*>( m_GraphicsContext ) );
// get around dearanged traits on X11 (MTCompositeViewer only)
traits->x = x;
traits->y = x;
traits->width = width;
traits->height = height;
}
void WGEGraphicsWindow::resize( int width, int height )
{
m_GraphicsWindow->getEventQueue()->windowResize( 0, 0, width, height );
m_GraphicsWindow->resized( 0, 0, width, height );
}
void WGEGraphicsWindow::close()
{
m_GraphicsWindow->getEventQueue()->closeWindow();
}
void WGEGraphicsWindow::keyEvent( KeyEvents eventType, int key )
{
switch( eventType )
{
case KEYPRESS:
m_GraphicsWindow->getEventQueue()->keyPress(
static_cast<osgGA::GUIEventAdapter::KeySymbol>( key )
);
break;
case KEYRELEASE:
m_GraphicsWindow->getEventQueue()->keyRelease(
static_cast<osgGA::GUIEventAdapter::KeySymbol>( key )
);
break;
}
}
void WGEGraphicsWindow::mouseEvent( MouseEvents eventType, int x, int y, int button )
{
switch( eventType )
{
case MOUSEPRESS:
m_GraphicsWindow->getEventQueue()->mouseButtonPress(
x, y, button
);
break;
case MOUSERELEASE:
m_GraphicsWindow->getEventQueue()->mouseButtonRelease(
x, y, button
);
break;
case MOUSEDOUBLECLICK:
m_GraphicsWindow->getEventQueue()->mouseDoubleButtonPress(
x, y, button
);
break;
case MOUSEMOVE:
m_GraphicsWindow->getEventQueue()->mouseMotion( x, y );
break;
}
}
//---------------------------------------------------------------------------
//
// Project: OpenWalnut
//
// Copyright 2009 SomeCopyrightowner
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut 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
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
//
//---------------------------------------------------------------------------
#ifndef WGEGRAPHICSWINDOW_H
#define WGEGRAPHICSWINDOW_H
#if defined( WIN32 ) && !defined( __CYGWIN__ )
#include <osgViewer/api/Win32/GraphicsWindowWin32>
typedef HWND WindowHandle;
typedef osgViewer::GraphicsWindowWin32::WindowData WindowData;
#elif defined( __APPLE__ ) // Assume using Carbon on Mac.
#include <osgViewer/api/Carbon/GraphicsWindowCarbon>
typedef WindowRef WindowHandle;
typedef osgViewer::GraphicsWindowCarbon::WindowData WindowData;
#else // all other unix
#include <osgViewer/api/X11/GraphicsWindowX11>
typedef Window WindowHandle;
typedef osgViewer::GraphicsWindowX11::WindowData WindowData;
#endif
#include <boost/shared_ptr.hpp>
/**
* \par Description:
* Class managing a single graphics context and OSG GraphicsWindow.
*/
class WGEGraphicsWindow
{
public:
/**
* \par Description
* Default constructor.
*
* \param wdata the WindowData instance for the widget to use as render widget
* \param x X coordinate of widget where to create the context.
* \param y Y coordinate of widget where to create the context.
* \param width Width of the widget.
* \param height Height of the Widget.
* \exception WGEInitFailed thrown if initialization of graphics context or graphics window has failed.
*/
WGEGraphicsWindow( boost::shared_ptr<WindowData> wdata, int x, int y, int width, int height );
/**
* \par Description
* Destructor.
*/
virtual ~WGEGraphicsWindow();
/**
* \par Description
* Getter for m_GraphicsWindow.
*
* \return the OSG GraphicsWindow instance.
*/
boost::shared_ptr<osgViewer::GraphicsWindow> getGraphicsWindow();
/**
* \par Description
* Event types for the keyEvent() handler.
*/
enum KeyEvents
{
KEYPRESS, KEYRELEASE
};
/**
* \par Description
* Mouse event types for the mouseEvent() handler.
*/
enum MouseEvents
{
MOUSEPRESS, MOUSERELEASE, MOUSEDOUBLECLICK, MOUSEMOVE
};
/**
* \par Description
* Updates size information.
*
* \param width new width.
* \param height new height.
*/
virtual void resize( int width, int height );
/**
* \par Description
* Initiates a close event for this viewer. It destroys the graphics context and invalidates the viewer.
* This should be called whenever a QT Widget closes to also free its OSG Viewer resources.
*/
virtual void close();
/**
* \par Description
* Handles key events (if forwarded to this Viewer instance).
*
* \param key the key code.
* \param eventType the type of event.
*/
virtual void keyEvent( KeyEvents eventType, int key );
/**
* \par Description
* Handles mouse events forwarded from widget.
*
* \param eventType the event type.
* \param x x coordinate of event.
* \param y y coordinate of event.
* \param button mouse button.
*/
virtual void mouseEvent( MouseEvents eventType, int x, int y, int button );
protected:
/**
* \par Description
* Creates a new OpenGL context in the calling thread. Needs to be called before any other OpenGL operation.
*
* \param x X coordinate of widget where to create the context.
* \param y Y coordinate of widget where to create the context.
* \param width Width of the widget.
* \param height Height of the Widget.
*/
void createContext( int x, int y, int width, int height );
/**
* \par Description
* OpenSceneGraph render window.
*/
boost::shared_ptr<osgViewer::GraphicsWindow> m_GraphicsWindow;
/**
* \par Description
* OpenSceneGraph render context. This is required to be a "normal" pointer since using shared_ptr causes
* the code not to work (unknown reason for now). But since we do not offer a getter for it -> no prob.
*/
osg::GraphicsContext* m_GraphicsContext;
/**
* \par Description
* Widget window data.
*/
boost::shared_ptr<WindowData> m_WindowData;
private:
};
#endif // WGEGRAPHICSWINDOW_H
//---------------------------------------------------------------------------
//
// Project: OpenWalnut
//
// Copyright 2009 SomeCopyrightowner
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut 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
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
//
//---------------------------------------------------------------------------
#include "WGEScene.h"
WGEScene::WGEScene()
{
// initialize members
}
WGEScene::~WGEScene()
{
// cleanup
}
//---------------------------------------------------------------------------
//
// Project: OpenWalnut
//
// Copyright 2009 SomeCopyrightowner
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut 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
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
//
//---------------------------------------------------------------------------
#ifndef WGESCENE_H
#define WGESCENE_H
/**
* \par Description:
* Class for managing the OpenSceneGraph root node. It can handle new nodes, removing nodes and so on.
*/
class WGEScene
{
public:
/**
* \par Description
* Default constructor.
*/
WGEScene();
/**
* \par Description
* Destructor.
*/
virtual ~WGEScene();
protected:
private:
};
#endif // WGESCENE_H
//---------------------------------------------------------------------------
//
// Project: OpenWalnut
//
// Copyright 2009 SomeCopyrightowner
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut 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
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
//
//---------------------------------------------------------------------------
#include <iostream>
#include <osg/ShapeDrawable>
#include <osg/Geode>
#include <osgGA/TrackballManipulator>
#include <osgGA/FlightManipulator>
#include <osgGA/DriveManipulator>
#include <osgGA/UFOManipulator>
#include <osgGA/KeySwitchMatrixManipulator>
#include <osgGA/StateSetManipulator>
#include <osgGA/AnimationPathManipulator>
#include <osgGA/TerrainManipulator>
#include <osgViewer/ViewerEventHandlers>
#include <osgDB/ReadFile>
#include "WGEViewer.h"
#include "exceptions/WGEInitFailed.h"
WGEViewer::WGEViewer( boost::shared_ptr<WindowData> wdata, int x, int y, int width, int height ):
WGEGraphicsWindow( wdata, x, y, width, height )
{
try
{
// initialize OSG render window
m_Viewer = boost::shared_ptr<osgViewer::CompositeViewer>( new osgViewer::CompositeViewer() );
m_Viewer->setThreadingModel( osgViewer::Viewer::DrawThreadPerContext );
// m_Viewer->setThreadingModel( osgViewer::Viewer::SingleThreaded );
m_View = boost::shared_ptr<osgViewer::Viewer>( new osgViewer::Viewer() );
m_View->getCamera()->setGraphicsContext( m_GraphicsContext );
m_View->getCamera()->setProjectionMatrixAsPerspective( 30.0f, 1.333, 1.0, 1000.0 );
m_View->getCamera()->setViewport( new osg::Viewport( 0, 0, 10, 10 ) );
// add the stats handler
m_View->addEventHandler( new osgViewer::StatsHandler );
// camera manipulator
m_Manipulator = new osgGA::TrackballManipulator();
m_View->setCameraManipulator( m_Manipulator );
// finally add view
// there is the possibility to use ONE single composite viewer instance for every view, but
// currently this possibility is not used.
m_Viewer->addView( m_View.get() );
// load the sample scene.
osg::Geode* sceneDataGeode = new osg::Geode();
// 20 units into the screen
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Box( osg::Vec3( -6, 5, -20 ), 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Sphere( osg::Vec3( -3, 5, -20 ), 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Cone( osg::Vec3( 0, 5, -20 ), 1.0, 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Cylinder( osg::Vec3( 3, 5, -20 ), 1.0, 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Capsule( osg::Vec3( 6, 5, -20 ), 1.0, 1.0 ) ) );
// 25 units into the screen
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Box( osg::Vec3( -6, 0, -25 ), 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Sphere( osg::Vec3( -3, 0, -25 ), 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Cone( osg::Vec3( 0, 0, -25 ), 1.0, 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Cylinder( osg::Vec3( 3, 0, -25 ), 1.0, 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Capsule( osg::Vec3( 6, 0, -25 ), 1.0, 1.0 ) ) );
// 30 units into the screen
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Box( osg::Vec3( -6, -5, -30 ), 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Sphere( osg::Vec3( -3, -5, -30 ), 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Cone( osg::Vec3( 0, -5, -30 ), 1.0, 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Cylinder( osg::Vec3( 3, -5, -30 ), 1.0, 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Capsule( osg::Vec3( 6, -5, -30 ), 1.0, 1.0 ) ) );
// 35 units into the screen
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Box( osg::Vec3( -6, -10, -35 ), 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Sphere( osg::Vec3( -3, -10, -35 ), 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Cone( osg::Vec3( 0, -10, -35 ), 1.0, 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Cylinder( osg::Vec3( 3, -10, -35 ), 1.0, 1.0 ) ) );
sceneDataGeode->addDrawable(
new osg::ShapeDrawable( new osg::Capsule( osg::Vec3( 6, -10, -35 ), 1.0, 1.0 ) ) );
m_View->setSceneData( sceneDataGeode );
}
catch( ... )
{
throw WGEInitFailed( "Initialization of WGEViewer failed" );
}
}
WGEViewer::~WGEViewer()
{
// cleanup
}
boost::shared_ptr<osgViewer::CompositeViewer> WGEViewer::getViewer()
{
return m_Viewer;
}
void WGEViewer::setCameraManipulator( osgGA::MatrixManipulator* manipulator )
{
m_Manipulator = manipulator;
m_View->setCameraManipulator( m_Manipulator );
}
osgGA::MatrixManipulator* WGEViewer::getCameraManipulator()
{
return m_Manipulator;
}
void WGEViewer::paint()
{
m_Viewer->frame();
}
void WGEViewer::resize( int width, int height )
{
WGEGraphicsWindow::resize( width, height );
// also update the camera
m_View->getCamera()->setProjectionMatrixAsPerspective( 30.0f, 1.333, 1.0, 1000.0 );
m_View->getCamera()->setViewport( new osg::Viewport( 0, 0, width, height ) );
}