summaryrefslogtreecommitdiff
path: root/hammer/mapoverlaytrans.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 /hammer/mapoverlaytrans.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'hammer/mapoverlaytrans.cpp')
-rw-r--r--hammer/mapoverlaytrans.cpp389
1 files changed, 389 insertions, 0 deletions
diff --git a/hammer/mapoverlaytrans.cpp b/hammer/mapoverlaytrans.cpp
new file mode 100644
index 0000000..27050cb
--- /dev/null
+++ b/hammer/mapoverlaytrans.cpp
@@ -0,0 +1,389 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+//
+//=============================================================================
+
+#include <stdafx.h>
+#include "MapEntity.h"
+#include "MapOverlayTrans.h"
+#include "DispShore.h"
+#include "TextureSystem.h"
+#include "ChunkFile.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CMapOverlayTransition::CMapOverlayTransition()
+{
+ m_ShoreData.m_pTexture = NULL;
+ m_ShoreData.m_vecLengthTexcoord.Init();
+ m_ShoreData.m_vecWidthTexcoord.Init();
+ m_ShoreData.m_flWidths[0] = 0.0f;
+ m_ShoreData.m_flWidths[1] = 0.0f;
+ m_bIsWater = true;
+ m_aFaceCache1.Purge();
+ m_aFaceCache2.Purge();
+ m_bDebugDraw = false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CMapOverlayTransition::~CMapOverlayTransition()
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// NOTE: static
+//-----------------------------------------------------------------------------
+CMapClass *CMapOverlayTransition::Create( CHelperInfo *pInfo, CMapEntity *pParent )
+{
+ CMapOverlayTransition *pOverlayTrans = new CMapOverlayTransition;
+ return pOverlayTrans;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Called after the entire map has been loaded. This allows the object
+// to perform any linking with other map objects or to do other operations
+// that require all world objects to be present.
+// Input : pWorld - The world that we are in.
+//-----------------------------------------------------------------------------
+void CMapOverlayTransition::PostloadWorld( CMapWorld *pWorld )
+{
+ OnApply();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CMapOverlayTransition::CalcBounds( BOOL bFullUpdate )
+{
+ CMapClass::CalcBounds( bFullUpdate );
+
+ Shoreline_t *pShoreline = GetShoreManager()->GetShoreline( ( int )GetParent() );
+ if ( pShoreline )
+ {
+ Vector vecMins( 99999.0f, 99999.0f, 99999.0f );
+ Vector vecMaxs( -99999.0f, -99999.0f, -99999.0f );
+
+ m_Render2DBox.ResetBounds();
+ m_CullBox.ResetBounds();
+
+ int nSegmentCount = pShoreline->m_aSegments.Count();
+ for ( int iSegment = 0; iSegment < nSegmentCount; ++iSegment )
+ {
+ for ( int iAxis = 0; iAxis < 3; ++iAxis )
+ {
+ if ( pShoreline->m_aSegments[iSegment].m_vecPoints[0][iAxis] < vecMins[iAxis] )
+ {
+ vecMins[iAxis] = pShoreline->m_aSegments[iSegment].m_vecPoints[0][iAxis];
+ }
+
+ if ( pShoreline->m_aSegments[iSegment].m_vecPoints[1][iAxis] < vecMins[iAxis] )
+ {
+ vecMins[iAxis] = pShoreline->m_aSegments[iSegment].m_vecPoints[1][iAxis];
+ }
+
+ if ( pShoreline->m_aSegments[iSegment].m_vecPoints[0][iAxis] > vecMaxs[iAxis] )
+ {
+ vecMaxs[iAxis] = pShoreline->m_aSegments[iSegment].m_vecPoints[0][iAxis];
+ }
+
+ if ( pShoreline->m_aSegments[iSegment].m_vecPoints[1][iAxis] > vecMaxs[iAxis] )
+ {
+ vecMaxs[iAxis] = pShoreline->m_aSegments[iSegment].m_vecPoints[1][iAxis];
+ }
+ }
+ }
+
+ m_Render2DBox.UpdateBounds( vecMins, vecMaxs );
+ m_CullBox = m_Render2DBox;
+ m_BoundingBox = m_CullBox;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CMapClass *CMapOverlayTransition::Copy( bool bUpdateDependencies )
+{
+ CMapOverlayTransition *pCopy = new CMapOverlayTransition;
+ if ( pCopy )
+ {
+ pCopy->CopyFrom( this, bUpdateDependencies );
+ }
+
+ return pCopy;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CMapClass *CMapOverlayTransition::CopyFrom( CMapClass *pObject, bool bUpdateDependencies )
+{
+ // Verify the object is of the correct type and cast.
+ Assert( pObject->IsMapClass( MAPCLASS_TYPE( CMapOverlayTransition ) ) );
+ CMapOverlayTransition *pFrom = ( CMapOverlayTransition* )pObject;
+ if ( pFrom )
+ {
+ m_ShoreData.m_pTexture = pFrom->m_ShoreData.m_pTexture;
+ m_ShoreData.m_vecLengthTexcoord = pFrom->m_ShoreData.m_vecLengthTexcoord;
+ m_ShoreData.m_vecWidthTexcoord = pFrom->m_ShoreData.m_vecWidthTexcoord;
+ m_ShoreData.m_flWidths[0] = pFrom->m_ShoreData.m_flWidths[0];
+ m_ShoreData.m_flWidths[1] = pFrom->m_ShoreData.m_flWidths[1];
+ }
+
+ return this;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CMapOverlayTransition::OnParentKeyChanged( const char* szKey, const char* szValue )
+{
+ // Material data.
+ if ( !stricmp( szKey, "material" ) )
+ {
+ IEditorTexture *pTex = g_Textures.FindActiveTexture( szValue );
+ if ( pTex )
+ {
+ m_ShoreData.m_pTexture = pTex;
+ }
+ }
+
+ // Texture data.
+ if ( !stricmp( szKey, "LengthTexcoordStart" ) )
+ {
+ m_ShoreData.m_vecLengthTexcoord[0] = atof( szValue );
+ }
+ if ( !stricmp( szKey, "LengthTexcoordEnd" ) )
+ {
+ m_ShoreData.m_vecLengthTexcoord[1] = atof( szValue );
+ }
+ if ( !stricmp( szKey, "WidthTexcoordStart" ) )
+ {
+ m_ShoreData.m_vecWidthTexcoord[0] = atof( szValue );
+ }
+ if ( !stricmp( szKey, "WidthTexcoordEnd" ) )
+ {
+ m_ShoreData.m_vecWidthTexcoord[1] = atof( szValue );
+ }
+
+ // Width data.
+ if ( !stricmp( szKey, "Width1" ) )
+ {
+ m_ShoreData.m_flWidths[0] = atof( szValue );
+ }
+ if ( !stricmp( szKey, "Width2" ) )
+ {
+ m_ShoreData.m_flWidths[1] = atof( szValue );
+ }
+
+ // Debug data.
+ if ( !stricmp( szKey, "DebugDraw" ) )
+ {
+ m_bDebugDraw = true;
+ if ( atoi( szValue ) == 0 )
+ {
+ m_bDebugDraw = false;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CMapOverlayTransition::OnNotifyDependent( CMapClass *pObject, Notify_Dependent_t eNotifyType )
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CMapOverlayTransition::OnAddToWorld( CMapWorld *pWorld )
+{
+ OnApply();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CMapOverlayTransition::OnRemoveFromWorld( CMapWorld *pWorld, bool bNotifyChildren )
+{
+ GetShoreManager()->RemoveShoreline( ( int )GetParent() );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CMapOverlayTransition::OnUndoRedo( void )
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CMapOverlayTransition::DoTransform( const VMatrix& matrix )
+{
+ return;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CMapOverlayTransition::OnPaste( CMapClass *pCopy, CMapWorld *pSourceWorld, CMapWorld *pDestWorld, const CMapObjectList &OriginalList, CMapObjectList &NewList)
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CMapOverlayTransition::OnClone( CMapClass *pClone, CMapWorld *pWorld, const CMapObjectList &OriginalList, CMapObjectList &NewList )
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CMapOverlayTransition::Render3D( CRender3D *pRender )
+{
+ GetShoreManager()->Draw( pRender );
+ if ( m_bDebugDraw )
+ {
+ GetShoreManager()->DebugDraw( pRender );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Generate a face list from the parent entities' side list child.
+//-----------------------------------------------------------------------------
+bool CMapOverlayTransition::BuildFaceCaches( void )
+{
+ CMapEntity *pEntity = dynamic_cast<CMapEntity*>( GetParent() );
+ if ( pEntity )
+ {
+ const CMapObjectList *pChildren = pEntity->GetChildren();
+ FOR_EACH_OBJ( *pChildren, pos )
+ {
+ CMapSideList *pSideList = dynamic_cast<CMapSideList*>( pChildren->Element(pos) );
+ if ( pSideList )
+ {
+ // Check name.
+ if ( !stricmp( "sides" ,pSideList->GetKeyName() ) )
+ {
+ int nFaceCount = pSideList->GetFaceCount();
+ for ( int iFace = 0; iFace < nFaceCount; ++iFace )
+ {
+ m_aFaceCache1.AddToTail( pSideList->GetFace( iFace ) );
+ }
+ }
+ else if ( !stricmp( "sides2", pSideList->GetKeyName() ) )
+ {
+ int nFaceCount = pSideList->GetFaceCount();
+ for ( int iFace = 0; iFace < nFaceCount; ++iFace )
+ {
+ if ( m_bIsWater )
+ {
+ // Verify that the face is a water face.
+ if ( pSideList->GetFace( iFace )->GetTexture()->IsWater() )
+ {
+ m_aFaceCache2.AddToTail( pSideList->GetFace( iFace ) );
+ }
+ }
+ else
+ {
+ m_aFaceCache2.AddToTail( pSideList->GetFace( iFace ) );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return ( ( m_aFaceCache1.Count() > 0 ) && ( m_aFaceCache2.Count() > 0 ) );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Create the transition overlays.
+//-----------------------------------------------------------------------------
+bool CMapOverlayTransition::OnApply( void )
+{
+ if ( m_bIsWater )
+ {
+ // Create the shoreline.
+ if ( GetShoreManager()->Init() )
+ {
+ if ( BuildFaceCaches() )
+ {
+ m_nShorelineId = ( int )GetParent();
+
+ GetShoreManager()->AddShoreline( m_nShorelineId );
+ Shoreline_t *pShoreline = GetShoreManager()->GetShoreline( m_nShorelineId );
+ pShoreline->m_ShoreData = m_ShoreData;
+
+ GetShoreManager()->BuildShoreline( m_nShorelineId, m_aFaceCache1, m_aFaceCache2 );
+
+ // Clean up the face list.
+ m_aFaceCache1.Purge();
+ m_aFaceCache2.Purge();
+ }
+
+ GetShoreManager()->Shutdown();
+ }
+
+ // Post updated.
+ PostUpdate( Notify_Changed );
+
+ return true;
+ }
+ else
+ {
+ // This part is not implemented yet!
+ return true;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+ChunkFileResult_t CMapOverlayTransition::LoadVMF( CChunkFile *pFile )
+{
+ // This doesn't need to be implemented until we can "edit" the overlay data. For
+ // now just regenerate the data.
+
+ return ChunkFile_Ok;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+ChunkFileResult_t CMapOverlayTransition::SaveVMF( CChunkFile *pFile, CSaveInfo *pSaveInfo )
+{
+ ChunkFileResult_t eResult = pFile->BeginChunk("overlaytransition");
+
+ m_nShorelineId = ( int )GetParent();
+ Shoreline_t *pShoreline = GetShoreManager()->GetShoreline( m_nShorelineId );
+ if ( pShoreline )
+ {
+ int nOverlayCount = pShoreline->m_aOverlays.Count();
+ for ( int iOverlay = 0; iOverlay < nOverlayCount; ++iOverlay )
+ {
+ CMapOverlay *pOverlay = &pShoreline->m_aOverlays[iOverlay];
+ if ( pOverlay )
+ {
+ pOverlay->SaveDataToVMF( pFile, pSaveInfo );
+ }
+ }
+ }
+
+ if ( eResult == ChunkFile_Ok )
+ {
+ eResult = pFile->EndChunk();
+ }
+
+ return eResult;
+}