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.
223 lines
8.1 KiB
223 lines
8.1 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
|
||
|
#ifndef TF_PLAYERMODELPANEL_H
|
||
|
#define TF_PLAYERMODELPANEL_H
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include "basemodel_panel.h"
|
||
|
#include "ichoreoeventcallback.h"
|
||
|
|
||
|
class CChoreoScene;
|
||
|
|
||
|
extern CMouthInfo g_ClientUIMouth;
|
||
|
|
||
|
// A model panel that knows how to imitate a TF2 player, including wielding/wearing unlockable items.
|
||
|
class CTFPlayerModelPanel : public CBaseModelPanel, public IChoreoEventCallback, public IHasLocalToGlobalFlexSettings, public IModelLoadCallback
|
||
|
{
|
||
|
DECLARE_CLASS_SIMPLE( CTFPlayerModelPanel, CBaseModelPanel );
|
||
|
public:
|
||
|
CTFPlayerModelPanel( vgui::Panel *pParent, const char *pName );
|
||
|
~CTFPlayerModelPanel( void );
|
||
|
|
||
|
void ApplySettings( KeyValues *inResourceData );
|
||
|
|
||
|
void SetToPlayerClass( int iClass, bool bIsRobot, bool bForceRefresh = false );
|
||
|
bool HoldItemInSlot( int iSlot );
|
||
|
bool HoldItem( int iItemNumber );
|
||
|
void SwitchHeldItemTo( CEconItemView *pItem );
|
||
|
void EquipRequiredLoadoutSlot( int iRequiredLoadoutSlot );
|
||
|
CEconItemView *GetHeldItem() { return m_pHeldItem; }
|
||
|
|
||
|
int AddCarriedItem( CEconItemView *pItem );
|
||
|
void ClearCarriedItems( void );
|
||
|
|
||
|
void PlayVCD( const char *pszVCD, const char *pszWeaponEntityRequired = NULL, bool bLoopVCD = true, bool bFileNameOnly = true );
|
||
|
|
||
|
// Handle animation events
|
||
|
virtual void FireEvent( const char *pszEventName, const char *pszEventOptions );
|
||
|
|
||
|
const CUtlVector<CEconItemView*> &GetCarriedItems() { return m_ItemsToCarry; }
|
||
|
int GetNumCarriedItems() const { return m_ItemsToCarry.Count(); }
|
||
|
int GetPlayerClass() const { return m_iCurrentClassIndex; }
|
||
|
Vector GetZoomOffset();
|
||
|
|
||
|
void ToggleZoom();
|
||
|
bool IsZoomed() { return m_bZoomedToHead; }
|
||
|
|
||
|
void SetTeam( int iTeam );
|
||
|
int GetTeam( void ) { return m_iTeam; }
|
||
|
|
||
|
void UpdatePreviewVisuals( void );
|
||
|
|
||
|
// From IChoreoEventCallback
|
||
|
virtual void StartEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event );
|
||
|
virtual void EndEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event );
|
||
|
virtual void ProcessEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event );
|
||
|
virtual bool CheckEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event );
|
||
|
virtual void SetupFlexWeights( void );
|
||
|
|
||
|
// IHasLocalToGlobalFlexSettings
|
||
|
virtual void EnsureTranslations( const flexsettinghdr_t *pSettinghdr );
|
||
|
int FlexControllerLocalToGlobal( const flexsettinghdr_t *pSettinghdr, int key );
|
||
|
|
||
|
// IModelLoadCallback
|
||
|
virtual void OnModelLoadComplete( const model_t *pModel );
|
||
|
|
||
|
void SetEyeGlowEffect ( const char *pEffectName, Vector vColor1, Vector vColor2, bool bForceUpdate, bool bPlaySparks );
|
||
|
|
||
|
void InvalidateParticleEffects();
|
||
|
|
||
|
protected:
|
||
|
// From CBaseModelPanel
|
||
|
virtual void PrePaint3D( IMatRenderContext *pRenderContext ) OVERRIDE;
|
||
|
virtual void PostPaint3D( IMatRenderContext *pRenderContext ) OVERRIDE;
|
||
|
virtual void RenderingRootModel( IMatRenderContext *pRenderContext, CStudioHdr *pStudioHdr, MDLHandle_t mdlHandle, matrix3x4_t *pWorldMatrix );
|
||
|
virtual void RenderingMergedModel( IMatRenderContext *pRenderContext, CStudioHdr *pStudioHdr, MDLHandle_t mdlHandle, matrix3x4_t *pWorldMatrix );
|
||
|
virtual IMaterial* GetOverrideMaterial( MDLHandle_t mdlHandle ) OVERRIDE;
|
||
|
|
||
|
private:
|
||
|
|
||
|
enum modelpanel_particle_system_t
|
||
|
{
|
||
|
SYSTEM_HEAD = 0,
|
||
|
SYSTEM_MISC1,
|
||
|
SYSTEM_MISC2,
|
||
|
SYSTEM_WEAPON, // there can only be one weapon equipped
|
||
|
SYSTEM_ACTIONSLOT,
|
||
|
SYSTEM_EYEGLOW_LEFT,
|
||
|
SYSTEM_EYEGLOW_RIGHT,
|
||
|
SYSTEM_EYESPARK_LEFT,
|
||
|
SYSTEM_EYESPARK_RIGHT,
|
||
|
SYSTEM_TAUNT,
|
||
|
SYSTEM_COUNT,
|
||
|
};
|
||
|
|
||
|
// Choreo Scene handling
|
||
|
void ClearScene( void );
|
||
|
void ProcessSequence( CChoreoScene *scene, CChoreoEvent *event );
|
||
|
void ProcessExpression( CChoreoScene *scene, CChoreoEvent *event );
|
||
|
void ProcessFlexSettingSceneEvent( CChoreoScene *scene, CChoreoEvent *event );
|
||
|
void ProcessLoop( CChoreoScene *scene, CChoreoEvent *event );
|
||
|
void AddFlexSetting( const char *expr, float scale, const flexsettinghdr_t *pSettinghdr );
|
||
|
void ProcessFlexAnimation( CChoreoScene *scene, CChoreoEvent *event );
|
||
|
void SetFlexWeight( LocalFlexController_t index, float value );
|
||
|
float GetFlexWeight( LocalFlexController_t index );
|
||
|
|
||
|
LocalFlexController_t GetNumFlexControllers( void );
|
||
|
const char *GetFlexDescFacs( int iFlexDesc );
|
||
|
const char *GetFlexControllerName( LocalFlexController_t iFlexController );
|
||
|
const char *GetFlexControllerType( LocalFlexController_t iFlexController );
|
||
|
LocalFlexController_t FindFlexController( const char *szName );
|
||
|
|
||
|
// Mouth processing
|
||
|
CMouthInfo& MouthInfo() { return g_ClientUIMouth; }
|
||
|
void ProcessVisemes( Emphasized_Phoneme *classes );
|
||
|
void AddVisemesForSentence( Emphasized_Phoneme *classes, float emphasis_intensity, CSentence *sentence, float t, float dt, bool juststarted );
|
||
|
void AddViseme( Emphasized_Phoneme *classes, float emphasis_intensity, int phoneme, float scale, bool newexpression );
|
||
|
bool SetupEmphasisBlend( Emphasized_Phoneme *classes, int phoneme );
|
||
|
void ComputeBlendedSetting( Emphasized_Phoneme *classes, float emphasis_intensity );
|
||
|
void InitPhonemeMappings( void );
|
||
|
void SetupMappings( char const *pchFileRoot );
|
||
|
|
||
|
void HoldFirstValidItem( void );
|
||
|
void EquipAllWearables( CEconItemView *pHeldItem );
|
||
|
void EquipItem( CEconItemView *pItem );
|
||
|
bool UpdateHeldItem( int iDesiredSlot );
|
||
|
void UpdateWeaponBodygroups( bool bModifyDeployedOnlyBodygroups );
|
||
|
void UpdateHiddenBodyGroups( CEconItemView* pItem );
|
||
|
CEconItemView *GetItemInSlot( int iSlot );
|
||
|
CEconItemView *GetPreviewItem( CEconItemView *pMatchItem );
|
||
|
|
||
|
// Use this instead of SetMergeModel() - handles dynamic asset allocation
|
||
|
void LoadAndAttachAdditionalModel( const char *pMDLName, CEconItemView *pItem );
|
||
|
bool FinishAttachAdditionalModel( const model_t *pModel );
|
||
|
void RemoveAdditionalModels( void );
|
||
|
|
||
|
bool UpdateCosmeticParticles(
|
||
|
IMatRenderContext *pRenderContext,
|
||
|
CStudioHdr *pStudioHdr,
|
||
|
MDLHandle_t mdlHandle,
|
||
|
matrix3x4_t *pWorldMatrix,
|
||
|
modelpanel_particle_system_t iSystem,
|
||
|
CEconItemView *pEconItem
|
||
|
);
|
||
|
|
||
|
void UpdateEyeGlows( IMatRenderContext *pRenderContext, CStudioHdr *pStudioHdr, MDLHandle_t mdlHandle, matrix3x4_t *pWorldMatrix, bool bIsRightEye );
|
||
|
void UpdateActionSlotEffects( IMatRenderContext *pRenderContext, CStudioHdr *pStudioHdr, MDLHandle_t mdlHandle, matrix3x4_t *pWorldMatrix );
|
||
|
void UpdateTauntEffects( IMatRenderContext *pRenderContext, CStudioHdr *pStudioHdr, MDLHandle_t mdlHandle, matrix3x4_t *pWorldMatrix );
|
||
|
|
||
|
int m_iCurrentClassIndex;
|
||
|
int m_iCurrentSlotIndex;
|
||
|
CUtlVector<CEconItemView*> m_ItemsToCarry; // Items that our player should be seen carrying
|
||
|
QAngle m_angPlayerOrg;
|
||
|
|
||
|
int m_nBody;
|
||
|
int m_iTeam;
|
||
|
bool m_bZoomedToHead;
|
||
|
|
||
|
MDLHandle_t m_MergeMDL;
|
||
|
|
||
|
CEconItemView *m_pHeldItem;
|
||
|
|
||
|
const char *m_pszVCD;
|
||
|
const char *m_pszWeaponEntityRequired;
|
||
|
bool m_bLoopVCD;
|
||
|
bool m_bVCDFileNameOnly;
|
||
|
|
||
|
CChoreoScene *m_pScene;
|
||
|
float m_flSceneTime;
|
||
|
float m_flSceneEndTime;
|
||
|
float m_flLastTickTime;
|
||
|
bool m_bLoopScene;
|
||
|
|
||
|
CUtlVector< CRefCountedModelIndex > m_vecDynamicAssetsLoaded;
|
||
|
CUtlVector< CEconItemView* > m_vecItemsLoaded;
|
||
|
|
||
|
struct CustomClassData_t
|
||
|
{
|
||
|
float m_flFOV;
|
||
|
Vector m_vPosition;
|
||
|
QAngle m_vAngles;
|
||
|
};
|
||
|
CUtlVector< CustomClassData_t > m_customClassData;
|
||
|
|
||
|
// Choreo scenes
|
||
|
bool m_bShouldRunFlexEvents;
|
||
|
float m_flexWeight[ MAXSTUDIOFLEXCTRL ];
|
||
|
Emphasized_Phoneme m_PhonemeClasses[ NUM_PHONEME_CLASSES ];
|
||
|
CUtlRBTree< FS_LocalToGlobal_t, unsigned short > m_LocalToGlobal;
|
||
|
|
||
|
// The particle system to draw
|
||
|
particle_data_t *m_aParticleSystems[ SYSTEM_COUNT ];
|
||
|
|
||
|
bool m_bUpdateEyeGlows;
|
||
|
bool m_bPlaySparks;
|
||
|
|
||
|
char m_pszEyeGlowParticleName[MAX_PATH];
|
||
|
Vector m_vEyeGlowColor1;
|
||
|
Vector m_vEyeGlowColor2;
|
||
|
bool m_bDrawActionSlotEffects;
|
||
|
bool m_bDrawTauntParticles;
|
||
|
|
||
|
float m_flTauntParticleRefireTime;
|
||
|
float m_flTauntParticleRefireRate;
|
||
|
|
||
|
bool m_bIsRobot;
|
||
|
|
||
|
CPanelAnimationVar( bool, m_bDisableSpeakEvent, "disable_speak_event", "0" );
|
||
|
|
||
|
CEconItemView *GetLoadoutItemFromMDLHandle( loadout_positions_t iPosition, MDLHandle_t mdlHandle );
|
||
|
bool RenderStatTrack( CStudioHdr *pStudioHdr, matrix3x4_t *pWorldMatrix );
|
||
|
MDLData_t m_StatTrackModel;
|
||
|
float m_flStatTrackScale;
|
||
|
};
|
||
|
|
||
|
#endif // TF_PLAYERMODELPANEL_H
|