|
|
@@ -20,17 +20,11 @@ namespace env { namespace detail {
|
|
|
}}
|
|
|
|
|
|
@implementation GameView {
|
|
|
+ BOOL initialized;
|
|
|
std::shared_ptr<graphics::direct_renderer> renderer;
|
|
|
std::shared_ptr<engine::game_dispatch> game;
|
|
|
};
|
|
|
|
|
|
-- (void)doInit {
|
|
|
- if (renderer) return;
|
|
|
- using namespace graphics;
|
|
|
- renderer = std::make_shared<direct_renderer>(driver::openGL);
|
|
|
- game = std::make_shared<engine::game_dispatch>(renderer);
|
|
|
-}
|
|
|
-
|
|
|
- (id)initWithFrame:(NSRect)aRect {
|
|
|
NSOpenGLPixelFormatAttribute attr[] = {
|
|
|
NSOpenGLPFADoubleBuffer,
|
|
|
@@ -49,13 +43,17 @@ namespace env { namespace detail {
|
|
|
[[self openGLContext] makeCurrentContext];
|
|
|
|
|
|
// rest of your init method ...
|
|
|
- [self doInit];
|
|
|
+ using namespace graphics;
|
|
|
+ renderer = std::make_shared<direct_renderer>(driver::openGL);
|
|
|
+ game = std::make_shared<engine::game_dispatch>(renderer);
|
|
|
+
|
|
|
+ renderer->clear();
|
|
|
+
|
|
|
+ initialized = YES;
|
|
|
return self;
|
|
|
}
|
|
|
|
|
|
- (void)prepareOpenGL {
|
|
|
- [self doInit];
|
|
|
- renderer->clear();
|
|
|
// enable vertical sychronization to refresh rate
|
|
|
const GLint vals = 0x01;
|
|
|
[[self openGLContext] setValues:&vals forParameter:NSOpenGLCPSwapInterval];
|
|
|
@@ -66,12 +64,13 @@ namespace env { namespace detail {
|
|
|
}
|
|
|
|
|
|
- (void)drawRect:(NSRect)dirtyRect {
|
|
|
+ if (!initialized) return;
|
|
|
// glClear(GL_COLOR_BUFFER_BIT);
|
|
|
// glLoadIdentity();
|
|
|
|
|
|
env::detail::resize_screen({{(int)dirtyRect.size.width,
|
|
|
(int)dirtyRect.size.height}});
|
|
|
- game->render();
|
|
|
+ if (initialized) game->render();
|
|
|
// glFlush();
|
|
|
// the correct way to do double buffering on Mac is this:
|
|
|
[[self openGLContext] flushBuffer];
|