Проект Xcode (Snow Leopard) работает по-разному в зависимости от объявления одной переменной - PullRequest
1 голос
/ 15 августа 2010

Хорошо, я все еще новичок в 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

1 Ответ

4 голосов
/ 15 августа 2010

Одна из проблем, с которой вы столкнулись, состоит в том, что glLightfv () принимает три параметра, последний из которых представляет собой массив four glFloats - всегда.Ваш массив lightPosition слишком мал.Вполне вероятно, что неиспользуемая переменная делает числа с плавающей запятой в этом массиве чувствительными для всех четырех элементов, а не только для первых трех.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...