8#include <spdlog/spdlog.h>
18 bool LayerComposition::isSublayerAdded(
const std::shared_ptr<Layer>& layer,
bool transparent)
const {
19 if (
const auto& map = transparent ? _layerTransparentIndexMap : _layerOpaqueIndexMap; map.contains(layer)) {
20 spdlog::error(
"Sublayer {}, transparent: {} is already added.", layer->name(), transparent);
28 if (isSublayerAdded(layer,
false))
32 _layerList.push_back(layer);
33 _opaqueOrder[layer->id()] = _subLayerList.size();
34 _subLayerList.push_back(
false);
35 _subLayerEnabled.push_back(
true);
44 if (isSublayerAdded(layer,
true))
48 _layerList.push_back(layer);
49 _transparentOrder[layer->id()] = _subLayerList.size();
50 _subLayerList.push_back(
true);
51 _subLayerEnabled.push_back(
true);
61 if (cameras.size() != _lastCameraCount) {
64 if (_renderActions.empty() && !cameras.empty()) {
67 rebuildRenderActions();
68 return _renderActions;
73 const auto it = _layerIdMap.find(layerId);
74 return it != _layerIdMap.end() ? it->second :
nullptr;
79 const auto it = _layerNameMap.find(name);
80 return it != _layerNameMap.end() ? it->second :
nullptr;
83 int LayerComposition::getOpaqueIndex(
const std::shared_ptr<Layer>& layer)
const
85 const auto it = _layerOpaqueIndexMap.find(layer);
86 return it != _layerOpaqueIndexMap.end() ? it->second : -1;
89 int LayerComposition::getTransparentIndex(
const std::shared_ptr<Layer>& layer)
const
91 const auto it = _layerTransparentIndexMap.find(layer);
92 return it != _layerTransparentIndexMap.end() ? it->second : -1;
97 if (!layer || !layer->
enabled()) {
101 const auto layerIt = _layerIdMap.find(layer->
id());
102 if (layerIt == _layerIdMap.end()) {
106 const int index = transparent ? getTransparentIndex(layerIt->second) : getOpaqueIndex(layerIt->second);
107 if (index < 0 ||
static_cast<size_t>(index) >= _subLayerEnabled.size()) {
111 return _subLayerEnabled[index];
114 void LayerComposition::updateLayerMaps() {
116 _layerNameMap.clear();
117 _layerOpaqueIndexMap.clear();
118 _layerTransparentIndexMap.clear();
120 for (
size_t i = 0; i < _layerList.size(); i++) {
121 auto& layer = _layerList[i];
122 _layerIdMap[layer->id()] = layer;
123 _layerNameMap[layer->name()] = layer;
125 auto& subLayerIndexMap = _subLayerList[i] ? _layerTransparentIndexMap : _layerOpaqueIndexMap;
126 subLayerIndexMap[layer] = i;
130 void LayerComposition::clearRenderActions()
132 for (
auto* action : _renderActions) {
135 _renderActions.clear();
138 void LayerComposition::rebuildRenderActions()
141 for (
const auto& layer : _layerList) {
142 if (layer && layer->dirtyComposition()) {
153 clearRenderActions();
156 if (cameras.empty()) {
157 _lastCameraCount = 0;
162 for (
auto* cameraComponent : cameras) {
163 if (!cameraComponent || !cameraComponent->enabled() || !cameraComponent->camera()) {
167 const bool useCameraPasses = !cameraComponent->renderPasses().empty();
168 if (useCameraPasses) {
169 auto* action =
new RenderAction();
170 action->camera = cameraComponent;
171 action->useCameraPasses =
true;
172 _renderActions.push_back(action);
176 bool firstCameraUse =
true;
177 RenderAction* lastRenderAction =
nullptr;
178 for (
size_t i = 0; i < _layerList.size(); ++i) {
179 if (i >= _subLayerEnabled.size() || !_subLayerEnabled[i]) {
183 const auto& layerRef = _layerList[i];
184 if (!layerRef || !layerRef->enabled() || !cameraComponent->rendersLayer(layerRef->id())) {
188 auto* action =
new RenderAction();
189 action->camera = cameraComponent;
190 action->useCameraPasses = useCameraPasses;
191 action->layer = layerRef.get();
194 : cameraComponent->camera()->renderTarget();
195 action->firstCameraUse = firstCameraUse;
196 action->triggerPostprocess =
false;
197 action->transparent = _subLayerList[i];
198 action->lastCameraUse =
false;
201 bool usedCameraTarget =
false;
202 for (
auto existingIt = _renderActions.rbegin(); existingIt != _renderActions.rend(); ++existingIt) {
203 const auto* existing = *existingIt;
204 if (!existing || existing->camera != cameraComponent) {
207 if (existing->renderTarget == action->renderTarget) {
208 usedCameraTarget =
true;
212 const bool needsCameraClear = firstCameraUse || !usedCameraTarget;
213 if (needsCameraClear || layerRef->clearColorBuffer() || layerRef->clearDepthBuffer() || layerRef->clearStencilBuffer()) {
214 action->setupClears(needsCameraClear ? cameraComponent :
nullptr, layerRef.get());
217 action->lastCameraUse =
false;
219 firstCameraUse =
false;
220 lastRenderAction = action;
221 _renderActions.push_back(action);
224 if (lastRenderAction) {
225 lastRenderAction->lastCameraUse =
true;
228 lastRenderAction->triggerPostprocess =
true;
232 for (
const auto& layer : _layerList) {
234 layer->setDirtyComposition(
false);
237 _lastCameraCount = cameras.size();
static const std::vector< CameraComponent * > & instances()
EventHandler * fire(const std::string &name, Args &&... args)
std::shared_ptr< Layer > getLayerById(int layerId) const
std::shared_ptr< Layer > getLayerByName(const std::string &name) const
const std::vector< RenderAction * > & renderActions()
bool isEnabled(const Layer *layer, bool transparent) const
void pushOpaque(const std::shared_ptr< Layer > &layer)
void pushTransparent(const std::shared_ptr< Layer > &layer)
constexpr int LAYERID_DEPTH