/* Copyright (c) 2002-2012 Croteam Ltd. 
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as published by
the Free Software Foundation


This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */

// DlgInfoPgMip.cpp : implementation file
//

#include "stdafx.h"

#ifdef _DEBUG
#undef new
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlgInfoPgMip property page

IMPLEMENT_DYNCREATE(CDlgInfoPgMip, CPropertyPage)

CDlgInfoPgMip::CDlgInfoPgMip() : CPropertyPage(CDlgInfoPgMip::IDD)
{
	//{{AFX_DATA_INIT(CDlgInfoPgMip)
	m_strCurrentMipModel = _T("");
	m_strModelDistance = _T("");
	m_strCurrentMipFactor = _T("");
	m_strModelMipSwitchFactor = _T("");
	m_strNoOfPolygons = _T("");
	m_strNoOfVertices = _T("");
	m_strNoOfTriangles = _T("");
	m_bHasPatches = FALSE;
	m_bHasAttachedModels = FALSE;
	//}}AFX_DATA_INIT
  theApp.m_pPgInfoMip = this;
}

void CDlgInfoPgMip::SetMipPageFromView(CModelerView* pModelerView)
{
  CModelInfo miModelInfo;
  char value[20];
  ASSERT( pModelerView != NULL);
  CModelerDoc *pDoc = pModelerView->GetDocument();

  /* Get current model's info */
  pModelerView->m_ModelObject.GetModelInfo( miModelInfo);
  INDEX iMipModel = pModelerView->m_ModelObject.GetMipModel( pModelerView->m_fCurrentMipFactor);

  if( !pModelerView->m_ModelObject.IsModelVisible(pModelerView->m_fCurrentMipFactor) )
  {
    m_strCurrentMipModel = "Not visible";
    m_strNoOfTriangles = "0";
    m_strNoOfVertices = "0";
    m_strNoOfPolygons = "0";
  }
  else
  {
    sprintf( value, "%d/%d", iMipModel, miModelInfo.mi_MipCt);
    m_strCurrentMipModel = value;
    sprintf( value, "%d", miModelInfo.mi_MipInfos[ iMipModel].mi_TrianglesCt);
    m_strNoOfTriangles = value;
    sprintf( value, "%d", miModelInfo.mi_MipInfos[ iMipModel].mi_VerticesCt);
    m_strNoOfVertices = value;
    sprintf( value, "%d", miModelInfo.mi_MipInfos[ iMipModel].mi_PolygonsCt);
    m_strNoOfPolygons = value;
  }
  sprintf( value, "%.1f m", pModelerView->GetModelToViewerDistance());  
  m_strModelDistance = value;
  sprintf( value, "%.3f", pModelerView->m_fCurrentMipFactor);
  m_strCurrentMipFactor = value;
  sprintf( value, "%.3f", pDoc->m_emEditModel.edm_md.md_MipSwitchFactors[iMipModel]);
  m_strModelMipSwitchFactor = value;

  ModelMipInfo *pMMIFirst = &pDoc->m_emEditModel.edm_md.md_MipInfos[ iMipModel];
  // if patches are visible for current mip model
  if( pMMIFirst->mmpi_ulFlags & MM_PATCHES_VISIBLE)
  {
    m_bHasPatches = TRUE;
  }
  else
  {
    m_bHasPatches = FALSE;
  }

  // if patches are visible for current mip model
  if( pMMIFirst->mmpi_ulFlags & MM_ATTACHED_MODELS_VISIBLE)
  {
    m_bHasAttachedModels = TRUE;
  }
  else
  {
    m_bHasAttachedModels = FALSE;
  }
}

void CDlgInfoPgMip::SetViewFromMipPage(CModelerView* pModelerView)
{
}

CDlgInfoPgMip::~CDlgInfoPgMip()
{
}

