summaryrefslogtreecommitdiff
path: root/sfmobjects/sfmsession.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /sfmobjects/sfmsession.cpp
downloadarchived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz
archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip
Diffstat (limited to 'sfmobjects/sfmsession.cpp')
-rw-r--r--sfmobjects/sfmsession.cpp285
1 files changed, 285 insertions, 0 deletions
diff --git a/sfmobjects/sfmsession.cpp b/sfmobjects/sfmsession.cpp
new file mode 100644
index 0000000..4cd63f4
--- /dev/null
+++ b/sfmobjects/sfmsession.cpp
@@ -0,0 +1,285 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// A class representing session state for the SFM
+//
+//=============================================================================
+
+#include "sfmobjects/sfmsession.h"
+#include "studio.h"
+#include "movieobjects/dmechannel.h"
+#include "movieobjects/dmetrack.h"
+#include "movieobjects/dmeclip.h"
+#include "movieobjects/dmecamera.h"
+#include "movieobjects/dmetimeselection.h"
+#include "movieobjects/dmeanimationset.h"
+#include "movieobjects/dmegamemodel.h"
+
+
+//-----------------------------------------------------------------------------
+// Constructor
+//-----------------------------------------------------------------------------
+CSFMSession::CSFMSession()
+{
+ m_hRoot = NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+// Sets the root
+//-----------------------------------------------------------------------------
+void CSFMSession::SetRoot( CDmElement *pRoot )
+{
+ m_hRoot = pRoot;
+}
+
+
+//-----------------------------------------------------------------------------
+// Creates a new (empty) session
+//-----------------------------------------------------------------------------
+void CSFMSession::Init()
+{
+ m_hRoot = NULL;
+
+ // a movie currently consists of: (this is all just temporary until clips take over more completely)
+ // a generic "root" node
+ // movie - a clip node whose subclips are the movie sequence
+ // cameras - an array of cameras used throughout the movie
+ // clips - an array of clips used throughout the movie
+ CDmElement *pRoot = CreateElement< CDmElement >( "session" );
+ Assert( pRoot );
+ if ( !pRoot )
+ return;
+ m_hRoot = pRoot;
+
+ // FIXME!
+ pRoot->SetValue( "editorType", "ifm" );
+
+ CDmeFilmClip *pFilmClip = CreateElement<CDmeFilmClip>( "sequence" );
+ Assert( pFilmClip != NULL );
+ pFilmClip->SetDuration( DmeTime_t( 60.0f ) );
+
+ CDmeTrack *pTrack = pFilmClip->FindOrCreateFilmTrack();
+ CDmeClip *pShot = CreateElement<CDmeFilmClip>( "shot" );
+ pTrack->AddClip( pShot );
+ pShot->SetDuration( DmeTime_t( 60.0f ) );
+
+ pRoot->SetValue( "activeClip", pFilmClip );
+
+ pRoot->AddAttributeElementArray< CDmElement >( "miscBin" );
+ pRoot->AddAttributeElementArray< CDmeCamera >( "cameraBin" );
+ CDmAttribute *pClipBin = pRoot->AddAttributeElementArray< CDmeClip >( "clipBin" );
+
+ // Don't allow duplicates in the clipBin
+ pClipBin->AddFlag( FATTRIB_NODUPLICATES );
+
+ CDmrElementArray<> clipBin( pRoot, "clipBin" );
+ clipBin.AddToTail( pFilmClip );
+
+ CreateSessionSettings();
+}
+
+
+//-----------------------------------------------------------------------------
+// Shuts down the session
+//-----------------------------------------------------------------------------
+void CSFMSession::Shutdown()
+{
+ if ( m_hRoot.Get() )
+ {
+ if ( m_hRoot->GetFileId() != DMFILEID_INVALID )
+ {
+ g_pDataModel->RemoveFileId( m_hRoot->GetFileId() );
+ m_hRoot = NULL;
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Creates session settings
+//-----------------------------------------------------------------------------
+void CSFMSession::CreateSessionSettings()
+{
+ if ( !m_hRoot.Get() )
+ return;
+
+ m_hRoot->AddAttribute( "settings", AT_ELEMENT );
+
+ CDmElement *pSettings = m_hRoot->GetValueElement< CDmElement >( "settings" );
+ if ( !pSettings )
+ {
+ pSettings = CreateElement< CDmElement >( "sessionSettings", m_hRoot->GetFileId() );
+ m_hRoot->SetValue( "settings", pSettings );
+ }
+
+ Assert( pSettings );
+
+ CDmeTimeSelection *ts = NULL;
+ if ( !pSettings->HasAttribute( "timeSelection" ) )
+ {
+ ts = CreateElement< CDmeTimeSelection >( "timeSelection", m_hRoot->GetFileId() );
+ pSettings->SetValue( "timeSelection", ts );
+ }
+
+ pSettings->InitValue( "animationSetOverlayBackground", Color( 0, 0, 0, 192 ) );
+
+ if ( !pSettings->HasAttribute( "standardColors" ) )
+ {
+ CDmrArray<Color> colors( pSettings, "standardColors", true );
+ colors.AddToTail( Color( 0, 0, 0, 128 ) );
+ colors.AddToTail( Color( 194, 120, 0, 128 ) );
+ colors.AddToTail( Color( 255, 0, 100, 128 ) );
+ colors.AddToTail( Color( 200, 200, 255, 128 ) );
+ colors.AddToTail( Color( 255, 255, 255, 128 ) );
+ }
+
+ float flLegacyFrameRate = 24.0f;
+ if ( pSettings->HasAttribute( "frameRate" ) )
+ {
+ flLegacyFrameRate = pSettings->GetValue<float>( "frameRate" );
+
+ // remove this from the base level settings area since we're going to add it in renderSettings
+ pSettings->RemoveAttribute( "frameRate" );
+ }
+
+ if ( !pSettings->HasAttribute( "proceduralPresets" ) )
+ {
+ CDmeProceduralPresetSettings *ps = CreateElement< CDmeProceduralPresetSettings >( "proceduralPresets", m_hRoot->GetFileId() );
+ pSettings->SetValue( "proceduralPresets", ps );
+ }
+
+ CreateRenderSettings( pSettings, flLegacyFrameRate );
+}
+
+
+//-----------------------------------------------------------------------------
+// Creates session render settings
+// JasonM - remove flLegacyFramerate param eventually (perhaps March 2007)
+//-----------------------------------------------------------------------------
+void CSFMSession::CreateRenderSettings( CDmElement *pSettings, float flLegacyFramerate )
+{
+ pSettings->AddAttribute( "renderSettings", AT_ELEMENT );
+
+ CDmElement *pRenderSettings = pSettings->GetValueElement< CDmElement >( "renderSettings" );
+ if ( !pRenderSettings )
+ {
+ pRenderSettings = CreateElement< CDmElement >( "renderSettings", pSettings->GetFileId() );
+ pSettings->SetValue( "renderSettings", pRenderSettings );
+ }
+ Assert( pRenderSettings );
+
+ pRenderSettings->InitValue( "frameRate", flLegacyFramerate ); // Default framerate
+ pRenderSettings->InitValue( "lightAverage", 0 ); // Don't light average by default
+ pRenderSettings->InitValue( "showFocalPlane", 0 ); // Don't show focal plane by default
+ pRenderSettings->InitValue( "modelLod", 0 ); // Don't do model LOD by default
+
+ CreateProgressiveRefinementSettings( pRenderSettings );
+}
+
+
+//-----------------------------------------------------------------------------
+// Creates session progrssing refinement settings
+//-----------------------------------------------------------------------------
+void CSFMSession::CreateProgressiveRefinementSettings( CDmElement *pRenderSettings )
+{
+ // Do we already have Progressive refinement settings?
+ CDmElement *pRefinementSettings = pRenderSettings->GetValueElement< CDmElement >( "ProgressiveRefinement" );
+ if ( !pRefinementSettings )
+ {
+ pRefinementSettings = CreateElement< CDmElement >( "ProgressiveRefinementSettings", pRenderSettings->GetFileId() );
+ pRenderSettings->SetValue( "ProgressiveRefinement", pRefinementSettings );
+ }
+
+ // Set up defaults for progressive refinement settings...
+ pRefinementSettings->InitValue( "on", true );
+ pRefinementSettings->InitValue( "useDepthOfField", true );
+ pRefinementSettings->InitValue( "overrideDepthOfFieldQuality", false );
+ pRefinementSettings->InitValue( "overrideDepthOfFieldQualityValue", 1 );
+ pRefinementSettings->InitValue( "useMotionBlur", true );
+ pRefinementSettings->InitValue( "overrideMotionBlurQuality", false );
+ pRefinementSettings->InitValue( "overrideMotionBlurQualityValue", 1 );
+ pRefinementSettings->InitValue( "useAntialiasing", false );
+ pRefinementSettings->InitValue( "overrideShutterSpeed", false );
+ pRefinementSettings->InitValue( "overrideShutterSpeedValue", 1.0f / 48.0f );
+}
+
+
+//-----------------------------------------------------------------------------
+// Creates a camera
+//-----------------------------------------------------------------------------
+CDmeCamera *CSFMSession::CreateCamera( const DmeCameraParams_t& params )
+{
+ CDmeCamera *pCamera = CreateElement< CDmeCamera >( params.name, m_hRoot->GetFileId() );
+
+ // Set parameters
+ matrix3x4_t txform;
+ AngleMatrix( params.angles, params.origin, txform );
+
+ CDmeTransform *pTransform = pCamera->GetTransform();
+ if ( pTransform )
+ {
+ pTransform->SetTransform( txform );
+ }
+
+ pCamera->SetFOVx( params.fov );
+ return pCamera;
+}
+
+
+//-----------------------------------------------------------------------------
+// Finds or creates a scene
+//-----------------------------------------------------------------------------
+CDmeDag *CSFMSession::FindOrCreateScene( CDmeFilmClip *pShot, const char *pSceneName )
+{
+ CDmeDag *pScene = pShot->GetScene();
+ if ( !pScene )
+ {
+ pScene = CreateElement< CDmeDag >( "scene", pShot->GetFileId() );
+ pShot->SetScene( pScene );
+ }
+ Assert( pScene );
+
+ int c = pScene->GetChildCount();
+ for ( int i = 0 ; i < c; ++i )
+ {
+ CDmeDag *pChild = pScene->GetChild( i );
+ if ( pChild && !Q_stricmp( pChild->GetName(), pSceneName ) )
+ return pChild;
+ }
+
+ CDmeDag *pNewScene = CreateElement< CDmeDag >( pSceneName, pScene->GetFileId() );
+ pScene->AddChild( pNewScene );
+
+ return pNewScene;
+}
+
+
+//-----------------------------------------------------------------------------
+// Creates a game model
+//-----------------------------------------------------------------------------
+CDmeGameModel *CSFMSession::CreateEditorGameModel( studiohdr_t *hdr, const Vector &vecOrigin, Quaternion &qOrientation )
+{
+ char pBaseName[ 256 ];
+ Q_FileBase( hdr->pszName(), pBaseName, sizeof( pBaseName ) );
+
+ char pGameModelName[ 256 ];
+ Q_snprintf( pGameModelName, sizeof( pGameModelName ), "%s_GameModel", pBaseName );
+ CDmeGameModel *pGameModel = CreateElement< CDmeGameModel >( pGameModelName, m_hRoot->GetFileId() );
+
+ char pRelativeModelsFileName[MAX_PATH];
+ Q_ComposeFileName( "models", hdr->pszName(), pRelativeModelsFileName, sizeof(pRelativeModelsFileName) );
+ pGameModel->SetValue( "modelName", pRelativeModelsFileName );
+
+ CDmeTransform *pTransform = pGameModel->GetTransform();
+ if ( pTransform )
+ {
+ pTransform->SetPosition( vecOrigin );
+ pTransform->SetOrientation( qOrientation );
+ }
+
+ // create, connect and cache each bone's pos and rot channels
+ pGameModel->AddBones( hdr, pBaseName, 0, hdr->numbones );
+ return pGameModel;
+}
+
+