2009-11-24 7 views
1

Je me suis cogné la tête contre un mur pendant quelques jours avec ça. J'ai lu everydocument J'ai couldfind et plus sur le sujet de OpenGL et Cocoa. Je ne comprends pas où mes tentatives se brisent et les autres ne le font pas.Seulement les premières images rendues avec OpenGL dans Cocoa

Mon code est listé ci-dessous, il est assez court car tout ce que j'essaie de faire est de rendre un triangle tournant. Je ne suis pas nouveau sur OpenGL ou en programmation, mais je suis totalement novice avec Cocoa et Objective-C.

MyOpenGL.h

#import <Cocoa/Cocoa.h> 

@interface MyOpenGL : NSOpenGLView 
{ 
float rot; 
NSTimer *timer; 
} 

//+(NSOpenGLPixelFormat*) basicPixelFormat; 

-(void) animTimer : (NSTimer *) timer; 
-(void) drawRect : (NSRect) bounds; 

@end 

MyOpenGL.m

#include <OpenGL/gl.h> 

#import <Cocoa/Cocoa.h> 
#import "MyOpenGL.h" 

@implementation MyOpenGL 

/* 
+ (NSOpenGLPixelFormat*) basicPixelFormat 
{ 
    NSOpenGLPixelFormatAttribute attributes [] = { 
     NSOpenGLPFAWindow, 
     NSOpenGLPFADoubleBuffer, 
     NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)16, 
     (NSOpenGLPixelFormatAttribute)nil 
    }; 
    return [[[NSOpenGLPixelFormat alloc] initWithAttributes:attributes] autorelease]; 
} 

-(id) initWithFrame : (NSRect) frameRect 
{ 
NSOpenGLPixelFormat * pf = [MyOpenGL basicPixelFormat]; 

return self = [super initWithFrame: frameRect pixelFormat: pf]; 
} 
*/ 

-(void) awakeFromNib 
{ 
rot = 0; 
    timer = [NSTimer timerWithTimeInterval: (1.0f/60.0f) 
     target:self 
      selector:@selector(animTimer:) 
      userInfo:nil 
      repeats:YES]; 

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode]; 
} 

-(void) animTimer : (NSTimer *) atime 
{ 
[self setNeedsDisplay: YES]; 
[self drawRect:[self bounds]]; 
} 

-(void) drawRect: (NSRect) bounds 
{ 
glClearColor(0,0,0,0); 
glClear(GL_COLOR_BUFFER_BIT); 
glLoadIdentity(); 
glRotatef(rot,1,0,0); 

glBegin(GL_TRIANGLES); 
{ 
    glColor3f(1,0,0); glVertex3f(0,0.6,0); 
    glColor3f(0,1,0); glVertex3f(-0.2,-0.3,0); 
    glColor3f(0,0,1); glVertex3f(0.2,0.3,0); 
} 
glEnd(); 

glFlush(); 
rot++; 
} 

@end 

décommenter les lignes +(NSOpenGLPixelFormat*) basicPixelFormat; de l'en-tête et la fonction associée dans le fichier .m et la méthode -(id) initWithFrame : (NSRect) frameRect dans MyOpenGL Le fichier .m semble ne faire aucune différence.

La méthode drawRect semble être appelée une seule fois. Je reçois le triangle dans la position initiale, mais sans rotation. Tout avis sera le bienvenu.

Répondre

0

J'ai juste essayé de déposer votre code ci-dessus dans un nouveau projet, et ça marche pour moi. Je vois un triangle tournant autour de l'axe X. Avez-vous un point d'arrêt sur votre méthode -drawRect:? BTW, envoi -drawRect: vous-même est redondant si vous envoyez un message -setNeedsDisplay.

+0

Pas de point de rupture. Je vais retirer le extra -drawRect, et essayer un nouveau projet sur une autre machine. –

+1

Non seulement c'est redondant, mais je suis certain que vous aurez des plaintes dans le journal d'exécution, et cela ne fonctionnera pas, car il n'y a pas de contexte actuel à ce moment-là. Vous devez envoyer 'lockFocus' avant' drawRect: 'et' unlockFocus' après (si vous n'envoyez pas déjà 'setNeedsDisplay:', ce qui est mieux, à la fois généralement et dans ce cas). –

+0

Il s'avère que mon ordinateur est trop vieux pour compiler correctement ceci:/Temps de mise à niveau! –

Questions connexes