OpenGL et Quarz dans la même vue

fouffouf Membre
14:41 modifié dans API AppKit #1
Bijour à  tous.

Alors, voila : je voudrais pouvoir faire du dessin OpenGL dans une vue où je dessine aussi avec Quartz. J'ai donc fait que ma vue soit une sous-classe de NSOpenGLView et j'ai aussi changé une partie de ma routine de dessin. Mais, comme vous vous en doutez, ca ... ne marche pas. :o. Le dessin via Quartz ==  :(renaud): dans un violon. ::). Le dessin OpenGL me donne un binz un peu zarbi : j'ai une sorte de capture de ce qui est autour de la fenêtre dans la fenêtre (ca fait un peu comme l'économiseur de Chacha).

Auriez-vous une idée de comment faire ? Ah, oui, au fait, je débute en OpenGL ;)
Merci d'avance.

Réponses

  • Eddy58Eddy58 Membre
    14:41 modifié #2
    Peut-être que tu peux t'inspirer de ce qu'à  fait Chacha ici. :)
  • WIMPWIMP Membre
    14:41 modifié #3
    Pour dessiner par openGL dans un NSView, il faut créer un NSBitmapImageRep, puis utiliser glReadPixels dessus:

    - (void)awakeFromNib
    {
    int rowBytes;

    rowBytes = r.size.width * 4;
    //Initialise un NSBitmapImageRep
    mapData = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
    pixelsWide:r.size.width pixelsHigh:r.size.height
                bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO
                colorSpaceName:NSDeviceRGBColorSpace
                bytesPerRow:rowBytes bitsPerPixel:(8 * 4)];
    [mapData retain];

    //NSLog(@mapData size: %d, sizeof *mapData);

    }

    - (void)drawRect:(NSRect)aRect
    {
    NSRect bds = [self bounds];
    int i, j, n, imageWidth = bds.size.width;
    int imageHeight = bds.size.height;

    /........instructions openGL..../

    glFlush();

    glReadPixels(0, 0, bds.size.width, bds.size.height, GL_RGBA,
    GL_UNSIGNED_BYTE, [mapData bitmapData] );

    base = (unsigned int *)[mapData bitmapData];
    //NSBitmapImageRep a la mauvaise idée de placer l'origine des axes en haut à  gauche
    //ce qui met l'image résultante tête en bas
    //Les boucles for la remettre à  l'endroit
    for(i = 0; i<imageHeight/2; i++)
    for (j = 0; j<imageWidth ; j++)
    {
    temp = base[j+i*imageWidth];
    base[j + i*imageWidth] = base[j + imageWidth * (imageHeight-i-1)];
    base[j + imageWidth * (imageHeight-i-1)] = temp;
    }
    }

    J'avais eu un problême de renversement haut-bas, mais sous 10.3 ça s'est peut-être arrangé...
  • ChachaChacha Membre
    14:41 modifié #4
    dans 1125304476:

    Pour dessiner par openGL dans un NSView, il faut créer un NSBitmapImageRep, puis utiliser glReadPixels dessus:


    Oh, non, on n'est pas obligé de faire ça, si on se crée un contexte OpenGL; Cf. le code de SickSaver http://www.objective-cocoa.org/forum/index.php?topic=1146.msg12486#msg12486

    +
    Chacha
  • fouffouf Membre
    14:41 modifié #5
    Merci pour vos réponses. Après essais (et grace à  Chacha), je me suis rendu compte que mon problème tiens uniquement de la facon dont j'utilise OpenGL. Etant un débutant, j'en mène pas large ;)
  • WIMPWIMP Membre
    14:41 modifié #6
    dans 1125305373:

    dans 1125304476:

    Pour dessiner par openGL dans un NSView, il faut créer un NSBitmapImageRep, puis utiliser glReadPixels dessus:


    Oh, non, on n'est pas obligé de faire ça, si on se crée un contexte OpenGL; Cf. le code de SickSaver http://www.objective-cocoa.org/forum/index.php?topic=1146.msg12486#msg12486

    +
    Chacha


    C'est juste. Je remplace "il faut" par "on peut" ::)
Connectez-vous ou Inscrivez-vous pour répondre.