. Я сделал программу рисования. Все работает, как я и ожидал. Но во время рисования иногда происходят странные вещи.
Я запускаю приложение и нажимаю левую кнопку мыши на изображении. Следует взять точку из кода:
glEnableClientState(GL_VERTEX_ARRAY);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, brushTextura);
glPointSize(100);
glVertexPointer(2, GL_FLOAT, 0,GLVertices);
glDrawArrays(GL_POINTS, 0, count);
glDisableClientState(GL_VERTEX_ARRAY);
в точке, где я нажимаю. mouseDown
регистрирует расположение mouseDown, преобразует его в NSValue, отправляет в массив, а затем перед отрисовкой я извлекаю NSValue в CGPoint и отправляю его в GLfloat, чтобы его можно было отрисовать с помощью glDrawArrays. Но независимо от того, где я щелкаю мышью по изображению, он рисует точку с координатами (0,0 ). После этого все работает нормально. См. изображение:
Это была первая проблема. Вторая проблема заключается в том, что когда я рисую с помощью (перетаскивания нажатой мыши ), иногда появляются точки там, где они не нарисованы. Изображение:
Когда я продолжаю перетаскивать, он исчезает. После некоторого перетаскивания он снова появляется и снова исчезает. И так далее. Изображение:
Любые идеи, почему это могло произойти? Я опубликую код ниже:
Мышь вниз:
- (void) mouseDown:(NSEvent *)event
{
location = [self convertPoint: [event locationInWindow] fromView:self];
NSValue *locationValue = [NSValue valueWithPoint:location];
[vertices addObject:locationValue];
[self drawing];
}
Мышь тащила:
- (void) mouseDragged:(NSEvent *)event
{
location = [self convertPoint: [event locationInWindow] fromView:self];
NSValue *locationValue = [NSValue valueWithPoint:location];
[vertices addObject:locationValue];
[self drawing];
}
Рисунок:
- (void) drawing {
int count = [vertices count] * 2;
NSLog(@"count: %d", count);
int currIndex = 0;
GLfloat *GLVertices = (GLfloat *)malloc(count * sizeof(GLfloat));
for (NSValue *locationValue in vertices) {
CGPoint loc = locationValue.pointValue;
GLVertices[currIndex++] = loc.x;
GLVertices[currIndex++] = loc.y;
}
glEnableClientState(GL_VERTEX_ARRAY);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, brushTextura);
glPointSize(100);
glVertexPointer(2, GL_FLOAT, 0, GLVertices);
glDrawArrays(GL_POINTS, 0, count);
glDisableClientState(GL_VERTEX_ARRAY);
}