DataSource.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841
  1. #include "datasource.h"
  2. #include "databool.h"
  3. #include "datacolor.h"
  4. #include "datafloat.h"
  5. #include "datagraph.h"
  6. #include "dataposition.h"
  7. #include "datauv.h"
  8. #include "datastring.h"
  9. #include "..\..\TextFile.h"
  10. #include "..\..\icommon\memfile.h"
  11. #include "..\..\..\common_h\core.h"
  12. #ifndef _XBOX
  13. #include "..\..\..\common_h\tinyxml\tinyxml.h"
  14. #endif
  15. #include "..\..\..\Common_h\data_swizzle.h"
  16. #define HEADER "PSYS"
  17. #define VERSION "v3.5"
  18. BEGIN_DATA_DESC(PointEmitterDesc)
  19. DATA_STRING (GUID_EMITTER_NAME, EMITTER_NAME, "Emiter name");
  20. DATA_FLOAT (GUID_EMITTER_LIFETIME, EMITTER_LIFETIME, "Emiter lifetime");
  21. DATA_POSITION (GUID_EMITTER_POSITION, EMITTER_POSITION, "Position");
  22. DATA_GRAPH (GUID_EMISSION_DIR_X, EMISSION_DIR_X, "Emission dir PITCH");
  23. DATA_GRAPH (GUID_EMISSION_DIR_Y, EMISSION_DIR_Y, "Emission dir YAW");
  24. DATA_GRAPH (GUID_EMISSION_DIR_Z, EMISSION_DIR_Z, "Emission dir ROLL");
  25. DATA_BOOL (GUID_EMITTER_LOOPING, EMITTER_LOOPING, "Looping");
  26. DATA_FLOAT (GUID_EMITTER_SIZEX, EMITTER_SIZEX, "Size X");
  27. DATA_FLOAT (GUID_EMITTER_SIZEY, EMITTER_SIZEY, "Size Y");
  28. DATA_FLOAT (GUID_EMITTER_SIZEZ, EMITTER_SIZEZ, "Size Z");
  29. END_DATA_DESC(PointEmitterDesc)
  30. BEGIN_DATA_DESC(BillboardParticleDesc)
  31. DATA_POSITION (GUID_PARTICLE_EXTERNALFORCE, PARTICLE_EXTERNALFORCE, "External force");
  32. DATA_STRING(GUID_PARTICLE_NAME, PARTICLE_NAME, "Name");
  33. DATA_GRAPH (GUID_PARTICLE_EMISSION_RATE, PARTICLE_EMISSION_RATE, "Emission rate");
  34. DATA_FLOAT (GUID_PARTICLE_MAX_COUNT, PARTICLE_MAX_COUNT, "Max Particles count");
  35. // DATA_GRAPH (PARTICLE_TRACK_X);
  36. // DATA_GRAPH (PARTICLE_TRACK_Y);
  37. // DATA_GRAPH (PARTICLE_TRACK_Z);
  38. DATA_GRAPH (GUID_PARTICLE_LIFE_TIME, PARTICLE_LIFE_TIME, "Life time");
  39. DATA_GRAPH (GUID_PARTICLE_MASS, PARTICLE_MASS, "Mass");
  40. DATA_GRAPH (GUID_PARTICLE_SPIN, PARTICLE_SPIN, "Spin");
  41. DATA_GRAPH (GUID_PARTICLE_VELOCITY_POWER, PARTICLE_VELOCITY_POWER, "Initial Velocity");
  42. DATA_GRAPH (GUID_PARTICLE_INITIALSPIN, PARTICLE_INITIALSPIN, "Initial Rotate");
  43. DATA_GRAPH (GUID_PARTICLE_SPIN_DRAG, PARTICLE_SPIN_DRAG, "Spin friction");
  44. DATA_GRAPH (GUID_PARTICLE_SIZE, PARTICLE_SIZE, "Size percent");
  45. DATA_GRAPH (GUID_PARTICLE_INITSIZE, PARTICLE_INITSIZE, "Initial Size");
  46. DATA_GRAPH (GUID_PARTICLE_ANIMFRAME, PARTICLE_ANIMFRAME, "Animation frame");
  47. DATA_COLOR (GUID_PARTICLE_COLOR, PARTICLE_COLOR, "Color");
  48. DATA_GRAPH (GUID_PARTICLE_COLORMULTIPLY, PARTICLE_COLORMULTIPLY, "Color_Multipler");
  49. DATA_UV (GUID_PARTICLE_FRAMES, PARTICLE_FRAMES, "Texture");
  50. DATA_GRAPH (GUID_PARTICLE_TRANSPARENCY, PARTICLE_TRANSPARENCY, "Transparency");
  51. DATA_GRAPH (GUID_PARTICLE_DRAG, PARTICLE_DRAG, "Friction");
  52. // DATA_GRAPH (PARTICLE_PHYSIC_BLEND);
  53. DATA_STRING (GUID_ATTACHEDEMITTER_NAME, ATTACHEDEMITTER_NAME, "Attached emiter");
  54. DATA_GRAPH (GUID_PARTICLE_GRAVITATION_K, PARTICLE_GRAVITATION_K, "Gravity strength");
  55. DATA_BOOL (GUID_PARTICLE_DIR_ORIENT, PARTICLE_DIR_ORIENT, "Direction orient");
  56. DATA_BOOL (GUID_PARTICLE_LOCAL_SYSTEM, PARTICLE_LOCAL_SYSTEM, "Animate in Local System");
  57. DATA_GRAPH (GUID_PARTICLE_ADDPOWER, PARTICLE_ADDPOWER, "Add Technique Power");
  58. DATA_STRING (GUID_FORCEFIELDS_NAME, FORCEFIELDS_NAME, "Forcefiels");
  59. DATA_GRAPH (GUID_PARTICLE_SIZE, PARTICLE_SIZE, "Size percent");
  60. DATA_GRAPH (GUID_PARTICLE_SIZEINC, PARTICLE_SIZEINC, "Size increment");
  61. DATA_GRAPH (GUID_PARTICLE_LIGHTPOWER, PARTICLE_LIGHTPOWER, "Inverse Light power");
  62. DATA_GRAPH (GUID_PARTICLE_INITPOSX, PARTICLE_INITPOSX, "Initial position X");
  63. DATA_GRAPH (GUID_PARTICLE_INITPOSY, PARTICLE_INITPOSY, "Initial position Y");
  64. DATA_GRAPH (GUID_PARTICLE_INITPOSZ, PARTICLE_INITPOSZ, "Initial position Z");
  65. DATA_BOOL (GUID_PARTICLE_DISTORTED, PARTICLE_DISTORTED, "Distorted")
  66. DATA_GRAPH (GUID_PARTICLE_DISTORTED_POWER, PARTICLE_DISTORTED_POWER, "Distorsion power in percent");
  67. DATA_BOOL (GUID_PARTICLE_ZXALIGN, PARTICLE_ZXALIGN, "XZ_Aligned")
  68. //DATA_BOOL (GUID_PARTICLE_AFFECT_AMBIENT, PARTICLE_AFFECT_AMBIENT, "Always affect ambient light")
  69. DATA_GRAPH (GUID_PARTICLE_AMBIENTPOWER, PARTICLE_AMBIENTPOWER, "Inverse Ambient power");
  70. END_DATA_DESC(BillboardParticleDesc)
  71. BEGIN_DATA_DESC(ModelParticleDesc)
  72. DATA_STRING(GUID_PARTICLE_NAME, PARTICLE_NAME, "Name");
  73. DATA_GRAPH (GUID_PARTICLE_EMISSION_RATE, PARTICLE_EMISSION_RATE, "Emission rate");
  74. DATA_FLOAT (GUID_PARTICLE_MAX_COUNT, PARTICLE_MAX_COUNT, "Max Particles count");
  75. // DATA_GRAPH (PARTICLE_TRACK_X);
  76. // DATA_GRAPH (PARTICLE_TRACK_Y);
  77. // DATA_GRAPH (PARTICLE_TRACK_Z);
  78. DATA_GRAPH (GUID_PARTICLE_LIFE_TIME, PARTICLE_LIFE_TIME, "Life time");
  79. DATA_GRAPH (GUID_PARTICLE_MASS, PARTICLE_MASS, "Mass");
  80. DATA_GRAPH (GUID_PARTICLE_SPIN_X, PARTICLE_SPIN_X, "Spin X");
  81. DATA_GRAPH (GUID_PARTICLE_SPIN_Y, PARTICLE_SPIN_Y, "Spin Y");
  82. DATA_GRAPH (GUID_PARTICLE_SPIN_Z, PARTICLE_SPIN_Z, "Spin Z");
  83. DATA_GRAPH (GUID_PARTICLE_VELOCITY_POWER, PARTICLE_VELOCITY_POWER, "Initial Velocity");
  84. DATA_GRAPH (GUID_PARTICLE_SPIN_DRAGX, PARTICLE_SPIN_DRAGX, "Spin Friction X");
  85. DATA_GRAPH (GUID_PARTICLE_SPIN_DRAGY, PARTICLE_SPIN_DRAGY, "Spin Friction Y");
  86. DATA_GRAPH (GUID_PARTICLE_SPIN_DRAGZ, PARTICLE_SPIN_DRAGZ, "Spin Friction Y");
  87. DATA_GRAPH (GUID_PARTICLE_DRAG, PARTICLE_DRAG, "Friction");
  88. // DATA_GRAPH (PARTICLE_PHYSIC_BLEND);
  89. DATA_STRING (GUID_ATTACHEDEMITTER_NAME, ATTACHEDEMITTER_NAME, "Attached emitter");
  90. DATA_GRAPH (GUID_PARTICLE_GRAVITATION_K, PARTICLE_GRAVITATION_K, "Gravity strength");
  91. DATA_STRING (GUID_PARTICLE_GEOM_NAMES, PARTICLE_GEOM_NAMES, "Model names");
  92. DATA_STRING (GUID_FORCEFIELDS_NAME, FORCEFIELDS_NAME, "Forcefiels");
  93. END_DATA_DESC(ModelParticleDesc)
  94. //---------- Создание/удаление --------------------
  95. DataSource::DataSource () : Emitters(_FL_, 1)
  96. {
  97. }
  98. DataSource::~DataSource ()
  99. {
  100. Destroy ();
  101. }
  102. bool DataSource::Release ()
  103. {
  104. delete this;
  105. return true;
  106. }
  107. // ========================= Load & Save =======================================
  108. //Сохранить/восстановить из файла
  109. void DataSource::Write (MemFile* pMemFile)
  110. {
  111. pMemFile->Write(HEADER, 4);
  112. pMemFile->Write(VERSION, 4);
  113. DWORD dwEmittersCount = Emitters.Size();
  114. pMemFile->WriteType(dwEmittersCount);
  115. for (DWORD n = 0; n < dwEmittersCount; n++)
  116. {
  117. pMemFile->WriteType(Emitters[n].Type);
  118. Emitters[n].Fields.Write(pMemFile);
  119. DWORD dwParticlesSize = Emitters[n].Particles.Size();
  120. pMemFile->WriteType(dwParticlesSize);
  121. for (DWORD i = 0; i < dwParticlesSize; i++)
  122. {
  123. pMemFile->WriteType(Emitters[n].Particles[i].Type);
  124. Emitters[n].Particles[i].Fields.Write(pMemFile);
  125. }
  126. }
  127. }
  128. #ifndef _XBOX
  129. void DataSource::WriteXML (TextFile* xmlFile, dword level)
  130. {
  131. xmlFile->Write(level, "<Particles>\n");
  132. DWORD dwEmittersCount = Emitters.Size();
  133. for (DWORD n = 0; n < dwEmittersCount; n++)
  134. {
  135. xmlFile->Write((level+1), "<Emitter val = \"POINT_EMITTER\">\n");
  136. Emitters[n].Fields.WriteXML(xmlFile, (level+1));
  137. DWORD dwParticlesSize = Emitters[n].Particles.Size();
  138. for (DWORD i = 0; i < dwParticlesSize; i++)
  139. {
  140. switch (Emitters[n].Particles[i].Type)
  141. {
  142. case BILLBOARD_PARTICLE:
  143. xmlFile->Write((level+2), "<Particle val = \"BILLBOARD_PARTICLE\">\n");
  144. break;
  145. case MODEL_PARTICLE:
  146. xmlFile->Write((level+2), "<Particle val = \"MODEL_PARTICLE\">\n");
  147. break;
  148. }
  149. Emitters[n].Particles[i].Fields.WriteXML(xmlFile, (level+2));
  150. xmlFile->Write((level+2), "</Particle>\n");
  151. }
  152. xmlFile->Write((level+1), "</Emitter>\n");
  153. }
  154. xmlFile->Write(level, "</Particles>\n");
  155. /*
  156. pMemFile->Write(HEADER, 4);
  157. pMemFile->Write(VERSION, 4);
  158. DWORD dwEmittersCount = Emitters.Size();
  159. pMemFile->WriteType(dwEmittersCount);
  160. for (DWORD n = 0; n < dwEmittersCount; n++)
  161. {
  162. pMemFile->WriteType(Emitters[n].Type);
  163. Emitters[n].Fields.Write(pMemFile);
  164. DWORD dwParticlesSize = Emitters[n].Particles.Size();
  165. pMemFile->WriteType(dwParticlesSize);
  166. for (DWORD i = 0; i < dwParticlesSize; i++)
  167. {
  168. pMemFile->WriteType(Emitters[n].Particles[i].Type);
  169. Emitters[n].Particles[i].Fields.Write(pMemFile);
  170. }
  171. }
  172. */
  173. }
  174. void DataSource::LoadXML (TiXmlDocument* xmlFile)
  175. {
  176. TiXmlElement* rootNode = xmlFile->FirstChildElement( "Particles" );
  177. if (!rootNode)
  178. {
  179. api->Trace ("XML Particles: Incorrect file type");
  180. return;
  181. }
  182. for(TiXmlElement* child = rootNode->FirstChildElement(); child; child = child->NextSiblingElement())
  183. {
  184. string NodeName = child->Value();
  185. string NodeVal = child->Attribute("val");
  186. if (NodeName == "Emitter" && NodeVal == "POINT_EMITTER")
  187. {
  188. CreatePointEmitterXML (child);
  189. }
  190. }
  191. }
  192. #endif
  193. void DataSource::Load (MemFile* pMemFile)
  194. {
  195. //Проверяем ID
  196. char Id[5];
  197. Id[4] = 0;
  198. pMemFile->Read(Id, 4);
  199. if (strcmp (Id, HEADER) != 0)
  200. {
  201. api->Trace ("Particles: Incorrect file type");
  202. return;
  203. }
  204. //Проверяем Версию
  205. char Ver[5];
  206. Ver[4] = 0;
  207. pMemFile->Read(Ver, 4);
  208. /* // show warnings
  209. if (strcmp (Ver, VERSION) != 0)
  210. api->Trace ("Particles: Warning !!! Incorrect file version %s, must be %s", Ver, VERSION);
  211. */
  212. //Кол-во эмиттеров...
  213. dword EmiterCount = 0;
  214. pMemFile->ReadType(EmiterCount);
  215. XSwizzleDWord(EmiterCount);
  216. Emitters.Reserve(EmiterCount);
  217. for (DWORD n = 0; n < EmiterCount; n++)
  218. {
  219. EmitterType emType = UNKNOWN_EMITTER;
  220. pMemFile->ReadType(emType);
  221. emType = (EmitterType)SwizzleDWord(emType);
  222. switch (emType)
  223. {
  224. case POINT_EMITTER:
  225. {
  226. // api->Trace ("Particles info: Point emitter");
  227. CreatePointEmitter (pMemFile);
  228. break;
  229. }
  230. default:
  231. {
  232. throw ("Particles: Unknown emitter type !");
  233. return;
  234. }
  235. } // switch
  236. } // for all saved emitters...
  237. }
  238. #ifndef _XBOX
  239. void DataSource::CreatePointEmitterXML (TiXmlElement* root)
  240. {
  241. EmitterDesc* PointEmitter = &Emitters[Emitters.Add()];
  242. PointEmitter->Fields.SetMasterDataSource(this);
  243. PointEmitter->Type = POINT_EMITTER;
  244. for(TiXmlElement* child = root->FirstChildElement(); child; child = child->NextSiblingElement())
  245. {
  246. string NodeName = child->Value();
  247. string NodeVal = child->Attribute("val");
  248. if (NodeName == "Fields")
  249. {
  250. PointEmitter->Fields.LoadXML(child, &PointEmitterDesc);
  251. PointEmitter->Fields.Convert (&PointEmitterDesc);
  252. }
  253. if (NodeName == "Particle" && NodeVal == "BILLBOARD_PARTICLE")
  254. {
  255. CreateBillBoardParticleXML (PointEmitter->Particles, child);
  256. }
  257. if (NodeName == "Particle" && NodeVal == "MODEL_PARTICLE")
  258. {
  259. CreateModelParticleXML (PointEmitter->Particles, child);
  260. }
  261. }
  262. }
  263. #endif
  264. void DataSource::CreatePointEmitter (MemFile* pMemFile)
  265. {
  266. //api->Trace ("Particles info: Point emitter");
  267. EmitterDesc* PointEmitter = &Emitters[Emitters.Add()];
  268. PointEmitter->Fields.SetMasterDataSource(this);
  269. PointEmitter->Fields.Load(pMemFile, &PointEmitterDesc);
  270. PointEmitter->Fields.Convert (&PointEmitterDesc);
  271. PointEmitter->Type = POINT_EMITTER;
  272. dword ParticlesCount = 0;
  273. pMemFile->ReadType(ParticlesCount);
  274. XSwizzleDWord(ParticlesCount);
  275. PointEmitter->Particles.Reserve(ParticlesCount);
  276. for (DWORD n = 0; n < ParticlesCount; n++)
  277. {
  278. ParticleType ptType = UNKNOWN_PARTICLE;
  279. pMemFile->ReadType(ptType);
  280. ptType = (ParticleType)SwizzleDWord(ptType);
  281. switch(ptType)
  282. {
  283. case BILLBOARD_PARTICLE:
  284. {
  285. //api->Trace ("Particles info: Billboard particle");
  286. CreateBillBoardParticle (PointEmitter->Particles, pMemFile);
  287. break;
  288. }
  289. case MODEL_PARTICLE:
  290. {
  291. //api->Trace ("Particles info: Model particle");
  292. CreateModelParticle (PointEmitter->Particles, pMemFile);
  293. break;
  294. }
  295. default:
  296. {
  297. throw ("Particles: Unknown particle type !!!!");
  298. }
  299. } // SWITCH
  300. } // For all particles
  301. }
  302. //Создает BillBoard парикл
  303. void DataSource::CreateBillBoardParticle (array<ParticleDesc> &Particles, MemFile* pMemFile)
  304. {
  305. ParticleDesc *pDesc = &Particles[Particles.Add()];
  306. pDesc->Type = BILLBOARD_PARTICLE;
  307. pDesc->Fields.SetMasterDataSource(this);
  308. pDesc->Fields.Load(pMemFile, &BillboardParticleDesc);
  309. pDesc->Fields.Convert(&BillboardParticleDesc);
  310. DataGraph* pInitSpin = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITIALSPIN);
  311. if (pInitSpin) pInitSpin->SetNegative(true);
  312. DataGraph* pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SIZE);
  313. if (pSize) pSize->SetNegative(true);
  314. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SIZEINC);
  315. if (pSize) pSize->SetNegative(true);
  316. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITSIZE);
  317. if (pSize) pSize->SetNegative(true);
  318. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_GRAVITATION_K);
  319. if (pSize) pSize->SetNegative(true);
  320. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSX);
  321. if (pSize) pSize->SetNegative(true);
  322. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSY);
  323. if (pSize) pSize->SetNegative(true);
  324. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSZ);
  325. if (pSize) pSize->SetNegative(true);
  326. DataGraph* pMass = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_MASS);
  327. if (pMass) pMass->SetNegative(false);
  328. }
  329. //Создает Model парикл
  330. void DataSource::CreateModelParticle (array<ParticleDesc> &Particles, MemFile* pMemFile)
  331. {
  332. ParticleDesc *pDesc = &Particles[Particles.Add()];
  333. pDesc->Type = MODEL_PARTICLE;
  334. pDesc->Fields.SetMasterDataSource(this);
  335. pDesc->Fields.Load(pMemFile, &ModelParticleDesc);
  336. pDesc->Fields.Convert(&ModelParticleDesc);
  337. }
  338. void DataSource::Destroy ()
  339. {
  340. for (DWORD n = 0; n < Emitters.Size(); n++)
  341. {
  342. Emitters[n].Fields.DelAll();
  343. for (DWORD i = 0; i < Emitters[n].Particles.Size(); i++)
  344. {
  345. Emitters[n].Particles[i].Fields.DelAll();
  346. }
  347. }
  348. Emitters.DelAll();
  349. }
  350. int DataSource::GetEmitterCount ()
  351. {
  352. return Emitters.Size();
  353. }
  354. DataSource::EmitterDesc* DataSource::GetEmitterDesc (int Index)
  355. {
  356. return &Emitters[Index];
  357. }
  358. FieldList* DataSource::CreateEmptyPointEmitter (const char* EmitterName)
  359. {
  360. EmitterDesc* PointEmitter = &Emitters[Emitters.Add()];
  361. PointEmitter->Fields.SetMasterDataSource(this);
  362. PointEmitter->Fields.Convert (&PointEmitterDesc);
  363. PointEmitter->Type = POINT_EMITTER;
  364. DataString* pEmitterName = PointEmitter->Fields.FindStringByGUID(GUID_EMITTER_NAME);
  365. if (pEmitterName)
  366. {
  367. pEmitterName->SetValue(EmitterName);
  368. }
  369. DataFloat* pEmitterLifeTime = PointEmitter->Fields.FindFloatByGUID(GUID_EMITTER_LIFETIME);
  370. if (pEmitterLifeTime)
  371. {
  372. pEmitterLifeTime->SetValue(1.0f);
  373. }
  374. DataGraph* pAngleX = PointEmitter->Fields.FindGraphByGUID(GUID_EMISSION_DIR_X);
  375. if (pAngleX) pAngleX->SetNegative(true);
  376. DataGraph* pAngleY = PointEmitter->Fields.FindGraphByGUID(GUID_EMISSION_DIR_Y);
  377. if (pAngleY) pAngleY->SetNegative(true);
  378. DataGraph* pAngleZ = PointEmitter->Fields.FindGraphByGUID(GUID_EMISSION_DIR_Z);
  379. if (pAngleZ) pAngleZ->SetNegative(true);
  380. return &PointEmitter->Fields;
  381. }
  382. int DataSource::FindEmitter (const char* Name)
  383. {
  384. for (DWORD n = 0; n < Emitters.Size(); n++)
  385. {
  386. DataString* pString = Emitters[n].Fields.FindStringByGUID(GUID_EMITTER_NAME);
  387. if (pString)
  388. {
  389. if (crt_stricmp (pString->GetValue(), Name) == 0)
  390. {
  391. return n;
  392. }
  393. }
  394. }
  395. return -1;
  396. }
  397. FieldList* DataSource::CreateBillBoardParticle (const char* ParticleName, const char* EmitterName)
  398. {
  399. int EmitterIndex = FindEmitter(EmitterName);
  400. if (EmitterIndex == -1) return NULL;
  401. ParticleDesc *pDesc = &Emitters[EmitterIndex].Particles[Emitters[EmitterIndex].Particles.Add()];
  402. pDesc->Type = BILLBOARD_PARTICLE;
  403. pDesc->Fields.SetMasterDataSource(this);
  404. pDesc->Fields.Convert(&BillboardParticleDesc);
  405. DataString* pParticleName = pDesc->Fields.FindStringByGUID(GUID_PARTICLE_NAME);
  406. if (pParticleName) pParticleName->SetValue(ParticleName);
  407. DataString* pAttachedEmitter = pDesc->Fields.FindStringByGUID(GUID_ATTACHEDEMITTER_NAME);
  408. if (pAttachedEmitter) pAttachedEmitter->SetValue("none");
  409. DataGraph* pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITSIZE);
  410. if (pSize)
  411. {
  412. pSize->SetDefaultValue(3.0f, 2.0f);
  413. pSize->SetNegative(true);
  414. }
  415. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_LIGHTPOWER);
  416. if (pSize)
  417. {
  418. pSize->SetDefaultValue(0.0f, 0.0f);
  419. pSize->SetNegative(false);
  420. }
  421. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SIZE);
  422. if (pSize)
  423. {
  424. pSize->SetDefaultValue(100.0f, 100.0f);
  425. pSize->SetNegative(true);
  426. }
  427. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_GRAVITATION_K);
  428. if (pSize) pSize->SetNegative(true);
  429. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SIZEINC);
  430. if (pSize)
  431. {
  432. pSize->SetDefaultValue(0.0f, 0.0f);
  433. pSize->SetNegative(true);
  434. }
  435. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSX);
  436. if (pSize) pSize->SetNegative(true);
  437. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSY);
  438. if (pSize) pSize->SetNegative(true);
  439. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSZ);
  440. if (pSize) pSize->SetNegative(true);
  441. DataGraph* pEmissionRate = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_EMISSION_RATE);
  442. if (pEmissionRate) pEmissionRate->SetDefaultValue(10.0f, 10.0f);
  443. DataGraph* pLifeTime = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_LIFE_TIME);
  444. if (pLifeTime) pLifeTime->SetDefaultValue(10.0f, 10.0f);
  445. DataFloat* pMaxCount = pDesc->Fields.FindFloatByGUID(GUID_PARTICLE_MAX_COUNT);
  446. if (pMaxCount) pMaxCount->SetValue(100);
  447. DataColor* pColorG = pDesc->Fields.FindColorByGUID(GUID_PARTICLE_COLOR);
  448. if (pColorG) pColorG->SetDefaultValue(Color(1.0f, 1.0f, 1.0f, 1.0f));
  449. DataGraph* pColorGMul = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_COLORMULTIPLY);
  450. if (pColorGMul) pColorGMul->SetDefaultValue(1.0f, 1.0f);
  451. DataGraph* pGravityK = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_GRAVITATION_K);
  452. if (pGravityK) pGravityK->SetDefaultValue(100.0f, 100.0f);
  453. /*
  454. DataGraph* pTrackX = pDesc->Fields.FindGraph(PARTICLE_TRACK_X);
  455. if (pTrackX) pTrackX->SetNegative(true);
  456. DataGraph* pTrackY = pDesc->Fields.FindGraph(PARTICLE_TRACK_Y);
  457. if (pTrackY) pTrackY->SetNegative(true);
  458. DataGraph* pTrackZ = pDesc->Fields.FindGraph(PARTICLE_TRACK_Z);
  459. if (pTrackZ) pTrackZ->SetNegative(true);
  460. */
  461. DataGraph* pVelocity = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_VELOCITY_POWER);
  462. if (pVelocity) pVelocity->SetNegative(true);
  463. DataGraph* pMass = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_MASS);
  464. if (pMass) pMass->SetNegative(false);
  465. DataGraph* pSpin = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SPIN);
  466. if (pSpin) pSpin->SetNegative(true);
  467. DataGraph* pInitSpin = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITIALSPIN);
  468. if (pInitSpin) pInitSpin->SetNegative(true);
  469. return &pDesc->Fields;
  470. }
  471. FieldList* DataSource::CreateModelParticle (const char* ParticleName, const char* EmitterName)
  472. {
  473. int EmitterIndex = FindEmitter(EmitterName);
  474. if (EmitterIndex == -1) return NULL;
  475. ParticleDesc *pDesc = &Emitters[EmitterIndex].Particles[Emitters[EmitterIndex].Particles.Add()];
  476. pDesc->Type = MODEL_PARTICLE;
  477. pDesc->Fields.SetMasterDataSource(this);
  478. pDesc->Fields.Convert(&ModelParticleDesc);
  479. DataString* pParticleName = pDesc->Fields.FindStringByGUID(GUID_PARTICLE_NAME);
  480. if (pParticleName) pParticleName->SetValue(ParticleName);
  481. DataString* pAttachedEmitter = pDesc->Fields.FindStringByGUID(GUID_ATTACHEDEMITTER_NAME);
  482. if (pAttachedEmitter) pAttachedEmitter->SetValue("none");
  483. DataFloat* pMaxCount = pDesc->Fields.FindFloatByGUID(GUID_PARTICLE_MAX_COUNT);
  484. if (pMaxCount) pMaxCount->SetValue(100);
  485. DataGraph* pEmissionRate = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_EMISSION_RATE);
  486. if (pEmissionRate) pEmissionRate->SetDefaultValue(10.0f, 10.0f);
  487. DataGraph* pLifeTime = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_LIFE_TIME);
  488. if (pLifeTime) pLifeTime->SetDefaultValue(10.0f, 10.0f);
  489. DataGraph* pGravityK = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_GRAVITATION_K);
  490. if (pGravityK) pGravityK->SetDefaultValue(100.0f, 100.0f);
  491. /*
  492. DataGraph* pTrackX = pDesc->Fields.FindGraph(PARTICLE_TRACK_X);
  493. if (pTrackX) pTrackX->SetNegative(true);
  494. DataGraph* pTrackY = pDesc->Fields.FindGraph(PARTICLE_TRACK_Y);
  495. if (pTrackY) pTrackY->SetNegative(true);
  496. DataGraph* pTrackZ = pDesc->Fields.FindGraph(PARTICLE_TRACK_Z);
  497. if (pTrackZ) pTrackZ->SetNegative(true);
  498. */
  499. DataGraph* pVelocity = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_VELOCITY_POWER);
  500. if (pVelocity) pVelocity->SetNegative(true);
  501. DataGraph* pMass = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_MASS);
  502. if (pMass) pMass->SetNegative(false);
  503. DataGraph* pSpinX = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SPIN_X);
  504. if (pSpinX) pSpinX->SetNegative(true);
  505. DataGraph* pSpinY = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SPIN_Y);
  506. if (pSpinY) pSpinY->SetNegative(true);
  507. DataGraph* pSpinZ = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SPIN_Z);
  508. if (pSpinZ) pSpinZ->SetNegative(true);
  509. return &pDesc->Fields;
  510. }
  511. void DataSource::DeletePointEmitter (FieldList* pEmitter)
  512. {
  513. for (DWORD n = 0; n < Emitters.Size(); n++)
  514. {
  515. if (&Emitters[n].Fields == pEmitter)
  516. {
  517. Emitters[n].Fields.DelAll();
  518. Emitters.ExtractNoShift(n);
  519. return;
  520. }
  521. }
  522. }
  523. void DataSource::DeleteBillboard (FieldList* pEmitter, FieldList* pParticles)
  524. {
  525. for (DWORD n = 0; n < Emitters.Size(); n++)
  526. {
  527. if (&Emitters[n].Fields == pEmitter)
  528. {
  529. for (DWORD i = 0; i < Emitters[n].Particles.Size(); i++)
  530. {
  531. if (&Emitters[n].Particles[i].Fields == pParticles)
  532. {
  533. Emitters[n].Particles[i].Fields.DelAll();
  534. Emitters[n].Particles.Extract(i);
  535. return;
  536. }
  537. }
  538. }
  539. }
  540. }
  541. void DataSource::DeleteModel (FieldList* pEmitter, FieldList* pParticles)
  542. {
  543. for (DWORD n = 0; n < Emitters.Size(); n++)
  544. {
  545. if (&Emitters[n].Fields == pEmitter)
  546. {
  547. for (DWORD i = 0; i < Emitters[n].Particles.Size(); i++)
  548. {
  549. if (&Emitters[n].Particles[i].Fields == pParticles)
  550. {
  551. Emitters[n].Particles[i].Fields.DelAll();
  552. Emitters[n].Particles.Extract(i);
  553. return;
  554. }
  555. }
  556. }
  557. }
  558. }
  559. void DataSource::NewForceFieldRegistred()
  560. {
  561. for (dword i = 0; i < Emitters.Size(); i++)
  562. {
  563. Emitters[i].Fields.UpdateCache();
  564. for (dword j = 0; j < Emitters[i].Particles.Size(); j++)
  565. {
  566. Emitters[i].Particles[j].Fields.UpdateCache();
  567. }
  568. }
  569. }
  570. #ifndef _XBOX
  571. //Загрузить BillBoard партикл
  572. void DataSource::CreateBillBoardParticleXML (array<ParticleDesc> &Particles, TiXmlElement* root)
  573. {
  574. ParticleDesc *pDesc = &Particles[Particles.Add()];
  575. pDesc->Type = BILLBOARD_PARTICLE;
  576. pDesc->Fields.SetMasterDataSource(this);
  577. TiXmlElement* fieldsNode = root->FirstChildElement("Fields");
  578. if (fieldsNode)
  579. {
  580. pDesc->Fields.LoadXML(fieldsNode, &BillboardParticleDesc);
  581. }
  582. pDesc->Fields.Convert(&BillboardParticleDesc);
  583. DataGraph* pInitSpin = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITIALSPIN);
  584. if (pInitSpin) pInitSpin->SetNegative(true);
  585. DataGraph* pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SIZE);
  586. if (pSize) pSize->SetNegative(true);
  587. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_SIZEINC);
  588. if (pSize) pSize->SetNegative(true);
  589. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITSIZE);
  590. if (pSize) pSize->SetNegative(true);
  591. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_GRAVITATION_K);
  592. if (pSize) pSize->SetNegative(true);
  593. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSX);
  594. if (pSize) pSize->SetNegative(true);
  595. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSY);
  596. if (pSize) pSize->SetNegative(true);
  597. pSize = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_INITPOSZ);
  598. if (pSize) pSize->SetNegative(true);
  599. DataGraph* pMass = pDesc->Fields.FindGraphByGUID(GUID_PARTICLE_MASS);
  600. if (pMass) pMass->SetNegative(false);
  601. }
  602. //Загрузить Model партикл
  603. void DataSource::CreateModelParticleXML (array<ParticleDesc> &Particles, TiXmlElement* root)
  604. {
  605. ParticleDesc *pDesc = &Particles[Particles.Add()];
  606. pDesc->Type = MODEL_PARTICLE;
  607. pDesc->Fields.SetMasterDataSource(this);
  608. TiXmlElement* fieldsNode = root->FirstChildElement("Fields");
  609. if (fieldsNode)
  610. {
  611. pDesc->Fields.LoadXML(fieldsNode, &ModelParticleDesc);
  612. }
  613. pDesc->Fields.Convert(&ModelParticleDesc);
  614. }
  615. #endif