2012-01-28 11 views
0

私は最近、データ収集がアイドル関数で行われるようにアプリケーションを再設計しました。プログラムはargv [1]からファイルを読み込み、そのファイルからコマンドを解析します。その部分は問題なく動作するように見え、解析されたデータは正確です。GLUTと描画コマンドが描画されない

問題は表示機能にあります。コマンド '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(); 

答えて

0

を追加します(幅と高さは、ウィンドウの幅と高さである)を右あなたのglutMainLoop()

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

を入れてみましたがありますか?

私はWindows OpenGLを行っていないので、何か異なるものがあれば私を修正してください。

+0

私はこれらのコマンドが変形で呼ばれていると思います。私はそれが十分だと思いますか?しかし、それは100%ではありません。 – meriley

+0

@merileyウィンドウがサイズ変更されるまで、形状変更が呼び出されるとは思わない。これは100%ではありませんでしたが、私はidlefuncを使って表示するコードを修正しました。 –

+0

残念ながら、まだ役に立ちませんでした。( – meriley