Advertisement
d10070dd

sample25-binary

Oct 7th, 2013
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.58 KB | None | 0 0
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>//glut.hより先にインクルード
  4. #include <gl/glew.h>//glut.hより先にインクルード
  5. #include <gl/glut.h>
  6. GLfloat *vertexAry;
  7.  
  8. //------- 頂点データ-----------//
  9. //「6」面、「4」頂点、1頂点はx,y,zの「3」要素
  10. /*
  11. GLfloat vertexAry[6][4][3] =
  12. {
  13.     //1つめの面(v0-v1-v2-v3)
  14.     {
  15.         {0.f,0.f,0.f},{1.f,0.f,0.f},
  16.         {1.f,1.f,0.f},{0.f,1.f,0.f}
  17.     },
  18.     //2つめの面(v1-v5-v6-v2)
  19.     {
  20.         {1.f,0.f,0.f},{1.f,0.f,-1.f},
  21.         {1.f,1.f,-1.f},{1.f,1.f,0.f}
  22.     },
  23.     //3つめの面(v4-v7-v6-v5)
  24.     {
  25.         {0.f,0.f,-1.f},{0.f,1.f,-1.f},
  26.         {1.f,1.f,-1.f},{1.f,0.f,-1.f}
  27.     },
  28.     //4つめの面(v4-v0-v3-v7)
  29.     {
  30.         {0.f,0.f,-1.f},{0.f,0.f,0.f},
  31.         {0.f,1.f,0.f},{0.f,1.f,-1.f}
  32.     },
  33.     //5つめの面(v3-v2-v6-v7)
  34.     {
  35.         {0.f,1.f,0.f},{1.f,1.f,0.f},
  36.         {1.f,1.f,-1.f},{0.f,1.f,-1.f}
  37.     },
  38.     //6つめの面(v0-v4-v5-v1)
  39.     {
  40.         {0.f,0.f,0.f},{0.f,0.f,-1.f},
  41.         {1.f,0.f,-1.f},{1.f,0.f,0.f}
  42.     }
  43. };
  44. */
  45.  
  46. //法線データ
  47. GLfloat normalAry[6][4][3] =
  48. {
  49.     //1つめの面(v0-v1-v2-v3)
  50.     {
  51.         {0.f,0.f,1.f},{0.f,0.f,1.f},
  52.         {0.f,0.f,1.f},{0.f,0.f,1.f}
  53.     },
  54.     //2つめの面(v1-v5-v6-v2)
  55.     {
  56.         {1.f,0.f,0.f},{1.f,0.f,0.f},
  57.         {1.f,0.f,0.f},{1.f,0.f,0.f}
  58.     },
  59.     //3つめの面(v4-v7-v6-v5)
  60.     {
  61.         {0.f,0.f,-1.f},{0.f,0.f,-1.f},
  62.         {0.f,0.f,-1.f},{0.f,0.f,-1.f}
  63.     },
  64.     //4つめの面(v4-v0-v3-v7)
  65.     {
  66.         {-1.f,0.f,0.f},{-1.f,0.f,0.f},
  67.         {-1.f,0.f,0.f},{-1.f,0.f,0.f}
  68.     },
  69.     //5つめの面(v3-v2-v6-v7)
  70.     {
  71.         {0.f,1.f,0.f},{0.f,1.f,0.f},
  72.         {0.f,1.f,0.f},{0.f,1.f,0.f}
  73.     },
  74.     //6つめの面(v0-v4-v5-v1)
  75.     {
  76.         {0.f,-1.f,0.f},{0.f,-1.f,0.f},
  77.         {0.f,-1.f,0.f},{0.f,-1.f,0.f}
  78.     }
  79. };
  80.  
  81. //色データ
  82. GLfloat colorAry[6][4][3] =
  83. {
  84.     //1つめの面(v0-v1-v2-v3)
  85.     {
  86.         {0.f,0.f,1.f},{0.f,0.f,1.f},
  87.         {0.f,0.f,1.f},{0.f,0.f,1.f}
  88.     },
  89.     //2つめの面(v1-v5-v6-v2)
  90.     {
  91.         {1.f,0.f,0.f},{1.f,0.f,0.f},
  92.         {1.f,0.f,0.f},{1.f,0.f,0.f}
  93.     },
  94.     //3つめの面(v4-v7-v6-v5)
  95.     {
  96.         {0.f,1.f,1.f},{0.f,1.f,1.f},
  97.         {0.f,1.f,1.f},{0.f,1.f,1.f}
  98.     },
  99.     //4つめの面(v4-v0-v3-v7)
  100.     {
  101.         {1.f,1.f,0.f},{1.f,1.f,0.f},
  102.         {1.f,1.f,0.f},{1.f,1.f,0.f}
  103.     },
  104.     //5つめの面(v3-v2-v6-v7)
  105.     {
  106.         {0.f,1.f,0.f},{0.f,1.f,0.f},
  107.         {0.f,1.f,0.f},{0.f,1.f,0.f}
  108.     },
  109.     //6つめの面(v0-v4-v5-v1)
  110.     {
  111.         {1.f,0.f,1.f},{1.f,0.f,1.f},
  112.         {1.f,0.f,1.f},{1.f,0.f,1.f}
  113.     }
  114. };
  115. //インデックス
  116. GLubyte indexAry[]=
  117. {
  118.     0,1,2,3,
  119.     4,5,6,7,
  120.     8,9,10,11,
  121.     12,13,14,15,
  122.     16,17,18,19,
  123.     20,21,22,23
  124. };
  125.  
  126. // π/180の値
  127. const float PI_OVER_180 = 0.0174532925f;
  128.  
  129. //VBO用ID
  130. GLuint VboId[3];//3つ分
  131. GLuint VboIndex;//インデックス
  132.  
  133. //描画関数
  134. void drawAry(void)
  135. {
  136.     GLfloat *clientPtr;//クライアント側用
  137.     GLfloat tmp[3];
  138.     int idloop;
  139.     int loop;
  140.     static float angle = 2*PI_OVER_180;
  141.  
  142.     //データの場所を知らせる
  143.     //座標
  144.     glBindBuffer(GL_ARRAY_BUFFER,VboId[0]);
  145.     glVertexPointer(3, GL_FLOAT, 0, 0);
  146.     //法線
  147.     glBindBuffer(GL_ARRAY_BUFFER,VboId[1]);
  148.     glNormalPointer(GL_FLOAT, 0, 0);
  149.     //色
  150.     glBindBuffer(GL_ARRAY_BUFFER,VboId[2]);
  151.     glColorPointer(3,GL_FLOAT, 0, 0);
  152.     //インデックスもバインド
  153.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VboIndex);
  154.  
  155.     glEnableClientState(GL_VERTEX_ARRAY);
  156.     glEnableClientState(GL_NORMAL_ARRAY);
  157.     glEnableClientState(GL_COLOR_ARRAY);
  158.     //描画
  159.     glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,0);
  160.    
  161.     glDisableClientState(GL_COLOR_ARRAY);
  162.     glDisableClientState(GL_NORMAL_ARRAY);
  163.     glDisableClientState(GL_VERTEX_ARRAY);
  164.  
  165.     //座標と法線を回転させる
  166.     for(idloop = 0; idloop < 2;++idloop)
  167.     {
  168.         //idloop番目のバッファオブジェクトに注目
  169.         glBindBuffer(GL_ARRAY_BUFFER,VboId[idloop]);
  170.        
  171.         //対応付け
  172.         clientPtr = (GLfloat *)glMapBuffer(GL_ARRAY_BUFFER,
  173.                                                 GL_READ_WRITE);
  174.         if(clientPtr != NULL)
  175.         {
  176.             //24頂点*3座標
  177.              for(loop = 0; loop < 24*3;loop += 3)   {
  178.                 //読み出し(READ)
  179.                 tmp[0] = clientPtr[loop];
  180.                 tmp[1] = clientPtr[loop+1];
  181.                 tmp[2] = clientPtr[loop+2];
  182.                 //書き込み(WRITE)
  183.                 clientPtr[loop] = cos(angle)*tmp[0]
  184.                                     + sin(angle)*tmp[2];
  185.                 clientPtr[loop+1] = tmp[1];
  186.                 clientPtr[loop+2] = -sin(angle)*tmp[0]
  187.                                         + cos(angle)*tmp[2];
  188.              }
  189.             glUnmapBuffer(GL_ARRAY_BUFFER);//対応付けの解放
  190.         }
  191.     }
  192.     //クライアント側に戻す
  193.     glBindBuffer(GL_ARRAY_BUFFER,0);
  194.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  195. }
  196. //------- 各種コールバック----------//
  197. void display(void)
  198. {
  199.     static int angle = 0;
  200.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  201.     glLoadIdentity();
  202.     gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  203.    
  204.     glPushMatrix();
  205.     glRotatef(float(angle),1.f,0.f,0.f);//x軸回転
  206.     drawAry();
  207.     glPopMatrix();
  208.  
  209.     glutSwapBuffers();
  210.     if(++angle >= 360) angle = 0;
  211. }
  212.  
  213. void reshape(int w, int h)
  214. {
  215.     glViewport(0,0,w,h);
  216.     glMatrixMode(GL_PROJECTION);
  217.     glLoadIdentity();
  218.     gluPerspective(30.0, double(w)/h, 0.1, 200.0);
  219.     glMatrixMode(GL_MODELVIEW);
  220.     glLoadIdentity();
  221. }
  222.  
  223. void idle(void)
  224. {
  225.     glutPostRedisplay();
  226. }
  227.  
  228. void keyboard(unsigned char key, int x, int y)
  229. {
  230.     switch(key)
  231.     {
  232.     case 'q':
  233.     case 'Q':
  234.     case '\033':
  235.         //終了処理
  236.         glDeleteBuffers(3,&VboId[0]);
  237.         glDeleteBuffers(1,&VboIndex);
  238.         exit(0);
  239.         break;
  240.     }
  241. }
  242. //------ その他初期設定-------//
  243. void otherInit(void)
  244. {
  245.     glClearColor(1.f, 1.f, 1.f, 1.f);
  246.     glEnable(GL_DEPTH_TEST);
  247.     glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
  248.     glEnable(GL_COLOR_MATERIAL);
  249.     glEnable(GL_LIGHT0);
  250.     glEnable(GL_LIGHTING);
  251.     glEnable(GL_NORMALIZE);//法線の正規化
  252. }
  253.  
  254. //---- VBOの作成----//
  255. void buildVBO(int a, int b, int c)
  256. {
  257.     glGenBuffers(3,&VboId[0]);//座標、法線、色の3つ
  258.    
  259.     //頂点
  260.     glBindBuffer(GL_ARRAY_BUFFER,VboId[0]);
  261.     glBufferData(GL_ARRAY_BUFFER,sizeof(vertexAry)*a*b*c,
  262.                 vertexAry,GL_DYNAMIC_DRAW);//データ変更する
  263.  
  264.     //法線
  265.     glBindBuffer(GL_ARRAY_BUFFER,VboId[1]);
  266.     glBufferData(GL_ARRAY_BUFFER,sizeof(normalAry),
  267.                 normalAry,GL_DYNAMIC_DRAW);//データ変更あり
  268.  
  269.     //色
  270.     glBindBuffer(GL_ARRAY_BUFFER,VboId[2]);
  271.     glBufferData(GL_ARRAY_BUFFER,sizeof(colorAry),
  272.                     colorAry,GL_STREAM_DRAW);//データ変更なし
  273.  
  274.     //インデックス
  275.     glGenBuffers(1,&VboIndex);
  276.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,VboIndex);
  277.     glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indexAry),
  278.                     indexAry,GL_STATIC_DRAW);//データ変更なし
  279. }
  280. //----------- メイン関数------------//
  281. int main(int argc, char *argv[])
  282. {
  283.     FILE *fpi;
  284.     int face,vertex,point;
  285.     int i,j,k;
  286.     float data;
  287.  
  288.     if(argc!=5)
  289.     {
  290.         fprintf(stderr,"Usage: %s 5m_mesh_data.lem,5m_mesh_data.raw\n",argv[0]);
  291.         exit(1);
  292.     }
  293.     printf("OPEN FILE NAME:%s\n",argv[1]);
  294.  
  295.     if((fpi=fopen(argv[1],"rb"))==NULL)
  296.     {
  297.         fprintf(stderr,"Can not open\n");
  298.         exit(1);
  299.     }
  300.  
  301.     face=atoi(argv[2]);
  302.     vertex=atoi(argv[3]);
  303.     point=atoi(argv[4]);
  304.     vertexAry=(GLfloat *)malloc(face*vertex*point*sizeof(GLfloat));
  305.     fread((GLfloat *)vertexAry,sizeof(GLfloat),face*vertex*point,fpi);
  306.  
  307.     //GLUTの初期設定
  308.     glutInit(&argc, argv);
  309.     glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
  310.     glutInitWindowSize(640,480);
  311.     glutCreateWindow("VBO Sample");
  312.     //GLEWの初期設定
  313.     GLenum err = glewInit();
  314.     if(err != GLEW_OK)
  315.     {
  316.         fprintf(stderr,"Err:%s\n",
  317.             glewGetErrorString(err));
  318.         return -1;
  319.     }
  320.     //拡張チェック
  321.     if(!glewIsExtensionSupported(
  322.                     "GL_ARB_vertex_buffer_object")){
  323.         puts("you Can't use VBO");
  324.         return -1;
  325.     }
  326.  
  327.     //コールバック
  328.     glutDisplayFunc(display);
  329.     glutReshapeFunc(reshape);
  330.     glutIdleFunc(idle);
  331.     glutKeyboardFunc(keyboard);
  332.  
  333.     otherInit();
  334.    
  335.     buildVBO(face,vertex,point);//VBOの作成
  336.     glutMainLoop();
  337.  
  338.     fclose(fpi);
  339.  
  340.     return 0;
  341. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement