summaryrefslogtreecommitdiff
path: root/vgui2/dme_controls/dmedageditpanel.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /vgui2/dme_controls/dmedageditpanel.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'vgui2/dme_controls/dmedageditpanel.cpp')
-rw-r--r--vgui2/dme_controls/dmedageditpanel.cpp1011
1 files changed, 1011 insertions, 0 deletions
diff --git a/vgui2/dme_controls/dmedageditpanel.cpp b/vgui2/dme_controls/dmedageditpanel.cpp
new file mode 100644
index 0000000..0703627
--- /dev/null
+++ b/vgui2/dme_controls/dmedageditpanel.cpp
@@ -0,0 +1,1011 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================
+
+#include "vstdlib/random.h"
+#include "dme_controls/dmedageditpanel.h"
+#include "dme_controls/dmedagrenderpanel.h"
+#include "dme_controls/dmepanel.h"
+#include "vgui_controls/Button.h"
+#include "vgui_controls/Splitter.h"
+#include "vgui_controls/PropertySheet.h"
+#include "vgui_controls/PropertyPage.h"
+#include "vgui_controls/Label.h"
+#include "vgui_controls/ScrollBar.h"
+#include "vgui_controls/Slider.h"
+#include "vgui_controls/ScrollableEditablePanel.h"
+#include "vgui_controls/ListPanel.h"
+#include "vgui_controls/Image.h"
+#include "vgui_controls/TextImage.h"
+#include "vgui/ISurface.h"
+#include "vgui/ischeme.h"
+#include "vgui/iinput.h"
+#include "vgui/IVGui.h"
+#include "vgui/cursor.h"
+#include "movieobjects/dmemakefile.h"
+#include "movieobjects/dmemdlmakefile.h"
+#include "movieobjects/dmedccmakefile.h"
+#include "movieobjects/dmedag.h"
+#include "movieobjects/dmeclip.h"
+#include "movieobjects/dmeanimationlist.h"
+#include "movieobjects/dmecombinationoperator.h"
+#include "movieobjects/dmeanimationset.h"
+
+#include "tier1/KeyValues.h"
+#include "materialsystem/imesh.h"
+#include "dme_controls/BaseAnimationSetEditor.h"
+#include "dme_controls/BaseAnimSetAttributeSliderPanel.h"
+//-----------------------------------------------------------------------------
+//
+// Hook into the dme panel editor system
+//
+//-----------------------------------------------------------------------------
+IMPLEMENT_DMEPANEL_FACTORY( CDmeDagEditPanel, DmeDag, "DmeDagPreview2", "DmeDag Previewer 2", false );
+IMPLEMENT_DMEPANEL_FACTORY( CDmeDagEditPanel, DmeSourceSkin, "DmeSourceSkinPreview2", "MDL Skin Previewer 2", false );
+IMPLEMENT_DMEPANEL_FACTORY( CDmeDagEditPanel, DmeSourceAnimation, "DmeSourceAnimationPreview2", "MDL Animation Previewer 2", false );
+IMPLEMENT_DMEPANEL_FACTORY( CDmeDagEditPanel, DmeDCCMakefile, "DmeMakeFileOutputPreview2", "DCC MakeFile Output Previewer 2", false );
+
+
+//-----------------------------------------------------------------------------
+// Slider panel
+//-----------------------------------------------------------------------------
+class CDmeAnimationListPanel : public vgui::EditablePanel
+{
+ DECLARE_CLASS_SIMPLE( CDmeAnimationListPanel, vgui::EditablePanel );
+
+public:
+ // constructor, destructor
+ CDmeAnimationListPanel( vgui::Panel *pParent, const char *pName );
+ virtual ~CDmeAnimationListPanel();
+
+ void SetAnimationList( CDmeAnimationList *pList );
+ void RefreshAnimationList();
+ const char *GetSelectedAnimation() const;
+
+private:
+ // Called when the selection changes moves
+ MESSAGE_FUNC( OnItemSelected, "ItemSelected" );
+ MESSAGE_FUNC( OnItemDeselected, "ItemDeselected" );
+
+ vgui::ListPanel *m_pAnimationList;
+ CDmeHandle< CDmeAnimationList > m_hAnimationList;
+};
+
+
+static int __cdecl AnimationNameSortFunc( vgui::ListPanel *pPanel, const vgui::ListPanelItem &item1, const vgui::ListPanelItem &item2 )
+{
+ const char *string1 = item1.kv->GetString("name");
+ const char *string2 = item2.kv->GetString("name");
+ return Q_stricmp( string1, string2 );
+}
+
+
+//-----------------------------------------------------------------------------
+// constructor, destructor
+//-----------------------------------------------------------------------------
+CDmeAnimationListPanel::CDmeAnimationListPanel( vgui::Panel *pParent, const char *pName ) :
+ BaseClass( pParent, pName )
+{
+ m_pAnimationList = new vgui::ListPanel( this, "AnimationList" );
+ m_pAnimationList->AddColumnHeader( 0, "name", "name", 100, 0 );
+ m_pAnimationList->AddActionSignalTarget( this );
+ m_pAnimationList->SetSortFunc( 0, AnimationNameSortFunc );
+ m_pAnimationList->SetSortColumn( 0 );
+ m_pAnimationList->SetEmptyListText("No animations");
+ m_pAnimationList->SetMultiselectEnabled( false );
+
+ LoadControlSettingsAndUserConfig( "resource/dmeanimationlistpanel.res" );
+}
+
+CDmeAnimationListPanel::~CDmeAnimationListPanel()
+{
+}
+
+
+//-----------------------------------------------------------------------------
+// Sets the combination operator
+//-----------------------------------------------------------------------------
+void CDmeAnimationListPanel::SetAnimationList( CDmeAnimationList *pList )
+{
+ if ( pList != m_hAnimationList.Get() )
+ {
+ m_hAnimationList = pList;
+ RefreshAnimationList();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Builds the list of animations
+//-----------------------------------------------------------------------------
+void CDmeAnimationListPanel::RefreshAnimationList()
+{
+ m_pAnimationList->RemoveAll();
+ if ( !m_hAnimationList.Get() )
+ return;
+
+ int nCount = m_hAnimationList->GetAnimationCount();
+ for ( int i = 0; i < nCount; ++i )
+ {
+ CDmeChannelsClip *pAnimation = m_hAnimationList->GetAnimation( i );
+ KeyValues *pItemKeys = new KeyValues( "node", "name", pAnimation->GetName() );
+ m_pAnimationList->AddItem( pItemKeys, 0, false, false );
+ }
+
+ m_pAnimationList->SortList();
+}
+
+
+//-----------------------------------------------------------------------------
+// Returns the selected animation
+//-----------------------------------------------------------------------------
+const char *CDmeAnimationListPanel::GetSelectedAnimation() const
+{
+ if ( m_pAnimationList->GetSelectedItemsCount() == 0 )
+ return "";
+
+ int nIndex = m_pAnimationList->GetSelectedItem( 0 );
+ KeyValues *pItemKeyValues = m_pAnimationList->GetItem( nIndex );
+ return pItemKeyValues->GetString( "name" );
+}
+
+
+//-----------------------------------------------------------------------------
+// Called when an animation is selected or deselected
+//-----------------------------------------------------------------------------
+void CDmeAnimationListPanel::OnItemSelected( )
+{
+ const char *pAnimationName = GetSelectedAnimation();
+ PostActionSignal( new KeyValues( "AnimationSelected", "animationName", pAnimationName ) );
+}
+
+void CDmeAnimationListPanel::OnItemDeselected( )
+{
+ PostActionSignal( new KeyValues( "AnimationDeselected" ) );
+}
+
+class CDmeCombinationOperatorPanel : public CBaseAnimationSetEditor
+{
+ DECLARE_CLASS_SIMPLE( CDmeCombinationOperatorPanel, CBaseAnimationSetEditor );
+public:
+ CDmeCombinationOperatorPanel( vgui::Panel *parent, const char *panelName );
+ virtual ~CDmeCombinationOperatorPanel();
+
+ virtual void OnTick();
+
+ void SetCombinationOperator( CDmeCombinationOperator *pOp );
+ void RefreshCombinationOperator();
+
+private:
+ void CreateFakeAnimationSet( );
+ void DestroyFakeAnimationSet( );
+
+ // Adds new controls to the animation set
+ void AddNewAnimationSetControls();
+
+ // Removes a controls from all presets
+ void RemoveAnimationControlFromPresets( const char *pControlName );
+
+ // Removes a controls from all presets
+ void RemoveAnimationControlFromSelectionGroups( const char *pControlName );
+
+ // Removes controls from the animation set that aren't used
+ void RemoveUnusedAnimationSetControls();
+
+ // Modify controls in the presets which have had stereo or multilevel settings changed
+ void ModifyExistingAnimationSetControls();
+
+ // Modify controls in the presets which have had stereo or multilevel settings changed
+ void ModifyExistingAnimationSetPresets( CDmElement *pControlElement );
+
+ // Modify controls which have had stereo or multilevel settings changed
+ void ModifyExistingAnimationSetControl( CDmElement *pControlElement );
+
+ // Creates the procedural presets
+ void ComputeProceduralPresets();
+
+ void RefreshAnimationSet();
+
+ // Sort control names to match the combination controls
+ void SortAnimationSetControls();
+
+ // Sets preset values
+ void GenerateProceduralPresetValues( CDmElement *pPreset, CDmElement *pControl, bool bIdentity, float flForceValue );
+ void GenerateProceduralPresetValues( CDmElement *pPreset, const CDmrElementArray< CDmElement > &controls, bool bIdentity, float flForceValue = -1.0f );
+
+ CDmeHandle< CDmeCombinationOperator > m_hCombinationOperator;
+};
+
+
+//-----------------------------------------------------------------------------
+// Constructor/destructor
+//-----------------------------------------------------------------------------
+CDmeCombinationOperatorPanel::CDmeCombinationOperatorPanel( vgui::Panel *parent, const char *panelName ) :
+ BaseClass( parent, panelName, false )
+{
+ CreateFakeAnimationSet();
+ vgui::ivgui()->AddTickSignal( GetVPanel(), 0 );
+}
+
+CDmeCombinationOperatorPanel::~CDmeCombinationOperatorPanel()
+{
+ DestroyFakeAnimationSet();
+}
+
+
+//-----------------------------------------------------------------------------
+// Create, destroy fake animation sets
+//-----------------------------------------------------------------------------
+void CDmeCombinationOperatorPanel::CreateFakeAnimationSet( )
+{
+ m_AnimSet = CreateElement< CDmeAnimationSet >( "fakeSet", DMFILEID_INVALID );
+ m_AnimSet->SetValue( "gameModel", DMELEMENT_HANDLE_INVALID );
+ g_pDataModel->DontAutoDelete( m_AnimSet->GetHandle() );
+}
+
+void CDmeCombinationOperatorPanel::DestroyFakeAnimationSet( )
+{
+ DestroyElement( m_AnimSet, TD_DEEP );
+}
+
+
+//-----------------------------------------------------------------------------
+// Sets combination ops + animation sets
+//-----------------------------------------------------------------------------
+void CDmeCombinationOperatorPanel::SetCombinationOperator( CDmeCombinationOperator *pOp )
+{
+ // The Animation Set Editor Doesn't Handle Passing The Same Animation Set With
+ // Different Data In It Very Well
+ DestroyFakeAnimationSet();
+ CreateFakeAnimationSet();
+
+ if ( pOp != m_hCombinationOperator.Get() )
+ {
+ m_hCombinationOperator = pOp;
+ RefreshCombinationOperator();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Sets preset values
+//-----------------------------------------------------------------------------
+void CDmeCombinationOperatorPanel::GenerateProceduralPresetValues( CDmElement *pPreset, CDmElement *ctrl, bool bForceValue, float flForceValue )
+{
+ bool combo = ctrl->GetValue< bool >( "combo" );
+ bool multi = ctrl->GetValue< bool >( "multi" );
+
+ float flValue, flBalance, flMultilevel;
+ if ( !bForceValue )
+ {
+ flValue = RandomFloat( 0.0f, 1.0f );
+ flBalance = RandomFloat( 0.25f, 0.75f );
+ flMultilevel = RandomFloat( 0.0f, 1.0f );
+ }
+ else
+ {
+ flValue = flBalance = flMultilevel = flForceValue;
+ }
+
+ pPreset->SetValue< float >( "value", flValue );
+ if ( combo )
+ {
+ pPreset->SetValue< float >( "balance", flBalance );
+ }
+ else
+ {
+ pPreset->RemoveAttribute( "balance" );
+ }
+
+ if ( multi )
+ {
+ pPreset->SetValue< float >( "multilevel", flMultilevel );
+ }
+ else
+ {
+ pPreset->RemoveAttribute( "multilevel" );
+ }
+}
+
+
+void CDmeCombinationOperatorPanel::GenerateProceduralPresetValues( CDmElement *pPreset, const CDmrElementArray< CDmElement > &controls, bool bIdentity, float flForceValue /*= -1.0f*/ )
+{
+ CDmrElementArray<> values( pPreset, "controlValues" );
+ Assert( values.IsValid() );
+ values.RemoveAll();
+ int c = controls.Count();
+ for ( int i = 0; i < c ; ++i )
+ {
+ CDmElement *pControl = controls[ i ];
+ CDmElement *pControlValue = CreateElement< CDmElement >( pControl->GetName(), pPreset->GetFileId() );
+ GenerateProceduralPresetValues( pControlValue, pControl, bIdentity, flForceValue );
+ values.AddToTail( pControlValue );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Removes a controls from all presets
+//-----------------------------------------------------------------------------
+void CDmeCombinationOperatorPanel::RemoveAnimationControlFromPresets( const char *pControlName )
+{
+ CDmeAnimationSet *pAnimationSet = m_AnimSet.Get();
+ CDmrElementArray< CDmePresetGroup > presetGroupList = pAnimationSet->GetPresetGroups();
+
+ int nPresetGroupCount = presetGroupList.Count();
+ for ( int i = 0; i < nPresetGroupCount; ++i )
+ {
+ CDmePresetGroup *pPresetGroup = presetGroupList[ i ];
+
+ CDmrElementArray< CDmePreset > presetList = pPresetGroup->GetPresets();
+ int nPresetCount = presetList.Count();
+ for ( int j = 0; j < nPresetCount; ++j )
+ {
+ CDmePreset *pPreset = presetList[ j ];
+ CDmrElementArray<> controlValues = pPreset->GetControlValues();
+
+ int nControlCount = controlValues.Count();
+ for ( int k = 0; k < nControlCount; ++k )
+ {
+ CDmElement *v = controlValues[ k ];
+ if ( !Q_stricmp( v->GetName(), pControlName ) )
+ {
+ controlValues.FastRemove( k );
+ break;
+ }
+ }
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Removes a controls from all presets
+//-----------------------------------------------------------------------------
+void CDmeCombinationOperatorPanel::RemoveAnimationControlFromSelectionGroups( const char *pControlName )
+{
+ CDmeAnimationSet *pAnimationSet = m_AnimSet.Get();
+ CDmrElementArray< > selectionGroupList = pAnimationSet->GetSelectionGroups();
+
+ int nGroupCount = selectionGroupList.Count();
+ for ( int i = 0; i < nGroupCount; ++i )
+ {
+ CDmElement *pSelectionGroup = selectionGroupList[ i ];
+ CDmrStringArray selectedControls( pSelectionGroup, "selectedControls" );
+ int nControlCount = selectedControls.Count();
+ for ( int j = 0; j < nControlCount; ++j )
+ {
+ if ( !Q_stricmp( selectedControls[ j ], pControlName ) )
+ {
+ selectedControls.FastRemove( j );
+ break;
+ }
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Removes controls from the animation set that aren't used
+//-----------------------------------------------------------------------------
+void CDmeCombinationOperatorPanel::RemoveUnusedAnimationSetControls()
+{
+ CDmeAnimationSet *pAnimationSet = m_AnimSet.Get();
+ CDmrElementArray< > controls = pAnimationSet->GetControls();
+
+ // Remove all controls in the animation set and in presets that don't exist in the combination system
+ int nAnimSetCount = controls.Count();
+ for ( int i = nAnimSetCount; --i >= 0; )
+ {
+ CDmElement *pControlElement = controls[i];
+ if ( !pControlElement )
+ continue;
+
+ // Don't do any of this work for transforms
+ if ( pControlElement->GetValue< bool >( "transform" ) )
+ continue;
+
+ const char *pControlName = pControlElement->GetName();
+
+ // Look for a match
+ if ( m_hCombinationOperator.Get() && m_hCombinationOperator->FindControlIndex( pControlName ) >= 0 )
+ continue;
+
+ // No match, blow the control away.
+ RemoveAnimationControlFromPresets( pControlName );
+ RemoveAnimationControlFromSelectionGroups( pControlName );
+ controls.FastRemove( i );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Modify controls in the presets which have had stereo or multilevel settings changed
+//-----------------------------------------------------------------------------
+void CDmeCombinationOperatorPanel::ModifyExistingAnimationSetControl( CDmElement *pControlElement )
+{
+ const char *pControlName = pControlElement->GetName();
+
+ // Look for a match
+ int nControlIndex = m_hCombinationOperator->FindControlIndex( pControlName );
+ Assert( nControlIndex >= 0 );
+
+ bool bIsStereoControl = m_hCombinationOperator->IsStereoControl( nControlIndex );
+ bool bIsAnimControlStereo = pControlElement->GetValue< bool >( "combo" );
+ if ( bIsAnimControlStereo != bIsStereoControl )
+ {
+ pControlElement->SetValue< bool >( "combo", bIsStereoControl );
+ if ( !bIsStereoControl )
+ {
+ pControlElement->RemoveAttribute( "balance" );
+ }
+ else
+ {
+ const Vector2D &value = m_hCombinationOperator->GetStereoControlValue( nControlIndex );
+ pControlElement->SetValue< float >( "balance", value.y );
+ }
+ }
+
+ bool bIsMultiControl = m_hCombinationOperator->IsMultiControl( nControlIndex );
+ bool bIsAnimMultiControl = pControlElement->GetValue< bool >( "multi" );
+ if ( bIsAnimMultiControl != bIsMultiControl )
+ {
+ pControlElement->SetValue< bool >( "multi", bIsMultiControl );
+ if ( !bIsMultiControl )
+ {
+ pControlElement->RemoveAttribute( "multilevel" );
+ }
+ else
+ {
+ pControlElement->SetValue< float >( "multilevel", m_hCombinationOperator->GetMultiControlLevel( nControlIndex ) );
+ }
+ }
+
+ float flDefaultValue = m_hCombinationOperator->GetRawControlCount( nControlIndex ) == 2 ? 0.5f : 0.0f;
+ pControlElement->SetValue( "defaultValue", flDefaultValue );
+ pControlElement->SetValue( "defaultBalance", 0.5f );
+ pControlElement->SetValue( "defaultMultilevel", 0.5f );
+}
+
+
+//-----------------------------------------------------------------------------
+// Modify controls in the presets which have had stereo or multilevel settings changed
+//-----------------------------------------------------------------------------
+void CDmeCombinationOperatorPanel::ModifyExistingAnimationSetPresets( CDmElement *pControlElement )
+{
+ const char *pControlName = pControlElement->GetName();
+
+ CDmeAnimationSet *pAnimationSet = m_AnimSet.Get();
+ const CDmrElementArray< CDmePresetGroup > &presetGroupList = pAnimationSet->GetPresetGroups();
+
+ int nPresetGroupCount = presetGroupList.Count();
+ for ( int g = 0; g < nPresetGroupCount; ++g )
+ {
+ CDmePresetGroup *pPresetGroup = presetGroupList[ g ];
+ const CDmrElementArray< CDmePreset > &presetList = pPresetGroup->GetPresets();
+
+ int nPresetCount = presetList.Count();
+ for ( int i = 0; i < nPresetCount; ++i )
+ {
+ CDmePreset *pPreset = presetList[ i ];
+ const CDmrElementArray< CDmElement > &controlValues = pPreset->GetControlValues( );
+
+ int nControlCount = controlValues.Count();
+ for ( int j = 0; j < nControlCount; ++j )
+ {
+ CDmElement *v = controlValues[ j ];
+ if ( Q_stricmp( v->GetName(), pControlName ) )
+ continue;
+
+ bool bIsAnimControlStereo = pControlElement->GetValue< bool >( "combo" );
+ if ( bIsAnimControlStereo )
+ {
+ if ( !v->HasAttribute( "balance" ) )
+ {
+ v->SetValue( "balance", 0.5f );
+ }
+ }
+ else
+ {
+ v->RemoveAttribute( "balance" );
+ }
+
+ bool bIsAnimMultiControl = pControlElement->GetValue< bool >( "multi" );
+ if ( bIsAnimMultiControl )
+ {
+ if ( !v->HasAttribute( "multilevel" ) )
+ {
+ v->SetValue( "multilevel", 0.5f );
+ }
+ }
+ else
+ {
+ v->RemoveAttribute( "multilevel" );
+ }
+ }
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Modify controls which have had stereo or multilevel settings changed
+//-----------------------------------------------------------------------------
+void CDmeCombinationOperatorPanel::ModifyExistingAnimationSetControls()
+{
+ CDmeAnimationSet *pAnimationSet = m_AnimSet.Get();
+ const CDmrElementArray< CDmElement > &controls = pAnimationSet->GetControls();
+
+ // Update the main controls; update defaults and add or remove combo + multi data
+ int nAnimSetCount = controls.Count();
+ for ( int i = nAnimSetCount; --i >= 0; )
+ {
+ CDmElement *pControlElement = controls[i];
+ if ( !pControlElement )
+ continue;
+
+ // Don't do any of this work for transforms
+ if ( pControlElement->GetValue< bool >( "transform" ) )
+ continue;
+
+ ModifyExistingAnimationSetControl( pControlElement );
+ ModifyExistingAnimationSetPresets( pControlElement );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Adds new controls to the animation set
+//-----------------------------------------------------------------------------
+void CDmeCombinationOperatorPanel::AddNewAnimationSetControls()
+{
+ if ( !m_hCombinationOperator.Get() )
+ return;
+
+ CDmeAnimationSet *pAnimationSet = m_AnimSet.Get();
+ CDmaElementArray< > &controls = pAnimationSet->GetControls();
+
+ // Remove all controls in the animation set and in presets that don't exist in the combination system
+ int nFirstControl = controls.Count();
+ int nCombinationControlCount = m_hCombinationOperator->GetControlCount();
+ for ( int i = 0; i < nCombinationControlCount; ++i )
+ {
+ const char *pControlName = m_hCombinationOperator->GetControlName( i );
+ if ( pAnimationSet->FindControl( pControlName ) )
+ continue;
+
+ bool bIsStereoControl = m_hCombinationOperator->IsStereoControl(i);
+ bool bIsMultiControl = m_hCombinationOperator->IsMultiControl(i);
+ float flDefaultValue = m_hCombinationOperator->GetRawControlCount(i) == 2 ? 0.5f : 0.0f;
+
+ // Add the control to the controls group
+ CDmElement *pControl = CreateElement< CDmElement >( pControlName, pAnimationSet->GetFileId() );
+ Assert( pControl );
+ controls.InsertBefore( i, pControl );
+
+ pControl->SetValue( "combo", bIsStereoControl );
+ pControl->SetValue( "multi", bIsMultiControl );
+
+ if ( bIsStereoControl )
+ {
+ const Vector2D &value = m_hCombinationOperator->GetStereoControlValue(i);
+
+ pControl->SetValue( "value", value.x );
+ pControl->SetValue( "balance", value.y );
+ }
+ else
+ {
+ pControl->SetValue( "value", m_hCombinationOperator->GetControlValue(i) );
+ }
+
+ if ( bIsMultiControl )
+ {
+ pControl->SetValue( "multilevel", m_hCombinationOperator->GetMultiControlLevel(i) );
+ }
+
+ pControl->SetValue( "defaultValue", flDefaultValue );
+ pControl->SetValue( "defaultBalance", 0.5f );
+ pControl->SetValue( "defaultMultilevel", 0.5f );
+ }
+
+ int nLastControl = controls.Count();
+ if ( nLastControl == nFirstControl )
+ return;
+
+ // Add new controls to the root group
+ CDmElement *pGroup = pAnimationSet->FindOrAddSelectionGroup( "Root" );
+
+ // Fill in members
+ CDmrStringArray groups( pGroup, "selectedControls" );
+ for ( int i = nFirstControl; i < nLastControl; ++i )
+ {
+ groups.AddToTail( controls[ i ]->GetName() );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Creates the procedural presets
+//-----------------------------------------------------------------------------
+void CDmeCombinationOperatorPanel::ComputeProceduralPresets()
+{
+ CDmeAnimationSet *pAnimationSet = m_AnimSet.Get();
+
+ // Now create some presets
+ CDmePresetGroup* pPresetGroup = pAnimationSet->FindOrAddPresetGroup( "procedural" );
+ pPresetGroup->m_bIsReadOnly = true;
+
+ // NOTE: Default needs no values set into it since it's the default
+ CDmElement *pPreset = pPresetGroup->FindOrAddPreset( "Default" );
+
+ pPreset = pPresetGroup->FindOrAddPreset( "Zero" );
+ GenerateProceduralPresetValues( pPreset, pAnimationSet->GetControls(), true, 0.0f );
+
+ pPreset = pPresetGroup->FindOrAddPreset( "Half" );
+ GenerateProceduralPresetValues( pPreset, pAnimationSet->GetControls(), true, 0.5f );
+
+ pPreset = pPresetGroup->FindOrAddPreset( "One" );
+ GenerateProceduralPresetValues( pPreset, pAnimationSet->GetControls(), true, 1.0f );
+
+ pPreset = pPresetGroup->FindOrAddPreset( "Random" );
+ GenerateProceduralPresetValues( pPreset, pAnimationSet->GetControls(), false );
+
+ pAnimationSet->EnsureProceduralPresets();
+}
+
+
+//-----------------------------------------------------------------------------
+// Sort control names to match the combination controls
+//-----------------------------------------------------------------------------
+void CDmeCombinationOperatorPanel::SortAnimationSetControls()
+{
+ CDmaElementArray<> &controls = m_AnimSet->GetControls();
+ int nControlCount = controls.Count();
+ if ( nControlCount == 0 )
+ return;
+
+ int nCombinationControlCount = m_hCombinationOperator->GetControlCount();
+ Assert( nControlCount == nCombinationControlCount );
+
+ DmElementHandle_t *pElements = (DmElementHandle_t*)_alloca( nControlCount * sizeof(DmElementHandle_t) );
+ for ( int i = 0; i < nCombinationControlCount; ++i )
+ {
+ const char *pControlName = m_hCombinationOperator->GetControlName( i );
+ CDmElement *pControl = m_AnimSet->FindControl( pControlName );
+ pElements[i] = pControl->GetHandle();
+ }
+
+ controls.SetMultiple( 0, nControlCount, pElements );
+
+#ifdef _DEBUG
+ for ( int i = 0; i < nCombinationControlCount; ++i )
+ {
+ const char *pControlName = controls[i]->GetName();
+ const char *pComboName = m_hCombinationOperator->GetControlName( i );
+ Assert( !Q_stricmp( pControlName, pComboName ) );
+ }
+#endif
+}
+
+
+//-----------------------------------------------------------------------------
+// Called when the animation set has to be made to match the combination operator
+//-----------------------------------------------------------------------------
+void CDmeCombinationOperatorPanel::RefreshAnimationSet()
+{
+ if ( !m_AnimSet.Get() )
+ return;
+
+ CDisableUndoScopeGuard sg;
+
+ // Remove all controls in the animation set and in presets that don't exist in the combination system
+ RemoveUnusedAnimationSetControls();
+
+ // Modify controls in the presets which have had stereo or multilevel settings changed
+ ModifyExistingAnimationSetControls();
+
+ // Add all controls not in the animation set but which do exist in the combination system
+ AddNewAnimationSetControls();
+
+ // Resets the procedural presets
+ ComputeProceduralPresets();
+
+ // Sort control names to match the combination controls
+ SortAnimationSetControls();
+
+ // Set that as the current set
+ BaseClass::ChangeAnimationSet( m_AnimSet );
+}
+
+void CDmeCombinationOperatorPanel::RefreshCombinationOperator()
+{
+ RefreshAnimationSet();
+}
+
+
+//-----------------------------------------------------------------------------
+// Simulate
+//-----------------------------------------------------------------------------
+void CDmeCombinationOperatorPanel::OnTick()
+{
+ BaseClass::OnTick();
+
+ if ( m_hCombinationOperator )
+ {
+ {
+ CDisableUndoScopeGuard sg;
+
+ int c = m_hCombinationOperator->GetControlCount();
+ for ( int i = 0; i < c; ++i )
+ {
+ AttributeValue_t value;
+
+ bool bVisible = GetAttributeSlider()->GetSliderValues( &value, i );
+ if ( !bVisible )
+ continue;
+
+ if ( m_hCombinationOperator->IsStereoControl( i ) )
+ {
+ m_hCombinationOperator->SetControlValue( i, value.m_pValue[ANIM_CONTROL_VALUE], value.m_pValue[ANIM_CONTROL_BALANCE] );
+ }
+ else
+ {
+ m_hCombinationOperator->SetControlValue( i, value.m_pValue[ANIM_CONTROL_VALUE] );
+ }
+ if ( m_hCombinationOperator->IsMultiControl( i ) )
+ {
+ m_hCombinationOperator->SetMultiControlLevel( i, value.m_pValue[ANIM_CONTROL_MULTILEVEL] );
+ }
+ }
+ }
+
+ // FIXME: Shouldn't this happen at the application level?
+ // run the machinery - apply, resolve, dependencies, operate, resolve
+ CUtlVector< IDmeOperator* > operators;
+ operators.AddToTail( m_hCombinationOperator );
+
+ CDisableUndoScopeGuard guard;
+ g_pDmElementFramework->SetOperators( operators );
+ g_pDmElementFramework->Operate( true );
+ }
+
+ // allow elements and attributes to be edited again
+ g_pDmElementFramework->BeginEdit();
+}
+
+//-----------------------------------------------------------------------------
+// Constructor, destructor
+//-----------------------------------------------------------------------------
+CDmeDagEditPanel::CDmeDagEditPanel( vgui::Panel *pParent, const char *pName ) : BaseClass( pParent, pName )
+{
+ m_pPropertiesSplitter = new vgui::Splitter( this, "PropertiesSplitter", vgui::SPLITTER_MODE_VERTICAL, 1 );
+ vgui::Panel *pSplitterLeftSide = m_pPropertiesSplitter->GetChild( 0 );
+ vgui::Panel *pSplitterRightSide = m_pPropertiesSplitter->GetChild( 1 );
+
+ m_pDagRenderPanel = new CDmeDagRenderPanel( pSplitterRightSide, "DagRenderPanel" );
+
+ m_pEditorSheet = new vgui::PropertySheet( pSplitterLeftSide, "EditorSheet" );
+ m_pEditorSheet->AddActionSignalTarget( this );
+
+ m_pAnimationPage = new vgui::PropertyPage( m_pEditorSheet, "AnimationPage" );
+ m_pCombinationPage = new vgui::PropertyPage( m_pEditorSheet, "AnimationSetEditor" );
+ m_pVertexAnimationPage = new vgui::PropertyPage( m_pEditorSheet, "VertexAnimationPage" );
+
+ m_pCombinationPanel = new CDmeCombinationOperatorPanel( m_pCombinationPage, "AnimationSetEditorPanel" );
+ m_pCombinationPanel->CreateToolsSubPanels();
+
+ m_pAnimationListPanel = new CDmeAnimationListPanel( m_pAnimationPage, "AnimationListPanel" );
+ m_pAnimationListPanel->AddActionSignalTarget( this );
+ m_pVertexAnimationListPanel = new CDmeAnimationListPanel( m_pVertexAnimationPage, "VertexAnimationListPanel" );
+ m_pVertexAnimationListPanel->AddActionSignalTarget( this );
+
+ m_pCombinationPage->LoadControlSettingsAndUserConfig( "resource/dmedageditpanel_animationseteditorpage.res" );
+ m_pAnimationPage->LoadControlSettingsAndUserConfig( "resource/dmedageditpanel_animationpage.res" );
+ m_pVertexAnimationPage->LoadControlSettingsAndUserConfig( "resource/dmedageditpanel_vertexanimationpage.res" );
+
+ // Load layout settings; has to happen before pinning occurs in code
+ LoadControlSettingsAndUserConfig( "resource/dmedageditpanel.res" );
+
+ // NOTE: Page adding happens *after* LoadControlSettingsAndUserConfig
+ // because the layout of the sheet is correct at this point.
+ m_pEditorSheet->AddPage( m_pAnimationPage, "Animation" );
+ m_pEditorSheet->AddPage( m_pCombinationPage, "Combination" );
+ m_pEditorSheet->AddPage( m_pVertexAnimationPage, "Vertex Animation" );
+
+}
+
+CDmeDagEditPanel::~CDmeDagEditPanel()
+{
+}
+
+
+//-----------------------------------------------------------------------------
+// Set the scene
+
+//-----------------------------------------------------------------------------
+void CDmeDagEditPanel::SetDmeElement( CDmeDag *pScene )
+{
+ m_pDagRenderPanel->SetDmeElement( pScene );
+}
+
+
+//-----------------------------------------------------------------------------
+// Sets up the various panels in the dag editor
+//-----------------------------------------------------------------------------
+void CDmeDagEditPanel::SetMakefileRootElement( CDmElement *pRoot )
+{
+ CDmeAnimationList *pAnimationList = pRoot->GetValueElement< CDmeAnimationList >( "animationList" );
+ SetAnimationList( pAnimationList );
+
+ CDmeAnimationList *pVertexAnimationList = pRoot->GetValueElement< CDmeAnimationList >( "vertexAnimationList" );
+ SetVertexAnimationList( pVertexAnimationList );
+
+ CDmeCombinationOperator *pComboOp = pRoot->GetValueElement< CDmeCombinationOperator >( "combinationOperator" );
+ SetCombinationOperator( pComboOp );
+}
+
+
+//-----------------------------------------------------------------------------
+// Other methods which hook into DmePanel
+//-----------------------------------------------------------------------------
+void CDmeDagEditPanel::SetDmeElement( CDmeSourceSkin *pSkin )
+{
+ m_pDagRenderPanel->SetDmeElement( pSkin );
+
+ // First, try to grab the dependent makefile
+ CDmeMakefile *pSourceMakefile = pSkin->GetDependentMakefile();
+ if ( !pSourceMakefile )
+ return;
+
+ // Next, try to grab the output of that makefile
+ CDmElement *pOutput = pSourceMakefile->GetOutputElement( true );
+ if ( !pOutput )
+ return;
+
+ SetMakefileRootElement( pOutput );
+}
+
+void CDmeDagEditPanel::SetDmeElement( CDmeSourceAnimation *pAnimation )
+{
+ m_pDagRenderPanel->SetDmeElement( pAnimation );
+
+ // First, try to grab the dependent makefile
+ CDmeMakefile *pSourceMakefile = pAnimation->GetDependentMakefile();
+ if ( !pSourceMakefile )
+ return;
+
+ // Next, try to grab the output of that makefile
+ CDmElement *pOutput = pSourceMakefile->GetOutputElement( true );
+ if ( !pOutput )
+ return;
+
+ SetMakefileRootElement( pOutput );
+
+// if ( pAnimationList->FindAnimation( pAnimation->m_SourceAnimationName ) < 0 )
+// return;
+}
+
+void CDmeDagEditPanel::SetDmeElement( CDmeDCCMakefile *pDCCMakefile )
+{
+ m_pDagRenderPanel->SetDmeElement( pDCCMakefile );
+
+ // First, try to grab the dependent makefile
+ CDmElement *pOutput = pDCCMakefile->GetOutputElement( true );
+ if ( !pOutput )
+ return;
+
+ SetMakefileRootElement( pOutput );
+}
+
+CDmeDag *CDmeDagEditPanel::GetDmeElement()
+{
+ return m_pDagRenderPanel->GetDmeElement();
+}
+
+
+//-----------------------------------------------------------------------------
+// paint it!
+//-----------------------------------------------------------------------------
+void CDmeDagEditPanel::Paint()
+{
+ BaseClass::Paint();
+}
+
+
+//-----------------------------------------------------------------------------
+// Sets animation
+//-----------------------------------------------------------------------------
+void CDmeDagEditPanel::SetAnimationList( CDmeAnimationList *pAnimationList )
+{
+ m_pDagRenderPanel->SetAnimationList( pAnimationList );
+ m_pDagRenderPanel->SelectAnimation( "" );
+ m_pAnimationListPanel->SetAnimationList( pAnimationList );
+}
+
+
+void CDmeDagEditPanel::SetVertexAnimationList( CDmeAnimationList *pAnimationList )
+{
+ m_pDagRenderPanel->SetVertexAnimationList( pAnimationList );
+ m_pDagRenderPanel->SelectVertexAnimation( "" );
+ m_pVertexAnimationListPanel->SetAnimationList( pAnimationList );
+}
+
+void CDmeDagEditPanel::SetCombinationOperator( CDmeCombinationOperator *pComboOp )
+{
+ m_pCombinationPanel->SetCombinationOperator( pComboOp );
+}
+
+void CDmeDagEditPanel::RefreshCombinationOperator()
+{
+ m_pCombinationPanel->RefreshCombinationOperator();
+}
+
+
+//-----------------------------------------------------------------------------
+// Called when the page changes
+//-----------------------------------------------------------------------------
+void CDmeDagEditPanel::OnPageChanged( )
+{
+ if ( m_pEditorSheet->GetActivePage() == m_pCombinationPage )
+ {
+ m_pDagRenderPanel->SelectAnimation( "" );
+ m_pDagRenderPanel->SelectVertexAnimation( "" );
+ return;
+ }
+
+ if ( m_pEditorSheet->GetActivePage() == m_pAnimationPage )
+ {
+ m_pDagRenderPanel->SelectAnimation( m_pAnimationListPanel->GetSelectedAnimation() );
+ m_pDagRenderPanel->SelectVertexAnimation( "" );
+ return;
+ }
+
+ if ( m_pEditorSheet->GetActivePage() == m_pVertexAnimationPage )
+ {
+ m_pDagRenderPanel->SelectAnimation( "" );
+ m_pDagRenderPanel->SelectVertexAnimation( m_pVertexAnimationListPanel->GetSelectedAnimation() );
+ return;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Called when new animations are selected
+//-----------------------------------------------------------------------------
+void CDmeDagEditPanel::OnAnimationSelected( KeyValues *pKeyValues )
+{
+ vgui::Panel *pPanel = (vgui::Panel *)pKeyValues->GetPtr( "panel", NULL );
+ const char *pAnimationName = pKeyValues->GetString( "animationName", "" );
+
+ if ( pPanel == m_pAnimationListPanel )
+ {
+ m_pDagRenderPanel->SelectAnimation( pAnimationName );
+ return;
+ }
+
+ if ( pPanel == m_pVertexAnimationListPanel )
+ {
+ m_pDagRenderPanel->SelectVertexAnimation( pAnimationName );
+ return;
+ }
+}
+
+
+void CDmeDagEditPanel::OnAnimationDeselected( KeyValues *pKeyValues )
+{
+ vgui::Panel *pPanel = (vgui::Panel *)pKeyValues->GetPtr( "panel", NULL );
+ if ( pPanel == m_pAnimationListPanel )
+ {
+ m_pDagRenderPanel->SelectAnimation( "" );
+ return;
+ }
+
+ if ( pPanel == m_pVertexAnimationListPanel )
+ {
+ m_pDagRenderPanel->SelectVertexAnimation( "" );
+ return;
+ }
+}