summaryrefslogtreecommitdiff
path: root/hammer/op_entity.h
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/op_entity.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'hammer/op_entity.h')
-rw-r--r--hammer/op_entity.h426
1 files changed, 426 insertions, 0 deletions
diff --git a/hammer/op_entity.h b/hammer/op_entity.h
new file mode 100644
index 0000000..e8db2db
--- /dev/null
+++ b/hammer/op_entity.h
@@ -0,0 +1,426 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#ifndef OP_ENTITY_H
+#define OP_ENTITY_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "AutoSelCombo.h"
+#include "ChunkFile.h"
+#include "ListBoxEx.h"
+#include "AngleBox.h"
+#include "fgdlib/WCKeyValues.h"
+#include "MapFace.h"
+#include "ObjectPage.h"
+#include "ToolPickAngles.h"
+#include "ToolPickEntity.h"
+#include "ToolPickFace.h"
+#include "FilteredComboBox.h"
+#include "AnchorMgr.h"
+#include "ModelBrowser.h"
+
+class CEditGameClass;
+class COP_Entity;
+class COP_Flags;
+class CMyComboBox;
+
+//-----------------------------------------------------------------------------
+// Owner-draw list control that uses cool colors to show
+// the state of items.
+//-----------------------------------------------------------------------------
+class CColoredListCtrl : public CListCtrl
+{
+public:
+
+ class IItemColorCallback
+ {
+ public:
+ // This is called for every item to get its colors.
+ virtual void GetItemColor( int iItem, COLORREF *pBackgroundColor, COLORREF *pTextColor ) = 0;
+
+ // This is called for every item so you can draw custom stuff in its value column.
+ // The RECT inside the DRAWITEMSTRUCT contains the whole row, and pRect contains the rect for the value column only.
+ // Return true if you don't want CColoredListControl to draw its value.
+ virtual bool CustomDrawItemValue( const LPDRAWITEMSTRUCT p, const RECT *pRect ) = 0;
+ };
+
+public:
+ CColoredListCtrl( IItemColorCallback *pCallback );
+
+ virtual void DrawItem( LPDRAWITEMSTRUCT p );
+
+private:
+ IItemColorCallback *m_pCallback;
+};
+
+
+//-----------------------------------------------------------------------------
+// Purpose: A little glue object that connects the angles picker tool to our dialog.
+//-----------------------------------------------------------------------------
+class CPickAnglesTarget : public IPickAnglesTarget
+{
+ public:
+
+ void AttachEntityDlg(COP_Entity *pDlg) { m_pDlg = pDlg; }
+ void OnNotifyPickAngles(const Vector &vecPos);
+
+ private:
+
+ COP_Entity *m_pDlg;
+};
+
+
+//-----------------------------------------------------------------------------
+// Purpose: A little glue object that connects the entity picker tool to our dialog.
+// Currently this gets the value of a given key and puts that into the smart
+// control.
+//-----------------------------------------------------------------------------
+class CPickEntityTarget : public IPickEntityTarget
+{
+ public:
+
+ inline CPickEntityTarget();
+ void AttachEntityDlg(COP_Entity *pDlg) { m_pDlg = pDlg; }
+ inline void SetKeyToRetrieve(const char *pszKey);
+ void OnNotifyPickEntity(CToolPickEntity *pTool);
+
+ private:
+
+ char m_szKey[MAX_KEYVALUE_LEN]; // The name of the key we are going to slurp out of the entity.
+ COP_Entity *m_pDlg; // The dialog to receive the key value.
+};
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CPickEntityTarget::CPickEntityTarget()
+{
+ m_szKey[0] = '\0';
+ m_pDlg = NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : pszKey -
+//-----------------------------------------------------------------------------
+void CPickEntityTarget::SetKeyToRetrieve(const char *pszKey)
+{
+ strncpy(m_szKey, pszKey, sizeof(m_szKey) - 1);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: A little glue object that connects the face picker tool to our dialog.
+//-----------------------------------------------------------------------------
+class CPickFaceTarget : public IPickFaceTarget
+{
+ public:
+
+ void AttachEntityDlg(COP_Entity *pDlg) { m_pDlg = pDlg; }
+ void OnNotifyPickFace(CToolPickFace *pTool);
+
+ private:
+
+ COP_Entity *m_pDlg;
+};
+
+
+enum EKeyState
+{
+ k_EKeyState_DefaultFGDValue=0, // This key is unmodified from its default value in the FGD.
+ k_EKeyState_Modified=1, // This key is in the FGD, and its value has been modified.
+ k_EKeyState_AddedManually, // This key was added manually (i.e. it does not exist in the FGD).
+ k_EKeyState_InstanceParm,
+};
+
+
+class CInstanceParmData
+{
+public:
+ GDinputvariable *m_ParmVariable;
+ CString m_ParmKey;
+ CString m_VariableName;
+};
+
+
+// This class just routes the OnTextChanged call into COP_Entity.
+class CSmartControlTargetNameRouter : public CFilteredComboBox::ICallbacks
+{
+public:
+ CSmartControlTargetNameRouter( COP_Entity *pDlg );
+
+ virtual void OnTextChanged( const char *pText );
+
+private:
+ COP_Entity *m_pDlg;
+};
+
+
+class COP_Entity : public CObjectPage, CFilteredComboBox::ICallbacks, public CColoredListCtrl::IItemColorCallback
+{
+ DECLARE_DYNCREATE(COP_Entity)
+ typedef CObjectPage BaseClass;
+
+ friend int InternalSortByColumn( COP_Entity *pDlg, const char *pShortName1, const char *pShortName2, int iColumn );
+ friend int CALLBACK SortByItemEditedState( LPARAM iItem1, LPARAM iItem2, LPARAM lpParam );
+ friend class CColoredListCtrl;
+
+ // Construction
+ public:
+
+ COP_Entity();
+ ~COP_Entity();
+
+ virtual void MarkDataDirty();
+
+ //
+ // Interface for property sheet.
+ //
+ virtual bool SaveData(void);
+ virtual void UpdateData( int Mode, PVOID pData, bool bCanEdit );
+ virtual void RememberState(void);
+
+ //
+ // Interface for custom edit control.
+ //
+ void SetNextVar(int cmd);
+
+ void SetFlagsPage( COP_Flags *pFlagsPage );
+ void OnUpdateSpawnFlags( unsigned long preserveMask, unsigned long newValues );
+
+ //{{AFX_DATA(COP_Entity)
+ enum { IDD = IDD_OBJPAGE_ENTITYKV };
+ CAngleCombo m_AngleEdit;
+ CAngleCombo m_SmartAngleEdit;
+ CEdit m_cValue;
+ CColoredListCtrl m_VarList;
+ CEdit m_cKey;
+ CFilteredComboBox m_cClasses;
+ CEdit m_Comments;
+ CEdit m_KeyValueHelpText;
+ CButton m_PasteControl;
+ //}}AFX_DATA
+
+ // ClassWizard generate virtual function overrides
+ //{{AFX_VIRTUAL(COP_Entity)
+ protected:
+ virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
+ virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
+ //}}AFX_VIRTUAL
+
+ protected:
+
+ // Implementation of CFilteredComboBox::ICallbacks for m_cClasses.
+
+ virtual void OnTextChanged( const char *pText );
+ virtual bool OnUnknownEntry( const char *pText );
+
+ // This gets routed from m_pSmartControl (for target names).
+
+ virtual void OnSmartControlTargetNameChanged( const char *pText );
+
+ // Implementation of CColoredListCtrl::IItemColorCallback.
+
+ virtual void GetItemColor( int iItem, COLORREF *pBackgroundColor, COLORREF *pTextColor );
+ virtual bool CustomDrawItemValue( const LPDRAWITEMSTRUCT p, const RECT *pRect );
+
+
+ // Other functions.
+
+ // If pMissingTarget is set to true, then it is a
+ void GetKeyState( const char *pShortName, EKeyState *pState, bool *pMissingTarget );
+ void ResortItems();
+ void LoadClassList();
+ void SetSmartedit(bool bSet);
+ void RemoveBlankKeys();
+
+ void EnableAnglesControl(bool bEnable);
+
+ void CreateSmartControls(GDinputvariable *pVar, CUtlVector<const char *> *pHelperType);
+ void DestroySmartControls(void);
+
+ CRect CalculateSmartControlRect();
+ void CreateSmartControls_Angle( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont, bool *bShowSmartAngles );
+ void CreateSmartControls_Choices( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont );
+ void CreateSmartControls_TargetName( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont );
+ void CreateSmartControls_BasicEditControl( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont, CUtlVector<const char *> *pHelperType );
+ void CreateSmartControls_BrowseAndPlayButtons( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont );
+ void CreateSmartControls_MarkAndEyedropperButtons( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont );
+ void CreateSmartControls_PickButton( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont );
+ void CreateSmartControls_InstanceVariable( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont );
+ void CreateSmartControls_InstanceParm( GDinputvariable *pVar, CRect &ctrlrect, HFONT hControlFont );
+
+ void UpdateDisplayClass(const char *pszClass);
+ void UpdateDisplayClass(GDclass *pClass);
+
+ void UpdateEditClass(const char *pszClass, bool bForce);
+ void UpdateKeyValue(const char *szKey, const char *szValue);
+
+ virtual void UpdatePickFaceText(CToolPickFace *pTool);
+ void GetFaceIDListsForKey(CMapFaceIDList &FullFaces, CMapFaceIDList &PartialFaces, const char *pszKey);
+ void GetFaceListsForKey(CMapFaceList &FullFaces, CMapFaceList &PartialFaces, const char *pszKey);
+ void ApplyKeyValueToObject(CEditGameClass *pObject, const char *pszKey, const char *pszValue);
+
+ void InternalOnChangeSmartcontrol( const char *szValue );
+
+ // Generated message map functions
+ //{{AFX_MSG(COP_Entity)
+ afx_msg void OnAddkeyvalue();
+ afx_msg BOOL OnApply(void);
+ afx_msg void OnBrowse(void);
+ afx_msg void OnBrowseInstance(void);
+ afx_msg void OnPlaySound(void);
+ virtual BOOL OnInitDialog();
+ afx_msg void OnSelchangeKeyvalues();
+ afx_msg void OnRemovekeyvalue();
+ afx_msg void OnSelChangeAngleEdit(void);
+ afx_msg void OnChangeAngleedit();
+ afx_msg void OnSmartedit();
+ afx_msg void OnChangeKeyorValue();
+ afx_msg void OnCopy();
+ afx_msg void OnPaste();
+ afx_msg void OnSetfocusKey();
+ afx_msg void OnKillfocusKey();
+ afx_msg LRESULT OnChangeAngleBox(WPARAM, LPARAM);
+ afx_msg void OnChangeSmartcontrol();
+ afx_msg void OnChangeSmartcontrolSel();
+ afx_msg void OnChangeInstanceVariableControl();
+ afx_msg void OnChangeInstanceParmControl();
+ afx_msg void OnPickFaces(void);
+ afx_msg void OnPickColor();
+ afx_msg void OnMark();
+ afx_msg void OnSize( UINT nType, int cx, int cy );
+ afx_msg void OnMarkAndAdd();
+ afx_msg void OnEntityHelp(void);
+ afx_msg void OnPickAngles(void);
+ afx_msg void OnPickEntity(void);
+ afx_msg void OnCameraDistance(void);
+ afx_msg void OnItemChangedKeyValues(NMHDR* pNMHDR, LRESULT* pResult);
+ afx_msg void OnDblClickKeyValues(NMHDR* pNMHDR, LRESULT* pResult);
+ //}}AFX_MSG
+
+ void BrowseTextures( const char *szFilter, bool bIsSprite = false );
+ bool BrowseModels( char *szModelName, int length, int &nSkin );
+ void MergeObjectKeyValues(CEditGameClass *pEdit);
+ void MergeKeyValue(char const *pszKey);
+ void SetCurKey(LPCTSTR pszKey);
+ void GetCurKey(CString& strKey);
+
+ void SetCurVarListSelection( int iSel );
+ int GetCurVarListSelection();
+
+ void OnShowPropertySheet(BOOL bShow, UINT nStatus);
+ void StopPicking(void);
+
+ DECLARE_MESSAGE_MAP()
+
+ private:
+
+ void UpdateAnchors();
+ void AssignClassDefaults(GDclass *pClass, GDclass *pOldClass);
+
+ int GetKeyValueRowByShortName( const char *pShortName ); // Find the row in the listctrl that the var is at. Returns -1 if not found.
+
+ void RefreshKVListValues( const char *pOnlyThisVar = NULL );
+ void PresentProperties();
+ void ClearVarList();
+ void SetReadOnly(bool bReadOnly);
+
+ void SetSmartControlText(const char *pszText);
+ void PerformMark(const char *pTargetName, bool bClear, bool bNameOrClass);
+
+ void LoadCustomColors();
+ void SaveCustomColors();
+
+ GDinputvariable *GetVariableAt( int index );
+
+ private:
+
+ CAnchorMgr m_AnchorMgr;
+
+ CString m_szOldKeyName;
+ bool m_bWantSmartedit;
+ bool m_bEnableControlUpdate; // Whether to reflect changes to the edit control into other controls.
+
+ CAngleBox m_Angle;
+ CAngleBox m_SmartAngle;
+
+ CButton m_cPickColor;
+ bool m_bSmartedit;
+ int m_nNewKeyCount;
+
+ CEdit *m_pEditInstanceVariable, *m_pEditInstanceValue;
+ CMyComboBox *m_pComboInstanceParmType;
+
+ // Used to prevent unnecessary calls to PresentProperties.
+ int m_nPresentPropertiesCalls;
+ bool m_bAllowPresentProperties;
+
+ GDclass *m_pDisplayClass; // The class that the dialog is showing. Can be different from m_pEditClass
+ // until the user hits Apply.
+ GDinputvariable *m_pInstanceVar;
+
+ short m_VarMap[GD_MAX_VARIABLES];
+
+ CWnd *m_pSmartControl; // current smartedit control
+ CButton *m_pSmartBrowseButton;
+ CUtlVector<CWnd *> m_SmartControls;
+
+ // The last variable we setup smart controls for.
+ GDinputvariable *m_pLastSmartControlVar;
+ CString m_LastSmartControlVarValue;
+
+ CString m_strLastKey; // Active key when SaveData was called.
+
+ GDclass *m_pEditClass; // The class of the object that we are editing.
+ WCKeyValues m_kv; // Our kv storage. Holds merged keyvalues for multiselect.
+ WCKeyValues m_kvAdded; // Corresponding keys set to value "1" if they were added
+
+ GDIV_TYPE m_eEditType; // The type of the currently selected key when SmartEdit is enabled.
+
+ bool m_bIgnoreKVChange; // Set to ignore Windows notifications when setting up controls.
+ bool m_bChangingKeyName;
+
+ int m_iLastClassListSolidClasses; // Used to prevent reinitializing the class list unnecessarily.
+
+ bool m_bPicking; // A picking tool is currently active.
+ ToolID_t m_ToolPrePick; // The tool that was active before we activated the picking tool.
+
+ int m_iSortColumn; // Which column we're sorting the keyvalues by.
+
+ CPickAnglesTarget m_PickAnglesTarget;
+ CPickEntityTarget m_PickEntityTarget;
+ CPickFaceTarget m_PickFaceTarget;
+
+ COP_Flags *m_pFlagsPage;
+
+ CSmartControlTargetNameRouter m_SmartControlTargetNameRouter;
+
+ CUtlMap<CString, CInstanceParmData> m_InstanceParmData;
+
+ // Used when multiselecting classes to remember whether they've selected a class
+ // or not yet.
+ bool m_bClassSelectionEmpty;
+ CModelBrowser *pModelBrowser;
+
+ friend class CPickAnglesTarget;
+ friend class CPickEntityTarget;
+ friend class CPickFaceTarget;
+ friend class CSmartControlTargetNameRouter;
+
+ COLORREF CustomColors[16];
+ bool m_bCustomColorsLoaded;
+};
+
+// These are used to load the filesystem open dialog.
+void LoadFileSystemDialogModule();
+void UnloadFileSystemDialogModule();
+
+#endif // OP_ENTITY_H