Serious-Engine/Sources/WorldEditor/WndAnimationFrames.cpp
2016-03-11 15:57:17 +02:00

324 lines
9.6 KiB
C++

/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */
// WndAnimationFrames.cpp : implementation file
//
#include "stdafx.h"
#include "WorldEditor.h"
#include "WndAnimationFrames.h"
#ifdef _DEBUG
#undef new
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define FRAME_BOX_WIDTH 10
#define KEY_FRAME_BOX_SIZE 4
/////////////////////////////////////////////////////////////////////////////
// CWndAnimationFrames
CWndAnimationFrames::CWndAnimationFrames()
{
m_pDrawPort = NULL;
m_pViewPort = NULL;
m_iSelectedFrame = 0;
m_iStartingFrame = 0;
m_iFramesInLine = 0;
}
CWndAnimationFrames::~CWndAnimationFrames()
{
}
BEGIN_MESSAGE_MAP(CWndAnimationFrames, CWnd)
//{{AFX_MSG_MAP(CWndAnimationFrames)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONDBLCLK()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWndAnimationFrames message handlers
BOOL CWndAnimationFrames::IsSelectedFrameKeyFrame(void)
{
// get curently selected light animation combo member
INDEX iLightAnimation = m_pParentDlg->GetSelectedLightAnimation();
// get animation data
CAnimData *pAD = m_pParentDlg->m_padAnimData;
// obtain information about animation
CAnimInfo aiInfo;
pAD->GetAnimInfo(iLightAnimation, aiInfo);
// get frame (color)
COLOR colorFrame = pAD->GetFrame(iLightAnimation, m_iSelectedFrame);
// if selected frame is visible and is key-frame and is not first or last frame
return ( ((colorFrame & 0x000000FF) == 0xFF) &&
IsFrameVisible( m_iSelectedFrame) &&
(m_iSelectedFrame != aiInfo.ai_NumberOfFrames-1) &&
(m_iSelectedFrame != 0) );
}
void CWndAnimationFrames::OnPaint()
{
{
CPaintDC dc(this); // device context for painting
}
if( (m_pViewPort == NULL) && (m_pDrawPort == NULL) )
{
// initialize canvas for active texture button
_pGfx->CreateWindowCanvas( m_hWnd, &m_pViewPort, &m_pDrawPort);
}
// calculate how many frames we have in one line
m_iFramesInLine = m_pDrawPort->GetWidth()/FRAME_BOX_WIDTH;
// if there is a valid drawport, and the drawport can be locked
if( (m_pDrawPort != NULL) && (m_pDrawPort->Lock()) )
{
// clear window background
m_pDrawPort->Fill( C_GRAY | CT_OPAQUE);
// get curently selected light animation combo member
INDEX iLightAnimation = m_pParentDlg->GetSelectedLightAnimation();
// get animation data
CAnimData *pAD = m_pParentDlg->m_padAnimData;
// obtain information about animation
CAnimInfo aiInfo;
pAD->GetAnimInfo(iLightAnimation, aiInfo);
// for all frames
for( INDEX iFrame=0; iFrame<aiInfo.ai_NumberOfFrames; iFrame++)
{
PIX pixX=(iFrame-m_iStartingFrame)*FRAME_BOX_WIDTH;
PIX pixY=0;
PIX pixDX=FRAME_BOX_WIDTH;
PIX pixDY=m_pDrawPort->GetHeight()-KEY_FRAME_BOX_SIZE*2;
// if frame is visible
if( IsFrameVisible( iFrame))
{
// get frame (color)
COLOR colorFrame = pAD->GetFrame(iLightAnimation, iFrame);
// draw solid rect
m_pDrawPort->Fill( pixX, pixY, pixDX, pixDY, colorFrame|CT_OPAQUE);
// if this is key-frame marker
if( (colorFrame & 0x000000FF) == 0xFF)
{
// calculate key-frame marker coordinates
PIX pixKFX = pixX+(FRAME_BOX_WIDTH-KEY_FRAME_BOX_SIZE)/2;
PIX pixKFY = pixDY+KEY_FRAME_BOX_SIZE;
// draw key-frame marker
m_pDrawPort->Fill( pixKFX, pixKFY, KEY_FRAME_BOX_SIZE, KEY_FRAME_BOX_SIZE, C_GREEN|CT_OPAQUE);
}
// if this is selected frame
if( iFrame == m_iSelectedFrame)
{
// set looks of rectangle
ULONG ulLineType = _FULL_;
// draw 3D button (outer edges black)
m_pDrawPort->DrawLine( pixX,pixY,pixX,pixY+pixDY, C_BLACK|CT_OPAQUE, ulLineType);
m_pDrawPort->DrawLine( pixX,pixY+pixDY,pixX+pixDX-1,pixY+pixDY, C_BLACK|CT_OPAQUE, ulLineType);
m_pDrawPort->DrawLine( pixX+pixDX-1,pixY+pixDY,pixX+pixDX-1,pixY, C_BLACK|CT_OPAQUE, ulLineType);
m_pDrawPort->DrawLine( pixX+pixDX-1,pixY,pixX,pixY, C_BLACK|CT_OPAQUE, ulLineType);
// draw inner edges
m_pDrawPort->DrawLine( pixX+1,pixY+1,pixX+1,pixY+pixDY-1, C_WHITE|CT_OPAQUE, ulLineType);
m_pDrawPort->DrawLine( pixX+1,pixY+pixDY-1,pixX+pixDX-2,pixY+pixDY-1, C_GRAY|CT_OPAQUE, ulLineType);
m_pDrawPort->DrawLine( pixX+pixDX-2,pixY+pixDY-1,pixX+pixDX-2,pixY+1, C_dGRAY|CT_OPAQUE, ulLineType);
m_pDrawPort->DrawLine( pixX+pixDX-2,pixY+1,pixX+1,pixY+1, C_WHITE|CT_OPAQUE, ulLineType);
}
}
}
// unlock the drawport
m_pDrawPort->Unlock();
// if there is a valid viewport
if (m_pViewPort!=NULL)
{
// swap it
m_pViewPort->SwapBuffers();
}
}
}
BOOL CWndAnimationFrames::IsFrameVisible(INDEX iFrame)
{
// get curently selected light animation combo member
INDEX iLightAnimation = m_pParentDlg->GetSelectedLightAnimation();
// obtain information about animation
CAnimInfo aiInfo;
// get animation data
CAnimData *pAD = m_pParentDlg->m_padAnimData;
pAD->GetAnimInfo(iLightAnimation, aiInfo);
if( (iFrame>=m_iStartingFrame) &&
(iFrame<(m_iStartingFrame+m_iFramesInLine)) &&
(iFrame>=0) &&
(iFrame<aiInfo.ai_NumberOfFrames) )
{
return TRUE;
}
return FALSE;
}
// clears key-frame marker on selected frame
void CWndAnimationFrames::DeleteSelectedFrame( void)
{
if( !IsFrameVisible( m_iSelectedFrame)) return;
// get curently selected light animation combo member
INDEX iLightAnimation = m_pParentDlg->GetSelectedLightAnimation();
// get animation data
CAnimData *pAD = m_pParentDlg->m_padAnimData;
// obtain information about animation
CAnimInfo aiInfo;
pAD->GetAnimInfo(iLightAnimation, aiInfo);
// if this is first or last frame in animation, no deletion is allowed
if( (m_iSelectedFrame == 0) || (m_iSelectedFrame == (aiInfo.ai_NumberOfFrames-1)) ) return;
// get frame (color) for selected frame
COLOR colorFrame = pAD->GetFrame(iLightAnimation, m_iSelectedFrame);
// clear key-frame marker
pAD->SetFrame(iLightAnimation, m_iSelectedFrame, colorFrame&0xFFFFFF00);
// spread frames
m_pParentDlg->SpreadFrames();
// redraw window
Invalidate( FALSE);
}
void CWndAnimationFrames::OnLButtonDown(UINT nFlags, CPoint point)
{
// get clicked frame
INDEX iFrame = point.x/FRAME_BOX_WIDTH+m_iStartingFrame;
// return if frame is not visible (clicked beyond last frame)
if( !IsFrameVisible(iFrame)) return;
Invalidate(FALSE);
// if clicked frame was not selected previously
if( iFrame != m_iSelectedFrame)
{
// select clicked frame
m_iSelectedFrame = iFrame;
m_pParentDlg->UpdateData( FALSE);
// return
return;
}
// select clicked frame
m_iSelectedFrame = iFrame;
m_pParentDlg->UpdateData( FALSE);
// get curently selected light animation combo member
INDEX iLightAnimation = m_pParentDlg->GetSelectedLightAnimation();
// get animation data
CAnimData *pAD = m_pParentDlg->m_padAnimData;
COLORREF newFrameColor = CLRF_CLR( pAD->GetFrame(iLightAnimation, iFrame));
if( MyChooseColor( newFrameColor, *m_pParentDlg) )
{
// set new key frame value
pAD->SetFrame(iLightAnimation, iFrame, CLR_CLRF(newFrameColor)|0x000000FF);
// spread frames
m_pParentDlg->SpreadFrames();
// redraw window
Invalidate( FALSE);
m_pParentDlg->UpdateData( FALSE);
m_pParentDlg->m_bChanged = TRUE;
}
CWnd::OnLButtonDown(nFlags, point);
}
void CWndAnimationFrames::OnLButtonDblClk(UINT nFlags, CPoint point)
{
OnLButtonDown(nFlags, point);
CWnd::OnLButtonDblClk(nFlags, point);
}
void CWndAnimationFrames::ScrollLeft(void)
{
if( m_iStartingFrame > 0)
{
// scroll left
m_iStartingFrame --;
// redraw
Invalidate(FALSE);
m_pParentDlg->UpdateData( FALSE);
}
}
void CWndAnimationFrames::ScrollRight(void)
{
// get curently selected light animation combo member
INDEX iLightAnimation = m_pParentDlg->GetSelectedLightAnimation();
// obtain information about animation
CAnimInfo aiInfo;
// get animation data
CAnimData *pAD = m_pParentDlg->m_padAnimData;
pAD->GetAnimInfo(iLightAnimation, aiInfo);
// calculate possible new starting frame
INDEX iNewLastDisplayedFrame = m_iStartingFrame+1+m_iFramesInLine;
// if new last displayed frame is valid
if( iNewLastDisplayedFrame <= aiInfo.ai_NumberOfFrames)
{
// scroll page right
m_iStartingFrame ++;
// redraw
Invalidate(FALSE);
m_pParentDlg->UpdateData( FALSE);
}
}
void CWndAnimationFrames::ScrollPgLeft()
{
if( (m_iStartingFrame-m_iFramesInLine) > 0)
{
// scroll page left
m_iStartingFrame -= m_iFramesInLine;
}
else
{
m_iStartingFrame=0;
}
// redraw
Invalidate(FALSE);
m_pParentDlg->UpdateData( FALSE);
}
void CWndAnimationFrames::ScrollPgRight()
{
// get curently selected light animation combo member
INDEX iLightAnimation = m_pParentDlg->GetSelectedLightAnimation();
// obtain information about animation
CAnimInfo aiInfo;
// get animation data
CAnimData *pAD = m_pParentDlg->m_padAnimData;
pAD->GetAnimInfo(iLightAnimation, aiInfo);
// calculate possible new starting frame
INDEX iNewStart = m_iStartingFrame+m_iFramesInLine;
// if new start frame is valid one
if( iNewStart < aiInfo.ai_NumberOfFrames)
{
// scroll page right
m_iStartingFrame = iNewStart;
// redraw
Invalidate(FALSE);
m_pParentDlg->UpdateData( FALSE);
}
}
void CWndAnimationFrames::OnDestroy()
{
CWnd::OnDestroy();
if( m_pViewPort != NULL)
{
_pGfx->DestroyWindowCanvas( m_pViewPort);
m_pViewPort = NULL;
}
m_pViewPort = NULL;
m_pDrawPort = NULL;
}