Окно Cocoa OpenGL в чистом C?

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

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

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

Там должен так или иначе получить доступ к API OpenGL в чистом C?

Спасибо!

7
задан anon 30 January 2010 в 22:12
поделиться

6 ответов

Существует два способа. Оба требуют создания пользователя и базы данных.

По умолчанию psql подключается к базе данных с тем же именем, что и пользователь. Таким образом, существует соглашение, согласно которому «база данных пользователя» . И нет причин нарушать это соглашение, если пользователю нужна только одна база данных. В качестве примера базы данных будет использоваться база данных mydatabase .

  1. Используя createuser и createdb , можно указать имя базы данных,

     $ sudo -u postgres createuser -s $ USER
    $ createdb база данных mydatabase
    $ psql -d база данных mydatabase
    

    Вероятно, следует полностью исключить это и вместо этого оставить имя пользователя во всех командах по умолчанию.

     $ sudo -u postgres createuser -s $ USER
    $ createdb
    $ psql
    
  2. Использование команд администрирования SQL и подключение с паролем через TCP

     $ sudo -u postgres psql postgres
    

    И затем в оболочке psql

     CREATE ROLE myuser LOGIN PASSWORD 'mypass';
    CREATE DATABASE mydatabase WITH OWNER = myuser;
    

    Затем можно войти в систему,

     $ psql -h localhost -d mydatabase -U myuser -p < порт >
    

    Если порт неизвестен, его всегда можно получить, запустив в качестве пользователя postgres следующий порт

     SHOW;
    

    Или

     $ grep «port = »/etc/postgresql/*/main/postgresql.conf
    

Sidenote: postgres пользователь

Я предлагаю НЕ изменить postgres пользователя.

  1. Обычно он заблокирован от OS. Никто не должен «входить» в операционную систему как postgres . У вас должен быть root для проверки подлинности как postgres .
  2. Обычно он не защищен паролем и делегируется операционной системе хоста. Это хорошая вещь . Обычно это означает, что для входа в систему как postgres , который является эквивалентом PostgreSQL для SA SQL Server, необходимо иметь доступ на запись к базовым файлам данных. И это означает, что обычно ты можешь разрушить хаос в любом случае.
  3. Сохраняя этот параметр отключенным, вы устраняете риск атаки грубой силы через именованного суперпользователя. Сокрытие и затемнение имени суперпользователя имеет свои преимущества.
-121--985723-

Значение можно умножить на 10

EDIT

Отображаемые метки можно изменить следующим образом:

Hashtable labelTable = new Hashtable();
labelTable.put( new Integer( 0 ), new JLabel("0.0") );
labelTable.put( new Integer( 5 ), new JLabel("0.5") );
labelTable.put( new Integer( 10 ), new JLabel("1.0") );
framesPerSecond.setLabelTable( labelTable );
-121--2695303-

В итоге я использовал GLFW.

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

4
ответ дан 6 December 2019 в 23:05
поделиться

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

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

3
ответ дан 6 December 2019 в 23:05
поделиться

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

Другое API - какао, которое на основе объективных. Сама каркаса какао ограничивает приложения для того, чтобы иметь один основной нить с отправкой событий сообщений на этом потоке.

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

даже Если основное ограничение потоков стоит, вам все еще нужно выбрать рамку, которая сэкономит вам хлопот объекта обучения-C.

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

1
ответ дан 6 December 2019 в 23:05
поделиться

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

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

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

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

4
ответ дан 6 December 2019 в 23:05
поделиться

Я не хочу изучать объективную C.

, затем забудьте о записи кода для запуска на ОС X.

-4
ответ дан 6 December 2019 в 23:05
поделиться

Даже если вы не любите блюду. Как этот звук?

Вы смогли взглянуть на захват источников блюдов из здесь и измените его основной цикл. Вы можете найти его в файле GlutaPlication.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];
}
2
ответ дан 6 December 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: