summaryrefslogtreecommitdiff
path: root/game/client/tf/workshop/item_import.h
blob: 27ea77c86a966fc76e4f065c71c980f5e6f35860 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================

#include "vgui_controls/frame.h"
#include "vgui_controls/ComboBox.h"
#include "vgui_controls/RadioButton.h"
#include "vgui_bitmappanel.h"

#include "tf_shareddefs.h"

class CTFFileImportTextEditDialog;
class CTFImportMaterialEditDialog;
class CImportPreviewItemPanel;
class CTFPlayerModelPanel;

enum MATERIAL_FILE_TYPE
{
	MATERIAL_FILE_BASETEXTURE,
	MATERIAL_FILE_NORMAL,
	MATERIAL_FILE_PHONGEXPONENT,
	MATERIAL_FILE_SELFILLUM,
	NUM_MATERIAL_TEXTURE_FILE_TYPE
};

//-----------------------------------------------------------------------------
// Purpose: Import file dialog
//-----------------------------------------------------------------------------
class CTFFileImportDialog : public vgui::Frame
{
	DECLARE_CLASS_SIMPLE( CTFFileImportDialog, Frame );

public:
	enum BUILD_RESULT {
		BUILD_OKAY,
		BUILD_FAILED_NOSDK,
		BUILD_FAILED_NONAME,
		BUILD_FAILED_NOTYPE,
		BUILD_FAILED_NOMODELS,
		BUILD_FAILED_LODCOUNTMISMATCH,
		BUILD_FAILED_NOMATERIALS,
		BUILD_FAILED_MATERIALCOUNTMISMATCH,
		BUILD_FAILED_NOBACKPACKICON,
		BUILD_FAILED_BADNAME,
		BUILD_FAILED_BADTFENGLISHNAME,
		BUILD_FAILED_BADTYPE,
		BUILD_FAILED_BADMODEL,
		BUILD_FAILED_BADMATERIALTYPE,
		BUILD_FAILED_BADMATERIAL,
		BUILD_FAILED_MATERIALMISSINGSHADER,
		BUILD_FAILED_MATERIALMISSINGCLOAK,
		BUILD_FAILED_MATERIALMISSINGBURNING,
		BUILD_FAILED_MATERIALMISSINGJARATE,
		BUILD_FAILED_MATERIALMISSINGPAINTABLE,
		BUILD_FAILED_MISSINGMODEL,
		BUILD_FAILED_NEEDMORELOD,
		BUILD_FAILED_COMPLEXMODEL,
		BUILD_FAILED_BADIMAGE,
		BUILD_FAILED_COMPILE,
		BUILD_FAILED_NO_WORKSHOP_ID,
		BUILD_FAILED_IMAGEUNSUPPORTEDFILETYPE,
		BUILD_FAILED_IMAGERESOLUTIONNOTPOWEROF2,
		BUILD_FAILED_IMAGERESOLUTIONOVERLIMIT,
		BUILD_FAILED_NO_TAUNT_SOURCES,
		BUILD_FAILED_BAD_VCD_FILE,
		BUILD_FAILED_VCD_MISSING_EVENT_SEQUENCE,
		BUILD_FAILED_VCD_EVENT_SEQUENCE_TOO_LONG,

		NUM_BUILD_RESULTS
	};
	enum LOAD_RESULT {
		LOAD_OKAY,
		LOAD_FAILED,
		LOAD_FAILED_BADMODEL,
		LOAD_FAILED_COMPLEXMODEL,
		LOAD_FAILED_TOOMANYBONES,
		LOAD_FAILED_BADMATERIAL,
		LOAD_FAILED_TOOMANYMATERIALS,
		LOAD_FAILED_MATERIALCOUNTMISMATCH,
		LOAD_FAIL_ANIMATIONTOOLONG,
		NUM_LOAD_RESULTS
	};
	enum SAVE_RESULT {
		SAVE_OKAY,
		SAVE_FAILED,
		NUM_SAVE_RESULTS
	};

	enum BUILD_STAGE
	{
		BUILD_PREVIEW,
		BUILD_VERIFY,
		BUILD_FINAL
	};

	enum WARNING
	{
		WARNING_BASEALPHAMASK,
		NUM_WARNINGS
	};

	enum ImportPrefab_t
	{
		PREFAB_HAT = 0,
		PREFAB_MISC,
		PREFAB_TAUNT,

		PREFAB_COUNT
	};

public:
	CTFFileImportDialog( vgui::Panel *parent );

	virtual ~CTFFileImportDialog();

	virtual void ApplySchemeSettings( vgui::IScheme *pScheme );

	virtual void OnCommand( const char *command );
			void OnCommandLoad();
			void OnCommandSave();
			void OnCommandBrowseIcon();
			void OnCommandBrowseLOD( int index );
			void OnCommandBrowseAnimationSource();
			void OnCommandBrowseAnimationVCD();
			void OnCommandSwapVMT();
			void OnCommandEditMaterial( int nSkinIndex, int nMaterialIndex );
			void OnCommandEditMaterialDone( int nSkinIndex, int nMaterialIndex );
			void OnCommandEditQC();
			void OnCommandEditQCI();
			void OnCommandEditQCDone();
			void OnCommandEditQCIDone();
			bool OnCommandBuild( BUILD_STAGE buildStage );
			void OnCommandUpdateBodygroup();

