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.
480 lines
13 KiB
480 lines
13 KiB
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//
|
|
//=============================================================================//
|
|
//
|
|
// Half-Life Model Viewer (c) 1999 by Mete Ciragan
|
|
//
|
|
// file: ControlPanel.h
|
|
// last modified: May 29 programs and associated files contained in this
|
|
// distribution were developed by Mete Ciragan. The programs
|
|
// are not in the public domain, but they are freely
|
|
// distributable without licensing fees. These programs are
|
|
// provided without guarantee or warrantee expressed or
|
|
// implied.
|
|
//
|
|
// version: 1.2
|
|
//
|
|
// email: [email protected]
|
|
// web: http://www.swissquake.ch/chumbalum-soft/
|
|
//
|
|
#ifndef INCLUDED_CONTROLPANEL
|
|
#define INCLUDED_CONTROLPANEL
|
|
|
|
|
|
|
|
#ifndef INCLUDED_MXWINDOW
|
|
#include <mxtk/mxWindow.h>
|
|
#endif
|
|
|
|
|
|
#define IDC_TAB 1901
|
|
#define IDC_RENDERMODE 2001
|
|
#define IDC_GROUND 2003
|
|
#define IDC_MOVEMENT 2004
|
|
#define IDC_BACKGROUND 2005
|
|
#define IDC_HITBOXES 2006
|
|
#define IDC_BONES 2007
|
|
#define IDC_ATTACHMENTS 2008
|
|
#define IDC_PHYSICSMODEL 2009
|
|
#define IDC_PHYSICSHIGHLIGHT 2010
|
|
#define IDC_LODCHOICE 2011
|
|
#define IDC_AUTOLOD 2012
|
|
#define IDC_LODSWITCH 2013
|
|
#define IDC_SOFTWARESKIN 2014
|
|
#define IDC_OVERBRIGHT2 2015
|
|
#define IDC_RENDER_FOV 2016
|
|
#define IDC_SEQUENCEBOXES 2017
|
|
#define IDC_RUNIK 2018
|
|
#define IDC_HEADTURN 2019
|
|
#define IDC_NORMALS 2020
|
|
#define IDC_TANGENTFRAME 2021
|
|
#define IDC_NORMALMAP 2022
|
|
#define IDC_SPECULAR 2023
|
|
#define IDC_SHADOW 2024
|
|
#define IDC_ILLUMPOSITION 2025
|
|
#define IDC_OVERLAY_WIREFRAME 2026
|
|
#define IDC_PLAYSOUNDS 2027
|
|
#define IDC_MESSAGES 2028
|
|
#define IDC_SHADERS 2029
|
|
//#define IDC_PARALLAXMAP 2030
|
|
#define IDC_SHOWORIGINAXIS 2029
|
|
#define IDC_ORIGINAXISLENGTH 2030
|
|
|
|
#define MAX_SEQUENCES 5
|
|
#define IDC_SEQUENCE0 3000
|
|
#define IDC_SEQUENCE1 3001
|
|
#define IDC_SEQUENCE2 3002
|
|
#define IDC_SEQUENCE3 3003
|
|
#define IDC_SEQUENCE4 3004
|
|
|
|
#define IDC_SEQUENCESCALE0 3005
|
|
#define IDC_SEQUENCESCALE1 3006
|
|
#define IDC_SEQUENCESCALE2 3007
|
|
#define IDC_SEQUENCESCALE3 3008
|
|
#define IDC_SEQUENCESCALE4 3009
|
|
|
|
#define IDC_FRAMESELECTION0 3010
|
|
#define IDC_FRAMESELECTION1 3011
|
|
#define IDC_FRAMESELECTION2 3012
|
|
#define IDC_FRAMESELECTION3 3013
|
|
#define IDC_FRAMESELECTION4 3014
|
|
|
|
#define NUM_POSEPARAMETERS 8
|
|
#define IDC_POSEPARAMETER_SCALE 3100
|
|
#define IDC_POSEPARAMETER 3120
|
|
#define IDC_POSEPARAMETER_VALUE 3140
|
|
|
|
#define IDC_SPEEDSCALE 3201
|
|
#define IDC_FORCEFRAME 3202
|
|
#define IDC_BLENDSEQUENCECHANGES 3203
|
|
#define IDC_BLENDNOW 3204
|
|
#define IDC_BLENDTIME 3205
|
|
#define IDC_ACTIVITY_MODIFIERS 3206
|
|
#define IDC_ANIMATEWEAPONS 3207
|
|
|
|
#define IDC_BODYPART 4001
|
|
#define IDC_SUBMODEL 4002
|
|
#define IDC_CONTROLLER 4003
|
|
#define IDC_CONTROLLERVALUE 4004
|
|
#define IDC_SKINS 4005
|
|
#define IDC_MATERIALS 4006
|
|
|
|
#define IDC_BONE_BONELIST 5000
|
|
#define IDC_BONE_GENERATEQC 5001
|
|
#define IDC_BONE_HIGHLIGHT_BONE 5002
|
|
#define IDC_BONE_HITBOXLIST 5003
|
|
#define IDC_BONE_SURFACEPROP 5004
|
|
#define IDC_BONE_HIGHLIGHT_HITBOX 5005
|
|
#define IDC_BONE_ADD_HITBOX 5006
|
|
#define IDC_BONE_DELETE_HITBOX 5007
|
|
#define IDC_BONE_APPLY_TO_CHILDREN 5008
|
|
#define IDC_BONE_SHOW_DEFAULT_POSE 5009
|
|
#define IDC_BONE_HITBOX_ORIGINX 5010
|
|
#define IDC_BONE_HITBOX_ORIGINY 5011
|
|
#define IDC_BONE_HITBOX_ORIGINZ 5012
|
|
#define IDC_BONE_HITBOX_SIZEX 5013
|
|
#define IDC_BONE_HITBOX_SIZEY 5014
|
|
#define IDC_BONE_HITBOX_SIZEZ 5015
|
|
#define IDC_BONE_HITBOX_GROUP 5016
|
|
#define IDC_BONE_UPDATE_HITBOX 5017
|
|
#define IDC_BONE_USE_AUTOGENERATED_HITBOXES 5018
|
|
#define IDC_BONE_HITBOXSET 5019
|
|
#define IDC_BONE_HITBOXADDSET 5020
|
|
#define IDC_BONE_HITBOXDELETESET 5021
|
|
#define IDC_BONE_HITBOXSETNAME 5022
|
|
#define IDC_BONE_HITBOXSETNAME_EDIT 5023
|
|
|
|
// This range is reserved for the attachment window.
|
|
#define IDC_ATTACHMENT_WINDOW_FIRST 5024
|
|
#define IDC_ATTACHMENT_WINDOW_LAST 5100
|
|
#define IDC_BONE_HITBOX_NAME 5101
|
|
#define IDC_BONE_SAVE_HITBOXES 5102
|
|
#define IDC_BONE_LOAD_HITBOXES 5103
|
|
|
|
#define IDC_FLEX 7001
|
|
#define IDC_FLEXDEFAULTS 7002
|
|
#define IDC_FLEXRANDOM 7003
|
|
#define IDC_FLEXZERO 7004
|
|
#define IDC_FLEXONE 7005
|
|
#define IDC_FLEXSCALE 7101
|
|
|
|
#define NUM_FLEX_SLIDERS 48
|
|
|
|
#define IDC_PHYS_FIRST 7501
|
|
#define IDC_PHYS_BONE 7501
|
|
#define IDC_PHYS_CON_LINK_LIMITS 7502
|
|
#define IDC_PHYS_MATERIAL 7503
|
|
#define IDC_PHYS_CON_MIN 7504
|
|
#define IDC_PHYS_CON_MAX 7505
|
|
#define IDC_PHYS_CON_TEST 7506
|
|
#define IDC_PHYS_P_MASSBIAS 7507
|
|
#define IDC_PHYS_CON_FRICTION 7508
|
|
//#define IDC_PHYS_P_ELASTICITY 7509
|
|
#define IDC_PHYS_P_INERTIA 7510
|
|
#define IDC_PHYS_P_DAMPING 7511
|
|
#define IDC_PHYS_P_ROT_DAMPING 7512
|
|
#define IDC_PHYS_MASS 7513
|
|
#define IDC_PHYS_QCFILE 7514
|
|
#define IDC_PHYS_CON_AXIS_X 7515
|
|
#define IDC_PHYS_CON_AXIS_Y 7516
|
|
#define IDC_PHYS_CON_AXIS_Z 7517
|
|
#define IDC_PHYS_CON_TYPE_FREE 7518
|
|
#define IDC_PHYS_CON_TYPE_FIXED 7519
|
|
#define IDC_PHYS_CON_TYPE_LIMIT 7520
|
|
#define IDC_PHYS_LAST 7599
|
|
|
|
#define MAX_ANIMS 4
|
|
#define IDC_ANIMX 8020 // through 8023 ( MAX_ANIMS )
|
|
#define IDC_ANIMY 8030 // through 8033 ( MAX_ANIMS )
|
|
|
|
#define IDC_IKRULE_CHAIN 9000
|
|
#define IDC_IKRULE_CHOICE 9001
|
|
#define IDC_IKRULE_TOUCH 9002
|
|
#define IDC_IKRULE_ATTACHMENT 9003
|
|
#define IDC_IKRULE_RANGE_TOGGLE 9004
|
|
#define IDC_IKRULE_RANGE_START 9005
|
|
#define IDC_IKRULE_RANGE_PEAK 9006
|
|
#define IDC_IKRULE_RANGE_TAIL 9007
|
|
#define IDC_IKRULE_RANGE_END 9008
|
|
#define IDC_IKRULE_RANGE_START_NOW 9009
|
|
#define IDC_IKRULE_RANGE_PEAK_NOW 9010
|
|
#define IDC_IKRULE_RANGE_TAIL_NOW 9011
|
|
#define IDC_IKRULE_RANGE_END_NOW 9012
|
|
#define IDC_IKRULE_CONTACT_TOGGLE 9013
|
|
#define IDC_IKRULE_CONTACT_FRAME_NOW 9014
|
|
#define IDC_IKRULE_CONTACT_FRAME 9015
|
|
#define IDC_IKRULE_USING 9016
|
|
#define IDC_IKRULE_QC_STRING 9017
|
|
|
|
#define IDC_EVENT_SOUND_FRAME_NOW 6000
|
|
#define IDC_EVENT_SOUND_FRAME 6001
|
|
#define IDC_EVENT_SOUND_NAME 6002
|
|
#define IDC_EVENT_QC_STRING 6003
|
|
|
|
|
|
class mxTab;
|
|
class mxChoice;
|
|
class mxCheckBox;
|
|
class mxSlider;
|
|
class mxLineEdit;
|
|
class mxLineEdit2;
|
|
class mxLabel;
|
|
class mxListBox;
|
|
class mxButton;
|
|
class mxRadioButton;
|
|
class MatSysWindow;
|
|
class TextureWindow;
|
|
class CBoneControlWindow;
|
|
class CAttachmentsWindow;
|
|
class CStudioHdr;
|
|
|
|
|
|
// Return codes from loadModel.
|
|
enum LoadModelResult_t
|
|
{
|
|
LoadModel_Success = 0,
|
|
LoadModel_LoadFail,
|
|
LoadModel_NoModel,
|
|
LoadModel_PostLoadFail,
|
|
};
|
|
|
|
|
|
class ControlPanel : public mxWindow
|
|
{
|
|
mxWindow *wRender;
|
|
mxTab *tab;
|
|
mxChoice *cRenderMode;
|
|
mxChoice *cHighlightBone;
|
|
|
|
mxCheckBox *cbGround;
|
|
mxCheckBox *cbHitBoxes;
|
|
mxCheckBox *cbSequenceBoxes;
|
|
mxCheckBox *cbShadow;
|
|
mxCheckBox *cbMovement;
|
|
mxCheckBox *cbBackground;
|
|
mxCheckBox *cbSoftwareSkin;
|
|
mxCheckBox *cbOverbright2;
|
|
mxCheckBox *cbAttachments;
|
|
mxCheckBox *cbBones;
|
|
mxCheckBox *cbNormals;
|
|
mxCheckBox *cbNormalMap;
|
|
// mxCheckBox *cbParallaxMap;
|
|
mxCheckBox *cbTangentFrame;
|
|
mxCheckBox *cbOverlayWireframe;
|
|
mxCheckBox *cbSpecular;
|
|
mxCheckBox *cbRunIK;
|
|
mxCheckBox *cbEnableHead;
|
|
mxCheckBox *cbIllumPosition;
|
|
mxCheckBox *cbPlaySounds;
|
|
mxCheckBox *cbShowOriginAxis;
|
|
mxSlider *leOriginAxisLength;
|
|
|
|
mxChoice *cLODChoice;
|
|
mxCheckBox *cbAutoLOD;
|
|
mxLineEdit *leLODSwitch;
|
|
mxLabel *lLODMetric;
|
|
mxChoice *cSequence[MAX_SEQUENCES];
|
|
mxSlider *slSequence[MAX_SEQUENCES];
|
|
int *iSelectionToSequence; // selection to sequence
|
|
int *iSequenceToSelection; // sequence to selection
|
|
mxLabel *laGroundSpeed;
|
|
mxSlider *slSpeedScale;
|
|
mxLabel *laFPS;
|
|
mxLabel *laBlendAmount;
|
|
|
|
mxChoice *cPoseParameter[NUM_POSEPARAMETERS];
|
|
mxSlider *slPoseParameter[NUM_POSEPARAMETERS];
|
|
mxLineEdit *lePoseParameter[NUM_POSEPARAMETERS];
|
|
mxLineEdit *leFOV;
|
|
|
|
mxSlider *slBlendTime;
|
|
mxLabel *laBlendTime;
|
|
mxChoice *cActivityModifiers;
|
|
mxSlider *slForceFrame;
|
|
mxLabel *lForcedFrame;
|
|
mxRadioButton *rbFrameSelection[MAX_SEQUENCES];
|
|
mxChoice *cBodypart, *cController, *cSubmodel;
|
|
mxSlider *slController;
|
|
mxChoice *cSkin;
|
|
mxChoice *cMaterials;
|
|
mxLabel *lModelInfo1, *lModelInfo2, *lModelInfo3, *lModelInfo4, *lModelInfo5;
|
|
//mxChoice *cTextures;
|
|
//mxCheckBox *cbChrome;
|
|
//mxLabel *lTexSize;
|
|
//mxLineEdit *leWidth, *leHeight;
|
|
|
|
mxLineEdit *leMeshScale, *leBoneScale;
|
|
|
|
MatSysWindow *d_MatSysWindow;
|
|
TextureWindow *d_textureWindow;
|
|
|
|
mxChoice *cFlex[NUM_FLEX_SLIDERS];
|
|
mxSlider *slFlexScale[NUM_FLEX_SLIDERS];
|
|
|
|
mxChoice *cPhysicsBone;
|
|
mxRadioButton *rbConstraintAxis[3];
|
|
mxSlider *slPhysicsFriction;
|
|
mxLabel *lPhysicsFriction;
|
|
|
|
mxSlider *slPhysicsConMin;
|
|
mxLabel *lPhysicsConMin;
|
|
mxCheckBox *cbLinked; // links min/max sliders
|
|
|
|
mxSlider *slPhysicsConMax;
|
|
mxLabel *lPhysicsConMax;
|
|
mxSlider *slPhysicsConTest;
|
|
mxLineEdit *leMass;
|
|
|
|
mxSlider *slPhysicsParamMassBias;
|
|
mxLabel *lPhysicsParamMassBias;
|
|
mxSlider *slPhysicsParamFriction;
|
|
mxLabel *lPhysicsParamFriction;
|
|
mxSlider *slPhysicsParamElasticity;
|
|
mxLabel *lPhysicsParamElasticity;
|
|
mxSlider *slPhysicsParamInertia;
|
|
mxLabel *lPhysicsParamInertia;
|
|
mxSlider *slPhysicsParamDamping;
|
|
mxLabel *lPhysicsParamDamping;
|
|
mxSlider *slPhysicsParamRotDamping;
|
|
mxLabel *lPhysicsParamRotDamping;
|
|
mxLabel *lPhysicsMaterial;
|
|
|
|
mxChoice *cIKChain;
|
|
mxChoice *cIKType;
|
|
mxLabel *lIKTouch;
|
|
mxChoice *cIKTouch;
|
|
mxLabel *lIKAttachment;
|
|
mxLineEdit *leIKAttachment;
|
|
mxCheckBox *cbIKRangeToggle;
|
|
mxLineEdit2 *leIKRangeStart;
|
|
mxLineEdit2 *leIKRangePeak;
|
|
mxLineEdit2 *leIKRangeTail;
|
|
mxLineEdit2 *leIKRangeEnd;
|
|
mxCheckBox *cbIKContactToggle;
|
|
mxLineEdit2 *leIKContactFrame;
|
|
mxChoice *cIKUsing;
|
|
mxLineEdit2 *leIKQCString;
|
|
|
|
mxLineEdit2 *leEventSoundFrame;
|
|
mxListBox *lbEventSoundName;
|
|
mxLineEdit2 *leEventQCString;
|
|
|
|
CBoneControlWindow* m_pBoneWindow;
|
|
CAttachmentsWindow* m_pAttachmentsWindow;
|
|
mxListBox *cMessageList;
|
|
mxListBox *cShaderUsed;
|
|
|
|
public:
|
|
// CREATORS
|
|
ControlPanel (mxWindow *parent);
|
|
virtual ~ControlPanel ();
|
|
|
|
virtual void OnDelete();
|
|
|
|
// MANIPULATORS
|
|
int handleEvent (mxEvent *event);
|
|
|
|
int handlePhysicsEvent( mxEvent *event );
|
|
void UpdateConstraintSliders( int clamp );
|
|
void setupPhysics( void );
|
|
void setupPhysicsBone( int boneIndex );
|
|
void setupPhysicsAxis( int boneIndex, int axis );
|
|
int getPhysicsAxis( void );
|
|
void setPhysicsAxis( int axisIndex );
|
|
void writePhysicsData( void );
|
|
void handlePhysicsKey( mxEvent *event );
|
|
// void readPhysicsMaterials( mxChoice *pList );
|
|
|
|
void dumpModelInfo ();
|
|
LoadModelResult_t loadModel(const char *filename);
|
|
LoadModelResult_t loadModel(const char *filename, int slot );
|
|
void OnLoadModel( void );
|
|
|
|
void resetControlPanel( void );
|
|
void setRenderMode (int mode);
|
|
void setShowGround (bool b);
|
|
void setShowMovement (bool b);
|
|
void setShowBackground (bool b);
|
|
void setShowNormals (bool b);
|
|
void setShowTangentFrame (bool b);
|
|
void setOverlayWireframe (bool b);
|
|
void setShowShadow (bool b);
|
|
void setShowHitBoxes (bool b);
|
|
void setShowBones (bool b);
|
|
void setShowAttachments (bool b);
|
|
void setHighlightBone( int index );
|
|
void setLOD( int index, bool setLODchoice, bool force );
|
|
void setAutoLOD( bool b );
|
|
void setSoftwareSkin( bool b );
|
|
void setOverbright( bool b );
|
|
void setLODMetric( float metric );
|
|
void setPolycount( int polycount );
|
|
void setModelInfo( int nVertCount, int nIndexCount, int nTriCount );
|
|
void setTransparent( bool isTransparent );
|
|
void updatePoseParameters( void );
|
|
void setFOV( float fov );
|
|
void setPlaySounds( bool b );
|
|
void setShowOriginAxis( bool b );
|
|
void setOriginAxisLength( float originAxisLength );
|
|
|
|
void initSequenceChoices();
|
|
void setSequence( int index );
|
|
void showActivityModifiers( int sequence );
|
|
void updateGroundSpeed( void );
|
|
void setOverlaySequence(int num, int index, float weight);
|
|
void updateTransitionAmount();
|
|
void startBlending( void );
|
|
void setSpeedScale ( float scale );
|
|
void updateSpeedScale( void );
|
|
void setBlend(int index, float value );
|
|
|
|
int getFrameSelection( void );
|
|
void setFrame( float frame );
|
|
void updateFrameSelection( void );
|
|
void updateFrameSlider( void );
|
|
|
|
void initBodypartChoices();
|
|
void setBodypart (int index);
|
|
void setSubmodel (int index);
|
|
|
|
void initBoneControllers ();
|
|
void setBoneController (int index);
|
|
void setBoneControllerValue (int index, float value);
|
|
|
|
void initSkinChoices();
|
|
void initMaterialChoices();
|
|
|
|
void setModelInfo ();
|
|
|
|
void initPhysicsBones();
|
|
|
|
void initLODs();
|
|
|
|
void centerView ();
|
|
void UpdateMaterialList ();
|
|
void viewmodelView();
|
|
|
|
void fullscreen ();
|
|
|
|
void setMatSysWindow (MatSysWindow *window) { d_MatSysWindow = window; }
|
|
|
|
void ConvertFlexData();
|
|
void initFlexes ();
|
|
void connectFlexes( CStudioHdr* hdr );
|
|
|
|
int GetCurrentHitboxSet( void );
|
|
|
|
void BuildIKRuleQCString();
|
|
void UpdateIKRuleWindow();
|
|
|
|
void BuildEventQCString();
|
|
|
|
void CreateSortedSequenceList( CStudioHdr* hdr, int *pSequence );
|
|
void SetFrameSlider( float flFrame );
|
|
|
|
void UnloadAllMergedModels();
|
|
|
|
public:
|
|
// Sets up the main tabs
|
|
void SetupRenderWindow( mxTab* pTab );
|
|
void SetupSequenceWindow( mxTab* pTab );
|
|
void SetupBoneControlWindow( mxTab* pTab );
|
|
void SetupBodyWindow( mxTab* pTab );
|
|
void SetupFlexWindow( mxTab* pTab );
|
|
void SetupPhysicsWindow( mxTab* pTab );
|
|
void SetupAttachmentsWindow( mxTab *pTab );
|
|
void SetupIKRuleWindow( mxTab *pTab );
|
|
void SetupEventWindow( mxTab *pTab );
|
|
bool m_bVMTInfoLoaded;
|
|
};
|
|
|
|
|
|
extern ControlPanel *g_ControlPanel;
|
|
|
|
|
|
|
|
#endif // INCLUDED_CONTROLPANEL
|