Advertisement
Guest User

Untitled

a guest
Jul 20th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.00 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<GL/gl.h>
  4. #include<GL/glu.h>
  5. #include<SDL.h>
  6. #define GL_ARRAY_BUFFER_ARB 0x8892
  7. #define GL_STATIC_DRAW_ARB 0x88E4
  8. typedef void (APIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
  9. typedef void (APIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers);
  10. typedef void (APIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers);
  11. typedef void (APIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, int size, const GLvoid *data,
  12. GLenum usage);
  13. PFNGLGENBUFFERSARBPROC glGenBuffersARB = NULL;
  14. PFNGLBINDBUFFERARBPROC glBindBufferARB = NULL;
  15. PFNGLBUFFERDATAARBPROC glBufferDataARB = NULL;
  16. PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB = NULL;
  17. typedef struct { float x,y,z; } quad_vert;
  18. typedef struct { float x,y,z; } quad_norm;
  19. typedef struct { float x,y,z; } tri_vert;
  20. typedef struct { float x,y,z; } tri_norm;
  21. struct { int tri_verts, tri_norms, quad_verts, quad_norms, models;unsigned int tri_vbo, quad_vbo, quad_vbon, tri_vbon;} number;
  22. struct window{
  23. int width;
  24. int height;
  25. int bpps;
  26. int flags;
  27. ;{
  28. int mousex;
  29. int mousey;
  30. char *key;
  31. SDL_Event event;
  32. GLfloat i;
  33. GLfloat n;
  34. void input(struct window *win){
  35. SDL_Event event;
  36.     while ( SDL_PollEvent(&event) ) {
  37.         switch (event.type) {
  38.             case SDL_MOUSEMOTION:
  39. mousex=event.motion.x;    mousey=event.motion.y;
  40.     break;
  41.             case SDL_MOUSEBUTTONDOWN:
  42.            glDeleteBuffersARB(1, &number.tri_vbon);
  43. glDeleteBuffersARB(1, &number.tri_vbo);
  44. glDeleteBuffersARB(1, &number.quad_vbo);
  45. glDeleteBuffersARB(1, &number.quad_vbon);
  46. SDL_Quit();
  47. exit(0);
  48.                 break;
  49.     case SDL_KEYDOWN:
  50.          key=SDL_GetKeyName(event.key.keysym.sym);
  51. switch( event.key.keysym.sym ){
  52.                     case SDLK_LEFT:
  53.                         i--;
  54. break;
  55.                     case SDLK_RIGHT:
  56. i++;
  57. break;
  58. case SDLK_UP:
  59. n++;                        break;
  60.                     case SDLK_DOWN:
  61. n--;
  62. break;
  63.                     default:
  64. break;}
  65.      
  66. {  
  67. {    
  68. {
  69. /* Arrays for Quads/Triangles */
  70. quad_vert **quad_v;
  71. quad_norm **quad_n;
  72. tri_vert **tri_v;
  73. tri_norm **tri_n;
  74. int LoadModel(){
  75. #define FILE_NAME "object1.c"
  76. FILE *fp=fopen(FILE_NAME, "r");char *txt = malloc(1024);
  77. number.models=2;
  78. int counter;
  79. tri_n = malloc(number.models * sizeof *tri_n);
  80. tri_v = malloc(number.models * sizeof *tri_v);
  81. quad_v = malloc(number.models * sizeof *quad_v);
  82. quad_n = malloc(number.models * sizeof *quad_n);
  83. /* TRIANGLES */
  84. while(!feof(fp)){
  85. fscanf(fp, "%s",txt);
  86. if(strcmp(txt,"TRI")==0){
  87. //printf("\nTriangles %d:\n",t);
  88. for(counter=0; counter!=3;counter++)
  89. }
  90. /* Normal 1 */
  91. fscanf(fp, "%s",txt);
  92. if(strcmp(txt,"n")==0){
  93. number.tri_norms++;tri_n[number.models-1] = realloc(tri_n[number.models-1], (number.tri_norms * sizeof
  94. *tri_n[number.models-1]));
  95. fscanf(fp, "%f %f %f",&tri_n[number.models-1][number.tri_norms-1].x,&tri_n[number.models-
  96. 1][number.tri_norms-1].y,&tri_n[number.models-1][number.tri_norms-1].z);
  97. //printf("Normal %d: %.10f %.10f %.10f\n",number.tri_norms-1,tri_n[number.models-
  98. 1][number.tri_norms-1].x,tri_n[number.models-1][number.tri_norms-1].y,tri_n[number.models-
  99. 1][number.tri_norms-1].z);
  100. {
  101. /* Vertex 1 */
  102. fscanf(fp, "%s",txt);
  103. if(strcmp(txt,"v")==0){
  104. number.tri_verts++;
  105. tri_v[number.models-1] = realloc(tri_v[number.models-1], (number.tri_verts * sizeof
  106. *tri_v[number.models-1]));
  107. fscanf(fp, "%f %f %f",&tri_v[number.models-1][number.tri_verts-1].x,&tri_v[number.models-
  108. 1][number.tri_verts-1].y ,&tri_v[number.models-1][number.tri_verts-1].z);
  109. // printf("Vertex %d: %.10f %.10f %.10f\n",number.tri_verts-1,tri_v[number.models-
  110. 1][number.tri_verts-1].x,tri_v[number.models-1][number.tri_verts-1].y,tri_v[number.models-
  111. 1][number.tri_verts-1].z);
  112. {
  113. {{{
  114. fclose(fp);
  115. fopen(FILE_NAME, "r");
  116. /* QUAD */
  117. while(!feof(fp)){
  118. fscanf(fp, "%s",txt);
  119. if(strcmp(txt,"QUAD")==0){
  120. //printf("\nQuads:\n");
  121. for(counter=0; counter!=4;counter++)
  122. }
  123. /* Normal 1 */
  124. fscanf(fp, "%s",txt);
  125. if(strcmp(txt,"n")==0){
  126. number.quad_norms++;
  127. quad_n[number.models-1] = realloc(quad_n[number.models-1], (number.quad_norms * sizeof
  128. *quad_n[number.models-1]));
  129. fscanf(fp, "%f %f %f\n", &quad_n[number.models-1][number.quad_norms-1].x,
  130. &quad_n[number.models-1][number.quad_norms-1].y, &quad_n[number.models-
  131. 1][number.quad_norms-1].z);//printf("Normal %d: %.10f %.10f %.10f\n",number.quad_norms-1, quad_n[number.models-
  132. 1][number.quad_norms-1].x, quad_n[number.models-1][number.quad_norms-1].y,
  133. quad_n[number.models-1][number.quad_norms-1].z);
  134. {
  135. /* Vertex 1 */
  136. fscanf(fp, "%s",txt);
  137. if(strcmp(txt,"v")==0){
  138. number.quad_verts++;
  139. quad_v[number.models-1] = realloc(quad_v[number.models-1], (number.quad_verts * sizeof
  140. *quad_v[number.models-1]));
  141. fscanf(fp, "%f %f %f\n", &quad_v[number.models-1][number.quad_verts-1].x,
  142. &quad_v[number.models-1][number.quad_verts-1].y, &quad_v[number.models-1][number.quad_verts-
  143. 1].z);
  144. //printf("Normal %d: %.10f %.10f %.10f\n",number.quad_verts-1, quad_v[number.models-
  145. 1][number.quad_verts-1].x, quad_v[number.models-1][number.quad_verts-1].y,
  146. quad_v[number.models-1][number.quad_verts-1].z);
  147. {
  148. {{
  149. {
  150. free(txt);fclose(fp);
  151. {
  152. int VBO(){
  153. glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) SDL_GL_GetProcAddress("glGenBuffersARB");
  154. glBindBufferARB = (PFNGLBINDBUFFERARBPROC) SDL_GL_GetProcAddress("glBindBufferARB");
  155. glBufferDataARB = (PFNGLBUFFERDATAARBPROC) SDL_GL_GetProcAddress("glBufferDataARB");
  156. glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)
  157. SDL_GL_GetProcAddress("glDeleteBuffersARB");
  158. /* Triangles Normals */
  159. glGenBuffersARB(1,&number.tri_vbon);
  160. glBindBufferARB(GL_ARRAY_BUFFER_ARB, number.tri_vbon);
  161. glBufferDataARB(GL_ARRAY_BUFFER_ARB,   number.tri_norms*3*sizeof(tri_vert), (void *)tri_n[1] ,
  162. GL_STATIC_DRAW_ARB );
  163. /* Triangles Vertices */
  164. glGenBuffersARB(1,&number.tri_vbo);
  165. glBindBufferARB(GL_ARRAY_BUFFER_ARB, number.tri_vbo);
  166. glBufferDataARB(GL_ARRAY_BUFFER_ARB,   number.tri_verts*3*sizeof(tri_vert), (void *)tri_v[1] ,
  167. GL_STATIC_DRAW_ARB );
  168. /* Quads Normals */
  169. glGenBuffersARB(1,&number.quad_vbon);
  170. glBindBufferARB(GL_ARRAY_BUFFER_ARB, number.quad_vbon);glBufferDataARB(GL_ARRAY_BUFFER_ARB, number.quad_norms*4*sizeof(quad_norm),(void
  171. *)quad_n[1] , GL_STATIC_DRAW_ARB);  
  172. /* Quads Vertices */
  173. glGenBuffersARB(1,&number.quad_vbo);
  174. glBindBufferARB(GL_ARRAY_BUFFER_ARB, number.quad_vbo);
  175. glBufferDataARB(GL_ARRAY_BUFFER_ARB, number.quad_verts*4*sizeof(quad_vert),(void *)quad_v[1] ,
  176. GL_STATIC_DRAW_ARB );
  177. {
  178. void GenWindow(struct window *win){
  179. win->width=1024;
  180. win->height=768;
  181. win->bpps=24;
  182. SDL_Init(SDL_INIT_VIDEO);
  183. SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
  184. SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,24);
  185. SDL_SetVideoMode(win->width,win->height,win->bpps,SDL_OPENGL|SDL_FULLSCREEN);
  186. glClearColor( 0, 0, 0, 0 );glViewport(0,0,win->width,win->height);
  187. glMatrixMode( GL_PROJECTION );
  188. glLoadIdentity( );
  189. printf("\n%dx%d@%d Window Created.\n", win->width, win->height, win->bpps);
  190. {
  191. void  scene(struct window *win){
  192.   register float ratio = (float) win->width / (float) win->height;    
  193. glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  194. glMatrixMode( GL_MODELVIEW );
  195. glLoadIdentity( );
  196. gluPerspective(50.0, ratio, 1.0, 10000);
  197. GLfloat lightAmbient[]  = {1.0f, 0.0f, 0.0f, 1.0f} ;      glEnable(GL_LIGHTING) ;
  198.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lightAmbient) ;
  199. GLfloat lightPosition[] = {9.7f, 9.0f, 0.0f, 0.0f} ;
  200. GLfloat lightDiffuse[]  = {1.0f, 1.0f, 1.0f, 1.0f} ;
  201. GLfloat lightSpecular[] = {1.0f, 1.0f, 1.0f, 1.0f} ;
  202. glEnable(GL_LIGHT0) ;
  203. glLightfv(GL_LIGHT0, GL_POSITION,lightPosition) ;
  204. glLightfv(GL_LIGHT0, GL_AMBIENT,lightAmbient) ;
  205. glLightfv(GL_LIGHT0, GL_DIFFUSE,lightDiffuse) ;
  206. glLightfv(GL_LIGHT0, GL_SPECULAR,lightSpecular) ;
  207. glEnable(GL_BLEND);
  208. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  209. glEnable(GL_LINE_SMOOTH);
  210. glShadeModel(GL_SMOOTH);
  211. glDisable(GL_CULL_FACE);
  212. glEnable(GL_DEPTH_TEST);
  213. glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
  214. glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);
  215. glTranslatef(i,n,-3.0f);glRotatef(1.0f+mousex,0.0f,1.0f,0.0f);
  216. glRotatef(1.0f+mousey,1.0f,0.0f,0.0f);
  217. /* triangles */
  218. glEnableClientState(GL_NORMAL_ARRAY);
  219. glBindBufferARB(GL_ARRAY_BUFFER_ARB, number.tri_vbon);
  220. glNormalPointer(GL_FLOAT, 0, (char *)NULL);
  221. glEnableClientState(GL_VERTEX_ARRAY);
  222. glBindBufferARB(GL_ARRAY_BUFFER_ARB, number.tri_vbo);
  223. glVertexPointer(3, GL_FLOAT,0,(char *)NULL );
  224. glDrawArrays(GL_TRIANGLES,0,number.tri_verts);
  225. glDisableClientState(GL_VERTEX_ARRAY);
  226. /* quads */
  227. glBindBufferARB(GL_ARRAY_BUFFER_ARB, number.quad_vbon);
  228. glNormalPointer(GL_FLOAT, 0, (char *)NULL);
  229. glEnableClientState(GL_VERTEX_ARRAY);
  230. glBindBufferARB(GL_ARRAY_BUFFER_ARB, number.quad_vbo);
  231. glVertexPointer(3, GL_FLOAT,0,(char *)NULL);
  232. glDrawArrays(GL_QUADS,0,number.quad_verts);glDisableClientState(GL_NORMAL_ARRAY);
  233. glDisableClientState(GL_VERTEX_ARRAY);
  234. SDL_GL_SwapBuffers();
  235. {
  236. int main(int argc, char* argv[]){
  237. struct window win;
  238. LoadModel();
  239. GenWindow(&win);
  240. VBO();
  241. SDL_EnableKeyRepeat(100,SDL_DEFAULT_REPEAT_INTERVAL);
  242. SDL_ShowCursor(SDL_DISABLE);
  243. do{
  244. input(&win);
  245. scene(&win);}while(1);
  246. return 0;}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement