2010-01-30 8 views
5

Ich möchte ein OpenGL-Fenster (um Tastatureingaben/Mausereignisse anzuzeigen und zu greifen) in MacOSX öffnen.Cocoa OpenGL-Fenster in reinem C?

Ich möchte nicht Glut verwenden (da es verlangt, dass es der root-Thread sein wird).

Ich will nicht Objective C.

ist lernen, da ohnehin die OpenGL-Schnittstelle in reinem C zugreifen?

Danke!

+0

Warum wurde das abgelehnt? Es gibt einige gültige Antworten. Das einzige Problem, das ich hier sehe, ist, dass er es vom ersten Thread an nicht tun will. IMHO, das ist eine vernünftige Einschränkung für eine Bibliothek, die darauf abzielt, eine Anwendung portierbar zu machen. –

Antwort

4

Ich endete mit GLFW.

Zuerst funktionieren Tastaturereignisse nicht; aber sie haben ein Beispielskript zum Erstellen eines Bündels. Danach makellos.

3

SDL? http://www.libsdl.org/
Simple DirectMedia Layer ist eine plattformübergreifende Multimediabibliothek, die einen einfachen Zugang zu Audio, Tastatur, Maus, Joystick, 3D-Hardware über OpenGL und 2D-Video-Framebuffer bietet. Es wird von MPEG-Wiedergabesoftware, Emulatoren und vielen beliebten Spielen verwendet, einschließlich des preisgekrönten Linux-Ports "Civilization: Call To Power".

SDL unterstützt Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX und QNX. Der Code enthält Unterstützung für AmigaOS, Dreamcast, Atari, AIX, OSF/Tru64, RISCOS, SymbianOS und OS/2, aber diese werden nicht offiziell unterstützt.

4

Wenn Sie Ereignisse greifen auf OS X wollen, gibt es ein paar Optionen:

  • SDL. Sehr empfehlenswert, C, nicht sehr flexibel. Sie müssen es entweder auf Systemen installieren, auf denen Sie es verwenden, oder das Framework in Ihr App-Paket aufnehmen.
  • Kakao. Verwenden Sie dies, wenn Sie mehr Flexibilität benötigen.
  • Kohlenstoff. Ich empfehle nicht, diese API zu verwenden, aber es ist reines C.

Ziel C ist eine sehr kleine Reihe von Ergänzungen zu reinem C-Code. Sie müssen nicht viel davon lernen, um mit der Cocoa API zu kommen. Es ist nicht das Biest, das C++ ist. Wenn du C kennst, kannst du in ein paar Stunden alles lernen, was du brauchst. Der beste Beispielcode und die beste Dokumentation im Web sind für Cocoa, nicht für Carbon. Es gibt OpenGL-Beispielcode in Hülle und Fülle, der Cocoa verwendet, im gesamten Web und auf Apples Dev-Website.

Die Ereignisbehandlung muss jedoch unabhängig von der von Ihnen verwendeten API im Hauptthread ausgeführt werden. Das ist der Zweck des Hauptthreads, nein? Sie können natürlich OpenGL-Aufrufe in jedem beliebigen Thread ausführen.

1

Die einzige reine C-native API unter Mac OS X ist Carbon. Der Großteil davon ist jedoch veraltet und Sie können keine 64-Bit-Apps mit der Carbon API schreiben.

Die andere API ist Kakao - was auf C basiert. Das Cocoa-Framework selbst beschränkt Anwendungen auf einen einzelnen Hauptthread, wobei das Nachrichtenereignis für diesen Thread bereitgestellt wird.

Schwemme ist oben auf Cocoa umgesetzt, und so, auf dem Mac erbt, dass restriktions- und so auch andere Rahmen Sie oben auf dieser wickeln können wählen: Qt, SDL, glut usw.

Auch wenn die Hauptthreadbeschränkung besteht, müssen Sie immer noch ein Framework wählen, das Ihnen das mühsame Lernen von Ziel-c erspart.

Schwemme - wenn alles, was Sie tun, ist ein Fenster zu erstellen, und Verarbeitung von Eingabe, ist eine einfache Wahl. SDL und Qt bieten auch eine C++ -basierte Nachrichtenverarbeitung auf MacOSX zusammen mit einem soliden direkten Support-Zugriff auf OpenGL-APIs zum Rendern.

-4

Ich will nicht Objective C.

Dann über das Schreiben von Code vergessen lernen, auf OS X.

+2

Das ist kaum wahr, wie andere darauf hingewiesen haben. –

+1

Interessanterweise wurde (oder wurde) Ziel C als ein C-Pre-Compiler und eine Bibliothek von C-Funktionen implementiert. Dies bedeutet, dass es völlig möglich ist, objektive c-Objekte in reinem C++ oder c zu erstellen, aufzurufen und zu implementieren, ohne eine Zeile mit dem Ziel c zu schreiben. –

2

Auch wenn Sie GLUT mag nicht laufen. Wie klingt das?

Sie können sich die GLUT-Quellen von here ansehen und ihre Hauptschleife ändern. Sie finden es in der GLUTApplication.m Datei. So sieht es aus. Denken Sie, Sie sollten die notwendigen GLUT-Aufrufe leicht extrahieren, um sie in Ihre eigene Hauptschleife zu bringen.

- (void)run 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSRunLoop *runLoop = [[NSRunLoop currentRunLoop] retain]; 

    [self finishLaunching]; 
    __glutEnableVisibilityUpdates(); 
    _running = 1; 

    while([self isRunning]) { 
     __glutProcessWorkEvents(); 

     /* Process all pending user events and fire all timers which have 
     a fire date before or equal to the current system time. */ 
     if(__glutIdleFunc || __glutHasWorkEvents()) { 
     /* IMPORTANT: This case may _never_ block. */ 
     [self _runMainLoopUntilDate: _distantPast autoreleasePool: &pool]; 
     if(__glutIdleFunc) { 
      __glutIdleFuncCalled = YES; 
      __glutIdleFunc(); 
     } 
     } else { 
     /* IMPORTANT: We may either block until the next timer in line is 
         due, or until a new user event arives from the 
         WindowServer. */ 
     NSDate *limitDate = [runLoop limitDateForMode: NSDefaultRunLoopMode]; 

     [self _runMainLoopUntilDate: limitDate autoreleasePool: &pool]; 
     } 

     [pool drain]; 
     pool = [[NSAutoreleasePool alloc] init]; 
    } 
    [runLoop release]; 
    [pool drain]; 
}