diff options
Diffstat (limited to 'utils/hlmv/attachments_window.cpp')
| -rw-r--r-- | utils/hlmv/attachments_window.cpp | 349 |
1 files changed, 349 insertions, 0 deletions
diff --git a/utils/hlmv/attachments_window.cpp b/utils/hlmv/attachments_window.cpp new file mode 100644 index 0000000..5a3b5b9 --- /dev/null +++ b/utils/hlmv/attachments_window.cpp @@ -0,0 +1,349 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "attachments_window.h" +#include "ControlPanel.h" +#include "ViewerSettings.h" +#include "StudioModel.h" +#include "MatSysWin.h" + + +#define IDC_ATTACHMENT_LIST (IDC_ATTACHMENT_WINDOW_FIRST+0) +#define IDC_ATTACHMENT_LIST_BONES (IDC_ATTACHMENT_WINDOW_FIRST+1) +#define IDC_ATTACHMENT_TRANSLATION (IDC_ATTACHMENT_WINDOW_FIRST+2) +#define IDC_ATTACHMENT_ROTATION (IDC_ATTACHMENT_WINDOW_FIRST+3) +#define IDC_ATTACHMENT_QC_STRING (IDC_ATTACHMENT_WINDOW_FIRST+4) + + +CAttachmentsWindow::CAttachmentsWindow( ControlPanel* pParent ) : mxWindow( pParent, 0, 0, 0, 0 ) +{ + m_pControlPanel = pParent; + g_viewerSettings.m_iEditAttachment = -1; +} + + +void CAttachmentsWindow::Init( ) +{ + int left, top; + left = 5; + top = 0; + + // Attachment selection list + new mxLabel( this, left + 3, top + 4, 60, 18, "Attachment" ); + m_cAttachmentList = new mxListBox( this, left, top + 20, 260, 100, IDC_ATTACHMENT_LIST ); + m_cAttachmentList->add ("None"); + m_cAttachmentList->select (0); + mxToolTip::add (m_cAttachmentList, "Select an attachment to modify"); + + left = 280; + new mxLabel( this, left + 3, top + 4, 60, 18, "Attach To Bone" ); + m_cBoneList = new mxListBox( this, left, top + 20, 260, 100, IDC_ATTACHMENT_LIST_BONES ); + m_cBoneList->add ("None"); + m_cBoneList->select( 0 ); + mxToolTip::add( m_cBoneList, "Select a bone to attach to" ); + + + left = 5; + top = 120; + new mxLabel( this, left + 3, top + 4, 60, 18, "Translation" ); + m_cTranslation = new mxLineEdit2( this, left + 70, top, 90, 25, "10 20 30", IDC_ATTACHMENT_TRANSLATION ); + + + left = 170; + top = 120; + new mxLabel( this, left + 3, top + 4, 60, 18, "Rotation" ); + m_cRotation = new mxLineEdit2( this, left + 70, top, 90, 25, "0 90 180", IDC_ATTACHMENT_ROTATION ); + + + top = 145; + left = 5; + new mxLabel( this, left, top, 60, 18, "QC String" ); + m_cQCString = new mxLineEdit2( this, left + 70, top, 400, 25, "$attachment \"controlpanel0_ur\" \"Vgui\" -22 -15 4 rotate 0 0 0", IDC_ATTACHMENT_QC_STRING ); +} + + +void CAttachmentsWindow::OnLoadModel() +{ + int iPrevEdit = g_viewerSettings.m_iEditAttachment; + PopulateBoneList(); + PopulateAttachmentsList(); + + if ( iPrevEdit >= 0 && iPrevEdit < m_cAttachmentList->getItemCount()) + { + m_cAttachmentList->select( iPrevEdit + 1 ); + } + g_viewerSettings.m_iEditAttachment = iPrevEdit; + UpdateStrings(); +} + + +void CAttachmentsWindow::OnTabSelected() +{ + // for now, keep selection + // g_viewerSettings.m_iEditAttachment = m_cAttachmentList->getSelectedIndex() - 1; +} + + +void CAttachmentsWindow::OnTabUnselected() +{ + // for now, keep selection + // g_viewerSettings.m_iEditAttachment = -1; +} + + +void CAttachmentsWindow::PopulateAttachmentsList() +{ + m_cAttachmentList->removeAll(); + + m_cAttachmentList->add( "(none)" ); + + if ( g_pStudioModel ) + { + CStudioHdr* pHdr = g_pStudioModel->GetStudioHdr(); + if (pHdr->GetNumAttachments()) + { + for ( int i = 0; i < pHdr->GetNumAttachments(); i++ ) + { + m_cAttachmentList->add ( pHdr->pAttachment(i).pszName() ); + } + + m_cAttachmentList->select (0); + OnSelChangeAttachmentList(); + return; + } + } + + m_cAttachmentList->select (0); +} + + +void CAttachmentsWindow::PopulateBoneList() +{ + m_cBoneList->removeAll(); + + if ( g_pStudioModel ) + { + CStudioHdr* pHdr = g_pStudioModel->GetStudioHdr(); + if (pHdr->numbones()) + { + for ( int i = 0; i < pHdr->numbones(); i++ ) + { + m_cBoneList->add ( pHdr->pBone(i)->pszName() ); + } + + m_cBoneList->select (0); + return; + } + } + + m_cBoneList->add( "None" ); + m_cBoneList->select (0); +} + + +int CAttachmentsWindow::handleEvent (mxEvent *event) +{ + MDLCACHE_CRITICAL_SECTION_( g_pMDLCache ); + + if ( !g_pStudioModel ) + return 0; + + CStudioHdr* pHdr = g_pStudioModel->GetStudioHdr(); + switch( event->action ) + { + case IDC_ATTACHMENT_LIST: + { + OnSelChangeAttachmentList(); + } + break; + + case IDC_ATTACHMENT_LIST_BONES: + { + int iAttachment = g_viewerSettings.m_iEditAttachment; + int iBone = m_cBoneList->getSelectedIndex(); + + if ( iAttachment >= 0 && + iAttachment < pHdr->GetNumAttachments() && + iBone >= 0 && + iBone < pHdr->numbones() ) + { + pHdr->SetAttachmentBone( iAttachment, iBone ); + UpdateStrings(); + } + } + break; + + case IDC_ATTACHMENT_TRANSLATION: + { + int iAttachment = g_viewerSettings.m_iEditAttachment; + + if ( iAttachment >= 0 && + iAttachment < pHdr->GetNumAttachments() ) + { + mstudioattachment_t &pAttachment = (mstudioattachment_t &)pHdr->pAttachment( iAttachment ); + + Vector vTrans( 0, 0, 0 ); + char curText[512]; + m_cTranslation->getText( curText, sizeof( curText ) ); + sscanf( curText, "%f %f %f", &vTrans.x, &vTrans.y, &vTrans.z ); + + pAttachment.local[0][3] = vTrans.x; + pAttachment.local[1][3] = vTrans.y; + pAttachment.local[2][3] = vTrans.z; + + UpdateStrings( true, false, false ); + } + } + break; + + case IDC_ATTACHMENT_ROTATION: + { + int iAttachment = g_viewerSettings.m_iEditAttachment; + + if ( iAttachment >= 0 && + iAttachment < pHdr->GetNumAttachments() ) + { + mstudioattachment_t &pAttachment = (mstudioattachment_t &)pHdr->pAttachment( iAttachment ); + + QAngle vRotation( 0, 0, 0 ); + char curText[512]; + m_cRotation->getText( curText, sizeof( curText ) ); + sscanf( curText, "%f %f %f", &vRotation.x, &vRotation.y, &vRotation.z ); + + Vector vTrans = GetCurrentTranslation(); + AngleMatrix( vRotation, vTrans, pAttachment.local ); + + UpdateStrings( true, false, false ); + } + } + break; + + default: + return 0; + } + + return 1; +} + + +void CAttachmentsWindow::OnSelChangeAttachmentList() +{ + CStudioHdr *pStudioHdr = g_pStudioModel ? g_pStudioModel->GetStudioHdr() : NULL; + + if ( !pStudioHdr ) + return; + + int iAttachment = m_cAttachmentList->getSelectedIndex() - 1; + if ( iAttachment >= 0 && iAttachment < pStudioHdr->GetNumAttachments() ) + { + g_viewerSettings.m_iEditAttachment = iAttachment; + + // Init the bone list index. + int iBone = g_pStudioModel->GetStudioHdr()->GetAttachmentBone( iAttachment ); + m_cBoneList->select( iBone ); + } + else + { + g_viewerSettings.m_iEditAttachment = -1; + } + + UpdateStrings(); +} + + +Vector CAttachmentsWindow::GetCurrentTranslation() +{ + CStudioHdr *pStudioHdr = g_pStudioModel ? g_pStudioModel->GetStudioHdr() : NULL; + + int iAttachment = m_cAttachmentList->getSelectedIndex() - 1; + if ( pStudioHdr && iAttachment >= 0 && iAttachment < pStudioHdr->GetNumAttachments() ) + { + mstudioattachment_t &pAttachment = (mstudioattachment_t &)pStudioHdr->pAttachment( iAttachment ); + + return Vector( pAttachment.local[0][3], + pAttachment.local[1][3], + pAttachment.local[2][3] ); + } + else + { + return vec3_origin; + } +} + + +Vector CAttachmentsWindow::GetCurrentRotation() +{ + CStudioHdr *pStudioHdr = g_pStudioModel ? g_pStudioModel->GetStudioHdr() : NULL; + + int iAttachment = m_cAttachmentList->getSelectedIndex() - 1; + if ( pStudioHdr && iAttachment >= 0 && iAttachment < pStudioHdr->GetNumAttachments() ) + { + mstudioattachment_t &pAttachment = (mstudioattachment_t &)pStudioHdr->pAttachment( iAttachment ); + + float angles[3]; + MatrixAngles( pAttachment.local, angles ); + return Vector( angles[0], angles[1], angles[2] ); + } + else + { + return vec3_origin; + } +} + + +void CAttachmentsWindow::UpdateStrings( bool bUpdateQC, bool bUpdateTranslation, bool bUpdateRotation ) +{ + char str[1024]; + + int iAttachment = -1; + CStudioHdr* pHdr = NULL; + if ( g_pStudioModel ) + { + pHdr = g_pStudioModel->GetStudioHdr(); + iAttachment = m_cAttachmentList->getSelectedIndex() - 1; + if ( iAttachment < 0 || iAttachment >= pHdr->GetNumAttachments() ) + iAttachment = -1; + } + + if ( iAttachment == -1 ) + { + m_cTranslation->setText( "(none)" ); + m_cRotation->setText( "(none)" ); + m_cQCString->setText( "(none)" ); + } + else + { + mstudioattachment_t &pAttachment = (mstudioattachment_t &)pHdr->pAttachment( iAttachment ); + int iBone= pHdr->GetAttachmentBone( iAttachment ); + Vector vTranslation = GetCurrentTranslation(); + Vector vRotation = GetCurrentRotation(); + + if ( bUpdateQC ) + { + sprintf( str, "$attachment \"%s\" \"%s\" %.2f %.2f %.2f rotate %.0f %.0f %.0f", + pAttachment.pszName(), + pHdr->pBone( iBone )->pszName(), + VectorExpand( vTranslation ), + VectorExpand( vRotation ) ); + + m_cQCString->setText( str ); + } + + if ( bUpdateTranslation ) + { + sprintf( str, "%.2f %.2f %.2f", VectorExpand( vTranslation ) ); + m_cTranslation->setText( str ); + } + + if ( bUpdateRotation ) + { + sprintf( str, "%.0f %.0f %.0f", VectorExpand( vRotation ) ); + m_cRotation->setText( str ); + } + } +} + + |