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.
265 lines
7.8 KiB
265 lines
7.8 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
|
|
#include "datamodel/dmelementfactoryhelper.h" |
|
#include "tier1/KeyValues.h" |
|
#include "tier1/utlrbtree.h" |
|
#include "movieobjects/dmedag.h" |
|
#include "movieobjects/dmedrawsettings.h" |
|
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Expose this class to the scene database |
|
//----------------------------------------------------------------------------- |
|
IMPLEMENT_ELEMENT_FACTORY( DmeDrawSettings, CDmeDrawSettings ); |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Statics |
|
//----------------------------------------------------------------------------- |
|
bool CDmeDrawSettings::s_bWireframeMaterialInitialized( false ); |
|
CMaterialReference CDmeDrawSettings::s_WireframeMaterial; |
|
bool CDmeDrawSettings::s_bWireframeOnShadedMaterialInitialized( false ); |
|
CMaterialReference CDmeDrawSettings::s_WireframeOnShadedMaterial; |
|
bool CDmeDrawSettings::s_bFlatGrayMaterial( false ); |
|
CMaterialReference CDmeDrawSettings::s_FlatGrayMaterial; |
|
bool CDmeDrawSettings::s_bUnlitGrayMaterial( false ); |
|
CMaterialReference CDmeDrawSettings::s_UnlitGrayMaterial; |
|
|
|
CUtlRBTree< CUtlSymbol > CDmeDrawSettings::s_KnownDrawableTypes; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// |
|
//----------------------------------------------------------------------------- |
|
void CDmeDrawSettings::OnConstruction() |
|
{ |
|
if ( s_KnownDrawableTypes.Count() == 0 ) |
|
{ |
|
BuildKnownDrawableTypes(); |
|
} |
|
|
|
SetDefLessFunc< CUtlRBTree< CUtlSymbol > >( m_NotDrawable ); |
|
m_NotDrawable.RemoveAll(); |
|
|
|
m_DrawType.InitAndSet( this, "drawType", static_cast< int >( DRAW_SMOOTH ) ); |
|
m_bBackfaceCulling.InitAndSet( this, "backfaceCulling", true ); |
|
m_bWireframeOnShaded.InitAndSet( this, "wireframeOnShaded", false ); |
|
m_bXRay.InitAndSet( this, "xray", false ); |
|
m_bGrayShade.InitAndSet( this, "grayShade", false ); |
|
m_bNormals.InitAndSet( this, "normals", false ); |
|
m_NormalLength.InitAndSet( this, "normalLength", 1.0 ); |
|
m_Color.InitAndSet( this, "color", Color( 0, 0, 0, 1 ) ); |
|
m_bDeltaHighlight.InitAndSet( this, "highlightDeltas", false ); |
|
m_flHighlightSize.InitAndSet( this, "highlightSize", 1.5f ); |
|
m_cHighlightColor.InitAndSet( this, "highlightColor", Color( 0xff, 0x14, 0x93, 0xff ) ); // Deep Pink |
|
|
|
m_IsAMaterialBound = false; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// |
|
//----------------------------------------------------------------------------- |
|
void CDmeDrawSettings::OnDestruction() |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// |
|
//----------------------------------------------------------------------------- |
|
void CDmeDrawSettings::Resolve() |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Wireframe |
|
//----------------------------------------------------------------------------- |
|
void CDmeDrawSettings::BindWireframe() |
|
{ |
|
if ( !s_bWireframeMaterialInitialized ) |
|
{ |
|
s_bWireframeMaterialInitialized = true; |
|
|
|
KeyValues *pKeyValues = new KeyValues( "wireframe" ); |
|
pKeyValues->SetInt( "$decal", 0 ); |
|
pKeyValues->SetInt( "$vertexcolor", 1 ); |
|
pKeyValues->SetInt( "$ignorez", 1 ); |
|
s_WireframeMaterial.Init( "__DmeWireframe", pKeyValues ); |
|
} |
|
|
|
CMatRenderContextPtr pRenderContext( g_pMaterialSystem ); |
|
pRenderContext->Bind( s_WireframeMaterial ); |
|
m_IsAMaterialBound = true; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Wireframe as a decal |
|
//----------------------------------------------------------------------------- |
|
void CDmeDrawSettings::BindWireframeOnShaded() |
|
{ |
|
if ( !s_bWireframeOnShadedMaterialInitialized ) |
|
{ |
|
s_bWireframeOnShadedMaterialInitialized = true; |
|
|
|
KeyValues *pKeyValues = new KeyValues( "wireframe" ); |
|
pKeyValues->SetInt( "$decal", 0 ); |
|
pKeyValues->SetInt( "$vertexcolor", 1 ); |
|
pKeyValues->SetInt( "$ignorez", 0 ); |
|
s_WireframeOnShadedMaterial.Init( "__DmeWireframeOnShaded", pKeyValues ); |
|
} |
|
|
|
CMatRenderContextPtr pRenderContext( g_pMaterialSystem ); |
|
pRenderContext->Bind( s_WireframeOnShadedMaterial ); |
|
m_IsAMaterialBound = true; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Flat Gray Shaded |
|
//----------------------------------------------------------------------------- |
|
void CDmeDrawSettings::BindGray() |
|
{ |
|
if ( !s_bFlatGrayMaterial ) |
|
{ |
|
s_bFlatGrayMaterial = true; |
|
|
|
KeyValues *pKeyValues = new KeyValues( "VertexLitGeneric" ); |
|
pKeyValues->SetInt( "$model", 1 ); |
|
s_FlatGrayMaterial.Init( "__DmeFlatGray", pKeyValues ); |
|
} |
|
|
|
CMatRenderContextPtr pRenderContext( g_pMaterialSystem ); |
|
pRenderContext->Bind( s_FlatGrayMaterial ); |
|
m_IsAMaterialBound = true; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Flat Gray Shaded |
|
//----------------------------------------------------------------------------- |
|
void CDmeDrawSettings::BindUnlitGray() |
|
{ |
|
if ( !s_bUnlitGrayMaterial ) |
|
{ |
|
s_bUnlitGrayMaterial = true; |
|
|
|
KeyValues *pKeyValues = new KeyValues( "UnlitGeneric" ); |
|
pKeyValues->SetInt( "$model", 1 ); |
|
pKeyValues->SetInt( "$vertexcolor", 1 ); |
|
s_UnlitGrayMaterial.Init( "__DmeUnlitGray", pKeyValues ); |
|
} |
|
|
|
CMatRenderContextPtr pRenderContext( g_pMaterialSystem ); |
|
pRenderContext->Bind( s_UnlitGrayMaterial ); |
|
m_IsAMaterialBound = true; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// |
|
//----------------------------------------------------------------------------- |
|
bool CDmeDrawSettings::Drawable( CDmElement *pElement ) |
|
{ |
|
if ( m_NotDrawable.IsValidIndex( m_NotDrawable.Find( pElement->GetType() ) ) ) |
|
return false; |
|
|
|
return true; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// |
|
//----------------------------------------------------------------------------- |
|
void CDmeDrawSettings::BuildKnownDrawableTypes() |
|
{ |
|
SetDefLessFunc< CUtlRBTree< CUtlSymbol > >( s_KnownDrawableTypes ); |
|
|
|
s_KnownDrawableTypes.RemoveAll(); |
|
|
|
s_KnownDrawableTypes.InsertIfNotFound( g_pDataModel->GetSymbol( "DmeMesh" ) ); |
|
s_KnownDrawableTypes.InsertIfNotFound( g_pDataModel->GetSymbol( "DmeJoint" ) ); |
|
s_KnownDrawableTypes.InsertIfNotFound( g_pDataModel->GetSymbol( "DmeModel" ) ); |
|
s_KnownDrawableTypes.InsertIfNotFound( g_pDataModel->GetSymbol( "DmeAttachment" ) ); |
|
|
|
m_NotDrawable.RemoveAll(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// |
|
//----------------------------------------------------------------------------- |
|
void CDmeDrawSettings::DrawDag( CDmeDag *pDag ) |
|
{ |
|
if ( !pDag ) |
|
return; |
|
|
|
m_vHighlightPoints.RemoveAll(); |
|
|
|
CMatRenderContextPtr pRenderContext( g_pMaterialSystem ); |
|
|
|
m_IsAMaterialBound = false; |
|
|
|
if ( GetDeltaHighlight() ) |
|
{ |
|
BindUnlitGray(); |
|
} |
|
else |
|
{ |
|
if ( !Shaded() ) |
|
{ |
|
BindWireframe(); |
|
} |
|
else if ( GetGrayShade() ) |
|
{ |
|
BindGray(); |
|
} |
|
} |
|
|
|
pDag->Draw( this ); |
|
|
|
m_IsAMaterialBound = false; |
|
|
|
if ( GetDeltaHighlight() || ( GetWireframeOnShaded() && Shaded() ) ) |
|
{ |
|
VMatrix m; |
|
|
|
pRenderContext->GetMatrix( MATERIAL_PROJECTION, &m ); |
|
|
|
/* Extract the near and far clipping plane values from projection matrix |
|
float c = m[ 2 ][ 2 ]; |
|
float d = m[ 2 ][ 3 ]; |
|
|
|
const float near = d / ( c - 1.0f ); |
|
const float far = d / ( c + 1.0f ); |
|
*/ |
|
|
|
const float zBias = 0.00025; |
|
m[ 2 ][ 2 ] += zBias; |
|
m[ 2 ][ 3 ] += zBias; |
|
|
|
pRenderContext->MatrixMode( MATERIAL_PROJECTION ); |
|
pRenderContext->PushMatrix(); |
|
pRenderContext->LoadMatrix( m ); |
|
|
|
BindWireframeOnShaded(); |
|
PushDrawType(); |
|
SetDrawType( CDmeDrawSettings::DRAW_WIREFRAME ); |
|
pDag->Draw( this ); |
|
PopDrawType(); |
|
|
|
pRenderContext->MatrixMode( MATERIAL_PROJECTION ); |
|
pRenderContext->PopMatrix(); |
|
} |
|
} |