Advertisement
d10070dd

sample25-binary2

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