Я пытаюсь установить подкласс NSOpenGLView
необычным способом, и у меня возникают некоторые проблемы.По сути, я пишу программу для моделирования биоинженерии для моего доктора наук, и мне нужно иметь возможность скомпилировать ее как под MacOSX, так и под Unix (моя машина - Mac, но сим в конечном итоге будет работать на более мощной машине Unix).Поскольку в течение следующих полутора лет код будет становиться все длиннее и длиннее, я бы не стал отслеживать две совершенно разные версии программы.Итак, я надеюсь, что смогу скомпилировать код ObjectiveC под Unix, избегая ObjectiveC-2.0 и оставляя интерфейс необязательным (он будет в основном там, чтобы выполнять настройку перед долгим моделированием и отслеживать вещи для коротких во время разработки).
Текущая версия хорошо работает без интерфейса - симуляция выполняется правильно, и программа способна рендерить кадры OpenGL и экспортировать их в графические и видеофайлы без каких-либо проблем.Так как я сейчас добавляю интерфейс (прямо сейчас просто окно с подклассом NSOpenGLView и кнопкой «Пуск») поверх этого (чтобы я мог запустить код с альтернативной версией main () без него), яприходится «соединять» OpenGL странным образом, поскольку код рисования находится не в функции drawRect или даже в любом месте подкласса, а вместо этого в «базовой» программе.
Что я имеюна данный момент сделано следующее:
Основная программа (использующая объект "Lattice") выполняет все симуляции и рендеринг, корректно выводя изображения и видео в файлы. Это также содержит NSOpenGLContext
и вызывает [renderContext flushBuffer];
Подкласс NSOpenGLView с именем PottsView содержит экземпляр решетки, который инициализируется вместе с представлением, подобным этому:
- (id)initWithFrame:(NSRect)frame {
if(![super initWithFrame:frame])
return nil;
// code
frameSize.width = WIN_WIDTH;
frameSize.height = WIN_HEIGHT;
[self setFrameSize:frameSize];
init_genrand64(time(0));
latt = [Lattice alloc];
if (SEED_TYPE) {
[latt initWithRandomSites];
} else {
[latt initWithEllipse];
}
[[latt context] makeCurrentContext];
return self;
}
drawRect()
пусто.
- PottsController - это объект, созданный в InterfaceBuilder, который соединяет кнопку запуска с представлением.ton просто указывает решетке выполнить несколько шагов.
Теперь нажатие кнопки start приводит к корректной работе симуляции (т. е. выводу в файлы и на терминал), но PottsView работает неправильно.Он остается белым, но если я cmd + tab частей, если он меняется на разделы визуализированного кадра.То же самое, если я нажимаю Expose (F3).
Я пробовал несколько комбинаций сброса, setNeedsDisplay
и т. Д., Но, честно говоря, я потерян.До апреля этого года я не занимался программированием, и, поскольку, насколько я могу судить, это совершенно обратный способ использования NSOpenGLView. У меня нет идей.Я надеюсь, что кто-то может подсказать, как я могу заставить работать текущую настройку или как полностью переписать программу (при этом оставляя интерфейс необязательным).