2015-07-17 00:40:46 +00:00
|
|
|
//
|
|
|
|
// OpenGLView.m
|
|
|
|
// ElectrEm
|
|
|
|
//
|
|
|
|
// Created by Thomas Harte on 16/07/2015.
|
|
|
|
// Copyright © 2015 Thomas Harte. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
#import "OpenGLView.h"
|
|
|
|
@import CoreVideo;
|
2015-07-24 00:45:07 +00:00
|
|
|
#import <OpenGL/gl.h>
|
2015-07-17 00:40:46 +00:00
|
|
|
|
|
|
|
@implementation CSOpenGLView {
|
|
|
|
CVDisplayLinkRef displayLink;
|
|
|
|
}
|
|
|
|
|
2015-07-17 01:16:21 +00:00
|
|
|
- (void)prepareOpenGL
|
2015-07-17 00:40:46 +00:00
|
|
|
{
|
2015-07-17 01:16:21 +00:00
|
|
|
// Synchronize buffer swaps with vertical refresh rate
|
|
|
|
GLint swapInt = 1;
|
|
|
|
[[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval];
|
2015-07-17 00:40:46 +00:00
|
|
|
|
2015-07-17 01:16:21 +00:00
|
|
|
// Create a display link capable of being used with all active displays
|
|
|
|
CVDisplayLinkCreateWithActiveCGDisplays(&displayLink);
|
|
|
|
|
|
|
|
// Set the renderer output callback function
|
2015-07-24 00:45:07 +00:00
|
|
|
CVDisplayLinkSetOutputCallback(displayLink, DisplayLinkCallback, (__bridge void * __nullable)(self));
|
2015-07-17 01:16:21 +00:00
|
|
|
|
|
|
|
// Set the display link for the current renderer
|
|
|
|
CGLContextObj cglContext = [[self openGLContext] CGLContextObj];
|
|
|
|
CGLPixelFormatObj cglPixelFormat = [[self pixelFormat] CGLPixelFormatObj];
|
|
|
|
CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(displayLink, cglContext, cglPixelFormat);
|
|
|
|
|
|
|
|
// Activate the display link
|
|
|
|
CVDisplayLinkStart(displayLink);
|
|
|
|
}
|
2015-07-17 00:40:46 +00:00
|
|
|
|
2015-07-24 00:45:07 +00:00
|
|
|
static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* displayLinkContext)
|
2015-07-17 01:16:21 +00:00
|
|
|
{
|
2015-07-17 02:14:40 +00:00
|
|
|
CSOpenGLView *view = (__bridge CSOpenGLView *)displayLinkContext;
|
|
|
|
[view.delegate openGLView:view didUpdateToTime:*now];
|
2015-07-17 01:16:21 +00:00
|
|
|
return kCVReturnSuccess;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)dealloc
|
|
|
|
{
|
|
|
|
// Release the display link
|
|
|
|
CVDisplayLinkRelease(displayLink);
|
2015-07-17 00:40:46 +00:00
|
|
|
}
|
|
|
|
|
2015-07-24 00:45:07 +00:00
|
|
|
- (void)drawRect:(NSRect)dirtyRect
|
|
|
|
{
|
|
|
|
[self.openGLContext makeCurrentContext];
|
|
|
|
|
|
|
|
CGSize viewSize = [self convertSize:self.bounds.size toView:self];
|
|
|
|
glViewport((GLint)0, (GLint)0, (GLsizei)viewSize.width, (GLsizei)viewSize.height);
|
|
|
|
[self.delegate openGLViewDrawView:self];
|
|
|
|
|
|
|
|
glSwapAPPLE();
|
|
|
|
}
|
|
|
|
|
2015-07-17 00:40:46 +00:00
|
|
|
@end
|