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