Хорошо, я все еще новичок в Xcode / Cocoa и т. Д., Поэтому, пожалуйста, прости меня, если эта проблема является чем-то совершенно очевидным, но мне кажется, что я полностью игнорирую любое логическое поведение программного обеспечения, которое я когда-либо видел.
У меня есть проект, который использует OpenGL в Snow Leopard.Я создал очень простой твердый чайник (очевидно, с использованием перенасыщения) и пролил свет на него.Когда в моем коде объявлена неиспользуемая переменная (в теле метода, который устанавливает свойства источника света, положение и т. Д.), Компилятор выдает предупреждение, и индикатор не отображается в области просмотра.
Это изображение чайника без света.
Обратите внимание на строку кода над окном с прикрепленным к нему предупреждением.
Однако, если я закомментирую строку, в которой объявлена неиспользуемая переменная, в области просмотра появится индикатор.См. Изображение ниже (обратите внимание, что строка закомментирована).
Я очистил перед сборкой, а также попытался вручную удалить созданный исполняемый файл '.app', а также созданные объектные файлы.Каждый раз, если переменная присутствует, индикатор не появляется.
Может быть, я ошибаюсь, но это кажется странным: разве это не предупреждение, а только предупреждение?Разве код не должен все еще компилироваться и выполняться одинаково оба раза?Как это может случиться?Переменная не используется больше нигде во всем проекте.
Спасибо всем, кто здесь помогает, и еще раз прошу прощения, если это что-то основное, что я пропустил.
PS Код для используемого подкласса NSOpenGLView:
#import "MyOpenGLView.h"
#import <OpenGL/gl.h>
#import <OpenGL/glu.h>
#import <GLUT/GLUT.h>
@implementation MyOpenGLView
#pragma mark Init
- (void) awakeFromNib
{
[self setUpOpenGL];
}
- (void) setUpOpenGL
{
[[self openGLContext] makeCurrentContext];
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glShadeModel(GL_SMOOTH);
glClearColor(0.4, 0.4, 0.4, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, [self bounds].size.width / [self bounds].size.height, 0.1, 1000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0.0, 0.0, [self bounds].size.width, [self bounds].size.height);
[[self openGLContext] update];
}
#pragma mark Helper
- (void) setLight: (int) number x: (GLfloat) x y: (GLfloat) y z: (GLfloat) z color: (NSColor *) color ambientContribution: (GLfloat) ambientContribution
{
/* Determine which light is being set. */
GLint lightNumber = 0;
switch (number) {
case 0:
lightNumber = GL_LIGHT0;
break;
default:
break;
};
/* The position of the light. */
GLfloat lightPosition[] = {
x, y, z
};
/* Various color components. */
GLfloat red = [color redComponent];
GLfloat green = [color greenComponent];
GLfloat blue = [color blueComponent];
GLfloat alpha = [color alphaComponent];
/* The contribution of this light source to
* the ambient light of the entire scene. */
GLfloat lightAmbient[] = {
red * ambientContribution, green * ambientContribution, blue * ambientContribution, alpha * ambientContribution
};
/* The color of the light glow cast on an object by this light. */
GLfloat lightDiffuse[] = {
red, green, blue, alpha
};
/* Color of specular highlight created by this light. */
GLfloat unusedVar = 1.0;
GLfloat lightSpecular[] = {
1.0, 1.0, 1.0, 1.0
};
glLightfv(lightNumber, GL_AMBIENT, lightAmbient);
glLightfv(lightNumber, GL_POSITION, lightPosition);
glLightfv(lightNumber, GL_DIFFUSE , lightDiffuse);
glLightfv(lightNumber, GL_SPECULAR, lightSpecular);
}
- (void) setMaterialColor: (NSColor *) color shininess: (GLfloat) shininess
{
GLfloat materialDiffuse[] = {
[color redComponent], [color greenComponent], [color blueComponent], [color alphaComponent]
};
GLfloat * materialAmbient = materialDiffuse;
GLfloat * materialSpecular = materialDiffuse;
GLfloat materialShininess[] = {
shininess
};
glMaterialfv(GL_FRONT, GL_AMBIENT, materialAmbient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, materialDiffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, materialSpecular);
glMaterialfv(GL_FRONT, GL_SHININESS, materialShininess);
}
#pragma mark Animation & drawing
- (BOOL) isOpaque
{
return NO;
}
- (void) updateAnimation
{
// TODO: not used yet.
}
- (void) drawOrigin: (NSColor *) color
{
glColor3f([color redComponent], [color greenComponent], [color blueComponent]);
glutSolidSphere(0.10, 12, 12);
glBegin(GL_LINES);
{
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(1.0, 0.0, 0.0);
}
glEnd();
glBegin(GL_LINES);
{
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 1.0, 0.0);
}
glEnd();
glBegin(GL_LINES);
{
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 1.0);
}
glEnd();
}
- (void) drawRect:(NSRect)dirtyRect
{
[[self openGLContext] makeCurrentContext];
[self setUpOpenGL];
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* Move view position. */
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
[self drawOrigin: [NSColor redColor]];
/* Lighting. */
[self setLight: 0 x: -5.0 y: 5.0 z: 10.0 color: [NSColor colorWithCalibratedRed: 1.0 green: 1.0 blue: 0.80 alpha: 1.0] ambientContribution: 0.10];
/* Draw objects. */
[self setMaterialColor: [NSColor colorWithCalibratedRed: 0.3 green:0.3 blue: 0.80 alpha: 1.0] shininess: 100.0];
glutSolidTeapot(1.0);
glFlush();
}
@end