home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 8090 / ModelEdit.7z / GenLodDlg.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2006-03-08  |  4.8 KB  |  229 lines

  1. // GenLodDlg.cpp : implementation file
  2. //
  3.  
  4. #include "precompile.h"
  5. #include "modeledit.h"
  6. #include "genloddlg.h"
  7. #include "lodedit.h"
  8.  
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14.  
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CGenLodDlg dialog
  17.  
  18.  
  19. CGenLodDlg::CGenLodDlg(CWnd* pParent /*=NULL*/)
  20.     : CDialog(CGenLodDlg::IDD, pParent)
  21. {
  22.     //{{AFX_DATA_INIT(CGenLodDlg)
  23.     m_PieceWeight = 0.0f;
  24.     //}}AFX_DATA_INIT
  25. }
  26.  
  27.  
  28. void CGenLodDlg::DoDataExchange(CDataExchange* pDX)
  29. {
  30.     CDialog::DoDataExchange(pDX);
  31.     //{{AFX_DATA_MAP(CGenLodDlg)
  32.     DDX_Control(pDX, IDC_PIECELIST, m_PieceList);
  33.     DDX_Control(pDX, IDC_MINIMUM_NODE_POLIES, m_MinimumNodePolies);
  34.     DDX_Control(pDX, IDC_MAXEDGELENGTH, m_MaxEdgeLength);
  35.     DDX_Control(pDX, IDC_LODS, m_LODs);
  36.     DDX_Text(pDX, IDC_PIECEWEIGHT, m_PieceWeight);
  37.     DDV_MinMaxFloat(pDX, m_PieceWeight, 0.f, 500.f);
  38.     //}}AFX_DATA_MAP
  39. }
  40.  
  41.  
  42. BEGIN_MESSAGE_MAP(CGenLodDlg, CDialog)
  43.     //{{AFX_MSG_MAP(CGenLodDlg)
  44.     ON_BN_CLICKED(IDC_EDITLOD, OnEditLOD)
  45.     ON_BN_CLICKED(IDC_REMOVELOD, OnRemoveLOD)
  46.     ON_BN_CLICKED(IDC_ADDLOD, OnAddLOD)
  47.     ON_LBN_SELCHANGE(IDC_PIECELIST, OnSelchangePiecelist)
  48.     ON_EN_UPDATE(IDC_PIECEWEIGHT, OnUpdatePieceweight)
  49.     //}}AFX_MSG_MAP
  50. END_MESSAGE_MAP()
  51.  
  52.  
  53.  
  54. /////////////////////////////////////////////////////////////////////////////
  55. /////////////////////////////////////////////////////////////////////////////
  56.  
  57. void CGenLodDlg::FillLODList()
  58. {
  59.     int iSel;
  60.     LODRequestInfo *pLOD;
  61.     char str[512];
  62.     DWORD i;
  63.  
  64.     iSel = m_LODs.GetCurSel();
  65.     m_LODs.ResetContent();
  66.  
  67.     for(i=0; i < m_pRequest->m_LODInfos; i++)
  68.     {
  69.         pLOD = &m_pRequest->m_LODInfos[i];
  70.  
  71.         sprintf(str, "LOD: %d, Dist: %.1f, %% Triangles: %.0f",
  72.             i,
  73.             pLOD->m_Dist,
  74.             ((float)pLOD->m_nTris * 100.0f) / m_pRequest->m_pModel->CalcNumTris());
  75.  
  76.         m_LODs.AddString(str);
  77.     }
  78.  
  79.     if(iSel == LB_ERR)
  80.         iSel = 0;
  81.         
  82.     m_LODs.SetCurSel(iSel);
  83. }
  84.  
  85.  
  86. void CGenLodDlg::SortLODs()
  87. {
  88.     DWORD i;
  89.     BOOL bHappy;
  90.     LODRequestInfo tempLOD;
  91.  
  92.     if(m_pRequest->m_LODInfos.GetSize() < 2)
  93.         return;
  94.     
  95.     do
  96.     {
  97.         bHappy = TRUE;
  98.  
  99.         for(i=0; i < m_pRequest->m_LODInfos.GetSize()-1; i++)
  100.         {
  101.             if(m_pRequest->m_LODInfos[i].m_Dist > m_pRequest->m_LODInfos[i+1].m_Dist)
  102.             {
  103.                 tempLOD = m_pRequest->m_LODInfos[i];
  104.                 m_pRequest->m_LODInfos[i] = m_pRequest->m_LODInfos[i+1];
  105.                 m_pRequest->m_LODInfos[i+1] = tempLOD;
  106.                 bHappy = FALSE;
  107.             }
  108.         }
  109.     }
  110.     while(!bHappy);
  111. }
  112.  
  113.  
  114. /////////////////////////////////////////////////////////////////////////////
  115. // CGenLodDlg message handlers
  116.  
  117. BOOL CGenLodDlg::OnInitDialog() 
  118. {
  119.     CString theStr;
  120.     DWORD i;
  121.  
  122.     CDialog::OnInitDialog();
  123.  
  124.     // Fill the piece list.
  125.     for(i=0; i < m_pRequest->m_pModel->NumPieces(); i++)
  126.     {
  127.         m_PieceList.AddString(m_pRequest->m_pModel->GetPiece(i)->GetName());
  128.     }
  129.  
  130.     m_PieceList.SetCurSel(0);
  131.     m_PieceWeight = m_pRequest->GetPieceWeight(0);
  132.     UpdateData(FALSE);    
  133.     
  134.     theStr.FormatMessage(IDS_GENERIC_NUM_STRING, 1000);
  135.     m_MaxEdgeLength.SetWindowText((LPCTSTR)theStr);
  136.  
  137.     theStr.FormatMessage(IDS_GENERIC_NUM_STRING, 8);
  138.     m_MinimumNodePolies.SetWindowText((LPCTSTR)theStr);
  139.  
  140.     SortLODs();
  141.     FillLODList();
  142.     return TRUE;  // return TRUE unless you set the focus to a control
  143.                   // EXCEPTION: OCX Property Pages should return FALSE
  144. }
  145.  
  146.  
  147.  
  148. void CGenLodDlg::OnOK() 
  149. {
  150.     TCHAR theText[256];
  151.  
  152.  
  153.     m_MaxEdgeLength.GetWindowText(theText, 256);
  154.     m_pRequest->m_MaxEdgeLength = (float)atof(theText);
  155.  
  156.     m_MinimumNodePolies.GetWindowText(theText, 256);
  157.     m_pRequest->m_nMinPieceTris = atoi(theText);
  158.  
  159.     CDialog::OnOK();
  160. }
  161.  
  162.  
  163. void CGenLodDlg::OnAddLOD() 
  164. {
  165.     LODEdit dlg;
  166.     LODRequestInfo info;
  167.  
  168.     if(dlg.DoModal() == IDOK)
  169.     {
  170.         dlg.ToLOD(m_pRequest->m_pModel, &info);
  171.         m_pRequest->m_LODInfos.Append(info);
  172.         SortLODs();
  173.         FillLODList();
  174.     }
  175. }
  176.  
  177.  
  178. void CGenLodDlg::OnEditLOD() 
  179. {
  180.     DWORD curSel;
  181.     LODEdit dlg;
  182.     LODRequestInfo info;
  183.  
  184.     curSel = (DWORD)m_LODs.GetCurSel();
  185.     if(curSel < m_pRequest->m_LODInfos.GetSize())
  186.     {
  187.         dlg.FromLOD(m_pRequest->m_pModel, &m_pRequest->m_LODInfos[curSel]);
  188.         if(dlg.DoModal() == IDOK)
  189.         {
  190.             dlg.ToLOD(m_pRequest->m_pModel, &info);
  191.             m_pRequest->m_LODInfos[curSel] = info;
  192.             SortLODs();
  193.             FillLODList();
  194.         }
  195.     }
  196. }
  197.  
  198. void CGenLodDlg::OnRemoveLOD() 
  199. {
  200.     DWORD curSel;
  201.  
  202.     curSel = (DWORD)m_LODs.GetCurSel();
  203.     if(curSel < m_pRequest->m_LODInfos.GetSize())
  204.     {
  205.         m_pRequest->m_LODInfos.Remove(curSel);
  206.         FillLODList();
  207.     }
  208. }
  209.  
  210.  
  211. void CGenLodDlg::OnSelchangePiecelist() 
  212. {
  213.     m_PieceWeight = m_pRequest->GetPieceWeight((DWORD)m_PieceList.GetCurSel());
  214.     UpdateData(FALSE);
  215. }
  216.  
  217. void CGenLodDlg::OnUpdatePieceweight() 
  218. {
  219.     DWORD iPiece;
  220.  
  221.  
  222.     iPiece = (DWORD)m_PieceList.GetCurSel();
  223.     if(iPiece < m_pRequest->m_PieceWeights)
  224.     {
  225.         UpdateData(TRUE);
  226.         m_pRequest->m_PieceWeights[iPiece] = m_PieceWeight;
  227.     }
  228. }
  229.