#include "datasource.h" #include "databool.h" #include "datacolor.h" #include "datafloat.h" #include "datagraph.h" #include "dataposition.h" #include "datauv.h" #include "datastring.h" #include "..\..\TextFile.h" #include "..\..\icommon\memfile.h" #include "..\..\..\common_h\core.h" #ifndef _XBOX #include "..\..\..\common_h\tinyxml\tinyxml.h" #endif #include "..\..\..\Common_h\data_swizzle.h" #define HEADER "PSYS" #define VERSION "v3.5" BEGIN_DATA_DESC(PointEmitterDesc) DATA_STRING (GUID_EMITTER_NAME, EMITTER_NAME, "Emiter name"); DATA_FLOAT (GUID_EMITTER_LIFETIME, EMITTER_LIFETIME, "Emiter lifetime"); DATA_POSITION (GUID_EMITTER_POSITION, EMITTER_POSITION, "Position"); DATA_GRAPH (GUID_EMISSION_DIR_X, EMISSION_DIR_X, "Emission dir PITCH"); DATA_GRAPH (GUID_EMISSION_DIR_Y, EMISSION_DIR_Y, "Emission dir YAW"); DATA_GRAPH (GUID_EMISSION_DIR_Z, EMISSION_DIR_Z, "Emission dir ROLL"); DATA_BOOL (GUID_EMITTER_LOOPING, EMITTER_LOOPING, "Looping"); DATA_FLOAT (GUID_EMITTER_SIZEX, EMITTER_SIZEX, "Size X"); DATA_FLOAT (GUID_EMITTER_SIZEY, EMITTER_SIZEY, "Size Y"); DATA_FLOAT (GUID_EMITTER_SIZEZ, EMITTER_SIZEZ, "Size Z"); END_DATA_DESC(PointEmitterDesc) BEGIN_DATA_DESC(BillboardParticleDesc) DATA_POSITION (GUID_PARTICLE_EXTERNALFORCE, PARTICLE_EXTERNALFORCE, "External force"); DATA_STRING(GUID_PARTICLE_NAME, PARTICLE_NAME, "Name"); DATA_GRAPH (GUID_PARTICLE_EMISSION_RATE, PARTICLE_EMISSION_RATE, "Emission rate"); DATA_FLOAT (GUID_PARTICLE_MAX_COUNT, PARTICLE_MAX_COUNT, "Max Particles count"); // DATA_GRAPH (PARTICLE_TRACK_X); // DATA_GRAPH (PARTICLE_TRACK_Y); // DATA_GRAPH (PARTICLE_TRACK_Z); DATA_GRAPH (GUID_PARTICLE_LIFE_TIME, PARTICLE_LIFE_TIME, "Life time"); DATA_GRAPH (GUID_PARTICLE_MASS, PARTICLE_MASS, "Mass"); DATA_GRAPH (GUID_PARTICLE_SPIN, PARTICLE_SPIN, "Spin"); DATA_GRAPH (GUID_PARTICLE_VELOCITY_POWER, PARTICLE_VELOCITY_POWER, "Initial Velocity"); DATA_GRAPH (GUID_PARTICLE_INITIALSPIN, PARTICLE_INITIALSPIN, "Initial Rotate"); DATA_GRAPH (GUID_PARTICLE_SPIN_DRAG, PARTICLE_SPIN_DRAG, "Spin friction"); DATA_GRAPH (GUID_PARTICLE_SIZE, PARTICLE_SIZE, "Size percent"); DATA_GRAPH (GUID_PARTICLE_INITSIZE, PARTICLE_INITSIZE, "Initial Size"); DATA_GRAPH (GUID_PARTICLE_ANIMFRAME, PARTICLE_ANIMFRAME, "Animation frame"); DATA_COLOR (GUID_PARTICLE_COLOR, PARTICLE_COLOR, "Color"); DATA_GRAPH (GUID_PARTICLE_COLORMULTIPLY, PARTICLE_COLORMULTIPLY, "Color_Multipler"); DATA_UV (GUID_PARTICLE_FRAMES, PARTICLE_FRAMES, "Texture"); DATA_GRAPH (GUID_PARTICLE_TRANSPARENCY, PARTICLE_TRANSPARENCY, "Transparency"); DATA_GRAPH (GUID_PARTICLE_DRAG, PARTICLE_DRAG, "Friction"); // DATA_GRAPH (PARTICLE_PHYSIC_BLEND); DATA_STRING (GUID_ATTACHEDEMITTER_NAME, ATTACHEDEMITTER_NAME, "Attached emiter"); DATA_GRAPH (GUID_PARTICLE_GRAVITATION_K, PARTICLE_GRAVITATION_K, "Gravity strength"); DATA_BOOL (GUID_PARTICLE_DIR_ORIENT, PARTICLE_DIR_ORIENT, "Direction orient"); DATA_BOOL (GUID_PARTICLE_LOCAL_SYSTEM, PARTICLE_LOCAL_SYSTEM, "Animate in Local System"); DATA_GRAPH (GUID_PARTICLE_ADDPOWER, PARTICLE_ADDPOWER, "Add Technique Power"); DATA_STRING (GUID_FORCEFIELDS_NAME, FORCEFIELDS_NAME, "Forcefiels"); DATA_GRAPH (GUID_PARTICLE_SIZE, PARTICLE_SIZE, "Size percent"); DATA_GRAPH (GUID_PARTICLE_SIZEINC, PARTICLE_SIZEINC, "Size increment"); DATA_GRAPH (GUID_PARTICLE_LIGHTPOWER, PARTICLE_LIGHTPOWER, "Inverse Light power"); DATA_GRAPH (GUID_PARTICLE_INITPOSX, PARTICLE_INITPOSX, "Initial position X"); DATA_GRAPH (GUID_PARTICLE_INITPOSY, PARTICLE_INITPOSY, "Initial position Y"); DATA_GRAPH (GUID_PARTICLE_INITPOSZ, PARTICLE_INITPOSZ, "Initial position Z"); DATA_BOOL (GUID_PARTICLE_DISTORTED, PARTICLE_DISTORTED, "Distorted") DATA_GRAPH (GUID_PARTICLE_DISTORTED_POWER, PARTICLE_DISTORTED_POWER, "Distorsion power in percent"); DATA_BOOL (GUID_PARTICLE_ZXALIGN, PARTICLE_ZXALIGN, "XZ_Aligned") //DATA_BOOL (GUID_PARTICLE_AFFECT_AMBIENT, PARTICLE_AFFECT_AMBIENT, "Always affect ambient light") DATA_GRAPH (GUID_PARTICLE_AMBIENTPOWER, PARTICLE_AMBIENTPOWER, "Inverse Ambient power"); END_DATA_DESC(BillboardParticleDesc) BEGIN_DATA_DESC(ModelParticleDesc) DATA_STRING(GUID_PARTICLE_NAME, PARTICLE_NAME, "Name"); DATA_GRAPH (GUID_PARTICLE_EMISSION_RATE, PARTICLE_EMISSION_RATE, "Emission rate"); DATA_FLOAT (GUID_PARTICLE_MAX_COUNT, PARTICLE_MAX_COUNT, "Max Particles count"); // DATA_GRAPH (PARTICLE_TRACK_X); // DATA_GRAPH (PARTICLE_TRACK_Y); // DATA_GRAPH (PARTICLE_TRACK_Z); DATA_GRAPH (GUID_PARTICLE_LIFE_TIME, PARTICLE_LIFE_TIME, "Life time"); DATA_GRAPH (GUID_PARTICLE_MASS, PARTICLE_MASS, "Mass"); DATA_GRAPH (GUID_PARTICLE_SPIN_X, PARTICLE_SPIN_X, "Spin X"); DATA_GRAPH (GUID_PARTICLE_SPIN_Y, PARTICLE_SPIN_Y, "Spin Y"); DATA_GRAPH (GUID_PARTICLE_SPIN_Z, PARTICLE_SPIN_Z, "Spin Z"); DATA_GRAPH (GUID_PARTICLE_VELOCITY_POWER, PARTICLE_VELOCITY_POWER, "Initial Velocity"); DATA_GRAPH (GUID_PARTICLE_SPIN_DRAGX, PARTICLE_SPIN_DRAGX, "Spin Friction X"); DATA_GRAPH (GUID_PARTICLE_SPIN_DRAGY, PARTICLE_SPIN_DRAGY, "Spin Friction Y"); DATA_GRAPH (GUID_PARTICLE_SPIN_DRAGZ, PARTICLE_SPIN_DRAGZ, "Spin Friction Y"); DATA_GRAPH (GUID_PARTICLE_DRAG, PARTICLE_DRAG, "Friction"); // DATA_GRAPH (PARTICLE_PHYSIC_BLEND); DATA_STRING (GUID_ATTACHEDEMITTER_NAME, ATTACHEDEMITTER_NAME, "Attached emitter"); DATA_GRAPH (GUID_PARTICLE_GRAVITATION_K, PARTICLE_GRAVITATION_K, "Gravity strength"); DATA_STRING (GUID_PARTICLE_GEOM_NAMES, PARTICLE_GEOM_NAMES, "Model names"); DATA_STRING (GUID_FORCEFIELDS_NAME, FORCEFIELDS_NAME, "Forcefiels"); END_DATA_DESC(ModelParticleDesc) //---------- Создание/удаление -------------------- DataSource::DataSource () : Emitters(_FL_, 1) { } DataSource::~DataSource () { Destroy (); } bool DataSource::Release () { delete this; return true; } // ========================= Load & Save ======================================= //Сохранить/восстановить из файла void DataSource::Write (MemFile* pMemFile) { pMemFile->Write(HEADER, 4); pMemFile->Write(VERSION, 4); DWORD dwEmittersCount = Emitters.Size(); pMemFile->WriteType(dwEmittersCount); for (DWORD n = 0; n < dwEmittersCount; n++) { pMemFile->WriteType(Emitters[n].Type); Emitters[n].Fields.Write(pMemFile); DWORD dwParticlesSize = Emitters[n].Particles.Size(); pMemFile->WriteType(dwParticlesSize); for (DWORD i = 0; i < dwParticlesSize; i++) { pMemFile->WriteType(Emitters[n].Particles[i].Type); Emitters[n].Particles[i].Fields.Write(pMemFile); } } } #ifndef _XBOX void DataSource::WriteXML (TextFile* xmlFile, dword level) { xmlFile->Write(level, "\n"); DWORD dwEmittersCount = Emitters.Size(); for (DWORD n = 0; n < dwEmittersCount; n++) { xmlFile->Write((level+1), "\n"); Emitters[n].Fields.WriteXML(xmlFile, (level+1)); DWORD dwParticlesSize = Emitters[n].Particles.Size(); for (DWORD i = 0; i < dwParticlesSize; i++) { switch (Emitters[n].Particles[i].Type) { case BILLBOARD_PARTICLE: xmlFile->Write((level+2), "\n"); break; case MODEL_PARTICLE: xmlFile->Write((level+2), "\n"); break; } Emitters[n].Particles[i].Fields.WriteXML(xmlFile, (level+2)); xmlFile->Write((level+2), "\n"); } xmlFile->Write((level+1), "\n"); } xmlFile->Write(level, "\n"); /* pMemFile->Write(HEADER, 4); pMemFile->Write(VERSION, 4); DWORD dwEmittersCount = Emitters.Size(); pMemFile->WriteType(dwEmittersCount); for (DWORD n = 0; n < dwEmittersCount; n++) { pMemFile->WriteType(Emitters[n].Type); Emitters[n].Fields.Write(pMemFile); DWORD dwParticlesSize = Emitters[n].Particles.Size(); pMemFile->WriteType(dwParticlesSize); for (DWORD i = 0; i < dwParticlesSize; i++) { pMemFile->WriteType(Emitters[n].Particles[i].Type); Emitters[n].Particles[i].Fields.Write(pMemFile); } } */ } void DataSource::LoadXML (TiXmlDocument* xmlFile) { TiXmlElement* rootNode = xmlFile->FirstChildElement( "Particles" ); if (!rootNode) { api->Trace ("XML Particles: Incorrect file type"); return; } for(TiXmlElement* child = rootNode->FirstChildElement(); child; child = child->NextSiblingElement()) { string NodeName = child->Value(); string NodeVal = child->Attribute("val"); if (NodeName == "Emitter" && NodeVal == "POINT_EMITTER") { CreatePointEmitterXML (child); } } } #endif void DataSource::Load (MemFile* pMemFile) { //Проверяем ID char Id[5]; Id[4] = 0; pMemFile->Read(Id, 4); if (strcmp (Id, HEADER) != 0) { api->Trace ("Particles: Incorrect file type"); return; } //Проверяем Версию char Ver[5]; Ver[4] = 0; pMemFile->Read(Ver, 4); /* // show warnings if (strcmp (Ver, VERSION) != 0) api->Trace ("Particles: Warning !!! Incorrect file version %s, must be %s", Ver, VERSION); */ //Кол-во эмиттеров... dword EmiterCount = 0; pMemFile->ReadType(EmiterCount); XSwizzleDWord(EmiterCount); Emitters.Reserve(EmiterCount); for (DWORD n = 0; n < EmiterCount; n++) { EmitterType emType = UNKNOWN_EMITTER; pMemFile->ReadType(emType); emType = (EmitterType)SwizzleDWord(emType); switch (emType) { case POINT_EMITTER: { // api->Trace ("Particles info: Point emitter"); CreatePointEmitter (pMemFile); break; } default: { throw ("Particles: Unknown emitter type !"); return; } } // switch } // for all saved emitters... } #ifndef _XBOX void DataSource::CreatePointEmitterXML (TiXmlElement* root) { EmitterDesc* PointEmitter = &Emitters[Emitters.Add()]; PointEmitter->Fields.SetMasterDataSource(this); PointEmitter->Type = POINT_EMITTER; for(TiXmlElement* child = root->FirstChildElement(); child; child = child->NextSiblingElement()) { string NodeName = child->Value(); string NodeVal = child->Attribute("val"); if (NodeName == "Fields") { PointEmitter->Fields.LoadXML(child, &PointEmitterDesc); PointEmitter->Fields.Convert (&PointEmitterDesc); } if (NodeName == "Particle" && NodeVal == "BILLBOARD_PARTICLE") { CreateBillBoardParticleXML (PointEmitter->Particles, child); } if (NodeName == "Particle" && NodeVal == "MODEL_PARTICLE") { CreateModelParticleXML (PointEmitter->Particles, child); } } } #endif void DataSource::CreatePointEmitter (MemFile* pMemFile) { //api->Trace ("Particles info: Point emitter"); EmitterDesc* PointEmitter = &Emitters[Emitters.Add()]; PointEmitter->Fields.SetMasterDataSource(this); PointEmitter->Fields.Load(pMemFile, &PointEmitterDesc); PointEmitter->Fields.Convert (&PointEmitterDesc); PointEmitter->Type = POINT_EMITTER; dword ParticlesCount = 0; pMemFile->ReadType(ParticlesCount); XSwizzleDWord(ParticlesCount); PointEmitter->Particles.Reserve(ParticlesCount); for (DWORD n = 0; n < ParticlesCount; n++) { ParticleType ptType = UNKNOWN_PARTICLE; pMemFile->ReadType(ptType); ptType = (ParticleType)SwizzleDWord(ptType); switch(ptType) { case BILLBOARD_PARTICLE: { //api->Trace ("Particles info: Billboard particle"); CreateBillBoardParticle (PointEmitter->Particles, pMemFile); break; } case MODEL_PARTICLE: { //api->Trace ("Particles info: Model particle"); CreateModelParticle (PointEmitter->Particles, pMemFile); break; } default: { throw ("Particles: Unknown particle type !!!!"); } } // SWITCH } // For all particles } //Создает BillBoard парикл void DataSource::CreateBillBoardParticle (array &Particles, MemFile* pMemFile) { ParticleDesc *pDesc = &Particles[Particles.Add()]; pDesc->Type = BILLBOARD_PARTICLE; pDesc->Fields.SetMasterDataSource(this); pDesc->Fields.Load(pMemFile, &BillboardParticleDesc); pDesc->Fields.Convert(&BillboardParticleDesc); DataGraph* pInitSpin = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITIALSPIN); if (pInitSpin) pInitSpin->SetNegative(true); DataGraph* pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SIZE); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SIZEINC); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITSIZE); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_GRAVITATION_K); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSX); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSY); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSZ); if (pSize) pSize->SetNegative(true); DataGraph* pMass = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_MASS); if (pMass) pMass->SetNegative(false); } //Создает Model парикл void DataSource::CreateModelParticle (array &Particles, MemFile* pMemFile) { ParticleDesc *pDesc = &Particles[Particles.Add()]; pDesc->Type = MODEL_PARTICLE; pDesc->Fields.SetMasterDataSource(this); pDesc->Fields.Load(pMemFile, &ModelParticleDesc); pDesc->Fields.Convert(&ModelParticleDesc); } void DataSource::Destroy () { for (DWORD n = 0; n < Emitters.Size(); n++) { Emitters[n].Fields.DelAll(); for (DWORD i = 0; i < Emitters[n].Particles.Size(); i++) { Emitters[n].Particles[i].Fields.DelAll(); } } Emitters.DelAll(); } int DataSource::GetEmitterCount () { return Emitters.Size(); } DataSource::EmitterDesc* DataSource::GetEmitterDesc (int Index) { return &Emitters[Index]; } FieldList* DataSource::CreateEmptyPointEmitter (const char* EmitterName) { EmitterDesc* PointEmitter = &Emitters[Emitters.Add()]; PointEmitter->Fields.SetMasterDataSource(this); PointEmitter->Fields.Convert (&PointEmitterDesc); PointEmitter->Type = POINT_EMITTER; DataString* pEmitterName = PointEmitter->Fields.FindStringByGUID(GUID_EMITTER_NAME); if (pEmitterName) { pEmitterName->SetValue(EmitterName); } DataFloat* pEmitterLifeTime = PointEmitter->Fields.FindFloatByGUID(GUID_EMITTER_LIFETIME); if (pEmitterLifeTime) { pEmitterLifeTime->SetValue(1.0f); } DataGraph* pAngleX = PointEmitter->Fields.FindGraphByGUID(GUID_EMISSION_DIR_X); if (pAngleX) pAngleX->SetNegative(true); DataGraph* pAngleY = PointEmitter->Fields.FindGraphByGUID(GUID_EMISSION_DIR_Y); if (pAngleY) pAngleY->SetNegative(true); DataGraph* pAngleZ = PointEmitter->Fields.FindGraphByGUID(GUID_EMISSION_DIR_Z); if (pAngleZ) pAngleZ->SetNegative(true); return &PointEmitter->Fields; } int DataSource::FindEmitter (const char* Name) { for (DWORD n = 0; n < Emitters.Size(); n++) { DataString* pString = Emitters[n].Fields.FindStringByGUID(GUID_EMITTER_NAME); if (pString) { if (crt_stricmp (pString->GetValue(), Name) == 0) { return n; } } } return -1; } FieldList* DataSource::CreateBillBoardParticle (const char* ParticleName, const char* EmitterName) { int EmitterIndex = FindEmitter(EmitterName); if (EmitterIndex == -1) return NULL; ParticleDesc *pDesc = &Emitters[EmitterIndex].Particles[Emitters[EmitterIndex].Particles.Add()]; pDesc->Type = BILLBOARD_PARTICLE; pDesc->Fields.SetMasterDataSource(this); pDesc->Fields.Convert(&BillboardParticleDesc); DataString* pParticleName = pDesc->Fields.FindStringByGUID(GUID_PARTICLE_NAME); if (pParticleName) pParticleName->SetValue(ParticleName); DataString* pAttachedEmitter = pDesc->Fields.FindStringByGUID(GUID_ATTACHEDEMITTER_NAME); if (pAttachedEmitter) pAttachedEmitter->SetValue("none"); DataGraph* pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITSIZE); if (pSize) { pSize->SetDefaultValue(3.0f, 2.0f); pSize->SetNegative(true); } pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_LIGHTPOWER); if (pSize) { pSize->SetDefaultValue(0.0f, 0.0f); pSize->SetNegative(false); } pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SIZE); if (pSize) { pSize->SetDefaultValue(100.0f, 100.0f); pSize->SetNegative(true); } pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_GRAVITATION_K); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SIZEINC); if (pSize) { pSize->SetDefaultValue(0.0f, 0.0f); pSize->SetNegative(true); } pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSX); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSY); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSZ); if (pSize) pSize->SetNegative(true); DataGraph* pEmissionRate = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_EMISSION_RATE); if (pEmissionRate) pEmissionRate->SetDefaultValue(10.0f, 10.0f); DataGraph* pLifeTime = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_LIFE_TIME); if (pLifeTime) pLifeTime->SetDefaultValue(10.0f, 10.0f); DataFloat* pMaxCount = pDesc->Fields.FindFloatByGUID(GUID_PARTICLE_MAX_COUNT); if (pMaxCount) pMaxCount->SetValue(100); DataColor* pColorG = pDesc->Fields.FindColorByGUID(GUID_PARTICLE_COLOR); if (pColorG) pColorG->SetDefaultValue(Color(1.0f, 1.0f, 1.0f, 1.0f)); DataGraph* pColorGMul = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_COLORMULTIPLY); if (pColorGMul) pColorGMul->SetDefaultValue(1.0f, 1.0f); DataGraph* pGravityK = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_GRAVITATION_K); if (pGravityK) pGravityK->SetDefaultValue(100.0f, 100.0f); /* DataGraph* pTrackX = pDesc->Fields.FindGraph(PARTICLE_TRACK_X); if (pTrackX) pTrackX->SetNegative(true); DataGraph* pTrackY = pDesc->Fields.FindGraph(PARTICLE_TRACK_Y); if (pTrackY) pTrackY->SetNegative(true); DataGraph* pTrackZ = pDesc->Fields.FindGraph(PARTICLE_TRACK_Z); if (pTrackZ) pTrackZ->SetNegative(true); */ DataGraph* pVelocity = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_VELOCITY_POWER); if (pVelocity) pVelocity->SetNegative(true); DataGraph* pMass = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_MASS); if (pMass) pMass->SetNegative(false); DataGraph* pSpin = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SPIN); if (pSpin) pSpin->SetNegative(true); DataGraph* pInitSpin = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITIALSPIN); if (pInitSpin) pInitSpin->SetNegative(true); return &pDesc->Fields; } FieldList* DataSource::CreateModelParticle (const char* ParticleName, const char* EmitterName) { int EmitterIndex = FindEmitter(EmitterName); if (EmitterIndex == -1) return NULL; ParticleDesc *pDesc = &Emitters[EmitterIndex].Particles[Emitters[EmitterIndex].Particles.Add()]; pDesc->Type = MODEL_PARTICLE; pDesc->Fields.SetMasterDataSource(this); pDesc->Fields.Convert(&ModelParticleDesc); DataString* pParticleName = pDesc->Fields.FindStringByGUID(GUID_PARTICLE_NAME); if (pParticleName) pParticleName->SetValue(ParticleName); DataString* pAttachedEmitter = pDesc->Fields.FindStringByGUID(GUID_ATTACHEDEMITTER_NAME); if (pAttachedEmitter) pAttachedEmitter->SetValue("none"); DataFloat* pMaxCount = pDesc->Fields.FindFloatByGUID(GUID_PARTICLE_MAX_COUNT); if (pMaxCount) pMaxCount->SetValue(100); DataGraph* pEmissionRate = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_EMISSION_RATE); if (pEmissionRate) pEmissionRate->SetDefaultValue(10.0f, 10.0f); DataGraph* pLifeTime = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_LIFE_TIME); if (pLifeTime) pLifeTime->SetDefaultValue(10.0f, 10.0f); DataGraph* pGravityK = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_GRAVITATION_K); if (pGravityK) pGravityK->SetDefaultValue(100.0f, 100.0f); /* DataGraph* pTrackX = pDesc->Fields.FindGraph(PARTICLE_TRACK_X); if (pTrackX) pTrackX->SetNegative(true); DataGraph* pTrackY = pDesc->Fields.FindGraph(PARTICLE_TRACK_Y); if (pTrackY) pTrackY->SetNegative(true); DataGraph* pTrackZ = pDesc->Fields.FindGraph(PARTICLE_TRACK_Z); if (pTrackZ) pTrackZ->SetNegative(true); */ DataGraph* pVelocity = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_VELOCITY_POWER); if (pVelocity) pVelocity->SetNegative(true); DataGraph* pMass = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_MASS); if (pMass) pMass->SetNegative(false); DataGraph* pSpinX = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SPIN_X); if (pSpinX) pSpinX->SetNegative(true); DataGraph* pSpinY = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SPIN_Y); if (pSpinY) pSpinY->SetNegative(true); DataGraph* pSpinZ = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SPIN_Z); if (pSpinZ) pSpinZ->SetNegative(true); return &pDesc->Fields; } void DataSource::DeletePointEmitter (FieldList* pEmitter) { for (DWORD n = 0; n < Emitters.Size(); n++) { if (&Emitters[n].Fields == pEmitter) { Emitters[n].Fields.DelAll(); Emitters.ExtractNoShift(n); return; } } } void DataSource::DeleteBillboard (FieldList* pEmitter, FieldList* pParticles) { for (DWORD n = 0; n < Emitters.Size(); n++) { if (&Emitters[n].Fields == pEmitter) { for (DWORD i = 0; i < Emitters[n].Particles.Size(); i++) { if (&Emitters[n].Particles[i].Fields == pParticles) { Emitters[n].Particles[i].Fields.DelAll(); Emitters[n].Particles.Extract(i); return; } } } } } void DataSource::DeleteModel (FieldList* pEmitter, FieldList* pParticles) { for (DWORD n = 0; n < Emitters.Size(); n++) { if (&Emitters[n].Fields == pEmitter) { for (DWORD i = 0; i < Emitters[n].Particles.Size(); i++) { if (&Emitters[n].Particles[i].Fields == pParticles) { Emitters[n].Particles[i].Fields.DelAll(); Emitters[n].Particles.Extract(i); return; } } } } } void DataSource::NewForceFieldRegistred() { for (dword i = 0; i < Emitters.Size(); i++) { Emitters[i].Fields.UpdateCache(); for (dword j = 0; j < Emitters[i].Particles.Size(); j++) { Emitters[i].Particles[j].Fields.UpdateCache(); } } } #ifndef _XBOX //Загрузить BillBoard партикл void DataSource::CreateBillBoardParticleXML (array &Particles, TiXmlElement* root) { ParticleDesc *pDesc = &Particles[Particles.Add()]; pDesc->Type = BILLBOARD_PARTICLE; pDesc->Fields.SetMasterDataSource(this); TiXmlElement* fieldsNode = root->FirstChildElement("Fields"); if (fieldsNode) { pDesc->Fields.LoadXML(fieldsNode, &BillboardParticleDesc); } pDesc->Fields.Convert(&BillboardParticleDesc); DataGraph* pInitSpin = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITIALSPIN); if (pInitSpin) pInitSpin->SetNegative(true); DataGraph* pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SIZE); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SIZEINC); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITSIZE); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_GRAVITATION_K); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSX); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSY); if (pSize) pSize->SetNegative(true); pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSZ); if (pSize) pSize->SetNegative(true); DataGraph* pMass = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_MASS); if (pMass) pMass->SetNegative(false); } //Загрузить Model партикл void DataSource::CreateModelParticleXML (array &Particles, TiXmlElement* root) { ParticleDesc *pDesc = &Particles[Particles.Add()]; pDesc->Type = MODEL_PARTICLE; pDesc->Fields.SetMasterDataSource(this); TiXmlElement* fieldsNode = root->FirstChildElement("Fields"); if (fieldsNode) { pDesc->Fields.LoadXML(fieldsNode, &ModelParticleDesc); } pDesc->Fields.Convert(&ModelParticleDesc); } #endif