/* 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. */

// WndTestAnimation.cpp : implementation file
//

#include "stdafx.h"
#include "WorldEditor.h"
#include "WndTestAnimation.h"

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

/////////////////////////////////////////////////////////////////////////////
// CWndTestAnimation

CWndTestAnimation::CWndTestAnimation()
{
  m_pDrawPort = NULL;
  m_pViewPort = NULL;
  // mark that timer is not yet started
  m_iTimerID = -1;
}

CWndTestAnimation::~CWndTestAnimation()
{
}


BEGIN_MESSAGE_MAP(CWndTestAnimation, CWnd)
	//{{AFX_MSG_MAP(CWndTestAnimation)
	ON_WM_PAINT()
	ON_WM_TIMER()
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CWndTestAnimation message handlers

void CWndTestAnimation::OnPaint() 
{
  {
  CPaintDC dc(this); // device context for painting
  }

  if( m_iTimerID == -1)
  {
    m_iTimerID = (int) SetTimer( 1, 50, NULL);
  }

  if( (m_pViewPort == NULL) && (m_pDrawPort == NULL) )
  {
    // initialize canvas for active texture button
    _pGfx->CreateWindowCanvas( m_hWnd, &m_pViewPort, &m_pDrawPort);
  }

  // if there is a valid drawport, and the drawport can be locked
  if( (m_pDrawPort != NULL) && (m_pDrawPort->Lock()) )
  {
    // get curently selected light animation combo member
    INDEX iLightAnimation = m_pParentDlg->GetSelectedLightAnimation();
    // if animation has changed
    if( iLightAnimation != m_aoAnimObject.GetAnim() )
    {
      // start new animation
      m_aoAnimObject.StartAnim( iLightAnimation);
    }
    // get current frame (color)
    SLONG col0, col1;
    FLOAT fRatio;
    m_aoAnimObject.GetFrame(col0, col1, fRatio);
    COLOR colorFrame = LerpColor(col0, col1, fRatio);

    // clear window background to black
    m_pDrawPort->Fill( colorFrame | CT_OPAQUE);
    // unlock the drawport
    m_pDrawPort->Unlock();
    // if there is a valid viewport
    if (m_pViewPort!=NULL)
    {
      // swap it
      m_pViewPort->SwapBuffers();
    }
  }
}

static TIME timeLastTick=TIME(0);
void CWndTestAnimation::OnTimer(UINT nIDEvent) 
{
	// on our timer discard test animation window
  if( nIDEvent == 1)
  {
    TIME timeCurrentTick = _pTimer->GetRealTimeTick();
    if( timeCurrentTick > timeLastTick )
    {
      _pTimer->SetCurrentTick( timeCurrentTick);
      timeLastTick = timeCurrentTick;
    }
    Invalidate(FALSE);	
  }

	CWnd::OnTimer(nIDEvent);
}

void CWndTestAnimation::OnDestroy() 
{
  KillTimer( m_iTimerID);
  _pTimer->SetCurrentTick( 0.0f);
	CWnd::OnDestroy();

  if( m_pViewPort != NULL)
  {
    _pGfx->DestroyWindowCanvas( m_pViewPort);
    m_pViewPort = NULL;
  }

  m_pViewPort = NULL;
  m_pDrawPort = NULL;
}