• Advertisement
Sign in to follow this  

OS X, NSSplitView, Resizing, and drawing issues

This topic is 1816 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

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
Advertisement
Sign in to follow this  

  • Advertisement