diff options
Diffstat (limited to 'movieobjects/dmedrawsettings.cpp')
| -rw-r--r-- | movieobjects/dmedrawsettings.cpp | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/movieobjects/dmedrawsettings.cpp b/movieobjects/dmedrawsettings.cpp new file mode 100644 index 0000000..59b25f4 --- /dev/null +++ b/movieobjects/dmedrawsettings.cpp @@ -0,0 +1,265 @@ +//========= 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(); + } +}
\ No newline at end of file |