Какао OpenGL окно в чистом C? - PullRequest
       31

Какао OpenGL окно в чистом C?

7 голосов
/ 31 января 2010

Я хочу открыть окно OpenGL (для отображения и захвата нажатий клавиш / событий мыши) в MacOSX.

Я не хочу использовать Glut (поскольку он требует наличия корневого потока).

Я не хочу изучать Цель C.

Есть ли в любом случае доступ к API OpenGL в чистом C?

Спасибо!

Ответы [ 7 ]

4 голосов
/ 31 января 2010

Я использовал GLFW.

Сначала не работают события клавиатуры; но у них есть пример сценария для сборки пакета. После этого безупречно.

4 голосов
/ 31 января 2010

Если вы хотите получать события в OS X, есть несколько вариантов:

  • SDL. Настоятельно рекомендуется, C, не очень гибкий. Вам нужно будет либо установить его в системах, где вы его используете, либо включить фреймворк в комплект вашего приложения.
  • Какао. Используйте это, если вам нужно больше гибкости.
  • Carbon. Я не рекомендую использовать этот API, но он чистый C.

Objective C - это очень маленький набор дополнений к чистому C-коду. Вам не нужно многому учиться, чтобы использовать API-интерфейс Cocoa. Это совсем не зверь, который является C ++. Если вы знаете C, вы можете выучить все, что вам нужно, за пару часов. Все лучшие примеры кода и документации в Интернете предназначены для Какао, а не для Carbon. Существует множество примеров кода OpenGL, использующих Какао, по всей сети и на веб-сайте Apple.

Однако вся обработка событий должна идти в главном потоке независимо от используемого вами API. Это цель основного потока, нет? Разумеется, вы можете выполнять вызовы OpenGL в любой интересующей вас теме.

3 голосов
/ 31 января 2010

SDL? http://www.libsdl.org/
Simple DirectMedia Layer - это кроссплатформенная мультимедийная библиотека, разработанная для обеспечения низкоуровневого доступа к аудио, клавиатуре, мыши, джойстику, 3D-оборудованию через OpenGL и 2D-видео кадровый буфер. Он используется программным обеспечением воспроизведения MPEG, эмуляторами и многими популярными играми, в том числе отмеченным наградами портом Linux «Civilization: Call To Power».

SDL поддерживает Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD / OS, Solaris, IRIX и QNX. Код содержит поддержку AmigaOS, Dreamcast, Atari, AIX, OSF / Tru64, RISC OS, SymbianOS и OS / 2, но они официально не поддерживаются.

2 голосов
/ 31 января 2010

Даже если вам не нравится GLUT. Как это звучит?

Вы можете взглянуть на получение источников GLUT из здесь и изменить его основной цикл. Вы можете найти его в файле GLUTApplication.m. Вот как это выглядит. Думаю, вы должны легко извлечь необходимые вызовы GLUT, чтобы поместить их в свой основной цикл.

- (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];
}
1 голос
/ 09 августа 2018

Репо делает именно то, что вы просили.

https://github.com/jimon/osx_app_in_plain_c

Чтобы существенно упростить то, что здесь происходит, вы можете думать о Objective-C как о серии макросов препроцессора, которые переводятся в обычный C. Смотрите ответ здесь .

Поиск базовых версий C простого синтаксиса Objective-C - это метод в игре. Где ...

[NSApplication sharedApplication];

становится ...

id nsapp = objc_getClass("NSApplication");
id sel_sharedApp = sel_registerName("sharedApplication");
id ret = objc_msgSend(nsapp, sel_sharedApp);

Поиск в Apple документации по таким функциям, как objc_msgSend(), - это путь, чтобы узнать больше. Это очень глубокая кроличья нора.

1 голос
/ 31 января 2010

Единственный чистый API на C для Mac OS X - это Carbon. Однако большинство из них устарели, и вы не можете писать 64-битные приложения, используя Carbon API.

Другой API - это какао, которое основано на цели C. Платформа Cocoa сама ограничивает приложения наличием одного основного потока с отправкой события сообщения в этом потоке.

glut реализован поверх Cocoa, и поэтому на Mac наследует это ограничение - как и любая другая инфраструктура, которую вы можете выбрать для этого: Qt, SDL, glut и т. Д.

Даже если ограничение основного потока остается в силе, вам все равно нужно выбрать структуру, которая избавит вас от хлопот по учебной цели-c.

перенасыщение - если все, что вы делаете, это создание окна и обработка ввода, это простой выбор. SDL и Qt также обеспечивают обработку сообщений на основе c ++ в MacOSX вместе с надежной поддержкой прямого доступа к API OpenGL для рендеринга.

0 голосов
/ 31 января 2010

Я не хочу изучать Цель C.

Тогда забудьте о написании кода для запуска на OS X.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...