PageRenderTime 44ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/samples/tokoi/sprite1/main.php

https://github.com/yoya/phpopengl
PHP | 250 lines | 134 code | 51 blank | 65 comment | 5 complexity | b85a9fe2e566c529168a94a126c5f9df MD5 | raw file
  1. <?php
  2. /*
  3. * http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20060227
  4. */
  5. require_once 'particle.php';
  6. /*
  7. ** 光源
  8. */
  9. $lightpos = array( 0.0, 0.0, 1.0, 0.0 ); /* 位置    */
  10. $lightcol = array( 1.0, 1.0, 1.0, 1.0 ); /* 直接光強度 */
  11. $lightamb = array( 0.1, 0.1, 0.1, 1.0 ); /* 環境光強度 */
  12. /*
  13. ** パーティクル
  14. */
  15. define('MAX_PARTICLES', 800);
  16. $psize = 0;
  17. $distance = array( 0.0, 0.0, 1.0 );
  18. /*
  19. ** 地面の高さ
  20. */
  21. define('HEIGHT', -1.0);
  22. /*
  23. ** テクスチャ
  24. */
  25. define('TEXWIDTH', 64); /* テクスチャの幅    */
  26. define('TEXHEIGHT', 64); /* テクスチャの高さ   */
  27. $texture = "ball.raw"; /* テクスチャファイル名 */
  28. /*
  29. ** 初期化
  30. */
  31. function init()
  32. {
  33. /* テクスチャ画像の読み込み */
  34. global $texture;
  35. global $distance;
  36. $imagedata = file_get_contents($texture);
  37. if ($imagedata === false) {
  38. echo "$texture が開けません".PHP_EOL;
  39. }
  40. $image = str_split($imagedata);
  41. /* テクスチャ画像はバイト単位に詰め込まれている */
  42. glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
  43. /* テクスチャを拡大・縮小する方法の指定 */
  44. // glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
  45. glTexParameteri(GL_TEXTURE_2D, 0, GL_TRUE);
  46. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  47. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  48. /* テクスチャの繰り返し方法の指定 */
  49. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  50. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  51. /* テクスチャ環境 */
  52. glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  53. glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
  54. /* テクスチャの割り当て */
  55. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEXWIDTH, TEXHEIGHT, 0,
  56. GL_RGBA, GL_UNSIGNED_BYTE, $image);
  57. /* アルファテストの判別関数 */
  58. glAlphaFunc(GL_GREATER, 0.5);
  59. /* 距離に対する点の大きさの制御 */
  60. // glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, $distance);
  61. /* 初期設定 */
  62. glClearColor(0.3, 0.3, 1.0, 0.0);
  63. glEnable(GL_DEPTH_TEST);
  64. glDisable(GL_CULL_FACE);
  65. /* 陰影付けを無効にする */
  66. glDisable(GL_LIGHTING);
  67. /* 地面の高さ */
  68. particle::height(HEIGHT);
  69. }
  70. /*
  71. ** シーンの描画
  72. */
  73. function scene()
  74. {
  75. global $particles;
  76. global $psize;
  77. /* パーティクルを生成する */
  78. if (count($particles) >= MAX_PARTICLES) {
  79. array_pop($particles);
  80. }
  81. $particles []= new particle();
  82. /* テクスチャマッピング開始 */
  83. glEnable(GL_TEXTURE_2D);
  84. /* Point Sprite を有効にする */
  85. glEnable(GL_POINT_SPRITE);
  86. /* アルファテストを有効にする */
  87. glEnable(GL_ALPHA_TEST);
  88. /* パーティクルを描く */
  89. glColor3d(1.0, 1.0, 1.0);
  90. glPointSize($psize);
  91. glBegin(GL_POINTS);
  92. foreach ($particles as $ip) {
  93. glVertex3dv($ip->getPosition());
  94. $ip->update();
  95. }
  96. glEnd();
  97. /* アルファテストを無効にする */
  98. glDisable(GL_ALPHA_TEST);
  99. /* Point Sprite を無効にする */
  100. glDisable(GL_POINT_SPRITE);
  101. /* テクスチャマッピング終了 */
  102. glDisable(GL_TEXTURE_2D);
  103. }
  104. /****************************
  105. ** GLUT のコールバック関数 **
  106. ****************************/
  107. require_once 'trackball.php';
  108. function display()
  109. {
  110. global $lightpos;
  111. /* モデルビュー変換行列の初期化 */
  112. glMatrixMode(GL_MODELVIEW);
  113. glLoadIdentity();
  114. /* 光源の位置を設定 */
  115. glLightfv(GL_LIGHT0, GL_POSITION, $lightpos);
  116. /* 視点の移動(物体の方を奥に移動)*/
  117. glTranslated(0.0, 0.0, -3.0);
  118. /* トラックボール処理による回転 */
  119. glMultMatrixd(trackball::Rotation());
  120. /* 画面クリア */
  121. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  122. /* シーンの描画 */
  123. scene();
  124. /* ダブルバッファリング */
  125. glutSwapBuffers();
  126. }
  127. function resize($w, $h)
  128. {
  129. global $psize;
  130. /* 点の大きさを設定する */
  131. $psize = $w * 0.1;
  132. /* トラックボールする範囲 */
  133. trackball::Region($w, $h);
  134. /* ウィンドウ全体をビューポートにする */
  135. glViewport(0, 0, $w, $h);
  136. /* 透視変換行列の指定 */
  137. glMatrixMode(GL_PROJECTION);
  138. /* 透視変換行列の初期化 */
  139. glLoadIdentity();
  140. gluPerspective(60.0, (float)$w / (float)$h, 1.0, 100.0);
  141. }
  142. function idle()
  143. {
  144. /* 画面の描き替え */
  145. glutPostRedisplay();
  146. }
  147. function mouse($button, $state, $x, $y)
  148. {
  149. switch ($button) {
  150. case GLUT_LEFT_BUTTON:
  151. switch ($state) {
  152. case GLUT_DOWN:
  153. /* トラックボール開始 */
  154. trackball::Start($x, $y);
  155. break;
  156. case GLUT_UP:
  157. /* トラックボール停止 */
  158. trackball::Stop($x, $y);
  159. break;
  160. default:
  161. break;
  162. }
  163. break;
  164. default:
  165. break;
  166. }
  167. }
  168. function motion($x, $y)
  169. {
  170. /* トラックボール移動 */
  171. trackball::Motion($x, $y);
  172. }
  173. function keyboard($key, $x, $y)
  174. {
  175. switch ($key) {
  176. case 'q':
  177. case 'Q':
  178. case '\033':
  179. /* ESC か q か Q をタイプしたら終了 */
  180. exit(0);
  181. default:
  182. break;
  183. }
  184. }
  185. /*
  186. ** メインプログラム
  187. */
  188. glutInit($argv);
  189. glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
  190. glutCreateWindow($argv[0]);
  191. glutDisplayFunc('display');
  192. glutReshapeFunc('resize');
  193. glutIdleFunc('idle');
  194. glutMouseFunc('mouse');
  195. glutMotionFunc('motion');
  196. glutKeyboardFunc('keyboard');
  197. init();
  198. glutMainLoop();
  199. exit (0);