[my apologies if ever you receive the mail twice]

Hi,

I'm writing to the list, because I got a problem I can't solve, even after reading a lot of archives about possible wrong thing we do, and searching a lot on the web.

First, the code was initialy written in C++, and adding the NSOpenGLView it is now ObjC++ :) What we do, is simply create an NSOpenGLView, and we add it in an NSView, using addSubview. Then we draw the OpenGL scene, and when we removeFromSubview, we got a white screen.

What could cause that, and what do you suggest ? Shall I create a customized NSView instead of use the NSOpenGLView?

Below, I put what I thought important. I tried to make it as short as possible, but if you need more information, just tell me.


Thanks in advance for any help :)


The code now. ...

... first, we create a structure containing some information ( in the class ):

    /// Holds the information of our new child window
    struct GLWindow
    {
NSOpenGLView* pOpenGLView; // Custom Cocoa NSOpenGLView
        NSOpenGLContext*        pOpenGLContext; // our OpenGLContext
        NSRect                  aInitFrame;
    unsigned int bpp;
    unsigned int            Width;
    unsigned int            Height;
    } GLWin;

Second, we define the PixelFormat :

   GLuint attribs[] =
    {
// Specifying "NoRecovery" gives us a context that cannot fall back to the software renderer. // This makes the View-based context a compatible with the fullscreen context, // enabling us to use the "shareContext" feature to share textures, display lists,
        // and other OpenGL objects between the two.
        NSOpenGLPFANoRecovery,

        // Specify that we want a Window OpenGL context.
        NSOpenGLPFAWindow,
        NSOpenGLPFAAccelerated,
        // needed
        NSOpenGLPFADoubleBuffer,
        NSOpenGLPFAColorSize, 24,
        NSOpenGLPFAAlphaSize, 8,
NSOpenGLPFADepthSize, 16, // In some code sample, attributes Common to FullScreen and non-FullScreen recommand 16
        0
};

And we initialize it in void OGLTransitionerImpl::initWindowFromSlideShowView() :


... ( some code )

NSOpenGLPixelFormat* fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes: (NSOpenGLPixelFormatAttribute*) attribs];
Window *pFrameWindow = pPWindow->GetWindow(WINDOW_FRAME);
Size aFrameSize( pFrameWindow->GetSizePixel() );
Point aScreen( pPWindow->OutputToScreenPixel( Point() ) );
GLWin.aInitFrame = (NSRect){ { aScreen.X(), aFrameSize.Height() - GLWin.Height - aScreen.Y() }, { GLWin.Width, GLWin.Height } };

GLWin.pOpenGLView = [[NSOpenGLView alloc] initWithFrame: GLWin.aInitFrame pixelFormat: [fmt autorelease]];


... then we add the NSOpenGLView to the NSView (a customized NSView)

OSL_ENSURE(GLWin.pOpenGLView, "Could not create NSOPenGLView");
    if( !GLWin.pOpenGLView )
return;

    [sysData->pView addSubview:GLWin.pOpenGLView];
    [[GLWin.pOpenGLView openGLContext] makeCurrentContext];


... we do some mandatory operations

    if( pWindow )
    {
        pWindow->SetMouseTransparent( TRUE );
        pWindow->SetParentClipMode( PARENTCLIPMODE_NOCLIP );
        pWindow->EnableEraseBackground( FALSE );
        pWindow->SetControlForeground();
        pWindow->SetControlBackground();
        pWindow->EnablePaint(FALSE);

pWindow->SetPosSizePixel(pPWindow->GetPosPixel(),pPWindow->GetSizePixel());

    }

... and finally, we prepare the OpenGL engine :

    glShadeModel( GL_SMOOTH );
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    glClearColor (0.0f, 0.0f, 0.0f, 0.0f);  // R G B A
    glClear(GL_COLOR_BUFFER_BIT);
    glClearDepth( 1.0f );
    glEnable( GL_DEPTH_TEST );
    glDepthFunc( GL_LEQUAL );
    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
    glEnable(GL_TEXTURE_2D);

    glEnable(GL_LIGHTING);
    GLfloat light_direction[] = { 0.0 , 0.0 , 1.0 };
    GLfloat materialDiffuse[] = { 1.0 , 1.0 , 1.0 , 1.0};
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_direction);
    glMaterialfv(GL_FRONT,GL_DIFFUSE,materialDiffuse);
    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);

    if( LeavingBytes.hasElements() && EnteringBytes.hasElements())
GLInitSlides();//we already have uninitialized slides, let's initialize

    if (pTransition)
        pTransition->prepare ();

.. now, in void OGLTransitionerImpl::setSlides(), we do :

if(GLWin.pOpenGLView)
        GLInitSlides();


.. later in the OpenGL pixel format, we define the OGLFormat as GL_RGB (24 bits). Works corectly, with correct colors


.... in void SAL_CALL OGLTransitionerImpl::update() , we do :

   glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

if(pTransition)
    pTransition->display( nTime , GLleavingSlide , GLenteringSlide ,
                              SlideSize.Width, SlideSize.Height,
                              static_cast<double>(GLWin.Width),
                              static_cast<double>(GLWin.Height) );

    long swapInt = 1;
[[GLWin.pOpenGLView openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval]; // set to vbl sync

[[GLWin.pOpenGLView openGLContext] flushBuffer];

if( pWindow )
        pWindow->Show();

... in  void OGLTransitionerImpl::disposing() , we have :

void OGLTransitionerImpl::disposing()
{
    osl::MutexGuard const guard( m_aMutex );
    glDeleteTextures(1,&GLleavingSlide);
    glDeleteTextures(1,&GLenteringSlide);

    if (pTransition)
        pTransition->finish();

if(GLWin.pOpenGLView)
{
[NSOpenGLContext clearCurrentContext];

        // the line below triggers the flicker
[GLWin.pOpenGLView removeFromSuperview]; // <--- flicker appears here in debug mode
[GLWin.pOpenGLView release];
GLWin.pOpenGLView = nil;
}
if (pWindow)
delete pWindow;
    if (pTransition)
        delete pTransition;
}


Could be important: we nill the GLWin.pOpenGLView in the Ctor


Thanks for the one who read until there :-)
--
Education Project: http://wiki.services.openoffice.org/wiki/Education_Project

Blog : http://eric.bachard.free.fr/news

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to