summaryrefslogtreecommitdiff
path: root/vgui2/dme_controls/dmedagrenderpanel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vgui2/dme_controls/dmedagrenderpanel.cpp')
-rw-r--r--vgui2/dme_controls/dmedagrenderpanel.cpp739
1 files changed, 739 insertions, 0 deletions
diff --git a/vgui2/dme_controls/dmedagrenderpanel.cpp b/vgui2/dme_controls/dmedagrenderpanel.cpp
new file mode 100644
index 0000000..4d6e138
--- /dev/null
+++ b/vgui2/dme_controls/dmedagrenderpanel.cpp
@@ -0,0 +1,739 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================
+
+#include "dme_controls/dmedagrenderpanel.h"
+#include "movieobjects/dmedag.h"
+#include "movieobjects/dmemodel.h"
+#include "movieobjects/timeutils.h"
+#include "movieobjects/dmeanimationlist.h"
+#include "movieobjects/dmeclip.h"
+#include "movieobjects/dmechannel.h"
+#include "movieobjects/dmemdlmakefile.h"
+#include "movieobjects/dmedccmakefile.h"
+#include "movieobjects/dmemesh.h"
+#include "movieobjects/dmedrawsettings.h"
+#include "dme_controls/dmepanel.h"
+#include "tier1/KeyValues.h"
+#include "VGuiMatSurface/IMatSystemSurface.h"
+#include "tier3/tier3.h"
+#include "materialsystem/imaterialsystemhardwareconfig.h"
+#include "materialsystem/imesh.h"
+#include "vgui_controls/Menu.h"
+#include "vgui_controls/MenuBar.h"
+#include "vgui_controls/MenuButton.h"
+#include "vgui/IVGui.h"
+
+
+//-----------------------------------------------------------------------------
+//
+// Hook into the dme panel editor system
+//
+//-----------------------------------------------------------------------------
+IMPLEMENT_DMEPANEL_FACTORY( CDmeDagRenderPanel, DmeDag, "DmeDagRenderer", "DmeDag Preview Renderer", false );
+IMPLEMENT_DMEPANEL_FACTORY( CDmeDagRenderPanel, DmeSourceSkin, "DmeSourceSkinPreview", "MDL Skin Previewer", false );
+IMPLEMENT_DMEPANEL_FACTORY( CDmeDagRenderPanel, DmeSourceAnimation, "DmeSourceAnimationPreview", "MDL Animation Previewer", false );
+IMPLEMENT_DMEPANEL_FACTORY( CDmeDagRenderPanel, DmeDCCMakefile, "DmeMakeFileOutputPreview", "DCC MakeFile Output Preview", false );
+
+
+//-----------------------------------------------------------------------------
+// Constructor, destructor
+//-----------------------------------------------------------------------------
+CDmeDagRenderPanel::CDmeDagRenderPanel( vgui::Panel *pParent, const char *pName ) : BaseClass( pParent, pName )
+{
+ // Used to poll input
+ vgui::ivgui()->AddTickSignal( GetVPanel() );
+
+ m_bDrawJointNames = false;
+ m_bDrawJoints = false;
+ m_bDrawGrid = true;
+
+ // Deal with the default cubemap
+ ITexture *pCubemapTexture = g_pMaterialSystem->FindTexture( "editor/cubemap", NULL, true );
+ m_DefaultEnvCubemap.Init( pCubemapTexture );
+ pCubemapTexture = g_pMaterialSystem->FindTexture( "editor/cubemap.hdr", NULL, true );
+ m_DefaultHDREnvCubemap.Init( pCubemapTexture );
+
+ m_pDrawSettings = CreateElement< CDmeDrawSettings >( "drawSettings", g_pDataModel->FindOrCreateFileId( "DagRenderPanelDrawSettings" ) );
+ m_hDrawSettings = m_pDrawSettings;
+
+ m_pMenuBar = new vgui::MenuBar( this, "Dag Render Panel Menu Bar" );
+
+ m_pShadingMenu = new vgui::Menu( NULL, "Shading Menu" );
+ m_nMenuSmoothShade = m_pShadingMenu->AddCheckableMenuItem( "&Smooth Shade", new KeyValues( "SmoothShade" ), this );
+ m_nMenuFlatShade = m_pShadingMenu->AddCheckableMenuItem( "&Flat Shade", new KeyValues( "FlatShade" ), this );
+ m_nMenuWireframe = m_pShadingMenu->AddCheckableMenuItem( "&Wireframe", new KeyValues( "Wireframe" ), this );
+ m_pShadingMenu->AddSeparator();
+ m_nMenuBoundingBox = m_pShadingMenu->AddCheckableMenuItem( "&Bounding Box", new KeyValues( "BoundingBox" ), this );
+ m_pShadingMenu->AddSeparator(); // Bug is visibility
+ m_nMenuNormals = m_pShadingMenu->AddCheckableMenuItem( "&Normals", new KeyValues( "Normals" ), this );
+ m_nMenuWireframeOnShaded = m_pShadingMenu->AddCheckableMenuItem( "WireFrame &On Shaded", new KeyValues( "WireframeOnShaded" ), this );
+ m_nMenuBackfaceCulling = m_pShadingMenu->AddCheckableMenuItem( "&Backface Culling", new KeyValues( "BackfaceCulling" ), this );
+ m_nMenuXRay = m_pShadingMenu->AddCheckableMenuItem( "&X-Ray", new KeyValues( "XRay" ), this );
+ m_nMenuGrayShade = m_pShadingMenu->AddCheckableMenuItem( "&Gray Shade", new KeyValues( "GrayShade" ), this );
+
+ // For now...
+ m_pShadingMenu->SetItemVisible( m_nMenuFlatShade, false );
+ m_pShadingMenu->SetItemEnabled( m_nMenuFlatShade, false );
+ m_pShadingMenu->SetItemVisible( m_nMenuBoundingBox, false );
+ m_pShadingMenu->SetItemEnabled( m_nMenuBoundingBox, false );
+ m_pShadingMenu->SetItemVisible( m_nMenuBackfaceCulling, false );
+ m_pShadingMenu->SetItemEnabled( m_nMenuBackfaceCulling, false );
+ m_pShadingMenu->SetItemVisible( m_nMenuXRay, false );
+ m_pShadingMenu->SetItemEnabled( m_nMenuXRay, false );
+
+ m_pMenuBar->AddMenu( "&Shading", m_pShadingMenu );
+
+ UpdateMenu();
+}
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+CDmeDagRenderPanel::~CDmeDagRenderPanel()
+{
+}
+
+
+//-----------------------------------------------------------------------------
+// Scheme settings
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::ApplySchemeSettings( vgui::IScheme *pScheme )
+{
+ BaseClass::ApplySchemeSettings( pScheme );
+ SetBorder( pScheme->GetBorder( "MenuBorder") );
+ m_hFont = pScheme->GetFont( "DmePropertyVerySmall", IsProportional() );
+}
+
+
+//-----------------------------------------------------------------------------
+// Set the scene
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::SetDmeElement( CDmeDag *pScene )
+{
+ m_hDag = pScene;
+ ComputeDefaultTangentData( m_hDag, false );
+}
+
+
+//-----------------------------------------------------------------------------
+// Other methods which hook into DmePanel
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::SetDmeElement( CDmeSourceSkin *pSkin )
+{
+ // First, try to grab the dependent makefile
+ CDmeMakefile *pSourceMakefile = pSkin->GetDependentMakefile();
+ if ( !pSourceMakefile )
+ {
+ m_hDag = NULL;
+ return;
+ }
+
+ // Next, try to grab the output of that makefile
+ CDmElement *pOutput = pSourceMakefile->GetOutputElement( true );
+ if ( !pOutput )
+ {
+ m_hDag = NULL;
+ return;
+ }
+
+ // Finally, grab the 'skin' attribute of that makefile
+ m_hDag = pOutput->GetValueElement< CDmeDag >( "model" );
+ ComputeDefaultTangentData( m_hDag, false );
+ DrawJoints( false );
+ DrawJointNames( false );
+}
+
+void CDmeDagRenderPanel::SetDmeElement( CDmeSourceAnimation *pAnimation )
+{
+ // First, try to grab the dependent makefile
+ CDmeMakefile *pSourceMakefile = pAnimation->GetDependentMakefile();
+ if ( !pSourceMakefile )
+ {
+ m_hDag = NULL;
+ return;
+ }
+
+ // Next, try to grab the output of that makefile
+ CDmElement *pOutput = pSourceMakefile->GetOutputElement( true );
+ if ( !pOutput )
+ {
+ m_hDag = NULL;
+ return;
+ }
+
+ // Finally, grab the 'model' or 'skeleton' attribute of that makefile
+ CDmeDag *pDag = pOutput->GetValueElement< CDmeDag >( "model" );
+ if ( !pDag )
+ {
+ pDag = pOutput->GetValueElement< CDmeDag >( "skeleton" );
+ }
+ if ( !pDag )
+ return;
+
+ CDmeAnimationList *pAnimationList = pOutput->GetValueElement< CDmeAnimationList >( "animationList" );
+ if ( !pAnimationList )
+ return;
+
+ if ( pAnimationList->FindAnimation( pAnimation->m_SourceAnimationName ) < 0 )
+ return;
+
+ m_hDag = pDag;
+ ComputeDefaultTangentData( m_hDag, false );
+ m_hAnimationList = pAnimationList;
+ SelectAnimation( pAnimation->m_SourceAnimationName );
+ DrawJoints( true );
+ DrawJointNames( true );
+}
+
+void CDmeDagRenderPanel::SetDmeElement( CDmeDCCMakefile *pDCCMakefile )
+{
+ // First, try to grab the dependent makefile
+ CDmElement *pOutputElement = pDCCMakefile->GetOutputElement( true );
+ if ( !pOutputElement )
+ {
+ m_hDag = NULL;
+ return;
+ }
+
+ // Finally, grab the 'model' or 'skeleton' attribute of that makefile
+ CDmeDag *pDag = pOutputElement->GetValueElement< CDmeDag >( "model" );
+ if ( !pDag )
+ {
+ pDag = pOutputElement->GetValueElement< CDmeDag >( "skeleton" );
+ }
+ if ( !pDag )
+ return;
+
+ CDmeAnimationList *pAnimationList = pOutputElement->GetValueElement< CDmeAnimationList >( "animationList" );
+
+ m_hDag = pDag;
+ ComputeDefaultTangentData( m_hDag, false );
+ m_hAnimationList = pAnimationList;
+ SelectAnimation( 0 );
+ DrawJoints( pAnimationList != NULL );
+ DrawJointNames( pAnimationList != NULL );
+}
+
+CDmeDag *CDmeDagRenderPanel::GetDmeElement()
+{
+ return m_hDag;
+}
+
+
+//-----------------------------------------------------------------------------
+// Draw joint names
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::DrawJointNames( CDmeDag *pRoot, CDmeDag *pDag, const matrix3x4_t& parentToWorld )
+{
+ CDmeTransform *pJointTransform = pDag->GetTransform();
+ int nJointIndex = -1;
+
+ CDmeModel *pRootModel = CastElement<CDmeModel>( pRoot );
+ if ( pRootModel )
+ {
+ nJointIndex = pRootModel->GetJointTransformIndex( pJointTransform );
+ if ( nJointIndex < 0 && pRootModel != pDag )
+ return;
+ }
+
+ matrix3x4_t jointToParent, jointToWorld;
+ pJointTransform->GetTransform( jointToParent );
+ ConcatTransforms( parentToWorld, jointToParent, jointToWorld );
+
+ CDmeJoint *pJoint = CastElement< CDmeJoint >( pDag );
+ if ( pJoint )
+ {
+ Vector vecJointOrigin;
+ MatrixGetColumn( jointToWorld, 3, &vecJointOrigin );
+
+ Vector2D vecPanelPos;
+ ComputePanelPosition( vecJointOrigin, &vecPanelPos );
+
+ char pJointName[512];
+ if ( nJointIndex >= 0 )
+ {
+ Q_snprintf( pJointName, sizeof(pJointName), "%d : %s", nJointIndex, pJoint->GetName() );
+ }
+ else
+ {
+ Q_snprintf( pJointName, sizeof(pJointName), "%s", pJoint->GetName() );
+ }
+ g_pMatSystemSurface->DrawColoredText( m_hFont, vecPanelPos.x + 5, vecPanelPos.y, 255, 255, 255, 255, pJointName );
+ }
+
+ int nCount = pDag->GetChildCount();
+ for ( int i = 0; i < nCount; ++i )
+ {
+ CDmeDag *pChild = pDag->GetChild(i);
+ if ( !pChild )
+ continue;
+
+ DrawJointNames( pRoot, pChild, jointToWorld );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::OnSmoothShade()
+{
+ if ( m_pShadingMenu->IsChecked( m_nMenuSmoothShade ) )
+ {
+ m_pDrawSettings->SetDrawType( CDmeDrawSettings::DRAW_SMOOTH );
+ }
+ UpdateMenu();
+}
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::OnFlatShade()
+{
+ if ( m_pShadingMenu->IsChecked( m_nMenuFlatShade ) )
+ {
+ m_pDrawSettings->SetDrawType( CDmeDrawSettings::DRAW_FLAT );
+ }
+ UpdateMenu();
+}
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::OnWireframe()
+{
+ if ( m_pShadingMenu->IsChecked( m_nMenuWireframe ) )
+ {
+ m_pDrawSettings->SetDrawType( CDmeDrawSettings::DRAW_WIREFRAME );
+ }
+ UpdateMenu();
+}
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::OnBoundingBox()
+{
+ if ( m_pShadingMenu->IsChecked( m_nMenuBoundingBox ) )
+ {
+ m_pDrawSettings->SetDrawType( CDmeDrawSettings::DRAW_BOUNDINGBOX );
+ }
+ UpdateMenu();
+}
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::OnNormals()
+{
+ m_pDrawSettings->SetNormals( m_pShadingMenu->IsChecked( m_nMenuNormals ) );
+ UpdateMenu();
+}
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::OnWireframeOnShaded()
+{
+ m_pDrawSettings->SetWireframeOnShaded( m_pShadingMenu->IsChecked( m_nMenuWireframeOnShaded ) );
+ UpdateMenu();
+}
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::OnBackfaceCulling()
+{
+ m_pDrawSettings->SetBackfaceCulling( m_pShadingMenu->IsChecked( m_nMenuBackfaceCulling ) );
+ UpdateMenu();
+}
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::OnXRay()
+{
+ m_pDrawSettings->SetXRay( m_pShadingMenu->IsChecked( m_nMenuXRay ) );
+ UpdateMenu();
+}
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::OnGrayShade()
+{
+ m_pDrawSettings->SetGrayShade( m_pShadingMenu->IsChecked( m_nMenuGrayShade ) );
+ UpdateMenu();
+}
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::OnFrame()
+{
+ if ( !m_hDag )
+ return;
+
+ float flRadius;
+ Vector vecCenter, vecWorldCenter;
+ m_hDag->GetBoundingSphere( vecCenter, flRadius );
+
+ matrix3x4_t dmeToEngine;
+ CDmeDag::DmeToEngineMatrix( dmeToEngine );
+ VectorTransform( vecCenter, dmeToEngine, vecWorldCenter );
+ LookAt( vecWorldCenter, flRadius );
+}
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::PerformLayout()
+{
+ BaseClass::PerformLayout();
+
+ if ( m_pMenuBar->IsVisible() )
+ {
+ int iWidth;
+ int iHeight;
+ GetSize( iWidth, iHeight );
+
+ int iMenuWidth; // Unused
+ int iMenuHeight;
+ m_pMenuBar->GetSize( iMenuWidth, iMenuHeight );
+ m_pMenuBar->SetSize( iWidth, iMenuHeight );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// paint it!
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::Paint()
+{
+ if ( m_hCurrentAnimation.Get() )
+ {
+ DmeTime_t currentTime( Plat_FloatTime() - m_flStartTime );
+ if ( m_hCurrentAnimation->GetDuration() != DMETIME_ZERO )
+ {
+ currentTime = currentTime % m_hCurrentAnimation->GetDuration();
+ }
+ else
+ {
+ currentTime = DMETIME_ZERO;
+ }
+ currentTime += m_hCurrentAnimation->GetStartTime();
+ DmeTime_t mediaTime = m_hCurrentAnimation->ToChildMediaTime( currentTime, true );
+
+ int nChannelCount = m_hCurrentAnimation->m_Channels.Count();
+ for ( int i = 0; i < nChannelCount; ++i )
+ {
+ m_hCurrentAnimation->m_Channels[i]->SetCurrentTime( mediaTime );
+ }
+ }
+
+ if ( m_hCurrentVertexAnimation.Get() )
+ {
+ DmeTime_t currentTime( Plat_FloatTime() - m_flStartTime );
+ currentTime = currentTime % m_hCurrentVertexAnimation->GetDuration();
+ currentTime += m_hCurrentVertexAnimation->GetStartTime();
+ DmeTime_t mediaTime = m_hCurrentVertexAnimation->ToChildMediaTime( currentTime, true );
+
+ int nChannelCount = m_hCurrentVertexAnimation->m_Channels.Count();
+ for ( int i = 0; i < nChannelCount; ++i )
+ {
+ m_hCurrentVertexAnimation->m_Channels[i]->SetCurrentTime( mediaTime );
+ }
+ }
+
+ // FIXME: Shouldn't this happen at the application level?
+ // run the machinery - apply, resolve, dependencies, operate, resolve
+ {
+ CDisableUndoScopeGuard guard;
+ g_pDmElementFramework->SetOperators( m_operators );
+ g_pDmElementFramework->Operate( true );
+ }
+
+ // allow elements and attributes to be edited again
+ g_pDmElementFramework->BeginEdit();
+
+ BaseClass::Paint();
+
+ // Overlay the joint names
+ if ( m_bDrawJointNames && m_hDag )
+ {
+ matrix3x4_t modelToWorld;
+ CDmeDag::DmeToEngineMatrix( modelToWorld );
+ DrawJointNames( m_hDag, m_hDag, modelToWorld );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Indicate we should draw joint names
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::DrawJointNames( bool bDrawJointNames )
+{
+ m_bDrawJointNames = bDrawJointNames;
+}
+
+
+//-----------------------------------------------------------------------------
+// Indicate we should draw joints
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::DrawJoints( bool bDrawJoint )
+{
+ m_bDrawJoints = bDrawJoint;
+}
+
+
+//-----------------------------------------------------------------------------
+// Indicate we should draw the grid
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::DrawGrid( bool bDrawGrid )
+{
+ m_bDrawGrid = bDrawGrid;
+}
+
+
+//-----------------------------------------------------------------------------
+// paint it!
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::OnPaint3D()
+{
+ CMatRenderContextPtr pRenderContext( g_pMaterialSystem );
+ ITexture *pLocalCube = pRenderContext->GetLocalCubemap();
+ if ( g_pMaterialSystemHardwareConfig->GetHDRType() == HDR_TYPE_NONE )
+ {
+ pRenderContext->BindLocalCubemap( m_DefaultEnvCubemap );
+ }
+ else
+ {
+ pRenderContext->BindLocalCubemap( m_DefaultHDREnvCubemap );
+ }
+
+ if ( m_bDrawGrid )
+ {
+ BaseClass::DrawGrid();
+ }
+
+ if ( m_bDrawJoints )
+ {
+ CDmeJoint::DrawJointHierarchy( true );
+ }
+
+ pRenderContext->CullMode( MATERIAL_CULLMODE_CW );
+ CDmeDag::DrawUsingEngineCoordinates( true );
+ m_pDrawSettings->DrawDag( m_hDag );
+ CDmeDag::DrawUsingEngineCoordinates( false );
+
+ pRenderContext->Flush();
+ pRenderContext->BindLocalCubemap( pLocalCube );
+}
+
+
+//-----------------------------------------------------------------------------
+// input
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::OnMouseDoublePressed( vgui::MouseCode code )
+{
+ OnFrame();
+
+ BaseClass::OnMouseDoublePressed( code );
+}
+
+
+//-----------------------------------------------------------------------------
+// TODO: Have a whole groovy keybinding thingy like SFM
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::OnKeyCodePressed( vgui::KeyCode code )
+{
+ BaseClass::OnKeyCodePressed( code );
+
+ if ( code == KEY_F )
+ {
+ OnFrame();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Rebuilds the list of operators
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::RebuildOperatorList( )
+{
+ m_operators.RemoveAll();
+
+ if ( m_hCurrentAnimation.Get() )
+ {
+ int nChannelCount = m_hCurrentAnimation->m_Channels.Count();
+ for ( int i = 0; i < nChannelCount; ++i )
+ {
+ m_hCurrentAnimation->m_Channels[i]->SetMode( CM_PLAY );
+ m_operators.AddToTail( m_hCurrentAnimation->m_Channels[i] );
+ }
+ }
+
+ if ( m_hCurrentVertexAnimation.Get() )
+ {
+ int nChannelCount = m_hCurrentVertexAnimation->m_Channels.Count();
+ for ( int i = 0; i < nChannelCount; ++i )
+ {
+ m_hCurrentVertexAnimation->m_Channels[i]->SetMode( CM_PLAY );
+ m_operators.AddToTail( m_hCurrentVertexAnimation->m_Channels[i] );
+ }
+ }
+
+ m_flStartTime = Plat_FloatTime();
+}
+
+//-----------------------------------------------------------------------------
+// Select animation by index
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::SelectAnimation( int nIndex )
+{
+ m_hCurrentAnimation = NULL;
+ if ( m_hAnimationList.Get() && ( nIndex >= 0 ) )
+ {
+ // FIXME: How is this actually going to work?
+ m_hCurrentAnimation = m_hAnimationList->GetAnimation( nIndex );
+ }
+ RebuildOperatorList();
+}
+
+void CDmeDagRenderPanel::SelectVertexAnimation( int nIndex )
+{
+ m_hCurrentVertexAnimation = NULL;
+ if ( m_hVertexAnimationList.Get() && ( nIndex >= 0 ) )
+ {
+ // FIXME: How is this actually going to work?
+ m_hCurrentVertexAnimation = m_hVertexAnimationList->GetAnimation( nIndex );
+ }
+ RebuildOperatorList();
+}
+
+
+//-----------------------------------------------------------------------------
+// Select animation by name
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::SelectAnimation( const char *pAnimName )
+{
+ if ( !pAnimName[0] )
+ {
+ SelectAnimation( -1 );
+ return;
+ }
+
+ if ( m_hAnimationList )
+ {
+ int nIndex = m_hAnimationList->FindAnimation( pAnimName );
+ if ( nIndex >= 0 )
+ {
+ SelectAnimation( nIndex );
+ }
+ }
+}
+
+void CDmeDagRenderPanel::SelectVertexAnimation( const char *pAnimName )
+{
+ if ( !pAnimName[0] )
+ {
+ SelectVertexAnimation( -1 );
+ return;
+ }
+
+ if ( m_hVertexAnimationList )
+ {
+ int nIndex = m_hVertexAnimationList->FindAnimation( pAnimName );
+ if ( nIndex >= 0 )
+ {
+ SelectVertexAnimation( nIndex );
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Sets animation
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::SetAnimationList( CDmeAnimationList *pAnimationList )
+{
+ m_hAnimationList = pAnimationList;
+ int nCount = pAnimationList ? pAnimationList->GetAnimationCount() : 0;
+ if ( nCount == 0 )
+ {
+ m_hCurrentAnimation = NULL;
+ return;
+ }
+
+ SelectAnimation( 0 );
+}
+
+
+void CDmeDagRenderPanel::SetVertexAnimationList( CDmeAnimationList *pAnimationList )
+{
+ m_hVertexAnimationList = pAnimationList;
+ int nCount = pAnimationList ? pAnimationList->GetAnimationCount() : 0;
+ if ( nCount == 0 )
+ {
+ m_hCurrentVertexAnimation = NULL;
+ return;
+ }
+
+ SelectVertexAnimation( 0 );
+}
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+void CDmeDagRenderPanel::UpdateMenu()
+{
+ switch ( m_pDrawSettings->GetDrawType() )
+ {
+ case CDmeDrawSettings::DRAW_FLAT:
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuSmoothShade, false );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuFlatShade, true );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuWireframe, false );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuBoundingBox, false );
+ break;
+ case CDmeDrawSettings::DRAW_WIREFRAME:
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuSmoothShade, false );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuFlatShade, false );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuWireframe, true );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuBoundingBox, false );
+ break;
+ case CDmeDrawSettings::DRAW_BOUNDINGBOX:
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuSmoothShade, false );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuFlatShade, false );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuWireframe, false );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuBoundingBox, true );
+ break;
+ default:
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuSmoothShade, true );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuFlatShade, false );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuWireframe, false );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuBoundingBox, false );
+ break;
+ }
+
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuNormals, m_pDrawSettings->GetNormals() );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuWireframeOnShaded, m_pDrawSettings->GetWireframeOnShaded() );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuBackfaceCulling, m_pDrawSettings->GetBackfaceCulling() );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuXRay, m_pDrawSettings->GetXRay() );
+ m_pShadingMenu->SetMenuItemChecked( m_nMenuGrayShade, m_pDrawSettings->GetGrayShade() );
+}