169 lines
4.4 KiB
C++
169 lines
4.4 KiB
C++
/*
|
|
** Command & Conquer Renegade(tm)
|
|
** Copyright 2025 Electronic Arts Inc.
|
|
**
|
|
** This program is free software: you can redistribute it and/or modify
|
|
** it under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation, either version 3 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** 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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
// AnimMixingPage.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "w3dview.h"
|
|
#include "W3dViewDoc.h"
|
|
#include "AdvancedAnimSheet.h"
|
|
#include "AnimMixingPage.h"
|
|
|
|
#include "RendObj.h"
|
|
#include "HTree.h"
|
|
#include "HAnim.h"
|
|
#include "Utils.h"
|
|
#include "AssetMgr.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAnimMixingPage property page
|
|
|
|
IMPLEMENT_DYNCREATE(CAnimMixingPage, CPropertyPage)
|
|
|
|
CAnimMixingPage::CAnimMixingPage(CAdvancedAnimSheet *sheet)
|
|
: CPropertyPage(CAnimMixingPage::IDD),
|
|
m_Sheet(sheet)
|
|
{
|
|
//{{AFX_DATA_INIT(CAnimMixingPage)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
CAnimMixingPage::~CAnimMixingPage()
|
|
{
|
|
}
|
|
|
|
void CAnimMixingPage::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAnimMixingPage)
|
|
DDX_Control(pDX, IDC_ANIMATION_LIST, m_AnimList);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CAnimMixingPage, CPropertyPage)
|
|
//{{AFX_MSG_MAP(CAnimMixingPage)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAnimMixingPage message handlers
|
|
|
|
BOOL CAnimMixingPage::OnInitDialog()
|
|
{
|
|
CPropertyPage::OnInitDialog();
|
|
|
|
ASSERT(m_Sheet != NULL);
|
|
FillListCtrl();
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
|
|
void CAnimMixingPage::FillListCtrl (void)
|
|
{
|
|
// Get the current render object and it's HTree. If it doesn't have
|
|
// an HTree, then it's not animating and we're not interested.
|
|
RenderObjClass *robj = ::GetCurrentDocument()->GetDisplayedObject();
|
|
if (robj == NULL)
|
|
return;
|
|
const HTreeClass *htree = robj->Get_HTree();
|
|
if (htree == NULL)
|
|
return;
|
|
|
|
// Get a sorted array of animations that affect the currently active object.
|
|
HAnimClass **anim = m_Sheet->GetAnims();
|
|
int anim_count = m_Sheet->GetAnimCount();
|
|
|
|
// Add an item to the list view for each animation.
|
|
int i;
|
|
for (i = 0; i < anim_count; i++)
|
|
m_AnimList.InsertItem(i, anim[i]->Get_Name());
|
|
}
|
|
|
|
void CAnimMixingPage::OnOK()
|
|
{
|
|
/*
|
|
** Create a new HAnimCombo class containing the animations selected by the user.
|
|
*/
|
|
int num_selected = m_AnimList.GetSelectedCount();
|
|
RenderObjClass *current_obj = ::GetCurrentDocument()->GetDisplayedObject();
|
|
const char *obj_name = current_obj->Get_Name();
|
|
RenderObjClass *robj = WW3DAssetManager::Get_Instance()->Create_Render_Obj(obj_name);
|
|
if (num_selected > 0 && robj != NULL)
|
|
{
|
|
HAnimClass **anim = m_Sheet->GetAnims();
|
|
|
|
HAnimComboClass *combo = new HAnimComboClass(num_selected);
|
|
ASSERT(combo != NULL);
|
|
|
|
POSITION pos = m_AnimList.GetFirstSelectedItemPosition();
|
|
int array_idx, idx = 0;
|
|
while (pos)
|
|
{
|
|
array_idx = m_AnimList.GetNextSelectedItem(pos);
|
|
combo->Set_Motion(idx, anim[array_idx]);
|
|
combo->Set_Weight(idx, 1.0f);
|
|
combo->Peek_Anim_Combo_Data(idx)->Build_Active_Pivot_Map();
|
|
idx++;
|
|
}
|
|
|
|
/*
|
|
** Set this new combo to be used by the doc.
|
|
*/
|
|
::GetCurrentDocument()->PlayAnimation(robj, combo);
|
|
robj->Release_Ref();
|
|
}
|
|
|
|
CPropertyPage::OnOK();
|
|
}
|
|
|
|
BOOL CAnimMixingPage::OnKillActive()
|
|
{
|
|
/*
|
|
** Update the parent with info on the current selection.
|
|
*/
|
|
m_Sheet->m_SelectedAnims.Clear();
|
|
m_Sheet->m_SelectedAnims.Resize(m_AnimList.GetSelectedCount());
|
|
|
|
int selected_idx, i=0;
|
|
POSITION pos = m_AnimList.GetFirstSelectedItemPosition();
|
|
while (pos)
|
|
{
|
|
selected_idx = m_AnimList.GetNextSelectedItem(pos);
|
|
if (!m_Sheet->m_SelectedAnims.Add(selected_idx))
|
|
{
|
|
char buf[128];
|
|
sprintf(buf, "Failed to insert item %d! Talk to Andre if "\
|
|
"you see this message.", i);
|
|
MessageBox(buf);
|
|
}
|
|
i++;
|
|
}
|
|
|
|
return CPropertyPage::OnKillActive();
|
|
}
|