| 14 | } |
| 15 | |
| 16 | void CMapRenderer::Load(ERenderType Type, CLayers *pLayers, IMapImages *pMapImages, IEnvelopeEval *pEnvelopeEval, std::optional<FRenderUploadCallback> RenderCallbackOptional) |
| 17 | { |
| 18 | Clear(); |
| 19 | |
| 20 | std::shared_ptr<CEnvelopeManager> pEnvelopeManager = std::make_shared<CEnvelopeManager>(pEnvelopeEval, pLayers->Map()); |
| 21 | bool PassedGameLayer = false; |
| 22 | |
| 23 | for(int GroupId = 0; GroupId < pLayers->NumGroups(); GroupId++) |
| 24 | { |
| 25 | CMapItemGroup *pGroup = pLayers->GetGroup(GroupId); |
| 26 | std::unique_ptr<CRenderLayer> pRenderLayerGroup = std::make_unique<CRenderLayerGroup>(GroupId, pGroup); |
| 27 | pRenderLayerGroup->OnInit(Graphics(), TextRender(), RenderMap(), pEnvelopeManager, pLayers->Map(), pMapImages, RenderCallbackOptional); |
| 28 | if(!pRenderLayerGroup->IsValid()) |
| 29 | { |
| 30 | log_error("map_renderer", "error group was null, group number = %d, total groups = %d", GroupId, pLayers->NumGroups()); |
| 31 | log_error("map_renderer", "this is here to prevent a crash but the source of this is unknown, please report this for it to get fixed"); |
| 32 | log_error("map_renderer", "we need mapname and crc and the map that caused this if possible, and anymore info you think is relevant"); |
| 33 | continue; |
| 34 | } |
| 35 | |
| 36 | for(int LayerId = 0; LayerId < pGroup->m_NumLayers; LayerId++) |
| 37 | { |
| 38 | CMapItemLayer *pLayer = pLayers->GetLayer(pGroup->m_StartLayer + LayerId); |
| 39 | int LayerType = GetLayerType(pLayer, pLayers); |
| 40 | PassedGameLayer |= LayerType == LAYER_GAME; |
| 41 | |
| 42 | if(Type == ERenderType::RENDERTYPE_BACKGROUND_FORCE || Type == ERenderType::RENDERTYPE_BACKGROUND) |
| 43 | { |
| 44 | if(PassedGameLayer) |
| 45 | return; |
| 46 | } |
| 47 | else if(Type == ERenderType::RENDERTYPE_FOREGROUND) |
| 48 | { |
| 49 | if(!PassedGameLayer) |
| 50 | continue; |
| 51 | } |
| 52 | |
| 53 | if(pRenderLayerGroup) |
| 54 | m_vpRenderLayers.push_back(std::move(pRenderLayerGroup)); |
| 55 | |
| 56 | std::unique_ptr<CRenderLayer> pRenderLayer; |
| 57 | |
| 58 | if(pLayer->m_Type == LAYERTYPE_TILES) |
| 59 | { |
| 60 | CMapItemLayerTilemap *pTileLayer = (CMapItemLayerTilemap *)pLayer; |
| 61 | |
| 62 | switch(LayerType) |
| 63 | { |
| 64 | case LAYER_DEFAULT_TILESET: |
| 65 | pRenderLayer = std::make_unique<CRenderLayerTile>( |
| 66 | GroupId, |
| 67 | LayerId, |
| 68 | pLayer->m_Flags, |
| 69 | pTileLayer); |
| 70 | break; |
| 71 | case LAYER_GAME: |
| 72 | pRenderLayer = std::make_unique<CRenderLayerEntityGame>( |
| 73 | GroupId, |