#include "cbase.h" #include "asw_vgui_edit_emitter.h" #include "c_asw_generic_emitter.h" #include "asw_vgui_edit_emitter_dialogs.h" #include #include #include "fmtstr.h" #include "convar.h" #include "vgui/ivgui.h" #include #include #include "vgui_controls/combobox.h" #include "vgui_controls/checkbutton.h" #include "vgui_controls/ScrollBar.h" #include "iclientmode.h" #include "vgui_controls/Panel.h" #include "vgui_controls/Slider.h" #include "vgui_controls/TextEntry.h" #include "vgui_controls\PanelListPanel.h" #include "c_asw_generic_emitter_entity.h" #include "gamestringpool.h" #include "precache_register.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" // positions #define ASW_EDIT_EMITTER_INDENT_X XRES(20) #define ASW_EDIT_EMITTER_INDENT_Y YRES(10) // Scoreboard dimensions #define ASW_EDIT_EMITTER_TITLE_SIZE_Y YRES(22) #define ASW_EDIT_EMITTER_X_BORDER XRES(4) #define ASW_EDIT_EMITTER_Y_BORDER YRES(4) #define ASW_EDIT_EMITTER_MIN_X -400 #define ASW_EDIT_EMITTER_MAX_X 400 #define ASW_ADD_SLIDER(name, minval, maxval, label) \ AddSliderAndTextEntry(m_p##name##Slider, m_p##name##Text, #name, #name "Text", label, minval, maxval) #define ASW_ADD_SIMPLE_NODE(name, minval, maxval) \ AddSimpleNode( m_p##name##Check, m_p##name##Time, m_p##name##Value, m_p##name##ValueText, m_p##name##TimeText, \ #name "Check", #name "Time", #name "Value", #name "TimeText", #name "ValueText", \ 0.0f, 100.0f, minval, maxval) #define ASW_ADD_COLOR_TR_NODE(name, minval, maxval, minval2, maxval2) \ AddSimpleNode( m_p##name##Check, m_p##name##Time, m_p##name##Red, m_p##name##RedText, m_p##name##TimeText, \ #name "Check", #name "Time", #name "Red", #name "TimeText", #name "RedText", \ minval, maxval, minval2, maxval2) #define ASW_ADD_COLOR_GB_NODE(name, minval, maxval, minval2, maxval2) \ AddSimpleNode( NULL, m_p##name##Green, m_p##name##Blue, m_p##name##BlueText, m_p##name##GreenText, \ NULL, #name "Green", #name "Blue", #name "GreenText", #name "BlueText", \ minval, maxval, minval2, maxval2) #define ASW_ADD_COLOR_NODE(name) \ AddColorNode( m_p##name##Check, m_p##name##Time, m_p##name##TimeText, \ m_p##name##Red, m_p##name##Green, m_p##name##Blue, \ m_p##name##RedText, m_p##name##GreenText, m_p##name##BlueText, \ #name "Check", #name "Time", #name "TimeText", \ #name "Red", #name "Green", #name "Blue", \ #name "RedText", #name "GreenText", #name "BlueText") CASW_VGUI_Edit_Emitter::CASW_VGUI_Edit_Emitter( vgui::Panel *pParent, const char *pElementName ) : vgui::Frame( pParent, pElementName ) { LoadTextures(); SetProportional(false); int x = ASW_EDIT_EMITTER_INDENT_X; int y = ASW_EDIT_EMITTER_INDENT_Y; int wide = 380.0 - x * 2; int tall = GetClientMode()->GetViewport()->GetTall() - y * 2; m_pEmitter = NULL; SetBounds( x, y, wide, tall ); SetSizeable(false); SetBgColor(Color(0, 0, 0, 175)); // Initialize the top title. SetTitle("Edit Particle System", false); m_pResetButton = new vgui::Button(this, "ResetButton", "Reset Particles"); m_pResetButton->SetCommand(new KeyValues("ResetEmitter")); m_pResetButton->SetWide(100); m_pResetButton->SetTall(20); m_pResetButton->SetPos(ASW_EDIT_EMITTER_X_BORDER, tall - ((ASW_EDIT_EMITTER_Y_BORDER * 2) + (ASW_EDIT_EMITTER_TITLE_SIZE_Y * 0.7f))); m_ListPanel = new vgui::PanelListPanel( this, "listpanel_edit_emitter" ); m_ListPanel->SetPos(ASW_EDIT_EMITTER_X_BORDER, ASW_EDIT_EMITTER_Y_BORDER + ASW_EDIT_EMITTER_TITLE_SIZE_Y); m_ListPanel->SetWide(wide - ASW_EDIT_EMITTER_X_BORDER * 2); m_ListPanel->SetTall(tall - ((ASW_EDIT_EMITTER_Y_BORDER * 2) + (ASW_EDIT_EMITTER_TITLE_SIZE_Y * 2))); m_ListPanel->SetFirstColumnWidth(0); m_LayoutCursorY = 0; // add our sliders + text entries AddLabel("Template:"); AddTemplateBoxAndButtons(); AddLabel("Material:"); AddMaterialDropDown(); AddLabel("Particles per second:"); ASW_ADD_SLIDER(ParticlesPerSecond, 0, 60, ""); AddLabel("Particle supply:"); ASW_ADD_SLIDER(InitialParticleSupply, -1, 1000, ""); AddNumParticlesLabel(); AddLabel("Lifetime:"); ASW_ADD_SLIDER(ParticleLifetimeMin, 0, 20, "Min"); ASW_ADD_SLIDER(ParticleLifetimeMax, 0, 20, "Max"); AddLabel("Presimulate Time:"); ASW_ADD_SLIDER(PresimulateTime, 0, 30, ""); AddLabel("Start roll:"); ASW_ADD_SLIDER(ParticleStartRollMin, 0, 360, "Min"); ASW_ADD_SLIDER(ParticleStartRollMax, 0, 360, "Max"); AddLabel("Roll rate:"); ASW_ADD_SLIDER(ParticleRollRateMin, -360, 360, "Min"); ASW_ADD_SLIDER(ParticleRollRateMax, -360, 360, "Max"); AddLabel("Start Position Min:"); ASW_ADD_SLIDER(ParticlePositionMinX, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "X"); ASW_ADD_SLIDER(ParticlePositionMinY, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "Y"); ASW_ADD_SLIDER(ParticlePositionMinZ, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "Z"); AddLabel("Start Position Max:"); ASW_ADD_SLIDER(ParticlePositionMaxX, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "X"); ASW_ADD_SLIDER(ParticlePositionMaxY, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "Y"); ASW_ADD_SLIDER(ParticlePositionMaxZ, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "Z"); AddLabel("Velocity Min:"); ASW_ADD_SLIDER(ParticleVelocityMinX, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "X"); ASW_ADD_SLIDER(ParticleVelocityMinY, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "Y"); ASW_ADD_SLIDER(ParticleVelocityMinZ, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "Z"); AddLabel("Velocity Max:"); ASW_ADD_SLIDER(ParticleVelocityMaxX, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "X"); ASW_ADD_SLIDER(ParticleVelocityMaxY, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "Y"); ASW_ADD_SLIDER(ParticleVelocityMaxZ, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "Z"); AddLabel("Acceleration Min:"); ASW_ADD_SLIDER(ParticleAccnMinX, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "X"); ASW_ADD_SLIDER(ParticleAccnMinY, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "Y"); ASW_ADD_SLIDER(ParticleAccnMinZ, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "Z"); AddLabel("Acceleration Max:"); ASW_ADD_SLIDER(ParticleAccnMaxX, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "X"); ASW_ADD_SLIDER(ParticleAccnMaxY, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "Y"); ASW_ADD_SLIDER(ParticleAccnMaxZ, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "Z"); AddLabel("Gravity:"); ASW_ADD_SLIDER(Gravity, ASW_EDIT_EMITTER_MIN_X, ASW_EDIT_EMITTER_MAX_X, "Z"); m_LayoutCursorY += 10; AddLabel("Local movement:"); ASW_ADD_SLIDER(ParticleLocal, 0, 100, "%"); m_LayoutCursorY += 10; AddLabel("Collision:"); AddCollisionDropDown(); AddLabel("Velocity retained on collision:"); ASW_ADD_SLIDER(CollisionDampening, 0, 100, "%"); AddLabel("Life lost on collision:"); ASW_ADD_SLIDER(LifeLostOnCollision, 0, 10, "s"); AddLabel("Collision sound:"); AddCollisionSoundEdit(); AddCollisionDecalEdit(); AddLabel("Spawn particles on collision:"); AddCollisionTemplateDropDown(); m_LayoutCursorY += 10; AddLabel("Particles spawn children:"); AddDropletTemplateDropDown(); ASW_ADD_SLIDER(DropletChance, 0, 100, "Freq."); m_LayoutCursorY += 10; AddLabel("Glow Material:"); AddGlowMaterialDropDown(); //AddLabel("Glow deviation:"); ASW_ADD_SLIDER(GlowDeviation, 0, 100, "Dev."); ASW_ADD_SLIDER(GlowScale, 0, 10, "Scale"); m_LayoutCursorY += 10; AddLabel("Draw Type:"); AddDrawTypeDropDown(); AddLabel("Beam Length:"); ASW_ADD_SLIDER(BeamLength, 0, 100, "Length"); AddLabel("Beam Positioning:"); AddBeamPositionDropDown(); AddCheckbox(m_pScaleBeamByVelocityCheck, "Scale Beam by Velocity"); AddCheckbox(m_pScaleBeamByLifeLeftCheck, "Scale Beam by life left"); AddLabel("Lighting Type:"); AddLightingDropDown(); AddLabel("Lighting Apply:"); ASW_ADD_SLIDER(LightApply, 0, 100, "%"); AddLabel("Alpha:"); AddSimpleNodeLabel("Time", "Value"); ASW_ADD_SIMPLE_NODE(Alpha0, 0.0f, 255.0f); ASW_ADD_SIMPLE_NODE(Alpha1, 0.0f, 255.0f); ASW_ADD_SIMPLE_NODE(Alpha2, 0.0f, 255.0f); ASW_ADD_SIMPLE_NODE(Alpha3, 0.0f, 255.0f); ASW_ADD_SIMPLE_NODE(Alpha4, 0.0f, 255.0f); AddLabel("Size:"); AddSimpleNodeLabel("Time", "Value"); ASW_ADD_SIMPLE_NODE(Scale0, 0.0f, 100.0f); ASW_ADD_SIMPLE_NODE(Scale1, 0.0f, 100.0f); ASW_ADD_SIMPLE_NODE(Scale2, 0.0f, 100.0f); ASW_ADD_SIMPLE_NODE(Scale3, 0.0f, 100.0f); ASW_ADD_SIMPLE_NODE(Scale4, 0.0f, 100.0f); AddLabel("Color:"); AddSimpleNodeLabel("Time", "Red"); ASW_ADD_COLOR_NODE(Color0); AddSimpleNodeLabel("Time", "Red"); ASW_ADD_COLOR_NODE(Color1); AddSimpleNodeLabel("Time", "Red"); ASW_ADD_COLOR_NODE(Color2); AddSimpleNodeLabel("Time", "Red"); ASW_ADD_COLOR_NODE(Color3); AddSimpleNodeLabel("Time", "Red"); ASW_ADD_COLOR_NODE(Color4); SetZPos( 1002 ); bIgnoreNextSliderChange = 0; m_pSaveDialog = NULL; } CASW_VGUI_Edit_Emitter::~CASW_VGUI_Edit_Emitter( void ) { } void CASW_VGUI_Edit_Emitter::AddLabel(const char *pText) { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(220); pPanel->SetTall(12); pPanel->SetPos(0,m_LayoutCursorY); vgui::Label *p = new vgui::Label(pPanel, "Edit_emitter_label", pText); p->SetWide(220); p->SetTall(12); m_ListPanel->AddItem(NULL, pPanel); m_LayoutCursorY += 12; } void CASW_VGUI_Edit_Emitter::AddNumParticlesLabel() { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(220); pPanel->SetTall(12); pPanel->SetPos(0, m_LayoutCursorY); m_pNumParticlesLabel = new vgui::Label(pPanel, "Edit_emitter_label", "Current Num Particles:"); m_pNumParticlesLabel->SetWide(220); m_pNumParticlesLabel->SetTall(12); m_pNumParticlesLabel->SetPos(45, 0); m_ListPanel->AddItem(NULL, pPanel); m_LayoutCursorY += 12; } void CASW_VGUI_Edit_Emitter::AddTemplateBoxAndButtons() { BuildTemplateList(); // scan the particle templates folder for templates to load CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(260); pPanel->SetTall(20); pPanel->SetPos(0, m_LayoutCursorY); /* m_TemplateTextEntry = new vgui::TextEntry(pPanel, "TemplateText"); m_TemplateTextEntry->SetWide(220); m_TemplateTextEntry->SetTall(20); m_TemplateTextEntry->SetPos(20, 0); m_TemplateTextEntry->SetEditable(false); */ m_pTemplateCombo = new vgui::ComboBox(pPanel, "TemplateCombo",iszTemplateNames.Count(),false); m_pTemplateCombo->SetTall(20); m_pTemplateCombo->SetWide(200); m_pTemplateCombo->SetPos(0,0); m_pTemplateCombo->AddActionSignalTarget(this); for (int i=0; iAddItem(iszTemplateNames[i], NULL); } m_pTemplateSaveButton = new vgui::Button(pPanel, "SaveTemplateButton", "Save"); m_pTemplateSaveButton->SetCommand(new KeyValues("SaveTemplate")); m_pTemplateSaveButton->AddActionSignalTarget(this); m_pTemplateSaveButton->SetWide(50); m_pTemplateSaveButton->SetTall(20); m_pTemplateSaveButton->SetPos(205, 00); /*m_pTemplateLoadButton = new vgui::Button(pPanel, "LoadTemplateButton", "Load"); m_pTemplateLoadButton->SetCommand(new KeyValues("LoadTemplate")); m_pTemplateLoadButton->SetWide(60); m_pTemplateLoadButton->SetTall(20); m_pTemplateLoadButton->SetPos(20, 20); m_pTemplateSaveAsButton = new vgui::Button(pPanel, "SaveTemplateButton", "Save As"); m_pTemplateSaveAsButton->SetCommand(new KeyValues("SaveTemplateAs")); m_pTemplateSaveAsButton->SetWide(60); m_pTemplateSaveAsButton->SetTall(20); m_pTemplateSaveAsButton->SetPos(160, 20);*/ m_ListPanel->AddItem(NULL, pPanel); m_LayoutCursorY += 20; } void CASW_VGUI_Edit_Emitter::UpdateNumParticlesLabel() { char buf[64]; if (m_pEmitter && m_pNumParticlesLabel) { Q_snprintf(buf, 64, "Current Num Particles: %d", m_pEmitter->m_hEmitter->GetNumParticles()); m_pNumParticlesLabel->SetText(buf); } } void CASW_VGUI_Edit_Emitter::AddSimpleNodeLabel(const char *pColumn, const char *pColumn2) { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(220); pPanel->SetTall(12); pPanel->SetPos(0,m_LayoutCursorY); vgui::Label *p = new vgui::Label(pPanel, "Edit_emitter_label", pColumn); vgui::Label *p2 = new vgui::Label(pPanel, "Edit_emitter_label", pColumn2); p->SetWide(60); p->SetTall(12); p2->SetWide(60); p2->SetTall(12); p->SetPos(84, 0); p2->SetPos(204, 0); m_ListPanel->AddItem(NULL, pPanel); m_LayoutCursorY += 12; } void CASW_VGUI_Edit_Emitter::AddSliderAndTextEntry( vgui::Slider*& pSlider, vgui::TextEntry*& pTextEntry, const char *pszSliderName, const char *pszTextEntryName, const char *pText, float minval, float maxval) { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(220); pPanel->SetTall(18); pPanel->SetPos(0,m_LayoutCursorY); pSlider = new vgui::Slider( pPanel, pszSliderName ); pSlider->SetRange( minval, maxval ); pSlider->SetValue( minval ); pSlider->AddActionSignalTarget( this ); pTextEntry = new vgui::TextEntry(pPanel, pszTextEntryName); pTextEntry->AddActionSignalTarget(this); pSlider->SetWide(148); pSlider->SetTall(18); pTextEntry->SetWide(60); pTextEntry->SetTall(18); vgui::Label *p = new vgui::Label(pPanel, "Label", pText); p->SetWide(45); p->SetTall(18); p->SetPos(0,0); m_ListPanel->AddItem(NULL, pPanel); pSlider->SetPos(45, 0); pTextEntry->SetPos(200, 0); //m_LayoutCursorY); m_LayoutCursorY += 18; } void CASW_VGUI_Edit_Emitter::AddSimpleNode( vgui::CheckButton*& pCheck, vgui::Slider*& pTime, vgui::Slider*& pValue, vgui::TextEntry*& pValueText, vgui::TextEntry*& pTimeText, const char *pszCheckName, const char *pszTimeName, const char *pszValueName, const char *pszTimeTextName, const char *pszValueTextName, float minval, float maxval, float minval2, float maxval2) { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Node_Item"); pPanel->SetWide(220); pPanel->SetTall(18); pPanel->SetPos(0, m_LayoutCursorY); if (pszCheckName != NULL) { pCheck = new vgui::CheckButton( pPanel, pszCheckName, "Use:"); pCheck->AddActionSignalTarget(this); } pTimeText = new vgui::TextEntry( pPanel, pszTimeTextName); pTimeText->AddActionSignalTarget(this); pTime = new vgui::Slider(pPanel, pszTimeName); pTime->AddActionSignalTarget(this); pTime->SetRange( minval, maxval ); pTime->SetValue( minval ); pValueText = new vgui::TextEntry( pPanel, pszValueTextName); pValueText->AddActionSignalTarget(this); pValue = new vgui::Slider(pPanel, pszValueName); pValue->AddActionSignalTarget(this); pValue->SetRange( minval2, maxval2 ); pValue->SetValue( minval ); pTime->SetTall(18); pTimeText->SetTall(18); pValueText->SetTall(18); pValue->SetTall(18); m_ListPanel->AddItem(NULL, pPanel); if (pszCheckName != NULL) { pCheck->SetPos(-7, -3); pCheck->SetWide(20); } pTime->SetPos(20, 0); pTime->SetWide(60); pTimeText->SetPos(84, 0); pTimeText->SetWide(40); pValue->SetPos(140, 0); pValue->SetWide(60); pValueText->SetPos(204, 0); pValueText->SetWide(40); m_LayoutCursorY += 18; } void CASW_VGUI_Edit_Emitter::AddCheckbox(vgui::CheckButton*& pCheck, const char *pszCheckName) { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Node_Item"); pPanel->SetWide(220); pPanel->SetTall(18); pPanel->SetPos(0, m_LayoutCursorY); if (pszCheckName != NULL) { pCheck = new vgui::CheckButton( pPanel, pszCheckName, pszCheckName); pCheck->AddActionSignalTarget(this); } m_ListPanel->AddItem(NULL, pPanel); if (pszCheckName != NULL) { pCheck->SetPos(-7, -3); pCheck->SetWide(200); } m_LayoutCursorY += 18; } void CASW_VGUI_Edit_Emitter::AddColorNode( vgui::CheckButton*& pCheck, vgui::Slider*& pTime, vgui::TextEntry*& pTimeText, vgui::Slider*& pRed, vgui::Slider*& pGreen, vgui::Slider*& pBlue, vgui::TextEntry*& pRedText, vgui::TextEntry*& pGreenText, vgui::TextEntry*& pBlueText, const char *pszCheckName, const char *pszTimeName, const char *pszTimeTextName, const char *pszRedName, const char *pszGreenName, const char *pszBlueName, const char *pszRedTextName, const char *pszGreenTextName, const char *pszBlueTextName) { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Node_Item"); pPanel->SetWide(220); pPanel->SetTall(100); pPanel->SetPos(0, m_LayoutCursorY); pCheck = new vgui::CheckButton( pPanel, pszCheckName, "Use:"); pCheck->AddActionSignalTarget(this); pTimeText = new vgui::TextEntry( pPanel, pszTimeTextName); pTimeText->AddActionSignalTarget(this); pTime = new vgui::Slider(pPanel, pszTimeName); pTime->AddActionSignalTarget(this); pTime->SetRange( 0.0f, 100.0f ); pTime->SetValue( 0.0f ); pRedText = new vgui::TextEntry( pPanel, pszRedTextName); pRedText->AddActionSignalTarget(this); pRed = new vgui::Slider(pPanel, pszRedName); pRed->AddActionSignalTarget(this); pRed->SetRange( 0, 255 ); pRed->SetValue( 0 ); pRed->SetTickCaptions("RED", NULL); pGreenText = new vgui::TextEntry( pPanel, pszGreenTextName); pGreenText->AddActionSignalTarget(this); pGreen = new vgui::Slider(pPanel, pszGreenName); pGreen->AddActionSignalTarget(this); pGreen->SetRange( 0, 255 ); pGreen->SetValue( 0 ); pRed->SetTickCaptions("GREEN", NULL); pBlueText = new vgui::TextEntry( pPanel, pszBlueTextName); pBlueText->AddActionSignalTarget(this); pBlue = new vgui::Slider(pPanel, pszBlueName); pBlue->AddActionSignalTarget(this); pBlue->SetRange( 0, 255 ); pBlue->SetValue( 0 ); pRed->SetTickCaptions("BLUE", NULL); pTimeText->SetTall(18); pRedText->SetTall(18); pGreenText->SetTall(18); pBlueText->SetTall(18); pTime->SetTall(18); pRed->SetTall(18); pGreen->SetTall(18); pBlue->SetTall(18); vgui::Label *greenLabel = new vgui::Label(pPanel, "Edit_emitter_label", "Green"); vgui::Label *blueLabel = new vgui::Label(pPanel, "Edit_emitter_label", "Blue"); greenLabel->SetWide(60); greenLabel->SetTall(12); blueLabel->SetWide(60); blueLabel->SetTall(12); greenLabel->SetPos(204, 21); blueLabel->SetPos(204, 57); m_ListPanel->AddItem(NULL, pPanel); pCheck->SetPos(-7, -3); pCheck->SetWide(20); pTime->SetPos(20, 0); pTime->SetWide(60); pTimeText->SetPos(84, 0); pTimeText->SetWide(40); pRed->SetPos(140, 0); pRed->SetWide(60); pGreen->SetPos(140, 36); pGreen->SetWide(60); pBlue->SetPos(140, 72); pBlue->SetWide(60); pRedText->SetPos(204, 0); pRedText->SetWide(40); pGreenText->SetPos(204, 36); pGreenText->SetWide(40); pBlueText->SetPos(204, 72); pBlueText->SetWide(40); m_LayoutCursorY += 100; } CASW_VGUI_Edit_Emitter_List_Item::CASW_VGUI_Edit_Emitter_List_Item(Panel *parent, const char *name) : Panel(parent, name) { } CASW_VGUI_Edit_Emitter_List_Item::~CASW_VGUI_Edit_Emitter_List_Item() { } void CASW_VGUI_Edit_Emitter::SliderMoved(vgui::Panel* pSlider) { if (bIgnoreNextSliderChange > 0) { bIgnoreNextSliderChange--; return; } char buf[64]; Q_snprintf(buf, sizeof( buf ), "%sText", pSlider->GetName()); vgui::TextEntry* pTextEntry = (vgui::TextEntry*) pSlider->GetParent()->FindChildByName(buf); if (pTextEntry) { UpdateTextBox((vgui::Slider*) pSlider, pTextEntry); } if (m_pEmitter) ApplyValuesTo(m_pEmitter); } void CASW_VGUI_Edit_Emitter::CheckButtonChanged(vgui::Panel* pTextEntry) { if (m_pEmitter) ApplyValuesTo(m_pEmitter); } void CASW_VGUI_Edit_Emitter::ResetButtonClicked() { if (m_pEmitter) m_pEmitter->m_hEmitter->ResetEmitter(); } void CASW_VGUI_Edit_Emitter::TextEntryChanged(vgui::Panel* pTextEntry) { char buf[64]; if (pTextEntry == m_pMaterialCombo) { if (m_pEmitter) { m_pMaterialCombo->GetText(buf, 64); m_pEmitter->m_hEmitter->SetMaterial(buf); } return; } else if (pTextEntry == m_pGlowMaterialCombo) { if (m_pEmitter) { m_pGlowMaterialCombo->GetText(buf, 64); m_pEmitter->m_hEmitter->SetGlowMaterial(buf); } return; } else if (pTextEntry == m_pTemplateCombo) { if (m_pEmitter && !bIgnoreTemplateComboChange) { m_pTemplateCombo->GetText(buf, 64); LoadTemplate(buf); } return; } else if (pTextEntry == m_pCollisionCombo) { m_pCollisionCombo->GetText(buf, 64); if (!stricmp(buf, "All")) { m_pEmitter->m_hEmitter->m_UseCollision = (ASWParticleCollision) 2; } else if (!stricmp(buf, "Brush Only")) { m_pEmitter->m_hEmitter->m_UseCollision = (ASWParticleCollision) 1; } else { m_pEmitter->m_hEmitter->m_UseCollision = (ASWParticleCollision) 0; } } else if (pTextEntry == m_pDrawTypeCombo) { m_pDrawTypeCombo->GetText(buf, 64); if (!stricmp(buf, "Sprite")) { m_pEmitter->m_hEmitter->m_DrawType = (ASWParticleDrawType) 0; } else if (!stricmp(buf, "Beam")) { m_pEmitter->m_hEmitter->m_DrawType = (ASWParticleDrawType) 1; } } else if (pTextEntry == m_pDropletTemplateCombo) { m_pDropletTemplateCombo->GetText(buf, 64); m_pEmitter->m_hEmitter->SetDropletTemplate(buf); } else if (pTextEntry == m_pCollisionSoundText) { m_pCollisionSoundText->GetText(buf, 64); m_pEmitter->m_hEmitter->SetCollisionSound(buf); } else if (pTextEntry == m_pCollisionDecalText) { m_pCollisionDecalText->GetText(buf, 64); m_pEmitter->m_hEmitter->SetCollisionDecal(buf); } else if (pTextEntry == m_pCollisionTemplateCombo) { m_pCollisionTemplateCombo->GetText(buf, 64); m_pEmitter->m_hEmitter->SetCollisionTemplate(buf); } else if (pTextEntry == m_pBeamPositionCombo) { m_pBeamPositionCombo->GetText(buf, 64); if (!stricmp(buf, "Front")) { m_pEmitter->m_hEmitter->m_iBeamPosition = 2; } else if (!stricmp(buf, "Center")) { m_pEmitter->m_hEmitter->m_iBeamPosition = 1; } else { m_pEmitter->m_hEmitter->m_iBeamPosition = 0; } } else if (pTextEntry == m_pLightingCombo) { m_pLightingCombo->GetText(buf, 64); if (!stricmp(buf, "Scale Alpha")) { m_pEmitter->m_hEmitter->m_iLightingType = 2; } else if (!stricmp(buf, "Scale Color")) { m_pEmitter->m_hEmitter->m_iLightingType = 1; } else if (!stricmp(buf, "Scale Alpha+Color")) { m_pEmitter->m_hEmitter->m_iLightingType = 3; } else { m_pEmitter->m_hEmitter->m_iLightingType = 0; } } int i = strlen(pTextEntry->GetName()); Q_strncpy(buf, pTextEntry->GetName(), i-3 ); buf[i-4] = '\0'; vgui::Slider* pSlider = (vgui::Slider*) pTextEntry->GetParent()->FindChildByName(buf); if (pSlider) { char buf2[64]; vgui::TextEntry* pT= (vgui::TextEntry*) pTextEntry; pT->GetText(buf2, 64); //int old = pSlider->GetValue(); pSlider->SetValue(atoi(buf2), false); //if (old != pSlider->GetValue()) //bIgnoreNextSliderChange++; } if (m_pEmitter) ApplyValuesTo(m_pEmitter); } void CASW_VGUI_Edit_Emitter::UpdateTextBox(vgui::Slider* pSlider, vgui::TextEntry* pTextEntry) { char buf[64]; //Q_snprintf(buf, sizeof( buf ), "%.2f", (float) pSlider->GetValue()); Q_snprintf(buf, sizeof( buf ), "%d", pSlider->GetValue()); pTextEntry->SetText(buf); } void CASW_VGUI_Edit_Emitter::SetEmitter(C_ASW_Emitter* pEmitter) { m_pEmitter = pEmitter; } void CASW_VGUI_Edit_Emitter::SetTextEntry(float value, vgui::TextEntry* pTextEntry) { char buf[64]; if ((int) value == value) Q_snprintf(buf, sizeof(buf), "%d", (int) value); else Q_snprintf(buf, sizeof(buf), "%.2f", value); pTextEntry->SetText(buf); int i = strlen(pTextEntry->GetName()); Q_strncpy(buf, pTextEntry->GetName(), i-3 ); buf[i-4] = '\0'; vgui::Slider* pSlider = (vgui::Slider*) pTextEntry->GetParent()->FindChildByName(buf); if (pSlider) { char buf2[64]; vgui::TextEntry* pT= (vgui::TextEntry*) pTextEntry; pT->GetText(buf2, 64); pSlider->SetValue(atoi(buf2), false); } } void CASW_VGUI_Edit_Emitter::GetFromTextEntry(float& value, vgui::TextEntry* pTextEntry) { char buf[64]; pTextEntry->GetText(buf, 64); value = atof(buf); } void CASW_VGUI_Edit_Emitter::GetIntFromTextEntry(int& value, vgui::TextEntry* pTextEntry) { char buf[64]; pTextEntry->GetText(buf, 64); value = atoi(buf); } void CASW_VGUI_Edit_Emitter::GetByteFromTextEntry(byte& value, vgui::TextEntry* pTextEntry) { char buf[64]; pTextEntry->GetText(buf, 64); int b = atoi(buf); if (b>255) b = 255; value = b; } void CASW_VGUI_Edit_Emitter::SetCheckbox(bool b, vgui::CheckButton* pCheck) { pCheck->SetSelected(b); } void CASW_VGUI_Edit_Emitter::GetFromCheckbox(bool& b, vgui::CheckButton* pCheck) { b = pCheck->IsSelected(); } // fill in all the text boxes with values from an actual emitter void CASW_VGUI_Edit_Emitter::InitFrom(C_ASW_Emitter* pEmitter) { SetTextEntry(pEmitter->m_hEmitter->m_ParticlesPerSecond, m_pParticlesPerSecondText); SetTextEntry(pEmitter->m_hEmitter->m_iInitialParticleSupply, m_pInitialParticleSupplyText); SetTextEntry(pEmitter->m_hEmitter->m_fParticleLifeMin, m_pParticleLifetimeMinText); SetTextEntry(pEmitter->m_hEmitter->m_fParticleLifeMax, m_pParticleLifetimeMaxText); SetTextEntry(pEmitter->m_hEmitter->m_fPresimulateTime, m_pPresimulateTimeText); SetTextEntry(pEmitter->m_hEmitter->fRollMin, m_pParticleStartRollMinText); SetTextEntry(pEmitter->m_hEmitter->fRollMax, m_pParticleStartRollMaxText); SetTextEntry(pEmitter->m_hEmitter->fRollDeltaMin, m_pParticleRollRateMinText); SetTextEntry(pEmitter->m_hEmitter->fRollDeltaMax, m_pParticleRollRateMaxText); SetTextEntry(pEmitter->m_hEmitter->positionMin.x, m_pParticlePositionMinXText); SetTextEntry(pEmitter->m_hEmitter->positionMin.y, m_pParticlePositionMinYText); SetTextEntry(pEmitter->m_hEmitter->positionMin.z, m_pParticlePositionMinZText); SetTextEntry(pEmitter->m_hEmitter->positionMax.x, m_pParticlePositionMaxXText); SetTextEntry(pEmitter->m_hEmitter->positionMax.y, m_pParticlePositionMaxYText); SetTextEntry(pEmitter->m_hEmitter->positionMax.z, m_pParticlePositionMaxZText); SetTextEntry(pEmitter->m_hEmitter->velocityMin.x, m_pParticleVelocityMinXText); SetTextEntry(pEmitter->m_hEmitter->velocityMin.y, m_pParticleVelocityMinYText); SetTextEntry(pEmitter->m_hEmitter->velocityMin.z, m_pParticleVelocityMinZText); SetTextEntry(pEmitter->m_hEmitter->velocityMax.x, m_pParticleVelocityMaxXText); SetTextEntry(pEmitter->m_hEmitter->velocityMax.y, m_pParticleVelocityMaxYText); SetTextEntry(pEmitter->m_hEmitter->velocityMax.z, m_pParticleVelocityMaxZText); SetTextEntry(pEmitter->m_hEmitter->accelerationMin.x, m_pParticleAccnMinXText); SetTextEntry(pEmitter->m_hEmitter->accelerationMin.y, m_pParticleAccnMinYText); SetTextEntry(pEmitter->m_hEmitter->accelerationMin.z, m_pParticleAccnMinZText); SetTextEntry(pEmitter->m_hEmitter->accelerationMax.x, m_pParticleAccnMaxXText); SetTextEntry(pEmitter->m_hEmitter->accelerationMax.y, m_pParticleAccnMaxYText); SetTextEntry(pEmitter->m_hEmitter->accelerationMax.z, m_pParticleAccnMaxZText); SetTextEntry(pEmitter->m_hEmitter->m_fParticleLocal, m_pParticleLocalText); SetTextEntry(pEmitter->m_hEmitter->m_fLightApply * 100.0f, m_pLightApplyText); SetTextEntry(pEmitter->m_hEmitter->fGravity, m_pGravityText); SetTextEntry(pEmitter->m_hEmitter->m_fGlowScale, m_pGlowScaleText); SetTextEntry(pEmitter->m_hEmitter->m_fGlowDeviation, m_pGlowDeviationText); SetTextEntry(pEmitter->m_hEmitter->m_fBeamLength, m_pBeamLengthText); SetCheckbox(pEmitter->m_hEmitter->m_bScaleBeamByVelocity, m_pScaleBeamByVelocityCheck); SetCheckbox(pEmitter->m_hEmitter->m_bScaleBeamByLifeLeft, m_pScaleBeamByLifeLeftCheck); SetTextEntry(pEmitter->m_hEmitter->m_fDropletChance, m_pDropletChanceText); SetTextEntry(pEmitter->m_hEmitter->m_fLifeLostOnCollision, m_pLifeLostOnCollisionText); SetTextEntry(pEmitter->m_hEmitter->m_fCollisionDampening, m_pCollisionDampeningText); m_pDropletTemplateCombo->SetText(pEmitter->m_hEmitter->GetDropletTemplate()); m_pCollisionTemplateCombo->SetText(pEmitter->m_hEmitter->GetCollisionTemplate()); // node check boxes SetCheckbox(pEmitter->m_hEmitter->m_Alphas[0].bUse, m_pAlpha0Check); SetCheckbox(pEmitter->m_hEmitter->m_Alphas[1].bUse, m_pAlpha1Check); SetCheckbox(pEmitter->m_hEmitter->m_Alphas[2].bUse, m_pAlpha2Check); SetCheckbox(pEmitter->m_hEmitter->m_Alphas[3].bUse, m_pAlpha3Check); SetCheckbox(pEmitter->m_hEmitter->m_Alphas[4].bUse, m_pAlpha4Check); SetCheckbox(pEmitter->m_hEmitter->m_Scales[0].bUse, m_pScale0Check); SetCheckbox(pEmitter->m_hEmitter->m_Scales[1].bUse, m_pScale1Check); SetCheckbox(pEmitter->m_hEmitter->m_Scales[2].bUse, m_pScale2Check); SetCheckbox(pEmitter->m_hEmitter->m_Scales[3].bUse, m_pScale3Check); SetCheckbox(pEmitter->m_hEmitter->m_Scales[4].bUse, m_pScale4Check); SetCheckbox(pEmitter->m_hEmitter->m_Colors[0].bUse, m_pColor0Check); SetCheckbox(pEmitter->m_hEmitter->m_Colors[1].bUse, m_pColor1Check); SetCheckbox(pEmitter->m_hEmitter->m_Colors[2].bUse, m_pColor2Check); SetCheckbox(pEmitter->m_hEmitter->m_Colors[3].bUse, m_pColor3Check); SetCheckbox(pEmitter->m_hEmitter->m_Colors[4].bUse, m_pColor4Check); // node time SetTextEntry(pEmitter->m_hEmitter->m_Alphas[0].fTime, m_pAlpha0TimeText); SetTextEntry(pEmitter->m_hEmitter->m_Alphas[1].fTime, m_pAlpha1TimeText); SetTextEntry(pEmitter->m_hEmitter->m_Alphas[2].fTime, m_pAlpha2TimeText); SetTextEntry(pEmitter->m_hEmitter->m_Alphas[3].fTime, m_pAlpha3TimeText); SetTextEntry(pEmitter->m_hEmitter->m_Alphas[4].fTime, m_pAlpha4TimeText); SetTextEntry(pEmitter->m_hEmitter->m_Scales[0].fTime, m_pScale0TimeText); SetTextEntry(pEmitter->m_hEmitter->m_Scales[1].fTime, m_pScale1TimeText); SetTextEntry(pEmitter->m_hEmitter->m_Scales[2].fTime, m_pScale2TimeText); SetTextEntry(pEmitter->m_hEmitter->m_Scales[3].fTime, m_pScale3TimeText); SetTextEntry(pEmitter->m_hEmitter->m_Scales[4].fTime, m_pScale4TimeText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[0].fTime, m_pColor0TimeText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[1].fTime, m_pColor1TimeText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[2].fTime, m_pColor2TimeText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[3].fTime, m_pColor3TimeText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[4].fTime, m_pColor4TimeText); // simple node value SetTextEntry(pEmitter->m_hEmitter->m_Alphas[0].fAlpha, m_pAlpha0ValueText); SetTextEntry(pEmitter->m_hEmitter->m_Alphas[1].fAlpha, m_pAlpha1ValueText); SetTextEntry(pEmitter->m_hEmitter->m_Alphas[2].fAlpha, m_pAlpha2ValueText); SetTextEntry(pEmitter->m_hEmitter->m_Alphas[3].fAlpha, m_pAlpha3ValueText); SetTextEntry(pEmitter->m_hEmitter->m_Alphas[4].fAlpha, m_pAlpha4ValueText); SetTextEntry(pEmitter->m_hEmitter->m_Scales[0].fScale, m_pScale0ValueText); SetTextEntry(pEmitter->m_hEmitter->m_Scales[1].fScale, m_pScale1ValueText); SetTextEntry(pEmitter->m_hEmitter->m_Scales[2].fScale, m_pScale2ValueText); SetTextEntry(pEmitter->m_hEmitter->m_Scales[3].fScale, m_pScale3ValueText); SetTextEntry(pEmitter->m_hEmitter->m_Scales[4].fScale, m_pScale4ValueText); // color node value SetTextEntry(pEmitter->m_hEmitter->m_Colors[0].Color.r, m_pColor0RedText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[0].Color.g, m_pColor0GreenText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[0].Color.b, m_pColor0BlueText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[1].Color.r, m_pColor1RedText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[1].Color.g, m_pColor1GreenText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[1].Color.b, m_pColor1BlueText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[2].Color.r, m_pColor2RedText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[2].Color.g, m_pColor2GreenText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[2].Color.b, m_pColor2BlueText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[3].Color.r, m_pColor3RedText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[3].Color.g, m_pColor3GreenText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[3].Color.b, m_pColor3BlueText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[4].Color.r, m_pColor4RedText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[4].Color.g, m_pColor4GreenText); SetTextEntry(pEmitter->m_hEmitter->m_Colors[4].Color.b, m_pColor4BlueText); //m_TemplateTextEntry->SetText(m_pEmitter->m_hEmitter->GetTemplateName()); bIgnoreTemplateComboChange = true; m_pTemplateCombo->SetText(m_pEmitter->m_hEmitter->GetTemplateName()); bIgnoreTemplateComboChange = false; // set material combo for (int i=0;im_hEmitter->GetMaterial())) { m_pMaterialCombo->SetText(iszEmitterTextureNames[i]); } } // set glow material combo m_pGlowMaterialCombo->SetText("None"); for (int i=0;im_hEmitter->GetGlowMaterial())) { m_pGlowMaterialCombo->SetText(iszEmitterTextureNames[i]); } } // collision switch(pEmitter->m_hEmitter->m_UseCollision) { case 2: m_pCollisionCombo->SetText("All"); break; case 1: m_pCollisionCombo->SetText("Brush Only"); break; default: m_pCollisionCombo->SetText("None"); break; } m_pCollisionSoundText->SetText(pEmitter->m_hEmitter->m_szCollisionSoundName); m_pCollisionDecalText->SetText(pEmitter->m_hEmitter->m_szCollisionDecalName); // drawtype switch(pEmitter->m_hEmitter->m_DrawType) { case 1: m_pDrawTypeCombo->SetText("Beam"); break; default: m_pDrawTypeCombo->SetText("Sprite"); break; } switch(pEmitter->m_hEmitter->m_iBeamPosition) { case 2: m_pBeamPositionCombo->SetText("Front"); break; case 1: m_pBeamPositionCombo->SetText("Center"); break; default: m_pBeamPositionCombo->SetText("Behind"); break; } switch(pEmitter->m_hEmitter->m_iLightingType) { case 3: m_pLightingCombo->SetText("Scale Alpha+Color"); break; case 2: m_pLightingCombo->SetText("Scale Alpha"); break; case 1: m_pLightingCombo->SetText("Scale Color"); break; default: m_pLightingCombo->SetText("None"); break; } } void CASW_VGUI_Edit_Emitter::ApplyValuesTo(C_ASW_Emitter* pEmitter) { GetFromTextEntry(pEmitter->m_hEmitter->m_ParticlesPerSecond, m_pParticlesPerSecondText); GetIntFromTextEntry(pEmitter->m_hEmitter->m_iInitialParticleSupply, m_pInitialParticleSupplyText); GetFromTextEntry(pEmitter->m_hEmitter->m_fParticleLifeMin, m_pParticleLifetimeMinText); GetFromTextEntry(pEmitter->m_hEmitter->m_fParticleLifeMax, m_pParticleLifetimeMaxText); GetFromTextEntry(pEmitter->m_hEmitter->m_fPresimulateTime, m_pPresimulateTimeText); GetFromTextEntry(pEmitter->m_hEmitter->fRollMin, m_pParticleStartRollMinText); GetFromTextEntry(pEmitter->m_hEmitter->fRollMax, m_pParticleStartRollMaxText); GetFromTextEntry(pEmitter->m_hEmitter->fRollDeltaMin, m_pParticleRollRateMinText); GetFromTextEntry(pEmitter->m_hEmitter->fRollDeltaMax, m_pParticleRollRateMaxText); GetFromTextEntry(pEmitter->m_hEmitter->positionMin.x, m_pParticlePositionMinXText); GetFromTextEntry(pEmitter->m_hEmitter->positionMin.y, m_pParticlePositionMinYText); GetFromTextEntry(pEmitter->m_hEmitter->positionMin.z, m_pParticlePositionMinZText); GetFromTextEntry(pEmitter->m_hEmitter->positionMax.x, m_pParticlePositionMaxXText); GetFromTextEntry(pEmitter->m_hEmitter->positionMax.y, m_pParticlePositionMaxYText); GetFromTextEntry(pEmitter->m_hEmitter->positionMax.z, m_pParticlePositionMaxZText); GetFromTextEntry(pEmitter->m_hEmitter->velocityMin.x, m_pParticleVelocityMinXText); GetFromTextEntry(pEmitter->m_hEmitter->velocityMin.y, m_pParticleVelocityMinYText); GetFromTextEntry(pEmitter->m_hEmitter->velocityMin.z, m_pParticleVelocityMinZText); GetFromTextEntry(pEmitter->m_hEmitter->velocityMax.x, m_pParticleVelocityMaxXText); GetFromTextEntry(pEmitter->m_hEmitter->velocityMax.y, m_pParticleVelocityMaxYText); GetFromTextEntry(pEmitter->m_hEmitter->velocityMax.z, m_pParticleVelocityMaxZText); GetFromTextEntry(pEmitter->m_hEmitter->accelerationMin.x, m_pParticleAccnMinXText); GetFromTextEntry(pEmitter->m_hEmitter->accelerationMin.y, m_pParticleAccnMinYText); GetFromTextEntry(pEmitter->m_hEmitter->accelerationMin.z, m_pParticleAccnMinZText); GetFromTextEntry(pEmitter->m_hEmitter->accelerationMax.x, m_pParticleAccnMaxXText); GetFromTextEntry(pEmitter->m_hEmitter->accelerationMax.y, m_pParticleAccnMaxYText); GetFromTextEntry(pEmitter->m_hEmitter->accelerationMax.z, m_pParticleAccnMaxZText); GetFromTextEntry(pEmitter->m_hEmitter->m_fParticleLocal, m_pParticleLocalText); GetFromTextEntry(pEmitter->m_hEmitter->m_fLightApply, m_pLightApplyText); pEmitter->m_hEmitter->m_fLightApply *= 0.01f; GetFromTextEntry(pEmitter->m_hEmitter->fGravity, m_pGravityText); GetFromTextEntry(pEmitter->m_hEmitter->m_fGlowScale, m_pGlowScaleText); GetFromTextEntry(pEmitter->m_hEmitter->m_fGlowDeviation, m_pGlowDeviationText); GetFromTextEntry(pEmitter->m_hEmitter->m_fBeamLength, m_pBeamLengthText); GetFromCheckbox(pEmitter->m_hEmitter->m_bScaleBeamByVelocity, m_pScaleBeamByVelocityCheck); GetFromCheckbox(pEmitter->m_hEmitter->m_bScaleBeamByLifeLeft, m_pScaleBeamByLifeLeftCheck); GetFromTextEntry(pEmitter->m_hEmitter->m_fDropletChance, m_pDropletChanceText); GetFromTextEntry(pEmitter->m_hEmitter->m_fLifeLostOnCollision, m_pLifeLostOnCollisionText); GetFromTextEntry(pEmitter->m_hEmitter->m_fCollisionDampening, m_pCollisionDampeningText); // node check boxes GetFromCheckbox(pEmitter->m_hEmitter->m_Alphas[0].bUse, m_pAlpha0Check); GetFromCheckbox(pEmitter->m_hEmitter->m_Alphas[1].bUse, m_pAlpha1Check); GetFromCheckbox(pEmitter->m_hEmitter->m_Alphas[2].bUse, m_pAlpha2Check); GetFromCheckbox(pEmitter->m_hEmitter->m_Alphas[3].bUse, m_pAlpha3Check); GetFromCheckbox(pEmitter->m_hEmitter->m_Alphas[4].bUse, m_pAlpha4Check); GetFromCheckbox(pEmitter->m_hEmitter->m_Scales[0].bUse, m_pScale0Check); GetFromCheckbox(pEmitter->m_hEmitter->m_Scales[1].bUse, m_pScale1Check); GetFromCheckbox(pEmitter->m_hEmitter->m_Scales[2].bUse, m_pScale2Check); GetFromCheckbox(pEmitter->m_hEmitter->m_Scales[3].bUse, m_pScale3Check); GetFromCheckbox(pEmitter->m_hEmitter->m_Scales[4].bUse, m_pScale4Check); GetFromCheckbox(pEmitter->m_hEmitter->m_Colors[0].bUse, m_pColor0Check); GetFromCheckbox(pEmitter->m_hEmitter->m_Colors[1].bUse, m_pColor1Check); GetFromCheckbox(pEmitter->m_hEmitter->m_Colors[2].bUse, m_pColor2Check); GetFromCheckbox(pEmitter->m_hEmitter->m_Colors[3].bUse, m_pColor3Check); GetFromCheckbox(pEmitter->m_hEmitter->m_Colors[4].bUse, m_pColor4Check); // node time GetFromTextEntry(pEmitter->m_hEmitter->m_Alphas[0].fTime, m_pAlpha0TimeText); GetFromTextEntry(pEmitter->m_hEmitter->m_Alphas[1].fTime, m_pAlpha1TimeText); GetFromTextEntry(pEmitter->m_hEmitter->m_Alphas[2].fTime, m_pAlpha2TimeText); GetFromTextEntry(pEmitter->m_hEmitter->m_Alphas[3].fTime, m_pAlpha3TimeText); GetFromTextEntry(pEmitter->m_hEmitter->m_Alphas[4].fTime, m_pAlpha4TimeText); GetFromTextEntry(pEmitter->m_hEmitter->m_Scales[0].fTime, m_pScale0TimeText); GetFromTextEntry(pEmitter->m_hEmitter->m_Scales[1].fTime, m_pScale1TimeText); GetFromTextEntry(pEmitter->m_hEmitter->m_Scales[2].fTime, m_pScale2TimeText); GetFromTextEntry(pEmitter->m_hEmitter->m_Scales[3].fTime, m_pScale3TimeText); GetFromTextEntry(pEmitter->m_hEmitter->m_Scales[4].fTime, m_pScale4TimeText); GetFromTextEntry(pEmitter->m_hEmitter->m_Colors[0].fTime, m_pColor0TimeText); GetFromTextEntry(pEmitter->m_hEmitter->m_Colors[1].fTime, m_pColor1TimeText); GetFromTextEntry(pEmitter->m_hEmitter->m_Colors[2].fTime, m_pColor2TimeText); GetFromTextEntry(pEmitter->m_hEmitter->m_Colors[3].fTime, m_pColor3TimeText); GetFromTextEntry(pEmitter->m_hEmitter->m_Colors[4].fTime, m_pColor4TimeText); // simple node value GetFromTextEntry(pEmitter->m_hEmitter->m_Alphas[0].fAlpha, m_pAlpha0ValueText); GetFromTextEntry(pEmitter->m_hEmitter->m_Alphas[1].fAlpha, m_pAlpha1ValueText); GetFromTextEntry(pEmitter->m_hEmitter->m_Alphas[2].fAlpha, m_pAlpha2ValueText); GetFromTextEntry(pEmitter->m_hEmitter->m_Alphas[3].fAlpha, m_pAlpha3ValueText); GetFromTextEntry(pEmitter->m_hEmitter->m_Alphas[4].fAlpha, m_pAlpha4ValueText); GetFromTextEntry(pEmitter->m_hEmitter->m_Scales[0].fScale, m_pScale0ValueText); GetFromTextEntry(pEmitter->m_hEmitter->m_Scales[1].fScale, m_pScale1ValueText); GetFromTextEntry(pEmitter->m_hEmitter->m_Scales[2].fScale, m_pScale2ValueText); GetFromTextEntry(pEmitter->m_hEmitter->m_Scales[3].fScale, m_pScale3ValueText); GetFromTextEntry(pEmitter->m_hEmitter->m_Scales[4].fScale, m_pScale4ValueText); // color node value GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[0].Color.r, m_pColor0RedText); GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[0].Color.g, m_pColor0GreenText); GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[0].Color.b, m_pColor0BlueText); GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[1].Color.r, m_pColor1RedText); GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[1].Color.g, m_pColor1GreenText); GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[1].Color.b, m_pColor1BlueText); GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[2].Color.r, m_pColor2RedText); GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[2].Color.g, m_pColor2GreenText); GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[2].Color.b, m_pColor2BlueText); GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[3].Color.r, m_pColor3RedText); GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[3].Color.g, m_pColor3GreenText); GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[3].Color.b, m_pColor3BlueText); GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[4].Color.r, m_pColor4RedText); GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[4].Color.g, m_pColor4GreenText); GetByteFromTextEntry(pEmitter->m_hEmitter->m_Colors[4].Color.b, m_pColor4BlueText); //m_TemplateTextEntry->GetText(pEmitter->m_hEmitter->m_szTemplateName, MAX_PATH); pEmitter->m_hEmitter->Update(); } // load the texture strings in for our drop down texture selection box void CASW_VGUI_Edit_Emitter::LoadTextures() { KeyValues* m_TextureKeyValues = new KeyValues( "ParticleEmitters" ); char tempfile[MAX_PATH]; Q_snprintf( tempfile, sizeof( tempfile ), "resource/ParticleEmitters.txt" ); if ( !m_TextureKeyValues->LoadFromFile( filesystem, tempfile, "GAME" ) ) { DevMsg( 1, "CASW_VGUI_Edit_Emitter::LoadTextures: couldn't load file: %s\n", tempfile ); return; } KeyValues* kv = m_TextureKeyValues->GetFirstValue(); while (kv) { string_t pooledName = AllocPooledString( kv->GetString() ); iszEmitterTextureNames.AddToTail( pooledName ); kv = kv->GetNextValue(); } } void CASW_VGUI_Edit_Emitter::AddMaterialDropDown() { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(220); pPanel->SetTall(20); pPanel->SetPos(0,m_LayoutCursorY); m_pMaterialCombo = new vgui::ComboBox(pPanel, "MaterialCombo",iszEmitterTextureNames.Count(),false); m_pMaterialCombo->SetTall(20); m_pMaterialCombo->SetWide(200); m_pMaterialCombo->SetPos(20,0); m_pMaterialCombo->AddActionSignalTarget(this); for (int i=0; iAddItem(iszEmitterTextureNames[i], NULL); } m_ListPanel->AddItem(NULL, pPanel); m_LayoutCursorY += 20; } void CASW_VGUI_Edit_Emitter::AddGlowMaterialDropDown() { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(220); pPanel->SetTall(20); pPanel->SetPos(0,m_LayoutCursorY); m_pGlowMaterialCombo = new vgui::ComboBox(pPanel, "GlowMaterialCombo",iszEmitterTextureNames.Count()+1,false); m_pGlowMaterialCombo->SetTall(20); m_pGlowMaterialCombo->SetWide(200); m_pGlowMaterialCombo->SetPos(20,0); m_pGlowMaterialCombo->AddActionSignalTarget(this); m_pGlowMaterialCombo->AddItem("None", NULL); for (int i=0; iAddItem(iszEmitterTextureNames[i], NULL); } m_ListPanel->AddItem(NULL, pPanel); m_LayoutCursorY += 20; } void CASW_VGUI_Edit_Emitter::AddCollisionSoundEdit() { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(220); pPanel->SetTall(20); pPanel->SetPos(0,m_LayoutCursorY); m_pCollisionSoundText = new vgui::TextEntry(pPanel, "Edit_Emitter_CollisiOn_Sound_edit"); m_pCollisionSoundText->SetTall(20); m_pCollisionSoundText->SetWide(200); m_pCollisionSoundText->SetPos(20,0); m_pCollisionSoundText->AddActionSignalTarget(this); m_ListPanel->AddItem(NULL, pPanel); m_LayoutCursorY += 20; } void CASW_VGUI_Edit_Emitter::AddCollisionDecalEdit() { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(220); pPanel->SetTall(20); pPanel->SetPos(0,m_LayoutCursorY); m_pCollisionDecalText = new vgui::TextEntry(pPanel, "Edit_Emitter_CollisiOn_Decal_edit"); m_pCollisionDecalText->SetTall(20); m_pCollisionDecalText->SetWide(200); m_pCollisionDecalText->SetPos(20,0); m_pCollisionDecalText->AddActionSignalTarget(this); m_ListPanel->AddItem(NULL, pPanel); m_LayoutCursorY += 20; } void CASW_VGUI_Edit_Emitter::AddCollisionDropDown() { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(220); pPanel->SetTall(20); pPanel->SetPos(0,m_LayoutCursorY); m_pCollisionCombo = new vgui::ComboBox(pPanel, "CollisionCombo",3,false); m_pCollisionCombo->SetTall(20); m_pCollisionCombo->SetWide(200); m_pCollisionCombo->SetPos(20,0); m_pCollisionCombo->AddActionSignalTarget(this); m_pCollisionCombo->AddItem("None", NULL); m_pCollisionCombo->AddItem("Brush Only", NULL); m_pCollisionCombo->AddItem("All", NULL); m_ListPanel->AddItem(NULL, pPanel); m_LayoutCursorY += 20; } void CASW_VGUI_Edit_Emitter::AddLightingDropDown() { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(220); pPanel->SetTall(20); pPanel->SetPos(0,m_LayoutCursorY); m_pLightingCombo = new vgui::ComboBox(pPanel, "lightingcombo",3,false); m_pLightingCombo->SetTall(20); m_pLightingCombo->SetWide(200); m_pLightingCombo->SetPos(20,0); m_pLightingCombo->AddActionSignalTarget(this); m_pLightingCombo->AddItem("None", NULL); m_pLightingCombo->AddItem("Scale Color", NULL); m_pLightingCombo->AddItem("Scale Alpha", NULL); m_pLightingCombo->AddItem("Scale Alpha+Color", NULL); m_ListPanel->AddItem(NULL, pPanel); m_LayoutCursorY += 20; } void CASW_VGUI_Edit_Emitter::AddBeamPositionDropDown() { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(220); pPanel->SetTall(20); pPanel->SetPos(0,m_LayoutCursorY); m_pBeamPositionCombo = new vgui::ComboBox(pPanel, "beamposcombo",3,false); m_pBeamPositionCombo->SetTall(20); m_pBeamPositionCombo->SetWide(200); m_pBeamPositionCombo->SetPos(20,0); m_pBeamPositionCombo->AddActionSignalTarget(this); m_pBeamPositionCombo->AddItem("Behind", NULL); m_pBeamPositionCombo->AddItem("Center", NULL); m_pBeamPositionCombo->AddItem("Front", NULL); m_ListPanel->AddItem(NULL, pPanel); m_LayoutCursorY += 20; } void CASW_VGUI_Edit_Emitter::AddDrawTypeDropDown() { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(220); pPanel->SetTall(20); pPanel->SetPos(0,m_LayoutCursorY); m_pDrawTypeCombo = new vgui::ComboBox(pPanel, "DrawTypeCombo",2,false); m_pDrawTypeCombo->SetTall(20); m_pDrawTypeCombo->SetWide(200); m_pDrawTypeCombo->SetPos(20,0); m_pDrawTypeCombo->AddActionSignalTarget(this); m_pDrawTypeCombo->AddItem("Sprite", NULL); m_pDrawTypeCombo->AddItem("Beam", NULL); m_ListPanel->AddItem(NULL, pPanel); m_LayoutCursorY += 20; } void CASW_VGUI_Edit_Emitter::AddDropletTemplateDropDown() { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(260); pPanel->SetTall(20); pPanel->SetPos(0, m_LayoutCursorY); m_pDropletTemplateCombo = new vgui::ComboBox(pPanel, "DropletTemplateCombo",iszTemplateNames.Count()+1,false); m_pDropletTemplateCombo->SetTall(20); m_pDropletTemplateCombo->SetWide(200); m_pDropletTemplateCombo->SetPos(20,0); m_pDropletTemplateCombo->AddActionSignalTarget(this); m_pDropletTemplateCombo->AddItem("None", NULL); for (int i=0; iAddItem(iszTemplateNames[i], NULL); } m_ListPanel->AddItem(NULL, pPanel); m_LayoutCursorY += 20; } void CASW_VGUI_Edit_Emitter::AddCollisionTemplateDropDown() { CASW_VGUI_Edit_Emitter_List_Item* pPanel = new CASW_VGUI_Edit_Emitter_List_Item(m_ListPanel, "Edit_Emitter_List_Item"); pPanel->SetWide(260); pPanel->SetTall(20); pPanel->SetPos(0, m_LayoutCursorY); m_pCollisionTemplateCombo = new vgui::ComboBox(pPanel, "CollisionTemplateCombo",iszTemplateNames.Count()+1,false); m_pCollisionTemplateCombo->SetTall(20); m_pCollisionTemplateCombo->SetWide(200); m_pCollisionTemplateCombo->SetPos(20,0); m_pCollisionTemplateCombo->AddActionSignalTarget(this); m_pCollisionTemplateCombo->AddItem("None", NULL); for (int i=0; iAddItem(iszTemplateNames[i], NULL); } m_ListPanel->AddItem(NULL, pPanel); m_LayoutCursorY += 20; } void CASW_VGUI_Edit_Emitter::OnThink() { BaseClass::OnThink(); UpdateNumParticlesLabel(); } void CASW_VGUI_Edit_Emitter::TemplateSaveButtonClicked() { bNeedSave = false; if (m_pSaveDialog == NULL) { m_pSaveDialog = new CASW_VGUI_Edit_Emitter_SaveDialog(this, "EmitterSaveDialog", this); m_pSaveDialog->SetScheme(vgui::scheme()->LoadSchemeFromFile("resource/SwarmFrameScheme.res", "SwarmFrameScheme")); m_pSaveDialog->Activate(); } } /* void CASW_VGUI_Edit_Emitter::TemplateLoadButtonClicked() { } void CASW_VGUI_Edit_Emitter::TemplateSaveAsButtonClicked() { }*/ void CASW_VGUI_Edit_Emitter::BuildTemplateList() { iszTemplateNames.Purge(); // Search the directory structure. char templatewild[MAX_PATH]; Q_strncpy(templatewild,"resource/particletemplates/*.ptm", sizeof( templatewild ) ); FileFindHandle_t findHandle; char const *findfn = filesystem->FindFirst(templatewild, &findHandle); while ( findfn ) { char sz[ MAX_PATH ]; Q_strncpy(sz, findfn, strlen(findfn)-3); sz[strlen(findfn)-3]='\0'; string_t pooledName = AllocPooledString( sz ); iszTemplateNames.AddToTail( pooledName ); findfn = filesystem->FindNext( findHandle ); } filesystem->FindClose(findHandle); } void CASW_VGUI_Edit_Emitter::LoadTemplate(const char* pTemplateName) { m_pEmitter->UseTemplate(pTemplateName,false); InitFrom(m_pEmitter); bNeedSave = false; } void CASW_VGUI_Edit_Emitter::SaveDialogClosed() { m_pSaveDialog = NULL; } void CASW_VGUI_Edit_Emitter::SaveDialogSave(const char *pTemplateName) { // add it to the template list if need be bool bFound = false; for (int i=0;iRemoveAll(); for (int i=0; iAddItem(iszTemplateNames[i], NULL); } m_pTemplateCombo->SetText(pTemplateName); // tell the emitter to save itself under this name and change its template name m_pEmitter->SaveAsTemplate(pTemplateName); }