2010-01-30 21 views
5

Quiero abrir una ventana OpenGL (para mostrar y capturar las pulsaciones de teclas/eventos del mouse) en MacOSX.Ventana Cocoa OpenGL en puro C?

No quiero utilizar Glut (ya que exige que sea el hilo raíz).

no quiero aprender Objective C.

¿Hay alguna forma para acceder a la API de OpenGL en C puro?

Gracias!

+0

¿Por qué ha bajado este valor? Hay algunas respuestas válidas. El único problema que veo aquí es que no quiere hacerlo desde el primer hilo. En mi humilde opinión, esa es una restricción razonable para una biblioteca que tiene como objetivo hacer una aplicación portátil. –

Respuesta

4

Terminé usando GLFW.

Al principio, los eventos del teclado no funcionan; pero tienen un script de muestra para construir un paquete. Después de eso, sin defectos.

3

SDL? http://www.libsdl.org/
Simple DirectMedia Layer es una biblioteca multimedia multiplataforma diseñada para proporcionar acceso de bajo nivel a hardware, teclado, mouse, joystick, hardware 3D mediante OpenGL y framebuffer de video 2D. Es utilizado por el software de reproducción MPEG, emuladores y muchos juegos populares, incluido el galardonado puerto Linux de "Civilization: Call To Power".

SDL es compatible con Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX y QNX. El código contiene soporte para AmigaOS, Dreamcast, Atari, AIX, OSF/Tru64, sistema operativo RISC, SymbianOS y OS/2, pero estos no son compatibles oficialmente.

4

Si quiere agarrar eventos en OS X, hay un par de opciones:

  • SDL. Altamente recomendado, C, no muy flexible. Tendrá que instalarlo en los sistemas donde lo usa o incluir el marco en su paquete de aplicaciones.
  • Cacao. Use esto si necesita más flexibilidad.
  • Carbono. No recomiendo usar esta API, pero es pura C.

El objetivo C es un conjunto muy pequeño de adiciones al código C puro. No es necesario que aprenda mucho sobre esto para usar la API Cocoa. No es en absoluto la bestia que es C++. Si conoce C, puede aprender todo lo que necesita en un par de horas. Todo el mejor código de muestra y documentación en la web es para Cocoa, no para Carbono. Hay un código de muestra OpenGL en abundancia que usa Cocoa, en toda la web y en el sitio web de desarrollo de Apple.

Sin embargo, todo el manejo de eventos debe ir en el hilo principal, independientemente de la API que utilice. Ese es el propósito del hilo principal, ¿no? Puede hacer llamadas OpenGL en cualquier tema que desee, por supuesto.

1

La única API C pura y nativa en Mac OS X es Carbon. Sin embargo, la mayoría está en desuso y no puede escribir aplicaciones de 64 bits con la API de carbono.

La otra API es Cocoa, que tiene como objetivo C. El propio marco Cocoa restringe las aplicaciones a tener un único hilo principal con el envío de eventos de mensajes en ese hilo.

exceso se implementa en la parte superior de cacao, y así, en el Mac, que hereda Restricciones de y lo mismo ocurre con cualquier otro marco que podría elegir para envolver encima de eso: Qt, SDL, saturación, etc.

Incluso si la restricción del hilo principal permanece, aún necesita elegir un marco que le ahorrará la molestia de aprender objetivo-c.

saturación: si todo lo que hace es crear una ventana y procesar la entrada, es una opción simple. SDL y Qt también proporcionan procesamiento de mensajes basado en C++ en MacOSX junto con un acceso directo de soporte sólido a OpenGL apis para renderizar.

-4

no quiero aprender Objective C.

luego olvidarse de escribir código para funcionar en OS X.

+2

Eso no es cierto, como otros han señalado. –

+1

Curiosamente, el objetivo C se implementa (o se implementó) como un pre compilador C y una biblioteca de funciones C. Esto significa que es completamente posible crear, invocar e implementar objetos objetivos c en C++ puros, c sin escribir una línea de objetivo c. –

2

A pesar de que no le gusta GLUT. ¿Como suena esto?

Puede echarle un vistazo a las fuentes GLUT desde here y modificar su bucle principal. Puede encontrarlo en el archivo GLUTApplication.m. Así es como se ve. Creo que debería extraer fácilmente las llamadas GLUT necesarias para ubicarlas en su propio ciclo principal.

- (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]; 
} 
Cuestiones relacionadas