Sign in to follow this  
Nytegard

OS X, NSSplitView, Resizing, and drawing issues

Recommended Posts

OK, I've made a few changes but there's massive flickering on the reshape.  If I force a redraw without CVDisplayLinkIsRunning, everything draws correctly, but moving the splitter window and other resizes come to a crawl in speed.

 

 (NSOpenGLPixelFormat *) createPixelFormat
{
    NSOpenGLPixelFormatAttribute attr[] =
    {
        kCGLPFAAccelerated,
        kCGLPFADoubleBuffer,
        kCGLPFAColorSize, 32,
        kCGLPFADepthSize, 16,
        0
    };
    
    return [(NSOpenGLPixelFormat *)[NSOpenGLPixelFormat alloc]
            initWithAttributes:attr];
}


- (id)initWithFrame:(NSRect)frame
{
    NSOpenGLPixelFormat *pixelFormat;
    pixelFormat = [self createPixelFormat];
    self = [super initWithFrame:frame pixelFormat:pixelFormat];
    if (self)
    {
    }
    
    return self;
}

// This is the renderer output callback function
CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* displayLinkContext)
{
    CVReturn result = [(__bridge OpenGLHelper*)displayLinkContext getFrameForTime:outputTime];
    return result;
}

- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime
{
    @autoreleasepool
    {
        if ([self lockFocusIfCanDraw])
        {
            // Add your drawing codes here
            NSRect curFrame = [self frame];
            [self drawFrame: curFrame];
            [self unlockFocus];
        }
    }
    return kCVReturnSuccess;
}

- (void) prepareOpenGL
{
    [super prepareOpenGL];
    
    // Synchronize buffer swaps with vertical refresh rate
    GLint swapInt = 1;
    
    [[self openGLContext] makeCurrentContext];
    
    [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval];
    
    CGLLockContext([[self openGLContext] CGLContextObj]);
    if (nil != m_RTextures)
	{
		[m_RTextures LoadTexture];
	}
    glEnable( GL_TEXTURE_2D );                // Enable texture mapping
    glShadeModel( GL_SMOOTH );                // Enable smooth shading
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LINE_SMOOTH);
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
    CGLUnlockContext([[self openGLContext] CGLContextObj]);
    
    // Create a display link capable of being used with all active displays
    CVDisplayLinkCreateWithActiveCGDisplays(&displayLink);
    
    // Set the renderer output callback function
    CVDisplayLinkSetOutputCallback(displayLink, &MyDisplayLinkCallback, (__bridge void *)(self));
    
    // 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);
}

- (void) reshape
{
	//[super setFrameSize:newSize];
	NSRect rect;
    [super reshape];
    CGLLockContext([[self openGLContext] CGLContextObj]);
    
	[[self openGLContext] makeCurrentContext];
	[[self openGLContext] update];
	rect = [self bounds];
	glViewport(0, 0, rect.size.width, rect.size.height);
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, rect.size.width, rect.size.height, 0, 0, 100.0f);
    
	CGLUnlockContext([[self openGLContext] CGLContextObj]);
    
    // Ignore if the display link is still running
    if (!CVDisplayLinkIsRunning(displayLink))
    {
        [self drawFrame:[self frame]];
    }
}

- (void)drawRect:(NSRect)dirtyRect
{
    // Ignore if the display link is still running
    if (!CVDisplayLinkIsRunning(displayLink))
    {
        [self drawFrame:dirtyRect];
    }
}

- (void) drawFrame:(NSRect)dirtyRect
{
    CGLLockContext([[self openGLContext] CGLContextObj]);
    
    [[self openGLContext] makeCurrentContext];
    
    glClearColor(0, 0, 0, 255);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    for(NSObject<GraphicsProtocol> *GraphicsObj in m_objectArray)
	{
		[GraphicsObj Render: dirtyRect];
	}

    CGLFlushDrawable([[self openGLContext] CGLContextObj]);
    
    CGLUnlockContext([[self openGLContext] CGLContextObj]);
}
Edited by Nytegard

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this