			void OnOpen();

	virtual void OnClose();

	MESSAGE_FUNC_PARAMS( OnTextChanged, "TextChanged", data );

	MESSAGE_FUNC_CHARPTR( OnFileSelected, "FileSelected", fullpath );

	MESSAGE_FUNC_PTR( OnRadioButtonChecked, "RadioButtonChecked", panel );

	KeyValues *GetItemValues() { return m_pItemValues; }

	void SetItemName( const char *pszName );
	const char *GetItemName();
	bool IsValidPrefab( const char *pszPrefab );
	void SetItemPrefab( const char *pszPrefab );
	const char *GetItemPrefab();
	bool GetItemPrefabValue( const char *pszPrefab, const char *pszName, CUtlString& strOutput );
	void SelectClass( int nClassIndex );
	void SetItemIcon( const char *pszFilePath );
	const char *GetItemIcon();
	void SetPaintable( bool bPaintable, int nMaterialIndex );
	bool IsPaintable( int nMaterialIndex );
	bool IsAnyVMTPaintable();
	const char *GetUserAnimationQCTemplate( int nSelectedClass, bool bPerforce = false );
	const char *GetQCTemplate( int nSelectedClass );
	const char *GetQCITemplate( int nSelectedClass );
	void ClearLODs();
	LOAD_RESULT SetLOD( int selectedClass, int nModelIndex, const char *pszFilePath, KeyValues* pKV = NULL );
	void UpdateLODDisplay();
	int GetModelTriangleBudget( int selectedClass, int nModelIndex );
	int GetModelBoneBudget();
	bool SetMaterial( int nMaterialPanelIndex, const char* pszFilePath, MATERIAL_FILE_TYPE fileType );
	bool SetMaterial( int selectedSkin, int nMaterialIndex, const char *pszFilePath, MATERIAL_FILE_TYPE fileType );
	const char* GetMaterialTextureFile( int selectedSkin, int nMaterialIndex, MATERIAL_FILE_TYPE fileType );
	CUtlString GetMaterialName( int selectedSkin, int nMaterialIndex );
	void ClearMaterials();
	void ClearMaterial( int nSkinIndex, int nMaterialIndex );
	void UpdateMaterialDisplay();
	void UpdateMaterialDisplay( int nSkinIndex, int nMaterialIndex );
	const char *GetMaterialText( int nSkinIndex, int nMaterialIndex, CUtlBuffer &sMaterialText );
	bool SetMaterialText( int nSkinIndex, int nMaterialIndex, const char* pszMaterialText );
	BUILD_RESULT ValidateMaterialValues( KeyValues *pKV, int nMaterialIndex );
	void RemoveUnnecessaryParametersFromVMT( KeyValues *pKV, int nMaterialIndex );
	void RemoveLightParameters( KeyValues *pKV, int nMaterialIndex );
	void RemovePaintParameters( KeyValues *pKV, int nMaterialIndex );
	void RemoveTranslucentParameters( KeyValues *pKV );
	void RemoveCubeMapParameters( KeyValues *pKV );
	void RemoveSelfIllumParameters( KeyValues *pKV );

	void UpdateBodygroupsDisplay();
	void SetBodygroup( KeyValues* pBodygroupKey );

	LOAD_RESULT SetAnimationSource( int selectedClass, const char *pszFilePath, KeyValues* pKV = NULL );
	LOAD_RESULT SetAnimationVCD( int selectedClass, const char *pszFilePath, KeyValues* pKV = NULL );
	void SetAnimationDuration( int selectedClass, float flDuration );
	BUILD_RESULT VerifyVCD( const CAssetTF &asset );
	void UpdateAnimationSourceDisplay();
	void UpdateAnimationVCDDisplay();
	void UpdateAnimDurationDisplay();

	void SetDirty( bool bDirty );

	void SetLoopableTaunt( bool bLoopable, float flLoopStartTime );
	bool IsLoopableTaunt() const;
	float GetAnimationLoopStartTime() const;

	BUILD_RESULT AddTauntToAsset( CAssetTF &asset, int nClassIndex, bool bIsMulticlass, BUILD_STAGE buildStage, KeyValues *pItemData, KeyValues *pBuildMessageVariables );
	BUILD_RESULT AddModelToAsset( CAssetTF &asset, int nClassIndex, bool bIsMulticlass, BUILD_STAGE buildStage, KeyValues *pItemData, KeyValues *pBuildMessageVariables );
	BUILD_RESULT AddMaterialsToAsset( CAssetTF &asset, KeyValues *pItemData, KeyValues *pBuildMessageVariables );
	bool CheckSourceSDK();
	BUILD_RESULT Build( BUILD_STAGE buildStage, KeyValues *pBuildMessageVariables );
	KeyValues *BuildSessionData( const char *pszItemName );
	KeyValues *BuildItemSchema( const char *pszItemName );
	LOAD_RESULT Load( const char *pszFilePath, const char *pathID, CUtlString &sFailedPath );
	LOAD_RESULT LoadTxt( const char *pszFilePath, const char *pathID, CUtlString &sFailedPath );
	LOAD_RESULT LoadZip( const char *pszFilePath, const char *pathID, CUtlString &sFailedPath );
	SAVE_RESULT Save( const char *pszFilePath, const char *pathID );

