You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
919 lines
27 KiB
919 lines
27 KiB
//========= Copyright © 1996-2001, Valve LLC, All rights reserved. ============
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================
|
|
|
|
#include "dme_controls/dmedagrenderpanel.h"
|
|
#include "movieobjects/dmedag.h"
|
|
#include "movieobjects/dmemodel.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"
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
// 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 )
|
|
{
|
|
CDisableUndoScopeGuard sg;
|
|
|
|
m_bDrawJointNames = false;
|
|
m_bDrawJoints = false;
|
|
m_bDrawGrid = true;
|
|
m_bDrawAxis = true;
|
|
m_bModelInEngineCoordinates = false;
|
|
m_bModelZUp = false;
|
|
|
|
// 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 );
|
|
|
|
if ( g_pMaterialSystem )
|
|
{
|
|
KeyValues *pVMTKeyValues = new KeyValues( "wireframe" );
|
|
pVMTKeyValues->SetInt( "$vertexcolor", 1 );
|
|
pVMTKeyValues->SetInt( "$ignorez", 1 );
|
|
m_axisMaterial.Init( "__DmeDagRenderPanelAxis", pVMTKeyValues );
|
|
}
|
|
|
|
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()
|
|
{
|
|
if ( g_pMaterialSystem )
|
|
{
|
|
m_axisMaterial.Shutdown();
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// 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 );
|
|
|
|
CDmeModel *pDmeModel = CastElement< CDmeModel >( m_hDag );
|
|
if ( pDmeModel )
|
|
{
|
|
ModelZUp( pDmeModel->IsZUp() );
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// 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 );
|
|
|
|
CDmeModel *pDmeModel = CastElement< CDmeModel >( m_hDag );
|
|
if ( pDmeModel )
|
|
{
|
|
ModelZUp( pDmeModel->IsZUp() );
|
|
}
|
|
else
|
|
{
|
|
pDmeModel = CastElement< CDmeModel >( pOutput );
|
|
if ( pDmeModel )
|
|
{
|
|
ModelZUp( pDmeModel->IsZUp() );
|
|
}
|
|
}
|
|
}
|
|
|
|
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 );
|
|
|
|
CDmeModel *pDmeModel = CastElement< CDmeModel >( m_hDag );
|
|
if ( pDmeModel )
|
|
{
|
|
ModelZUp( pDmeModel->IsZUp() );
|
|
}
|
|
else
|
|
{
|
|
pDmeModel = CastElement< CDmeModel >( pOutput );
|
|
if ( pDmeModel )
|
|
{
|
|
ModelZUp( pDmeModel->IsZUp() );
|
|
}
|
|
}
|
|
}
|
|
|
|
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 );
|
|
|
|
CDmeModel *pDmeModel = CastElement< CDmeModel >( m_hDag );
|
|
if ( pDmeModel )
|
|
{
|
|
ModelZUp( pDmeModel->IsZUp() );
|
|
}
|
|
else
|
|
{
|
|
pDmeModel = CastElement< CDmeModel >( pOutputElement );
|
|
if ( pDmeModel )
|
|
{
|
|
ModelZUp( pDmeModel->IsZUp() );
|
|
}
|
|
}
|
|
}
|
|
|
|
CDmeDag *CDmeDagRenderPanel::GetDmeElement()
|
|
{
|
|
return m_hDag;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Draw joint names
|
|
//-----------------------------------------------------------------------------
|
|
void CDmeDagRenderPanel::DrawJointNames( CDmeDag *pRoot, CDmeDag *pDag, const matrix3x4_t& parentToWorld )
|
|
{
|
|
int nJointIndex = -1;
|
|
|
|
CDmeModel *pRootModel = CastElement<CDmeModel>( pRoot );
|
|
if ( pRootModel )
|
|
{
|
|
nJointIndex = pRootModel->GetJointIndex( pDag );
|
|
if ( nJointIndex < 0 && pRootModel != pDag )
|
|
return;
|
|
}
|
|
|
|
matrix3x4_t jointToParent, jointToWorld;
|
|
pDag->GetTransform()->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 );
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Draw highlight points
|
|
//-----------------------------------------------------------------------------
|
|
void CDmeDagRenderPanel::DrawHighlightPoints()
|
|
{
|
|
if ( !m_pDrawSettings )
|
|
return;
|
|
|
|
const float flPointRadius = m_pDrawSettings->m_flHighlightSize;
|
|
|
|
Vector2D vecPanelPos;
|
|
|
|
g_pMatSystemSurface->DrawSetColor( m_pDrawSettings->m_cHighlightColor );
|
|
|
|
const CUtlVector< Vector > &highLightPoints = m_pDrawSettings->GetHighlightPoints();
|
|
|
|
const int nPointCount = highLightPoints.Count();
|
|
for ( int i = 0; i < nPointCount; ++i )
|
|
{
|
|
ComputePanelPosition( highLightPoints[i], &vecPanelPos );
|
|
g_pMatSystemSurface->DrawFilledRect( vecPanelPos.x - flPointRadius, vecPanelPos.y - flPointRadius, vecPanelPos.x + flPointRadius, vecPanelPos.y + flPointRadius );
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
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;
|
|
if ( !m_bModelInEngineCoordinates )
|
|
{
|
|
CDmeDag::DmeToEngineMatrix( dmeToEngine, m_bModelZUp );
|
|
}
|
|
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;
|
|
if ( !m_bModelInEngineCoordinates )
|
|
{
|
|
CDmeDag::DmeToEngineMatrix( modelToWorld, m_bModelZUp );
|
|
}
|
|
DrawJointNames( m_hDag, m_hDag, modelToWorld );
|
|
}
|
|
|
|
DrawHighlightPoints();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// 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;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Indicate we should draw the coordinate axis
|
|
//-----------------------------------------------------------------------------
|
|
void CDmeDagRenderPanel::DrawAxis( bool bDrawAxis )
|
|
{
|
|
m_bDrawAxis = bDrawAxis;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Indicate whether the model is in engine coordinates already
|
|
//-----------------------------------------------------------------------------
|
|
void CDmeDagRenderPanel::ModelInEngineCoordinates( bool bDrawInEngineCoordinates )
|
|
{
|
|
m_bModelInEngineCoordinates = bDrawInEngineCoordinates;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Indicate whether the model is Z Up
|
|
//-----------------------------------------------------------------------------
|
|
void CDmeDagRenderPanel::ModelZUp( bool bDrawZUp )
|
|
{
|
|
m_bModelZUp = bDrawZUp;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// 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( !m_bModelInEngineCoordinates );
|
|
CDmeDag::DrawZUp( m_bModelZUp );
|
|
|
|
m_pDrawSettings->DrawDag( m_hDag );
|
|
|
|
CDmeDag::DrawUsingEngineCoordinates( false );
|
|
CDmeDag::DrawZUp( false );
|
|
|
|
if ( m_bDrawAxis )
|
|
{
|
|
DrawAxis();
|
|
}
|
|
|
|
pRenderContext->Flush();
|
|
pRenderContext->BindLocalCubemap( pLocalCube );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// For rendering joints
|
|
//-----------------------------------------------------------------------------
|
|
#define AXIS_SIZE 10.0f
|
|
|
|
void CDmeDagRenderPanel::DrawAxis( )
|
|
{
|
|
if ( !g_pMaterialSystem )
|
|
return;
|
|
|
|
CMatRenderContextPtr pRenderContext( g_pMaterialSystem );
|
|
pRenderContext->MatrixMode( MATERIAL_MODEL );
|
|
|
|
pRenderContext->Bind( m_axisMaterial );
|
|
IMesh *pMesh = pRenderContext->GetDynamicMesh( );
|
|
|
|
CMeshBuilder meshBuilder;
|
|
meshBuilder.Begin( pMesh, MATERIAL_LINES, 3 );
|
|
|
|
meshBuilder.Position3f( 0.0f, 0.0f, 0.0f );
|
|
meshBuilder.Color4ub( 255, 0, 0, 255 );
|
|
meshBuilder.AdvanceVertexF< VTX_HAVEPOS | VTX_HAVECOLOR, 0 >();
|
|
|
|
meshBuilder.Position3f( AXIS_SIZE, 0.0f, 0.0f );
|
|
meshBuilder.Color4ub( 255, 0, 0, 255 );
|
|
meshBuilder.AdvanceVertexF< VTX_HAVEPOS | VTX_HAVECOLOR, 0 >();
|
|
|
|
meshBuilder.Position3f( 0.0f, 0.0f, 0.0f );
|
|
meshBuilder.Color4ub( 0, 255, 0, 255 );
|
|
meshBuilder.AdvanceVertexF< VTX_HAVEPOS | VTX_HAVECOLOR, 0 >();
|
|
|
|
meshBuilder.Position3f( 0.0f, AXIS_SIZE, 0.0f );
|
|
meshBuilder.Color4ub( 0, 255, 0, 255 );
|
|
meshBuilder.AdvanceVertexF< VTX_HAVEPOS | VTX_HAVECOLOR, 0 >();
|
|
|
|
meshBuilder.Position3f( 0.0f, 0.0f, 0.0f );
|
|
meshBuilder.Color4ub( 0, 0, 255, 255 );
|
|
meshBuilder.AdvanceVertexF< VTX_HAVEPOS | VTX_HAVECOLOR, 0 >();
|
|
|
|
meshBuilder.Position3f( 0.0f, 0.0f, AXIS_SIZE );
|
|
meshBuilder.Color4ub( 0, 0, 255, 255 );
|
|
meshBuilder.AdvanceVertexF< VTX_HAVEPOS | VTX_HAVECOLOR, 0 >();
|
|
|
|
meshBuilder.End();
|
|
pMesh->Draw();
|
|
|
|
pRenderContext->MatrixMode( MATERIAL_MODEL );
|
|
pRenderContext->LoadIdentity();
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// 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() );
|
|
}
|