Команды GLUT и рисования не рисуют - PullRequest
0 голосов
/ 28 января 2012

Я недавно перепроектировал свое приложение, чтобы сбор данных выполнялся в режиме ожидания.Программа читает файл из argv [1] и анализирует команды из этого файла.Эта часть, кажется, работает без проблем, и проанализированные данные являются точными.

Проблема заключается в функции отображения.Вызывается команда 'cone' (сейчас это единственная команда в моем файле), и это показано в выводе консоли.Но конус не отображается на холсте.Я также попытался поместить команду рисования для конуса вне петли, чтобы увидеть, если это как-то повлияет (а это не так).

Любая помощь будет высоко ценится.

#include <gl\glew.h>
#include <gl\freeglut.h>
#include <gl\GLU.h>
#include <stdio.h>

void makeLower(char *input);
void extractVals(char *cmd, double *val);

FILE *file;
int g_mainWindow = -1;
float g_lightPos[] = {1, 1, -1, 0};
char commands [50][50];
int fileSize = -1;

void idle()
{   
  /* parse a command from file */
  /* store the data for later draw */
    char linebyline [50], *lineStr = linebyline;
    int i=0;

    while(!feof(file) && file != NULL){
        fgets(lineStr , 50, file);
        makeLower(lineStr);
        strcpy(commands[i] , lineStr);
        fileSize = i;
        i++;
    }

    glutSetWindow(g_mainWindow);
    glutPostRedisplay();
}

void makeLower(char *input)
{
    while (*input != '\0')
    {
        *input = tolower(*input);
        input++;
    }
}

/*
    Using a tolenizer this extracts out values needed for other functions to draw.
*/
void extractVals(char *cmd, float *val){
    int i=0;
    cmd = strtok(NULL, " ,");
    while(cmd != NULL){
        val[i] = atof(cmd);
        cmd = strtok(NULL, " ,");
        i++;
    }
    val[4] = i--;
}



void display()
{
    int i;
    char cmdTok[10] , *cmd = cmdTok;
    float val[5];

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    for(i = 0 ; i <= fileSize ; i++){
        cmd = strtok(commands[i] , " \n\0");
            switch(*cmd){
                case 'g'://translate object
                    extractVals(cmd , val);
                    glTranslatef(val[0] , val[1] , val[2]);
                    break;
                case 's'://scales an object
                    extractVals(cmd , val);
                    if (val[4] == 1.){
                        glScalef(val[0],val[0],val[0]);
                    }
                    else if (val[4] == 3.){
                        glScalef(val[0] , val[1] , val [2]);
                    }
                    break;
                case 'r'://rotates an object
                    break;
                case 'c'://this can call draw cone , cube, or change colors.
                    if(strcmp(cmd , "cone") == 0){
                        printf("drawing a cone\n");
                        glutSolidCone(.5 , 1 , 8, 1);
                    } else if (strcmp(cmd , "cube") == 0){
                        glutSolidCube(1);
                    } else if (*cmd == 'c'){
                        extractVals(cmd , val);
                        glColor3f(val[0] , val[1], val[2]);
                    }
                    break;
                case 't'://draw a torus or tea pot
                    break;
                case 'o'://reads a meshfile
                    break;
                case 'f'://save current frame buffer.
                    break;
                case 'm':
                    break;
            }

    }

    glutSolidCone(.5 , 1 , 8, 1);
    glFlush();
    // also consider glutSwapBuffers for smoothness
}

void reshape(int w, int h)
{
    float aspect = w / (float)h;

    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION_MATRIX);
    glLoadIdentity();
    glOrtho(-aspect, aspect, -1, 1, -1, 1);
    glMatrixMode(GL_MODELVIEW_MATRIX);
}


int main(int argc, char **argv)
{
   file = fopen(argv[1], "r");

   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);
   g_mainWindow = glutCreateWindow("Hello, glut");
   glClearColor(0.5, 0.5, 0.5, 0);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);

    glLightfv(GL_LIGHT0, GL_POSITION, g_lightPos);

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(idle);



    glutMainLoop();
   fclose(file);
}

Похоже, это связано с импортом.Я добавил несколько строк кода, и он, кажется, сработал.

#include <stdio.h>
#include <stdlib.h>
#include <gl/glut.h>
#include <gl/gl.h>
#include <gl/glu.h>

и на дисплее я добавил

glutSwapBuffers();

1 Ответ

0 голосов
/ 28 января 2012

Вы пытались поместить

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, width, 0.0, height, -1, 1);
glMatrixMode(GL_MODELVIEW);

прямо перед glutMainLoop() (где ширина и высота - ширина и высота окна)?

Я не сделал Windows OpenGLтак что не стесняйтесь поправлять меня, если что-то должно быть иначе.

...