macOS Entry Point#

/*!***************************************************************************
\File         OpenGLESHelloAPI_macOS.mm
\Title        OpenGL ES 2.0 HelloAPI Tutorial
\Author       PowerVR by Imagination, Developer Technology Team
\Copyright    Copyright (c) Imagination Technologies Limited.
\brief  Basic Tutorial that shows step-by-step how to initialise OpenGL ES 2.0, use it for drawing a triangle and terminate it.
              Entry Point: main
*****************************************************************************/

#import <AppKit/NSApplication.h>
#import <AppKit/NSWindow.h>
#import <AppKit/NSScreen.h>
#import <AppKit/NSView.h>

#include "OpenGLESHelloAPI.h"

unsigned int Kfps (120.0);


/*!***************************************************************************
 Class AppController
 ****************************************************************************/
@class AppController;

@interface AppController : NSObject <NSApplicationDelegate>
{
@private
   NSTimer*         m_timer;       // Timer for rendering OpenGL content
   NSWindow*        m_window;      // Window

   OpenGLESAPI* helloAPI;
}
@end

@implementation AppController

/*!***************************************************************************
\param[in]         notification
\brief Called when the application has finished launching.
*****************************************************************************/
- (void) applicationDidFinishLaunching:(NSNotification *)notification
{

Initialise EGL and OpenGL ES variables.

helloAPI = new OpenGLESAPI();

Create the window.

NSRect frame = NSMakeRect(0,0,helloAPI._surfaceData.width, helloAPI._surfaceData.height);
m_window = [[NSWindow alloc] initWithContentRect:frame styleMask:NSMiniaturizableWindowMask | NSTitledWindowMask | NSClosableWindowMask
                                        backing:NSBackingStoreBuffered defer:NO];



if(!m_window)
{
    NSLog(@"Failed to allocate the window.");
    [self terminateApp];
}

[m_window setTitle:@"OpenGLESHelloAPI"];

Create the view.

helloAPI->_surfaceData.window = [[NSView alloc] initWithFrame:frame];

Add the created view to the window.

[m_window setContentView:(NSView*)helloAPI->_surfaceData.window];
[m_window makeKeyAndOrderFront:nil];

Add an observer so when the window is closed, the app is terminated.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(terminateApp) name:NSWindowWillCloseNotification
                                           object:m_window];

if(!helloAPI->initializeGLES() || !helloAPI.initializeEGL())
{
    [self terminateApp];
}

Setup a timer to redraw the view at a regular interval.

    m_timer = [NSTimer scheduledTimerWithTimeInterval:(1.0 / Kfps) target:self selector:@selector(render) userInfo:nil repeats:YES];
}

/*!***************************************************************************
\brief   Called when the app is about to terminate.
*****************************************************************************/
- (void) applicationWillTerminate:(NSNotification *)notification
{

Release the timer.

    [m_timer invalidate];

    helloAPI->deInitialize();
   helloAPI->releaseEGLState();

    [m_window release];
    m_window = nil;
}

/*!***************************************************************************
\brief   Attempts to immediately terminate the application.
*****************************************************************************/
- (void) terminateApp
{
    [NSApp terminate:nil];
}

- (void) render
{
    if(!helloAPI->drawFrame() || !helloAPI->swapEGLBuffers())
    {
        [self terminateApp];
    }
}
@end

/*!***************************************************************************
\param[in]         argc           Number of arguments passed to the application, ignored.
\param[in]         argv           Command line strings passed to the application, ignored.
\return        Result code to send to the Operating System
\brief Main function of the program, executes other functions.
*****************************************************************************/
int main(int argc, char **argv){   return NSApplicationMain(argc, (const char **)argv);  }