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