source-engine/game/client/swarm/vgui/asw_vgui_edit_emitter.cpp
2023-10-03 17:23:56 +03:00

1363 lines
51 KiB
C++

#include "cbase.h"
#include "asw_vgui_edit_emitter.h"
#include "c_asw_generic_emitter.h"
#include "asw_vgui_edit_emitter_dialogs.h"
#include <KeyValues.h>
#include <filesystem.h>
#include "fmtstr.h"
#include "convar.h"
#include "vgui/ivgui.h"
#include <vgui/vgui.h>
#include <vgui_controls/Controls.h>
#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; i<iszTemplateNames.Count();i++)
{
m_pTemplateCombo->AddItem(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;i<iszEmitterTextureNames.Count();i++)
{
if (!strcmp(iszEmitterTextureNames[i], pEmitter->m_hEmitter->GetMaterial()))
{
m_pMaterialCombo->SetText(iszEmitterTextureNames[i]);
}
}
// set glow material combo
m_pGlowMaterialCombo->SetText("None");
for (int i=0;i<iszEmitterTextureNames.Count();i++)
{
if (!strcmp(iszEmitterTextureNames[i], pEmitter->m_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; i<iszEmitterTextureNames.Count();i++)
{
m_pMaterialCombo->AddItem(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; i<iszEmitterTextureNames.Count();i++)
{
m_pGlowMaterialCombo->AddItem(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; i<iszTemplateNames.Count();i++)
{
m_pDropletTemplateCombo->AddItem(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; i<iszTemplateNames.Count();i++)
{
m_pCollisionTemplateCombo->AddItem(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;i<iszTemplateNames.Count();i++)
{
if (!strcmp(iszTemplateNames[i], pTemplateName))
{
bFound = true;
break;
}
}
if (!bFound)
{
string_t pooledName = AllocPooledString( pTemplateName );
iszTemplateNames.AddToTail( pooledName );
}
// resetup the combo box and set its text to the current
m_pTemplateCombo->RemoveAll();
for (int i=0; i<iszTemplateNames.Count();i++)
{
m_pTemplateCombo->AddItem(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);
}