1 /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
2
3 #include "System/Util.h"
4 #include "Sim/Projectiles/Projectile.h" // for operator delete
5
6 #include "System/EventBatchHandler.h"
7 #include "System/EventHandler.h"
8
9 #if UNSYNCED_PROJ_NOEVENT
10 #include "Rendering/ProjectileDrawer.h"
11 #endif
12
13 #include "Rendering/Textures/S3OTextureHandler.h"
14 #include "System/Platform/Threading.h"
15
16 EventBatchHandler* EventBatchHandler::ebh = nullptr;
17 boost::int64_t EventBatchHandler::eventSequenceNumber = 0;
18
19
EventBatchHandler()20 EventBatchHandler::EventBatchHandler()
21 : CEventClient("[EventBatchHandler]", 0, true)
22 {
23 autoLinkEvents = true;
24 RegisterLinkedEvents(this);
25 eventHandler.AddClient(this);
26 }
27
28
CreateInstance()29 void EventBatchHandler::CreateInstance()
30 {
31 ebh = new EventBatchHandler();
32 }
33
34
DeleteInstance()35 void EventBatchHandler::DeleteInstance()
36 {
37 delete ebh;
38 ebh = nullptr;
39 }
40
UnitMoved(const CUnit * unit)41 void EventBatchHandler::UnitMoved(const CUnit* unit) { EnqueueUnitMovedEvent(unit, unit->pos); }
UnitEnteredRadar(const CUnit * unit,int at)42 void EventBatchHandler::UnitEnteredRadar(const CUnit* unit, int at) { EnqueueUnitLOSStateChangeEvent(unit, at, unit->losStatus[at]); }
UnitEnteredLos(const CUnit * unit,int at)43 void EventBatchHandler::UnitEnteredLos(const CUnit* unit, int at) { EnqueueUnitLOSStateChangeEvent(unit, at, unit->losStatus[at]); }
UnitLeftRadar(const CUnit * unit,int at)44 void EventBatchHandler::UnitLeftRadar(const CUnit* unit, int at) { EnqueueUnitLOSStateChangeEvent(unit, at, unit->losStatus[at]); }
UnitLeftLos(const CUnit * unit,int at)45 void EventBatchHandler::UnitLeftLos(const CUnit* unit, int at) { EnqueueUnitLOSStateChangeEvent(unit, at, unit->losStatus[at]); }
UnitCloaked(const CUnit * unit)46 void EventBatchHandler::UnitCloaked(const CUnit* unit) { EnqueueUnitCloakStateChangeEvent(unit, 1); }
UnitDecloaked(const CUnit * unit)47 void EventBatchHandler::UnitDecloaked(const CUnit* unit) { EnqueueUnitCloakStateChangeEvent(unit, 0); }
48
FeatureCreated(const CFeature * feature)49 void EventBatchHandler::FeatureCreated(const CFeature* feature) { GetFeatureCreatedDestroyedEventBatch().enqueue(feature); }
FeatureDestroyed(const CFeature * feature)50 void EventBatchHandler::FeatureDestroyed(const CFeature* feature) { GetFeatureCreatedDestroyedEventBatch().dequeue(feature); }
FeatureMoved(const CFeature * feature,const float3 & oldpos)51 void EventBatchHandler::FeatureMoved(const CFeature* feature, const float3& oldpos) { EnqueueFeatureMovedEvent(feature, oldpos, feature->pos); }
ProjectileCreated(const CProjectile * proj)52 void EventBatchHandler::ProjectileCreated(const CProjectile* proj)
53 {
54 if (proj->synced) {
55 GetSyncedProjectileCreatedDestroyedBatch().insert(proj);
56 } else {
57 GetUnsyncedProjectileCreatedDestroyedBatch().insert(proj);
58 }
59 }
ProjectileDestroyed(const CProjectile * proj)60 void EventBatchHandler::ProjectileDestroyed(const CProjectile* proj)
61 {
62 if (proj->synced) {
63 GetSyncedProjectileCreatedDestroyedBatch().erase_delete(proj);
64 } else {
65 GetUnsyncedProjectileCreatedDestroyedBatch().erase_delete(proj);
66 }
67 }
68
69
70
71
72
Add(const CProjectile * p)73 void EventBatchHandler::ProjectileCreatedDestroyedEvent::Add(const CProjectile* p) { eventHandler.RenderProjectileCreated(p); }
Remove(const CProjectile * p)74 void EventBatchHandler::ProjectileCreatedDestroyedEvent::Remove(const CProjectile* p) { eventHandler.RenderProjectileDestroyed(p); }
Delete(const CProjectile * p)75 void EventBatchHandler::ProjectileCreatedDestroyedEvent::Delete(const CProjectile* p) { delete p; }
76
77 #if UNSYNCED_PROJ_NOEVENT
78 EventBatchHandler::UnsyncedProjectileCreatedDestroyedEventBatch EventBatchHandler::unsyncedProjectileCreatedDestroyedEventBatch;
Add(const CProjectile * p)79 void EventBatchHandler::UnsyncedProjectileCreatedDestroyedEvent::Add(const CProjectile* p) { projectileDrawer->RenderProjectileCreated(p); }
Remove(const CProjectile * p)80 void EventBatchHandler::UnsyncedProjectileCreatedDestroyedEvent::Remove(const CProjectile* p) { projectileDrawer->RenderProjectileDestroyed(p); }
Delete(const CProjectile * p)81 void EventBatchHandler::UnsyncedProjectileCreatedDestroyedEvent::Delete(const CProjectile* p) { delete p; }
82 #endif
83
Add(const UD & u)84 void EventBatchHandler::UnitCreatedDestroyedEvent::Add(const UD& u) { eventHandler.RenderUnitCreated(u.unit, u.data); }
Remove(const UD & u)85 void EventBatchHandler::UnitCreatedDestroyedEvent::Remove(const UD& u) { eventHandler.RenderUnitDestroyed(u.unit); }
Add(const UAD & u)86 void EventBatchHandler::UnitCloakStateChangedEvent::Add(const UAD& u) { if(!u.unit->isDead) eventHandler.RenderUnitCloakChanged(u.unit, u.data); }
Add(const UAD & u)87 void EventBatchHandler::UnitLOSStateChangedEvent::Add(const UAD& u) { if(!u.unit->isDead) eventHandler.RenderUnitLOSChanged(u.unit, u.data, u.status); }
Add(const UAP & u)88 void EventBatchHandler::UnitMovedEvent::Add(const UAP& u) { eventHandler.RenderUnitMoved(u.unit, u.newpos); }
89
Add(const CFeature * f)90 void EventBatchHandler::FeatureCreatedDestroyedEvent::Add(const CFeature* f) { eventHandler.RenderFeatureCreated(f); }
Remove(const CFeature * f)91 void EventBatchHandler::FeatureCreatedDestroyedEvent::Remove(const CFeature* f) { eventHandler.RenderFeatureDestroyed(f); }
Add(const FAP & f)92 void EventBatchHandler::FeatureMovedEvent::Add(const FAP& f) { eventHandler.RenderFeatureMoved(f.feat, f.oldpos, f.newpos); }
93
94
95
UpdateUnits()96 void EventBatchHandler::UpdateUnits() {
97 unitCreatedDestroyedEventBatch.delay();
98 unitCloakStateChangedEventBatch.delay();
99 unitLOSStateChangedEventBatch.delay();
100 unitMovedEventBatch.delay();
101 }
UpdateDrawUnits()102 void EventBatchHandler::UpdateDrawUnits() {
103 unitCreatedDestroyedEventBatch.execute();
104 unitCloakStateChangedEventBatch.execute();
105 unitLOSStateChangedEventBatch.execute();
106 unitMovedEventBatch.execute();
107 }
DeleteSyncedUnits()108 void EventBatchHandler::DeleteSyncedUnits() {
109 unitCloakStateChangedEventBatch.clean(unitCreatedDestroyedEventBatch.to_destroy());
110
111 unitLOSStateChangedEventBatch.clean(unitCreatedDestroyedEventBatch.to_destroy());
112
113 unitMovedEventBatch.clean(unitCreatedDestroyedEventBatch.to_destroy());
114
115 unitCreatedDestroyedEventBatch.clean();
116 unitCreatedDestroyedEventBatch.destroy_synced();
117 }
118
UpdateFeatures()119 void EventBatchHandler::UpdateFeatures() {
120 featureCreatedDestroyedEventBatch.delay();
121 featureMovedEventBatch.delay();
122 }
UpdateDrawFeatures()123 void EventBatchHandler::UpdateDrawFeatures() {
124 featureCreatedDestroyedEventBatch.execute();
125 featureMovedEventBatch.execute();
126 }
DeleteSyncedFeatures()127 void EventBatchHandler::DeleteSyncedFeatures() {
128 featureMovedEventBatch.clean(featureCreatedDestroyedEventBatch.to_destroy());
129
130 featureCreatedDestroyedEventBatch.clean();
131 featureCreatedDestroyedEventBatch.destroy();
132 }
133
UpdateProjectiles()134 void EventBatchHandler::UpdateProjectiles() {
135 syncedProjectileCreatedDestroyedEventBatch.delay_delete();
136 syncedProjectileCreatedDestroyedEventBatch.delay_add();
137 unsyncedProjectileCreatedDestroyedEventBatch.delay_delete();
138 unsyncedProjectileCreatedDestroyedEventBatch.delay_add();
139 }
UpdateDrawProjectiles()140 void EventBatchHandler::UpdateDrawProjectiles() {
141 projectileHandler->GetSyncedRenderProjectileIDs().delete_delayed();
142 syncedProjectileCreatedDestroyedEventBatch.delete_delayed();
143
144 syncedProjectileCreatedDestroyedEventBatch.add_delayed();
145 projectileHandler->GetSyncedRenderProjectileIDs().add_delayed();
146
147 #if !UNSYNCED_PROJ_NOEVENT
148 projectileHandler->GetUnsyncedRenderProjectileIDs().delete_delayed();
149 #endif
150 unsyncedProjectileCreatedDestroyedEventBatch.delete_delayed();
151 unsyncedProjectileCreatedDestroyedEventBatch.add_delayed();
152 #if !UNSYNCED_PROJ_NOEVENT
153 projectileHandler->GetUnsyncedRenderProjectileIDs().add_delayed();
154 #endif
155 }
DeleteSyncedProjectiles()156 void EventBatchHandler::DeleteSyncedProjectiles() {
157 }
158
UpdateObjects()159 void EventBatchHandler::UpdateObjects() {
160 UpdateUnits();
161 UpdateFeatures();
162 UpdateProjectiles();
163 }
164
LoadedModelRequested()165 void EventBatchHandler::LoadedModelRequested() {
166 }
167