1
This commit is contained in:
739
vgui2/dme_controls/dmedagrenderpanel.cpp
Normal file
739
vgui2/dme_controls/dmedagrenderpanel.cpp
Normal file
@ -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() );
|
||||
}
|
Reference in New Issue
Block a user