b523cb15c1
attached you'll find the second part of the IOS-submission. It contains * GraphicsWindowIOS, which supports external and "retina" displays, multisample-buffers (for IOS > 4.0) and multi-touch-events * an ios-specific implementation of the imageio-plugin * an iphone-viewer example * cMake support for creating a xcode-project * an updated ReadMe-file describing the necessary steps to get a working xcode-project-file from CMake Please credit Thomas Hogarth and Stephan Huber for these changes. This brings the ios-support in line with the git-fork on github. It needs some more testing and some more love, the cmake-process is still a little complicated. You'll need a special version of the freetype lib compiled for IOS, there's one bundled in the OpenFrameworks-distribution, which can be used." Notes, from Robert Osfield, modified CMakeLists.txt files so that the IOS specific paths are within IF(APPLE) blocks.
192 lines
5.8 KiB
Plaintext
Executable File
192 lines
5.8 KiB
Plaintext
Executable File
//Created by Thomas Hogarth 2009
|
|
|
|
//
|
|
//This exampe shows how to render osg into an existing windw. Apple recommends apps only have one window on IPhone so this
|
|
// will be your best bet.
|
|
//
|
|
|
|
#import "iphoneViewerAppDelegate.h"
|
|
#include <osgGA/TrackballManipulator>
|
|
#include <osg/ShapeDrawable>
|
|
//inckude the iphone specific windowing stuff
|
|
#include <osgViewer/api/IOS/GraphicsWindowIOS>
|
|
|
|
|
|
#define kAccelerometerFrequency 30.0 // Hz
|
|
#define kFilteringFactor 0.1
|
|
|
|
@implementation iphoneViewerAppDelegate
|
|
|
|
@synthesize _window;
|
|
|
|
|
|
//
|
|
//Called once app has finished launching, create the viewer then realize. Can't call viewer->run as will
|
|
//block the final inialization of the windowing system
|
|
//
|
|
- (void)applicationDidFinishLaunching:(UIApplication *)application {
|
|
|
|
std::string test_string;
|
|
test_string = "huhu";
|
|
|
|
//get the screen size
|
|
CGRect lFrame = [[UIScreen mainScreen] bounds];
|
|
unsigned int w = lFrame.size.width;
|
|
unsigned int h = lFrame.size.height;
|
|
|
|
// create the main window at screen size
|
|
self._window = [[UIWindow alloc] initWithFrame: lFrame];
|
|
|
|
//show window
|
|
[_window makeKeyAndVisible];
|
|
|
|
|
|
//create our graphics context directly so we can pass our own window
|
|
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
|
|
|
// Init the Windata Variable that holds the handle for the Window to display OSG in.
|
|
osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowIOS::WindowData(_window);
|
|
|
|
// Setup the traits parameters
|
|
traits->x = 0;
|
|
traits->y = 0;
|
|
traits->width = w;
|
|
traits->height = h;
|
|
traits->depth = 16; //keep memory down, default is currently 24
|
|
//traits->alpha = 8;
|
|
//traits->stencil = 8;
|
|
traits->windowDecoration = false;
|
|
traits->doubleBuffer = true;
|
|
traits->sharedContext = 0;
|
|
traits->setInheritedWindowPixelFormat = true;
|
|
//traits->windowName = "osgViewer";
|
|
|
|
traits->inheritedWindowData = windata;
|
|
|
|
// Create the Graphics Context
|
|
osg::ref_ptr<osg::GraphicsContext> graphicsContext = osg::GraphicsContext::createGraphicsContext(traits.get());
|
|
|
|
//create the viewer
|
|
_viewer = new osgViewer::Viewer();
|
|
//if the context was created then attach to our viewer
|
|
if(graphicsContext)
|
|
{
|
|
_viewer->getCamera()->setGraphicsContext(graphicsContext);
|
|
_viewer->getCamera()->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));
|
|
}
|
|
|
|
//create scene and attch to viewer
|
|
|
|
//create root
|
|
_root = new osg::MatrixTransform();
|
|
|
|
//load and attach scene model
|
|
osg::ref_ptr<osg::Node> model = (osgDB::readNodeFile("hog.osg"));
|
|
_root->addChild(model);
|
|
|
|
osg::Geode* geode = new osg::Geode();
|
|
osg::ShapeDrawable* drawable = new osg::ShapeDrawable(new osg::Box(osg::Vec3(1,1,1), 1));
|
|
geode->addDrawable(drawable);
|
|
_root->addChild(geode);
|
|
|
|
|
|
//create and attach ortho camera for hud text
|
|
osg::ref_ptr<osg::CameraNode> _hudCamera = new osg::CameraNode;
|
|
|
|
// set the projection matrix
|
|
_hudCamera->setProjectionMatrix(osg::Matrix::ortho2D(0,w,0,h));
|
|
|
|
// set the view matrix
|
|
_hudCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
|
|
_hudCamera->setViewMatrix(osg::Matrix::identity());
|
|
|
|
// only clear the depth buffer
|
|
_hudCamera->setClearMask(GL_DEPTH_BUFFER_BIT);
|
|
|
|
// draw subgraph after main camera view.
|
|
_hudCamera->setRenderOrder(osg::CameraNode::POST_RENDER);
|
|
_root->addChild(_hudCamera.get());
|
|
|
|
//attcg text to hud
|
|
/*osg::ref_ptr<osgText::Text> text = new osgText::Text;
|
|
osg::ref_ptr<osg::Geode> textGeode = new osg::Geode();
|
|
osg::StateSet* stateset = textGeode->getOrCreateStateSet();
|
|
stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
|
|
|
|
textGeode->addDrawable( text );
|
|
_hudCamera->addChild(textGeode.get());
|
|
std::string timesFont("arial.ttf");
|
|
osg::Vec3 position = osg::Vec3(w/2.0f, h/2.0f, 0.0f);
|
|
osg::Vec3 delta(0.0f,-120.0f,0.0f);
|
|
|
|
|
|
text->setFont(timesFont);
|
|
text->setCharacterSize(20.0,1.0);
|
|
text->setColor(osg::Vec4(0.8,0.8,0.8,1.0));
|
|
text->setPosition(position);
|
|
text->setMaximumHeight(480);
|
|
text->setMaximumWidth(320);
|
|
text->setAlignment(osgText::Text::CENTER_CENTER );
|
|
text->setText("It's a Hogs life...");*/
|
|
|
|
|
|
_viewer->setSceneData(_root.get());
|
|
_viewer->setCameraManipulator(new osgGA::TrackballManipulator);
|
|
_viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);//SingleThreaded DrawThreadPerContext
|
|
|
|
//
|
|
//_viewer->realize();
|
|
|
|
osg::setNotifyLevel(osg::DEBUG_FP);
|
|
|
|
[NSTimer scheduledTimerWithTimeInterval:1.0/30.0 target:self selector:@selector(updateScene) userInfo:nil repeats:YES];
|
|
|
|
//Configure and start accelerometer
|
|
[[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / kAccelerometerFrequency)];
|
|
[[UIAccelerometer sharedAccelerometer] setDelegate:self];
|
|
}
|
|
|
|
|
|
//
|
|
//Timer called function to update our scene and render the viewer
|
|
//
|
|
- (void)updateScene {
|
|
_viewer->frame();
|
|
}
|
|
|
|
|
|
- (void)applicationWillResignActive:(UIApplication *)application {
|
|
|
|
}
|
|
|
|
|
|
- (void)applicationDidBecomeActive:(UIApplication *)application {
|
|
|
|
}
|
|
|
|
|
|
-(void)applicationWillTerminate:(UIApplication *)application{
|
|
_root = NULL;
|
|
_viewer = NULL;
|
|
}
|
|
|
|
//
|
|
//Accelorometer
|
|
//
|
|
- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
|
|
{
|
|
//Use a basic low-pass filter to only keep the gravity in the accelerometer values
|
|
accel[0] = acceleration.x * kFilteringFactor + accel[0] * (1.0 - kFilteringFactor);
|
|
accel[1] = acceleration.y * kFilteringFactor + accel[1] * (1.0 - kFilteringFactor);
|
|
accel[2] = acceleration.z * kFilteringFactor + accel[2] * (1.0 - kFilteringFactor);
|
|
}
|
|
|
|
|
|
- (void)dealloc {
|
|
_root = NULL;
|
|
_viewer = NULL;
|
|
[super dealloc];
|
|
}
|
|
|
|
@end
|