CGContext dans NSOpenGlContext

ChachaChacha Membre
16:46 modifié dans API AppKit #1
Bon, ça va ressembler à  une grosse question imbittable, mais je tente ma chance.

Voilà  : j'aimerais me faire une petite appli pour ajouter un filtre en temps réel sur une video. J'ai donc repris le code de "CIVideoDemo GL" dans les examples Developer.
Dans ce code, tout se passe dans un contexte opengl.
Pour commencer doucement, j'ai juste essayé de rajouter le tracé d'un CGRect dans le drawRect: de la NSOpenGlView principale.

Sauf que pour tracer un CGRect, il faut un CGContextRef, ce qui n'est pas le cas dans un contexte OpenGL.
J'ai donc fait ça :

<br />//il existe dans le code un ciContext permettant d&#39;utiliser CoreImage<br /><br />//je crée une CGLayer<br />CGLayerRef cgLayer = [ciContext createCGLayerWithSize:CGSizeMake(frame.size.width, frame.size.height) info:NULL];<br /><br />//j&#39;en sors un CGcontext<br />CGContextRef context = CGLayerGetContext(cgLayer);<br /><br />//je trace mon rectangle<br />CGContextSetRGBFillColor(context, 1, 0, 0, .5);<br />CGContextFillRect(context, CGRectMake(100, 100, 200, 200));<br />CGContextFlush(context);<br />CGLayerRelease(cgLayer);<br />


Bon, ça ne trace rien du tout.
Je vous livre le drawRect en entier:

<br />- (void)drawRect:(NSRect)theRect<br />{<br />  //le code qui suit est d&#39;origine<br />  [lock lock];    <br /><br />  NSRect		frame = [self frame];<br />  NSRect		bounds = [self bounds];<br />    <br />  [[self openGLContext] makeCurrentContext];<br />  if(needsReshape)<br />  {<br />    GLfloat 	minX, minY, maxX, maxY;<br /><br />   minX = NSMinX(bounds);<br />   minY = NSMinY(bounds);<br />   maxX = NSMaxX(bounds);<br />   maxY = NSMaxY(bounds);<br /><br />   [self update]; <br /><br />   if(NSIsEmptyRect([self visibleRect])) <br />	glViewport(0, 0, 1, 1);<br />   else<br />      glViewport(0, 0,  frame.size.width ,frame.size.height);<br /><br />   glMatrixMode(GL_MODELVIEW);<br />   glLoadIdentity();<br />   glMatrixMode(GL_PROJECTION);<br />   glLoadIdentity();<br />   glOrtho(minX, maxX, minY, maxY, -1.0, 1.0);<br /><br />   needsReshape = NO;<br />  }<br />  glClearColor(0.0, 0.0, 0.0, 0.0);<br />  glClear(GL_COLOR_BUFFER_BIT);<br />  if(!currentFrame)<br />    [self updateCurrentFrame];<br /><br />  //début du code à  moi<br />  //[self renderCurrentFrame];//je désactive l&#39;affichage originel du film<br />  <br />  //je trace mon rectangle<br />  CGLayerRef cgLayer = [ciContext createCGLayerWithSize:CGSizeMake(frame.size.width, frame.size.height) info:NULL];<br />  CGContextRef context = CGLayerGetContext(cgLayer);<br />  CGContextSetRGBFillColor(context, 1, 0, 0, .5);<br />  CGContextSetRGBStrokeColor(context, 1, 0, 0, .5);<br />  CGContextFillRect(context, CGRectMake(100, 100, 200, 200));<br />  CGLayerRelease(cgLayer);<br /><br />  //le code qui suit est d&#39;origine   <br />  glFlush();<br /><br />  [lock unlock];<br />}<br />

Réponses

  • ChachaChacha Membre
    16:46 modifié #2
    Agné, j'ai trouvé !
    En fait je dois récupérer autrement mon contexte :
    <br />CGContextRef context = CGGLContextCreate([[self openGLContext] CGLContextObj], CGSizeMake(frame.size.width, frame.size.height), NULL);<br />
    

    +
    Chacha
Connectez-vous ou Inscrivez-vous pour répondre.