	void SavePreviewData( CAssetTF &asset );
	bool SetupPreviewData();
	void CleanupPreviewData();

protected:
	bool IsMulticlass();
	const char *GetClassFolder();
	bool AnyClassHasModels();
	bool ClassHasModels( int nClassIndex );
	bool DidSpecifyAllMaterials();
	bool AreClassesLODCountMatch();
	bool AreClassesMaterialCountMatch();
	bool AnyClassHasTauntSources();
	bool ClassHasTauntSources( int nClassIndex );

	void GetWorkshopData();
	void SetWorkshopData();

private:
	bool ShouldP4AddOrEdit() const;
	bool IsPartnerContent() const;
	const char* GetWorkshopFolder() const;

	int GetCustomBones( int selectedClass, const char* pszFileName, CUtlStringList& strBoneList );
	void SetLODPanelEnable( bool bEnable, int nModelIndex );
	void SetSkinType( int nSkinType );
	void SetEquipRegion( const char* pszEquipRegion );
	void SetWorkshopID( const char* pszWorkshopID );
	bool IsTFEnglishNameValid( item_definition_index_t defIndex );
	void SetTFEnglishName( const char* pszTFEnglishName );
	void UpdateUIForPrefab( ImportPrefab_t nPrefab );
	item_definition_index_t AddKeyValuesToItemWorkshopSchema( KeyValues *pKV );

	int m_nSelectedClass;
	ImportPrefab_t m_nPrefab;

	enum FileOpenMode {
		FILE_OPEN_NONE,
		FILE_OPEN_LOAD,
		FILE_OPEN_SAVE,
		FILE_OPEN_ICON,
		FILE_OPEN_LOD0,
		FILE_OPEN_LOD1,
		FILE_OPEN_LOD2,
		FILE_OPEN_ANIMATION_SOURCE,
		FILE_OPEN_ANIMATION_VCD,
	} m_nFileOpenMode;

	KeyValues *m_pItemValues;
	KeyValues *m_pPreviewSchema;
	CUtlVector< CUtlString > m_vecPreviewFiles;
	CUtlVector< CUtlString > m_vecCustomModFiles;
	CUtlBuffer m_tempQC;

	vgui::TextEntry *m_pNameTextEntry;
	vgui::ComboBox	*m_pTypeComboBox;
	vgui::Button	*m_pSwapVMTButton;
	vgui::ComboBox	*m_pSkinComboBox;
	vgui::TextEntry *m_pWorkshopIDTextEntry;
	vgui::TextEntry *m_pTFEnglishNameTextEntry;
	vgui::CheckButton *m_pPerforceCheckButton;
	vgui::CheckButton *m_pPartnerCheckButton;
	
	vgui::EditablePanel	*m_pEquipRegionPanel;
	vgui::ComboBox	*m_pEquipRegionComboBox;

	vgui::ImagePanel *m_pIconImagePanel;
	CUtlVector< vgui::CheckButton* > m_pPaintableCheckButtons;

	vgui::RadioButton *m_pClassRadioButtons[TF_LAST_NORMAL_CLASS];
	vgui::Panel *m_pClassHighlights[TF_LAST_NORMAL_CLASS];

	vgui::EditablePanel	*m_pBodygroupsPanel;
	CUtlVector< vgui::CheckButton* > m_pBodygroups;

	vgui::EditablePanel	*m_pLODsPanel;
	CUtlVector< vgui::Panel* > m_pLODPanels;
	CUtlVector< vgui::Label* > m_pLODFiles;
	CUtlVector< vgui::Label* > m_pLODDetails;

	vgui::EditablePanel *m_pSkinsPanel;
	CUtlVector< vgui::Panel* > m_pMaterialPanels;
	CUtlVector< vgui::Label* > m_pMaterialLabels;
	CUtlVector< vgui::Label* > m_pMaterialFiles;

	vgui::EditablePanel	*m_pTauntInputPanel;
	vgui::Label *m_pAnimationSourceFile;
	vgui::Label *m_pAnimationVCDFile;
	vgui::Label *m_pAnimationDurationLabel;
	vgui::Label *m_pAnimationPropLabel;
	vgui::CheckButton *m_pAnimationLoopCheckButton;
	vgui::TextEntry *m_pAnimationLoopStartTextEntry;

	vgui::Button *m_pBuildButton;
	vgui::DHANDLE<CTFFileImportTextEditDialog> m_pTextEditDialog;
	vgui::DHANDLE<CTFImportMaterialEditDialog> m_pMaterialEditDialog;
	vgui::DHANDLE<CImportPreviewItemPanel> m_pPreviewDialog;
	CTFPlayerModelPanel	*m_pPlayerModelPanel;

	bool m_bWasCheatOn;
};