Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.42 KB | None | 0 0
  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <GL/glut.h>
  6. #include "RgbImage.h"
  7.  
  8.  
  9. #define frand() ((float)rand()/RAND_MAX)
  10. #define MAX_PARTICULAS 2500
  11.  
  12.  
  13.  
  14. //---------------------------------------- Particle attributes
  15. typedef struct {
  16. float size; // tamanho
  17. float life; // vida
  18. float fade; // fade
  19. float r, g, b; // color
  20. GLfloat x, y, z; // posicao
  21. GLfloat vx, vy, vz; // velocidade
  22. GLfloat ax, ay, az; // aceleracao
  23. } Particle;
  24.  
  25. Particle particula1[MAX_PARTICULAS];
  26. GLint milisec = 1000;
  27.  
  28.  
  29. //---------------------------------------------- Texturas
  30. GLuint texture[1];
  31. RgbImage imag;
  32.  
  33. char filename[1][12] = { "brilho0.bmp" };
  34.  
  35. void initTextures()
  36. {
  37. //----------------------------------------- Cubo
  38. glGenTextures(1, texture);
  39. for (int i=0;i<1;i++)
  40. {
  41. imag.LoadBmpFile(filename[i]);
  42. glBindTexture(GL_TEXTURE_2D, texture[i]);
  43. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  44. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  45. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  46. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  47. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  48. glTexImage2D(GL_TEXTURE_2D, 0, 3,
  49. imag.GetNumCols(),
  50. imag.GetNumRows(), 0, GL_RGB, GL_UNSIGNED_BYTE,
  51. imag.ImageData());
  52. }
  53. }
  54.  
  55.  
  56. //==========================================================
  57. void iniParticulas(Particle *particula)
  58. {
  59. GLfloat v, theta, phi;
  60. int i;
  61. GLfloat px, py, pz;
  62. GLfloat ps;
  63.  
  64. px = -20.0;
  65. py = 200.0;
  66. pz = -200.0;
  67. ps = 4.5;
  68.  
  69.  
  70.  
  71. for(i=0; i<MAX_PARTICULAS; i++) {
  72.  
  73. //---------------------------------
  74. v = 1*frand()+0.02;
  75. theta = 2.0*frand()*M_PI; // [0..2pi]
  76. phi = frand()*M_PI; // [0.. pi]
  77.  
  78. particula[i].size = ps ; // tamanh de cada particula
  79. particula[i].x = px + 0.1*frand()*px; // [-200 200]
  80. particula[i].y = py + 0.1*frand()*py; // [-200 200]
  81. particula[i].z = pz + 0.1*frand()*pz; // [-200 200]
  82.  
  83. particula[i].vx = v * cos(theta) * sin(phi); // esferico
  84. particula[i].vy = v * cos(phi);
  85. particula[i].vz = v * sin(theta) * sin(phi);
  86. particula[i].ax = 0.01f;
  87. particula[i].ay = -0.01f;
  88. particula[i].az = 0.015f;
  89.  
  90. particula[i].r = 1.0f;
  91. particula[i].g = 1.0f;
  92. particula[i].b = 1.0f;
  93. particula[i].life = 1.0f;
  94. particula[i].fade = 0.001f; // Em 100=1/0.01 iteracoes desaparece
  95. }
  96. }
  97.  
  98.  
  99. //==================================================================== INIT _ openGL
  100. void iniOpenGL(void)
  101. {
  102. glClearColor(0.0f,0.0f,0.0f,0.0f);
  103. glEnable(GL_DEPTH_TEST);
  104. glEnable(GL_BLEND);
  105. glBlendFunc(GL_SRC_ALPHA,GL_ONE);
  106. glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
  107. glEnable(GL_TEXTURE_2D);
  108. initTextures();
  109. iniParticulas(particula1);
  110.  
  111. }
  112.  
  113.  
  114. void showParticulas(Particle *particula, int sistema) {
  115. int i;
  116. int numero;
  117.  
  118. numero=(int) (frand()*10.0);
  119.  
  120. for (i=0; i<MAX_PARTICULAS; i++)
  121. {
  122.  
  123. glColor4f(1,1,1, particula[i].life);
  124. glBegin(GL_QUADS);
  125. glTexCoord2d(0,0); glVertex3f(particula[i].x -particula[i].size, particula[i].y -particula[i].size, particula[i].z);
  126. glTexCoord2d(1,0); glVertex3f(particula[i].x +particula[i].size, particula[i].y -particula[i].size, particula[i].z);
  127. glTexCoord2d(1,1); glVertex3f(particula[i].x +particula[i].size, particula[i].y +particula[i].size, particula[i].z);
  128. glTexCoord2d(0,1); glVertex3f(particula[i].x -particula[i].size, particula[i].y +particula[i].size, particula[i].z);
  129. glEnd();
  130. particula[i].x += particula[i].vx;
  131. particula[i].y += particula[i].vy;
  132. particula[i].z += particula[i].vz;
  133. particula[i].vx += particula[i].ax;
  134. particula[i].vy += particula[i].ay;
  135. particula[i].vz += particula[i].az;
  136. particula[i].life -= particula[i].fade;
  137. }
  138.  
  139. }
  140. //================================================================ DRAW main
  141. void display(void)
  142. {
  143.  
  144.  
  145. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  146.  
  147. glMatrixMode(GL_PROJECTION);
  148. glLoadIdentity();
  149. gluPerspective(75.0f,1.0f,0.1f,1400.0f);
  150. glMatrixMode(GL_MODELVIEW);
  151. glLoadIdentity();
  152. gluLookAt (250.0, 200.0, 250.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  153.  
  154.  
  155. showParticulas(particula1, 1);
  156.  
  157. glutSwapBuffers();
  158.  
  159. }
  160.  
  161.  
  162. //========================================== Functions
  163. void idle(void)
  164. {
  165.  
  166. glutPostRedisplay();
  167.  
  168. }
  169.  
  170. void Timer(int value)
  171. {
  172. iniParticulas(particula1);
  173.  
  174. glutPostRedisplay();
  175. glutTimerFunc(milisec ,Timer, 1); //.. Espera msecDelay milisegundos
  176. }
  177.  
  178.  
  179. void keyboard(unsigned char key, int x, int y)
  180. {
  181. int numero;
  182.  
  183. switch (key)
  184. {
  185. case 'E': case 'e':
  186. iniParticulas(particula1);
  187.  
  188.  
  189. break;
  190. //--------------------------- Escape
  191. case 27:
  192. exit(0);
  193. break;
  194. }
  195. }
  196.  
  197. //================================================================
  198. int main(int argc, char **argv)
  199. {
  200. glutInit(&argc, argv);
  201. glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
  202. glutInitWindowSize (600, 600);
  203. glutInitWindowPosition (200, 100);
  204. glutCreateWindow ("Sistema de Particulas en OpenGL");
  205. iniOpenGL();
  206. glutDisplayFunc(display);
  207. glutKeyboardFunc(keyboard);
  208. glutIdleFunc(idle);
  209. glutTimerFunc(milisec , Timer, 1); //.. função callback
  210.  
  211. glutMainLoop();
  212. return 0;
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement