| 191 | } |
| 192 | |
| 193 | void SceneRendering::UpdateActor(Actor* a, int32& key, ISceneRenderingListener::UpdateFlags flags) |
| 194 | { |
| 195 | const int32 category = a->_drawCategory; |
| 196 | bool lock = !_isRendering || ((int32)flags & (int32)ISceneRenderingListener::AutoDelayDuringRendering) == 0; // Allow updating actors during rendering |
| 197 | if (lock) |
| 198 | Locker.ReadLock(); // Read-access only as list doesn't get resized (like Add/Remove do) so allow updating actors from different threads at once |
| 199 | auto& list = Actors[category]; |
| 200 | if (list.Count() > key && key >= 0) // Ignore invalid key softly |
| 201 | { |
| 202 | auto& e = list[key]; |
| 203 | if (e.Actor == a) |
| 204 | { |
| 205 | for (auto* listener : _listeners) |
| 206 | listener->OnSceneRenderingUpdateActor(a, e.Bounds, flags); |
| 207 | if (flags & ISceneRenderingListener::Layer) |
| 208 | e.LayerMask = a->GetLayerMask(); |
| 209 | if (flags & ISceneRenderingListener::Bounds) |
| 210 | e.Bounds = a->GetSphere(); |
| 211 | } |
| 212 | } |
| 213 | if (lock) |
| 214 | Locker.ReadUnlock(); |
| 215 | } |
| 216 | |
| 217 | void SceneRendering::RemoveActor(Actor* a, int32& key) |
| 218 | { |
no test coverage detected