Serious-Engine/Sources/Modeler/DlgInfoPgAnim.cpp
2016-03-11 18:20:51 -06:00

184 lines
5.1 KiB
C++

/* 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. */
// DlgInfoPgAnim.cpp : implementation file
//
#include "stdafx.h"
#ifdef _DEBUG
#undef new
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDlgInfoPgAnim property page
IMPLEMENT_DYNCREATE(CDlgInfoPgAnim, CPropertyPage)
CDlgInfoPgAnim::CDlgInfoPgAnim() : CPropertyPage(CDlgInfoPgAnim::IDD)
{
//{{AFX_DATA_INIT(CDlgInfoPgAnim)
m_strCurrentFrame = _T("");
m_strFramesInAnim = _T("");
m_strAnimName = _T("");
m_strTimePassed = _T("");
m_strAnimState = _T("");
m_strAnimationLenght = _T("");
m_strNoOfAnimations = _T("");
m_strNoOfFrames = _T("");
m_fAnimSpeed = 0.0f;
//}}AFX_DATA_INIT
theApp.m_pPgInfoAnim = this;
}
CDlgInfoPgAnim::~CDlgInfoPgAnim()
{
}
void CDlgInfoPgAnim::SetAnimPageFromView(CModelerView* pModelerView)
{
CAnimInfo aiInfo;
CModelInfo miModelInfo;
char value[20];
ASSERT( pModelerView != NULL);
/* Get current model's info */
pModelerView->m_ModelObject.GetModelInfo( miModelInfo);
INDEX iMipModel = pModelerView->m_ModelObject.GetMipModel( pModelerView->m_fCurrentMipFactor);
/* Number of animations in model */
sprintf( value, "%d", pModelerView->m_ModelObject.GetAnimsCt());
m_strNoOfAnimations = value;
sprintf( value, "%d", miModelInfo.mi_FramesCt);
m_strNoOfFrames = value;
INDEX i = pModelerView->m_ModelObject.GetAnim();
pModelerView->m_ModelObject.GetAnimInfo( i, aiInfo);
FLOAT tmPassed = pModelerView->m_ModelObject.GetPassedTime();
INDEX iCurrentFrame = pModelerView->m_ModelObject.GetFrame();
BOOL bIsPaused = pModelerView->m_ModelObject.IsPaused();
/* Now we will fill animation page variables ...*/
m_strAnimName = aiInfo.ai_AnimName;
sprintf( value, "%d", aiInfo.ai_NumberOfFrames);
m_strFramesInAnim = value;
sprintf( value, "%d (%d)", INDEX(tmPassed/aiInfo.ai_SecsPerFrame), iCurrentFrame);
m_strCurrentFrame = value;
sprintf( value, "%.4f", tmPassed);
m_strTimePassed = value;
sprintf( value, "%.4f", aiInfo.ai_NumberOfFrames*aiInfo.ai_SecsPerFrame);
m_strAnimationLenght = value;
if( bIsPaused)
{
m_strAnimState = "Paused";
}
else
{
m_strAnimState = "Playing";
}
}
void CDlgInfoPgAnim::DoDataExchange(CDataExchange* pDX)
{
CModelerView *pModelerView = CModelerView::GetActiveView();
if( pModelerView == NULL) return;
CModelerDoc* pDoc = theApp.GetDocument();
// if dialog is recieving data
if(pDX->m_bSaveAndValidate == FALSE)
{
SetAnimPageFromView( pModelerView);
// mark that the values have been updated to reflect the state of the view
m_udAllValues.MarkUpdated();
}
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgInfoPgAnim)
DDX_Text(pDX, IDC_ANIM_CURRENT_FRAME, m_strCurrentFrame);
DDX_Text(pDX, IDC_ANIM_FRAMES, m_strFramesInAnim);
DDX_Text(pDX, IDC_ANIM_NAME, m_strAnimName);
DDX_Text(pDX, IDC_ANIM_TIME_PASSED, m_strTimePassed);
DDX_Text(pDX, IDC_ANIM_STATE, m_strAnimState);
DDX_Text(pDX, IDC_ANIMATION_LENGHT, m_strAnimationLenght);
DDX_Text(pDX, IDC_NO_OF_ANIMATIONS, m_strNoOfAnimations);
DDX_Text(pDX, IDC_NO_OF_FRAMES, m_strNoOfFrames);
//}}AFX_DATA_MAP
CAnimInfo aiInfo;
INDEX iAnim = pModelerView->m_ModelObject.GetAnim();
pModelerView->m_ModelObject.GetAnimInfo( iAnim, aiInfo);
if(pDX->m_bSaveAndValidate == TRUE)
{
DDX_SkyFloat(pDX, IDC_ANIM_SPEED, m_fAnimSpeed);
}
else if( m_fAnimSpeed != aiInfo.ai_SecsPerFrame)
{
m_fAnimSpeed = aiInfo.ai_SecsPerFrame;
DDX_SkyFloat(pDX, IDC_ANIM_SPEED, m_fAnimSpeed);
}
// if dialog is giving data
if(pDX->m_bSaveAndValidate == TRUE)
{
if( (m_fAnimSpeed > 0) && (m_fAnimSpeed<100) )
{
pDoc->m_emEditModel.edm_md.SetSpeed( iAnim, m_fAnimSpeed);
}
}
}
BEGIN_MESSAGE_MAP(CDlgInfoPgAnim, CPropertyPage)
//{{AFX_MSG_MAP(CDlgInfoPgAnim)
ON_EN_CHANGE(IDC_ANIM_SPEED, OnChangeAnimSpeed)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgInfoPgAnim message handlers
BOOL CDlgInfoPgAnim::OnIdle(LONG lCount)
{
CModelerView *pModelerView = CModelerView::GetActiveView();
ASSERT(pModelerView != NULL);
// refresh info frame size
((CMainFrame *)( theApp.m_pMainWnd))->m_pInfoFrame->SetSizes();
UpdateData(FALSE);
return TRUE;
}
void CDlgInfoPgAnim::OnChangeAnimSpeed()
{
UpdateData(TRUE);
}
BOOL CDlgInfoPgAnim::OnSetActive()
{
m_fAnimSpeed = -1;
return CPropertyPage::OnSetActive();
}