CelestiaAppCore.mm
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:19k
源码类别:

OpenGL

开发平台:

Visual C++

  1. //
  2. //  CelestiaCore.mm
  3. //  celestia
  4. //
  5. //  Created by Bob Ippolito on Wed Jun 05 2002.
  6. //  Copyright (C) 2007, Celestia Development Team
  7. //
  8. #import "CelestiaAppCore.h"
  9. #import "CelestiaAppCore_PrivateAPI.h"
  10. #import "NSString_ObjCPlusPlus.h"
  11. #import "CelestiaDestination_PrivateAPI.h"
  12. #import "CelestiaFavorite_PrivateAPI.h"
  13. #import "CelestiaSelection_PrivateAPI.h"
  14. #import "CelestiaSimulation_PrivateAPI.h"
  15. #import "CelestiaRenderer_PrivateAPI.h"
  16. #import "Astro.h"
  17. #import "CelestiaController.h"
  18. #include "celestiacore.h"
  19. #include "render.h"
  20. #include "qtcapture.h"
  21. #import <Carbon/Carbon.h>
  22. class MacSettingsWatcher : public CelestiaWatcher, public RendererWatcher
  23. {
  24. private:
  25.     CelestiaSettings *settings;
  26.     CelestiaCore *appCore;
  27. public:
  28.     MacSettingsWatcher(CelestiaAppCore *_appCore,
  29.                        CelestiaSettings* _settings) :
  30.         CelestiaWatcher(*[_appCore appCore]), settings(_settings), appCore([_appCore appCore])
  31.     {
  32.         appCore->getRenderer()->addWatcher(this);
  33.     };
  34.     
  35.     virtual ~MacSettingsWatcher()
  36.     {
  37.         appCore->getRenderer()->removeWatcher(this);
  38.     };
  39.     void notifyChange(CelestiaCore *, int flags)
  40.     {
  41.         if ( 0 != (flags & (
  42. //              CelestiaCore::LabelFlagsChanged
  43. //            | CelestiaCore::RenderFlagsChanged
  44.             CelestiaCore::VerbosityLevelChanged
  45.             | CelestiaCore::TimeZoneChanged
  46. //            | CelestiaCore::AmbientLightChanged
  47.             | CelestiaCore::FaintestChanged
  48.             )) )
  49.         {
  50.             [settings validateItems];
  51.         }
  52.     };
  53.     virtual void notifyRenderSettingsChanged(const Renderer *renderer)
  54.     {
  55.         [settings validateItems];
  56.     };
  57. };
  58. class MacOSXAlerter : public CelestiaCore::Alerter
  59. {
  60. public:
  61.     MacOSXAlerter() {};
  62.     virtual ~MacOSXAlerter() {};
  63.     virtual void fatalError(const std::string& msg)
  64.     {
  65.         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  66.         NSLog(@"alerter fatalError!");
  67.         [[CelestiaController shared] fatalError: [NSString stringWithStdString: msg] ];
  68.         NSLog(@"alerter fatalError finis");
  69.         [pool release];
  70.     }
  71. };
  72. class MacOSXSplashProgressNotifier : public ProgressNotifier
  73. {
  74. public:
  75.     MacOSXSplashProgressNotifier() {};
  76.     virtual ~MacOSXSplashProgressNotifier() {};
  77.     virtual void update(const string& msg)
  78.     {
  79.         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  80.         [[[CelestiaController shared] valueForKey: @"splashWindowController"] performSelector: @selector(setStatusText:) withObject: [NSString stringWithStdString: msg]];
  81.         [pool release];
  82.     };
  83. };
  84. class MacOSXCursorHandler : public CelestiaCore::CursorHandler
  85. {
  86. public:
  87.     MacOSXCursorHandler() : cursor(kThemeArrowCursor),
  88.         shape(CelestiaCore::ArrowCursor) {};
  89.     virtual ~MacOSXCursorHandler() {};
  90.     virtual void setCursorShape(CelestiaCore::CursorShape aShape)
  91.     {
  92.         ThemeCursor changedCursor;
  93.         switch (aShape)
  94.         {
  95.         case CelestiaCore::SizeVerCursor:
  96.             changedCursor =
  97. #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
  98.             kThemeResizeUpDownCursor
  99. #else
  100.             kThemeClosedHandCursor
  101. #endif
  102.             ;
  103.             break;
  104.         case CelestiaCore::SizeHorCursor:
  105.             changedCursor =
  106. #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
  107.             kThemeResizeLeftRightCursor
  108. #else
  109.             kThemeClosedHandCursor
  110. #endif
  111.             ;
  112.             break;
  113.         default:
  114.             changedCursor = kThemeArrowCursor;
  115.             break;                
  116.         }
  117.         if (changedCursor != cursor)
  118.         {
  119.             SetThemeCursor(changedCursor);
  120.             cursor = changedCursor;
  121.             shape = aShape;
  122.         }
  123.     };
  124.     virtual CelestiaCore::CursorShape getCursorShape() const
  125.     {
  126.         return shape;
  127.     };
  128.     
  129. private:
  130.     ThemeCursor cursor;
  131.     CelestiaCore::CursorShape shape;
  132. };
  133. CelestiaAppCore *_sharedCelestiaAppCore;
  134. CelestiaCore *appCore;
  135. @implementation CelestiaAppCore
  136. -(CelestiaCore*) appCore
  137.     {return appCore; };
  138. -(int)toCelestiaKey:(NSEvent*)theEvent {
  139.     int celestiaKey = 0;
  140.     unichar key = [[theEvent characters] characterAtIndex: 0];
  141.    if ( ([theEvent modifierFlags] & NSNumericPadKeyMask) && (key >= '0') && (key <= '9'))
  142.     switch(key)
  143.     {
  144.         case '0':
  145.             celestiaKey = CelestiaCore::Key_NumPad0;
  146.             break;
  147.         case '1':
  148.             celestiaKey = CelestiaCore::Key_NumPad1;
  149.             break;
  150.         case '2':
  151.             celestiaKey = CelestiaCore::Key_NumPad2;
  152.             break;
  153.         case '3':
  154.             celestiaKey = CelestiaCore::Key_NumPad3;
  155.             break;
  156.         case '4':
  157.             celestiaKey = CelestiaCore::Key_NumPad4;
  158.             break;
  159.         case '5':
  160.             celestiaKey = CelestiaCore::Key_NumPad5;
  161.             break;
  162.         case '6':
  163.             celestiaKey = CelestiaCore::Key_NumPad6;
  164.             break;
  165.         case '7':
  166.             celestiaKey = CelestiaCore::Key_NumPad7;
  167.             break;
  168.         case '8':
  169.             celestiaKey = CelestiaCore::Key_NumPad8;
  170.             break;
  171.         case '9':
  172.             celestiaKey = CelestiaCore::Key_NumPad9;
  173.             break;
  174.         default: break;
  175.         }
  176.         else switch(key)
  177.         {
  178.         case NSF1FunctionKey:
  179.             celestiaKey = CelestiaCore::Key_F1;
  180.             break;
  181.         case NSF2FunctionKey:
  182.             celestiaKey = CelestiaCore::Key_F2;
  183.             break;
  184.         case NSF3FunctionKey:
  185.             celestiaKey = CelestiaCore::Key_F3;
  186.             break;
  187.         case NSF4FunctionKey:
  188.             celestiaKey = CelestiaCore::Key_F4;
  189.             break;
  190.         case NSF5FunctionKey:
  191.             celestiaKey = CelestiaCore::Key_F5;
  192.             break;
  193.         case NSF6FunctionKey:
  194.             celestiaKey = CelestiaCore::Key_F6;
  195.             break;
  196.         case NSF7FunctionKey:
  197.             celestiaKey = CelestiaCore::Key_F7;
  198.             break;
  199.         case NSF8FunctionKey:
  200.             celestiaKey = CelestiaCore::Key_F8;
  201.             break;
  202.         case NSF9FunctionKey:
  203.             celestiaKey = CelestiaCore::Key_F9;
  204.             break;
  205.         case NSF10FunctionKey:
  206.             celestiaKey = CelestiaCore::Key_F10;
  207.             break;
  208.         case NSF11FunctionKey:
  209.             celestiaKey = CelestiaCore::Key_F11;
  210.             break;
  211.         case NSF12FunctionKey:
  212.             celestiaKey = CelestiaCore::Key_F12;
  213.             break;
  214.         case NSUpArrowFunctionKey:
  215.             celestiaKey = CelestiaCore::Key_Up;
  216.             break;
  217.         case NSDownArrowFunctionKey:
  218.             celestiaKey = CelestiaCore::Key_Down;
  219.             break;
  220.         case NSLeftArrowFunctionKey:
  221.             celestiaKey = CelestiaCore::Key_Left;
  222.             break;
  223.         case NSRightArrowFunctionKey:
  224.             celestiaKey = CelestiaCore::Key_Right;
  225.             break;
  226.         case NSPageUpFunctionKey:
  227.             celestiaKey = CelestiaCore::Key_PageUp;
  228.             break;
  229.         case NSPageDownFunctionKey:
  230.             celestiaKey = CelestiaCore::Key_PageDown;
  231.             break;
  232.         case NSHomeFunctionKey:
  233.             celestiaKey = CelestiaCore::Key_Home;
  234.             break;
  235.         case NSEndFunctionKey:
  236.             celestiaKey = CelestiaCore::Key_End;
  237.             break;
  238.         case NSInsertFunctionKey:
  239.             celestiaKey = CelestiaCore::Key_Insert;
  240.             break;
  241.         default:
  242.             if ((key < 128) && (key > 33))
  243.             {
  244.                 celestiaKey = (int) (key & 0x00FF);
  245.             }
  246.             break;
  247.     }
  248.     return celestiaKey;
  249. }
  250. -(int)toCelestiaModifiers:(unsigned int)modifiers buttons:(unsigned int)buttons {
  251.     int cModifiers = 0;
  252.     if (modifiers & NSCommandKeyMask)
  253.         cModifiers |= CelestiaCore::ControlKey;
  254.     if (modifiers & NSControlKeyMask)
  255.         cModifiers |= CelestiaCore::ControlKey;
  256.     if (modifiers & NSShiftKeyMask)
  257.         cModifiers |= CelestiaCore::ShiftKey;
  258.     if (buttons & 1)
  259.         cModifiers |= CelestiaCore::LeftButton;
  260.     if (buttons & 2)
  261.         cModifiers |= CelestiaCore::MiddleButton;
  262.     if (buttons & 4)
  263.         cModifiers |= CelestiaCore::RightButton;
  264.     return cModifiers;
  265. }
  266. +(void)initialize
  267. {
  268.     _sharedCelestiaAppCore = nil;
  269.     appCore = NULL;
  270. }
  271. +(CelestiaAppCore *)sharedAppCore
  272. {
  273.     if (_sharedCelestiaAppCore != nil) return _sharedCelestiaAppCore;
  274.     _sharedCelestiaAppCore = [[CelestiaAppCore alloc] init];
  275.     return _sharedCelestiaAppCore;
  276. }
  277.     
  278. -(CelestiaAppCore *)init
  279. {
  280.     if (_sharedCelestiaAppCore != nil) {
  281.         [[super init] release];
  282.         return _sharedCelestiaAppCore;
  283.     }
  284.     self = [super init];
  285.     appCore = NULL;
  286.     _destinations = nil;
  287.     return self;
  288. }
  289. -(void)archive
  290. {
  291.     //NSLog(@"[CelestiaAppCore archive]");
  292.     [[CelestiaFavorites sharedFavorites] archive];
  293.     [[self renderer] archive];
  294. }
  295. - (void)dealloc
  296. {
  297.     if (_destinations != nil) {
  298.         [_destinations release];
  299.         _destinations = nil;
  300.     }
  301.     if (appCore != NULL) {
  302.         // appCore doesn't own the custom alerter and cursor
  303.         // handler for some reason so we assume responsibility
  304.         // for cleanup
  305.         if (appCore->getAlerter())
  306.             delete appCore->getAlerter();
  307.         if (appCore->getCursorHandler())
  308.             delete appCore->getCursorHandler();
  309.         delete appCore;
  310.         appCore = NULL;
  311.     }
  312.     _sharedCelestiaAppCore = nil;
  313.     [super dealloc];
  314. }
  315. -(BOOL)initSimulation
  316. {
  317.     BOOL result = NO;
  318.     appCore = new CelestiaCore();
  319.     NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
  320.     NSString *confFileSetting;
  321.     std::string confFile;
  322.     NSArray *existingResourceDirsSetting;
  323.     NSArray *extrasDirsSetting;
  324.     std::vector<std::string> extrasDirs;
  325.     NSString *extrasDir = nil;
  326.     MacOSXSplashProgressNotifier progressNotifier;
  327.     if ((confFileSetting = [prefs stringForKey:@"conf"]))
  328.     {
  329.         confFile = [confFileSetting stdString];
  330.     }
  331.     if ((existingResourceDirsSetting = [prefs stringArrayForKey:@"existingResourceDirs"]))
  332.     {
  333.         NSFileManager *fm = [NSFileManager defaultManager];
  334.         BOOL isFolder = NO;
  335.         NSEnumerator *resouceDirEnum = [existingResourceDirsSetting objectEnumerator];
  336.         NSString *resourceDir = nil;
  337.         NSString *existingConfFile = nil;
  338.         while ((resourceDir = [resouceDirEnum nextObject]))
  339.         {
  340.             existingConfFile = [resourceDir stringByAppendingPathComponent:@"celestia.cfg"];
  341.             CelestiaConfig *config = ReadCelestiaConfig([existingConfFile stdString], NULL);
  342.             if (config)
  343.             {
  344.                 for (vector<string>::const_iterator iter = config->extrasDirs.begin();
  345.                      iter != config->extrasDirs.end(); iter++)
  346.                 {
  347.                     if (*iter != "")
  348.                     {
  349.                         extrasDir = [NSString stringWithStdString: (*iter)];
  350.                         if (([fm fileExistsAtPath: extrasDir = [extrasDir stringByStandardizingPath] isDirectory: &isFolder] && isFolder) ||
  351.                             [fm fileExistsAtPath: extrasDir = [resourceDir stringByAppendingPathComponent:extrasDir] isDirectory: &isFolder] && isFolder)
  352.                         {
  353.                             extrasDirs.push_back([extrasDir stdString]);
  354.                         }
  355.                     }
  356.                 }
  357.                 delete config;
  358.             }
  359.             else
  360.             {
  361.                 if ([fm fileExistsAtPath: extrasDir = [resourceDir stringByAppendingPathComponent: @"extras"] isDirectory: &isFolder] && isFolder)
  362.                     extrasDirs.push_back([extrasDir stdString]);
  363.             }
  364.         }
  365.     }
  366.     if ((extrasDirsSetting = [prefs stringArrayForKey:@"extrasDirs"]))
  367.     {
  368.         NSEnumerator *iter = [extrasDirsSetting objectEnumerator];
  369.         while ((extrasDir = [iter nextObject]))
  370.             extrasDirs.push_back([extrasDir stdString]);
  371.     }
  372.     appCore->setAlerter(new MacOSXAlerter());
  373.     appCore->setCursorHandler(new MacOSXCursorHandler());
  374.     result = appCore->initSimulation(!confFile.empty() ? &confFile : nil,
  375.                                      &extrasDirs,
  376.                                      &progressNotifier);
  377.     if (result)
  378.     {
  379.         CelestiaSettings *settings = [CelestiaSettings shared];
  380.         new MacSettingsWatcher(self, settings); // adds itself to the appCore
  381.     }
  382.     return result;
  383. }
  384. -(BOOL)initRenderer
  385. {
  386.     return (BOOL)appCore->initRenderer();
  387. }
  388. -(void)start:(NSDate *)date
  389. {
  390.     appCore->start([[Astro julianDate:date] doubleValue]);
  391. }
  392. -(void)charEntered:(char)c withModifiers:(int)modifiers
  393. {
  394. // moved to CelestiaOpenGLView...    if (c == 127) c = 8; 
  395.     appCore->charEntered(c, modifiers);
  396. }
  397. -(void)charEntered:(NSString *)string
  398. {
  399.     appCore->charEntered([string UTF8String]);
  400. }
  401. -(void)keyDown:(int)c
  402. {
  403.     appCore->keyDown(c);
  404. }
  405. -(void)keyUp:(int)c
  406. {
  407.     appCore->keyUp(c);
  408. }
  409. -(void)keyDown:(int)c withModifiers:(int)m
  410. {
  411.     appCore->keyDown(c,m);
  412. }
  413. -(void)keyUp:(int)c withModifiers:(int)m
  414. {
  415.     appCore->keyUp(c,m);
  416. }
  417. -(void)mouseWheel:(float)motion modifiers:(int)modifiers
  418. {
  419.     appCore->mouseWheel(motion, modifiers);
  420. }
  421. -(void)mouseButtonDown:(NSPoint)coord modifiers:(int)modifiers
  422. {
  423.     appCore->mouseButtonDown(coord.x,coord.y,modifiers);
  424. }
  425. -(void)mouseButtonUp:(NSPoint)coord modifiers:(int)modifiers
  426. {
  427.     appCore->mouseButtonUp(coord.x,coord.y,modifiers);
  428. }
  429. -(void)mouseMove:(NSPoint)coord
  430. {
  431.     appCore->mouseMove(coord.x,coord.y);
  432. }
  433. -(void)mouseMove:(NSPoint)delta modifiers:(int)modifiers
  434. {
  435.     appCore->mouseMove(delta.x,delta.y,modifiers);
  436. }
  437. -(void)joystickAxis:(int)axis value:(float)value
  438. {
  439.     appCore->joystickAxis(axis,value);
  440. }
  441. -(void)joystickButton:(int)button state:(BOOL)state
  442. {
  443.     appCore->joystickButton(button,(bool)state);
  444. }
  445. -(void)resize:(NSRect)r
  446. {
  447.     appCore->resize((GLsizei)r.size.width,(GLsizei)r.size.height);
  448. }
  449. -(void)draw
  450. {
  451.     appCore->draw();
  452. }
  453. -(void)tick
  454. {
  455.     appCore->tick();
  456. }
  457. -(CelestiaSimulation *)simulation
  458. {
  459.     return [[[CelestiaSimulation alloc] initWithSimulation:appCore->getSimulation()] autorelease];
  460. }
  461. -(CelestiaRenderer *)renderer
  462. {
  463.     return [[[CelestiaRenderer alloc] initWithRenderer:appCore->getRenderer()] autorelease];
  464. }
  465. -(void)showText:(NSString *)text
  466. {
  467.     appCore->showText([text stdString]);
  468. }
  469. -(void)activateFavorite:(id)fav
  470. {
  471.     if ([fav isKindOfClass:[NSMenuItem class]])
  472.         fav = [(NSMenuItem*)fav representedObject];
  473.     appCore->activateFavorite(*[(CelestiaFavorite*)fav favorite]);
  474. }
  475. -(CelestiaFavorites *)favorites
  476. {
  477.     return [CelestiaFavorites sharedFavorites];
  478. }
  479. -(CelestiaDestinations *)destinations
  480. {
  481.     if (_destinations == nil || [_destinations destinations] != appCore->getDestinations()) {
  482.         if (_destinations != nil)
  483.             [_destinations release];
  484.         _destinations = [[CelestiaDestinations alloc] initWithDestinations:appCore->getDestinations()];
  485.     }
  486.     return _destinations; 
  487. }
  488. -(NSTimeZone *)timeZone
  489. {
  490.     NSTimeZone *bestZone=nil;
  491.     bestZone = [NSTimeZone timeZoneWithAbbreviation:[NSString stringWithStdString:appCore->getTimeZoneName()]];
  492.     if (bestZone == nil) 
  493.       bestZone = [NSTimeZone timeZoneForSecondsFromGMT:appCore->getTimeZoneBias()];
  494.     return bestZone;
  495. }
  496. -(void)setTimeZone:(NSTimeZone *)timeZone withDate:(NSDate *)date
  497. {
  498.     appCore->setTimeZoneBias([timeZone secondsFromGMTForDate:date]);
  499.     appCore->setTimeZoneName([[timeZone abbreviationForDate:date] stdString]);
  500. }
  501. -(int)textEnterMode
  502. {
  503.     return appCore->getTextEnterMode();
  504. }
  505. -(void)cancelScript
  506. {
  507.     appCore->cancelScript();
  508. }
  509. -(int)hudDetail
  510. {
  511.     return appCore->getHudDetail();
  512. }
  513. -(void)setHudDetail:(int)hudDetail
  514. {
  515.     appCore->setHudDetail(hudDetail);
  516. }
  517. -(void)back
  518. {
  519.     appCore->back();
  520. }
  521. -(void)forward
  522. {
  523.     std::vector<Url>::size_type historySize = appCore->getHistory().size();
  524.     if (historySize < 2) return;
  525.     if (appCore->getHistoryCurrent() > historySize-2) return;
  526.     appCore->forward();
  527. }
  528. -(NSString *) currentURL
  529. {
  530.     CelestiaState appState;
  531.     appState.captureState(appCore);
  532.     Url currentUrl(appState, Url::CurrentVersion);
  533.     
  534.     NSString *url = [ NSString stringWithStdString: currentUrl.getAsString() ];
  535.     return url;
  536. }
  537. -(void)goToUrl:(NSString *)url
  538. {
  539.     appCore->goToUrl([url stdString]);
  540. }
  541. -(void)setStartURL:(NSString *)url
  542. {
  543.     appCore->setStartURL([url stdString]);
  544. }
  545. -(unsigned int) getLocationFilter
  546. {
  547.     return appCore->getSimulation()->getActiveObserver()->getLocationFilter();
  548. }
  549. -(void) setLocationFilter: (unsigned int) filter
  550. {
  551.     appCore->getSimulation()->getActiveObserver()->setLocationFilter(filter);
  552. }
  553. -(void)runScript:(NSString *)fileName
  554. {
  555.     appCore->runScript([fileName stdString]);
  556. }
  557. - (void) showInfoURL
  558. {
  559.     Selection sel = appCore->getSimulation()->getSelection();
  560.     string url;
  561.     switch (sel.getType())
  562.     {
  563.     case Selection::Type_Body:
  564.         {
  565.             url = sel.body()->getInfoURL();
  566.             if (url.empty())
  567.             {
  568.                 string name = sel.body()->getName();
  569.                 for (int i = 0; i < (int)name.size(); i++)
  570.                     name[i] = tolower(name[i]);
  571.                 url = string("http://www.nineplanets.org/") + name + ".html";
  572.             }
  573.         }
  574.         break;
  575.     case Selection::Type_Star:
  576.         {
  577.             url = sel.star()->getInfoURL();
  578.             if (url.empty())
  579.             {
  580.                 char name[32];
  581.                 sprintf(name, "HIP%d", sel.star()->getCatalogNumber() & ~0xf0000000);                
  582.                 url = string("http://simbad.u-strasbg.fr/sim-id.pl?protocol=html&Ident=") + name;
  583.             }
  584.         }
  585.         break;
  586.     case Selection::Type_DeepSky:
  587.         url = sel.deepsky()->getInfoURL();
  588.         break;
  589.     case Selection::Type_Location:
  590.         break;
  591.     default:
  592.         break;
  593.     }
  594.     if (!url.empty())
  595.     {
  596.         NSString *unescUrl = [NSString stringWithStdString: url];
  597.         NSString *escUrl =
  598.             (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)unescUrl, NULL, NULL, kCFStringEncodingUTF8);
  599.         if (escUrl)
  600.         {
  601.             if ([escUrl length] > 0)
  602.             {
  603.                 NSURL *theURL = [NSURL URLWithString: escUrl];
  604.                 if (theURL != nil)
  605.                 {
  606.                     if (nil == [theURL scheme])
  607.                         theURL = [NSURL fileURLWithPath: unescUrl];
  608.                     if (theURL)
  609.                         [[NSWorkspace sharedWorkspace] openURL: theURL];
  610.                 }
  611.             }
  612.             [escUrl release];
  613.         }
  614.     }
  615. }
  616. -(unsigned int)aaSamples
  617. {
  618.     return appCore->getConfig()->aaSamples;
  619. }
  620. -(BOOL)glExtensionIgnored:(NSString *)extension
  621. {
  622.     CelestiaConfig *cfg = appCore->getConfig();
  623.     return std::find(cfg->ignoreGLExtensions.begin(), cfg->ignoreGLExtensions.end(), [extension stdString]) != cfg->ignoreGLExtensions.end();
  624. }
  625. -(void)setGLExtensionIgnored:(NSString *)extension
  626. {
  627.     appCore->getConfig()->ignoreGLExtensions.push_back([extension stdString]);
  628. }
  629. - (BOOL) captureMovie: (NSString*) filename width: (int) width height: (int) height
  630.                               frameRate: (float) framerate
  631. {
  632.     MovieCapture* movieCapture = new QTCapture();
  633.     bool success = movieCapture->start([filename stdString], width, height, framerate);
  634.     if (success)
  635.         appCore->initMovieCapture(movieCapture);
  636.     else
  637.         delete movieCapture;
  638.     return success;
  639. }
  640. @end