RParticleSystem.cpp 91 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464
  1. //
  2. // RParticleSystem.cpp
  3. // cocos2d_libs
  4. //
  5. // Created by 徐俊杰 on 2020/4/25.
  6. //
  7. #include "rparticle/RParticleSystem.h"
  8. #include "rparticle/Utilities/Transform.h"
  9. #include "rparticle/ParticleSystemRenderer.h"
  10. #include "rparticle/Modules/CollisionModule.h"
  11. #include "rparticle/Modules/RotationModule.h"
  12. #include "rparticle/Modules/RotationByVelocityModule.h"
  13. #include "rparticle/Modules/SubModule.h"
  14. #include "rparticle/Modules/SubEmitterModule.h"
  15. #include "rparticle/Modules/ExternalForcesModule.h"
  16. #include "rparticle/Modules/EmissionModule.h"
  17. #include "rparticle/Modules/ForceModule.h"
  18. #include "rparticle/Modules/VelocityModule.h"
  19. #include "rparticle/Modules/ClampVelocityModule.h"
  20. #include "rparticle/Modules/SizeModule.h"
  21. #include "rparticle/Modules/ColorModule.h"
  22. #include "rparticle/Modules/UVModule.h"
  23. #include "rparticle/Modules/SizeByVelocityModule.h"
  24. #include "rparticle/Modules/ColorByVelocityModule.h"
  25. #include "rparticle/Modules/CollisionModule.h"
  26. #include "rparticle/Macros/RParticleGlobalStuff.h"
  27. #include "rparticle/Serialize/TransferFunctions/JsonRead.h"
  28. #include "platform/CCFileUtils.h"
  29. #include "base/ccUTF8.h"
  30. #include "rparticle/Math/Gradient.h"
  31. #include "renderer/CCRenderer.h"
  32. #include "renderer/CCGLProgramState.h"
  33. #include "renderer/ccGLStateCache.h"
  34. #include "rparticle/Serialize/TransferFunctions/SerializeTransfer.h"
  35. #include "2d/CCSpriteFrame.h"
  36. #include "2d/CCSpriteFrameCache.h"
  37. #if REDREAM_EDITOR
  38. #include "2d/CCDrawNode3D.h"
  39. #endif
  40. using namespace cocos2d;
  41. NS_RRP_BEGIN
  42. struct ParticleSystemManager
  43. {
  44. ParticleSystemManager()
  45. :needSync(false)
  46. {
  47. activeEmitters.reserve(32);
  48. Director::getInstance()->getScheduler()->schedule([](float dt) {
  49. RParticleSystem::BeginUpdateAll();
  50. RParticleSystem::EndUpdateAll();
  51. }, this, 0, false, "ParticleSystemManager_update");
  52. }
  53. dynamic_array<RParticleSystem*> activeEmitters;
  54. bool needSync;
  55. };
  56. ParticleSystemManager gParticleSystemManager;
  57. #define MAX_TIME_STEP (0.03f)
  58. static float GetTimeStep(float dt, bool fixedTimeStep)
  59. {
  60. if(fixedTimeStep){
  61. return Director::getInstance()->getDeltaTime();
  62. }
  63. else if(dt > MAX_TIME_STEP){
  64. return dt / Ceilf(dt / MAX_TIME_STEP);
  65. }
  66. else
  67. return dt;
  68. }
  69. static void ApplyStartDelay (float& delayT, float& accumulatedDt)
  70. {
  71. if(delayT > 0.0f)
  72. {
  73. delayT -= accumulatedDt;
  74. accumulatedDt = MAX(-delayT, 0.0f);
  75. delayT = MAX(delayT, 0.0f);
  76. }
  77. DebugAssert(delayT >= 0.0f);
  78. }
  79. RParticleSystem* RParticleSystem::create() {
  80. RParticleSystem * ret = new (std::nothrow) RParticleSystem();
  81. if (ret && ret->init()) {
  82. ret->autorelease();
  83. } else {
  84. CC_SAFE_DELETE(ret);
  85. }
  86. return ret;
  87. }
  88. RParticleSystem::RParticleSystem()
  89. : _useMaterialFile(false)
  90. , _quads(nullptr)
  91. , _quadCount(0)
  92. , _opacityModifyRGB(false)
  93. {
  94. m_EmittersIndex = -1;
  95. m_State = new ParticleSystemState (this);
  96. m_ReadOnlyState = new ParticleSystemReadOnlyState ();
  97. m_SizeModule = new SizeModule ();
  98. m_RotationModule = new RotationModule ();
  99. m_ColorModule = new ColorModule ();
  100. m_UVModule = new UVModule ();
  101. m_VelocityModule = new VelocityModule ();
  102. m_ForceModule = new ForceModule ();
  103. m_ExternalForcesModule = new ExternalForcesModule ();
  104. m_ClampVelocityModule = new ClampVelocityModule ();
  105. m_SizeBySpeedModule = new SizeBySpeedModule ();
  106. m_RotationBySpeedModule = new RotationBySpeedModule ();
  107. m_ColorBySpeedModule = new ColorBySpeedModule();
  108. m_CollisionModule = new CollisionModule ();
  109. m_SubModule = new SubModule ();
  110. m_SubEmitterModule = new SubEmitterModule ();
  111. m_renderer = new ParticleSystemRenderer();
  112. }
  113. RParticleSystem::~RParticleSystem() {
  114. delete m_State;
  115. delete m_ReadOnlyState;
  116. delete m_SizeModule;
  117. delete m_RotationModule;
  118. delete m_ColorModule;
  119. delete m_UVModule;
  120. delete m_VelocityModule;
  121. delete m_ForceModule;
  122. delete m_ExternalForcesModule;
  123. delete m_ClampVelocityModule;
  124. delete m_SizeBySpeedModule;
  125. delete m_RotationBySpeedModule;
  126. delete m_ColorBySpeedModule;
  127. delete m_CollisionModule;
  128. delete m_SubModule;
  129. delete m_SubEmitterModule;
  130. delete m_renderer;
  131. CC_SAFE_FREE(_quads);
  132. }
  133. float RParticleSystem::GetLengthInSec () const
  134. {
  135. Assert (m_State);
  136. return m_ReadOnlyState->lengthInSec;
  137. }
  138. bool RParticleSystem::CheckSupportsProcedural(const RParticleSystem& system)
  139. {
  140. ParticleSystemRenderer* renderer = (ParticleSystemRenderer*)const_cast<RParticleSystem&>(system).getComponent(COMPONENT_PS_RENDERER);
  141. if(renderer && (renderer->GetRenderMode() == kSRMStretch3D))
  142. return false;
  143. return system.m_State->supportsProcedural && !system.m_State->invalidateProcedural;
  144. }
  145. void RParticleSystem::Stop ()
  146. {
  147. Assert (m_State);
  148. m_State->needRestart = true;
  149. m_State->stopEmitting = true;
  150. }
  151. bool RParticleSystem::init()
  152. {
  153. if (!Node::init()) return false;
  154. m_renderer->Reset();
  155. return true;
  156. }
  157. void RParticleSystem::AwakeFromLoad()
  158. {
  159. m_InitialModule.AwakeFromLoad(this, *m_ReadOnlyState);
  160. m_ShapeModule.AwakeFromLoad(this, *m_ReadOnlyState);
  161. // if (!isVisible() () || (kDefaultAwakeFromLoad == awakeMode))
  162. if (!IsActive())
  163. return;
  164. // m_State->localToWorld = GetComponent (Transform).GetLocalToWorldMatrixNoScale();
  165. m_State->localToWorld = Transform::GetLocalToWorldMatrixNoScale(this);
  166. Matrix4x4f::Invert_General3D(m_State->localToWorld, m_State->worldToLocal);
  167. m_State->maxSize = 0.0f;
  168. m_State->invalidateProcedural = false;
  169. // if (IsWorldPlaying () && m_ReadOnlyState->playOnAwake)
  170. if (m_ReadOnlyState->playOnAwake)
  171. Play ();
  172. // Does this even happen?
  173. if(GetParticleCount() || IsPlaying())
  174. AddToManager();
  175. }
  176. RParticleSystem* RParticleSystem::FindGroupRoot()
  177. {
  178. auto root = this;
  179. while (RParticleSystem *p = dynamic_cast<RParticleSystem*>(root->getParent())) {
  180. root = p;
  181. }
  182. return root;
  183. }
  184. void RParticleSystem::AwakeFromLoadTree()
  185. {
  186. if (!isVisible()) {
  187. return;
  188. }
  189. AwakeFromLoad();
  190. for (auto child : getChildren()) {
  191. auto childParticle = dynamic_cast<RParticleSystem*>(child);
  192. if (childParticle) {
  193. childParticle->AwakeFromLoad();
  194. }
  195. }
  196. }
  197. void RParticleSystem::PlayTree()
  198. {
  199. Play();
  200. for (auto child : getChildren()) {
  201. auto childParticle = dynamic_cast<RParticleSystem*>(child);
  202. if (childParticle) {
  203. childParticle->PlayTree();
  204. }
  205. }
  206. }
  207. void RParticleSystem::StopTree()
  208. {
  209. Stop();
  210. for (auto child : getChildren()) {
  211. auto childParticle = dynamic_cast<RParticleSystem*>(child);
  212. if (childParticle) {
  213. childParticle->StopTree();
  214. }
  215. }
  216. }
  217. void RParticleSystem::ClearTree()
  218. {
  219. Clear();
  220. for (auto child : getChildren()) {
  221. auto childParticle = dynamic_cast<RParticleSystem*>(child);
  222. if (childParticle) {
  223. childParticle->ClearTree();
  224. }
  225. }
  226. }
  227. void RParticleSystem::StopAndClearTree()
  228. {
  229. Stop();
  230. Clear();
  231. for (auto child : getChildren()) {
  232. auto childParticle = dynamic_cast<RParticleSystem*>(child);
  233. if (childParticle) {
  234. childParticle->StopAndClearTree();
  235. }
  236. }
  237. }
  238. //void RParticleSystem::WalkTree(std::function<void(RParticleSystem*)> func)
  239. //{
  240. // func(this);
  241. // for (auto child : getChildren()) {
  242. // auto childParticle = dynamic_cast<RParticleSystem*>(child);
  243. // if (childParticle) {
  244. // childParticle->WalkTree(func);
  245. // }
  246. // }
  247. //}
  248. void RParticleSystem::BeginUpdateAll(){
  249. //cocos2dx update 传进来一个dt 赋值deltaTime
  250. float deltaTime = Director::getInstance()->getDeltaTime();
  251. // 活跃状态监测
  252. for(int i = 0; i < gParticleSystemManager.activeEmitters.size(); i++)
  253. {
  254. RParticleSystem& system = *gParticleSystemManager.activeEmitters[i];
  255. if (!system.IsActive ())
  256. {
  257. //AssertStringObject( "UpdateParticle system should not happen on disabled vGO", &system);
  258. system.RemoveFromManager();
  259. continue;
  260. }
  261. #if ENABLE_MULTITHREADED_PARTICLES
  262. system.m_State->recordSubEmits = true;
  263. #else
  264. system.m_State->recordSubEmits = false;
  265. #endif
  266. // 更新部分粒子属性,子发射器属性
  267. Update0 (system, *system.m_ReadOnlyState, *system.m_State, deltaTime, false);
  268. }
  269. gParticleSystemManager.needSync = true;
  270. // make sure ray budgets are assigned for the frame
  271. // 将光线预算分配给将进行光线投射的每个系统
  272. //ParticleSystem::AssignRayBudgets();
  273. #if ENABLE_MULTITHREADED_PARTICLES
  274. //多线程先留白
  275. #else
  276. for(int i = 0; i < gParticleSystemManager.activeEmitters.size(); i++)
  277. {
  278. //printf_console("BeginUpdateAll [%d]:\n",i);
  279. RParticleSystem& system = *gParticleSystemManager.activeEmitters[i];
  280. // 发射粒子等
  281. system.Update1 (system, system.GetParticles((int)RParticleSystem::kParticleBuffer0), deltaTime, false, false);
  282. }
  283. #endif
  284. }
  285. void RParticleSystem::SyncJobs()
  286. {
  287. if(gParticleSystemManager.needSync)
  288. {
  289. #if ENABLE_MULTITHREADED_PARTICLES
  290. #endif
  291. const float deltaTimeEpsilon = 0.0001f;
  292. //TODO ? 需要传进来一个时间
  293. float deltaTime = Director::getInstance()->getDeltaTime();
  294. if(deltaTime < deltaTimeEpsilon)
  295. return;
  296. for(int i = 0; i < gParticleSystemManager.activeEmitters.size(); ++i)
  297. {
  298. RParticleSystem& system = *gParticleSystemManager.activeEmitters[i];
  299. ParticleSystemState& state = *system.m_State;
  300. system.Update2 (system, *system.m_ReadOnlyState, state, false);
  301. }
  302. gParticleSystemManager.needSync = false;
  303. }
  304. }
  305. void RParticleSystem::EndUpdateAll(){
  306. SyncJobs();
  307. // messages
  308. // 发送事件
  309. for (int i = 0; i < gParticleSystemManager.activeEmitters.size(); ++i)
  310. {
  311. RParticleSystem& system = *gParticleSystemManager.activeEmitters[i];
  312. if (!system.IsActive ())
  313. continue;
  314. // if (!system.m_CollisionModule->GetUsesCollisionMessages ())
  315. // continue;
  316. ParticleSystemParticles& ps = system.GetParticles((int)RParticleSystem::kParticleBuffer0);
  317. //TODO ??物理碰撞暂缺
  318. //ps.collisionEvents.SwapCollisionEventArrays ();
  319. //ps.collisionEvents.SendCollisionEvents (system);
  320. }
  321. // Remove emitters that are finished (no longer emitting)
  322. // 清理粒子
  323. for(int i = 0; i < gParticleSystemManager.activeEmitters.size();)
  324. {
  325. RParticleSystem& system = *gParticleSystemManager.activeEmitters[i];
  326. ParticleSystemState& state = *system.m_State;
  327. const size_t particleCount = system.GetParticleCount();
  328. if ((particleCount == 0) && state.playing && state.stopEmitting)
  329. {
  330. // collision subemitters may not have needRestart==true when being restarted
  331. // from a paused state
  332. //Assert (state.needRestart);
  333. state.playing = false;
  334. system.RemoveFromManager();
  335. continue;
  336. }
  337. i++;
  338. }
  339. }
  340. void RParticleSystem::AddToManager()
  341. {
  342. // 不可重复加入
  343. if(m_EmittersIndex >= 0)
  344. return;
  345. size_t index = gParticleSystemManager.activeEmitters.size();
  346. gParticleSystemManager.activeEmitters.push_back(this);
  347. m_EmittersIndex = (int)index;
  348. }
  349. void RParticleSystem::RemoveFromManager()
  350. {
  351. if(m_EmittersIndex < 0)
  352. return;
  353. const int index = m_EmittersIndex;
  354. gParticleSystemManager.activeEmitters[index]->m_EmittersIndex = -1;
  355. gParticleSystemManager.activeEmitters[index] = gParticleSystemManager.activeEmitters.back();
  356. if(gParticleSystemManager.activeEmitters[index] != this) // corner case
  357. gParticleSystemManager.activeEmitters[index]->m_EmittersIndex = index;
  358. gParticleSystemManager.activeEmitters.resize_uninitialized(gParticleSystemManager.activeEmitters.size() - 1);
  359. }
  360. ParticleSystemParticles& RParticleSystem::GetParticles (int index)
  361. {
  362. return m_Particles[kParticleBuffer0];
  363. }
  364. size_t RParticleSystem::GetParticleCount () const
  365. {
  366. return m_Particles[kParticleBuffer0].array_size();
  367. }
  368. void RParticleSystem::AddStagingBuffer(RParticleSystem& system)
  369. {
  370. if(0 == system.m_ParticlesStaging.array_size())
  371. return;
  372. bool needsAxisOfRotation = system.m_Particles[kParticleBuffer0].usesAxisOfRotation;
  373. bool needsEmitAccumulator = system.m_Particles[kParticleBuffer0].numEmitAccumulators > 0;
  374. //ASSERT_RUNNING_ON_MAIN_THREAD;
  375. const int numParticles = (int)system.m_Particles[kParticleBuffer0].array_size();
  376. const int numStaging = (int)system.m_ParticlesStaging.array_size();
  377. system.m_Particles->array_resize(numParticles + numStaging);
  378. system.m_Particles->array_merge_preallocated(system.m_ParticlesStaging, numParticles, needsAxisOfRotation, needsEmitAccumulator);
  379. system.m_ParticlesStaging.array_resize(0);
  380. }
  381. void RParticleSystem::SetUsesRotationalSpeed()
  382. {
  383. ParticleSystemParticles& ps0 = m_Particles[kParticleBuffer0];
  384. if(!ps0.usesRotationalSpeed)
  385. ps0.SetUsesRotationalSpeed ();
  386. ParticleSystemParticles& pss = m_ParticlesStaging;
  387. if(!pss.usesRotationalSpeed)
  388. pss.SetUsesRotationalSpeed ();
  389. }
  390. void RParticleSystem::SetUsesEmitAccumulator(int numAccumulators)
  391. {
  392. m_Particles[kParticleBuffer0].SetUsesEmitAccumulator (numAccumulators);
  393. m_ParticlesStaging.SetUsesEmitAccumulator (numAccumulators);
  394. }
  395. // pointRect should be in Texture coordinates, not pixel coordinates
  396. void RParticleSystem::initTexCoordsWithRect(const Rect& pointRect, bool isRotaed, const Vec2& offset, const Vec2& originalSize)
  397. {
  398. _vertexInfo = RRP_PARTICLEQUAD_VERTEX_INFO::Create(_texture, pointRect, isRotaed, offset, originalSize);
  399. }
  400. void RParticleSystem::setTextureInternal(cocos2d::Texture2D* texture)
  401. {
  402. if (_texture != texture) {
  403. _texture = texture;
  404. if(_texture && _glProgramState == nullptr)
  405. {
  406. setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP, texture));
  407. }
  408. updateBlendFunc();
  409. m_UVModule->SetFrameDirty();
  410. }
  411. }
  412. void RParticleSystem::setTextureWithRect(Texture2D *texture, const Rect& rect, bool isRotaed, const Vec2& offset, const Vec2& originalSize)
  413. {
  414. if( !_texture || texture->getName() != _texture->getName() )
  415. {
  416. setTextureInternal(texture);
  417. }
  418. if (_useMaterialFile) return;
  419. _isSpriteFrame = (isRotaed
  420. || !rect.origin.isZero()
  421. || !offset.isZero()
  422. || !CompareApproximately(originalSize.x, originalSize.y)
  423. || !(CompareApproximately(rect.size.width, originalSize.x) && CompareApproximately(rect.size.height, originalSize.y))
  424. );
  425. this->initTexCoordsWithRect(rect, isRotaed, offset, originalSize);
  426. }
  427. bool RParticleSystem::GetLoop () const
  428. {
  429. Assert (m_State);
  430. return m_ReadOnlyState->looping;
  431. }
  432. int RParticleSystem::SetupSubEmitters(RParticleSystem& shuriken, ParticleSystemState& state)
  433. {
  434. Assert(!state.cachedSubDataBirth && !state.numCachedSubDataBirth);
  435. Assert(!state.cachedSubDataCollision && !state.numCachedSubDataCollision);
  436. Assert(!state.cachedSubDataDeath && !state.numCachedSubDataDeath);
  437. int subEmitterCount = 0;
  438. std::vector<RParticleSystem*> subEmittersBirth;
  439. std::vector<RParticleSystem*> subEmittersCollision;
  440. std::vector<RParticleSystem*> subEmittersDeath;
  441. shuriken.m_SubModule->SetEnabled(false);
  442. auto children = shuriken.getChildren();
  443. for (auto child : children) {
  444. if (!child->isVisible()) continue;
  445. auto childEmitter = dynamic_cast<RParticleSystem*>(child);
  446. if (childEmitter != nullptr && childEmitter->m_SubEmitterModule->GetEnabled()) {
  447. shuriken.m_SubModule->SetEnabled(true);
  448. switch (childEmitter->m_SubEmitterModule->GetSubEmitterType()) {
  449. case kParticleSystemSubTypeBirth:
  450. subEmittersBirth.push_back(childEmitter);
  451. break;
  452. case kParticleSystemSubTypeCollision:
  453. subEmittersCollision.push_back(childEmitter);
  454. break;
  455. case kParticleSystemSubTypeDeath:
  456. subEmittersDeath.push_back(childEmitter);
  457. break;
  458. }
  459. }
  460. }
  461. if(shuriken.m_SubModule->GetEnabled())
  462. {
  463. //RParticleSystem* subEmittersBirth[kParticleSystemMaxSubBirth];
  464. //state.numCachedSubDataBirth = shuriken.m_SubModule->GetSubEmitterPtrsBirth(&subEmittersBirth[0]);
  465. state.numCachedSubDataBirth = subEmittersBirth.size();
  466. state.cachedSubDataBirth = ALLOC_TEMP_MANUAL(ParticleSystemSubEmitterData, state.numCachedSubDataBirth);
  467. std::uninitialized_fill (state.cachedSubDataBirth, state.cachedSubDataBirth + state.numCachedSubDataBirth, ParticleSystemSubEmitterData());
  468. for(int i = 0; i < state.numCachedSubDataBirth; i++)
  469. {
  470. RParticleSystem* subEmitter = subEmittersBirth[i];
  471. ParticleSystemSubEmitterData& subData = state.cachedSubDataBirth[i];
  472. subData.startDelayInSec = subEmitter->m_ReadOnlyState->startDelay;
  473. subData.lengthInSec = subEmitter->GetLoop() ? std::numeric_limits<float>::max() : subEmitter->GetLengthInSec();
  474. subData.maxLifetime = subEmitter->m_InitialModule.GetLifeTimeCurve().GetScalar();
  475. subData.properties = subEmitter->m_SubEmitterModule->GetProperties();
  476. subData.emitter = subEmitter;
  477. subEmitter->m_EmissionModule.GetEmissionDataCopy(&subData.emissionData);
  478. subEmitter->m_State->SetIsSubEmitter(true);
  479. subEmitterCount++;
  480. }
  481. //RParticleSystem* subEmittersCollision[kParticleSystemMaxSubCollision];
  482. //state.numCachedSubDataCollision = shuriken.m_SubModule->GetSubEmitterPtrsCollision(&subEmittersCollision[0]);
  483. state.numCachedSubDataCollision = subEmittersCollision.size();
  484. state.cachedSubDataCollision = ALLOC_TEMP_MANUAL(ParticleSystemSubEmitterData, state.numCachedSubDataCollision);
  485. std::uninitialized_fill (state.cachedSubDataCollision, state.cachedSubDataCollision + state.numCachedSubDataCollision, ParticleSystemSubEmitterData());
  486. for(int i = 0; i < state.numCachedSubDataCollision; i++)
  487. {
  488. RParticleSystem* subEmitter = subEmittersCollision[i];
  489. ParticleSystemSubEmitterData& subData = state.cachedSubDataCollision[i];
  490. subData.properties = subEmitter->m_SubEmitterModule->GetProperties();
  491. subData.emitter = subEmitter;
  492. subEmitter->m_EmissionModule.GetEmissionDataCopy(&subData.emissionData);
  493. subEmitter->m_State->SetIsSubEmitter(true);
  494. subEmitterCount++;
  495. }
  496. //RParticleSystem* subEmittersDeath[kParticleSystemMaxSubDeath];
  497. //state.numCachedSubDataDeath = shuriken.m_SubModule->GetSubEmitterPtrsDeath(&subEmittersDeath[0]);
  498. state.numCachedSubDataDeath = subEmittersDeath.size();
  499. state.cachedSubDataDeath = ALLOC_TEMP_MANUAL(ParticleSystemSubEmitterData, state.numCachedSubDataDeath);
  500. std::uninitialized_fill (state.cachedSubDataDeath, state.cachedSubDataDeath + state.numCachedSubDataDeath, ParticleSystemSubEmitterData());
  501. for(int i = 0; i < state.numCachedSubDataDeath; i++)
  502. {
  503. RParticleSystem* subEmitter = subEmittersDeath[i];
  504. ParticleSystemSubEmitterData& subData = state.cachedSubDataDeath[i];
  505. subData.properties = subEmitter->m_SubEmitterModule->GetProperties();
  506. subData.emitter = subEmitter;
  507. subEmitter->m_EmissionModule.GetEmissionDataCopy(&subData.emissionData);
  508. subEmitter->m_State->SetIsSubEmitter(true);
  509. subEmitterCount++;
  510. }
  511. }
  512. return subEmitterCount;
  513. }
  514. void RParticleSystem::SetUsesAxisOfRotation(){
  515. }
  516. bool RParticleSystem::GetIsDistanceEmitter() const
  517. {
  518. return (EmissionModule::kEmissionTypeDistance == m_EmissionModule.GetEmissionDataRef().type);
  519. }
  520. void RParticleSystem::Update0 (RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, float dt, bool fixedTimeStep){
  521. //system.scale
  522. //const Transform& transform = system.GetComponent (Transform);
  523. Vector3f oldPosition = state.localToWorld.GetPosition();
  524. // 设置位置
  525. state.localToWorld = Transform::GetLocalToWorldMatrixNoScale(&system);
  526. Matrix4x4f::Invert_General3D(state.localToWorld, state.worldToLocal);
  527. //此处unity会根据版本判断是worldScale or LocalScale
  528. state.emitterScale = Transform::GetWorldScaleLossy(&system) * (roState.GetRenderScale());
  529. // 设置速度
  530. if (state.playing && (dt > 0.0001f))
  531. {
  532. const Vector3f position = Transform::GetPosition(&system);
  533. // 速度计算,根据节点的信息
  534. if (roState.useLocalSpace)
  535. state.emitterVelocity = Vec3(0, 0, 0);
  536. else
  537. state.emitterVelocity = (position - oldPosition) / dt;
  538. }
  539. // 内存管理?
  540. AddStagingBuffer(system);
  541. //ParticleSystemRenderer* renderer = (ParticleSystemRenderer*)system.getComponent(COMPONENT_PS_RENDERER);
  542. //todo : renderer fun
  543. //if(renderer && !renderer->GetScreenSpaceRotation())
  544. //ParticleSystemRenderer::SetUsesAxisOfRotationRec(system, true);
  545. // 旋转速度
  546. if(system.m_RotationModule->GetEnabled() || system.m_RotationBySpeedModule->GetEnabled())
  547. system.SetUsesRotationalSpeed();
  548. /*
  549. int subEmitterBirthTypeCount = system.m_SubModule->GetSubEmitterTypeCount(kParticleSystemSubTypeBirth);
  550. // 设置子发射器累加器
  551. if(system.m_SubModule->GetEnabled() && subEmitterBirthTypeCount)
  552. system.SetUsesEmitAccumulator (subEmitterBirthTypeCount);
  553. */
  554. // 子发射器设置
  555. int subEmitterCount = SetupSubEmitters(system, *system.m_State);
  556. // 设置子发射器累加器
  557. size_t subEmitterBirthTypeCount = system.m_State->numCachedSubDataBirth;
  558. if(system.m_SubModule->GetEnabled() && subEmitterBirthTypeCount)
  559. system.SetUsesEmitAccumulator (subEmitterBirthTypeCount);
  560. #if ENABLE_MULTITHREADED_PARTICLES
  561. //todo 多线程
  562. #endif
  563. // 碰撞处理
  564. if(system.m_CollisionModule->GetEnabled())
  565. system.m_CollisionModule->AllocateAndCache(roState, state);
  566. // 外部力处理
  567. if(system.m_ExternalForcesModule->GetEnabled())
  568. system.m_ExternalForcesModule->AllocateAndCache(roState, state);
  569. }
  570. void RParticleSystem::Update1 (RParticleSystem& system, ParticleSystemParticles& ps, float dt, bool fixedTimeStep, bool useProcedural, int rayBudget){
  571. //todo : what's gParticleSystemJobProfile ?
  572. //PROFILER_AUTO(gParticleSystemJobProfile, NULL)
  573. const ParticleSystemReadOnlyState& roState = *system.m_ReadOnlyState;
  574. ParticleSystemState& state = *system.m_State;
  575. state.rayBudget = rayBudget;
  576. // Exposed through script
  577. dt *= std::max<float> (roState.speed, 0.0f);
  578. float timeStep = GetTimeStep(dt, fixedTimeStep);
  579. if(timeStep < 0.00001f){
  580. return;
  581. }
  582. if (state.playing)
  583. {
  584. state.accumulatedDt += dt;
  585. if(system.GetIsDistanceEmitter())
  586. {
  587. float t = state.t + state.accumulatedDt;
  588. const float length = roState.lengthInSec;
  589. t = roState.looping ? fmodf(t, length) : MIN(t, length);
  590. size_t numContinuous = 0;
  591. size_t amountOfParticlesToEmit = system.EmitFromModules (system, roState, state.emissionState, numContinuous, state.emitterVelocity, state.t, t, dt);
  592. // 发射粒子
  593. StartParticles(system, ps, state.t, t, dt, numContinuous, amountOfParticlesToEmit, 0.0f);
  594. }
  595. // 更新新增的粒子
  596. Update1Incremental(system, roState, state, ps, 0, timeStep, useProcedural);
  597. if (useProcedural)// 更新回放粒子
  598. UpdateProcedural(system, roState, state, ps);
  599. }
  600. // 更新边界
  601. UpdateBounds(system, ps, state);
  602. }
  603. void RParticleSystem::Update2 (RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, bool fixedTimeStep){
  604. if(state.subEmitterCommandBuffer.commandCount > 0){
  605. PlaybackSubEmitterCommandBuffer(system, state, fixedTimeStep);
  606. }
  607. state.ClearSubEmitterCommandBuffer();
  608. CollisionModule::FreeCache(state);
  609. ExternalForcesModule::FreeCache(state);
  610. AddStagingBuffer(system);
  611. //
  612. // Update renderer
  613. ParticleSystemRenderer* renderer = (ParticleSystemRenderer*)system.getComponent(COMPONENT_PS_RENDERER);
  614. if (renderer)
  615. {
  616. MinMaxAABB result;
  617. //ParticleSystemRenderer::CombineBoundsRec(system, result, true);
  618. //renderer->Update (result);
  619. }
  620. }
  621. void RParticleSystem::PlaybackSubEmitterCommandBuffer(const RParticleSystem& parent, ParticleSystemState& state, bool fixedTimeStep)
  622. {
  623. /*
  624. RParticleSystem* subEmittersBirth[kParticleSystemMaxSubBirth];
  625. RParticleSystem* subEmittersCollision[kParticleSystemMaxSubCollision];
  626. RParticleSystem* subEmittersDeath[kParticleSystemMaxSubDeath];
  627. int numBirth = parent.m_SubModule->GetSubEmitterPtrsBirth(&subEmittersBirth[0]);
  628. int numCollision = parent.m_SubModule->GetSubEmitterPtrsCollision(&subEmittersCollision[0]);
  629. int numDeath = parent.m_SubModule->GetSubEmitterPtrsDeath(&subEmittersDeath[0]);
  630. */
  631. std::vector<RParticleSystem*> subEmittersBirth;
  632. std::vector<RParticleSystem*> subEmittersCollision;
  633. std::vector<RParticleSystem*> subEmittersDeath;
  634. auto children = parent.getChildren();
  635. for (auto child : children) {
  636. auto childEmitter = dynamic_cast<RParticleSystem*>(child);
  637. if (childEmitter != nullptr && childEmitter->m_SubEmitterModule->GetEnabled()) {
  638. switch (childEmitter->m_SubEmitterModule->GetSubEmitterType()) {
  639. case kParticleSystemSubTypeBirth:
  640. subEmittersBirth.push_back(childEmitter);
  641. break;
  642. case kParticleSystemSubTypeCollision:
  643. subEmittersCollision.push_back(childEmitter);
  644. break;
  645. case kParticleSystemSubTypeDeath:
  646. subEmittersDeath.push_back(childEmitter);
  647. break;
  648. }
  649. }
  650. }
  651. auto numBirth = subEmittersBirth.size();
  652. auto numCollision = subEmittersCollision.size();
  653. auto numDeath = subEmittersDeath.size();
  654. const int numCommands = state.subEmitterCommandBuffer.commandCount;
  655. const SubEmitterEmitCommand* commands = state.subEmitterCommandBuffer.commands;
  656. for(int i = 0; i < numCommands; i++)
  657. {
  658. const SubEmitterEmitCommand& command = commands[i];
  659. RParticleSystem* shuriken = NULL;
  660. if(command.subEmitterType == kParticleSystemSubTypeBirth){
  661. shuriken = (command.subEmitterIndex < numBirth) ? subEmittersBirth[command.subEmitterIndex] : NULL;
  662. }
  663. else if(command.subEmitterType == kParticleSystemSubTypeCollision){
  664. shuriken = (command.subEmitterIndex < numCollision) ? subEmittersCollision[command.subEmitterIndex] : NULL;
  665. }
  666. else if(command.subEmitterType == kParticleSystemSubTypeDeath){
  667. shuriken = (command.subEmitterIndex < numDeath) ? subEmittersDeath[command.subEmitterIndex] : NULL;
  668. }
  669. else{
  670. Assert(!"PlaybackSubEmitterCommandBuffer: Sub emitter type not implemented");
  671. }
  672. DebugAssert(shuriken && "Y U NO HERE ANYMORE?");
  673. if(!shuriken){
  674. continue;
  675. }
  676. RParticleSystem::Emit(*shuriken, command, kParticleSystemEMDirect);
  677. }
  678. state.subEmitterCommandBuffer.commandCount = 0;
  679. }
  680. // Returns true if update loop is executed at least once
  681. // 更新粒子
  682. void RParticleSystem::Update1Incremental(RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, ParticleSystemParticles& ps, size_t fromIndex, float dt, bool useProcedural)
  683. {
  684. ApplyStartDelay (state.delayT, state.accumulatedDt);
  685. int numTimeSteps = 0;
  686. const int numTimeStepsTotal = int(state.accumulatedDt / dt);
  687. while (state.accumulatedDt >= dt)
  688. {
  689. const float prevT = state.t;
  690. state.Tick (roState, dt);
  691. const float t = state.t;
  692. const bool timePassedDuration = t >= (roState.lengthInSec);
  693. const float frameOffset = float(numTimeStepsTotal - 1 - numTimeSteps);
  694. if(!roState.looping && timePassedDuration){
  695. system.Stop();
  696. }
  697. // Update simulation
  698. if (!useProcedural){
  699. // 更新粒子的模块
  700. UpdateModulesIncremental(system, roState, state, ps, fromIndex, dt);
  701. }
  702. else{
  703. for (int i=0;i<state.emitReplay.size();i++)
  704. state.emitReplay[i].aliveTime += dt;
  705. }
  706. // Emission
  707. bool emit = !system.GetIsDistanceEmitter() && !state.stopEmitting;
  708. if(emit)
  709. {
  710. size_t numContinuous = 0;
  711. size_t amountOfParticlesToEmit = system.EmitFromModules (system, roState, state.emissionState, numContinuous, state.emitterVelocity, prevT, t, dt);
  712. if(useProcedural)
  713. StartParticlesProcedural(system, ps, prevT, t, dt, numContinuous, amountOfParticlesToEmit, frameOffset);
  714. else
  715. StartParticles(system, ps, prevT, t, dt, numContinuous, amountOfParticlesToEmit, frameOffset);
  716. }
  717. state.accumulatedDt -= dt;
  718. AddStagingBuffer(system);
  719. // Workaround for external forces being dependent on AABB (need to update it before the next time step)
  720. // 更新区域
  721. if(!useProcedural && (state.accumulatedDt >= dt) && system.m_ExternalForcesModule->GetEnabled()){
  722. UpdateBounds(system, ps, state);
  723. }
  724. numTimeSteps++;
  725. }
  726. }
  727. size_t RParticleSystem::EmitFromData (const ParticleSystemReadOnlyState& roState, ParticleSystemEmissionState& emissionState, size_t& numContinuous, const ParticleSystemEmissionData& emissionData, const Vector3f velocity, float fromT, float toT, float dt, float length)
  728. {
  729. size_t amountOfParticlesToEmit = 0;
  730. EmissionModule::Emit(roState, emissionState, amountOfParticlesToEmit, numContinuous, emissionData, velocity, fromT, toT, dt, length);
  731. return amountOfParticlesToEmit;
  732. }
  733. size_t RParticleSystem::EmitFromModules (const RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemEmissionState& emissionState, size_t& numContinuous, const Vector3f velocity, float fromT, float toT, float dt)
  734. {
  735. if(system.m_EmissionModule.GetEnabled())
  736. return EmitFromData(roState, emissionState, numContinuous, system.m_EmissionModule.GetEmissionDataRef(), velocity, fromT, toT, dt, roState.lengthInSec);
  737. return 0;
  738. }
  739. void RParticleSystem::KeepUpdating()
  740. {
  741. if (IsActive())
  742. {
  743. // Ensure added particles will update, but stop emission
  744. m_State->playing = true;
  745. m_State->stopEmitting = true;
  746. AddToManager();
  747. }
  748. }
  749. inline Vector3f LerpV(const Vector3f& from, const Vector3f& to, float t) { return to * t + from * (1.0F - t); }
  750. void RParticleSystem::Emit(RParticleSystem& system, const SubEmitterEmitCommand& command, ParticleSystemEmitMode emitMode)
  751. {
  752. int amountOfParticlesToEmit = command.particlesToEmit;
  753. if (amountOfParticlesToEmit > 0)
  754. {
  755. ParticleSystemState& state = *system.m_State;
  756. const ParticleSystemReadOnlyState& roState = *system.m_ReadOnlyState;
  757. const int numContinuous = command.particlesToEmitContinuous;
  758. const float deltaTime = command.deltaTime;
  759. float parentT = command.parentT;
  760. Vector3f position = command.position;
  761. Vector3f initialVelocity = command.velocity;
  762. Matrix3x3f rotMat;
  763. Vector3f normalizedVelocity = NormalizeSafe(initialVelocity);
  764. float angle = Abs(Dot(normalizedVelocity, Vector3f::UNIT_Z));
  765. Vector3f up = LerpV(Vector3f::UNIT_Z, Vector3f::UNIT_Y, angle);
  766. if (!LookRotationToMatrix(normalizedVelocity, up, &rotMat)){
  767. rotMat.SetIdentity();
  768. }
  769. Matrix4x4f parentParticleMatrix;
  770. converterMatrix(parentParticleMatrix,rotMat);
  771. parentParticleMatrix.SetPosition(position);
  772. // Transform into local space of sub emitter
  773. Matrix4x4f concatMatrix;
  774. if(roState.useLocalSpace){
  775. MultiplyMatrices3x4(state.worldToLocal, parentParticleMatrix, concatMatrix);
  776. }else{
  777. concatMatrix = parentParticleMatrix;
  778. }
  779. if(roState.useLocalSpace){
  780. initialVelocity = state.worldToLocal.MultiplyVector3(initialVelocity);
  781. }
  782. DebugAssert(state.GetIsSubEmitter());
  783. DebugAssert(state.stopEmitting);
  784. const float commandAliveTime = command.timeAlive;
  785. const float timeStep = GetTimeStep(commandAliveTime, true);
  786. // @TODO: Perform culling: if max lifetime < timeAlive, then just skip emit
  787. // Perform sub emitter loop
  788. if(roState.looping){
  789. parentT = fmodf(parentT, roState.lengthInSec);
  790. }
  791. ParticleSystemParticles& particles = (kParticleSystemEMDirect == emitMode) ? system.m_Particles[kParticleBuffer0] : system.m_ParticlesStaging;
  792. system.m_InitialModule.SetInheritedParams(command.inheritValues);
  793. size_t fromIndex = system.AddNewParticles(particles, amountOfParticlesToEmit);
  794. StartModules (system, roState, state, command.emissionState, initialVelocity, concatMatrix, particles, fromIndex, deltaTime, parentT, numContinuous, 0.0f);
  795. system.m_InitialModule.SetInheritedParams(SubEmitterInheritValues());
  796. // Make sure particles get updated
  797. if(0 == fromIndex){
  798. system.KeepUpdating();
  799. }
  800. // Update incremental
  801. if(timeStep > 0.0001f)
  802. {
  803. float accumulatedDt = commandAliveTime;
  804. while (accumulatedDt >= timeStep)
  805. {
  806. accumulatedDt -= timeStep;
  807. UpdateModulesIncremental(system, roState, state, particles, fromIndex, timeStep);
  808. }
  809. }
  810. }
  811. }
  812. // 发射粒子
  813. void RParticleSystem::StartParticles(RParticleSystem& system, ParticleSystemParticles& ps, const float prevT, const float t, const float dt, const size_t numContinuous, size_t amountOfParticlesToEmit, float frameOffset)
  814. {
  815. if (amountOfParticlesToEmit <= 0)
  816. return;
  817. const ParticleSystemReadOnlyState& roState = *system.m_ReadOnlyState;
  818. ParticleSystemState& state = *system.m_State;
  819. size_t fromIndex = system.AddNewParticles(ps, amountOfParticlesToEmit);
  820. const Matrix4x4f localToWorld = !roState.useLocalSpace ? state.localToWorld : Matrix4x4f::IDENTITY;
  821. StartModules (system, roState, state, state.emissionState, state.emitterVelocity, localToWorld, ps, fromIndex, dt, t, numContinuous, frameOffset);
  822. }
  823. // 启动所有模块
  824. void RParticleSystem::StartModules (RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, const ParticleSystemEmissionState& emissionState, Vector3f initialVelocity, const Matrix4x4f& matrix, ParticleSystemParticles& ps, size_t fromIndex, float dt, float t, size_t numContinuous, float frameOffset)
  825. {
  826. system.m_InitialModule.Start (roState, state, ps, matrix, fromIndex, t);
  827. if(system.m_ShapeModule.GetEnabled())
  828. system.m_ShapeModule.Start (roState, state, ps, matrix, fromIndex, t);
  829. DebugAssert(roState.lengthInSec > 0.0001f);
  830. const float normalizedT = t / roState.lengthInSec;
  831. DebugAssert (normalizedT >= 0.0f);
  832. DebugAssert (normalizedT <= 1.0f);
  833. size_t count = ps.array_size();
  834. const Vector3f velocityOffset = system.m_InitialModule.GetInheritVelocity() * initialVelocity;
  835. for(size_t q = fromIndex; q < count; q++)
  836. {
  837. const float randomValue = GenerateRandom(ps.randomSeed[q] + kParticleSystemStartSpeedCurveId);
  838. ps.velocity[q] *= Evaluate (system.m_InitialModule.GetSpeedCurve(), normalizedT, randomValue) * roState.GetRenderScale();
  839. ps.velocity[q] += velocityOffset;
  840. }
  841. // 单个粒子的属性
  842. for(size_t q = fromIndex; q < count; ) // array size changes
  843. {
  844. // subFrameOffset allows particles to be spawned at increasing times, thus spacing particles within a single frame.
  845. // For example if you spawn particles with high velocity you will get a continous streaming instead of a clump of particles.
  846. const int particleIndex = q - fromIndex;
  847. float subFrameOffset = (particleIndex < numContinuous) ? (float(particleIndex) + emissionState.m_ToEmitAccumulator) * emissionState.m_ParticleSpacing : 0.0f;
  848. DebugAssert(subFrameOffset >= -0.01f);
  849. DebugAssert(subFrameOffset <= 1.5f); // Not 1 due to possibly really bad precision
  850. subFrameOffset = clamp01(subFrameOffset);
  851. // Update from curves and apply forces etc.
  852. UpdateModulesPreSimulationIncremental (system, roState, state, ps, q, q+1, subFrameOffset * dt);
  853. // Position change due to where the emitter was at time of emission
  854. ps.position[q] -= initialVelocity * (frameOffset + subFrameOffset) * dt;
  855. // Position, rotation and energy change due to how much the particle has travelled since time of emission
  856. // @TODO: Call Simulate instead?
  857. ps.lifetime[q] -= subFrameOffset * dt;
  858. if((ps.lifetime[q] < 0.0f) && (count > 0))
  859. {
  860. KillParticle(roState, state, ps, q, count);
  861. continue;
  862. }
  863. ps.position[q] += (ps.velocity[q] + ps.animatedVelocity[q]) * subFrameOffset * dt;
  864. if(ps.usesRotationalSpeed){
  865. ps.rotation[q] += ps.rotationalSpeed[q] * subFrameOffset * dt;
  866. }
  867. if(system.m_SubModule->GetEnabled()){
  868. system.m_SubModule->Update (roState, state, ps, q, q+1, subFrameOffset * dt);
  869. }
  870. ++q;
  871. }
  872. ps.array_resize(count);
  873. }
  874. // 更新所有带曲线的属性和外部力
  875. void RParticleSystem::UpdateModulesPreSimulationIncremental (const RParticleSystem& system, const ParticleSystemReadOnlyState& roState, const ParticleSystemState& state, ParticleSystemParticles& particles, const size_t fromIndex, const size_t toIndex, float dt)
  876. {
  877. const size_t count = particles.array_size();
  878. system.m_InitialModule.Update (roState, state, particles, fromIndex, toIndex, dt);
  879. if(system.m_RotationModule->GetEnabled())
  880. system.m_RotationModule->Update (roState, state, particles, fromIndex, toIndex);
  881. if(system.m_VelocityModule->GetEnabled())
  882. system.m_VelocityModule->Update (roState, state, particles, fromIndex, toIndex);
  883. if(system.m_ForceModule->GetEnabled())
  884. system.m_ForceModule->Update (roState, state, particles, fromIndex, toIndex, dt);
  885. if(system.m_ExternalForcesModule->GetEnabled())
  886. system.m_ExternalForcesModule->Update (roState, state, particles, fromIndex, toIndex, dt);
  887. if(system.m_ClampVelocityModule->GetEnabled())
  888. system.m_ClampVelocityModule->Update (roState, state, particles, fromIndex, toIndex, dt);
  889. if(system.m_RotationBySpeedModule->GetEnabled())
  890. system.m_RotationBySpeedModule->Update (roState, state, particles, fromIndex, toIndex);
  891. Assert(count >= toIndex);
  892. Assert(particles.array_size() == count);
  893. }
  894. void RParticleSystem::UpdateModulesIncremental (const RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, ParticleSystemParticles& particles, size_t fromIndex, float dt)
  895. {
  896. // 更新曲线和外部力
  897. UpdateModulesPreSimulationIncremental (system, roState, state, particles, fromIndex, particles.array_size(), dt);
  898. // 更新位置和旋转
  899. SimulateParticles(roState, state, particles, fromIndex, dt);
  900. // 更新子模块和外部力
  901. UpdateModulesPostSimulationIncremental (system, roState, state, particles, fromIndex, dt);
  902. }
  903. // 更新位置和旋转
  904. void RParticleSystem::SimulateParticles (const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, ParticleSystemParticles& ps, const size_t fromIndex, float dt)
  905. {
  906. size_t particleCount = ps.array_size();
  907. for (size_t q = fromIndex; q < particleCount; )
  908. {
  909. ps.lifetime[q] -= dt;
  910. #if UNITY_EDITOR
  911. if(ParticleSystemEditor::GetIsExtraInterpolationStep())
  912. {
  913. ps.lifetime[q] = max(ps.lifetime[q], 0.0f);
  914. }
  915. else
  916. #endif
  917. if (ps.lifetime[q] < 0)
  918. {
  919. KillParticle(roState, state, ps, q, particleCount);
  920. continue;
  921. }
  922. ++q;
  923. }
  924. ps.array_resize(particleCount);
  925. for (size_t q = fromIndex; q < particleCount; ++q)
  926. ps.position[q] += (ps.velocity[q] + ps.animatedVelocity[q]) * dt;
  927. if(ps.usesRotationalSpeed)
  928. for (size_t q = fromIndex; q < particleCount; ++q)
  929. ps.rotation[q] += ps.rotationalSpeed[q] * dt;
  930. }
  931. // 更新子模块和外部力
  932. void RParticleSystem::UpdateModulesPostSimulationIncremental (const RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, ParticleSystemParticles& particles, const size_t fromIndex, float dt)
  933. {
  934. const size_t count = particles.array_size();
  935. if(system.m_SubModule->GetEnabled()){
  936. system.m_SubModule->Update (roState, state, particles, fromIndex, particles.array_size(), dt);
  937. }
  938. Assert(count == particles.array_size());
  939. if(system.m_CollisionModule->GetEnabled())
  940. {
  941. //#if !ENABLE_MULTITHREADED_PARTICLES
  942. // PROFILER_AUTO(gParticleSystemUpdateCollisions, NULL)
  943. //#endif
  944. //system.m_CollisionModule->Update (roState, state, particles, fromIndex, dt);
  945. }
  946. }
  947. void RParticleSystem::StartParticlesProcedural(RParticleSystem& system, ParticleSystemParticles& ps, const float prevT, const float t, const float dt, const size_t numContinuous, size_t amountOfParticlesToEmit, float frameOffset)
  948. {
  949. //DebugAssert(CheckSupportsProcedural(system));
  950. ParticleSystemState& state = *system.m_State;
  951. int numParticlesRecorded = 0;
  952. for (int i=0;i<state.emitReplay.size();i++)
  953. numParticlesRecorded += state.emitReplay[i].particlesToEmit;
  954. float emissionOffset = state.emissionState.m_ToEmitAccumulator;
  955. float emissionGap = state.emissionState.m_ParticleSpacing * dt;
  956. amountOfParticlesToEmit = system.LimitParticleCount(numParticlesRecorded + amountOfParticlesToEmit) - numParticlesRecorded;
  957. if (amountOfParticlesToEmit > 0)
  958. {
  959. UInt32 randomSeed = 0;
  960. #if UNITY_EDITOR
  961. ParticleSystemEditor::UpdateRandomSeed(system);
  962. randomSeed = ParticleSystemEditor::GetRandomSeed(system);
  963. #endif
  964. state.emitReplay.push_back(ParticleSystemEmitReplay(t, amountOfParticlesToEmit, emissionOffset, emissionGap, numContinuous, randomSeed));
  965. }
  966. }
  967. void RParticleSystem::UpdateProcedural (RParticleSystem& system, const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, ParticleSystemParticles& ps)
  968. {
  969. DebugAssert(CheckSupportsProcedural(system));
  970. // Clear all particles
  971. ps.array_resize(0);
  972. const Matrix4x4f localToWorld = !roState.useLocalSpace ? state.localToWorld : Matrix4x4f::IDENTITY;
  973. // Emit all particles
  974. for (int i=0; i<state.emitReplay.size(); i++)
  975. {
  976. const ParticleSystemEmitReplay& emit = state.emitReplay[i];
  977. //#if UNITY_EDITOR
  978. // ParticleSystemEditor::ApplyRandomSeed(system, emit.randomSeed);
  979. //#endif
  980. //@TODO: remove passing m_State since that is very dangerous when making things procedural compatible
  981. size_t previousParticleCount = ps.array_size();
  982. system.m_InitialModule.GenerateProcedural (roState, state, ps, emit);
  983. //@TODO: This can be moved out of the emit all particles loop...
  984. if (system.m_ShapeModule.GetEnabled())
  985. system.m_ShapeModule.Start (roState, state, ps, localToWorld, previousParticleCount, emit.t);
  986. // Apply gravity & integrated velocity after shape module so that it picks up any changes done in shapemodule (for example rotating the velocity)
  987. Vector3f gravity = system.m_InitialModule.GetGravity(roState, state);
  988. float particleIndex = 0.0f;
  989. const size_t particleCount = ps.array_size();
  990. for (int q = previousParticleCount; q < particleCount; q++)
  991. {
  992. const float normalizedT = emit.t / roState.lengthInSec;
  993. ps.velocity[q] *= Evaluate (system.m_InitialModule.GetSpeedCurve(), normalizedT, GenerateRandom(ps.randomSeed[q] + kParticleSystemStartSpeedCurveId)) * roState.GetRenderScale();
  994. Vector3f velocity = ps.velocity[q];
  995. float frameOffset = (particleIndex + emit.emissionOffset) * emit.emissionGap * float(particleIndex < emit.numContinuous);
  996. float aliveTime = emit.aliveTime + frameOffset;
  997. ps.position[q] += velocity * aliveTime + gravity * aliveTime * aliveTime * 0.5F;
  998. ps.velocity[q] += gravity * aliveTime;
  999. particleIndex += 1.0f;
  1000. }
  1001. // If no particles were emitted we can get rid of the emit replay state...
  1002. if (previousParticleCount == ps.array_size())
  1003. {
  1004. state.emitReplay[i] = state.emitReplay.back();
  1005. state.emitReplay.pop_back();
  1006. i--;
  1007. }
  1008. }
  1009. if (system.m_RotationModule->GetEnabled()){
  1010. system.m_RotationModule->UpdateProcedural (state, ps);
  1011. }
  1012. if (system.m_VelocityModule->GetEnabled()){
  1013. system.m_VelocityModule->UpdateProcedural (roState, state, ps);
  1014. }
  1015. if (system.m_ForceModule->GetEnabled()){
  1016. system.m_ForceModule->UpdateProcedural (roState, state, ps);
  1017. }
  1018. // Modules that are not supported by procedural
  1019. DebugAssert(!system.m_RotationBySpeedModule->GetEnabled()); // find out if possible to support it
  1020. DebugAssert(!system.m_ClampVelocityModule->GetEnabled()); // unsupported: (Need to compute velocity by deriving position curves...), possible to support?
  1021. DebugAssert(!system.m_CollisionModule->GetEnabled());
  1022. DebugAssert(!system.m_SubModule->GetEnabled()); // find out if possible to support it
  1023. DebugAssert(!system.m_ExternalForcesModule->GetEnabled());
  1024. }
  1025. void RParticleSystem::UpdateBounds(const RParticleSystem& system, const ParticleSystemParticles& ps, ParticleSystemState& state)
  1026. {
  1027. const size_t particleCount = ps.array_size();
  1028. if (particleCount == 0)
  1029. {
  1030. state.minMaxAABB = MinMaxAABB (Vec3::ZERO, Vec3::ZERO);
  1031. return;
  1032. }
  1033. state.minMaxAABB.Init();
  1034. if(CheckSupportsProcedural(system))
  1035. {
  1036. Matrix4x4f localToWorld = Transform::GetLocalToWorldMatrixNoScale (&system);
  1037. // Lifetime and max speed
  1038. const Vector2f minMaxLifeTime = system.m_InitialModule.GetLifeTimeCurve().FindMinMax();
  1039. const float maxLifeTime = minMaxLifeTime.y;
  1040. const Vector2f minMaxStartSpeed = system.m_InitialModule.GetSpeedCurve().FindMinMax() * (maxLifeTime * (system.getRendererScale() * CC_CONTENT_SCALE_FACTOR()));
  1041. state.minMaxAABB = MinMaxAABB(Vec3::ZERO, Vec3::ZERO);
  1042. state.minMaxAABB.Encapsulate(Vec3::UNIT_Z * minMaxStartSpeed.x);
  1043. state.minMaxAABB.Encapsulate(Vec3::UNIT_Z * minMaxStartSpeed.y);
  1044. if(system.m_ShapeModule.GetEnabled())
  1045. system.m_ShapeModule.CalculateProceduralBounds(state.minMaxAABB, state.emitterScale, minMaxStartSpeed);
  1046. // Gravity
  1047. // @TODO: Do what we do for force and velocity here, i.e. transform bounds properly
  1048. const Vector3f gravityBounds = system.m_InitialModule.GetGravity(*system.m_ReadOnlyState, *system.m_State) * maxLifeTime * maxLifeTime * 0.5f;
  1049. state.minMaxAABB._max += MAX(gravityBounds, Vec3::ZERO);
  1050. state.minMaxAABB._min += MIN(gravityBounds, Vec3::ZERO);
  1051. MinMaxAABB velocityBounds (Vec3::ZERO, Vec3::ZERO);
  1052. if(system.m_VelocityModule->GetEnabled())
  1053. system.m_VelocityModule->CalculateProceduralBounds(velocityBounds, localToWorld, maxLifeTime);
  1054. state.minMaxAABB._max += velocityBounds._max;
  1055. state.minMaxAABB._min += velocityBounds._min;
  1056. MinMaxAABB forceBounds (Vec3::ZERO, Vec3::ZERO);
  1057. if(system.m_ForceModule->GetEnabled())
  1058. system.m_ForceModule->CalculateProceduralBounds(forceBounds, localToWorld, maxLifeTime);
  1059. state.minMaxAABB._max += forceBounds._max;
  1060. state.minMaxAABB._min += forceBounds._min;
  1061. // Modules that are not supported by procedural
  1062. DebugAssert(!system.m_RotationBySpeedModule->GetEnabled()); // find out if possible to support it
  1063. DebugAssert(!system.m_ClampVelocityModule->GetEnabled()); // unsupported: (Need to compute velocity by deriving position curves...), possible to support?
  1064. DebugAssert(!system.m_CollisionModule->GetEnabled());
  1065. DebugAssert(!system.m_SubModule->GetEnabled()); // find out if possible to support it
  1066. DebugAssert(!system.m_ExternalForcesModule->GetEnabled());
  1067. }
  1068. else
  1069. {
  1070. for (size_t q = 0; q < particleCount; ++q)
  1071. state.minMaxAABB.Encapsulate (ps.position[q]);
  1072. ParticleSystemRenderer* renderer = (ParticleSystemRenderer*)const_cast<RParticleSystem&>(system).getComponent(COMPONENT_PS_RENDERER);
  1073. if(renderer && (renderer->GetRenderMode() == kSRMStretch3D))
  1074. {
  1075. // const float velocityScale = renderer->GetVelocityScale();
  1076. // const float lengthScale = renderer->GetLengthScale();
  1077. // for(size_t q = 0; q < particleCount; ++q )
  1078. // {
  1079. // float sqrVelocity = SqrMagnitude (ps.velocity[q]+ps.animatedVelocity[q]);
  1080. // if (sqrVelocity > Vector3f::epsilon)
  1081. // {
  1082. // float scale = velocityScale + FastInvSqrt (sqrVelocity) * lengthScale * ps.size[q];
  1083. // state.minMaxAABB.Encapsulate(ps.position[q] - ps.velocity[q] * scale);
  1084. // }
  1085. }
  1086. }
  1087. }
  1088. template<class TransferFunction>
  1089. void RParticleSystem::Transfer (TransferFunction& transfer)
  1090. {
  1091. // Super::Transfer (transfer);
  1092. m_ReadOnlyState->Transfer (transfer); m_ReadOnlyState->CheckConsistency();
  1093. m_State->Transfer (transfer);
  1094. transfer.Transfer(m_InitialModule, m_InitialModule.GetName ()); m_InitialModule.CheckConsistency ();
  1095. transfer.Transfer(m_ShapeModule, m_ShapeModule.GetName ()); m_ShapeModule.CheckConsistency ();
  1096. transfer.Transfer(m_EmissionModule, m_EmissionModule.GetName ()); m_EmissionModule.CheckConsistency ();
  1097. transfer.Transfer(*m_SizeModule, m_SizeModule->GetName ()); m_SizeModule->CheckConsistency ();
  1098. transfer.Transfer(*m_RotationModule, m_RotationModule->GetName ()); m_RotationModule->CheckConsistency ();
  1099. transfer.Transfer(*m_ColorModule, m_ColorModule->GetName ()); m_ColorModule->CheckConsistency ();
  1100. transfer.Transfer(*m_UVModule, m_UVModule->GetName ()); m_UVModule->CheckConsistency ();
  1101. transfer.Transfer(*m_VelocityModule, m_VelocityModule->GetName ()); m_VelocityModule->CheckConsistency ();
  1102. transfer.Transfer(*m_ForceModule, m_ForceModule->GetName ()); m_ForceModule->CheckConsistency ();
  1103. transfer.Transfer(*m_ExternalForcesModule, m_ExternalForcesModule->GetName ()); m_ExternalForcesModule->CheckConsistency ();
  1104. transfer.Transfer(*m_ClampVelocityModule, m_ClampVelocityModule->GetName ()); m_ClampVelocityModule->CheckConsistency ();
  1105. transfer.Transfer(*m_SizeBySpeedModule, m_SizeBySpeedModule->GetName ()); m_SizeBySpeedModule->CheckConsistency ();
  1106. transfer.Transfer(*m_RotationBySpeedModule, m_RotationBySpeedModule->GetName ()); m_RotationBySpeedModule->CheckConsistency ();
  1107. transfer.Transfer(*m_ColorBySpeedModule, m_ColorBySpeedModule->GetName ()); m_ColorBySpeedModule->CheckConsistency ();
  1108. transfer.Transfer(*m_CollisionModule, m_CollisionModule->GetName ()); m_CollisionModule->CheckConsistency ();
  1109. //transfer.Transfer(*m_SubModule, m_SubModule->GetName ()); m_SubModule->CheckConsistency ();
  1110. transfer.Transfer(*m_SubEmitterModule, m_SubEmitterModule->GetName ()); m_SubEmitterModule->CheckConsistency ();
  1111. transfer.Transfer(*m_renderer, m_renderer->GetName());
  1112. m_ReadOnlyState->scale = m_renderer->GetScale();
  1113. if(transfer.IsReading())
  1114. {
  1115. //TODO: DetermineSupportsProcedural
  1116. /*
  1117. m_State->supportsProcedural = DetermineSupportsProcedural(*this);
  1118. */
  1119. m_State->invalidateProcedural = true; // Stuff might have changed which we can't support (example: start speed has become smaller)
  1120. }
  1121. }
  1122. INSTANTIATE_TEMPLATE_TRANSFER(RParticleSystem)
  1123. size_t RParticleSystem::LimitParticleCount(size_t requestSize) const
  1124. {
  1125. const size_t maxNumParticles = m_InitialModule.GetMaxNumParticles();
  1126. return MIN(requestSize, maxNumParticles);
  1127. }
  1128. size_t RParticleSystem::AddNewParticles(ParticleSystemParticles& particles, size_t newParticles) const
  1129. {
  1130. const size_t fromIndex = particles.array_size();
  1131. const size_t newSize = LimitParticleCount(fromIndex + newParticles);
  1132. particles.array_resize(newSize);
  1133. return MIN(fromIndex, newSize);
  1134. }
  1135. void RParticleSystem::UpdateModulesNonIncremental (const RParticleSystem& system, const ParticleSystemParticles& particles, ParticleSystemParticlesTempData& psTemp, int fromIndex, int toIndex)
  1136. {
  1137. Assert(particles.array_size() == psTemp.particleCount);
  1138. const ParticleSystemReadOnlyState& roState = *system.m_ReadOnlyState;
  1139. for(int i = fromIndex; i < toIndex; i++){
  1140. psTemp.color[i] = particles.color[i];
  1141. }
  1142. for(int i = fromIndex; i < toIndex; i++){
  1143. psTemp.size[i] = particles.size[i];
  1144. }
  1145. // const Matrix4x4f& mat = system.getNodeToWorldTransform();
  1146. const Matrix4x4f& mat = Transform::GetLocalToWorldMatrixNoScale(&system);
  1147. for(int i = fromIndex; i < toIndex; i++){
  1148. psTemp.particleSysytemWorldPos[i] = mat.GetPosition();
  1149. }
  1150. if(system.m_ColorModule->GetEnabled()){
  1151. system.m_ColorModule->Update (particles, psTemp.color, fromIndex, toIndex);
  1152. }
  1153. if(system.m_ColorBySpeedModule->GetEnabled()){
  1154. system.m_ColorBySpeedModule->Update (roState, particles, psTemp.color, fromIndex, toIndex);
  1155. }
  1156. if(system.m_SizeModule->GetEnabled()){
  1157. system.m_SizeModule->Update (particles, psTemp.size, fromIndex, toIndex);
  1158. }
  1159. if(system.m_SizeBySpeedModule->GetEnabled()){
  1160. system.m_SizeBySpeedModule->Update (roState, particles, psTemp.size, fromIndex, toIndex);
  1161. }
  1162. //if (gGraphicsCaps.needsToSwizzleVertexColors)
  1163. //std::transform(&psTemp.color[fromIndex], &psTemp.color[toIndex], &psTemp.color[fromIndex], SwizzleColorForPlatform);
  1164. if(system.m_UVModule->GetEnabled())
  1165. {
  1166. // No other systems used sheet index yet, allocate!
  1167. if(!psTemp.sheetIndex)
  1168. {
  1169. psTemp.sheetIndex = ALLOC_TEMP_MANUAL(float, psTemp.particleCount);
  1170. for(int i = 0; i < fromIndex; i++){
  1171. psTemp.sheetIndex[i] = 0.0f;
  1172. }
  1173. }
  1174. system.m_UVModule->Update (particles, psTemp.sheetIndex, fromIndex, toIndex);
  1175. system.m_UVModule->RefreshFrames(system.m_renderer->GetCachedVertexInfos());
  1176. }
  1177. else if(psTemp.sheetIndex){
  1178. // if this is present with disabled module, that means we have a combined buffer with one system not using UV module, just initislize to 0.0f
  1179. for(int i = fromIndex; i < toIndex; i++){
  1180. psTemp.sheetIndex[i] = 0.0f;
  1181. }
  1182. }
  1183. }
  1184. void RParticleSystem::Clear (bool updateBounds)
  1185. {
  1186. for(int i = 0; i < kNumParticleBuffers; i++){
  1187. m_Particles[i].array_resize(0);
  1188. }
  1189. m_ParticlesStaging.array_resize(0);
  1190. m_State->emitReplay.resize_uninitialized(0);
  1191. if (m_State->stopEmitting)
  1192. {
  1193. // This triggers sometimes, why? (case 491684)
  1194. DebugAssert (m_State->needRestart);
  1195. m_State->playing = false;
  1196. RemoveFromManager();
  1197. }
  1198. if(updateBounds)
  1199. {
  1200. UpdateBounds(*this, m_Particles[kParticleBuffer0], *m_State);
  1201. Update2(*this, *m_ReadOnlyState, *m_State, false);
  1202. }
  1203. }
  1204. void RParticleSystem::GetNumTiles(int& uvTilesX, int& uvTilesY) const
  1205. {
  1206. uvTilesX = uvTilesY = 1;
  1207. if(m_UVModule->GetEnabled())
  1208. m_UVModule->GetNumTiles(uvTilesX, uvTilesY);
  1209. }
  1210. void RParticleSystem::Cull()
  1211. {
  1212. // if(!IsWorldPlaying())
  1213. // return;
  1214. m_State->culled = true;
  1215. Clear(false);
  1216. //m_State->cullTime = GetCurTime ();
  1217. RemoveFromManager();
  1218. }
  1219. void RParticleSystem::AwakeFromLoadGroup ()
  1220. {
  1221. auto root = FindGroupRoot();
  1222. root->AwakeFromLoadTree();
  1223. }
  1224. void RParticleSystem::PlayGroup ()
  1225. {
  1226. auto root = FindGroupRoot();
  1227. root->PlayTree();
  1228. }
  1229. void RParticleSystem::StopGroup ()
  1230. {
  1231. auto root = FindGroupRoot();
  1232. root->StopTree();
  1233. }
  1234. void RParticleSystem::ClearGroup ()
  1235. {
  1236. auto root = FindGroupRoot();
  1237. root->ClearTree();
  1238. }
  1239. void RParticleSystem::StopAndClearGroup ()
  1240. {
  1241. auto root = FindGroupRoot();
  1242. root->StopAndClearTree();
  1243. }
  1244. void RParticleSystem::Play (bool autoPrewarm)
  1245. {
  1246. Assert (m_State);
  1247. if(!IsActive () || m_State->GetIsSubEmitter())
  1248. return;
  1249. m_State->stopEmitting = false;
  1250. m_State->playing = true;
  1251. if (m_State->needRestart)
  1252. {
  1253. if(m_ReadOnlyState->prewarm)
  1254. {
  1255. if (autoPrewarm)
  1256. // 往前走0.0秒
  1257. //AutoPrewarm();
  1258. ;
  1259. }
  1260. else
  1261. {
  1262. m_State->delayT = m_ReadOnlyState->startDelay;
  1263. }
  1264. m_State->playing = true;
  1265. m_State->t = 0.0f;
  1266. m_State->numLoops = 0;
  1267. m_State->invalidateProcedural = false;
  1268. m_State->accumulatedDt = 0.0f;
  1269. #if UNITY_EDITOR
  1270. m_EditorRandomSeedIndex = 0;
  1271. #endif
  1272. m_State->emissionState.Clear();
  1273. }
  1274. if(m_State->culled && CheckSupportsProcedural(*this)){
  1275. Cull();
  1276. }
  1277. else{
  1278. AddToManager();
  1279. }
  1280. }
  1281. bool RParticleSystem::IsPlaying () const
  1282. {
  1283. Assert (m_State);
  1284. return m_State->playing;
  1285. }
  1286. void RParticleSystem::onEnter()
  1287. {
  1288. Node::onEnter();
  1289. //TODO: AwakeFromLoad 需要改成在 CCB 加载完成后调用
  1290. AwakeFromLoad();
  1291. }
  1292. void RParticleSystem::onExit()
  1293. {
  1294. RemoveFromManager();
  1295. Node::onExit();
  1296. #if REDREAM_EDITOR
  1297. if (drawNode != nullptr) {
  1298. drawNode->removeFromParent();
  1299. drawNode = nullptr;
  1300. }
  1301. #endif
  1302. }
  1303. void RParticleSystem::setVisible(bool visible)
  1304. {
  1305. if (visible != _visible && m_ReadOnlyState->playOnAwake) {
  1306. Node::setVisible(visible);
  1307. if (visible) {
  1308. this->AwakeFromLoadTree();
  1309. this->PlayTree();
  1310. }
  1311. else {
  1312. this->StopAndClearTree();
  1313. }
  1314. return;
  1315. }
  1316. Node::setVisible(visible);
  1317. }
  1318. void RParticleSystem::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags){
  1319. if (_useMaterialFile) {
  1320. _command.init(_globalZOrder);
  1321. _command.func = CC_CALLBACK_0(RParticleSystem::onDraw, this);
  1322. renderer->addCommand(&_command);
  1323. } else {
  1324. if (_texture) {
  1325. auto particleCount = GetParticles().array_size();
  1326. if (particleCount) {
  1327. allocMemory(particleCount);
  1328. #if REDREAM_EDITOR
  1329. m_renderer->Render(this, _quads, Director::getInstance()->getRunningScene()->getNodeToWorldTransform() * Transform::GetLocalToWorldMatrix(this));
  1330. #else
  1331. m_renderer->Render(this, _quads, transform);
  1332. #endif
  1333. _quadCommand.init(_globalZOrder, _texture.get(), _glProgramState, _blendFunc, _quads, particleCount, Mat4::IDENTITY, flags);
  1334. renderer->addCommand(&_quadCommand);
  1335. }
  1336. }
  1337. }
  1338. }
  1339. void RParticleSystem::onDraw(){
  1340. if (m_Material)
  1341. {
  1342. auto pass = m_Material->getTechnique()->getPassByIndex(0);
  1343. auto glProgram = pass->getGLProgramState()->getGLProgram();
  1344. glProgram->use();
  1345. glProgram->setUniformsForBuiltins();
  1346. pass->getGLProgramState()->applyUniforms();
  1347. pass->getStateBlock()->bind();
  1348. #if REDREAM_EDITOR
  1349. m_renderer->Render(this, nullptr, Director::getInstance()->getRunningScene()->getNodeToWorldTransform() * Transform::GetLocalToWorldMatrix(this));
  1350. #else
  1351. m_renderer->Render(this, nullptr, _modelViewTransform);
  1352. #endif
  1353. }
  1354. }
  1355. #if REDREAM_EDITOR
  1356. void RParticleSystem::OnDrawGizmosSelected()
  1357. {
  1358. Node* node = this;
  1359. while (node != nullptr) {
  1360. if (!node->isVisible()) return;
  1361. node = node->getParent();
  1362. }
  1363. float scale = m_ReadOnlyState->GetRenderScale();
  1364. int shapeType = m_ShapeModule.GetType();
  1365. float radius = m_ShapeModule.GetRadius() * scale;
  1366. float angle = m_ShapeModule.GetAngle();
  1367. angle = std::min(angle, 89.99f);
  1368. float radians = CC_DEGREES_TO_RADIANS(angle);
  1369. float length = m_ShapeModule.GetLength() * scale;
  1370. float arc = m_ShapeModule.GetArc();
  1371. float arcRadians = CC_DEGREES_TO_RADIANS(arc);
  1372. float speed = m_InitialModule.GetSpeedCurve().GetScalar() * scale;
  1373. if (m_InitialModule.GetSpeedCurve().minMaxState == kMMCTwoConstants)
  1374. {
  1375. speed = m_InitialModule.GetSpeedCurve().editorCurves.max.GetKey(0).value * scale;
  1376. }
  1377. float boxX = m_ShapeModule.GetBoxX() * scale;
  1378. float boxY = m_ShapeModule.GetBoxY() * scale;
  1379. float boxZ = m_ShapeModule.GetBoxZ() * scale;
  1380. if (drawNode == nullptr)
  1381. {
  1382. drawNode = cocos2d::DrawNode3D::create(1.0f, true);
  1383. auto drawNodeLayer = Director::getInstance()->getRunningScene()->getChildByName("m_drawNodeLayer");
  1384. if (drawNodeLayer == nullptr)
  1385. {
  1386. drawNodeLayer = Node::create();
  1387. drawNodeLayer->setName("m_drawNodeLayer");
  1388. Director::getInstance()->getRunningScene()->addChild(drawNodeLayer);
  1389. }
  1390. drawNodeLayer->addChild(drawNode);
  1391. }
  1392. Color4F cyan(0, 1, 1, 1);
  1393. auto worldTrans = Transform::GetContentToWorldMatrix() * Transform::GetLocalToWorldMatrix(this);
  1394. drawNode->setScaleZ(m_renderer->GetOrthographic() ? 0 : 1);
  1395. switch (shapeType) {
  1396. case ShapeModule::kBox:
  1397. drawNode->drawWireCube(Vec3::ZERO, Vec3(boxX, boxY, boxZ), false, cyan, worldTrans);
  1398. break;
  1399. case ShapeModule::kSphere:
  1400. case ShapeModule::kSphereShell:
  1401. drawNode->drawWireSphere(Vec3::ZERO, radius, cyan, worldTrans);
  1402. break;
  1403. case ShapeModule::kHemiSphere:
  1404. case ShapeModule::kHemiSphereShell:
  1405. drawNode->drawWireDisk (Vec3::ZERO, Vec3::UNIT_Z, radius, cyan, worldTrans);
  1406. drawNode->drawWireArc (Vec3::ZERO, Vec3::UNIT_Y, -Vec3::UNIT_X, 180.0f, radius, cyan, worldTrans);
  1407. drawNode->drawWireArc (Vec3::ZERO, Vec3::UNIT_X, Vec3::UNIT_Y, 180.0f, radius, cyan, worldTrans);
  1408. break;
  1409. case ShapeModule::kCone:
  1410. case ShapeModule::kConeShell:
  1411. length = speed;
  1412. case ShapeModule::kConeVolume:
  1413. case ShapeModule::kConeVolumeShell:
  1414. {
  1415. float bigRadius = radius + length * tan(radians);
  1416. drawNode->drawWireArc (Vec3::ZERO, Vec3::UNIT_Z, Vec3::UNIT_X, 360.0f, radius, cyan, worldTrans);
  1417. drawNode->drawWireArc (Vec3(0, 0, length), Vec3::UNIT_Z, Vec3::UNIT_X, 360.0f, bigRadius, cyan, worldTrans);
  1418. drawNode->drawLine(Vec3(radius, 0, 0), Vec3(bigRadius, 0, length), cyan, worldTrans);
  1419. drawNode->drawLine(Vec3(-radius, 0, 0), Vec3(-bigRadius, 0, length), cyan, worldTrans);
  1420. drawNode->drawLine(Vec3(0, radius, 0), Vec3(0, bigRadius, length), cyan, worldTrans);
  1421. drawNode->drawLine(Vec3(0, -radius, 0), Vec3(0, -bigRadius, length), cyan, worldTrans);
  1422. }
  1423. break;
  1424. case ShapeModule::kCircle:
  1425. case ShapeModule::kCircleEdge:
  1426. drawNode->drawWireArc(Vec3::ZERO, Vec3::UNIT_Z, Vec3::UNIT_X, arc, radius, cyan, worldTrans);
  1427. drawNode->drawLine(Vec3::ZERO, Vec3(radius, 0, 0), cyan, worldTrans);
  1428. drawNode->drawLine(Vec3::ZERO, Quaternion(Vec3::UNIT_Z, arcRadians) * Vec3(radius, 0, 0), cyan, worldTrans);
  1429. break;
  1430. default:
  1431. break;
  1432. }
  1433. }
  1434. #endif
  1435. void RParticleSystem::update(float dt){
  1436. Node::update(dt);
  1437. return;
  1438. #ifdef FOR_QY_TEST
  1439. AddToManager();
  1440. // setActive(1);
  1441. if (!m_State->playing){
  1442. Play(true);
  1443. }
  1444. RParticleSystem::BeginUpdateAll();
  1445. //m_renderer->Render(this);
  1446. RParticleSystem::EndUpdateAll();
  1447. #endif
  1448. }
  1449. // Getters Setters for Editor
  1450. // 曲线
  1451. void TransferKeyframeToData(const KeyframeTpl<float>& curve, KeyframeData &data) {
  1452. data.time = curve.time;
  1453. data.value = curve.value;
  1454. data.inSlope = curve.inSlope;
  1455. data.outSlope = curve.outSlope;
  1456. data.tangentMode = curve.tangentMode;
  1457. }
  1458. void TransferKeyframeFromData(KeyframeTpl<float>& curve, const KeyframeData &data) {
  1459. curve.time = data.time;
  1460. curve.value = data.value;
  1461. curve.inSlope = data.inSlope;
  1462. curve.outSlope = data.outSlope;
  1463. curve.tangentMode = data.tangentMode;
  1464. }
  1465. void TransferAnimationCurveToData(const AnimationCurve& curve, AnimationCurveData &data) {
  1466. data.m_PreInfinity = curve.GetPreInfinity();
  1467. data.m_PostInfinity = curve.GetPostInfinity();
  1468. data.m_Curve.clear();
  1469. int count = curve.GetKeyCount();
  1470. for (int i = 0; i < count; i++) {
  1471. const AnimationCurve::Keyframe& key = curve.GetKey(i);
  1472. KeyframeData keyData;
  1473. TransferKeyframeToData(key, keyData);
  1474. data.m_Curve.push_back(keyData);
  1475. }
  1476. }
  1477. void TransferAnimationCurveFromData(AnimationCurve& curve, const AnimationCurveData &data) {
  1478. curve.SetPreInfinity(data.m_PreInfinity);
  1479. curve.SetPostInfinity(data.m_PostInfinity);
  1480. int count = (int)data.m_Curve.size();
  1481. curve.ResizeUninitialized(count);
  1482. for (int i = 0; i < count; i++) {
  1483. AnimationCurve::Keyframe& key = curve.GetKey(i);
  1484. const KeyframeData& keyData = data.m_Curve[i];
  1485. TransferKeyframeFromData(key, keyData);
  1486. }
  1487. }
  1488. void RParticleSystem::TransferMinMaxCurveToData(const MinMaxCurve& curve, MinMaxCurveData &data) const {
  1489. data.scalar = curve.GetScalar();
  1490. data.minMaxState = (MinMaxCurveState)curve.minMaxState;
  1491. TransferAnimationCurveToData(curve.editorCurves.max, data.maxCurve);
  1492. TransferAnimationCurveToData(curve.editorCurves.min, data.minCurve);
  1493. }
  1494. void RParticleSystem::TransferMinMaxCurveFromData(MinMaxCurve& curve, const MinMaxCurveData &data) {
  1495. curve.SetScalarNoBuild(data.scalar);
  1496. curve.minMaxState = data.minMaxState;
  1497. TransferAnimationCurveFromData(curve.editorCurves.max, data.maxCurve);
  1498. TransferAnimationCurveFromData(curve.editorCurves.min, data.minCurve);
  1499. if (data.minMaxState == kMMCTwoConstants) {
  1500. curve.editorCurves.max.ResizeUninitialized(1);
  1501. curve.editorCurves.min.ResizeUninitialized(1);
  1502. }
  1503. curve.OnSetDataEnd();
  1504. }
  1505. // 渐变色
  1506. void TransferGradientNEWToData(const GradientNEW& gradient, GradientNEWData &data) {
  1507. data.m_Color.clear();
  1508. int count = gradient.GetNumColorKeys();
  1509. for (int i = 0; i < count; i++) {
  1510. const auto& color = gradient.GetKey(i);
  1511. Color3BData colorData;
  1512. colorData.color = Color3B(color);
  1513. colorData.time = gradient.GetColorTime(i);
  1514. data.m_Color.push_back(colorData);
  1515. }
  1516. data.m_Alpha.clear();
  1517. count = gradient.GetNumAlphaKeys();
  1518. for (int i = 0; i < count; i++) {
  1519. const auto& color = gradient.GetKey(i);
  1520. AlphaData alphaData;
  1521. alphaData.alpha = color.a;
  1522. alphaData.time = gradient.GetAlphaTime(i);
  1523. data.m_Alpha.push_back(alphaData);
  1524. }
  1525. }
  1526. void TransferGradientNEWFromData(GradientNEW& gradient, const GradientNEWData &data) {
  1527. int count = MIN((int)data.m_Color.size(), kGradientMaxNumKeys);
  1528. gradient.SetNumColorKeys(count);
  1529. for (int i = 0; i < count; i++) {
  1530. const Color3BData& colorData = data.m_Color.at(i);
  1531. gradient.SetKey(i, Color4B(colorData.color, 0));
  1532. gradient.SetColorTime(i, colorData.time);
  1533. }
  1534. count = MIN((int)data.m_Alpha.size(), kGradientMaxNumKeys);
  1535. gradient.SetNumAlphaKeys(count);
  1536. for (int i = 0; i < count; i++) {
  1537. const AlphaData& alphaData = data.m_Alpha.at(i);
  1538. auto color = gradient.GetKey(i);
  1539. color.a = alphaData.alpha;
  1540. gradient.SetKey(i, color);
  1541. gradient.SetAlphaTime(i, alphaData.time);
  1542. }
  1543. }
  1544. void RParticleSystem::TransferMinMaxGradientToData(const MinMaxGradient& gradient, MinMaxGradientData &data) const {
  1545. data.minMaxState = (MinMaxGradientState)gradient.minMaxState;
  1546. data.minColor = gradient.minColor;
  1547. data.maxColor = gradient.maxColor;
  1548. TransferGradientNEWToData(gradient.minGradient, data.minGradient);
  1549. TransferGradientNEWToData(gradient.maxGradient, data.maxGradient);
  1550. }
  1551. void RParticleSystem::TransferMinMaxGradientFromData(MinMaxGradient& gradient, const MinMaxGradientData &data) {
  1552. gradient.minMaxState = data.minMaxState;
  1553. gradient.minColor = data.minColor;
  1554. gradient.maxColor = data.maxColor;
  1555. TransferGradientNEWFromData(gradient.minGradient, data.minGradient);
  1556. TransferGradientNEWFromData(gradient.maxGradient, data.maxGradient);
  1557. }
  1558. // EmissionBurst 信息
  1559. void RParticleSystem::TransferEmissionToData(const ParticleSystemEmissionData& emission, EmissionData &data) const {
  1560. data.burstData.clear();
  1561. for (int i = 0; i < emission.burstCount; i++) {
  1562. BurstData burstData;
  1563. burstData.burstTime = emission.burstTime[i];
  1564. burstData.burstParticleCount = emission.burstParticleCount[i];
  1565. data.burstData.push_back(burstData);
  1566. }
  1567. }
  1568. void RParticleSystem::TransferEmissionFromData(ParticleSystemEmissionData& emission, const EmissionData &data) {
  1569. emission.burstCount = data.burstData.size();
  1570. for (int i = 0; i < emission.burstCount; i++) {
  1571. const BurstData& burstData = data.burstData[i];
  1572. emission.burstTime[i] = burstData.burstTime;
  1573. emission.burstParticleCount[i] = burstData.burstParticleCount;
  1574. }
  1575. }
  1576. float CurveGetMaxValue(const MinMaxCurve& curve) {
  1577. if (curve.minMaxState == kMMCTwoConstants)
  1578. return MAX( curve.editorCurves.min.GetKey(0).value * curve.GetScalar (), curve.editorCurves.max.GetKey(0).value * curve.GetScalar ());
  1579. return curve.GetScalar ();
  1580. }
  1581. // m_EmissionModule
  1582. void RParticleSystem::setEmissionModuleBurstData(const EmissionData& value) {
  1583. TransferEmissionFromData(m_EmissionModule.GetEmissionData(), value);
  1584. const auto& emissionData = m_EmissionModule.GetEmissionData();
  1585. int maxParticleCount = 0;
  1586. float maxLifeTime = CurveGetMaxValue(m_InitialModule.GetLifeTimeCurve());
  1587. float maxEmissionRate = CurveGetMaxValue(emissionData.rate);
  1588. maxParticleCount += maxLifeTime * maxEmissionRate;
  1589. for (int i = 0; i < emissionData.burstCount; i++) {
  1590. maxParticleCount += emissionData.burstParticleCount[i];
  1591. }
  1592. maxParticleCount = MIN(maxParticleCount, m_InitialModule.GetMaxNumParticles());
  1593. allocMemory(maxParticleCount);
  1594. }
  1595. // m_RotationModule
  1596. void RParticleSystem::setRotationModuleEnabled(bool value) {
  1597. m_RotationModule->SetEnabled(value);
  1598. }
  1599. bool RParticleSystem::getRotationModuleEnabled() const {
  1600. return m_RotationModule->GetEnabled();
  1601. }
  1602. void RParticleSystem::setRotationModuleRate(const MinMaxCurveData& value) {
  1603. TransferMinMaxCurveFromData(m_RotationModule->GetCurve(), value);
  1604. }
  1605. MinMaxCurveData RParticleSystem::getRotationModuleRate() const {
  1606. MinMaxCurveData data;
  1607. TransferMinMaxCurveToData(m_RotationModule->GetCurve(), data);
  1608. return data;
  1609. }
  1610. // m_SubModule
  1611. /*
  1612. void RParticleSystem::setSubModuleEnabled(bool value) {
  1613. m_SubModule->SetEnabled(value);
  1614. }
  1615. bool RParticleSystem::getSubModuleEnabled() const {
  1616. return m_SubModule->GetEnabled();
  1617. }
  1618. void RParticleSystem::setSubModuleEmittersBirthID0(int value) {
  1619. m_SubModule->SetSubEmittersBirthID(0, value);
  1620. }
  1621. int RParticleSystem::getSubModuleEmittersBirthID0() const {
  1622. return m_SubModule->GetSubEmittersBirthID(0);
  1623. }
  1624. void RParticleSystem::setSubModuleEmittersBirthID1(int value) {
  1625. m_SubModule->SetSubEmittersBirthID(1, value);
  1626. }
  1627. int RParticleSystem::getSubModuleEmittersBirthID1() const {
  1628. return m_SubModule->GetSubEmittersBirthID(1);
  1629. }
  1630. void RParticleSystem::setSubModuleEmittersCollisionID0(int value) {
  1631. m_SubModule->SetSubEmittersCollisionID(0, value);
  1632. }
  1633. int RParticleSystem::getSubModuleEmittersCollisionID0() const {
  1634. return m_SubModule->GetSubEmittersCollisionID(0);
  1635. }
  1636. void RParticleSystem::setSubModuleEmittersCollisionID1(int value) {
  1637. m_SubModule->SetSubEmittersCollisionID(1, value);
  1638. }
  1639. int RParticleSystem::getSubModuleEmittersCollisionID1() const {
  1640. return m_SubModule->GetSubEmittersCollisionID(1);
  1641. }
  1642. void RParticleSystem::setSubModuleEmittersDeathID0(int value) {
  1643. m_SubModule->SetSubEmittersDeathID(0, value);
  1644. }
  1645. int RParticleSystem::getSubModuleEmittersDeathID0() const {
  1646. return m_SubModule->GetSubEmittersDeathID(0);
  1647. }
  1648. void RParticleSystem::setSubModuleEmittersDeathID1(int value) {
  1649. m_SubModule->SetSubEmittersDeathID(1, value);
  1650. }
  1651. int RParticleSystem::getSubModuleEmittersDeathID1() const {
  1652. return m_SubModule->GetSubEmittersDeathID(1);
  1653. }
  1654. */
  1655. // m_SubEmitterModule
  1656. void RParticleSystem::setSubEmitterModuleEnabled(bool value) {
  1657. m_SubEmitterModule->SetEnabled(value);
  1658. }
  1659. bool RParticleSystem::getSubEmitterModuleEnabled() const {
  1660. return m_SubEmitterModule->GetEnabled();
  1661. }
  1662. void RParticleSystem::setSubEmitterModuleSubEmitterType(int value) {
  1663. m_SubEmitterModule->SetSubEmitterType(value);
  1664. }
  1665. int RParticleSystem::getSubEmitterModuleSubEmitterType() const {
  1666. return m_SubEmitterModule->GetSubEmitterType();
  1667. }
  1668. bool RParticleSystem::getSubEmitterModuleInheritColor() const
  1669. {
  1670. return m_SubEmitterModule->GetInheritColor();
  1671. }
  1672. void RParticleSystem::setSubEmitterModuleInheritColor(bool value)
  1673. {
  1674. m_SubEmitterModule->SetInheritColor(value);
  1675. }
  1676. bool RParticleSystem::getSubEmitterModuleInheritSize() const
  1677. {
  1678. return m_SubEmitterModule->GetInheritSize();
  1679. }
  1680. void RParticleSystem::setSubEmitterModuleInheritSize(bool value)
  1681. {
  1682. m_SubEmitterModule->SetInheritSize(value);
  1683. }
  1684. bool RParticleSystem::getSubEmitterModuleInheritRotation() const
  1685. {
  1686. return m_SubEmitterModule->GetInheritRotation();
  1687. }
  1688. void RParticleSystem::setSubEmitterModuleInheritRotation(bool value)
  1689. {
  1690. m_SubEmitterModule->SetInheritRotation(value);
  1691. }
  1692. bool RParticleSystem::getSubEmitterModuleInheritLifetime() const
  1693. {
  1694. return m_SubEmitterModule->GetInheritLifetime();
  1695. }
  1696. void RParticleSystem::setSubEmitterModuleInheritLifetime(bool value)
  1697. {
  1698. m_SubEmitterModule->SetInheritLifetime(value);
  1699. }
  1700. bool RParticleSystem::getSubEmitterModuleInheritDuration() const
  1701. {
  1702. return m_SubEmitterModule->GetInheritDuration();
  1703. }
  1704. void RParticleSystem::setSubEmitterModuleInheritDuration(bool value)
  1705. {
  1706. m_SubEmitterModule->SetInheritDuration(value);
  1707. }
  1708. // m_ExternalForcesModule
  1709. void RParticleSystem::setExternalForcesModuleEnabled(bool value) {
  1710. m_ExternalForcesModule->SetEnabled(value);
  1711. }
  1712. bool RParticleSystem::getExternalForcesModuleEnabled() const {
  1713. return m_ExternalForcesModule->GetEnabled();
  1714. }
  1715. void RParticleSystem::setExternalForcesModuleMultiplier(float value) {
  1716. m_ExternalForcesModule->SetMultiplier(value);
  1717. }
  1718. float RParticleSystem::getExternalForcesModuleMultiplier() const {
  1719. return m_ExternalForcesModule->GetMultiplier();
  1720. }
  1721. // m_RotationBySpeedModule
  1722. void RParticleSystem::setRotationBySpeedModuleEnabled(bool value) {
  1723. m_RotationBySpeedModule->SetEnabled(value);
  1724. }
  1725. bool RParticleSystem::getRotationBySpeedModuleEnabled() const {
  1726. return m_RotationBySpeedModule->GetEnabled();
  1727. }
  1728. void RParticleSystem::setRotationBySpeedModuleCurve(const MinMaxCurveData& value) {
  1729. TransferMinMaxCurveFromData(m_RotationBySpeedModule->GetCurve(), value);
  1730. }
  1731. MinMaxCurveData RParticleSystem::getRotationBySpeedModuleCurve() const {
  1732. MinMaxCurveData data;
  1733. TransferMinMaxCurveToData(m_RotationBySpeedModule->GetCurve(), data);
  1734. return data;
  1735. }
  1736. void RParticleSystem::setRotationBySpeedModuleRange(const Vector2f& value) {
  1737. m_RotationBySpeedModule->SetRange(value);
  1738. }
  1739. const Vector2f& RParticleSystem::getRotationBySpeedModuleRange() const {
  1740. return m_RotationBySpeedModule->GetRange();
  1741. }
  1742. // m_VelocityModule
  1743. void RParticleSystem::setVelocityModuleEnabled(bool value) {
  1744. m_VelocityModule->SetEnabled(value);
  1745. }
  1746. bool RParticleSystem::getVelocityModuleEnabled() const {
  1747. return m_VelocityModule->GetEnabled();
  1748. }
  1749. void RParticleSystem::setVelocityModuleXCurve(const MinMaxCurveData& value) {
  1750. TransferMinMaxCurveFromData(m_VelocityModule->GetXCurve(), value);
  1751. }
  1752. MinMaxCurveData RParticleSystem::getVelocityModuleXCurve() const {
  1753. MinMaxCurveData data;
  1754. TransferMinMaxCurveToData(m_VelocityModule->GetXCurve(), data);
  1755. return data;
  1756. }
  1757. void RParticleSystem::setVelocityModuleYCurve(const MinMaxCurveData& value) {
  1758. TransferMinMaxCurveFromData(m_VelocityModule->GetYCurve(), value);
  1759. }
  1760. MinMaxCurveData RParticleSystem::getVelocityModuleYCurve() const {
  1761. MinMaxCurveData data;
  1762. TransferMinMaxCurveToData(m_VelocityModule->GetYCurve(), data);
  1763. return data;
  1764. }
  1765. void RParticleSystem::setVelocityModuleZCurve(const MinMaxCurveData& value) {
  1766. TransferMinMaxCurveFromData(m_VelocityModule->GetZCurve(), value);
  1767. }
  1768. MinMaxCurveData RParticleSystem::getVelocityModuleZCurve() const {
  1769. MinMaxCurveData data;
  1770. TransferMinMaxCurveToData(m_VelocityModule->GetZCurve(), data);
  1771. return data;
  1772. }
  1773. void RParticleSystem::setVelocityModuleInWorldSpace(bool value) {
  1774. m_VelocityModule->SetInWorldSpace(value);
  1775. }
  1776. bool RParticleSystem::getVelocityModuleInWorldSpace() const {
  1777. return m_VelocityModule->GetInWorldSpace();
  1778. }
  1779. // m_ForceModule
  1780. void RParticleSystem::setForceModuleEnabled(bool value) {
  1781. m_ForceModule->SetEnabled(value);
  1782. }
  1783. bool RParticleSystem::getForceModuleEnabled() const {
  1784. return m_ForceModule->GetEnabled();
  1785. }
  1786. void RParticleSystem::setForceModuleXCurve(const MinMaxCurveData& value) {
  1787. TransferMinMaxCurveFromData(m_ForceModule->GetXCurve(), value);
  1788. }
  1789. MinMaxCurveData RParticleSystem::getForceModuleXCurve() const {
  1790. MinMaxCurveData data;
  1791. TransferMinMaxCurveToData(m_ForceModule->GetXCurve(), data);
  1792. return data;
  1793. }
  1794. void RParticleSystem::setForceModuleYCurve(const MinMaxCurveData& value) {
  1795. TransferMinMaxCurveFromData(m_ForceModule->GetYCurve(), value);
  1796. }
  1797. MinMaxCurveData RParticleSystem::getForceModuleYCurve() const {
  1798. MinMaxCurveData data;
  1799. TransferMinMaxCurveToData(m_ForceModule->GetYCurve(), data);
  1800. return data;
  1801. }
  1802. void RParticleSystem::setForceModuleZCurve(const MinMaxCurveData& value) {
  1803. TransferMinMaxCurveFromData(m_ForceModule->GetZCurve(), value);
  1804. }
  1805. MinMaxCurveData RParticleSystem::getForceModuleZCurve() const {
  1806. MinMaxCurveData data;
  1807. TransferMinMaxCurveToData(m_ForceModule->GetZCurve(), data);
  1808. return data;
  1809. }
  1810. void RParticleSystem::setForceModuleInWorldSpace(bool value) {
  1811. m_ForceModule->SetInWorldSpace(value);
  1812. }
  1813. bool RParticleSystem::getForceModuleInWorldSpace() const {
  1814. return m_ForceModule->GetInWorldSpace();
  1815. }
  1816. void RParticleSystem::setForceModuleRandomizePerFrame(bool value) {
  1817. m_ForceModule->SetRandomizePerFrame(value);
  1818. }
  1819. bool RParticleSystem::getForceModuleRandomizePerFrame() const {
  1820. return m_ForceModule->GetRandomizePerFrame();
  1821. }
  1822. // m_ClampVelocityModule
  1823. void RParticleSystem::setClampVelocityModuleEnabled(bool value) {
  1824. m_ClampVelocityModule->SetEnabled(value);
  1825. }
  1826. bool RParticleSystem::getClampVelocityModuleEnabled() const {
  1827. return m_ClampVelocityModule->GetEnabled();
  1828. }
  1829. void RParticleSystem::setClampVelocityModuleXCurve(const MinMaxCurveData& value) {
  1830. TransferMinMaxCurveFromData(m_ClampVelocityModule->GetXCurve(), value);
  1831. }
  1832. MinMaxCurveData RParticleSystem::getClampVelocityModuleXCurve() const {
  1833. MinMaxCurveData data;
  1834. TransferMinMaxCurveToData(m_ClampVelocityModule->GetXCurve(), data);
  1835. return data;
  1836. }
  1837. void RParticleSystem::setClampVelocityModuleYCurve(const MinMaxCurveData& value) {
  1838. TransferMinMaxCurveFromData(m_ClampVelocityModule->GetYCurve(), value);
  1839. }
  1840. MinMaxCurveData RParticleSystem::getClampVelocityModuleYCurve() const {
  1841. MinMaxCurveData data;
  1842. TransferMinMaxCurveToData(m_ClampVelocityModule->GetYCurve(), data);
  1843. return data;
  1844. }
  1845. void RParticleSystem::setClampVelocityModuleZCurve(const MinMaxCurveData& value) {
  1846. TransferMinMaxCurveFromData(m_ClampVelocityModule->GetZCurve(), value);
  1847. }
  1848. MinMaxCurveData RParticleSystem::getClampVelocityModuleZCurve() const {
  1849. MinMaxCurveData data;
  1850. TransferMinMaxCurveToData(m_ClampVelocityModule->GetZCurve(), data);
  1851. return data;
  1852. }
  1853. void RParticleSystem::setClampVelocityModuleMagnitude(const MinMaxCurveData& value) {
  1854. TransferMinMaxCurveFromData(m_ClampVelocityModule->GetMagnitude(), value);
  1855. }
  1856. MinMaxCurveData RParticleSystem::getClampVelocityModuleMagnitude() const {
  1857. MinMaxCurveData data;
  1858. TransferMinMaxCurveToData(m_ClampVelocityModule->GetMagnitude(), data);
  1859. return data;
  1860. }
  1861. void RParticleSystem::setClampVelocityModuleDrag(const MinMaxCurveData& value) {
  1862. TransferMinMaxCurveFromData(m_ClampVelocityModule->GetDrag(), value);
  1863. }
  1864. MinMaxCurveData RParticleSystem::getClampVelocityModuleDrag() const {
  1865. MinMaxCurveData data;
  1866. TransferMinMaxCurveToData(m_ClampVelocityModule->GetDrag(), data);
  1867. return data;
  1868. }
  1869. void RParticleSystem::setClampVelocityModuleInWorldSpace(bool value) {
  1870. m_ClampVelocityModule->SetInWorldSpace(value);
  1871. }
  1872. bool RParticleSystem::getClampVelocityModuleInWorldSpace() const {
  1873. return m_ClampVelocityModule->GetInWorldSpace();
  1874. }
  1875. void RParticleSystem::setClampVelocityModuleSeparateAxis(bool value) {
  1876. m_ClampVelocityModule->SetSeparateAxis(value);
  1877. }
  1878. bool RParticleSystem::getClampVelocityModuleSeparateAxis() const {
  1879. return m_ClampVelocityModule->GetSeparateAxis();
  1880. }
  1881. void RParticleSystem::setClampVelocityModuleMultiplyDragByParticleSize(bool value) {
  1882. m_ClampVelocityModule->SetMultiplyDragByParticleSize(value);
  1883. }
  1884. bool RParticleSystem::getClampVelocityModuleMultiplyDragByParticleSize() const {
  1885. return m_ClampVelocityModule->GetMultiplyDragByParticleSize();
  1886. }
  1887. void RParticleSystem::setClampVelocityModuleMultiplyDragByParticleVelocity(bool value) {
  1888. m_ClampVelocityModule->SetMultiplyDragByParticleVelocity(value);
  1889. }
  1890. bool RParticleSystem::getClampVelocityModuleMultiplyDragByParticleVelocity() const {
  1891. return m_ClampVelocityModule->GetMultiplyDragByParticleVelocity();
  1892. }
  1893. void RParticleSystem::setClampVelocityModuleDampen(float value) {
  1894. m_ClampVelocityModule->SetDampen(value);
  1895. }
  1896. float RParticleSystem::getClampVelocityModuleDampen() const {
  1897. return m_ClampVelocityModule->GetDampen();
  1898. }
  1899. // m_SizeModule
  1900. void RParticleSystem::setSizeModuleEnabled(bool value) {
  1901. m_SizeModule->SetEnabled(value);
  1902. }
  1903. bool RParticleSystem::getSizeModuleEnabled() const {
  1904. return m_SizeModule->GetEnabled();
  1905. }
  1906. void RParticleSystem::setSizeModuleCurve(const MinMaxCurveData& value) {
  1907. TransferMinMaxCurveFromData(m_SizeModule->GetCurve(), value);
  1908. }
  1909. MinMaxCurveData RParticleSystem::getSizeModuleCurve() const {
  1910. MinMaxCurveData data;
  1911. TransferMinMaxCurveToData(m_SizeModule->GetCurve(), data);
  1912. return data;
  1913. }
  1914. // m_ColorModule
  1915. void RParticleSystem::setColorModuleEnabled(bool value) {
  1916. m_ColorModule->SetEnabled(value);
  1917. }
  1918. bool RParticleSystem::getColorModuleEnabled() const {
  1919. return m_ColorModule->GetEnabled();
  1920. }
  1921. void RParticleSystem::setColorModuleGradient(const MinMaxGradientData& value) {
  1922. TransferMinMaxGradientFromData(m_ColorModule->GetGradient(), value);
  1923. }
  1924. MinMaxGradientData RParticleSystem::getColorModuleGradient() const {
  1925. MinMaxGradientData data;
  1926. TransferMinMaxGradientToData(m_ColorModule->GetGradient(), data);
  1927. return data;
  1928. }
  1929. // m_UVModule
  1930. void RParticleSystem::setUVModuleEnabled(bool value) {
  1931. m_UVModule->SetEnabled(value);
  1932. }
  1933. bool RParticleSystem::getUVModuleEnabled() const {
  1934. return m_UVModule->GetEnabled();
  1935. }
  1936. void RParticleSystem::setUVModuleCurve(const MinMaxCurveData& value) {
  1937. TransferMinMaxCurveFromData(m_UVModule->GetCurve(), value);
  1938. }
  1939. MinMaxCurveData RParticleSystem::getUVModuleCurve() const {
  1940. MinMaxCurveData data;
  1941. TransferMinMaxCurveToData(m_UVModule->GetCurve(), data);
  1942. return data;
  1943. }
  1944. void RParticleSystem::setUVModuleTilesX(int value) {
  1945. m_UVModule->SetTilesX(value);
  1946. }
  1947. int RParticleSystem::getUVModuleTilesX() const {
  1948. return m_UVModule->GetTilesX();
  1949. }
  1950. void RParticleSystem::setUVModuleTilesY(int value) {
  1951. m_UVModule->SetTilesY(value);
  1952. }
  1953. int RParticleSystem::getUVModuleTilesY() const {
  1954. return m_UVModule->GetTilesY();
  1955. }
  1956. void RParticleSystem::setUVModuleAnimationType(int value) {
  1957. m_UVModule->SetAnimationType(value);
  1958. }
  1959. int RParticleSystem::getUVModuleAnimationType() const {
  1960. return m_UVModule->GetAnimationType();
  1961. }
  1962. void RParticleSystem::setUVModuleRowIndex(int value) {
  1963. m_UVModule->SetRowIndex(value);
  1964. }
  1965. int RParticleSystem::getUVModuleRowIndex() const {
  1966. return m_UVModule->GetRowIndex();
  1967. }
  1968. void RParticleSystem::setUVModuleCycles(float value) {
  1969. m_UVModule->SetCycles(value);
  1970. }
  1971. float RParticleSystem::getUVModuleCycles() const {
  1972. return m_UVModule->GetCycles();
  1973. }
  1974. void RParticleSystem::setUVModuleRandomRow(bool value) {
  1975. m_UVModule->SetRandomRow(value);
  1976. }
  1977. bool RParticleSystem::getUVModuleRandomRow() const {
  1978. return m_UVModule->GetRandomRow();
  1979. }
  1980. void RParticleSystem::setUVModuleMode(int value) {
  1981. m_UVModule->SetMode(value);
  1982. }
  1983. int RParticleSystem::getUVModuleMode() const {
  1984. return m_UVModule->GetMode();
  1985. }
  1986. void RParticleSystem::setUVModuleFrameNamePrefix(const std::string& value) {
  1987. m_UVModule->SetFrameNamePrefix(value);
  1988. }
  1989. const std::string& RParticleSystem::getUVModuleFrameNamePrefix() const {
  1990. return m_UVModule->GetFrameNamePrefix();
  1991. }
  1992. void RParticleSystem::setUVModuleFrameStartIndex(int value) {
  1993. m_UVModule->SetFrameStartIndex(value);
  1994. }
  1995. int RParticleSystem::getUVModuleFrameStartIndex() const {
  1996. return m_UVModule->GetFrameStartIndex();
  1997. }
  1998. void RParticleSystem::setUVModuleFrameEndIndex(int value) {
  1999. m_UVModule->SetFrameEndIndex(value);
  2000. }
  2001. int RParticleSystem::getUVModuleFrameEndIndex() const {
  2002. return m_UVModule->GetFrameEndIndex();
  2003. }
  2004. void RParticleSystem::setUVModuleFrameCount(int value) {
  2005. m_UVModule->SetFrameCount(value);
  2006. }
  2007. int RParticleSystem::getUVModuleFrameCount() const {
  2008. return m_UVModule->GetFrameCount();
  2009. }
  2010. // m_SizeBySpeedModule
  2011. void RParticleSystem::setSizeBySpeedModuleEnabled(bool value) {
  2012. m_SizeBySpeedModule->SetEnabled(value);
  2013. }
  2014. bool RParticleSystem::getSizeBySpeedModuleEnabled() const {
  2015. return m_SizeBySpeedModule->GetEnabled();
  2016. }
  2017. void RParticleSystem::setSizeBySpeedModuleCurve(const MinMaxCurveData& value) {
  2018. TransferMinMaxCurveFromData(m_SizeBySpeedModule->GetCurve(), value);
  2019. }
  2020. MinMaxCurveData RParticleSystem::getSizeBySpeedModuleCurve() const {
  2021. MinMaxCurveData data;
  2022. TransferMinMaxCurveToData(m_SizeBySpeedModule->GetCurve(), data);
  2023. return data;
  2024. }
  2025. void RParticleSystem::setSizeBySpeedModuleRange(const Vector2f& value) {
  2026. m_SizeBySpeedModule->SetRange(value);
  2027. }
  2028. const Vector2f& RParticleSystem::getSizeBySpeedModuleRange() const {
  2029. return m_SizeBySpeedModule->GetRange();
  2030. }
  2031. // m_ColorBySpeedModule
  2032. void RParticleSystem::setColorBySpeedModuleEnabled(bool value) {
  2033. m_ColorBySpeedModule->SetEnabled(value);
  2034. }
  2035. bool RParticleSystem::getColorBySpeedModuleEnabled() const {
  2036. return m_ColorBySpeedModule->GetEnabled();
  2037. }
  2038. void RParticleSystem::setColorBySpeedModuleGradient(const MinMaxGradientData& value) {
  2039. TransferMinMaxGradientFromData(m_ColorBySpeedModule->GetGradient(), value);
  2040. }
  2041. MinMaxGradientData RParticleSystem::getColorBySpeedModuleGradient() const {
  2042. MinMaxGradientData data;
  2043. TransferMinMaxGradientToData(m_ColorBySpeedModule->GetGradient(), data);
  2044. return data;
  2045. }
  2046. void RParticleSystem::setColorBySpeedModuleRange(const Vector2f& value) {
  2047. m_ColorBySpeedModule->SetRange(value);
  2048. }
  2049. const Vector2f& RParticleSystem::getColorBySpeedModuleRange() const {
  2050. return m_ColorBySpeedModule->GetRange();
  2051. }
  2052. // m_renderer
  2053. void RParticleSystem::setRendererOrthographic(bool value) {
  2054. m_renderer->SetOrthographic(value);
  2055. }
  2056. bool RParticleSystem::getRendererOrthographic() const {
  2057. return m_renderer->GetOrthographic();
  2058. }
  2059. void RParticleSystem::setRendererScale(float value) {
  2060. m_ReadOnlyState->scale = value;
  2061. m_renderer->SetScale(value);
  2062. }
  2063. float RParticleSystem::getRendererScale() const {
  2064. return m_renderer->GetScale();
  2065. }
  2066. void RParticleSystem::setRendererRenderMode(int value) {
  2067. m_renderer->SetRenderMode(value);
  2068. }
  2069. int RParticleSystem::getRendererRenderMode() const {
  2070. return m_renderer->GetRenderMode();
  2071. }
  2072. void RParticleSystem::setRendererSortMode(int value) {
  2073. m_renderer->SetSortMode(value);
  2074. }
  2075. int RParticleSystem::getRendererSortMode() const {
  2076. return m_renderer->GetSortMode();
  2077. }
  2078. void RParticleSystem::setRendererMaxParticleSize(float value) {
  2079. m_renderer->SetMaxParticleSize(value);
  2080. }
  2081. float RParticleSystem::getRendererMaxParticleSize() const {
  2082. return m_renderer->GetMaxParticleSize();
  2083. }
  2084. void RParticleSystem::setRendererCameraVelocityScale(float value) {
  2085. m_renderer->SetCameraVelocityScale(value);
  2086. }
  2087. float RParticleSystem::getRendererCameraVelocityScale() const {
  2088. return m_renderer->GetCameraVelocityScale();
  2089. }
  2090. void RParticleSystem::setRendererVelocityScale(float value) {
  2091. m_renderer->SetVelocityScale(value);
  2092. }
  2093. float RParticleSystem::getRendererVelocityScale() const {
  2094. return m_renderer->GetVelocityScale();
  2095. }
  2096. void RParticleSystem::setRendererLengthScale(float value) {
  2097. m_renderer->SetLengthScale(value);
  2098. }
  2099. float RParticleSystem::getRendererLengthScale() const {
  2100. return m_renderer->GetLengthScale();
  2101. }
  2102. void RParticleSystem::setRendererSortingFudge(float value) {
  2103. m_renderer->SetSortingFudge(value);
  2104. }
  2105. float RParticleSystem::getRendererSortingFudge() const {
  2106. return m_renderer->GetSortingFudge();
  2107. }
  2108. void RParticleSystem::setRendererNormalDirection(float value) {
  2109. m_renderer->SetNormalDirection(value);
  2110. }
  2111. float RParticleSystem::getRendererNormalDirection() const {
  2112. return m_renderer->GetNormalDirection();
  2113. }
  2114. void RParticleSystem::setBlendFunc(const BlendFunc &blendFunc)
  2115. {
  2116. if( _blendFunc.src != blendFunc.src || _blendFunc.dst != blendFunc.dst ) {
  2117. _blendFunc = blendFunc;
  2118. this->updateBlendFunc();
  2119. }
  2120. }
  2121. void RParticleSystem::setDisplayFrame(cocos2d::SpriteFrame* spriteFrame)
  2122. {
  2123. if (!spriteFrame) {
  2124. _texture = nullptr;
  2125. return;
  2126. }
  2127. this->setTextureWithRect(spriteFrame->getTexture(), spriteFrame->getRect(), spriteFrame->isRotated(), spriteFrame->getOffset(), spriteFrame->getOriginalSize());
  2128. }
  2129. void RParticleSystem::setTexture(cocos2d::Texture2D *texture)
  2130. {
  2131. if (!texture) {
  2132. _texture = nullptr;
  2133. return;
  2134. }
  2135. const Size& s = texture->getContentSize();
  2136. this->setTextureWithRect(texture, Rect(0, 0, s.width, s.height), false, Vec2::ZERO, Vec2(s.width, s.height));
  2137. }
  2138. void RParticleSystem::updateBlendFunc()
  2139. {
  2140. if(_texture)
  2141. {
  2142. bool premultiplied = _texture->hasPremultipliedAlpha();
  2143. _opacityModifyRGB = false;
  2144. if( _texture && ( _blendFunc.src == CC_BLEND_SRC && _blendFunc.dst == CC_BLEND_DST ) )
  2145. {
  2146. if( premultiplied )
  2147. {
  2148. _opacityModifyRGB = true;
  2149. }
  2150. else
  2151. {
  2152. _blendFunc = BlendFunc::ALPHA_NON_PREMULTIPLIED;
  2153. }
  2154. }
  2155. }
  2156. }
  2157. void RParticleSystem::allocMemory(int particleCount)
  2158. {
  2159. if (particleCount > _quadCount)
  2160. {
  2161. if (_quads == nullptr) {
  2162. _quads = (V3F_C4B_T2F_Quad*)malloc(particleCount * sizeof(V3F_C4B_T2F_Quad));
  2163. _quadCount = particleCount;
  2164. } else {
  2165. _quads = (V3F_C4B_T2F_Quad*)realloc(_quads, particleCount * sizeof(V3F_C4B_T2F_Quad));
  2166. _quadCount = particleCount;
  2167. }
  2168. if( !_quads)
  2169. {
  2170. CCLOG("cocos2d: RParticle system: not enough memory");
  2171. CC_SAFE_FREE(_quads);
  2172. _quadCount = 0;
  2173. return;
  2174. }
  2175. memset(_quads, 0, particleCount * sizeof(V3F_C4B_T2F_Quad));
  2176. }
  2177. }
  2178. NS_RRP_END