mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 14:16:50 +00:00
265 lines
7.8 KiB
C++
265 lines
7.8 KiB
C++
|
//========= 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();
|
||
|
}
|
||
|
}
|