Iwao Dev

気付いたことをメモしています.

この画面は、簡易表示です

2014 / 8月

xcode + glut

「Command Line Tool」としてプロジェクトを作成.
「GLUT」を追加.


10.9 になったこと?により出力される次の様なワーニングをでない様にするために 10.8 に.
/Users/Iwao/…/main.cpp:116:2: ‘glutInit’ is deprecated: first deprecated in OS X 10.9

インクルードパス設定場所は,「Build Settings」−「Search Paths」−「Header Search Paths」
glut.h のインクルードは以下の様にしている.
  #ifdef __APPLE_CC__
    #include <GLUT/glut.h>
  #else
    #include <GL/glut.h>
  #endif



  にほんブログ村 IT技術ブログへ


OpenGL Programing Guide

何年も前に買った本(1995年8月10日第4刷となってる)で,中に含まれるサンプルを実行できる様にしてみた.
OpenGL Programing Guide
サンプルのソースで,<gl\glut.h> のインクルードは最初に移動.


glut
opengl.org
  GLUT and OpenGL Utility Libraries
    GLUT – The OpenGL Utility Toolkit
      Nate Robin’s GLUT for Windows page
glut32.dll は,system32 などへ.
glut.h は,~\Include\gl へ.
glut32.lib は,~\Lib へ.


セレクション
::glRenderMode(GL_SELECT) の後の ::glRenderMode(GL_RENDER) で,セレクションヒット数が得られる.
::glGetIntegerv(GL_RENDER_MODE) で現在のモードを取得可能.
セレクションバッファの内容
  名前の深さ?
  Z min
  Z max
  名前 …


2014/09/04
時間がかかったがなんとか GLUT ではできた.


2014/09/08
今度は,VXxxxView を使用した SDI.exe での手順.
ビューの OnDropFiles で,ファイルの種類により glRenderMode GL_SELECT , GL_RENDER を呼ぶ様に変更.
  CMainFrame::OnDropFile で条件により CXxxxView::OnDropFile を呼び出し.
  glGetIntegerv(GL_RENDER_MODE,…) で GL_SELECT が返ってこない.
    wglMakeCurrent を呼んでなかったので,効果がなかった.
  今度は,GL_SELECT にならない.GL_INVALID_OPERATION となる.
    ヘルプにある様に,glSelectBuffer を呼んでなかった.
CPickSView::OnDropFiles
  GetOpGLP()->MakeCurrent(TRUE) ;
  if (…) {
    ::glSelectBuffer(BUFSIZE,selBuf) ;
    ::glRenderMode(GL_SELECT) ;
    }
  else {
    ::glRenderMode(GL_RENDER) ;
    }
  GetOpGLP()->MakeCurrent(FALSE) ;


2014/09/10

PickS.2014.09.09.zip
マウスの Y 方向の位置が合ってない.
その exe を Win 7 環境で動かすと,

デバッグ用に ::glGetIntegerv(GL_RENDER_MODE,…) のために GetOpGLP()->MakeCurrent(…) していた.
  MakeCurrent(FALSE) で SwapBuffers を呼んでいる.


マウスの Y 方向は,縦長だと合っていそう.横長だとその長い分だけ Y 方向にずれている?

コの字型の平面方向で,座標はそれなりにとれている.::gluUnProject の z は Depth / 0xffffffff .
gulUnProject の y の与え方が違っていた.
viewPort[3] – pt.y としていたが,それではダメみたいで,GetClientRect の Height() としてうまくいってそう.
PickS.2014.09.10.zip
まだ ::gluPickMatrix の方がうまくできてない.


2014/09/11
平面図にして,1 つの直方体がウィンドウいっぱいに表示される状態で選択すると,

どうもピック領域のサイズが,ウィンドウの大きさになっているような感じ.
20 Picking and Using Selection 20. ピッキングとセレクションの使い方 を参考にしているが,…


::gluPickMatrix を呼ぶタイミングが悪かったのが原因.
ある程度予想はしていたが,OpGL::Projection の中のため,その関数を分割する必要がありそう.
その関数内の OpenGL の呼び出しは,
  ::glMatrixMode(GL_PROJECTION) ;
  ::glLoadIdentity() ;
  //  ここ
  ::glOrtho(r.l,r.r,r.b,r.t, zNear,zFar) ;  /  ::gluPerspective(deg(angle),aspect, zNear,zFar) ;
  ::glViewport((GLint)win.l,(GLint)win.b,(GLint)(win.r-win.l),(GLint)(win.t-win.b)) ;
glLoadIdentity() の後に ::gluPickMatrix を呼ばなければならない.
PickS.2014.09.11.zip


2014/09/18
汎用的なコードにするため,コードを見直しているがなかなか進まない.
例えば,マウスの移動で選択されているものを表示しようとすると,テクスチャありでは遅くて使えない.
また,その時の表示で PgonsA の描画を抜き出したコードだと何とか見れるが PartsA::Draw 相当だと遅い.
PickS.2014.09.18.zip




  にほんブログ村 IT技術ブログへ


COleDataSource を利用した Drag

