Jump to content

  • Log In with Google      Sign In   
  • Create Account

Interested in a FREE copy of HTML5 game maker Construct 2?

We'll be giving away three Personal Edition licences in next Tuesday's GDNet Direct email newsletter!

Sign up from the right-hand sidebar on our homepage and read Tuesday's newsletter for details!


We're also offering banner ads on our site from just $5! 1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


OS X, NSSplitView, Resizing, and drawing issues


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
No replies to this topic

#1 Nytegard   Members   -  Reputation: 823

Like
0Likes
Like

Posted 02 February 2013 - 01:53 PM

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, 03 February 2013 - 04:30 PM.


Sponsor:



Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS