セレクション機能

オープンソース公開の為にソースをいじっていたらセレクション機能があると便利かもと思い、作ることに。

ポリゴンを選択できる機能があれば、選択したポリゴンを始点にストリップを作成する機能が付けられる。
これは面白いし、ストリップのコードをデバッグしやすくなると思った。

ちょっとネットを見ればOpenGLを使ったサンプルコードはいっぱいあるのでみ、詳細ここでは書きません。
一番よかった記事はFrequently Asked Questions


でも、僕のソースはglutを使わない方針&OpenGLの描画領域がウィンドウサイズとは異なるの2点で随分苦労しました。

それからもうひとつはまったのは、OpenGLのセレクション機能を使って適当にバッファから取ってくるのでは、自分の環境だとダメでした。

ということで、ちゃんとバッファ内の値を比べて一番手前っぽいものを選択する処理を加えました。

  // OpenGLに渡すバッファはselection変数
  GLint hits = ::glRenderMode(GL_RENDER);
  if( hits <= 0 ){
	delete  selection;
	return -2;
  }
  int retval = selection[3];//暫定的にバッファ先頭のデータを一番手前とする
  double min_near = (double)selection[1]/(double)0x7fffffff;//暫定の値を
  for( int i = 0; i < hits; i ++){
	unsigned int n = selection[i*4 + 0];
	double near = (double)selection[i*4 + 1] / (double)0x7fffffff;
	//double far  = (double)selection[i*4 + 2] / (double)0x7fffffff;
	int select_index = selection[i*4 + 3];// most near polygon
        //比較して、手前なら値を切り替える
	if( min_near > near ){
	  retval = select_index;
	}
  }
  delete  selection;
  return retval;