以前 DoDragDrop で少し調べたが,その時は途中になっていた.
その時の内容で,例えば CListBox に表示されてるファイルリストのすべてを,CListBox の外側でドラッグするすることはできる.
  void CDragLBDlg::OnLButtonDown(UINT nFlags, CPoint point)
  {
    CStringArray sa ;
    ::ToStringArray(FileNames,&sa) ;
    ::StringArrayToDoDragFiles(sa) ;
    }


CListCtrl であれば,OnBegindragXxxx が利用できるので,
  void CDragLVDlg::OnBegindragListFiles(NMHDR* pNMHDR, LRESULT* pResult)
  {
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    {
      CStringArray sa ;
      for (int index=0 ; index<m_ListFiles.GetItemCount() ; index++) {
        if (m_ListFiles.GetItemState(index,LVIS_SELECTED) == LVIS_SELECTED) {
          tstring str = FileNames[index] ;
          sa.Add(str.c_str()) ;
          }
        }
      if (sa.GetSize() > 0) {
        ::StringArrayToDoDragFiles(sa) ;
        }
      }
    *pResult = 0;
    }


今回やりたかったのは,CListBox の項目のドラッグ.
ドラッグ部分は CListCtrl とほぼ同様となると思われるが,ドラッグ開始のタイミングが取れない.
CDragListBox と開始時の動きは似ているが,MFC のコードを見るとちょっと難しそう.
いろいろと検索すると,CListBox のサブクラス化で対応するみたいとわかったが,手順が...
動的なサブクラス化と言うらしい.
Inside Visual C++ には,囲み記事に CNonNumericEdit がある.
利用する手順はわかるが,作成する手順がわからない
今も利用はしている CView からの VXxxxView ファミリがあるが,10 年以上前で手順は覚えてない.


いろいろ探して「MFC クラスウィザード」を利用することがわかった.
今まで,よく見ていたダイアログなのに...

後は,WM_LBUTTONDOWN を処理する様にして,
  void CMyListBox::OnLButtonDown(UINT nFlags, CPoint point)
  {
    CListBox::OnLButtonDown(nFlags, point);
    int sel = GetCurSel() ;
    if (sel == LB_ERR) { return ; }
    CString str ;
    GetText(sel,str) ;
    CStringArray sa ;
    sa.Add(str) ;
    ::StringArrayToDoDragFiles(sa) ;
    }
ダイアログに追加したリスボックスで,これを利用する様にダイアログのヘッダを修正.


MSDN CTRLTEST サンプル
テクニカル ノート 14
標準コントロールからのコントロールの派生
[MSVC] MFCを使用しての動的サブクラス化
Create Client Windows, Drag and Drop Between Listboxes


2014/08/11 追記
COleDataSource を利用して,他の AP に CF_HDROP で渡そうとすると,
—————————
Microsoft Visual C++ Debug Library
—————————
Debug Assertion Failed!
Program: …Documents\Visual Studio 2010\Projects\TestVC10\Debug\T_SC.exe
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\cmdtarg.cpp
Line: 43
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
—————————
中止(A) 再試行(R) 無視(I)
—————————

COleDataSource の使い方が間違っていた.
開放する時に delete ではうまくない.
データ オブジェクトとデータ ソース : 作成と破棄



  にほんブログ村 IT技術ブログへ


VC のビルド時間

  A-T-r A-T-b A-E-r A-E-b B-I-r B-I-b
VC 6 35 6 160 12 380 21
VC 7 52 6 180 15 476 27
VC 7.1 73 11 295 24 745 41
VC 8 80 15 275 24 535 30
VC 9 25 9 100 12 220 15
VC 10 143 24 470 34 542 42
VC 11 150 21 475 31 505 38
VC 12 30 11 100 15 130 20



  にほんブログ村 IT技術ブログへ


モードレスダイアログの動作が,…

VC 7 以降,MDI AP のモードレスダイアログが独立して動作してしまう現象があった.
その AP は,VC 4 の頃作成したもので CMainFrame::OnCreate 内でモードレスダイアログを作成している.
VC 6 までは特に問題なかったが,VC 7 以降タスクバーにアイコンが 2 つ存在する状態になってしまっていた.
過去に何度か対応方法を調べたが,わからずそのままとなっていた.


今日別の事を調べていて,「モードレスダイアログで親子にならなくする」方法が目に留まった.
CDialog::Create で,デフォルトの NULL ではなく,GetDesktopWindow() を与えるというもの.
VC 7 AP のダイアログの情報を,Spy++ で見ると,親ウィンドウが (なし) になっている.
今度はデバッガで,Create の付近を追いかけると AfxGetMainWnd() で NULL がかえっている.
ThrdCore.cpp より
CWnd* CWinThread::GetMainWnd()
{
  if (m_pActiveWnd != NULL)
    return m_pActiveWnd;
  if (m_pMainWnd != NULL)
    return m_pMainWnd;
  return CWnd::GetActiveWindow();
}


CXxxApp::InitInstance で以下の部分を修正.
  CMainFrame* pMainFrame = new CMainFrame;
  m_pMainWnd = pMainFrame;   // ここを追加
  if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
    return FALSE;
  m_pMainWnd = pMainFrame;



  にほんブログ村 IT技術ブログへ



    top

    %d人のブロガーが「いいね」をつけました。