void CDlgInfoPgMip::DoDataExchange(CDataExchange* pDX)
{
  CModelerView *pModelerView = CModelerView::GetActiveMappingNormalView();
  if(pModelerView == NULL) return;

  if( !pDX->m_bSaveAndValidate)  // if zero, model sets property sheet's data
  {
    SetMipPageFromView( pModelerView);
    // mark that the values have been updated to reflect the state of the view
    m_udAllValues.MarkUpdated();
  }

	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgInfoPgMip)
	DDX_Text(pDX, IDC_CURRENT_MIP_MODEL, m_strCurrentMipModel);
	DDX_Text(pDX, IDC_MODEL_DISTANCE, m_strModelDistance);
	DDX_Text(pDX, IDC_CURRENT_FACTOR, m_strCurrentMipFactor);
	DDX_Text(pDX, IDC_MODEL_SWITCH_FACTOR, m_strModelMipSwitchFactor);
	DDX_Text(pDX, IDC_NO_OF_POLYGONS, m_strNoOfPolygons);
	DDX_Text(pDX, IDC_NO_OF_VERTICES, m_strNoOfVertices);
	DDX_Text(pDX, IDC_NO_OF_TRIANGLES, m_strNoOfTriangles);
	DDX_Check(pDX, IDC_HAS_PATCHES, m_bHasPatches);
	DDX_Check(pDX, IDC_HAS_ATTACHED_MODELS, m_bHasAttachedModels);
	//}}AFX_DATA_MAP

  if( pDX->m_bSaveAndValidate)
  {
    SetViewFromMipPage( pModelerView);
  }
}


BEGIN_MESSAGE_MAP(CDlgInfoPgMip, CPropertyPage)
	//{{AFX_MSG_MAP(CDlgInfoPgMip)
	ON_BN_CLICKED(IDC_HAS_PATCHES, OnHasPatches)
	ON_BN_CLICKED(IDC_HAS_ATTACHED_MODELS, OnHasAttachedModels)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgInfoPgMip message handlers

BOOL CDlgInfoPgMip::OnIdle(LONG lCount)
{
  CModelerView *pModelerView = CModelerView::GetActiveMappingNormalView();

  ASSERT(pModelerView != NULL);

  if (!theApp.m_chGlobal.IsUpToDate(m_udAllValues) ||
      !pModelerView->m_ModelObject.IsUpToDate(m_udAllValues) ||
      !theApp.m_chPlacement.IsUpToDate(m_udAllValues)) {
    UpdateData(FALSE);
  }

  // refresh info frame size
  ((CMainFrame *)( theApp.m_pMainWnd))->m_pInfoFrame->SetSizes();
  return TRUE;
}

void CDlgInfoPgMip::ToggleMipFlag( ULONG ulFlag)
{
  CModelerView *pModelerView = CModelerView::GetActiveMappingNormalView();
  ASSERT(pModelerView != NULL);
  CModelerDoc *pDoc = pModelerView->GetDocument();
  ASSERT(pDoc != NULL);

  ModelMipInfo *pMMIFirst = &pDoc->m_emEditModel.edm_md.md_MipInfos[ pDoc->m_iCurrentMip];
  BOOL bSetting = (pMMIFirst->mmpi_ulFlags & ulFlag) == 0;
  // if setting, set just for this mip model
  if( bSetting)
  {
    pMMIFirst->mmpi_ulFlags |= ulFlag;
  }
  // if clearing, clear for all further mip models
  else
  {
    for( INDEX iMip=pDoc->m_iCurrentMip; iMip<pDoc->m_emEditModel.edm_md.md_MipCt; iMip++)
    {
      // get requested mip model
      ModelMipInfo *pMMI = &pDoc->m_emEditModel.edm_md.md_MipInfos[ iMip];
      // if setting, set just for this mip model
      pMMI->mmpi_ulFlags &= ~ulFlag;
    }
  }
  
  // for patcehs
  if( ulFlag == MM_PATCHES_VISIBLE)
  {
    // reaclculate patch-polygon connections
    pDoc->m_emEditModel.CalculatePatchesPerPolygon();
  }
  
  pDoc->UpdateAllViews(NULL);
  UpdateData( FALSE);
}

void CDlgInfoPgMip::OnHasPatches() 
{
  ToggleMipFlag( MM_PATCHES_VISIBLE);
}

void CDlgInfoPgMip::OnHasAttachedModels() 
{
  ToggleMipFlag( MM_ATTACHED_MODELS_VISIBLE);
}